DEV Community

Cover image for Dubai Real Estate Transactions Dataset: Off-Plan vs Ready in Python, From 500 Free Sales
Happy Endpoint
Happy Endpoint

Posted on Originally published at Medium

Dubai Real Estate Transactions Dataset: Off-Plan vs Ready in Python, From 500 Free Sales

Every conversation about buying in Dubai ends at the same question: off-plan from a developer, or something you can move into? Developer blogs answer it with payment plans and brochures. I wanted the answer from registered transactions, so I loaded a free sample of Dubai sales into pandas and asked three things. How much of the market is off-plan now? Does off-plan cost more or less per square foot than ready? And who is selling?

The short version: off-plan went from about half of residential sales in 2021 to about seven in ten in 2024 and 2025. Off-plan apartments sold for more per square foot than ready ones in the same area in 7 of the 8 areas I could compare. Off-plan units that came back to market were resold after a median of 1.7 years, against 5.1 for ready ones.

The data

The file is the free sales sample of the Dubai Real Estate Transactions Dataset: 500 registered sales from January 2021 to October 2026, on Hugging Face under CC BY 4.0. Each of the 70 months has 7 or 8 rows, picked in identifier order, so the sample is spread evenly over time rather than weighted by volume. It is drawn from a full dataset of 1.36 million sales since 1997, compiled by Happy Endpoint from publicly available Dubai property records and cleaned into one row per registered transaction.

484 of the 500 rows are residential: 334 apartments, 118 villas, 14 hotel apartments, 10 townhouses and 8 residential plots. The columns that matter here are completion_status (off_plan or ready), sale_market (primary for a first sale by the developer, secondary for a resale), amount_per_sqm_aed, bedrooms, previous_sale_date and district_name_en.

The code below reads the file straight from Hugging Face. It needs only pandas.

import pandas as pd

URL = (
    "https://huggingface.co/datasets/happyendpoint/dubai-property-sales-transactions-2021-2026"
    "/resolve/main/dubai_property_sales_2021_2026.csv"
)
SQFT_PER_SQM = 10.7639

sales = pd.read_csv(URL, dtype={"floor": str})
res = sales[sales["property_category"] == "residential"].copy()
res["year"] = res["transaction_date"].str[:4]
res["off_plan"] = res["completion_status"] == "off_plan"

# 1. What share of residential sales were off-plan, by year
share = res.groupby("year")["off_plan"].agg(["size", "mean"])
share["mean"] = (share["mean"] * 100).round(1)
print(share.rename(columns={"size": "sales", "mean": "off_plan_%"}))

# 2. Apartments only: price per sq ft by bedrooms, off-plan vs ready
#    (amount_per_sqm_aed is per built-up area for apartments, per plot area for villas)
apt = res[res["property_type"] == "apartment"]
ppsf = apt.pivot_table(
    index="bedrooms", columns="completion_status",
    values="amount_per_sqm_aed", aggfunc="median",
) / SQFT_PER_SQM
counts = apt.pivot_table(
    index="bedrooms", columns="completion_status",
    values="amount_per_sqm_aed", aggfunc="size",
)
ppsf["premium_%"] = ((ppsf["off_plan"] / ppsf["ready"] - 1) * 100).round(1)
print(ppsf.round({"off_plan": 0, "ready": 0}).join(counts, rsuffix="_n").loc[[0, 1, 2]])
Enter fullscreen mode Exit fullscreen mode

Off-plan is now most of the market

Off-plan went from half of Dubai sales to about seven in ten

In 2021, 41 of the 78 residential sales in the sample were off-plan: 52.6%. The share moved to 59.3% in 2022 and 56.8% in 2023, then jumped to 73.2% in both 2024 and 2025. For 2026, up to October, it is 62.5%.

Be careful with that last number. With about 80 sales a year, each yearly share is only good to about plus or minus 10 points (95% interval). The jump from the low fifties to the low seventies is bigger than that, so I believe it. The 2026 dip is not: 62.5% plus or minus 10.6 overlaps 2025 comfortably. A sample this size tells you the direction of a big shift, not whether this year turned.

Off-plan costs more per square foot, mostly

Across all apartments the median off-plan sale was AED 1,789 per sq ft against AED 1,289 for ready. That gap is real, but part of it is mix. Off-plan flats in the sample are smaller (a median of 75.2 square metres against 92.1), and smaller units usually cost more per square foot. The median prices are much closer: AED 1,318,100 off-plan, AED 1,230,000 ready.

Holding the bedroom count fixed narrows the comparison:

Apartments Off-plan, AED per sq ft Ready, AED per sq ft Off-plan premium Sales (off-plan / ready)
Studio 1,703 1,346 26.5% 41 / 16
1 bedroom 1,707 1,289 32.4% 107 / 47
2 bedrooms 1,998 1,300 53.7% 60 / 38

Bedroom count does not hold location fixed, though, and off-plan launches cluster in different places from the older stock. So I compared the two only inside the same area, for the 8 areas with at least 3 sales of each.

In the same area, off-plan flats cost more per sq ft in 7 of 8

Off-plan cost more per square foot in 7 of the 8. The most reliable comparison is Jumeirah Village Circle, with 27 off-plan and 10 ready sales: AED 1,324 against 1,128, a premium of 17.4%. Business Bay (22 and 9 sales) shows 43.8%, Downtown Dubai 12.4%. The exception is Dubai Harbour, where off-plan came in 30.1% below ready, but that rests on 3 ready sales, too few to read anything into.

The sample cannot say why. Newer buildings, launch pricing and the cost of a developer's payment plan are all candidates. Separating them needs the same building traced from launch to handover to resale, which is a job for the full record history, not 500 rows.

Who sells: developers, and quick resellers

Splitting all 500 sales by completion status and by market gives four groups:

Primary (developer) Secondary (resale)
Off-plan 274 32
Ready 49 145

Two cells are worth a second look. 32 off-plan sales were resales: someone bought from the developer and sold on before the building was finished. And 49 ready sales were primary: developers selling completed units first-hand, stock that did not sell during construction.

The resellers move fast.

Off-plan units are resold after under two years

For secondary sales the file carries previous_sale_date, so the holding period is one subtraction. Off-plan resales came a median of 1.7 years after the previous sale, and 18 of the 30 with a date came within two years. Ready resales came after a median of 5.1 years, with 25 of 139 inside two years. In this sample, buying off-plan and reselling before handover looks like a short-horizon trade, and a ready unit looks like something people live in or let.

How far 500 free rows go

The sample is the right tool for learning the columns and testing code. Whether it is enough for a decision depends on the question.

For the 12 months from November 2025 to October 2026, the sample holds 93 residential sales, 66.7% of them off-plan, plus or minus 9.6 points. Restricted to the 40 most active areas, it is 68 sales and 69.1%, plus or minus 11.0. The Dubai property prices and rents statistics page has a sales-by-area table for those 40 areas over the same 12 months, built from the full records. When I downloaded it, its rows added up to 125,666 sales, and weighting each area's off-plan share by its sales gave 74.6% off-plan. That is my calculation from the table, not a figure the page states. The sample lands within its margin. It gets the market-wide picture roughly right.

Area by area, it has nothing to say. The full records show Dubai South at 92.2% off-plan on 14,565 sales and Jumeirah Village Circle at 59.8% on 11,025. Over the same 12 months the sample has 6 sales in Dubai South and 10 in Jumeirah Village Circle. Any question shaped like "this area, this bedroom count, this year" needs the full file.

Pitfalls in the data

amount_per_sqm_aed does not use the same area for every property type. For apartments it is the price divided by the built-up area (true for 93.4% of apartment rows). For villas it is divided by the plot area (95.8% of villa rows), and for townhouses by the plot too (all 10). A villa's price per square metre of plot is not comparable with a flat's price per square metre of floor. Compare within a type, or compute your own figure from amount_aed and the area column you mean.

occupancy_status is blank on every off-plan sale. All 306 off-plan rows have it empty, which makes sense: there is nothing to occupy yet. On ready sales it is filled: 141 vacant, 45 rented, 8 vacant_on_transfer. Do not count the blanks as vacant.

previous_sale_date only exists on resales. It is never set on primary sales and is present on 95.5% of secondary ones.

Read floor as text. Most values are numbers, but the sample also has G, P1, B1 and T14. In this sample pandas would keep the column as text, but in the full file there is a real risk: read in chunks, the column can come back with mixed types, and any conversion to numbers turns those rows into NaN. Pass dtype={"floor": str}, as the code does.

bedrooms 0 means studio. There are 57 studios among the apartments. Dropping zeros as missing values drops all of them.

Row counts are not market volume. Every month has 7 or 8 rows, whether it was a busy month or a quiet one. Shares within a period are fine, counts are not. For monthly deal counts, the free monthly market summary has sales_count by area and property type for the 50 most active areas.

The rental sample has its own traps. In the companion file of 500 rental contracts, amount_aed is the total contract value, not the annual rent (it equals monthly_rent_aed times contract_months on every row). 12.2% of contracts are not 12 months long (13, 24, 9 and 6 months are the next most common), and contract_end_date is blank on 49.6% of rows. For an annual rent, use monthly_rent_aed times 12.

What I would do with the full data

Three follow-ups need more rows than a sample can give. The off-plan premium by area and bedroom count, year by year. The same building traced from launch through handover to its first resale, to see how much of the premium survives completion. And the flip rate by project: what share of each launch was resold before handover, and at what gain.

The full Dubai Real Estate Transactions Dataset has every registered sale since 1997 and every rental contract since 2010, with the same columns as the free files, as CSV or SQLite, one-off or with monthly updates. If you need a slice of it (a date range, a list of areas, sales only), ask for a quote.

Top comments (0)