OdyDocs

Pagination

Page through contacts and conversations with opaque cursors; which endpoints paginate and their page-size limits.

List endpoints that can grow without bound use cursor pagination: you ask for a page, and the response tells you where the next one starts. Cursors are stable — new rows arriving while you page don't make you skip or repeat items, unlike offset pagination.

#How it works

  1. Call the list endpoint with an optional limit.
  2. The response includes nextCursor.
  3. Pass it back as cursor on the next request.
  4. Stop when nextCursor is null. (When the last page happens to be exactly full, you get one more request that returns an empty list and nextCursor: null.)
curl "https://api.ody.co/v1/api/contacts?limit=100" \
  -H "Authorization: Bearer $ODY_API_KEY"

# next page
curl "https://api.ody.co/v1/api/contacts?limit=100&cursor=eyJjIjoiMjAyNi0x…" \
  -H "Authorization: Bearer $ODY_API_KEY"
Response
{
  "contacts": [{ "id": "8b1d…", "firstName": "Ada" }],
  "nextCursor": "eyJjIjoiMjAyNi0xMC0xNFQxODowMjoxMS4wMDBaIiwiaSI6IjhiMWQ…"
}
  • limit integer — Page size. Defaults and maximums per endpoint below.
  • cursor string — The previous response's nextCursor, passed back verbatim. A modified or stale cursor returns 400 invalid_argument.

#Limits per endpoint

EndpointPaginatesDefault limitMax limitOrder
GET /contactscursor50200Newest created first
GET /conversationscursor50100Most recent activity first
GET /callslimit only50200Newest first
GET /messages/searchlimit only25100Best match
GET /numbers/availablelimit only2050Carrier order
GET /webhooks/:id/deliverieslimit only50200Newest first
Syncing a large workspace

Use the maximum limit, and switch to webhooks (contact.updated, message.received) for incremental changes once the initial backfill is done — it's faster and stays well under the rate limit.

Last updated Wed Oct 14 2026 00:00:00 GMT+0000 (Coordinated Universal Time)Something wrong on this page? Tell us