Skip to main content
List endpoints return at most 100 items per page, ordered most-recent first. The response envelope is uniform:
total_count is not included by default — it is only set when it is cheap to compute (notably absent on /v1/evaluations). If you need a count, page through to exhaustion.

Query parameters

starting_after and ending_before are mutually exclusive. The cursor value is always an item id from a prior page; do not synthesise it.

Forward pagination

Loop until has_more === false.

Walking a list to exhaustion

Why cursors, not offsets

Cursor pagination is stable across writes. With offset pagination, inserting a new evaluation while you page mid-list shifts every subsequent item by one and silently skips a row. Cursors anchor on a specific id and are immune.

Ordering

Default order is updatedAt DESC for the first page, then id DESC once a cursor is supplied. Order is not configurable. If you need a different ordering (oldest first, by name), fetch the page and sort client-side.

Edge cases

An empty page (data: [], has_more: false) is a valid terminal state — do not retry. It just means there is nothing on this team matching your filter.
Cursors are not portable across endpoints. A cursor from /v1/evaluations cannot be used on /v1/autousers.
A cursor referring to a deleted item still works — it’s a sort anchor, not a row read. The page after the deleted item returns as if it were still there.