Pagination
One pagination language for every API, always under meta.pagination.
List endpoints paginate through meta.pagination — never through fields inside data.
data stays pure content; navigation is a platform concern and always looks the same:
{
"meta": {
"request_id": "req_…",
"as_of": "2026-07-31T12:00:00.000Z",
"pagination": {
"next_cursor": "OTg5OWRhNDk6YV8z",
"limit": 25,
"returned": 25
}
},
"data": { "items": [ "…" ] }
}limit— the effective page size for this response.returned— how many items this page actually contains.- Exactly one navigation field, depending on the endpoint's style:
next_cursor(opaque cursor),next_offset, ornext_page. Whatever the style, the rule is identical: pass the value back verbatim;nullmeans you have reached the end. Some endpoints also includetotalwhen it can be computed reliably.
The flow (page style)
Page 1
curl "https://api.endpointry.com/v1/google/web-search?query=best%20crm%20software&page=1&per_page=10" \
-H "Authorization: Bearer sk_live_..."Read meta.pagination.next_page and pass it back to fetch the next page:
Page 2
curl "https://api.endpointry.com/v1/google/web-search?query=best%20crm%20software&page=2&per_page=10" \
-H "Authorization: Bearer sk_live_..."When the navigation field is null, you have reached the end.
Rules
- Cursors are opaque. On cursor-style endpoints, never parse, modify or construct them — the format may change at any time without notice.
- Cursors are short-lived and bound to the result stream that issued them. An expired or
foreign cursor returns
400 VALIDATION_ERROR; if the stream is temporarily unavailable you may receive502 TEMPORARILY_UNAVAILABLE— in both cases restart from the first page. limitbounds the page size (see each endpoint's reference for its maximum). The last page may contain fewer items thanlimit.- Do not fan out one pagination across workers. Fetch pages sequentially; navigation values do not support random access.