/v1 (and Data API) index endpoint — API keys, webhooks, agents, models, audit events, knowledge documents, and the rest — returns results through the same cursor-paginated envelope. Learn it once, use it everywhere.
The envelope
data is always a flat list of the resource’s own JSON shape — the same shape a single-resource GET/POST returns for one item. meta.has_more tells you whether another page exists; meta.next_cursor is an opaque token to fetch it. Both fields are always present, even on the last page (next_cursor: null, has_more: false).
Paging through results
Request the first page with nocursor, then pass back meta.next_cursor on each subsequent request until has_more is false:
cursor is opaque — treat it as a token, not data
cursor is an encoded pointer into the underlying result set. Its contents are an implementation detail that can change between API versions — never decode it, parse it, or construct one by hand. Always pass back exactly the string meta.next_cursor gave you. A cursor from one endpoint is never valid on a different endpoint.
An unrecognized or stale cursor (e.g. one replayed after its underlying data shifted enough to become unresolvable) does not error or restart from the beginning — it resolves to whatever page would logically follow, which may be empty (data: [], has_more: false) rather than duplicate earlier results.
limit
Every list endpoint accepts an optional limit query parameter bounding page size:
There is no
offset/page-number pagination on /v1 — cursor pagination is the only mode, since it stays correct under concurrent writes (an offset-based page can skip or repeat rows when items are inserted or deleted between requests; a cursor cannot).