Create an export (POST /exports) — Kite API
KitePlatform
Use casesDocsGuidesPricing
Browse endpoints
All endpoints

Reference data

  • List cities
  • List neighborhoods
  • List city directions
  • List enumerated values
  • Get this key's limits
  • What the API covers

Listings

  • Search listings
  • Count listings
  • Get listings by id
  • Get a listing
  • Get a listing's price history

Market data

  • Market summary
  • Price distribution
  • Area distribution
  • New supply
  • Vacancy indicator
  • Prices by neighborhood
  • Commercial rent per m² by neighborhood

Official data

  • Registered rents (REGA)
  • Kite Property Index

Analytics

  • Get comparable listings
  • Get a listing's market position
  • Get a listing's nearby asking-price band
  • Find below-market listings
  • Find below-market listings (old path)
  • Get gross rental yield
  • Get price trends
  • Compare neighborhoods

Registered transactions

  • Search registered deals
  • Registered deal statistics
  • Land prices per m²

Off-plan projects

  • Search projects
  • Get a project
  • List a project's units
  • Search project units
  • List developers

Exports

  • Create an export
  • List exports
  • Get an export

Administration

  • Get your organization
  • List data keys
  • Create a data key
  • Revoke a key
  • List projects
  • Daily usage
  • List members and invitations
  • List audit events
  • List request logs
  • Create a webhook endpoint
  • List webhook endpoints
  • Delete a webhook endpoint
  • List deliveries
  • Replay a delivery

Interactive reference

All endpoints

Reference data

  • List cities
  • List neighborhoods
  • List city directions
  • List enumerated values
  • Get this key's limits
  • What the API covers

Listings

  • Search listings
  • Count listings
  • Get listings by id
  • Get a listing
  • Get a listing's price history

Market data

  • Market summary
  • Price distribution
  • Area distribution
  • New supply
  • Vacancy indicator
  • Prices by neighborhood

Exports

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 matching filters, one row per listing in the shape GET /listings returns. Needs the exports scope (Pro and Enterprise).
  • listing_changes: what happened to listings between filters.from and filters.to (at most 366 days): created, price_changed (every change, with the price before and after) and delisted events, each with the listing as it is now. History begins 2026-03-09. Needs the exports scope.
  • 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.

Kite API

Saudi real estate data for developers.

Product
  • API reference
  • Data coverage
  • Pricing
  • Valuation checks
  • Changelog
  • Status
Company
  • kite.sa
  • Contact
  • Security
Legal
  • Terms
  • Subprocessors
© Kite
  • Commercial rent per m² by neighborhood
  • Official data

    • Registered rents (REGA)
    • Kite Property Index

    Analytics

    • Get comparable listings
    • Get a listing's market position
    • Get a listing's nearby asking-price band
    • Find below-market listings
    • Find below-market listings (old path)
    • Get gross rental yield
    • Get price trends
    • Compare neighborhoods

    Registered transactions

    • Search registered deals
    • Registered deal statistics
    • Land prices per m²

    Off-plan projects

    • Search projects
    • Get a project
    • List a project's units
    • Search project units
    • List developers

    Exports

    • Create an export
    • List exports
    • Get an export

    Administration

    • Get your organization
    • List data keys
    • Create a data key
    • Revoke a key
    • List projects
    • Daily usage
    • List members and invitations
    • List audit events
    • List request logs
    • Create a webhook endpoint
    • List webhook endpoints
    • Delete a webhook endpoint
    • List deliveries
    • Replay a delivery

    Interactive reference

    Cost.
    units

    Limits. 2 exports queued or running at once and 20 a day per organization (export_limit); 2,000,000 rows per export (split larger ones by city, listing type or range). Send an Idempotency-Key to make a retried POST safe.

    Authentication
    Send a data key (dk_live_… or dk_test_…) as a Bearer token.
    Scope
    reference
    Cost
    FreeFree to call. A listings or listing_changes export is charged 1000 units per 1,000 rows (at least 1000) once its rows are counted; open-data exports are free

    Parameters

    NameTypeDescription
    Idempotency-Keyheaderstring

    A unique string (a UUID is ideal) making this call safe to retry. The same key with the same body replays the first response and sets Idempotent-Replay: true; with a different body it returns 409 idempotency_key_reuse. Remembered for 24 hours.

    Request body

    NameTypeDescription
    datasetrequiredstring

    One of: listings, listing_changes, registered_transactions, registered_rents

    filtersrequiredobject

    The filters of GET /listings, as JSON. city and listing_type take several values here, and default to all of them.

    formatstring

    ndjson (one JSON object per line) or csv.

    One of: ndjson, csv

    compressionstring

    gzip (default) compresses each part file.

    One of: gzip, none

    Response

    The data field is an object with these fields.

    NameTypeDescription
    idrequiredstring
    datasetrequiredstring

    One of: listings, listing_changes, registered_transactions, registered_rents

    formatrequiredstring

    One of: ndjson, csv

    compressionrequiredstring

    One of: gzip, none

    statusrequiredstring

    queued → running → completed, or failed. expired once the files are deleted.

    One of: queued, running, completed, failed, expired

    filtersrequiredobject | null

    As requested. Null once complete if your organization has turned off storing request details.

    price_sourcerequiredstring

    Where the prices come from: asking = advertised asking prices from listings; registered = registered transactions or rent contracts. Asking prices typically sit above what is finally agreed.

    One of: asking, registered

    rows_estimatedrequiredinteger | null

    Rows counted before a listing export ran, which units is priced on.

    row_countrequiredinteger | null

    Rows written, once complete.

    unitsrequiredinteger

    Units charged. 0 for open data, and refunded if the export fails.

    progressrequiredobject
    errorrequiredobject | null
    attributionrequiredobject | null

    Open-data exports: the licence notice, also in ATTRIBUTION.txt. Keep it with the data.

    filesrequiredobject[]

    Download links, on GET /exports/{export_id} of a completed export only.

    created_atrequiredstring (date-time)
    started_atrequiredstring (date-time) | null
    completed_atrequiredstring (date-time) | null
    expires_atrequiredstring (date-time) | null

    When the files are deleted.

    Example request

    curl
    curl -X POST "https://api.kite.sa/v1/exports" \
      -H "Authorization: Bearer $KITE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"dataset":"listings"}'
    JavaScript (@kite-sa/sdk)
    import { Kite } from "@kite-sa/sdk";
    
    const kite = new Kite(); // reads KITE_API_KEY
    const result = await kite.exports.create({ dataset: "listings" });
    Python (kite-sa)
    from kite_sa import Kite
    
    kite = Kite()  # reads KITE_API_KEY
    result = kite.exports.create(dataset="listings")

    Open in the interactive reference

    Related endpoints

    • List exports GET /exports
    • Get an export GET /exports/{export_id}

    Guides

    • Quickstart
    • Keeping a copy in sync
    • Bulk exports
    • Limits and quotas
    • Errors