Skip to content

Dubai Real Estate Transaction Data: How to Access DLD Sales & Rent Records via API

BayutAPI Team ·

Dubai real estate transaction data is the record of what properties actually sold or rented for — the registered price, the size, the date, the area, and the property type. Unlike listing prices (what sellers ask), transaction data tells you what buyers and tenants paid. It is the foundation of every serious valuation model, investment dashboard, and market report in the UAE.

The depth here is real. Across 4,217,848 registered rental (Ejari) contracts — the dataset stretches back to 1997 — the citywide median is AED 58,000/year at roughly AED 80/sqft/year of registered annual rent. In a single rolling 12-month window (2025-05-16 to 2026-05-16) that figure is built from 599,685 registered contracts. These are not estimates or asking prices: they are the registered records the API serves as clean JSON.

This guide explains where Dubai transaction data comes from, why the official sources are painful to work with, and how to pull historical sales and rental transactions — filtered by location and property type — with a single API call.

What Counts as Transaction Data in Dubai?

When people search for “Dubai property transaction data,” they are usually after one of four registered record types, all of which originate with the Dubai Land Department:

  • Sale registrations — completed transfers of ownership, with the registered price, unit size, and date.
  • Ejari rental contracts — registered tenancy agreements, with the annual rent and lease duration. (See Ejari.)
  • Oqood records — interim registrations for off-plan purchases that have not yet been handed over. (See Oqood.)
  • Mortgage registrations — financing secured against a Dubai property.

For market analysis, the two that matter most are sale transactions and rental transactions. Together they let you measure real prices per square foot, gross rental yields, transaction volumes, and how all of those change over time.

Where Dubai Transaction Data Comes From: the DLD

Every property sale and registered tenancy in Dubai passes through the Dubai Land Department (DLD) — the government authority that organizes and registers all real estate transactions in the emirate. The DLD oversees RERA, runs the Ejari system for tenancy contracts, and publishes transaction records as open data.

Because the DLD is the system of record, its data is the ground truth. If you want to know what a 2-bedroom apartment in Jumeirah Lake Towers really sold for last quarter, the answer ultimately traces back to a DLD registration. We cover the department itself in depth in Dubai Land Department (DLD) Data: What It Is and How to Access It.

The data chain matters, so it is worth stating plainly: the DLD registers every sale and tenancy; Bayut aggregates those registered records and surfaces them on its platform; and BayutAPI serves them as query-ready JSON. BayutAPI does not connect directly to a DLD API — it delivers the same DLD-registered transaction records Bayut surfaces, in a developer-friendly shape.

The Hard Way: Official DLD and Dubai Pulse Access

The DLD does publish transaction data through official channels — Dubai Pulse (the emirate’s open-data platform), the DLD API Gateway, and the Dubai REST app. The problem is that none of them is friendly to a developer who just wants clean JSON.

In practice, building on the raw official sources means dealing with:

  • A business account requirement. The DLD API Gateway expects you to be a registered, active entity (for example, in the Oqood system). This is not built for an individual developer prototyping an idea.
  • OAuth token juggling. You request an access token from an OAuth endpoint using a client ID and secret, and that token expires — often within about 30 minutes — so you have to refresh it constantly.
  • Bulk CSV dumps. The open-data transaction file is a large, regularly-updated CSV containing the full history. You download it, parse it, normalize Arabic and English area names yourself, and rebuild it on every update.
  • No application-ready shape. Field names, location naming, and category encodings are built for regulatory completeness, not for a property search box or an analytics chart.

For a one-off academic analysis, the raw Dubai Pulse CSV is fine. For a product that needs fresh, filterable, query-ready data, it is a lot of plumbing before you write a single line of real feature code.

The Fast Way: One API Call

BayutAPI exposes Dubai transaction data through a single REST endpoint — the transactions endpoint — that returns clean JSON, with filtering by area, property type, price, size, and time period built in. No business account, no OAuth refresh loop, no CSV parsing.

Here is the simplest possible request — the most recent sale transactions:

curl --request GET \
  --url 'https://uae-real-estate3.p.rapidapi.com/transactions?purpose=for-sale&page=1' \
  --header 'x-rapidapi-host: uae-real-estate3.p.rapidapi.com' \
  --header 'x-rapidapi-key: YOUR_API_KEY'

In Python:

import requests

url = "https://uae-real-estate3.p.rapidapi.com/transactions"
headers = {
    "x-rapidapi-host": "uae-real-estate3.p.rapidapi.com",
    "x-rapidapi-key": "YOUR_API_KEY"
}
params = {
    "purpose": "for-sale",   # or "for-rent"
    "time_period": "12m",     # 1m, 3m, 6m, 12m (default), 24m
    "page": "1"
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
print(f"{data['data']['nbHits']:,} transactions across {data['data']['nbPages']} pages")

Or in JavaScript:

const url = 'https://uae-real-estate3.p.rapidapi.com/transactions?purpose=for-sale&time_period=12m&page=1';

const response = await fetch(url, {
  headers: {
    'x-rapidapi-host': 'uae-real-estate3.p.rapidapi.com',
    'x-rapidapi-key': 'YOUR_API_KEY'
  }
});

const { data } = await response.json();
console.log(`${data.nbHits.toLocaleString()} transactions`);

Understanding the Response

The transactions endpoint is the one BayutAPI endpoint that returns its results under a hits key (most other endpoints use properties, agents, or agencies). A response looks like this:

{
  "success": true,
  "data": {
    "hits": [
      {
        "transactionId": "TX-12345",
        "purpose": "for-sale",
        "price": 1500000,
        "area": 1200,
        "location": "Jumeirah Lake Towers",
        "category": "apartments",
        "rooms": 2,
        "completionStatus": "completed",
        "date": "2026-04-15"
      }
    ],
    "nbHits": 4500,
    "page": 1,
    "nbPages": 225
  }
}

Each transaction in hits gives you the registered price (in AED), the area (in square feet), the location, the property category, the number of rooms, the completionStatus, and the date. That is everything you need to compute price per square foot, group by area, and build a time series. Pagination returns 20 records per page; nbHits is the total match count and nbPages is how many pages exist.

Filtering Transactions by Area and Property Type

Most real questions are specific: transactions for apartments in a particular community, for sale, over the last year. The transactions endpoint supports exactly that.

To filter by area, you first need the location’s external ID. Look it up once with the autocomplete endpoint:

curl --request GET \
  --url 'https://uae-real-estate3.p.rapidapi.com/autocomplete?query=jumeirah%20lake%20towers' \
  --header 'x-rapidapi-host: uae-real-estate3.p.rapidapi.com' \
  --header 'x-rapidapi-key: YOUR_API_KEY'

Then pass that ID to location_ids and combine it with the other filters:

params = {
    "purpose": "for-sale",
    "location_ids": "8143",        # from autocomplete (example value)
    "category_ids": "apartments",   # residential, commercial, apartments, villas, townhouses
    "beds": "2",                    # comma-separated; "0" for studio
    "time_period": "12m",
    "sort_by": "date_desc",         # date_asc, price_desc, price_asc, area_desc, area_asc
    "page": "1"
}

The key parameters are:

ParameterWhat it doesExample
purposeSale vs rental transactions (required)for-sale, for-rent
location_idsOne or more area IDs from autocomplete8143
category_idsProperty type or categoryapartments, villas, townhouses
bedsBedroom count; 0 for studio1,2,3
price_min / price_maxPrice band in AED500000
area_min / area_maxSize band in square feet800
time_periodLook-back window1m, 3m, 6m, 12m, 24m
sort_byResult orderingdate_desc, price_asc

With those filters you can answer questions like “what did 2-bed apartments in JLT sell for over the last 12 months” directly. We work through that exact example, with real market context, in JLT Property Transaction Data — the first of a series of area-level deep dives.

Turning Transactions into Insights

Raw transactions become useful the moment you aggregate them. The most common first metric is median price per square foot, which is far more robust than an average in a market that mixes studios and penthouses:

from statistics import median

def price_per_sqft(location_id: str, category: str = "apartments") -> dict:
    """Median price per square foot from recent sale transactions."""
    ppsf = []
    page = 1
    while page <= 10:  # sample up to 10 pages (200 transactions)
        resp = requests.get(url, headers=headers, params={
            "purpose": "for-sale",
            "location_ids": location_id,
            "category_ids": category,
            "time_period": "12m",
            "page": str(page),
        })
        hits = resp.json().get("data", {}).get("hits", [])
        if not hits:
            break
        for tx in hits:
            if tx.get("price") and tx.get("area"):
                ppsf.append(tx["price"] / tx["area"])
        page += 1

    if not ppsf:
        return {"count": 0}
    return {
        "count": len(ppsf),
        "median_ppsf": round(median(ppsf)),
        "low": round(min(ppsf)),
        "high": round(max(ppsf)),
    }

From there, the same data drives:

  • Gross rental yield — pull for-sale and for-rent transactions for the same area and property type, then divide median annual rent by median sale price. (See rental yield and our walkthrough on analyzing UAE rental yields.)
  • Comparables (comps) — the closest recent transactions to a subject property, filtered by area, beds, and size band — the backbone of any property valuation tool.
  • Trend lines — run the same query at time_period=3m, 6m, 12m, 24m to see how prices and volumes are moving.

The benchmarks that fall out of this are concrete. On the registered rental side, the citywide median is AED 58,000/year, but the spread by bedroom is wide: a studio registers around AED 36,465/year, a 1-bed AED 54,450/year, a 2-bed AED 85,000/year, a 3-bed AED 135,000/year, and 4-bed-and-larger homes AED 235,000/year. By type, apartments sit at a AED 60,000/year median against AED 180,000/year for villas. We break every one of these figures down — by area, bedroom, and property type — in the Dubai Rental Market Report 2026, our flagship study built entirely on these registered Ejari records.

For a deeper treatment of building market analytics on this data, see Understanding Dubai’s Property Market Through Data.

Sale vs Rent Transaction Data

The single most important parameter is purpose. Set it to for-sale for ownership transfers and for-rent for registered tenancy (Ejari) contracts. The two datasets answer different questions:

  • for-sale powers capital values, price-per-sqft trends, and appreciation analysis.
  • for-rent powers achievable rents, occupancy proxies, and the rent side of any yield calculation.

Because the data is registered rather than advertised, both reflect what was actually agreed — not what an agent hoped to get.

Who Uses Dubai Transaction Data?

  • Proptech and investment platforms building dashboards, AVMs, and screeners — see investment analysis and market research dashboards.
  • Agents and agencies pulling comps to price a listing or win a pitch.
  • Off-plan investors tracking how completed projects in a community are reselling — see off-plan investment tracking.
  • Analysts and journalists producing quarterly market reports without scraping or manual CSV wrangling. (For why an API beats scraping here, see BayutAPI vs Web Scraping.)

Frequently Asked Questions

Is Dubai property transaction data public? Yes. The DLD publishes registered transactions as open data through Dubai Pulse. The data is public; the friction is in the access — business-account requirements, OAuth tokens, and bulk CSVs. BayutAPI removes that friction by serving the same DLD-registered transaction records that Bayut aggregates, as query-ready JSON.

What is the difference between listing data and transaction data? Listing data is the asking price an agent advertises. Transaction data is the registered price a property actually sold or rented for. In Dubai, closed prices typically settle a few percent below asking, so transaction data is the more reliable basis for valuation.

Can I get transaction data for a specific community like JLT or Downtown Dubai? Yes. Use the autocomplete endpoint to get the area’s location ID, then pass it to the transactions endpoint via location_ids. You can further narrow by property type, bedrooms, price, and size.

How far back does the data go? Use the time_period parameter to choose a look-back window of 1m, 3m, 6m, 12m (default), or 24m.

Do I need a DLD business account to use BayutAPI? No. BayutAPI is available on RapidAPI with a free tier — no DLD registration, OAuth setup, or CSV processing required.

Start Pulling Transaction Data

Dubai’s transaction data is some of the richest and most transparent in the world — once you can actually query it. The transactions endpoint turns that public-but-painful dataset into a single call you can build on.

B

BayutAPI Team

Building tools for UAE real estate developers

Ready to Build with UAE Real Estate Data?

Get your API key and start making requests in minutes. Free tier available with 900 requests per month.