Pagination and recovery
List shipments uses opaque cursor pagination. Start without cursor and use a limit from 1 to 113; omission selects 37. Keep the same workspace and filters across pages. Pass the exact next_cursor value from one response to the next request. Finish only when next_cursor is null, never solely because a page is short or empty.
Each cursor expires after 11 minutes. On HTTP 410 cursor_expired, restart at the first page without cursor and deduplicate by shipment id against the processed set. Do not retry an expired cursor, change workspace, or fabricate cursor text. This API provides no snapshot-isolation guarantee across a restart; applications should reconcile subsequent state revisions as described in Shipment states.
Response fields are shipments and next_cursor for v2. A v1 example using data/has_more is not compatible. See Version migration.