We're updating how pagination works across the Daytona API, CLI, and SDKs. It's a one-time change, and we want to give you plenty of runway.

What's changing: The offset-based page parameter and the /api/sandbox/paginated endpoint are being replaced by cursor-based pagination. Cursor pagination is faster and stays consistent as data changes underneath you — no skipped or duplicated results when sandboxes are created or removed mid-listing.

The deadline: The deprecated endpoint and page parameter stop working on June 25, 2026.

Who needs to act: Anyone on an SDK or CLI version below v0.180.0. If you're already on v0.180.0 or newer, you're on cursor-based pagination and there's nothing to do.

Migrating your stack

Each migration is small — drop the page argument, and list() now returns an iterator that handles paging for you. Find your language below.

API

Before

# First page
curl "https://api.daytona.io/api/sandbox/paginated?page=1&limit=10"
# Subsequent pages
curl "https://api.daytona.io/api/sandbox/paginated?page=2&limit=10"

After

# First page
curl "https://api.daytona.io/api/sandbox?limit=10"
# Subsequent pages
curl "https://api.daytona.io/api/sandbox?cursor=<next_cursor>&limit=10"

The response includes the next cursor — pass it back in to fetch the following page.

CLI

Before

# First page
daytona sandbox list --page 1 --limit 10
# Subsequent pages
daytona sandbox list --page 2 --limit 10

After

# First page
daytona sandbox list --limit 10
# Next page
daytona sandbox list --cursor <next_cursor> --limit 10
Python SDK

Before

from daytona import Daytona, ListSandboxesQuery

daytona = Daytona()

sandboxes = daytona.list(ListSandboxesQuery(
    states=["started"],
    page=2,
    limit=10,
))

After

from daytona import Daytona, ListSandboxesQuery, SandboxState

daytona = Daytona()

# Iterate all sandboxes matching the query
for sandbox in daytona.list(ListSandboxesQuery(states=[SandboxState.STARTED], limit=10)):
    print(sandbox.id)
TypeScript SDK

Before

import { Daytona } from '@daytona/sdk';

const daytona = new Daytona();

const sandboxes = await daytona.list({
  states: ['started'],
  page: 2,
  limit: 10,
});

After

import { Daytona, SandboxState } from '@daytona/sdk';

const daytona = new Daytona();

// Iterate all sandboxes matching the query
for await (const sandbox of daytona.list({ states: [SandboxState.STARTED], limit: 10 })) {
  console.log(sandbox.id);
}
Go SDK

Before

import (
    "context"
    "github.com/daytonaio/daytona/libs/sdk-go/pkg/daytona"
)

client, _ := daytona.NewClient()

page, limit := 2, 10
sandboxes, _ := client.List(context.Background(), &daytona.ListSandboxesQuery{
    States: []string{"started"},
    Page:   &page,
    Limit:  &limit,
})

After

import (
    "context"
    "fmt"
    "log"

    "github.com/daytonaio/daytona/libs/sdk-go/pkg/daytona"
)

client, _ := daytona.NewClient()

// Iterate all sandboxes matching the query (Go 1.23+ range-over-func)
limit := 10
for sandbox, err := range client.ListSeq(context.Background(), &daytona.ListSandboxesQuery{
    States: []daytona.SandboxState{daytona.SandboxStateStarted},
    Limit:  &limit,
}) {
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(sandbox.ID)
}
Ruby SDK

Before

require 'daytona'

daytona = Daytona::Daytona.new

sandboxes = daytona.list(Daytona::ListSandboxesQuery.new(
  states: ['started'],
  page: 2,
  limit: 10,
))

After

require 'daytona'

daytona = Daytona::Daytona.new

# Iterate all sandboxes matching the query
daytona.list(Daytona::ListSandboxesQuery.new(states: [Daytona::SandboxState::STARTED], limit: 10)).each do |sandbox|
  puts sandbox.id
end
Java SDK

Before

import io.daytona.sdk.Daytona;
import io.daytona.sdk.model.ListSandboxesQuery;
import io.daytona.sdk.model.SandboxState;

Daytona daytona = new Daytona();

ListSandboxesQuery query = new ListSandboxesQuery();
query.setStates(List.of(SandboxState.STARTED));
query.setPage(2);
query.setLimit(10);

List<Sandbox> sandboxes = daytona.list(query);

After

import io.daytona.sdk.Daytona;
import io.daytona.sdk.model.ListSandboxesQuery;
import io.daytona.sdk.model.SandboxState;

Daytona daytona = new Daytona();

ListSandboxesQuery query = new ListSandboxesQuery();
query.setStates(List.of(SandboxState.STARTED));
query.setLimit(10);

// Iterate all sandboxes matching the query
daytona.list(query).forEachRemaining(sandbox -> System.out.println(sandbox.get("id")));

Before you go

Upgrade to v0.180.0 or newer whenever it suits your schedule before June 25. Once you're on it, you're set going forward — no further changes needed.

Questions? Reach us at support@daytona.io or the in-dashboard chat.