The OffplanIndex API
A REST read API over the same corpus this site is built from: 2,924 off-plan projects, 230 communities and 676 developers across the UAE, priced from 52,882 unit records. It is built for two audiences: portals that want price per sqft and payment plan benchmarks they do not have to compute themselves, and agencies that want to pull project and developer data into their own tools.
The licence is short: everything served here is OffplanIndex's own derived analytics, aggregated and computed from developer published facts and publicly observed listings, never a copy of a portal's raw database and never an image URL pointing back at one. Full terms are on the data policy page, and a key is sold on the data licence page.
| Method | Path | What it returns |
|---|---|---|
| GET | /api/v1/projects | Filterable list of every project |
| GET | /api/v1/projects/{id} | One project, with its psf position |
| GET | /api/v1/communities | Every tracked community |
| GET | /api/v1/communities/{slug} | One community, full aggregate |
| GET | /api/v1/developers | Every tracked developer |
| GET | /api/v1/developers/{slug} | One developer, full aggregate |
| GET | /api/v1/market | Dubai and UAE aggregates |
| GET | /api/v1/sync | Full corpus walk for downstream diffing |
| GET | /api/v1/meta | Corpus counts and build date, unkeyed |
Header, errors, rate limit
Every endpoint except /api/v1/meta requires a key sent as the x-api-key header. Get one on the data licence page. A missing key and an unrecognised key return the same 401 body, so a bad key cannot be told apart from no key at all.
Every keyed response carries Cache-Control: private, no-store and Vary: x-api-key. That is deliberate: a shared cache in front of this API keys on the URL alone and knows nothing about your key, so a public directive would let it hand your payload to the next caller who asks for the same path. Cache in your own process instead, keyed on X-Corpus-Version, which every response carries and which only changes when the corpus is rebuilt. The one exception is /meta, which needs no key and carries no records, so it is cacheable for an hour.
| Param | Type | Notes |
|---|---|---|
| x-api-key | header, string | Required on every endpoint except /api/v1/meta. |
| Status | error.code | Meaning |
|---|---|---|
| 400 | bad_request | A query parameter was malformed, for example a non numeric price bound. |
| 401 | unauthorized | The x-api-key header is missing, or the key is not on the allowlist. Both cases return the same body on purpose, so a bad key cannot be distinguished from a missing one. |
| 404 | not_found | No project, community or developer exists with that id or slug. |
| 429 | rate_limited | This key went over the rate limit. Check the Retry-After header. |
Every error body has the shape { error: { code, message } }.
Each key is limited to 600 requests per minute. Going over it returns 429 with a Retry-After header in seconds. The limit is tracked in the memory of the server instance handling the request, not in a shared store, so it protects a single instance rather than being a hard global ceiling across every instance behind the API. Treat 600 per minute per key as the number to design around, not a guarantee down to the request.
What X-Corpus-Version means, honestly
The corpus is rebuilt periodically from source rather than streamed continuously. Each record does now carry the date its own content last changed, computed by hashing what we publish about it and comparing that against the previous build, which is what the sitemap stamps as lastmod. It is not exposed as an API field yet: see the header of src/lib/lastmod.ts in the codebase for how it is derived and what it does and does not claim.
What you do get: X-Corpus-Version on every response, set to the build date, so you can tell when the whole corpus last moved. And /api/v1/sync, which walks the full project set and stamps each row with a content_hash, a short hash of that row's fields. Keep your own last synced hash per id, pull the current page, and any id whose hash changed is the delta. It costs a full walk instead of a true incremental feed, but it is accurate: nothing is invented to look like a timestamp that does not exist.
GET /api/v1/projects
Filterable list of every tracked project.
| Param | Type | Notes |
|---|---|---|
| city | string | Exact match, case insensitive, for example Dubai. |
| community | string | Community slug, for example business-bay. |
| developer | string | Developer slug, for example danube. |
| status | string | Sale status: on_sale, out_of_stock, presale, sold_out, announced, start_of_sales, booking_started, waiting_for_sales_start, might_be_sold_out. |
| handover_year | integer | Exact match on the scheduled handover year. |
| min_price | number | AED, inclusive. Rows with no stated starting price are excluded once this is set. |
| max_price | number | AED, inclusive. Same exclusion rule as min_price. |
| bedrooms | string | A single value, for example 2 or 0 for studio. Matches projects whose bedroom mix includes it. |
| q | string | Case insensitive substring match on the project title. |
| limit | integer | Default 50, maximum 500. |
| cursor | string | Opaque, from meta.next_cursor on the previous page. |
curl -s "https://offplanindex.com/api/v1/projects?city=Dubai&limit=2" \
-H "x-api-key: YOUR_KEY"{
"data": [
{
"id": "10-j-one-tower-a",
"title": "J One Tower A",
"developer": "Durar",
"developer_slug": "durar",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": null,
"delivery_quarter": "Q4 2021",
"delivery_year": 2021,
"sale_status": "out_of_stock",
"construction_status": "completed",
"property_types": null,
"bedrooms": null,
"n_units": 0,
"n_plans": 0,
"lat": 25.186162564692015,
"lng": 55.28328666778401
},
{
"id": "1003-sol-bay",
"title": "SOL Bay",
"developer": "Sol Properties",
"developer_slug": "sol-properties",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": 2040000,
"delivery_quarter": "Q4 2020",
"delivery_year": 2020,
"sale_status": "on_sale",
"construction_status": "completed",
"property_types": null,
"bedrooms": "1",
"n_units": 9,
"n_plans": 1,
"lat": 25.18034209709853,
"lng": 55.273135884655545
}
],
"meta": {
"total": 3223,
"limit": 2,
"cursor": "MA",
"next_cursor": "Mg",
"license": "Derived analytics only: aggregates and analysis computed by OffplanIndex from developer published project facts and publicly observed listings. Not a redistribution of any portal's database, and no image URLs are served. See /data-policy for the licence and /data to buy a key."
}
}Live sample, filtered to city=Dubai and limit=2. meta.total counts the full filtered set, not just this page.
GET /api/v1/projects/{id}
One project's full record, resolved from its community's data and, if that is missing, from its developer's data. Includes an estimated price per sqft position against its community and against the Dubai market.
| Param | Type | Notes |
|---|---|---|
| id | string, path | Project id, as returned by /api/v1/projects. |
curl -s "https://offplanindex.com/api/v1/projects/danube-properties-bayz-102" \
-H "x-api-key: YOUR_KEY"{
"id": "danube-properties-bayz-102",
"title": "Bayz 102",
"developer": "Danube",
"developer_slug": "danube",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": 2525000,
"delivery_quarter": "Q4 2029",
"delivery_year": 2029,
"sale_status": "on_sale",
"construction_status": "under_construction",
"property_types": "apartment,penthouse",
"bedrooms": "1,2,3,4,5",
"n_units": 299,
"n_plans": 9,
"lat": 25.187670501380495,
"lng": 55.25988699826104,
"psf_median": 2944,
"pre_handover_pct": 50,
"post_handover_pct": 50,
"psf_position": {
"community": {
"percentile_estimate": 39,
"comparator_median_psf": 3188,
"delta_vs_median_pct": -7.7,
"note": "percentile_estimate is a linear interpolation between the comparator's published quantiles (min, p25, median, p75, max), not a rank over the raw distribution."
},
"dubai_market": {
"percentile_estimate": 75,
"comparator_median_psf": 2021,
"delta_vs_median_pct": 45.7,
"note": "percentile_estimate is a linear interpolation between the comparator's published quantiles (min, p25, median, p75, max), not a rank over the raw distribution."
}
}
}psf_position.percentile_estimate is interpolated between the comparator's published min, p25, median, p75 and max, it is not computed over the raw unit level distribution. Either side is null when the project has no priced units or the comparator has no psf statistics.
GET /api/v1/communities
Every tracked community, one summary row each.
| Param | Type | Notes |
|---|---|---|
| city | string | Exact match, case insensitive. |
| q | string | Case insensitive substring match on the community name. |
| limit | integer | Default 100, maximum 500. |
| cursor | string | Opaque, from meta.next_cursor. |
curl -s "https://offplanindex.com/api/v1/communities?limit=2" \
-H "x-api-key: YOUR_KEY"{
"data": [
{
"name": "Dubai Islands",
"slug": "dubai-islands",
"city": "Dubai",
"n_projects": 183,
"n_units": 2309,
"psf_median": 2492,
"psf_p25": 2139,
"psf_p75": 2962,
"price_median": 3407000,
"starting_price_min": 1100000,
"lat": 25.298821698057125,
"lng": 55.30294552,
"rank_psf_dubai": 26,
"pre_handover_median": 50,
"n_developers": 86
},
{
"name": "Jumeirah Village Circle",
"slug": "jumeirah-village-circle",
"city": "Dubai",
"n_projects": 170,
"n_units": 2808,
"psf_median": 1654,
"psf_p25": 1462,
"psf_p75": 1950,
"price_median": 1308220,
"starting_price_min": 407000,
"lat": 25.057261108587365,
"lng": 55.20858446715988,
"rank_psf_dubai": 53,
"pre_handover_median": 60,
"n_developers": 141
}
],
"meta": {
"total": 230,
"limit": 2,
"cursor": "MA",
"next_cursor": "Mg",
"license": "Derived analytics only: aggregates and analysis computed by OffplanIndex from developer published project facts and publicly observed listings. Not a redistribution of any portal's database, and no image URLs are served. See /data-policy for the licence and /data to buy a key."
}
}GET /api/v1/communities/{slug}
One community's full aggregate: price and size distributions, bedroom and property type breakdowns, the delivery pipeline, payment plan norms and its own project list.
| Param | Type | Notes |
|---|---|---|
| slug | string, path | Community slug, as returned by /api/v1/communities. |
curl -s "https://offplanindex.com/api/v1/communities/business-bay" \
-H "x-api-key: YOUR_KEY"{
"name": "Business Bay",
"slug": "business-bay",
"kind": "community",
"city": "Dubai",
"lat": 25.184333054495546,
"lng": 55.27318136402,
"n_projects": 68,
"n_records": 134,
"n_delivered_projects": 66,
"n_priced_projects": 62,
"n_projects_with_units": 94,
"n_units": 1458,
"n_units_unit_level": 1287,
"n_projects_with_plans": 104,
"psf": {
"n": 1458,
"min": 474,
"p25": 2650,
"median": 3188,
"p75": 3664,
"max": 17223,
"mean": 3451
},
"psf_hist": {
"lo": 2110,
"hi": 7557,
"step": 226.98,
"counts": [
17,
171,
235,
164,
169,
171
]
},
"price": {
"n": 1458,
"min": 650000,
"p25": 2618250,
"median": 3612017,
"p75": 5672046,
"max": 175000000,
"mean": 7351024
},
"size": {
"n": 1458,
"min": 344,
"p25": 851,
"median": 1209,
"p75": 1866,
"max": 14632,
"mean": 1764
},
"starting_price": {
"n": 111,
"min": 650000,
"p25": 1255000,
"median": 2207000,
"p75": 3713914,
"max": 85000000,
"mean": 6707673
},
"by_bedroom": [
{
"bedrooms": "Studio",
"n": 63,
"psf": {
"n": 63,
"min": 1890,
"p25": 3062,
"median": 3531,
"p75": 3664,
"max": 6138,
"mean": 3477
},
"price": {
"n": 63,
"min": 650000,
"p25": 1460777,
"median": 1713777,
"p75": 1929277,
"max": 2750000,
"mean": 1693562
},
"size": {
"n": 63,
"min": 344,
"p25": 399,
"median": 485,
"p75": 542,
"max": 741,
"mean": 502
}
},
{
"bedrooms": "1 BR",
"n": 468,
"psf": {
"n": 468,
"min": 474,
"p25": 2549,
"median": 2864,
"p75": 3454,
"max": 4697,
"mean": 2978
},
"price": {
"n": 468,
"min": 1000000,
"p25": 2150000,
"median": 2544999,
"p75": 2778000,
"max": 4485634,
"mean": 2543350
},
"size": {
"n": 468,
"min": 608,
"p25": 772,
"median": 826,
"p75": 975,
"max": 2112,
"mean": 867
}
},
{
"bedrooms": "2 BR",
"n": 609,
"psf": {
"n": 609,
"min": 786,
"p25": 2714,
"median": 2969,
"p75": 3308,
"max": 10231,
"mean": 3156
},
"price": {
"n": 609,
"min": 1599999,
"p25": 3482000,
"median": 3760000,
"p75": 4700000,
"max": 31600000,
"mean": 4900664
},
"size": {
"n": 609,
"min": 818,
"p25": 1199,
"median": 1321,
"p75": 1481,
"max": 4544,
"mean": 1497
}
}
],
"by_type": [
{
"type": "apartment",
"n": 1364,
"psf_median": 3162,
"psf": {
"n": 1364,
"min": 474,
"p25": 2639,
"median": 3162,
"p75": 3564,
"max": 17223,
"mean": 3394
},
"price": {
"n": 1364,
"min": 650000,
"p25": 2583250,
"median": 3515000,
"p75": 4817170,
"max": 175000000,
"mean": 6308579
},
"size": {
"n": 1364,
"min": 344,
"p25": 835,
"median": 1199,
"p75": 1564,
"max": 12853,
"mean": 1573
}
},
{
"type": "duplex",
"n": 60,
"psf_median": 3850,
"psf": {
"n": 60,
"min": 923,
"p25": 2637,
"median": 3850,
"p75": 4271,
"max": 8399,
"mean": 3865
},
"price": {
"n": 60,
"min": 3403000,
"p25": 6627902,
"median": 10896031,
"p75": 23000000,
"max": 80012051,
"mean": 17606679
},
"size": {
"n": 60,
"min": 1713,
"p25": 2283,
"median": 3314,
"p75": 5389,
"max": 10280,
"mean": 3947
}
},
{
"type": "penthouse",
"n": 32,
"psf_median": 3680,
"psf": {
"n": 32,
"min": 2731,
"p25": 3166,
"median": 3680,
"p75": 5547,
"max": 16391,
"mean": 4850
},
"price": {
"n": 32,
"min": 3702000,
"p25": 17387016,
"median": 19283344,
"p75": 33782210,
"max": 165000000,
"mean": 30676061
},
"size": {
"n": 32,
"min": 1199,
"p25": 4090,
"median": 5286,
"p75": 6186,
"max": 14632,
"mean": 5689
}
}
],
"pipeline_year": [
{
"year": 2020,
"projects": 3
},
{
"year": 2021,
"projects": 2
},
{
"year": 2022,
"projects": 2
},
{
"year": 2023,
"projects": 15
}
],
"pipeline_quarter": [
{
"quarter": "Q1 2024",
"projects": 2
},
{
"quarter": "Q2 2024",
"projects": 4
},
{
"quarter": "Q3 2024",
"projects": 1
},
{
"quarter": "Q4 2024",
"projects": 9
}
],
"sale_status": {
"on_sale": 40,
"out_of_stock": 29,
"sold_out": 20,
"unknown": 20,
"booking_started": 12,
"available": 9,
"might_be_sold_out": 3,
"waiting_for_sales_start": 1
},
"construction_status": {
"completed": 57,
"under_construction": 55,
"unknown": 20,
"not_started": 2
},
"property_types": {
"apartment": 79,
"penthouse": 22,
"duplex": 17,
"villa": 3,
"townhouse": 2
},
"payment_plans": {
"n": 124,
"booking": {
"n": 124,
"min": 0,
"p25": 10,
"median": 20,
"p75": 32,
"max": 100,
"mean": 33
},
"construction": {
"n": 124,
"min": 0,
"p25": 0,
"median": 35,
"p75": 50,
"max": 80,
"mean": 30
},
"handover": {
"n": 124,
"min": 0,
"p25": 0,
"median": 30,
"p75": 50,
"max": 80,
"mean": 27
},
"post_handover": {
"n": 25,
"min": 10,
"p25": 32,
"median": 40,
"p75": 60,
"max": 90,
"mean": 48
},
"pre_handover": {
"n": 124,
"min": 10,
"p25": 40,
"median": 60,
"p75": 80,
"max": 100,
"mean": 63
},
"share_post_handover": 20,
"share_pre_handover_60_plus": 59,
"share_pre_handover_50_or_less": 40
},
"down_payment": {
"n": 66,
"min": 5,
"p25": 10,
"median": 10,
"p75": 20,
"max": 50,
"mean": 14
},
"cities": {
"Dubai": 134
},
"n_developers": 50,
"top_developers": [
{
"name": "DAMAC",
"slug": "damac",
"projects": 20
},
{
"name": "Select Group",
"slug": "select-group",
"projects": 15
},
{
"name": "Omniyat",
"slug": "omniyat",
"projects": 9
}
],
"projects": [
{
"id": "danube-properties-bayz-102",
"title": "Bayz 102",
"developer": "Danube",
"developer_slug": "danube",
"starting_price": 2525000,
"delivery_quarter": "Q4 2029",
"delivery_year": 2029,
"sale_status": "on_sale",
"construction_status": "under_construction",
"delivery_status": "off_plan",
"property_types": "apartment,penthouse",
"n_units": 299,
"psf_median": 2944,
"lat": 25.187670501380495,
"lng": 55.25988699826104,
"pre_handover_pct": 50,
"post_handover_pct": 50
},
{
"id": "danube-properties-bayz-101",
"title": "Bayz 101",
"developer": "Danube",
"developer_slug": "danube",
"starting_price": 1407000,
"delivery_quarter": "Q2 2029",
"delivery_year": 2029,
"sale_status": "on_sale",
"construction_status": "under_construction",
"delivery_status": "off_plan",
"property_types": "apartment",
"n_units": 146,
"psf_median": 3432,
"lat": 25.191826890074058,
"lng": 55.26334006786653,
"pre_handover_pct": 50,
"post_handover_pct": 50
}
],
"rank_psf_dubai": 12
}Trimmed for this page only: projects, by_bedroom, by_type, pipeline_year, pipeline_quarter, top_developers and psf_hist.counts are sliced short. The live response does not trim these.
GET /api/v1/developers
Every tracked developer, one summary row each.
| Param | Type | Notes |
|---|---|---|
| q | string | Case insensitive substring match on the developer name. |
| limit | integer | Default 100, maximum 500. |
| cursor | string | Opaque, from meta.next_cursor. |
curl -s "https://offplanindex.com/api/v1/developers?limit=2" \
-H "x-api-key: YOUR_KEY"{
"data": [
{
"name": "Emaar",
"slug": "emaar",
"n_projects": 240,
"n_units": 1712,
"psf_median": 2068,
"psf_p25": 1624,
"psf_p75": 2485,
"price_median": 3193388,
"starting_price_min": 660000,
"rank_psf": 68,
"rank_projects": 1,
"pre_handover_median": 80,
"n_communities": 28,
"top_communities": [
{
"name": "The Valley",
"slug": "the-valley",
"projects": 56
},
{
"name": "Dubai Creek Harbour",
"slug": "dubai-creek-harbour",
"projects": 54
},
{
"name": "Dubai Hills Estate",
"slug": "dubai-hills-estate",
"projects": 46
}
]
},
{
"name": "DAMAC",
"slug": "damac",
"n_projects": 174,
"n_units": 1812,
"psf_median": 1580,
"psf_p25": 1398,
"psf_p75": 1903,
"price_median": 2669000,
"starting_price_min": 535500,
"rank_psf": 128,
"rank_projects": 2,
"pre_handover_median": 75,
"n_communities": 23,
"top_communities": [
{
"name": "DAMAC Lagoons",
"slug": "damac-lagoons",
"projects": 45
},
{
"name": "Dubai Investments Park",
"slug": "dubai-investments-park",
"projects": 40
},
{
"name": "DAMAC Hills",
"slug": "damac-hills",
"projects": 37
}
]
}
],
"meta": {
"total": 676,
"limit": 2,
"cursor": "MA",
"next_cursor": "Mg",
"license": "Derived analytics only: aggregates and analysis computed by OffplanIndex from developer published project facts and publicly observed listings. Not a redistribution of any portal's database, and no image URLs are served. See /data-policy for the licence and /data to buy a key."
}
}GET /api/v1/developers/{slug}
One developer's full aggregate, the same shape as a community aggregate, plus its community footprint.
| Param | Type | Notes |
|---|---|---|
| slug | string, path | Developer slug, as returned by /api/v1/developers. |
curl -s "https://offplanindex.com/api/v1/developers/danube" \
-H "x-api-key: YOUR_KEY"{
"name": "Danube",
"slug": "danube",
"kind": "developer",
"n_projects": 22,
"n_records": 31,
"n_delivered_projects": 9,
"n_priced_projects": 21,
"n_projects_with_units": 29,
"n_units": 1370,
"n_units_unit_level": 1275,
"n_projects_with_plans": 29,
"psf": {
"n": 1370,
"min": 829,
"p25": 2175,
"median": 2549,
"p75": 3336,
"max": 5063,
"mean": 2703
},
"psf_hist": {
"lo": 1415,
"hi": 4627,
"step": 133.86,
"counts": [
60,
77,
61,
53,
20,
88
]
},
"price": {
"n": 1370,
"min": 650000,
"p25": 1487250,
"median": 2581500,
"p75": 3623250,
"max": 35270000,
"mean": 2773682
},
"size": {
"n": 1370,
"min": 351,
"p25": 601,
"median": 853,
"p75": 1218,
"max": 8643,
"mean": 1087
},
"starting_price": {
"n": 30,
"min": 399000,
"p25": 654131,
"median": 875000,
"p75": 1196500,
"max": 3670000,
"mean": 1058504
},
"by_bedroom": [
{
"bedrooms": "Studio",
"n": 203,
"psf": {
"n": 203,
"min": 829,
"p25": 2391,
"median": 2422,
"p75": 3752,
"max": 5063,
"mean": 3072
},
"price": {
"n": 203,
"min": 650000,
"p25": 949500,
"median": 1057000,
"p75": 1522000,
"max": 2264000,
"mean": 1284275
},
"size": {
"n": 203,
"min": 351,
"p25": 394,
"median": 411,
"p75": 439,
"max": 784,
"mean": 420
}
},
{
"bedrooms": "1 BR",
"n": 517,
"psf": {
"n": 517,
"min": 1051,
"p25": 2187,
"median": 2421,
"p75": 3436,
"max": 4666,
"mean": 2693
},
"price": {
"n": 517,
"min": 1002857,
"p25": 1423000,
"median": 1654000,
"p75": 2617000,
"max": 3531000,
"mean": 1922202
},
"size": {
"n": 517,
"min": 480,
"p25": 600,
"median": 749,
"p75": 793,
"max": 1099,
"mean": 713
}
},
{
"bedrooms": "2 BR",
"n": 431,
"psf": {
"n": 431,
"min": 1192,
"p25": 2577,
"median": 2858,
"p75": 3236,
"max": 4344,
"mean": 2861
},
"price": {
"n": 431,
"min": 1297461,
"p25": 3303000,
"median": 3514000,
"p75": 3791500,
"max": 5368000,
"mean": 3346934
},
"size": {
"n": 431,
"min": 848,
"p25": 1107,
"median": 1178,
"p75": 1236,
"max": 1536,
"mean": 1167
}
}
],
"by_type": [
{
"type": "apartment",
"n": 1265,
"psf_median": 2635,
"psf": {
"n": 1265,
"min": 829,
"p25": 2300,
"median": 2635,
"p75": 3417,
"max": 5063,
"mean": 2784
},
"price": {
"n": 1265,
"min": 650000,
"p25": 1465000,
"median": 2283000,
"p75": 3467000,
"max": 10635000,
"mean": 2505655
},
"size": {
"n": 1265,
"min": 351,
"p25": 596,
"median": 806,
"p75": 1199,
"max": 3700,
"mean": 907
}
},
{
"type": "townhouse",
"n": 64,
"psf_median": 1572,
"psf": {
"n": 64,
"min": 1440,
"p25": 1537,
"median": 1572,
"p75": 1588,
"max": 1634,
"mean": 1555
},
"price": {
"n": 64,
"min": 3670000,
"p25": 3810000,
"median": 4447000,
"p75": 4707000,
"max": 4923000,
"mean": 4358781
},
"size": {
"n": 64,
"min": 2400,
"p25": 2400,
"median": 2750,
"p75": 3100,
"max": 3100,
"mean": 2805
}
},
{
"type": "villa",
"n": 32,
"psf_median": 1588,
"psf": {
"n": 32,
"min": 1391,
"p25": 1522,
"median": 1588,
"p75": 1848,
"max": 1974,
"mean": 1645
},
"price": {
"n": 32,
"min": 4900000,
"p25": 5100000,
"median": 5614000,
"p75": 7300000,
"max": 7800000,
"mean": 5945594
},
"size": {
"n": 32,
"min": 3100,
"p25": 3100,
"median": 3700,
"p75": 3950,
"max": 3950,
"mean": 3602
}
}
],
"pipeline_year": [
{
"year": 2023,
"projects": 2
},
{
"year": 2024,
"projects": 3
},
{
"year": 2025,
"projects": 4
},
{
"year": 2026,
"projects": 5
}
],
"pipeline_quarter": [
{
"quarter": "Q1 2024",
"projects": 2
},
{
"quarter": "Q4 2024",
"projects": 1
},
{
"quarter": "Q2 2025",
"projects": 2
},
{
"quarter": "Q4 2025",
"projects": 2
}
],
"sale_status": {
"on_sale": 15,
"out_of_stock": 8,
"sold_out": 6,
"unknown": 1,
"available": 1
},
"construction_status": {
"under_construction": 20,
"completed": 9,
"unknown": 1,
"not_started": 1
},
"property_types": {
"apartment": 28,
"duplex": 5,
"penthouse": 2,
"townhouse": 2,
"villa": 1
},
"payment_plans": {
"n": 86,
"booking": {
"n": 86,
"min": 0,
"p25": 10,
"median": 20,
"p75": 50,
"max": 100,
"mean": 34
},
"construction": {
"n": 86,
"min": 0,
"p25": 12,
"median": 36,
"p75": 50,
"max": 65,
"mean": 31
},
"handover": {
"n": 86,
"min": 0,
"p25": 0,
"median": 16,
"p75": 30,
"max": 70,
"mean": 21
},
"post_handover": {
"n": 34,
"min": 5,
"p25": 30,
"median": 37,
"p75": 50,
"max": 70,
"mean": 38
},
"pre_handover": {
"n": 86,
"min": 30,
"p25": 52,
"median": 66,
"p75": 70,
"max": 100,
"mean": 64
},
"share_post_handover": 40,
"share_pre_handover_60_plus": 74,
"share_pre_handover_50_or_less": 26
},
"down_payment": {
"n": 25,
"min": 10,
"p25": 10,
"median": 10,
"p75": 10,
"max": 40,
"mean": 12
},
"cities": {
"Dubai": 31
},
"n_communities": 13,
"top_communities": [
{
"name": "Dubai Maritime City",
"slug": "dubai-maritime-city",
"projects": 5
},
{
"name": "Jumeirah Village Circle",
"slug": "jumeirah-village-circle",
"projects": 5
},
{
"name": "Dubai Silicon Oasis",
"slug": "dubai-silicon-oasis",
"projects": 3
}
],
"projects": [
{
"id": "danube-properties-serenz",
"title": "Serenz",
"community": "Jumeirah Village Circle",
"community_slug": "jumeirah-village-circle",
"city": "Dubai",
"starting_price": 903000,
"delivery_quarter": "Q4 2029",
"delivery_year": 2029,
"sale_status": "on_sale",
"construction_status": "under_construction",
"delivery_status": "off_plan",
"property_types": "apartment",
"n_units": 300,
"psf_median": 2389,
"pre_handover_pct": 50,
"post_handover_pct": 50
},
{
"id": "danube-properties-bayz-102",
"title": "Bayz 102",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": 2525000,
"delivery_quarter": "Q4 2029",
"delivery_year": 2029,
"sale_status": "on_sale",
"construction_status": "under_construction",
"delivery_status": "off_plan",
"property_types": "apartment,penthouse",
"n_units": 299,
"psf_median": 2944,
"pre_handover_pct": 50,
"post_handover_pct": 50
}
],
"rank_psf": 34,
"rank_projects": 22
}Trimmed the same way as the community sample above. The live response is not trimmed.
GET /api/v1/market
The two market wide aggregates, Dubai and the UAE, same shape as a community aggregate. The per project list is left out here on purpose, it is thousands of rows and duplicates /api/v1/projects, so pull that endpoint for individual projects.
curl -s "https://offplanindex.com/api/v1/market" \
-H "x-api-key: YOUR_KEY"{
"data": {
"dubai": {
"name": "Dubai",
"slug": "dubai",
"kind": "market",
"n_projects": 2337,
"n_records": 3223,
"n_delivered_projects": 886,
"n_priced_projects": 2102,
"n_projects_with_units": 2532,
"n_units": 42490,
"n_units_unit_level": 34894,
"n_projects_with_plans": 2539,
"psf": {
"n": 42490,
"min": 272,
"p25": 1608,
"median": 2021,
"p75": 2649,
"max": 18352,
"mean": 2257
},
"psf_hist": {
"lo": 1021,
"hi": 4870,
"step": 160.36,
"counts": [
1314,
2490,
3275,
4105,
4596,
3661
]
},
"price": {
"n": 42490,
"min": 375888,
"p25": 1249500,
"median": 1910000,
"p75": 3081230,
"max": 500000000,
"mean": 3210918
},
"size": {
"n": 42490,
"min": 260,
"p25": 686,
"median": 916,
"p75": 1420,
"max": 39004,
"mean": 1320
},
"starting_price": {
"n": 2827,
"min": 310000,
"p25": 848119,
"median": 1500000,
"p75": 2752000,
"max": 330000000,
"mean": 4547164
},
"by_bedroom": [
{
"bedrooms": "Studio",
"n": 7540,
"psf": {
"n": 7540,
"min": 510,
"p25": 1806,
"median": 2280,
"p75": 2554,
"max": 6138,
"mean": 2392
},
"price": {
"n": 7540,
"min": 375888,
"p25": 752000,
"median": 828000,
"p75": 1052000,
"max": 4025641,
"mean": 927573
},
"size": {
"n": 7540,
"min": 260,
"p25": 340,
"median": 375,
"p75": 408,
"max": 1204,
"mean": 393
}
},
{
"bedrooms": "1 BR",
"n": 15866,
"psf": {
"n": 15866,
"min": 279,
"p25": 1613,
"median": 1916,
"p75": 2690,
"max": 7420,
"mean": 2158
},
"price": {
"n": 15866,
"min": 400000,
"p25": 1230000,
"median": 1500000,
"p75": 2089894,
"max": 9337000,
"mean": 1704974
},
"size": {
"n": 15866,
"min": 313,
"p25": 697,
"median": 754,
"p75": 857,
"max": 3138,
"mean": 797
}
},
{
"bedrooms": "2 BR",
"n": 11413,
"psf": {
"n": 11413,
"min": 414,
"p25": 1539,
"median": 2027,
"p75": 2630,
"max": 11869,
"mean": 2196
},
"price": {
"n": 11413,
"min": 879323,
"p25": 1880000,
"median": 2529000,
"p75": 3412777,
"max": 31600000,
"mean": 2928842
},
"size": {
"n": 11413,
"min": 639,
"p25": 1105,
"median": 1237,
"p75": 1446,
"max": 5645,
"mean": 1317
}
}
],
"by_type": [
{
"type": "apartment",
"n": 38559,
"psf_median": 2084,
"psf": {
"n": 38559,
"min": 310,
"p25": 1644,
"median": 2084,
"p75": 2722,
"max": 17223,
"mean": 2287
},
"price": {
"n": 38559,
"min": 375888,
"p25": 1204988,
"median": 1725232,
"p75": 2640000,
"max": 175000000,
"mean": 2557130
},
"size": {
"n": 38559,
"min": 260,
"p25": 662,
"median": 835,
"p75": 1240,
"max": 25317,
"mean": 1029
}
},
{
"type": "townhouse",
"n": 1642,
"psf_median": 1351,
"psf": {
"n": 1642,
"min": 272,
"p25": 1108,
"median": 1351,
"p75": 1684,
"max": 12862,
"mean": 1481
},
"price": {
"n": 1642,
"min": 535516,
"p25": 2799860,
"median": 3643000,
"p75": 4340000,
"max": 68000000,
"mean": 3885348
},
"size": {
"n": 1642,
"min": 1250,
"p25": 2041,
"median": 2403,
"p75": 2906,
"max": 15000,
"mean": 2612
}
},
{
"type": "villa",
"n": 1603,
"psf_median": 1770,
"psf": {
"n": 1603,
"min": 538,
"p25": 1515,
"median": 1770,
"p75": 1990,
"max": 18352,
"mean": 1835
},
"price": {
"n": 1603,
"min": 2000000,
"p25": 4571000,
"median": 7289481,
"p75": 13435000,
"max": 500000000,
"mean": 11779165
},
"size": {
"n": 1603,
"min": 1679,
"p25": 3158,
"median": 4162,
"p75": 6774,
"max": 39004,
"mean": 5723
}
}
],
"pipeline_year": [
{
"year": 2020,
"projects": 26
},
{
"year": 2021,
"projects": 19
},
{
"year": 2022,
"projects": 34
},
{
"year": 2023,
"projects": 161
}
],
"pipeline_quarter": [
{
"quarter": "Q1 2024",
"projects": 50
},
{
"quarter": "Q2 2024",
"projects": 38
},
{
"quarter": "Q3 2024",
"projects": 39
},
{
"quarter": "Q4 2024",
"projects": 107
}
],
"sale_status": {
"on_sale": 805,
"out_of_stock": 733,
"sold_out": 546,
"unknown": 365,
"booking_started": 344,
"available": 258,
"might_be_sold_out": 72,
"waiting_for_sales_start": 72,
"presale": 24,
"start_of_sales": 2,
"announced": 2
},
"construction_status": {
"under_construction": 1988,
"completed": 816,
"unknown": 365,
"not_started": 54
},
"property_types": {
"apartment": 1840,
"villa": 367,
"townhouse": 306,
"duplex": 232,
"penthouse": 193,
"land": 3
},
"payment_plans": {
"n": 3315,
"booking": {
"n": 3315,
"min": 0,
"p25": 10,
"median": 20,
"p75": 20,
"max": 100,
"mean": 25
},
"construction": {
"n": 3315,
"min": 0,
"p25": 20,
"median": 40,
"p75": 50,
"max": 100,
"mean": 36
},
"handover": {
"n": 3315,
"min": 0,
"p25": 10,
"median": 30,
"p75": 50,
"max": 90,
"mean": 31
},
"post_handover": {
"n": 561,
"min": 5,
"p25": 30,
"median": 40,
"p75": 50,
"max": 90,
"mean": 42
},
"pre_handover": {
"n": 3315,
"min": 0,
"p25": 50,
"median": 60,
"p75": 80,
"max": 100,
"mean": 61
},
"share_post_handover": 17,
"share_pre_handover_60_plus": 57,
"share_pre_handover_50_or_less": 41
},
"down_payment": {
"n": 1855,
"min": 1,
"p25": 10,
"median": 10,
"p75": 20,
"max": 70,
"mean": 15
},
"cities": {
"Dubai": 3223
}
},
"uae": {
"name": "UAE",
"slug": "uae",
"kind": "market",
"n_projects": 2924,
"n_records": 4011,
"n_delivered_projects": 1087,
"n_priced_projects": 2626,
"n_projects_with_units": 3114,
"n_units": 52882,
"n_units_unit_level": 43771,
"n_projects_with_plans": 3135,
"psf": {
"n": 52882,
"min": 259,
"p25": 1548,
"median": 2008,
"p75": 2675,
"max": 24165,
"mean": 2200
},
"psf_hist": {
"lo": 695,
"hi": 4675,
"step": 165.83,
"counts": [
1152,
1291,
1723,
3491,
3785,
4829
]
},
"price": {
"n": 52882,
"min": 163665,
"p25": 1252999,
"median": 1915160,
"p75": 3156000,
"max": 500000000,
"mean": 3244700
},
"size": {
"n": 52882,
"min": 260,
"p25": 701,
"median": 992,
"p75": 1512,
"max": 39004,
"mean": 1390
},
"starting_price": {
"n": 3511,
"min": 163665,
"p25": 853246,
"median": 1535000,
"p75": 2800000,
"max": 330000000,
"mean": 4354426
},
"by_bedroom": [
{
"bedrooms": "Studio",
"n": 8104,
"psf": {
"n": 8104,
"min": 259,
"p25": 1812,
"median": 2290,
"p75": 2662,
"max": 6848,
"mean": 2406
},
"price": {
"n": 8104,
"min": 163665,
"p25": 756192,
"median": 835000,
"p75": 1283448,
"max": 8161512,
"mean": 958200
},
"size": {
"n": 8104,
"min": 260,
"p25": 341,
"median": 380,
"p75": 422,
"max": 1290,
"mean": 402
}
},
{
"bedrooms": "1 BR",
"n": 19139,
"psf": {
"n": 19139,
"min": 279,
"p25": 1549,
"median": 1888,
"p75": 2667,
"max": 7420,
"mean": 2092
},
"price": {
"n": 19139,
"min": 313245,
"p25": 1169999,
"median": 1459000,
"p75": 2078278,
"max": 12369821,
"mean": 1681919
},
"size": {
"n": 19139,
"min": 313,
"p25": 697,
"median": 771,
"p75": 899,
"max": 3138,
"mean": 824
}
},
{
"bedrooms": "2 BR",
"n": 15722,
"psf": {
"n": 15722,
"min": 292,
"p25": 1459,
"median": 2014,
"p75": 2690,
"max": 11869,
"mean": 2131
},
"price": {
"n": 15722,
"min": 551561,
"p25": 1730000,
"median": 2437416,
"p75": 3331000,
"max": 31600000,
"mean": 2822493
},
"size": {
"n": 15722,
"min": 639,
"p25": 1083,
"median": 1245,
"p75": 1490,
"max": 5903,
"mean": 1334
}
}
],
"by_type": [
{
"type": "apartment",
"n": 47448,
"psf_median": 2047,
"psf": {
"n": 47448,
"min": 259,
"p25": 1580,
"median": 2047,
"p75": 2718,
"max": 17223,
"mean": 2217
},
"price": {
"n": 47448,
"min": 163665,
"p25": 1200000,
"median": 1721996,
"p75": 2655000,
"max": 175000000,
"mean": 2512676
},
"size": {
"n": 47448,
"min": 260,
"p25": 684,
"median": 894,
"p75": 1285,
"max": 25317,
"mean": 1076
}
},
{
"type": "villa",
"n": 2210,
"psf_median": 1774,
"psf": {
"n": 2210,
"min": 461,
"p25": 1427,
"median": 1774,
"p75": 2099,
"max": 24165,
"mean": 1949
},
"price": {
"n": 2210,
"min": 2000000,
"p25": 4811250,
"median": 7807400,
"p75": 13795710,
"max": 500000000,
"mean": 12420362
},
"size": {
"n": 2210,
"min": 1679,
"p25": 3275,
"median": 4406,
"p75": 6670,
"max": 39004,
"mean": 5740
}
},
{
"type": "townhouse",
"n": 1936,
"psf_median": 1320,
"psf": {
"n": 1936,
"min": 272,
"p25": 1110,
"median": 1320,
"p75": 1745,
"max": 12862,
"mean": 1553
},
"price": {
"n": 1936,
"min": 535516,
"p25": 2800000,
"median": 3664500,
"p75": 4387213,
"max": 68000000,
"mean": 4123655
},
"size": {
"n": 1936,
"min": 1250,
"p25": 2117,
"median": 2418,
"p75": 3014,
"max": 15000,
"mean": 2657
}
}
],
"pipeline_year": [
{
"year": 2020,
"projects": 27
},
{
"year": 2021,
"projects": 21
},
{
"year": 2022,
"projects": 42
},
{
"year": 2023,
"projects": 185
}
],
"pipeline_quarter": [
{
"quarter": "Q1 2024",
"projects": 60
},
{
"quarter": "Q2 2024",
"projects": 50
},
{
"quarter": "Q3 2024",
"projects": 48
},
{
"quarter": "Q4 2024",
"projects": 136
}
],
"sale_status": {
"on_sale": 1014,
"out_of_stock": 871,
"sold_out": 628,
"unknown": 496,
"available": 376,
"booking_started": 364,
"might_be_sold_out": 152,
"waiting_for_sales_start": 73,
"presale": 32,
"announced": 3,
"start_of_sales": 2
},
"construction_status": {
"under_construction": 2456,
"completed": 976,
"unknown": 496,
"not_started": 83
},
"property_types": {
"apartment": 2230,
"villa": 500,
"townhouse": 404,
"duplex": 304,
"penthouse": 257,
"land": 3
},
"payment_plans": {
"n": 4146,
"booking": {
"n": 4146,
"min": 0,
"p25": 10,
"median": 20,
"p75": 20,
"max": 100,
"mean": 24
},
"construction": {
"n": 4146,
"min": 0,
"p25": 20,
"median": 40,
"p75": 50,
"max": 100,
"mean": 36
},
"handover": {
"n": 4146,
"min": 0,
"p25": 10,
"median": 35,
"p75": 50,
"max": 90,
"mean": 33
},
"post_handover": {
"n": 674,
"min": 5,
"p25": 30,
"median": 40,
"p75": 50,
"max": 95,
"mean": 43
},
"pre_handover": {
"n": 4146,
"min": 0,
"p25": 44,
"median": 60,
"p75": 75,
"max": 100,
"mean": 60
},
"share_post_handover": 16,
"share_pre_handover_60_plus": 54,
"share_pre_handover_50_or_less": 44
},
"down_payment": {
"n": 2275,
"min": 1,
"p25": 10,
"median": 10,
"p75": 20,
"max": 70,
"mean": 14
},
"cities": {
"Dubai": 3223,
"Abu Dhabi": 353,
"Sharjah": 195,
"Ras Al Khaimah": 153,
"Ajman": 53,
"Umm Al Quwain": 30,
"Al Ain": 2,
"Fujairah": 2
}
}
},
"meta": {
"note": "Each group's per project list is omitted here, use /api/v1/projects to list individual projects."
}
}Same trimming as the community and developer samples above, applied only for display on this page.
GET /api/v1/sync
The delta endpoint for downstream consumers, see freshness above for how to use content_hash to diff.
| Param | Type | Notes |
|---|---|---|
| since | ISO date, optional | Accepted for forward compatibility. Does not filter yet, every call returns the full paginated set. |
| limit | integer | Default 50, maximum 500. |
| cursor | string | Opaque, from meta.next_cursor. |
curl -s "https://offplanindex.com/api/v1/sync?limit=2" \
-H "x-api-key: YOUR_KEY"{
"data": [
{
"id": "10-j-one-tower-a",
"title": "J One Tower A",
"developer": "Durar",
"developer_slug": "durar",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": null,
"delivery_quarter": "Q4 2021",
"delivery_year": 2021,
"sale_status": "out_of_stock",
"construction_status": "completed",
"property_types": null,
"bedrooms": null,
"n_units": 0,
"n_plans": 0,
"lat": 25.186162564692015,
"lng": 55.28328666778401,
"content_hash": "a4a407aeb5e1caa6"
},
{
"id": "1003-sol-bay",
"title": "SOL Bay",
"developer": "Sol Properties",
"developer_slug": "sol-properties",
"community": "Business Bay",
"community_slug": "business-bay",
"city": "Dubai",
"starting_price": 2040000,
"delivery_quarter": "Q4 2020",
"delivery_year": 2020,
"sale_status": "on_sale",
"construction_status": "completed",
"property_types": null,
"bedrooms": "1",
"n_units": 9,
"n_plans": 1,
"lat": 25.18034209709853,
"lng": 55.273135884655545,
"content_hash": "48cd1b58ed0f42e4"
}
],
"meta": {
"total": 4011,
"limit": 2,
"cursor": "MA",
"next_cursor": "Mg",
"build_date": "2026-09-02",
"corpus_date": "2026-07-30",
"merge_date": "2026-08-18",
"since_requested": null,
"freshness": "The corpus has no per record timestamp: a project cannot tell you when it last changed, only that it is part of this build. Version the whole corpus by meta.corpus_date (newest source read) and meta.build_date (when this bundle was generated), and diff content_hash per id against your own last sync to find what changed. The since param is accepted for forward compatibility but does not filter yet, every call walks the full set.",
"license": "Derived analytics only: aggregates and analysis computed by OffplanIndex from developer published project facts and publicly observed listings. Not a redistribution of any portal's database, and no image URLs are served. See /data-policy for the licence and /data to buy a key."
}
}GET /api/v1/meta
Corpus counts and build date. No x-api-key required, safe for a health check.
curl -s "https://offplanindex.com/api/v1/meta"{
"data": {
"build_date": "2026-09-02",
"corpus_date": "2026-07-30",
"merge_date": "2026-08-18",
"data_month": "July 2026",
"corpus_date_long": "30 July 2026",
"merge_date_long": "18 August 2026",
"build_date_long": "2 September 2026",
"n_projects": 2924,
"n_records": 4011,
"n_delivered_projects": 1087,
"n_delayed_projects": 169,
"n_priced_projects": 2626,
"n_unpriced_projects": 298,
"n_units_raw": 68875,
"n_units_valid": 59806,
"n_units_benchmark": 52882,
"n_units_size_flagged": 36,
"n_units_unit_level": 43771,
"n_projects_with_units": 2332,
"n_projects_without_units": 592,
"n_projects_with_plans": 2270,
"n_communities": 230,
"n_developers": 676,
"n_dubai_projects": 2337,
"n_with_coords": 2552,
"n_without_coords": 372,
"n_with_community": 2914,
"n_duplicates_merged": 96,
"n_developer_variants_merged": 91,
"latest_scrape": "2026-07-30",
"n_from_watcher": 20,
"n_offplan_from_watcher": 20,
"watcher_date": "2026-09-01",
"watcher_date_long": "1 September 2026"
},
"meta": {
"note": "Unkeyed health check endpoint. No x-api-key required.",
"freshness": "Sources read to 2026-07-30, corpus merged 2026-08-18, bundle built 2026-09-02.",
"counts": "n_projects is the off-plan count. n_delivered_projects have already handed over and are excluded from it and from every price benchmark; n_records is the two together."
}
}Derived analytics only: aggregates and analysis computed by OffplanIndex from developer published project facts and publicly observed listings. Not a redistribution of any portal's database, and no image URLs are served. See /data-policy for the licence and /data to buy a key. Not investment advice. Questions go to hello@offplanindex.com.