Cursor-based pagination everywhere: pass limit (max 200), follow next_cursor until it's null. Cursors are stable under concurrent writes — no skipped or duplicated records mid-scan.
The pattern
GET /contacts?limit=200 → response carries data[] and next_cursor. Loop: pass cursor=next_cursor until null. That's the whole pattern — no page numbers, no offsets.
Why cursors
Offset pagination breaks under writes (records shift between pages, you skip or duplicate). Cursors are position-stable snapshots — safe for long scans of live data.
Delta sync
Combine with updated_since for incremental syncs: GET /contacts?updated_since=2026-06-01T00:00:00Z&limit=200, paginate to the end, store the max updated_at as your next watermark.
SDK note
Both SDKs expose auto-paginating iterators (for contact in client.contacts.list(...)) so you rarely touch cursors directly.