# Dubai DLD Property Transactions API – Sold Prices, Price/Sqm (`data_daemon/dubai-property-transactions`) Actor

Dubai real estate transactions from the official Dubai Land Department (DLD) register, for brokers, valuers, proptech and investors: registered sales, off-plan sales, mortgages and gifts with AED value, price per sqm, area, project, rooms and size. Any date range. $1 per 1,000 transactions.

- **URL**: https://apify.com/data_daemon/dubai-property-transactions.md
- **Developed by:** [Daemon Data](https://apify.com/data_daemon) (community)
- **Categories:** Real estate, Business, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 transactions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Dubai DLD Property Transactions API – Sold Prices, Price/Sqm

**Dubai DLD Property Transactions** is a pay-per-result Apify Actor that returns the Dubai Land Department's registered property transactions as JSON, CSV or Excel: every sale, off-plan sale, mortgage and gift with the transaction date, value in AED, computed price per square metre, area, project and master project, property type and sub-type, rooms, parking, size, off-plan and freehold flags and the nearest metro, mall and landmark. It is for brokers and agencies, valuers and mortgage teams, proptech portals and data teams, developers and investors who need registered prices rather than asking prices. Price: $1 per 1,000 transactions; no UAE Pass, API key or proxy. In the week to 18 October 2026 the register recorded about 4,100 transactions: 2,600 sales (1,650 off-plan, 950 ready), 1,300 mortgages and 160 gifts.

Pick a date range, or leave it empty and set **Days back** (default 7; `1` for a daily feed). Filter by sales / mortgages / gifts, off-plan vs ready, freehold, residential vs commercial, and unit / building / land. No UAE Pass, no API key, no proxy. **$1 per 1,000 transactions.**

### What teams run, and what it costs

Volumes measured in the week to 18 October 2026: about 4,100 transactions, of which 2,600 were sales (1,650 off-plan, 950 ready), 1,300 mortgages and 160 gifts.

| You are | You run | Cost |
|---|---|---|
| Broker / agency | Last 30 days of sales (about 11,000 rows), then group by `area` and `project` for a CMA or client report | about $11 per month of data |
| Valuer / mortgage team | Weekly residential sales feed for price-per-sqm benchmarks by area and project | about $2.50 per week |
| Proptech / portal / data team | Daily scheduled feed of all transactions into your database (`daysBack: 1`) | about $17 per month |
| Developer sales team / investor | Weekly off-plan sales (`offPlan: "offplan"`) to track absorption by project | about $1.60 per week |

Export JSON, CSV or Excel, connect by API, webhook, Google Sheets, Make or n8n, or ask through an AI agent ("what did 2-bedroom flats in Business Bay sell for last month?").

### Why use this instead of a portal or a paid feed

- **Registered prices, not asking prices.** Listing portals show what sellers want; DLD shows what buyers actually paid.
- **Complete.** A typical week has 3,000–6,000 transactions; the Actor pages through all of them, 500 at a time.
- **Analysis-ready.** Numeric AED values and areas, ISO dates, boolean off-plan/freehold flags, `pricePerSqmAed` precomputed, optional Arabic names.
- **Pre-registration vs completed sale.** The `procedure` field separates developer pre-registrations (`Sell - Pre registration`) from completed sales (`Sale`, `Delayed Sell`), and mortgage registrations from modifications.
- **Open data, no personal data.** Published by the Dubai Land Department for reuse; no owner names or contacts are included.

**From an AI assistant:** add the MCP connector `https://mcp.apify.com/?tools=data_daemon/dubai-property-transactions` in Claude, ChatGPT, Cursor or VS Code and ask for the data in plain words.

### Input

```json
{
    "daysBack": 7,
    "transactionGroup": "sales",
    "offPlan": "all",
    "usage": "residential",
    "propertyType": "unit",
    "maxItems": 2000
}
```

| Field | Description |
| --- | --- |
| `fromDate`, `toDate` | Date range, `YYYY-MM-DD` (or `DD/MM/YYYY`). `toDate` defaults to today. An invalid date is ignored with a warning; a reversed range is swapped. |
| `daysBack` | Used when `fromDate` is empty: the last N days up to `toDate`. Default 7, range 1–365. Set `1` for a daily schedule. |
| `transactionGroup` | `all`, `sales`, `mortgages`, `gifts`. |
| `offPlan` | `all`, `offplan`, `ready`. |
| `freehold` | `all`, `freehold`, `nonfreehold`. |
| `usage` | `all`, `residential`, `commercial`. |
| `propertyType` | `all`, `unit`, `building`, `land`. |
| `includeArabic` | Add an `arabic` object with the Arabic names. No extra charge. |
| `maxItems` | Stop after this many transactions (0 = all in range). Default 200 = $0.20; set 0 to get every transaction in the date range. |
| `sort` | Advanced. Transaction number ascending (default) or descending. |
| `areaId` | Advanced. DLD's internal area id, passed through unchanged. The gateway currently returns no rows for any id and reports `areaId` 0 on every row, so leave it empty and filter on `area` in the results. |

Unknown option values fall back to the default with a warning in the log and in the run's status message; a run never fails because of its input.

### Output

```json
{
    "transactionNumber": "11-29816-2026",
    "transactionDate": "2026-10-14",
    "transactionDateTime": "2026-10-14T12:19:09",
    "group": "Sales",
    "procedure": "Sale",
    "usage": "Residential",
    "offPlan": false,
    "freehold": true,
    "area": "BURJ KHALIFA",
    "project": "BURJ KHALIFA TOWERS",
    "masterProject": null,
    "propertyType": "Unit",
    "propertySubType": "Flat",
    "rooms": "2 B/R",
    "parking": "B2-7328,B2-7328T",
    "parcelId": 3450829,
    "actualAreaSqm": 146.6,
    "transactionValueAed": 6175000,
    "pricePerSqmAed": 42121.42,
    "nearestMetro": "Buj Khalifa Dubai Mall Metro Station",
    "nearestMall": "Dubai Mall",
    "nearestLandmark": "Burj Khalifa",
    "source": "Dubai Land Department open data"
}
```

Every row also carries `groupId`, `procedureId`, `areaId`, `buildingAge`, `propertyId`, `procedureAreaSqm`, `totalSellers`, `totalBuyers` and `scrapedAt`. DLD returns `areaId`, `totalSellers` and `totalBuyers` as 0 on every row; they are kept so that column layouts stay stable. A few procedures (for example `Lease to Own Registration`) come as two rows with the same `transactionNumber` and different values, so dedupe on the full row rather than on `transactionNumber` alone.

Download as JSON, CSV or Excel, or connect via API, webhooks and Google Sheets. Field names are stable; they will not be renamed, so your Sheets, Zapier and Make mappings keep working.

### Scheduling & automation

**Daily feed in four steps**

1. Leave **From date** empty, set **Days back** to `1` and pick your filters (for example sales only).
2. Click **Save as task**.
3. Open **Schedules → Create schedule**, pick **Daily** (for example `0 4 * * *`, 08:00 Dubai time) and add the task.
4. Optional: in the task's **Integrations** tab add **Google Sheets** to append rows, **Slack** or **email** for a message per run, or a **webhook** to your backend. **Make**, **Zapier** and **n8n** all have an Apify module that starts the task and reads the dataset.

DLD registers transactions on working days, so a weekend run returns 0 rows and costs nothing. The window always includes today, so a few of today's rows can appear again in tomorrow's run; dedupe them on your side. The run's status message says how many rows were saved and why it stopped (range exhausted, `maxItems`, charge limit or an upstream error), so a webhook or n8n flow can decide what to do without opening the dataset.

**One call from your own code** (waits for the run and returns the items):

```bash
curl -X POST "https://api.apify.com/v2/acts/data_daemon~dubai-property-transactions/run-sync-get-dataset-items?token=YOUR_API_TOKEN&format=csv" \
  -H "Content-Type: application/json" \
  -d '{"daysBack":1,"transactionGroup":"sales","maxItems":5000}'
```

The same endpoint works with the Apify client libraries for Python and JavaScript. For long back-fills, set `fromDate` and `toDate`, use the asynchronous `runs` endpoint and fetch the dataset when the run finishes.

### Pricing

Pay per event: **$0.001 per transaction record, that is $1 per 1,000**. Platform compute is included. Rows that DLD does not return (weekends, empty filters) cost nothing.

| You fetch | Rows (Oct 2026) | Cost |
|---|---|---|
| One working day, all transactions | about 600 | about $0.60 |
| One week, all transactions | about 4,100 | about $4.10 |
| One week, sales only | about 2,600 | about $2.60 |
| One week, mortgages only | about 1,300 | about $1.30 |
| One month, sales only | about 11,000 | about $11 |
| One year, all transactions (back-fill) | about 175,000 | about $175 |

### Tips

- Build per-community price indices by grouping sales on `area` and `project`, with `propertyType` `Unit` and the median of `pricePerSqmAed`.
- `procedure` distinguishes developer pre-registrations (`Sell - Pre registration`, `Development Registration Pre-Registration`) from completed sales (`Sale`, `Delayed Sell`), and mortgage registrations from modifications.
- Back-fill history with `fromDate`, `toDate` and `maxItems: 0`; the register goes back years and a month is about 16,000 rows.
- `nearestMetro`, `nearestMall` and `nearestLandmark` are filled for most ready properties and often empty for new off-plan projects.

### FAQ

**How much does it cost to get Dubai property transactions?**

$0.001 per transaction. A full week of all DLD transactions (about 4,100 rows) costs about $4.10; a week of sales alone about $2.60.

**Is this the official DLD data?**

Yes. It reads the Dubai Land Department's open-data transactions service, the same register that paid DLD data products resell.

**Can I filter by area or off-plan?**

Off-plan vs ready, sales / mortgages / gifts, freehold, usage and property type are input filters. For areas, filter the output on the `area` and `project` names: DLD's area-id parameter returns no rows and `areaId` is 0 on every row, so that field is hidden under Advanced.

**Does it include price per square metre?**

Yes, `pricePerSqmAed` is computed from the transaction value and the actual area.

**Can I run it every day without editing dates?**

Yes. Leave `fromDate` empty and set `daysBack` to `1`; the window moves with the run date.

### Related Actors by Daemon Data

- [Foundit Jobs Scraper](https://apify.com/data_daemon/foundit-jobs-scraper) – foundit.in (Monster India) jobs with full descriptions, only-new mode for daily feeds
- [Instahyre Jobs Scraper](https://apify.com/data_daemon/instahyre-jobs-scraper) – India tech jobs from product companies and startups with full descriptions, company size and only-new mode
- [Welcome to the Jungle Jobs Scraper](https://apify.com/data_daemon/welcome-to-the-jungle-jobs-scraper) – France-focused WTTJ jobs with full descriptions, company profiles and only-new mode
- [UK Gazette Insolvency Notices](https://apify.com/data_daemon/uk-gazette-insolvency-notices) – winding-up petitions, administrations and liquidations
- [India IPO Tracker](https://apify.com/data_daemon/india-ipo-tracker) – live IPO GMP, subscription and listing data for India
- [Tickertape India Stocks Scraper](https://apify.com/data_daemon/tickertape-stocks-scraper) – NSE/BSE fundamentals, shareholding and screener
- [IIMJobs Scraper](https://apify.com/data_daemon/iimjobs-jobs-scraper) – India management, finance and MBA jobs
- [Hirist Jobs Scraper](https://apify.com/data_daemon/hirist-jobs-scraper) – India IT jobs with full descriptions
- [Oracle Cloud HCM Jobs Scraper](https://apify.com/data_daemon/oracle-hcm-jobs-scraper) – every job on any Oracle Recruiting career site
- [Luma Events Scraper](https://apify.com/data_daemon/luma-events-scraper) – lu.ma events by city, topic or organiser calendar, with hosts and ticket info

### Support

Found a bug or need another field or source? Open an issue on the Issues tab; issues are usually answered within a day. Custom variants of this Actor are available on request. A quick review on the actor page helps other users find it.

### Data source and licence

Data comes from the Dubai Land Department open-data transactions service published for public reuse. Please attribute the Dubai Land Department. The dataset contains no personal data.

# Actor input Schema

## `fromDate` (type: `string`):

Start of the transaction date range, `YYYY-MM-DD` (DD/MM/YYYY also accepted). Leave empty to use **Days back** instead, so a scheduled run never needs a date edit. An invalid date is ignored with a warning.

## `toDate` (type: `string`):

End of the transaction date range, `YYYY-MM-DD`. Defaults to today (UTC).

## `daysBack` (type: `integer`):

Used when **From date** is empty: fetch the last N days up to **To date** (or today). Default 7, minimum 1, maximum 365; values outside that range are clamped. Set 1 for a daily scheduled feed. All transactions run about 600 rows ($0.60) per working day and 4,000 ($4) per week; DLD registers nothing on weekends, so a weekend run returns 0 rows and costs nothing.

## `transactionGroup` (type: `string`):

Filter by DLD transaction group: `all`, `sales`, `mortgages` or `gifts`. Weekly volume in Oct 2026: all about 4,000 rows ($4.00), sales about 2,600 ($2.60), mortgages about 1,300 ($1.30), gifts about 160 ($0.16).

## `offPlan` (type: `string`):

Off-plan (developer pre-registration) vs completed properties: `all`, `offplan` or `ready`. Of about 2,600 weekly sales, roughly 1,650 are off-plan and 950 ready.

## `freehold` (type: `string`):

Freehold vs non-freehold tenure: `all`, `freehold` or `nonfreehold`.

## `usage` (type: `string`):

Property usage: `all`, `residential` or `commercial`. Of about 2,600 weekly sales, roughly 2,500 are residential and 70 commercial.

## `propertyType` (type: `string`):

Property type: `all`, `unit` (apartments and villa units), `building` or `land`. Land plots are about 220 of the 2,600 weekly sales.

## `includeArabic` (type: `boolean`):

Add an `arabic` object with the Arabic names for area, project, procedure etc. No extra charge.

## `maxItems` (type: `integer`):

Stop after this many transactions (0 = all in range). Each transaction costs $0.001, so the default 200 = $0.20 and 2,000 = $2.00. A typical week has 3,000-6,000 transactions.

## `sort` (type: `string`):

Sort order by DLD transaction number: `TRANSACTION_NUMBER_ASC` or `TRANSACTION_NUMBER_DESC`. Matters only when `maxItems` cuts the range short.

## `areaId` (type: `string`):

Advanced: DLD internal area id, passed through to the gateway. The transactions feed returns areaId 0 on every row and, as of October 2026, 0 rows for any id sent here, so ids cannot be looked up from the output and this filter is not usable. Leave empty and filter on the `area` name in the results.

## `proxyConfiguration` (type: `object`):

Optional. Not needed: the DLD gateway answers without a proxy.

## Actor input object example

```json
{
  "daysBack": 7,
  "transactionGroup": "all",
  "offPlan": "all",
  "freehold": "all",
  "usage": "all",
  "propertyType": "all",
  "includeArabic": false,
  "maxItems": 200,
  "sort": "TRANSACTION_NUMBER_ASC",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Transactions as JSON items in the default dataset (also downloadable as CSV, Excel, XML).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/dubai-property-transactions").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "proxyConfiguration": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/dubai-property-transactions").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_daemon/dubai-property-transactions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_daemon/dubai-property-transactions"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fSoMCyHMdU0YHp4kk/builds/OSielCuaFOLdqhyq9/openapi.json
