DarakPlatform
Use casesDocsGuidesPricing
DocsGuides
Guides

Start here

  • Quickstart
  • Authentication

AI & MCP

  • Connect an AI assistant
  • Build with Darak and AI

About the data

  • What a listing is
  • Coverage and freshness

Building with it

  • Searching and filtering
  • Webhooks
  • Keeping a copy in sync

Operating

  • Limits and quotas
  • Pagination
  • Retrying safely
  • Errors
  • Versioning

Policies

  • Terms in practice

API reference →

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: true means 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/count with 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.