Pagination
Cursor-based paging on list endpoints
Cursor-paginated collection endpoints return this envelope:
data— the page of records.next_cursor— an opaque base64 cursor for the next page (nullon the last page).has_more—truewhen more pages exist after this one.
This applies to workspaces, documents, contacts, bank accounts, bank
statements, and transactions. Bank-account notification preferences return a
bounded { data } list without a cursor.
Walking the pages
Call without a cursor to start, then pass the previous response’s
next_cursor as the cursor query parameter until has_more is false:
Parameters
Cursors are keyset-based (stable under inserts), so paging never skips or duplicates rows the way offset paging can. Treat the cursor as opaque — don’t decode or construct it yourself.
Sorting
Document lists (invoices, quotes, proformas, credit notes) and transactions
accept optional sort and order query parameters:
- An unknown
sortvalue is ignored (you get the default order, not an error). contacts,bank_accounts, andbank_statementsdon’t support sorting yet.- Sorting composes with cursors — the keyset tiebreak keeps paging stable.
Filtering
Some list endpoints accept filters that compose with pagination. Contacts
support q name search; transactions support account, date, matching-status,
kind=credit|debit, and full-text filters; bank statements support account,
period overlap, file type, source, and extraction-status filters.

