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
400 with invalid_cursor.
Sync changes
To mirror Tolt into your database, read byupdated_at in a fixed window and upsert by id:
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.
Why a fixed window with a lag
Why a fixed window with a lag
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.

