Getting started
The Dubai Property Leads API is a REST API for UAE off-plan real estate: projects with media and payment plans, live unit availability with prices and floor plans, developers, emirates and districts. Responses are JSON, timestamps are ISO 8601 in UTC, and prices are in AED.
All seven emirates are covered, alongside a growing set of projects outside the UAE. Every image, floor plan and brochure link is served from our own domain, so you can show it in your product as is.
Endpoints at a glance
/v1/projectsSearch and filter the catalogueGET/v1/projects/{id}Full record with units and mediaGET/v1/projects/{id}/unitsLive units, filtered and sortedGET/v1/developersProfiles, logos and overviewsGET/v1/regionsCountries and emirates with countsGET/v1/districtsAreas with price-per-sqft metricsGET/v1/analytics/trendsMarket pulse and price trendshttps://api.dubaipropertyleads.ae- 1
Get a key
Start free on RapidAPI (Basic plan), or subscribe directly for a production key and an SLA. Enterprise Direct adds the right to store the data.
- 2
Make your first call
Send the key in the
X-API-Keyheader. The request on the right lists projects on sale in Dubai. - 3
Go deeper
Take an
idfrom the list and call/v1/projects/{id}for the full record: payment plan, floor plans, documents and live units.
curl -G "https://api.dubaipropertyleads.ae/v1/projects" \
-d region=Dubai \
-d status=on_sale \
-H "X-API-Key: $API_KEY"
Every request needs your API key in the X-API-Key header. Direct keys start with sk_live_ and are emailed to your technical contact when your subscription starts.
Using RapidAPI? Call the API through RapidAPI with your RapidAPI key; the playground on RapidAPI shows the exact URL and headers for your account.
Keep your key secret
X-API-Key: sk_live_YOUR_KEYProjects and developers return at most 10 results per request. Move through them with page; every response includes total and max_pages. The full catalogue of 2,963 projects is 297 pages, so filter by region, developer or status to fetch only what you need.
Units return up to 100 per request and districts 10, both paged with limit and offset.
Loading the whole catalogue
sort=project_id&order=asc. Projects added while you page then land at the end instead of shifting the pages you have not read yet. After the first load, sync only what changed.curl -G "https://api.dubaipropertyleads.ae/v1/projects" \
-d sort=project_id \
-d order=asc \
-d page=2 \
-H "X-API-Key: $API_KEY"
Limits are set per key by your plan.
Business Direct
300 requests / minute
25,000 requests / month
Enterprise Direct
500 requests / minute
100,000 requests / month
RapidAPI
Per your plan
Set by RapidAPI
Going over the per-minute limit returns 429 with a Retry-After header (seconds to wait) and X-RateLimit-Limit. Images and documents do not count towards your limits.
{
"error": "Rate limit exceeded: 300 per 1 minute"
}Errors use standard HTTP status codes. The body is JSON with a detail message (error for rate limits).
Bad request
e.g. a webhook URL that is not public HTTPS.
Not allowed
Missing, invalid or revoked key, or an expired subscription.
Not found
No project with that ID.
Invalid parameter
A value is out of range, e.g. limit above the maximum.
Rate limited
Wait for Retry-After seconds, then retry.
Server error
Retry with backoff; contact support if it persists.
{
"detail": "Invalid API Key"
}Every 6 hours
Project information: details, media, prices, payment plans.
Daily
Unit availability: units that sold or were reserved drop out.
Only records whose content changed are rewritten, and each one carries updated_at. When a project has nothing left to sell, its status moves to out_of_stock and its availability_summary updates with it.
Recommended sync
/v1/projects?sort=updated_at&order=desc and stop paging when you reach records older than your last sync. Re-fetch the detail only for those projects; a webhook tells you about new projects as they arrive.Images, floor plans, master plans and PDF brochures come as links on api.dubaipropertyleads.ae. They are public (no key needed), so you can use them directly in <img> tags and download links.
Links are long-lived and cached for a year, so browsers and CDNs serve repeat views without calling us. Loading media does not count towards your request limits.
https://api.dubaipropertyleads.ae/v1/proxy/image?token=v1.…Endpoints
/v1/projectsReturns a paginated list of projects. Combine any of the filters below.
Query parameters
pageinteger · default 1- Page number.
limitinteger · default 10, max 10- Results per page.
project_namestring- Search by project name; tolerant of typos.
developerstring- Developer name, e.g. Emaar.
districtstring- District name, e.g. Business Bay.
statusstring- Sales status; values below.
countrystring- ISO code or name, e.g.
AE. regionstring- Emirate or province, e.g.
Dubai,Abu Dhabi. See Regions. sortstring · default project_idproject_id,updated_atorcreated_at.orderstring · default descdescorasc.
Sales status values
on_sale- The developer is selling units now; live units are listed.
start_of_sales- Sales are opening; inventory is being released.
presale- Pre-launch stage, before general sales.
announced- Announced by the developer; sales have not started.
out_of_stock- No unsold units left to sell directly: primary inventory is sold out. Common on projects handing over years from now; resale units may still exist.
curl -G "https://api.dubaipropertyleads.ae/v1/projects" \
-d country=AE \
-d region=Dubai \
-d status=on_sale \
-H "X-API-Key: $API_KEY"
/v1/projects/{id}The full project record: identity, developer, location, pricing and payment plan, timeline, Dubai Land Department registration, media and documents, an availability summary and the live units.
Path parameter
idstringrequired- Project ID from List projects.
Key fields
idstring- Project ID. Use it with /v1/projects/{id} and /units.
namestring- Project name as marketed by the developer.
status, sale_statusstring- Sales status (see List projects for values).
country, regionstring- Country and emirate or province, e.g. United Arab Emirates, Dubai.
locationobject- lat, lng and district_name, ready for maps.
developerobject- developer_id, name, logo and overview.
priceobject- Starting price: from (number) and currency (AED).
payment_planarray- Payment plan stages, each with name, description, percentage and stage_type (on_booking, during_construction, on_handover…).
completion_date, handover_yearstring- Expected completion as published by the developer.
service_chargestring- Annual service charge, e.g. "18 AED/sqft".
dld_registrationobject- Dubai Land Department registry: project_number, status, escrow_bank, registered_units, registration_start_date.
cover_image, imagesurl, url[]- Gallery images on our domain.
floor_plansarray- One entry per layout: name and image url. A unit's layout_name matches a floor plan's name.
master_plan_image, brochure_urlurl- Master plan image and brochure PDF, when the developer has published them.
documentsarray- Every PDF for the project: name, type (brochure, floor_plan…) and url.
availability_summaryobject- available_total, declared_total, sold_or_reserved_percent, and a by_bedroom breakdown with price and size ranges.
unitsarray- Live available units: name (unit code), bedrooms, size_sqft, floor, price_aed, price_per_sqft_aed, layout_name.
updated_attimestamp- When this record last changed. Use it to sync only what changed.
Fields the developer has not published yet are null or empty arrays.
curl "https://api.dubaipropertyleads.ae/v1/projects/3301" \
-H "X-API-Key: $API_KEY"
/v1/projects/{id}/unitsLive available units for one project, with filters and sorting. The response also lists available_values (bedrooms, unit types, floors) so you can build filters without guessing.
Query parameters
limitinteger · default 20, max 100- Units per request.
offsetinteger · default 0- Units to skip.
bedroomsinteger- Exact bedroom count; 0 is a studio.
unit_typestring- e.g.
apartments,retail,villa. min_price / max_priceinteger · AED- Price range.
min_size / max_sizenumber · sqft- Size range.
floorinteger- Exact floor.
layout_idinteger- Units of one floor-plan type.
sortstringprice_asc,price_desc,size_asc,size_desc,floor_asc,floor_desc.
curl -G "https://api.dubaipropertyleads.ae/v1/projects/3301/units" \
-d bedrooms=2 \
-d sort=price_asc \
-H "X-API-Key: $API_KEY"
/v1/developersDeveloper profiles with logo and overview, ready for a developers page or a filter.
Query parameters
pageinteger · default 1- Page number.
limitinteger · default 10, max 10- Results per page.
developer_namestring- Partial name match, e.g. binghatti.
sortstring · default namenameorupdated_at.orderstring · default ascascordesc.
curl -G "https://api.dubaipropertyleads.ae/v1/developers" \
-d developer_name=binghatti \
-H "X-API-Key: $API_KEY"
{
"total": 2,
"page": 1,
"limit": 1,
"max_pages": 2,
"items": [
{
"developer_id": "80",
"name": "Binghatti",
"logo": {
"url": "https://api.dubaipropertyleads.ae/v1/proxy/image?token=v1.…",
"conversions": null
},
"overview": "Binghatti is a visionary real estate developer renowned for its commitment to iconic architecture and innovative design. From its incepti…",
"created_at": "2026-10-20T15:53:25.949728Z",
"updated_at": "2026-10-21T17:36:27.109866Z"
}
]
}/v1/districtsAreas and sub-communities with a description and, where available, average price per square foot overall and by bedroom type.
Query parameters
limitinteger · default 10, max 10- Results per page.
offsetinteger · default 0- Results to skip.
curl -G "https://api.dubaipropertyleads.ae/v1/districts" \
-d limit=10 \
-d offset=0 \
-H "X-API-Key: $API_KEY"
{
"total": 368,
"limit": 1,
"offset": 0,
"items": [
{
"id": 81,
"name": "Business Bay",
"description": "Business Bay is a commercial, residential and business hub straddling the Dubai Water Canal.\n The most popular and most famous attraction…",
"metrics": {
"avgPricePerSquare": 3538.41,
"avgPricePerSquareFor1BR": 2736.94,
"avgPricePerSquareFor2BR": 3069.76,
"avgPricePerSquareForStudio": 2835.2
}
}
]
}/v1/analytics/trendsA market snapshot computed from the live catalogue: the market pulse (total, active and sold-out projects, new launches and projects added this month), average and median starting prices by district, and the most active developers. Filter by country or emirate.
Query parameters
countrystring- ISO code or name, e.g.
AE. regionstring- Emirate or province, e.g.
Dubai. See Regions.
curl -G "https://api.dubaipropertyleads.ae/v1/analytics/trends" \
-d region=Dubai \
-H "X-API-Key: $API_KEY"
Webhooks
Register an HTTPS URL and we POST to it when an event happens, so new projects reach your system without waiting for your next sync.
Catalogue sync
New project found
Signed POST
X-Estate-Signature
Your server
Responds 2xx
Events
project.created- New projects enter the catalogue. Sent after each sync, with one item per new project.
Each request carries X-Estate-Event (the event name) and X-Estate-Signature. Fetch the full record from the url in each item.
Delivery
{
"event": "project.created",
"timestamp": 1792760400.52,
"data": [
{
"id": "7312",
"name": "Example Residences",
"developer": "Example Developer",
"country_code": "AE",
"region": "Dubai",
"sale_status": "presale",
"data_completeness": "full",
"url": "https://api.dubaipropertyleads.ae/v1/projects/7312"
}
]
}/v1/webhooksCreates a subscription. The URL must be public HTTPS. The response includes a secret used to sign every delivery; store it securely (List webhooks also returns it).
Body (JSON)
urlstringrequired- Your HTTPS endpoint.
eventsstring[] · default ["project.created"]- Events to receive.
Also available
/v1/webhooksLists the webhooks on your key.
/v1/webhooks/{id}Deletes a webhook.
curl -X POST "https://api.dubaipropertyleads.ae/v1/webhooks" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/dpl","events":["project.created"]}'
{
"id": "3f6c2a9e-…",
"url": "https://example.com/hooks/dpl",
"events": ["project.created"],
"secret": "9b1f…",
"created_at": "2026-10-23T10:15:02Z"
}X-Estate-Signature is the hex HMAC-SHA256 of the raw request body, keyed with your webhook secret. Compute it on your side and compare in constant time before trusting the payload.
Use the raw body
import crypto from "node:crypto";
// rawBody: the request body exactly as received (string), before JSON.parse
function isValidSignature(rawBody, signature, secret) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
if (!signature || signature.length !== expected.length) return false;
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
// isValidSignature(rawBody, req.headers["x-estate-signature"], process.env.WEBHOOK_SECRET)import hashlib
import hmac
# raw_body: the request body exactly as received (bytes), before parsing
def is_valid_signature(raw_body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature or "")
# is_valid_signature(request.body, request.headers["X-Estate-Signature"], WEBHOOK_SECRET)Resources
23 Oct 2026
- Documentation rebuilt: quick start, rate limits, errors, webhooks and a field reference for project records.
20 Oct 2026
- Project records add brochure_url, documents[], master_plan_image and videos[].
- Developer details on project records.
18 Oct 2026
- Per-unit inventory on project records: units[], availability_summary, DLD registration and escrow data.
- New endpoint: /v1/projects/{id}/units with filters and sorting.
17 Oct 2026
- Media links now use encrypted tokens on api.dubaipropertyleads.ae.
Make your first call today.
Start free on RapidAPI, or subscribe directly for production limits and an SLA. Enterprise Direct adds the right to store the data.