Pagination
List endpoints return a page plus:
"pagination": { "limit": 25, "next_cursor": "eyJvIjoy….pkFEfJUOpRbZ…", "has_more": true, "result_window_reached": false }
- To get the next page, repeat the request with
cursor=<next_cursor>and the same parameters. A cursor used with different filters or sort is rejected. - Treat a cursor as an opaque string: pass back exactly what you were given. Cursors are signed, so an edited or hand-built one is rejected with
invalid_cursor, and their contents will change when the underlying pagination does. result_window_reached: truemeans more results exist but your plan's paging depth is reached. Narrow the query (neighborhood, price, property type) instead of paging deeper.- Listing search doesn't return a total. Use
GET /listings/countwith the same filters.
Cursors carry an offset, so under sort=newest or a price sort a listing added or removed between two pages can shift rows across the boundary and be served twice or skipped. That is inherent to paging a live table, and it is why a sync uses sort=updated_asc — see Keeping a copy in sync.