Response envelope
Every list endpoint returns the same envelope.GET /v1/webhook_endpoints/event_types returns one complete list in a single response, with has_more: false and next_cursor: null:
Cursor parameters
Paging forward
Send
starting_after set to next_cursor from the current page.Paging backward
Send
ending_before set to next_cursor from the current page.next_cursor continues the direction you are already travelling. Page forward and it points at the next older page; page backward with ending_before and it points at the next newer one. Feed it back to whichever parameter you used.
Pagination pattern
The pattern: fetch a page, pass itsnext_cursor as starting_after on the next request, and stop when next_cursor comes back null.
Here is that walk end to end - three requests against /v1/customers, the cursor carried forward each time, until has_more finally comes back false:
1
Request the first page
Call the endpoint with no
starting_after. Set limit if you want a page size other than the default 25.2
Read next_cursor
If
next_cursor is not null, more pages exist and that value is your cursor. You do not need to look at the items at all.3
Request the next page
Repeat the same request, adding
starting_after=<next_cursor>.4
Stop when next_cursor is null
A final page carries
has_more: false and next_cursor: null. The API never returns the cursor you just sent, so a loop on next_cursor always terminates.Sort order
List endpoints return records newest first, in the order the records were created. A record that was imported or back-dated can show acreated_at that is out of sequence with the rest.
The one exception is GET /v1/icons. It is a static, centrally curated catalog rather than a record of your own data, so it has no created_at and is ordered by slug ascending.
starting_after and ending_before are mutually exclusive: send exactly one. A request carrying both is rejected with 400 invalid_query_parameter rather than being resolved in favour of either.
Errors
param names the offending query parameter on all three codes.
Filters (status=active, created[gte]=..., and so on) compose with cursor pagination: the cursor identifies your position within the filtered, sorted result, not within the whole collection.