Pagination
List endpoints use cursor-based pagination. Each response includes a pagination object:
{
"data": [
/* items */
],
"pagination": {
"next_cursor": "eyJpZCI6IjAxSjkifQ==",
"has_more": true
}
}
Use cursors when you sync bookmarks, folders, or other collections that can grow beyond a single response. Do not invent page numbers — the server encodes position in next_cursor.
Prerequisites
- A valid API key or JWT (Authentication).
- The list endpoint path and required headers (often
X-Workspace-IDfor workspace resources). - Client code that loops while
pagination.has_moreis true.
Requesting a page
| Query parameter | Type | Default | Notes |
|---|---|---|---|
cursor | string | — | Pass the next_cursor from the previous response |
limit | integer | 50 | Max 200 |
Example (set N24M_API_KEY to your workspace API key in the shell first):
curl --url 'https://api.not24get.me/workspaces/WS/bookmarks?limit=100' \
--header "Authorization: Bearer ${N24M_API_KEY}" \
--header 'X-Workspace-ID: WS'
Then for the next page:
curl --url 'https://api.not24get.me/workspaces/WS/bookmarks?limit=100&cursor=eyJpZCI6IjAxSjkifQ==' \
--header "Authorization: Bearer ${N24M_API_KEY}" \
--header 'X-Workspace-ID: WS'
When pagination.has_more is false, you have reached the end. next_cursor will be null or absent.
Stable ordering
Items are ordered by descending creation time, then by ID for tiebreakers. Cursors include both, so a page never shifts mid-iteration even if new items are created while you paginate.
Don't compute total counts
The API does not return a total row count by default. Counting is expensive and rarely useful in real integrations. If you need an exact count, iterate fully — but consider whether your UX really needs it.
Troubleshooting
- Repeating the same page — you omitted
cursoror reused an old cursor after changing filters. Always pass the latestnext_cursorunchanged. - Missing items at the end — stop only when
has_moreis false. Do not stop on an emptydataarray alone ifhas_moreis still true. - 400 validation_error on cursor — the cursor is corrupted, truncated, or from a different endpoint/filter set. Restart from the first page.
- 429 while syncing — lower
limitconcurrency and respect Rate limits. - Need error shape details — see Errors.
When this helps
Cursor pagination is the right fit for sync jobs, backups, and UI infinite scroll. Keep the cursor opaque: never decode it in client code. If filters change mid-sync, discard the cursor and start over from the first page so you do not skip or repeat rows. Pair large syncs with rate-limit aware clients so a long crawl does not trip 429 responses halfway through the collection.