Pagination
List jobs and the Build-time feed page with an opaque cursor.
"pagination": { "next_cursor": "eyJjIjoiMjAyNi0wNC0xMlQxNDozMDowMFoiLCJpIjoiMDFITi4uIn0", "has_more": true }- Omit
cursoron the first request. - Pass
next_cursorback verbatim as thecursorquery parameter to get the next page. - Stop when
has_moreisfalse.next_cursorisnullon that page. Wheneverhas_moreistrue,next_cursoris non-null, so a follow-the-cursor loop cannot dead-end. - Do not parse the cursor. Its format is implementation-defined and may change without a version bump. The only valid operations are “send it back” and “throw it away”.
- Keep the other parameters the same across a paginated walk (
limit,updated_since,indexable,reviews,service,city). The cursor records your position, not your filters. - Use a cursor only with the endpoint and business that issued it. The two list endpoints order differently, so a cursor from one means nothing on the other.
Stability
Section titled “Stability”A cursor marks the position of the last row on the page you received; the next page starts strictly after that position. A job published while you paginate is placed by its own ordering timestamp and does not shift the rows already returned, so a walk started before a publish still completes cleanly. If the row a cursor marks is unpublished in the meantime, the next page simply begins after its position.
A malformed cursor, or one over 512 characters, answers 400 invalid_cursor. Restart from the first page.
curl "https://app.simplifylocal.app/api/businesses/{slug}/jobs?limit=100&aggregates=false&cursor=eyJj…" \ -H "Authorization: Bearer sl_live_…"On /jobs, send aggregates=false on every page after the first; the aggregates are the same on every page.