The pagination block
Every list response carries apagination object:
Treat
nextCursor as opaque: it is not an offset, a timestamp, or an ID to build or
parse. Pass it back exactly as you got it. A list that fits in one response returns
nextCursor: null and hasMore: false.
Get the next page
To fetch the next page, send the previous page’snextCursor as the cursor query
parameter. Set limit (1–100, default 25) to size each page. Stop when nextCursor comes
back null.
A manual paging loop
Or let the SDK do it
The SDKs ship a helper that follows the cursor for you and yields every item across all pages, so you never hold acursor yourself:
Which lists paginate
Cursor pagination applies to the lists that grow without bound: messages, threads, letters and their events, storage objects, audit logs, and a contact’s message history. On those,nextCursor walks the pages. Smaller collections — domains, inboxes, webhooks, API keys,
templates, audiences — return their full set in one response, with nextCursor: null.
Filters (such as
inboxId, threadId, direction, or channel=a2a on messages) compose
with pagination. Keep the same filters on every page so the cursor walks a stable result
set.Tailing the event stream
The event stream (GET /v1/events) pages with the same pagination.nextCursor, takes its
cursor as since, and adds wait and tail parameters for real-time long-polling. See
the event ledger for that pattern.