Skip to main content
Every list endpoint pages with cursors. Pass the next_cursor you got back as starting_after until has_more is false.
Your codesync job
Tolt/v2/customers
1GET ?limit=100
2next_cursor: cur_WyIy…
3GET ?starting_after=cur_WyIy…
4has_more: false

Parameters

Responses add has_more, next_cursor and prev_cursor. Cursors are opaque cur_... strings. Don’t combine starting_after and ending_before, and keep the same filters and sort from page to page: a cursor only works with the sort it came from. With sort=created_at you can also pass an item id as the position.

Page through everything

A cursor that isn’t valid for the list returns 400 with invalid_cursor.

Sync changes

To mirror Tolt into your database, read by updated_at in a fixed window and upsert by id:
Page until has_more is false, then use this run’s updated_before as the next run’s updated_after, so windows don’t leave a gap. To absorb clock drift, start each window a few minutes earlier and upsert by id, as in Sync your data.
A row can become visible slightly after the updated_at it carries. Set updated_before a few minutes behind Tolt’s clock (read the Date response header, not your own clock) so every row in the window has committed. A fixed upper bound also keeps the window from moving while you page. Upserting by id absorbs repeats at the inclusive boundary.

Report breakdowns use offsets

GET /v2/reports/partners and GET /v2/reports/links sort by a metric, so they page with limit and offset (0 to 10000) instead of cursors. sort is revenue, commissions, clicks or customers.