Pagination
Every list endpoint (contacts, conversations, messages, broadcasts) pages the same way, so you can write one loop for all of them. Request a page size with ?limit= (default 50, max 100) and read the next page from the opaque meta.next_cursor in the previous response.
First page
GET https://app.vyaparping.com/api/v1/contacts?limit=50
→ { "data": [ ... ], "meta": { "next_cursor": "eyJ..." } }Next page
GET https://app.vyaparping.com/api/v1/contacts?limit=50&cursor=eyJ...
→ { "data": [ ... ], "meta": { "next_cursor": null } } // last pageWhy cursors, not offsets
Cursors are keyset-based: rows are ordered by (created_at, id) descending, and the cursor encodes the last row you saw. This stays stable under concurrent inserts — an offset-based page would skip or repeat rows when new data lands mid-scan — and stays fast at any depth.
The cursor is an opaque, server-issued string. Pass it back verbatim; don't try to parse or construct one yourself. next_cursor: null means you've reached the last page.