Collection endpoints use cursor-based pagination in created_at DESC, id DESC order — newest first. Pass the next_cursor from one response as ?cursor= on the next request. There are no page numbers and no offsets.
Paginated endpoints
The following endpoints include next_cursor and has_more in meta:
GET /v1/videos
GET /v1/videos/{id}/analyses
GET /v1/deals
GET /v1/deals/{id}/activities
GET /v1/deals/{id}/scorings
Non-paginated collections
These endpoints return the full collection in a single response — no cursor or limit parameters are accepted:
GET /v1/members
GET /v1/webhooks
GET /v1/videos/{id}/transcript
GET /v1/videos/{id}/events
?cursor=... and ?limit=... on these endpoints are silently ignored — the request will not error. If you’re expecting a limit to apply and it isn’t, you’re probably on a non-paginated endpoint.
Query parameters
Response shape
When there are no more pages, has_more is false and next_cursor is null.
Drill-through example
Loop on has_more rather than on the stringified cursor — it’s unambiguous even if a future response shape changes:
Invalid cursors
A malformed or unparseable cursor silently falls back to page 1. This is intentional — cursor encoding may evolve between API versions, and a stale cursor from a previous client build shouldn’t break the consumer.
If you need to detect stale cursors, compare the first item’s ID to what you were expecting — or, more robustly, store the last successful cursor with a timestamp and re-fetch from scratch periodically.
Stability under concurrent writes
Cursors use keyset pagination on (created_at, id), so:
- Items created after you start paging appear on the first page of a fresh query, never in the middle of your drill-through.
- Items deleted during paging may skip pages — you’ll see the next item after the gap, not a duplicate of an earlier ID.
- No overlapping IDs between pages.
This is safer than offset pagination for long-running drill-throughs, but the total count isn’t available mid-iteration.