Search registered deals
GET/transactions
Individual sale deals registered with the Ministry of Justice, from its quarterly open data, in one city: month, neighborhood, land-use class, area, price and price per m². Newest month first; paginate with cursor.
MOJ classes each deal by land use (residential = سكني, commercial = تجاري, …), not by what stands on the plot. Residential-class deals are overwhelmingly vacant land: 97.5% carry no building type and the median plot is about 500 m². Read prices per m² as land prices, not home prices.
Dates are served to the month. MOJ publishes the day, but a neighbourhood and a day single out one deal in 23% of cases against 1% for a neighbourhood and a month, so the day is withheld, and rows within a month are in a fixed order unrelated to the date. Plan, parcel and deed numbers and MOJ's own reference number are never served. Quarters published with misaligned columns (2020-Q2, 2023-Q1) are excluded. Prices are as registered and unfiltered: very low prices per m² usually mean a partial-share or family transfer, so filter with price_per_sqm_min for market comparables.
Riyadh city. Since 2024 the Real Estate Registry has registered a growing share of Riyadh-city sales (a majority by late 2025), and all of them from 19 May 2026. The Ministry of Justice open data we use covers notary-registered deals only, so Riyadh-city figures from 2024 are notary deals only and may under-represent districts that moved to the Registry early; Riyadh city is excluded after 18 May 2026. So Riyadh deals dated after 2026-05-18 are not served, coverage.notary_only_from_quarter is 2024-Q1, and figures from then on carry coverage_flag: "notary_only". Other Riyadh-region towns are unaffected.
Free on every plan and costs no units: this is Saudi government open data, served at no charge under the ODC Attribution License. It is not Kite Data, and our API terms put no restriction on reusing or redistributing it; keep the attribution notice with it wherever you show or pass it on.
- Authentication
- Send a data key (dk_live_… or dk_test_…) as a Bearer token.
- Scope
reference- Cost
- FreeFree on every plan: Saudi open data, served at no charge
Parameters
| Name | Type | Description |
|---|---|---|
cityrequiredquery | string | City slug from GET /cities. A town inside a covered region is accepted and resolved to its city ( |
neighborhood_idquery | integer[] | Up to 50 neighborhood ids from GET /cities/{city}/neighborhoods, comma-separated. Deals Kite could not place in a neighborhood are left out when this is set. |
land_usequery | string[] | One or more classes, comma-separated. Omit for all. One of: |
month_fromquery | string | First month to include, |
month_toquery | string |
Response
The data field is a list; each item has these fields.
| Name | Type | Description |
|---|---|---|
idrequired | string | Opaque, stable id for the deal: a keyed hash, not MOJ's reference number, which is not served. |
monthrequired | string | Month the deal was registered. |
source_quarterrequired | string | The MOJ quarterly file the deal was published in; see |
cityrequired | string | |
city_name_arrequired | string | null | City as MOJ writes it. Tells towns apart where a Kite city covers a region (eastern_province, qassim). |
district_name_arrequired | string | null | District as MOJ writes it, whether or not Kite could map it. |
neighborhoodrequired | object | null | The Kite neighborhood the district maps to; null when it doesn't map. |
land_userequired | string | MOJ's land-use class: |
Example request
curl "https://api.kite.sa/v1/transactions?city=riyadh" \
-H "Authorization: Bearer $KITE_API_KEY"import { Kite } from "@kite-sa/sdk";
const kite = new Kite(); // reads KITE_API_KEY
const result = await kite.transactions.search({ city: "riyadh" });from kite_sa import Kite
kite = Kite() # reads KITE_API_KEY
result = kite.transactions.search(city="riyadh")Open in the interactive reference
Related endpoints
- Registered deal statistics
GET /market/transactions - Land prices per m²
GET /market/land-prices