Pagination
One cursor convention for every list endpoint — opaque cursors, next_cursor, and no totals.
Every list endpoint paginates the same way:
curl "https://api.mouve.it/public/v1/timeline?scope=discovery&limit=20" \
-H "Authorization: Bearer $MOUVE_TOKEN"{
"data": [
{ "id": "…", "text": "…", "created_at": "2026-08-29T10:12:44Z" }
],
"meta": {
"next_cursor": "eyJ2IjoxLCJxIjoiOWYyYic…"
}
}Request the next page by passing the cursor back verbatim:
curl "https://api.mouve.it/public/v1/timeline?scope=discovery&limit=20&cursor=eyJ2IjoxLCJxIjoiOWYyYic…" \
-H "Authorization: Bearer $MOUVE_TOKEN"Rules
limit— 1 to 100, default 20 (/timelinecaps at 50). Out-of-range values are a400 VALIDATION_FAILED, not silently clamped.cursor— opaque, up to 512 characters. Do not parse, construct, or modify cursors; their internal format may change at any time without notice and is not part of the API contract.meta.next_cursor: nullmeans you have reached the end.- There is no
totalcount. This is a documented omission, not a gap: totals over visibility-filtered feeds are both expensive and misleading. Read pages untilnext_cursorisnull. - A cursor is bound to the query that produced it — the same endpoint and
the same filters. Replaying a cursor against a different endpoint or with
different filters is a
400 INVALID_CURSOR. - An invalid or corrupted cursor is always a
400 INVALID_CURSOR— never a silent reset to the first page.
Ordering
Lists are ordered newest-first by creation time (stable, microsecond precision, ties broken by id). New items appearing while you paginate do not shift or duplicate the pages you have already read.