Pagination
V3 list endpoints use the same pagination shape across the surface:
| Param | Type | Default | Range |
|---|---|---|---|
limit | int | varies per endpoint, typically 20 | 0..100 |
offset | int | 0 | >= 0 |
Every list response includes a totalCount:
{ "auctions": [ /* up to limit */ ], "totalCount": 47}Use totalCount to render pagination controls (page indicators, “showing
20 of 47”, etc.) and to know when to stop fetching the next page.
Empty results
Section titled “Empty results”A request whose offset >= totalCount returns 200 with an empty array
and the correct counts:
{ "auctions": [], "totalCount": 47 }Not a 404. Treat the empty array as “you’ve paged past the end.”
Stable sort
Section titled “Stable sort”Every paginated endpoint has a deterministic order with a unique tiebreaker:
- Notifications:
(dateInserted DESC, id DESC) - My activity:
(dateInserted DESC, bid.id DESC) - My cart:
(dateInserted ASC, item.id ASC) - Auctions: depends on the endpoint’s natural sort +
id DESCas the final tiebreaker
This means consecutive page fetches at the same offset return the same rows in the same order, even when other users are inserting new rows in parallel. New rows shift the offset boundary; they don’t reshuffle rows inside an offset.
If you’re surfacing live data (e.g., a notifications screen receiving new rows via Socket.IO), the right strategy is:
- Render page 0 of the API response on screen-open.
- On new socket event, prepend the new item to the local list.
- On scroll, request
offset=NwhereNis the count of pre-existing items the user has seen — not the visible row count (which may include the socket-injected items).
Count-only mode
Section titled “Count-only mode”Some endpoints accept limit=0. That tells the server you only want
counts, not rows:
{ "notifications": [], "totalCount": 24, "unreadCount": 7 }This is significantly cheaper than limit=1 because the server skips the
list query, the image join, and the favorites lookup entirely — only the
indexed counts run. Use it for badge updates, foreground polling, anything
where you don’t actually need to render rows.
Endpoints that support count-only mode call it out in their reference page. Currently:
GET /v3/bidder/notifications?limit=0— returnstotalCount+unreadCount
Variants by endpoint
Section titled “Variants by endpoint”Most list endpoints follow the standard shape exactly. A few diverge in useful ways:
/v3/bidder/notifications
Section titled “/v3/bidder/notifications”limit=0count-only mode (above).unreadCountis always global — it ignoresfilterandshowReadso the badge stays stable as the user toggles filter chips.
/v3/bidder/my-activity
Section titled “/v3/bidder/my-activity”- Returns a single response with two paginated sub-lists:
bids[]andpurchases[]. Pagination params apply to both in parallel (offset=20skips the first 20 of each). - Includes
statusCountsfor per-status tile counts (winning / losing / won / lost), aggregated across the full visible set — not paginated.
/v3/bidder/my-cart
Section titled “/v3/bidder/my-cart”- Returns
items[]plus atotalsobject (unpaidAmount,paidAmount,currency). The totals are over the full cart, not just the visible page.
Anti-patterns
Section titled “Anti-patterns”limit=1000to “get everything.” The hard cap is 100. Servers reject larger values with a 400.- Walking pages with
offset=N*limitand assuming new rows haven’t arrived between page fetches. They might have. Either rely on the stable-sort guarantee + accept that newcomers will appear on the next page, or stream from Socket.IO if you need realtime accuracy. - Polling
limit=20to detect new entries. Uselimit=0for the count, or join the appropriate Socket.IO room for push notifications (see Realtime).
Reference
Section titled “Reference”Behavior is uniform — see each endpoint’s API reference page for the parameters it accepts.