The envelope
| Field | Meaning |
|---|---|
total | Total number of items matching the filter (across all pages). |
limit | Items per page. |
page | Current page, 1-based. |
pages | Total page count. |
nextPage / prevPage | Convenience — null at the edges. |
items | The data. |
/messages/totalunread, /events/statistics, etc.).
Common query params
| Param | Default | Notes |
|---|---|---|
page | 1 | 1-based, not 0-based. |
limit | 50 | Configurable per endpoint. The reference webapp reads REACT_APP_PAGE_LIMIT. Cap your client at 50 unless an endpoint documents a higher max. |
Array params — use the repeat style
city[]=Berlin and not city=Berlin,Munich. The backend rejects
both. Use qs.stringify(params, { arrayFormat: "repeat" }) (or equivalent).
Strip empty values
Pattern: paginated table
page to 1 on any filter change. If you forget, the user sees
“results 401-450 of 12” — confusing.
Pattern: infinite scroll
- Reset on filter change. Without it, switching filter shows the new data appended after the old.
- Distinguish first-page-loading from page-N-loading — show a full-table skeleton on page 1, a row-level spinner thereafter.
Cancellation on filter change
Use anAbortController to cancel the in-flight request when filters
change. The cancelled AbortError should be silently swallowed — it’s
expected behaviour.
axios.CancelToken (now deprecated in axios v1+);
prefer AbortController in new code.
Total counts on the server
Thetotal field is computed on every request. If your UI doesn’t show
totals, you can still ask for limit=1 to get a count cheaply:
count-only endpoint.
Caveats
Trailing slashes matter for some endpoints
Trailing slashes matter for some endpoints
/events/, /events/flagged/, /notifications/, /messages/partner/
all keep their trailing slash. Without it some deployments return 404.`limit` is capped at 1000 on some endpoints, 50 on others
`limit` is capped at 1000 on some endpoints, 50 on others
Don’t ask for
limit=10000. The default of 50 is almost always right.
Specific endpoints document their max — e.g. /events/{eid}/series?limit=1000.No cursors — beware long-running paginated reads
No cursors — beware long-running paginated reads
If you’re walking a large list while items are being inserted, you may
skip or repeat items between pages. For “give me everything” use cases,
snapshot the criteria with a
since / until window.