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, or next_page. Whatever the style, the rule is identical: pass the value back verbatim; null means you have reached the end. Some endpoints also include total when 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 receive 502 TEMPORARILY_UNAVAILABLE — in both cases restart from the first page.
  • limit bounds the page size (see each endpoint's reference for its maximum). The last page may contain fewer items than limit.
  • Do not fan out one pagination across workers. Fetch pages sequentially; navigation values do not support random access.