# UAE Dubai Property Leads & Unit Number Scraper (`citrine_venus/uae-dubai-property-leads-scraper`) Actor

Turn any Dubai listing URL into a DLD-verified lead: the real unit number with a confidence score, live RERA permit status, full listing details and agent contacts. Property Finder, Betterhomes, Espace and more — streamed live.

- **URL**: https://apify.com/citrine\_venus/uae-dubai-property-leads-scraper.md
- **Developed by:** [Data Minds](https://apify.com/citrine_venus) (community)
- **Categories:** Real estate, Lead generation, SEO tools
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🇦🇪 UAE Dubai Property Leads & Unit Number Finder — DLD Verification, Permit Status & Unit Number Lookup

**UAE Dubai Property Leads & Unit Number Finder** is a production-grade [Apify Actor](https://docs.apify.com/platform/actors) for **Dubai real estate data extraction**, **DLD permit verification** and **unit number lookup**. Give it a Dubai property listing URL — Property Finder, Betterhomes, Allsopp & Allsopp, Espace, haus & haus, LUXHABITAT, or almost any other RERA-compliant listing page — and it returns a clean, enriched **lead**: the DLD-verified **unit number**, live **permit status**, full listing details and the agent/agency contact, written to your Apify **Dataset** in real time.

> 💡 **Need a custom version, private integration, or a tailored lead-gen pipeline?** Email **<hello.dataminds@gmail.com>**.

Every legally advertised Dubai listing carries a Dubai Land Department (DLD) Trakheesi permit — but portals rarely publish the actual unit, and the permit reference hides in a QR image, a footer string, or nothing at all. This Actor recovers it, cross-checks it against the official DLD service, and hands you the answer with a confidence score. Built for **real estate agencies**, **compliance and due-diligence teams**, **CRM enrichment** and **market researchers**.

***

### 📑 Table of contents

- [What is UAE Dubai Property Leads & Unit Number Finder?](#-what-is-uae-dubai-property-leads--unit-number-finder)
- [Main features](#-main-features)
- [Who is this Actor for?](#-who-is-this-actor-for)
- [Built for AI, CRM enrichment and compliance automation](#-built-for-ai-crm-enrichment-and-compliance-automation)
- [Supported websites](#-supported-websites)
- [Listing inputs it accepts](#-listing-inputs-it-accepts)
- [Example input](#-example-input)
- [Output format (Dataset)](#-output-format-dataset)
- [Example output (JSON)](#-example-output-json)
- [Quick start](#-quick-start)
- [Input parameters reference](#%EF%B8%8F-input-parameters-reference)
- [Integrations: CRM, n8n, Make, warehouses](#-integrations-crm-n8n-make-warehouses)
- [Frequently asked questions (FAQ)](#-frequently-asked-questions-faq)
- [Troubleshooting](#%EF%B8%8F-troubleshooting)
- [Help, support & custom builds](#-help-support--custom-builds)
- [Is web scraping legal?](#%EF%B8%8F-is-web-scraping-legal)
- [SEO keywords targeted](#-seo-keywords-targeted)

***

### 🏠 What is UAE Dubai Property Leads & Unit Number Finder?

Piecing a Dubai listing together by hand — open the page, hunt for the Trakheesi permit, scan the RERA QR with a phone, retype the reference into the DLD portal, copy the unit back into your CRM — takes minutes per listing and does not scale past a handful.

This Actor turns any Dubai listing URL into a **ready-to-use lead**:

- **Reads the listing page** across the major Dubai portals, plus a generic engine for the long tail of RERA-compliant sites.
- **Recovers the DLD permit reference** from the page — or by decoding the RERA QR code image when a portal only publishes a picture.
- **Cross-checks it with Dubai Land Department** for the authoritative unit number, floor and permit status.
- **Falls back gracefully** to the best available listing-text answer when DLD itself can't be reached, with an explicit confidence score and source.
- **Enriches the lead** with listing details and the agent/agency contact block.
- **Streams every finished lead to your Dataset** — export to **JSON**, **CSV**, **Excel**, **XML**, or pull it through the [Apify API](https://docs.apify.com/api/v2).

If you have ever needed *"which unit is this Dubai listing actually for, and is the permit still active"* — this is the Actor.

***

### ✨ Main features

- 🔗 **Bulk URL input** — one listing or thousands, each processed independently.
- 🌍 **Wide portal coverage** — Property Finder, Betterhomes, Allsopp & Allsopp, Espace, haus & haus, LUXHABITAT, Driven Properties, Provident Estate, fam Properties, PropSearch, Metropolitan, Emirates.Estate, plus a generic engine for the rest.
- 🔑 **DLD-verified unit numbers** — a cross-checked answer with a confidence score (`verified`, `high`, `medium`, `none`) and the source it came from.
- 🏛️ **Live DLD/RERA permit status** — `active`, `expired`, `delisted`, or `blocked`, straight from the official verification service.
- 🔳 **RERA QR code decoding** — recovers a DLD reference even from listings that publish only a QR picture.
- 🧭 **Stubborn pages handled** — listings that don't read cleanly on the first pass get a second, more thorough attempt.
- 👤 **Agent & agency enrichment** — name, phone, email, WhatsApp, and license/BRN when the portal publishes them.
- 🏗️ **Off-plan project support** — Property Finder `/new-projects/…` pages return project-level data instead of a per-unit permit.
- 🛂 **Direct DLD links accepted** — paste a Trakheesi validation URL and the Actor skips straight to the lookup.
- 🚦 **Blocking handled for you** — the run adapts on its own when a site pushes back, with no configuration required.
- ⚡ **Parallel processing** — `concurrency` from 1 to 20 listings at a time.
- 📦 **Live Dataset writes** and **five prebuilt table views** — Overview, Unit & DLD Verification, Listing Details, Agent & Agency, RERA / Permit.
- 📊 **Run summary** — totals, DLD coverage and the network route, stored in the key-value store as `run-summary`.

***

### 👥 Who is this Actor for?

- 🏢 **Real estate agencies & brokerages** — enrich a listing feed with verified unit numbers before publishing or contacting owners.
- 🕵️ **Due-diligence & compliance teams** — confirm a permit is active and matches the advertised unit before an offer.
- 🗃️ **CRM & data teams** — backfill unit numbers and agent contacts across an existing pipeline.
- 📊 **Market researchers & analysts** — pull structured pricing, size, and community data at scale.
- ⚖️ **Legal & compliance monitoring** — flag listings whose DLD permit is expired, delisted, or blocked.
- 🏦 **Proptech & mortgage platforms** — validate a property record before underwriting or listing syndication.
- 🧑‍💻 **Developers** — a dependable Dubai property data API with no scraping stack to maintain.

***

### 🤖 Built for AI, CRM enrichment and compliance automation

Each row is a flat, typed record — easy to score, route, or embed:

- **CRM enrichment** — push `UnitNumber`, `PermitNumber`, and the agent block straight into HubSpot, Salesforce, Zoho, or Bitrix24.
- **Compliance dashboards** — alert on `DLD_ValidationStatus` values that are not `active`.
- **Lead scoring models** — combine `UnitNumberConfidence`, price, size, and community into a ranking feature set.
- **RAG over a property book** — embed `Portal_Description` plus the DLD fields so an assistant can answer unit-level questions.
- **Duplicate detection** — the same unit advertised by several brokerages collapses on `PermitNumber` or `UnitNumber` + building.
- **Market analytics** — aggregate `Portal_Price`, `PropertySize`, and `ZoneNameEn` across thousands of listings.
- **AI agents via MCP** — expose the Actor as a tool to Claude, Cursor, and other MCP clients through [Apify's MCP server](https://mcp.apify.com).

#### Practical use cases

1. **Portfolio audit** — run every listing your agency advertises and flag expired or delisted permits before a regulator does.
2. **Owner outreach prep** — resolve the real unit number so outreach references the actual property.
3. **Listing-feed QA** — nightly run over new listings, alerting on `DLD_HasRecord: false`.
4. **Competitor coverage map** — pull a portal's search results and chart which buildings each brokerage dominates.
5. **CRM backfill** — replay historical listing URLs to attach unit numbers to old deals.
6. **Valuation modelling** — join DLD size and value fields with portal asking prices.
7. **Duplicate-listing cleanup** — group by permit number to see the same unit advertised five ways.

***

### 🌍 Supported websites

Paste a URL from any of these Dubai property portals — the Actor recognises the site automatically, no configuration needed:

| # | Website | Example URL pattern | Notes |
|---|---|---|---|
| 1 | 🏠 **Property Finder** | `propertyfinder.ae/en/plp/buy/...` | Full listing + DLD verification |
| 2 | 🏠 **Betterhomes** | `bhomes.com/en/property/...` | DLD reference recovered from the RERA QR code image |
| 3 | 🏠 **haus & haus** | `hausandhaus.com/properties/...` | DLD reference recovered from the RERA QR code image |
| 4 | 🏠 **Allsopp & Allsopp** | `allsoppandallsopp.com/dubai/property/...` | Handled automatically |
| 5 | 🏠 **Espace Real Estate** | `espace.ae/properties-single/...` | Full listing + DLD verification |
| 6 | 🏠 **LUXHABITAT Sotheby's** | `luxhabitat.ae/apartments-for-sale/...` | Permit number only — this portal publishes no QR code, so DLD status stays `unavailable` |
| 7 | 🏠 **Driven Properties** | `drivenproperties.com/...` | Handled by the generic engine |
| 8 | 🏠 **Provident Estate** | `providentestate.com/buy/...` | Handled by the generic engine |
| 9 | 🏠 **Metropolitan Premium Properties** | `metropolitan.realestate/buy/...` | Protected site — handled automatically |
| 10 | 🏠 **fam Properties** | `famproperties.com/...` | Handled by the generic engine |
| 11 | 🏠 **PropSearch** | `propsearch.ae/property/...` | Handled by the generic engine |
| 12 | 🏠 **Emirates.Estate** | `emirates.estate/property/...` | Handled by the generic engine |
| 13 | 🏗️ **Property Finder — off-plan projects** | `propertyfinder.ae/en/new-projects/...` | Project-level data only (developer, units, floor plans) — off-plan projects carry no per-unit DLD permit |
| 14 | 🏛️ **Dubai Land Department link directly** | `trakheesi.dubailand.gov.ae/rev/madmoun/listing/validation?khevJujtDig=...` | Skips the page scrape entirely and goes straight to the DLD lookup |
| 15 | 🌐 **Any other Dubai listing site** | — | Unrecognised UAE property hosts are still accepted and handled by the generic engine, which usually finds the permit and unit number too |

***

### 🔗 Listing inputs it accepts

| What you provide | What happens |
|---|---|
| A Property Finder / Betterhomes / Espace / haus & haus / LUXHABITAT / Allsopp & Allsopp URL | Full listing + DLD verification |
| A Driven Properties / Provident Estate / fam Properties / PropSearch / Metropolitan URL | Same, via dedicated portal support |
| Any other RERA-compliant Dubai listing page | Handled by the generic engine — usually still finds the permit and unit number |
| A Dubai Land Department verification link directly | Straight to the DLD lookup, no page scrape needed |
| A Property Finder off-plan project page (`/new-projects/…`) | Project-level details instead of a per-unit permit (no DLD lookup — off-plan projects have none) |

💡 **Tip:** start with a handful of URLs to see the field shape, then scale up once it looks right.

***

### 🧾 Example input

Mix and match any of the supported sites in one run — here's one of every kind:

```json
{
  "urls": [
    { "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-jumeirah-village-circle-district-13-amaris-residences-107280230.html" },
    { "url": "https://www.bhomes.com/en/property/bh-s-290088" },
    { "url": "https://www.hausandhaus.com/properties/for-sale/in-dubai/3-bedroom-apartment-for-sale-in-sunrise-bay-tower-2-dubai-harbour-dubai/157/" },
    { "url": "https://www.allsoppandallsopp.com/dubai/property/sales/L-278915" },
    { "url": "https://www.espace.ae/properties-single/2-bedroom-apartment-for-sale--links-west-the-views-dubai-es-40731" },
    { "url": "https://www.luxhabitat.ae/apartments-for-sale/dubai/palm-jumeirah/royal-atlantis-residences/apartment-27812/" },
    { "url": "https://www.drivenproperties.com/apartments-for-sale-in-dubai/downtown-dubai/damac-maison-the-distinction/dp-s-59666" },
    { "url": "https://providentestate.com/buy/1-bedroom-apartment-for-sale-in-sobha-verde-jumeirah-lake-towers-dubai9820/" },
    { "url": "https://metropolitan.realestate/buy/dubai/difc/apartment/3br-limestone-house-mps-50720/" },
    { "url": "https://famproperties.com/dubai-harbour-dubai/beach-vista-tower-two/2-bedroom-Apartment-for-Sale-178092" },
    { "url": "https://propsearch.ae/property/3840957/2-bedroom-jumeirah-beach-view-prime-location" },
    { "url": "https://emirates.estate/property/atistry-residences-689552/" },
    { "url": "https://www.propertyfinder.ae/en/new-projects/emaar-properties/aurea" },
    { "url": "https://trakheesi.dubailand.gov.ae/rev/madmoun/listing/validation?khevJujtDig=z5xwpfnahrdac811uonimbpssmtyxbd840wcblztjesoxeelv" }
  ],
  "proxyConfiguration": { "useApifyProxy": false }
}
```

Each row in the table above matches one URL here, in the same order — remove any lines you don't need, or paste just one URL to try it first.

***

### 📤 Output format (Dataset)

Every lead is one row in the default [Apify Dataset](https://docs.apify.com/platform/storage/dataset), with **five prebuilt views** so each part of the record has its own tidy section:

| View | What it shows |
|---|---|
| 🏠 **Overview** | `ok`, portal, listing URL, unit number, confidence, source, floor, DLD status, permit number, `error` |
| 🔑 **Unit & DLD Verification** | Unit number, source, confidence, evidence, floor, DLD status/record/messages, zone, building, property type, rooms, size, value |
| 📋 **Listing Details** | Title, description, property type, offering type, bedrooms, bathrooms, size + unit, price + currency, location, community, city, images |
| 👤 **Agent & Agency** | Agent name, phone, email, WhatsApp, license; agency name, phone, email, license, address |
| 🛂 **RERA / Permit** | Permit number, RERA license, DLD validation URL, QR code URL, authority, permit start/end dates, permit status and type |

Key fields:

| Field | Description |
|---|---|
| `ok` | `true` when the listing was processed; `false` rows carry `error` and are still saved. |
| `portal`, `portal_name`, `source_url` | Which portal the lead came from, and the URL you supplied. |
| `UnitNumber` | **The answer** — the unit this listing advertises. |
| `UnitNumberSource` | Where it came from: `dld` (authoritative) or the listing itself. |
| `UnitNumberConfidence` | `verified`, `high`, `medium`, or `none`. |
| `UnitNumberEvidence` | The snippet or record the answer was taken from. |
| `FloorNumber`, `PropertyUnitNumber` | Floor and the DLD-side unit identifier. |
| `DLD_ValidationStatus`, `DLD_HasRecord`, `DLD_Messages`, `DLD_UnavailableReason` | Outcome of the Dubai Land Department cross-check. |
| `ZoneNameEn`, `BuildingNameEn`, `PropertyTypeNameEn`, `RoomsCount`, `PropertySize`, `PropertyValue` | DLD-side property record. |
| `PermitNumber`, `RERA_PermitNumber`, `RERA_LicenseNumber`, `RERA_PermitValidationUrl`, `RERA_QrCodeUrl` | Permit identifiers and the official validation link. |
| `RERA_AuthorityName`, `RERA_PermitStartDate`, `RERA_PermitEndDate`, `PermitStatusEn`, `PermitTypeEn` | Permit issuer, validity window, and status. |
| `Portal_Title`, `Portal_Description`, `Portal_PropertyType`, `Portal_OfferingType` | Listing copy and classification. |
| `Portal_Bedrooms`, `Portal_Bathrooms`, `Portal_SizeValue`, `Portal_SizeUnit` | Listing specification. |
| `Portal_Price`, `Portal_PriceCurrency` | Asking price as advertised. |
| `Portal_LocationFullName`, `Portal_Community`, `Portal_City`, `Portal_Images` | Location block and image URLs. |
| `Agent_Name`, `Agent_Phone`, `Agent_Email`, `Agent_Whatsapp`, `Agent_LicenseNumber` | Listing agent contact (when `retrieveContactDetails` is on). |
| `Agency_Name`, `Agency_Phone`, `Agency_Email`, `Agency_LicenseNumber`, `Agency_Address` | Brokerage contact block. |
| `listing_guid`, `guid_note`, `error` | Internal listing reference, a note on why it may be missing, and any per-row failure reason. |

> 📊 A **run summary** — totals, DLD coverage, and the network route used — is stored in the run's key-value store as `run-summary`.

***

### 🧪 Example output (JSON)

```json
{
  "ok": true,
  "portal": "betterhomes",
  "portal_name": "Betterhomes",
  "source_url": "https://www.bhomes.com/en/property/bh-s-290088",
  "listing_guid": null,
  "UnitNumber": "C1001",
  "UnitNumberSource": "dld",
  "UnitNumberConfidence": "high",
  "FloorNumber": "10",
  "PermitNumber": "71772607582",
  "RERA_PermitValidationUrl": "https://trakheesi.dubailand.gov.ae/rev/madmoun/listing/validation?khevJujtDig=...",
  "Portal_Title": "High-End Living | Prime Area | Best Deal",
  "Portal_PropertyType": "Apartment",
  "Portal_OfferingType": "Sale",
  "Portal_Bedrooms": 2,
  "Portal_Bathrooms": 3,
  "Portal_SizeValue": 1435.6,
  "Portal_SizeUnit": "sqft",
  "Portal_Price": 3400000,
  "Portal_PriceCurrency": "AED",
  "Portal_Community": "Dubai Marina",
  "Portal_City": "Dubai",
  "Agent_Name": "Ajay Barua",
  "Agent_Phone": "585476207",
  "Agent_Email": null,
  "Agency_Name": "Betterhomes",
  "DLD_ValidationStatus": "unavailable",
  "DLD_HasRecord": false,
  "error": null
}
```

***

### 🚀 Quick start

#### Run in Apify Console

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **UAE Dubai Property Leads & Unit Number Finder**.
3. Paste your Dubai listing URL(s) into `urls` — one per line, or upload a file.
4. Leave **Proxy Configuration** on its default unless you need a specific route.
5. Click **Start** and watch each lead appear live in the log.
6. Open the **Output** tab, switch between the five views, and export to JSON / CSV / Excel.

#### Run via API

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [{ "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-..." }],
    "validateWithDld": true,
    "decodeReraQr": true,
    "proxyConfiguration": { "useApifyProxy": false }
  }'
```

Fetch the results once the run finishes:

```bash
curl "https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?token=YOUR_APIFY_TOKEN&format=csv"
```

#### Python client

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("YOUR_ACTOR_ID").call(run_input={
    "urls": [{"url": "https://www.bhomes.com/en/property/bh-s-290088"}],
    "validateWithDld": True,
    "decodeReraQr": True,
})

for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(lead["portal_name"], lead.get("UnitNumber"), lead.get("DLD_ValidationStatus"))
```

***

### 🛠️ Input parameters reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `urls` | array | — | **Required.** Dubai property listing URLs — bulk input supported. |
| `validateWithDld` | boolean | `true` | Cross-check every listing with Dubai Land Department. |
| `decodeReraQr` | boolean | `true` | Decode RERA QR code images to recover a DLD reference. |
| `dldValidationAttempts` | integer | `10` | Retry budget for the DLD verification handshake, per listing. |
| `dldDelaySeconds` | number | `4` | Pause between DLD verifications. |
| `dldAbortAfterFailures` | integer | `2` | Stop DLD verification after N consecutive failures. |
| `renderWithBrowser` | string | `auto` | How thoroughly each listing is read — `auto`, `always`, `never`. |
| `retrieveContactDetails` | boolean | `true` | Include agent & agency contact details in the output. |
| `concurrency` | integer | `5` | Listings fetched in parallel (1–20). |
| `maxRetries` | integer | `3` | Attempts per request before it is skipped. |
| `requestDelaySeconds` | number | `0` | Optional polite delay between requests. |
| `proxyConfiguration` | object | no proxy | Optional proxy configuration for the run. |

***

### 🔌 Integrations: CRM, n8n, Make, warehouses

- 🗃️ **CRMs** — push leads into **HubSpot**, **Salesforce**, **Zoho**, **Pipedrive**, or **Bitrix24** with the agent block attached.
- 🔄 **n8n**, **Make.com**, **Zapier** — route new rows into Slack, Airtable, Google Sheets, or a compliance queue.
- 📦 **Snowflake**, **BigQuery**, **PostgreSQL**, **MongoDB**, **S3** — bulk-load Dataset exports for analytics.
- 🧩 **MCP & AI agents** — expose the Actor as a tool to Claude, Cursor, and other MCP clients via [Apify's MCP server](https://mcp.apify.com).
- 🧠 **AI pipelines** — feed `Portal_Description` and the DLD block into scoring, valuation, or compliance models.
- 📍 **Vector stores** — embed listing copy into **Pinecone**, **Qdrant**, **Weaviate**, or **pgvector** for unit-level Q\&A.
- ⏰ **Apify Schedules & Webhooks** — nightly listing-feed QA with a callback to your service when each run finishes.
- 🧰 **Apify API & SDKs** — orchestrate runs from your own backend in any language.

***

### ❓ Frequently asked questions (FAQ)

#### What is the best way to find a Dubai listing's real unit number?

Give this Actor the listing URL and press **Start**. It recovers the DLD permit reference, cross-checks it with Dubai Land Department, and writes the verified unit number — with a confidence score and its source — straight to your Dataset.

#### Does this work on every Dubai property site?

It has dedicated support for Property Finder, Betterhomes, Allsopp & Allsopp, Espace, haus & haus, LUXHABITAT, Driven Properties, Provident Estate, fam Properties, PropSearch, Metropolitan and Emirates.Estate — plus a generic engine that reads most other RERA-compliant Dubai listing pages.

#### Why is `UnitNumber` sometimes empty?

Not every listing publishes a DLD reference or a recoverable unit number — brokerage sites vary. When that happens you still get every other field, plus a clear reason in `DLD_UnavailableReason` / `guid_note`.

#### What does `UnitNumberConfidence` mean?

It tells you how much to trust the answer: `verified` and `high` come from the DLD record, `medium` from the listing text, and `none` means no unit number could be resolved at all.

#### What if a listing only shows a QR code?

Leave `decodeReraQr` on — the Actor downloads and decodes the RERA QR image to recover the DLD reference. Betterhomes and haus & haus rely on this path.

#### Do I need my own proxy?

No. Leave the proxy input empty and the run handles blocking on its own. Set one only when you want a specific country or route.

#### Can I run this against thousands of URLs?

Yes — `urls` accepts bulk input, and `concurrency`, `maxRetries`, and delay behaviour are all configurable.

#### Does it work for off-plan projects?

Property Finder `/new-projects/…` pages return project-level details (developer, units, floor plans). Off-plan projects carry no per-unit DLD permit, so no unit lookup is performed.

#### Can I feed the results straight into my CRM?

Yes — use webhooks or the API, or connect Make / Zapier / n8n to push new rows into your CRM or a spreadsheet.

#### What if I need a field that isn't here?

Email **<hello.dataminds@gmail.com>** — custom fields and private builds are available.

***

### 🛠️ Troubleshooting

| Symptom | Likely cause | Fix |
|---|---|---|
| **No leads saved** | Invalid or unreachable URLs | Confirm the listing URLs are valid, public Dubai property pages |
| **`UnitNumber` is null** | The listing publishes only a permit number with no scannable QR | Try the same property's Property Finder or Betterhomes URL, or paste a DLD verification link directly |
| **`DLD_ValidationStatus` is `unavailable`** | The verification service refused the request | Raise `dldDelaySeconds`, or set a proxy in `proxyConfiguration` |
| **DLD stops being attempted mid-run** | `dldAbortAfterFailures` tripped after consecutive failures | Expected protection — raise the threshold and retry |
| **Run feels slow** | Verification waits on every listing | Lower `dldValidationAttempts`, raise `concurrency`, or set `renderWithBrowser: "never"` |
| **Agent contacts missing** | `retrieveContactDetails` off, or the portal hides them | Enable `retrieveContactDetails`; some portals publish no direct contact |
| **Fewer results than expected** | Some rows failed individually | Check the `error` field on any `ok: false` row — usually a blocked page or an invalid URL |

***

### 💬 Help, support & custom builds

For **custom solutions**, **private integrations**, **white-label lead pipelines**, or **implementation help**:

📧 **<hello.dataminds@gmail.com>**

- 🐛 **Found a bug or need a new field?** Open an issue on the Actor's **Issues** tab.
- ⭐ **Enjoying it?** Leave a review — it genuinely helps.

Useful Apify documentation:

- 📘 [Apify documentation](https://docs.apify.com/)
- 🤖 [Actors overview](https://docs.apify.com/platform/actors)
- 🔌 [Apify API reference](https://docs.apify.com/api/v2)
- 📚 [Apify Academy — web scraping](https://docs.apify.com/academy)
- 🧰 [Apify SDKs](https://docs.apify.com/sdk)

***

### ⚖️ Is web scraping legal?

This Actor collects **publicly available** listing pages and the public Dubai Land Department verification service — the same information any visitor can see without logging in. Scraping public data is generally lawful, but you remain responsible for how you use it:

- ✅ Do not collect data behind authentication or paywalls.
- ✅ Respect each portal's terms of service and reasonable request rates.
- ✅ Handle personal data (an agent's direct phone or email, for example) in line with UAE data-protection law, GDPR, and other applicable regimes.
- ✅ Use permit and unit data for legitimate verification, compliance, and business purposes.

See Apify's guide on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for background. This is not legal advice.

***

### 🔍 SEO keywords targeted

This README is intentionally keyword-rich for discovery on **Google Search**, **Apify Store search**, and **Bing**. Primary and secondary terms covered include:

**Primary:** dubai property scraper · dld unit number finder · dubai land department verification · rera permit checker · dubai real estate scraper · unit number lookup dubai · trakheesi permit lookup · dubai property api

**Portals:** property finder scraper · betterhomes scraper · allsopp and allsopp scraper · espace real estate scraper · haus and haus scraper · luxhabitat scraper · provident estate scraper · fam properties scraper · propsearch scraper · metropolitan properties scraper

**Verification & compliance:** dld permit validation · rera qr code decoder · permit status check · expired permit detection · dubai broker license lookup · real estate compliance tool · listing due diligence

**Lead & CRM:** dubai property lead generation · property agent contact scraper · dubai crm enrichment · real estate lead enrichment · brokerage data pipeline

**Market data:** dubai property prices data · dubai off-plan project data · uae real estate data · property size and value data · dubai community listings

**Integrations:** HubSpot · Salesforce · Zoho · n8n · Make.com · Zapier · Google Sheets · Airtable · BigQuery · Snowflake · MCP server

# Actor input Schema

## `urls` (type: `array`):

Paste one or more Dubai property listing URLs — supports bulk input (one per line, upload a file, or connect a Google Sheet). Works with Property Finder, Betterhomes, Allsopp & Allsopp, Espace, haus & haus, LUXHABITAT, Driven Properties, Provident Estate, fam Properties, PropSearch, Metropolitan and most other RERA-compliant Dubai listing pages.

## `validateWithDld` (type: `boolean`):

Cross-check every recovered listing against the official Dubai Land Department verification service for the authoritative unit number, permit status, and building/zone data.

## `decodeReraQr` (type: `boolean`):

Some brokerage sites only show a RERA QR code image with no text reference. Enable this to decode those images and unlock DLD verification for those listings too.

## `dldValidationAttempts` (type: `integer`):

How many times to retry the DLD verification handshake for a single listing before giving up on it.

## `dldDelaySeconds` (type: `number`):

A short pause between each listing's DLD verification keeps the success rate high.

## `dldAbortAfterFailures` (type: `integer`):

If DLD refuses this many listings in a row, stop attempting DLD verification for the rest of the run — every listing still gets its full portal data regardless.

## `renderWithBrowser` (type: `string`):

'Auto' (recommended) renders a real browser only for the handful of sites that need it, plus any listing whose fast fetch found no verification reference. 'Always' renders every listing in a browser (slower, most thorough). 'Never' disables browser rendering entirely (fastest, may miss some listings).

## `retrieveContactDetails` (type: `boolean`):

Include the listing agent's and agency's name, phone, email and license number in the output when the portal publishes them.

## `concurrency` (type: `integer`):

How many listings to fetch at the same time.

## `maxRetries` (type: `integer`):

How many times to retry a blocked/failed request on each proxy tier before escalating to the next one.

## `requestDelaySeconds` (type: `number`):

An optional polite delay after every successful request.

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

Leave this on its default for automatic fallback, or pin Residential yourself to skip straight to it — recommended for the most reliable DLD verification.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-jumeirah-village-circle-district-13-amaris-residences-107280230.html"
    },
    {
      "url": "https://www.bhomes.com/en/property/bh-s-290088"
    }
  ],
  "validateWithDld": true,
  "decodeReraQr": true,
  "dldValidationAttempts": 10,
  "dldDelaySeconds": 4,
  "dldAbortAfterFailures": 2,
  "renderWithBrowser": "auto",
  "retrieveContactDetails": true,
  "concurrency": 5,
  "maxRetries": 3,
  "requestDelaySeconds": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# 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 = {
    "urls": [
        {
            "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-jumeirah-village-circle-district-13-amaris-residences-107280230.html"
        },
        {
            "url": "https://www.bhomes.com/en/property/bh-s-290088"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("citrine_venus/uae-dubai-property-leads-scraper").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 = {
    "urls": [
        { "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-jumeirah-village-circle-district-13-amaris-residences-107280230.html" },
        { "url": "https://www.bhomes.com/en/property/bh-s-290088" },
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("citrine_venus/uae-dubai-property-leads-scraper").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 '{
  "urls": [
    {
      "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-jumeirah-village-circle-district-13-amaris-residences-107280230.html"
    },
    {
      "url": "https://www.bhomes.com/en/property/bh-s-290088"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call citrine_venus/uae-dubai-property-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/sOT2Rrjmetf0fvXPn/builds/rJaOM3sclbXlxKvfr/openapi.json
