Create an export
POST/exports
Starts an export of a whole dataset as files, for loading into a warehouse. Exports run in the background: poll GET /exports/{export_id} until status is completed, then download every file in files (links last an hour; GET again for fresh ones).
Datasets
listings: every active listing matchingfilters, one row per listing in the shape GET /listings returns. Needs theexportsscope (Pro and Enterprise).listing_changes: what happened to listings betweenfilters.fromandfilters.to(at most 366 days):created,price_changed(every change, with the price before and after) anddelistedevents, each with the listing as it is now. History begins 2026-03-09. Needs theexportsscope.registered_transactions: the Ministry of Justice's registered sale deals, rows as GET /transactions returns them. Free on every plan, open data under the Saudi Open Data License; ATTRIBUTION.txt comes with the files and must travel with the data.registered_rents: REGA's rent index cells, as GET /market/registered-rents serves them (cells under 5 contracts withheld). Free on every plan, with ATTRIBUTION.txt.
Files. Data comes in parts of up to 25,000 rows (part-00001.ndjson.gz, …); each part stands alone (a CSV part repeats the header). NDJSON rows are exactly the API's objects; CSV flattens them into dotted columns (price.yearly_sar) with arrays as JSON. manifest.json lists the parts, row counts, columns, filters, licence and notes. Files are deleted 7 days after the export completes.
Listing datasets are counted before anything is written and charged 1000 units per 1,000 rows, once, against your monthly quota (not the per-minute rate); on the export shows the charge. If the quota, spend cap or project cap can't cover it, the export fails with nothing charged. Open-data exports cost nothing.