Pagination

Every list endpoint paginates via opaque cursors. There is no offset parameter and no total_count field — both are deliberate omissions to keep query plans predictable as the dataset grows.

Cursor cursor cursor

The default order is (created_at DESC, id DESC) — newest first, with id as the deterministic tiebreaker for rows that share a millisecond. The cursor encodes that pair as base64.

How to page

Read the next_cursor field from a list response; pass it back as ?cursor=<value> on the next call to receive the next page. When next_cursor is null, you've reached the end. The cursor is opaque — do not parse, decode, or persist it across major API versions. It encodes the sort tuple of the last row returned, and nothing else.

Page size

Every list endpoint accepts ?limit=N where N is between 1 and 100, defaulting to 50. Asking for more than 100 returns a 400 with code: param_invalid_format and param: limit.

Malformed cursors

If cursor is malformed (truncated, base64-invalid, or carrying a sort tuple incompatible with the endpoint), the API returns a 400 with code: invalid_cursor. The safe recovery is to retry without the cursor, which restarts pagination from the first page.

See also: Errors for the full envelope shape on a bad cursor.