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
  • Bulk exports

Operating

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

Policies

  • Terms in practice

API reference →

Bulk exports

When you want a whole dataset in your warehouse rather than a page at a time, ask for an export. It runs in the background and hands you files.

curl -X POST https://api.darak.app/v1/exports \
  -H "Authorization: Bearer $DARAK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"dataset": "listings", "format": "ndjson", "filters": {"city": ["riyadh", "jeddah"]}}'

The answer is an export with status: "queued". Poll GET /exports/{export_id} every few seconds to a minute: it starts within about a minute, and a snapshot of every listing in the country takes a few minutes. Once status is completed, files has a signed link for each file, valid for an hour; ask again for fresh ones. Files are deleted 7 days after the export completes.

Datasets.

  • listings: every active listing matching filters, which are the /listings filters as JSON (city and listing_type take several values and default to all of them). Add updated_since for an incremental snapshot.
  • listing_changes: every created, price_changed and delisted event between filters.from and filters.to (up to 366 days), each with the listing as it is now. Every recorded price change is there, with the price before and after, so this is the dataset to load for history. Listing history begins on 2026-03-09.
  • registered_transactions: the Ministry of Justice's registered sale deals, rows as GET /transactions serves them.
  • registered_rents: REGA's rent index cells, as GET /market/registered-rents serves them.

Files. Data comes in parts of up to 25,000 rows (part-00001.ndjson.gz, part-00002.ndjson.gz, …), each of which stands alone, so load them in parallel. An NDJSON row is exactly the object the matching endpoint returns in data; CSV flattens it into dotted columns (price.yearly_sar, location.neighborhood_id) with arrays as JSON. manifest.json lists the parts with their row counts, the columns, the filters, the licence and any caveats about the data. CSV is UTF-8 without a byte-order mark.

Cost and limits. The listing datasets need the Pro plan or up (the exports scope). They are counted before anything is written and charged 10 units per 1,000 rows, once, against your monthly quota but not your per-minute rate; the export's units shows the charge. If your quota, spend cap or project cap can't cover it, the export fails with monthly_quota_exceeded, spend_cap_reached or project_cap_exceeded and nothing is charged, and a failed export is refunded. A full snapshot of about 230,000 listings costs about 2,300 units. The open-data datasets are free on every plan and cost nothing. An organization can run 2 exports at once and create 20 a day; one export holds at most 2,000,000 rows.

What you may do with the files. Listing exports are Darak Data, under the same terms as the API, including keeping it for 30 days from retrieval unless your agreement says otherwise: re-export on a schedule rather than accumulating. Open-data exports are Saudi government open data, which you may keep and redistribute provided ATTRIBUTION.txt travels with them.