# Dubizzle Property Scraper — Dubai/UAE + DLD Deed Data (`sian.agency/dubizzle-property-scraper`) Actor

Scrape Dubizzle Dubai/UAE property listings — 6 search modes (location, coordinates, polygon, URL, ID), bilingual EN+AR, agents, and the unique Dubai Land Department deed/building data layer no other Apify actor exposes. Sale + rent. RERA permit lookup. Market KPIs.

- **URL**: https://apify.com/sian.agency/dubizzle-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 property extracteds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Dubizzle Property Scraper — Dubai/UAE + DLD Deed Data 🏛️

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![SIÁN-Bayut Property Scraper](https://img.shields.io/badge/SI%C3%81N-Bayut%20Property%20Scraper-93D500)](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian) [![SIÁN-Zillow Property Scraper](https://img.shields.io/badge/SI%C3%81N-Zillow%20Property%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) [![SIÁN-Apartments.com Scraper](https://img.shields.io/badge/SI%C3%81N-Apartments.com%20Scraper-1AE392)](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian)

#### 🎉 NEW: The ONLY Apify actor with Dubai Land Department (DLD) deed/building data alongside Dubizzle listings
##### Built for UAE PropTech engineers, Dubai investment analysts, off-plan developers, agency-intelligence teams, RERA-compliance firms, and Arabic-speaking market researchers.

---

### 📋 Overview

**Stop stitching three brittle Dubai scrapers together.** The Dubizzle Property Scraper ships for-sale + for-rent listings, agent + agency profiles, and — uniquely on the Apify Store — the full **Dubai Land Department (DLD) deed/building registry** layer per listing. Title-search firms, off-plan investors, and RERA-compliance buyers pull it all in one run.

**Why UAE PropTech teams choose this scraper:**
- 🏛️ **Dubai Land Department (DLD) deed data — unique on the Apify Store**: Building registry, floor count, parking spaces, off-plan project metadata (`offplan_project_info`), and the official `dubailand_listing_validation_url`. Premium pay-per-event enrichment at $0.006 BRONZE. **Zero incumbent actors expose this layer.**
- 🧭 **6 search modes vs incumbents' 1–2**: `bylocation`, `bylocationid`, `bycoordinates`, `bypolygon`, `byurl`, `byid`. Polygon mode unlocks neighbourhood-level analyst workflows incumbent URL-only actors can't touch.
- 🌐 **Bilingual EN + AR fields per row**: `listingTitleAr`, `listingDescriptionAr`, `location.nameAr`, `urlAr` — shipped automatically. Other Dubizzle scrapers silently drop Arabic.
- 📜 **RERA `permit_number` per listing**: UAE-mandatory legal-listing field surfaced on every row. Critical for compliance, title-search, and broker-validation workflows.
- 👤 **Agent + agency drill-down**: `/agent/details` + `/agent/listings` map a single agent's full inventory in 2 extra calls. Plus an auto-generated HTML market KPI report per run (median AED, AED/sqft, ready vs off-plan tally, top areas by inventory).
- ✨ **NEW**: Tier-laddered pay-per-event pricing — FREE $0.030 → flat **$0.0015 at GOLD** on the bulk row. Premium DLD layer priced separately so you only pay when you actually call it.

---

### ✨ Features

- 🏙️ **Search by Location Name** — Free-text `Dubai Marina`, `JBR`, `Business Bay`, `Downtown Dubai`; resolved server-side
- 🆔 **Search by Location ID** — Numeric Dubizzle locationId (e.g. `63 = Dubai Marina`) for deterministic re-runs
- 📍 **Search by Coordinates** — Lat / long + radius (km) for centroid-driven market scans
- 🔷 **Polygon Search** — Custom-drawn polygon (`[[lat,lng], …]`) for analyst-grade hyperlocal cuts
- 🔗 **Search by URL** — Paste any Dubizzle search URL; filters are parsed for you
- 🎯 **Direct Listing Lookup** — Pull a single listing by `listing_id` + `category_id`
- 🏛️ **DLD Deed Enrichment** — Dubai Land Department building registry, parking spaces, floor count, off-plan project metadata, validation URL (PAID, unique on platform)
- 🔁 **Similar Listings Enrichment** — Up to 12 similar listings bundled per call for comp-set construction (PAID)
- 🌐 **Bilingual EN+AR Surfacing** — Arabic variants of title, description, URL, and location names shipped per row
- 📜 **RERA Permit Number** — UAE legal-listing compliance field on every row
- 👤 **Agent + Agency Profiles** — Full agent name, slug, agency, contact details where exposed
- 🏠 **Sale + Rent in One Run** — Set `purpose: "both"` to ship sale and rent inventory side-by-side (PAID)
- 📊 **HTML Market Report** — Median AED price, AED/sqft, ready vs off-plan tally, top-locations leaderboard — saved to `report.html`
- 💸 **Pay Per Event** — Granular charging: bulk row, DLD enrichment, and similar bundle priced separately
- 🆓 **Free Tier With No Credit Card** — 25 listings per run, all six search modes available — try the full thing before you commit

---

### 🎬 Quick Start

Pick a search mode, hand us a location (or URL, coordinates, polygon, ID), choose whether to enrich with DLD or similar listings, and run. Results stream straight to the Apify dataset; the HTML market report saves to the run's key-value store at `report.html`.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~dubizzle-property-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "purpose": "for-sale", "searchMode": "bylocation", "locationName": "Dubai Marina", "maxResults": 25 }'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick your purpose and search mode

Choose `purpose`: `for-sale`, `for-rent`, or `both` (PAID). Choose `searchMode`: `bylocation`, `bylocationid`, `bycoordinates`, `bypolygon`, `byurl`, or `byid`.

#### Step 2: Drop in your input

- `bylocation` → `locationName: "Dubai Marina"`
- `bylocationid` → `locationId: 63`
- `bycoordinates` → `latitude: "25.0805"`, `longitude: "55.1403"`, `radius: 2`
- `bypolygon` → `polygon: "[[25.08,55.14],[25.10,55.14],[25.10,55.18]]"`
- `byurl` → `searchUrl: "https://www.dubizzle.com/property-for-sale/residential/dubai/"`
- `byid` → `listingId: "17485226"`, `categoryId: 31`

(Optional, PAID) Tick `includeDld: true` for the Dubai Land Department layer or `includeSimilar: true` for up to 12 similar listings per row.

#### Step 3: Hit run

The first **25 listings are free** (no credit card). Watch the dataset fill in real time. Download as JSON / CSV / Excel directly from the Apify UI. The `report.html` market dashboard is saved to the run's key-value store.

**That's it! In under 5 minutes, you'll have:**

- A clean dataset of Dubizzle listings with 30+ fields, bilingual EN+AR
- Per-listing RERA `permit_number`, completion status, AED price, area in sqft / sqm
- (Optional) DLD deed/building data — the unique title-search layer
- An HTML market report you can share with your team

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `purpose` | string | Yes | `for-sale`, `for-rent`, or `both` (PAID — doubles query count) |
| `searchMode` | string | Yes | One of: `bylocation`, `bylocationid`, `bycoordinates`, `bypolygon`, `byurl`, `byid` |
| `maxResults` | integer | Optional | Hard cap per query (1–500, default 50). FREE tier capped at 25 per run. |
| `locationName` | string | Conditional | Free-text location for `bylocation` (e.g. `"Dubai Marina"`) |
| `locationNames` | array | Optional | Bulk location names — PAID tier only |
| `locationId` | integer | Conditional | Numeric Dubizzle location ID for `bylocationid` (e.g. `63 = Dubai Marina`) |
| `locationIds` | array | Optional | Bulk location IDs — PAID tier only |
| `latitude` / `longitude` | string | Conditional | Decimal-degree centre for `bycoordinates` |
| `radius` | integer | Optional | Radius in km (1–50) for `bycoordinates` |
| `polygon` | string | Conditional | JSON-array string `[[lat,lng], …]` (min 3 points) for `bypolygon` |
| `searchUrl` | string | Conditional | Full Dubizzle search URL for `byurl` |
| `listingId` | string | Conditional | Dubizzle listing\_id for `byid` (combined with `categoryId`) |
| `categoryId` | integer | Conditional | Dubizzle category\_id for `byid` (e.g. `31 = Apartment for Sale`) |
| `includeDld` | boolean | Optional | Enrich each listing with Dubai Land Department deed/building data — PAID tier only |
| `includeSimilar` | boolean | Optional | Enrich each listing with up to 12 similar listings — PAID tier only |

**Example — Location search:**

```json
{
  "purpose": "for-sale",
  "searchMode": "bylocation",
  "locationName": "Dubai Marina",
  "maxResults": 100
}
```

**Example — Polygon (analyst-grade hyperlocal):**

```json
{
  "purpose": "for-rent",
  "searchMode": "bypolygon",
  "polygon": "[[25.08,55.14],[25.10,55.14],[25.10,55.18],[25.08,55.18]]",
  "maxResults": 200
}
```

**Example — Full PAID run with DLD enrichment:**

```json
{
  "purpose": "both",
  "searchMode": "bylocationid",
  "locationIds": [63, 199],
  "maxResults": 500,
  "includeDld": true,
  "includeSimilar": true
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **30+ fields** per listing, including bilingual EN+AR variants and optional DLD deed data:

| Field | Type | Description |
|---|---|---|
| `propertyId` | string | Dubizzle `listing_id` (canonical) |
| `externalId` | string | Dubizzle `external_id` (separate namespace) |
| `categoryId` / `categorySlug` / `categoryNames` | mixed | Category breadcrumb (e.g. apartment-for-sale) |
| `purpose` | string | `for-sale` or `for-rent` |
| `listingTitle` / `listingTitleAr` | string | Bilingual title (English + Arabic) |
| `listingDescription` / `listingDescriptionAr` | string | Bilingual full description |
| `url` / `urlAr` / `shortUrl` | string | English / Arabic / short links |
| `pricing` | object | `{ value, currency: "AED", type, frequency }` |
| `specs` | object | `{ bedrooms, bathrooms, area, areaUnit, completionStatus, isFurnished }` |
| `location` | object | Hierarchical `{ id, name, nameAr, slug, lat, lng }` |
| `agent` | object | Full agent profile (name, slug, agency, contact where exposed) |
| `agency` | object | Agency profile |
| `permitNumber` | string | RERA permit (UAE-mandatory legal field) |
| `completionStatus` | string | `ready` or `off-plan` |
| `isVerified` / `isFeatured` | boolean | Dubizzle quality flags |
| `photos` / `photoCount` | array / int | Full photo URL list |
| `createdAt` / `updatedAt` | string | ISO 8601 timestamps |
| `dld` *(PAID)* | object | DLD building registry: floor count, parking spaces, off-plan project info, validation URL |
| `similar` *(PAID)* | array | Up to 12 similar listings bundled in one call |

**Example dataset row:**

```json
{
  "propertyId": "17485226",
  "externalId": "DXB-2-BR-MARINA-001",
  "categoryId": 31,
  "categorySlug": "apartments-for-sale",
  "purpose": "for-sale",
  "listingTitle": "2 BR Apartment | Marina View | High Floor",
  "listingTitleAr": "شقة غرفتين | إطلالة على المارينا | طابق مرتفع",
  "listingDescription": "Spacious 2-bedroom apartment in Dubai Marina with full marina view…",
  "listingDescriptionAr": "شقة واسعة بغرفتي نوم في دبي مارينا مع إطلالة كاملة على المارينا…",
  "url": "https://www.dubizzle.com/property-for-sale/residential/apartment/2024/2/15/2-br-apartment-marina-view/",
  "urlAr": "https://www.dubizzle.com/ar/property-for-sale/residential/apartment/2024/2/15/2-br-apartment-marina-view/",
  "pricing": { "value": 2850000, "currency": "AED", "type": "sale", "frequency": null },
  "specs": { "bedrooms": 2, "bathrooms": 3, "area": 1450, "areaUnit": "sqft", "completionStatus": "ready", "isFurnished": false },
  "location": { "id": 63, "name": "Dubai Marina", "nameAr": "دبي مارينا", "slug": "dubai-marina", "lat": 25.0805, "lng": 55.1403 },
  "agent": { "name": "Ahmed Al-Mansouri", "slug": "ahmed-al-mansouri-12345", "agency": "Marina Real Estate LLC" },
  "permitNumber": "71234567890",
  "completionStatus": "ready",
  "isVerified": true,
  "isFeatured": false,
  "photos": ["https://images.dubizzle.com/…"],
  "photoCount": 14,
  "createdAt": "2026-02-15T08:23:11Z",
  "updatedAt": "2026-05-12T14:02:47Z",
  "dld": {
    "buildingInfo": "Marina Heights Tower",
    "floorCount": 47,
    "parkingSpaces": 1,
    "offplanProjectInfo": null,
    "dubailandListingValidationUrl": "https://dubailand.gov.ae/en/eservices/validate-listing/?ref=71234567890"
  }
}
```

The HTML market report is saved alongside the dataset at `key_value_stores/default/report.html` and includes: median AED price, median AED/sqft, area medians, ready vs off-plan breakdown, and top locations by inventory.

***

### 💼 Use Cases & Examples

#### 1. UAE PropTech analytics platforms

**PropTech engineers building Dubai-focused dashboards.**

**Input:** `searchMode: "bypolygon"` over a target neighbourhood, `includeDld: true`.
**Output:** Per-listing AED price, area, completion status, plus DLD building data for portfolio depth.
**Use:** Feed a comparables engine, build a price-index, or back a buyer-rec dashboard with the full Dubai inventory.

#### 2. Off-plan property investment research

**Investors and developers tracking off-plan supply.**

**Input:** `searchMode: "bylocationid"`, filter on `completionStatus: "off-plan"`, `includeDld: true`.
**Output:** Listings with `offplan_project_info` from the DLD payload, project completion dates, RERA permits.
**Use:** Identify undersupplied submarkets, monitor pre-handover pricing, track active off-plan projects by master developer.

#### 3. Dubai real-estate agency intelligence

**Brokerages mapping agent-level competitor inventory.**

**Input:** Bulk run by `locationIds` for your competitive set; then drill into `/agent/details` + `/agent/listings` per agent slug.
**Output:** Full agent profile + every active listing per agent.
**Use:** Map competitor pipeline, identify top-performing agents to recruit, benchmark your own agent inventory.

#### 4. Bilingual EN+AR market research

**Arabic-speaking analyst teams who today get English-only scrapes.**

**Input:** Any search mode; `purpose: "both"` for full sale + rent coverage.
**Output:** Every text field paired with its Arabic variant — `listingTitleAr`, `listingDescriptionAr`, `urlAr`, `location.nameAr`.
**Use:** Native-language analyst reports, Arabic-content marketing, bilingual property platforms.

#### 5. RERA compliance + title-search workflows

**Legal teams and title-search firms validating Dubai listings.**

**Input:** `searchMode: "byurl"` or `byid` with `includeDld: true`.
**Output:** RERA `permit_number` + DLD `dubailand_listing_validation_url` per listing.
**Use:** Validate legal-listing compliance, run title searches, build broker-verification flows.

#### 6. Off-plan vs ready market sizing

**Developers and city analysts sizing the off-plan vs handover supply curve.**

**Input:** Run by `locationId` across all major Dubai areas; let the HTML report do the breakdown.
**Output:** Ready vs off-plan tally + top-locations table per `report.html`.
**Use:** Quarterly market reports, board-deck supply charts, supply-vs-demand decks.

#### 7. Dubai rental yield analysis

**REITs and yield-focused investors comparing sale to rent in the same submarket.**

**Input:** `purpose: "both"`, same `locationId`, `maxResults: 500`.
**Output:** Side-by-side sale and rent inventory with bedrooms, area, AED price.
**Use:** Compute gross rental yield by submarket, find arbitrage between buy-to-let zones.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/dubizzle-property-scraper').call({
  purpose: 'for-sale',
  searchMode: 'bylocation',
  locationName: 'Dubai Marina',
  maxResults: 100,
  includeDld: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Pulled ${items.length} listings — first: ${items[0].listingTitle}`);
console.log(`DLD building: ${items[0].dld?.buildingInfo}`);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/dubizzle-property-scraper').call(run_input={
    'purpose': 'for-rent',
    'searchMode': 'bypolygon',
    'polygon': '[[25.08,55.14],[25.10,55.14],[25.10,55.18],[25.08,55.18]]',
    'maxResults': 200,
    'includeSimilar': True,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(f"{item['listingTitle']} — AED {item['pricing']['value']}/{item['pricing']['frequency']}")
    print(f"  RERA: {item.get('permitNumber')}  |  AR: {item.get('listingTitleAr')}")
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~dubizzle-property-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "purpose": "for-sale",
    "searchMode": "bylocationid",
    "locationId": 63,
    "maxResults": 100,
    "includeDld": true
  }'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (e.g. weekly Dubai Marina pull) or webhook
2. **HTTP Request**: Call the actor API with your `searchMode` + input
3. **Process**: Parse JSON, filter by `completionStatus` or `permitNumber`
4. **Action**: Push to your warehouse (BigQuery, Snowflake), CRM (HubSpot, Salesforce), or notify Slack with new off-plan inventory

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now — No Credit Card)

- **25 listings** per run — full feature access across all 6 search modes
- Polygon, coordinates, URL, location name, location ID, listing ID — every search mode available
- Auto-generated HTML market report saved every run
- Perfect for testing, evaluation, and small Dubai market snapshots

#### PAID Tier (Production Ready)

- **Unlimited listings** per run (up to 500 per query, multiple queries per run)
- **Bulk location arrays** — `locationNames` / `locationIds` pull many neighbourhoods in one shot
- **DLD deed enrichment** — the unique Dubai Land Department layer no other actor offers
- **Similar listings enrichment** — 12 comps per row bundled into one call
- **`purpose: "both"`** — sale and rent in a single run

#### 6-Tier Pay-Per-Event Pricing

Every event is laddered from FREE → DIAMOND. You only pay for what you actually extract, and the DLD layer (our unique USP) is priced separately so it never gets bundled into the base run cost.

| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|
| `apify-actor-start` (per GB of memory) | $0.050 | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 |
| **`PropertyExtracted`** *(primary — per listing)* | $0.030 | **$0.003** | $0.00225 | **$0.0015** | $0.0015 | $0.0015 |
| 🏛️ **`DldDeedEnriched`** *(premium — unique on platform)* | $0.060 | **$0.006** | $0.00525 | **$0.0045** | $0.0045 | $0.0045 |
| `SimilarEnriched` *(12 listings bundled per call)* | $0.030 | **$0.003** | $0.00225 | **$0.0015** | $0.0015 | $0.0015 |

**Why the DLD event costs more than the bulk row:** the Dubai Land Department layer is unique to this actor on the entire Apify Store. No incumbent exposes building registry, floor count, parking spaces, off-plan project metadata, or the official validation URL. The 2× premium reflects platform-wide uniqueness, not extra cost on our side — and it's an opt-in toggle so the base run stays cheap.

💰 **Best price on the market** — at GOLD tier, the bulk row drops to **$0.0015 / listing**, matching the SIÁN portfolio framework ($0.003 BRONZE → flat at GOLD). Incumbent Dubizzle actors charge flat $0.005–$0.0075 with no tier ladder and no DLD layer.

🔗 [View current pricing on the Apify Store](https://apify.com/sian.agency/dubizzle-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: What exactly is DLD deed data and why is it unique?**
A: The Dubai Land Department is the official property registry for the Emirate. Their building-level metadata — `buildingInfo`, `floorCount`, `parkingSpaces`, `offplan_project_info`, `dubailand_listing_validation_url` — is the gold-standard reference for title-search firms and PropTech analysts. **No other actor on the Apify Store surfaces it.** Toggle `includeDld: true` on a PAID run to enable it; the per-listing charge is the `DldDeedEnriched` event at $0.006 BRONZE.

**Q: Do I always get Arabic text?**
A: Yes — bilingual fields (`listingTitleAr`, `listingDescriptionAr`, `urlAr`, `location.nameAr`) ship in every row when Dubizzle has them. No toggle required, no extra charge.

**Q: How do I find the right `locationId`?**
A: Easiest path: use `searchMode: "bylocation"` with a free-text name — the platform resolves the ID server-side. Alternatively, the numeric ID appears in every Dubizzle URL and in the `location.id` field of any search result.

**Q: What's the polygon format?**
A: A JSON-array string of `[lat,lng]` points (minimum 3): `"[[25.08,55.14],[25.10,55.14],[25.10,55.18]]"`. Semicolon-separated, space-separated, or GeoJSON-feature formats will fail validation — stick to the array-of-pairs shape.

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited — capped only by `maxResults` (up to 500 per query) and your query count.

**Q: Does this work for both sale and rent?**
A: Yes. Set `purpose: "for-sale"`, `"for-rent"`, or `"both"`. The `both` setting runs each query twice (sale + rent) and is PAID-only — it doubles your query count.

**Q: Are agent phone numbers included?**
A: Where Dubizzle exposes them. Most agent profiles ship with name, slug, and agency; phone/email are intermittently available depending on the agent's privacy settings.

**Q: Can I scrape historical / sold listings?**
A: No — Dubizzle only exposes the live active inventory. For sold-history data, consider Dubai Land Department's public-records dataset (linked from the DLD enrichment's `dubailandListingValidationUrl`).

**Q: Output formats?**
A: JSON, CSV, JSONL, Excel, RSS — export directly from the Apify dataset UI or pull via the Apify SDK in any language.

**Q: How fast is each run?**
A: Search pagination is ~35 results per page at roughly 1 second per page. A 500-row run typically completes in 20–40 seconds. Enrichment adds 1 extra call per listing — budget 1 extra second per row when `includeDld` or `includeSimilar` is on.

***

### 🐞 Troubleshooting

**"Polygon needs >= 3 points" error**

- The `polygon` field must be a JSON-array string of at least 3 `[lat,lng]` pairs. Wrap it in quotes and double-check the inner brackets: `"[[25.08,55.14],[25.10,55.14],[25.10,55.18]]"`. Semicolons or spaces will not work.

**Empty results for a known location**

- Double-check that `purpose` is correct — `for-sale` won't return rental listings. If using `bylocationid`, confirm the ID via a `bylocation` lookup first (the platform's location tree updates occasionally).

**`byid` mode returns 422**

- Both `listingId` AND `categoryId` are required for direct lookup. The single-param shape returns a 422 error. Find `categoryId` in any search response under `categoryId` (e.g. `31` = Apartment for Sale, `30` = Villa for Sale).

**FREE tier hits its 25-listing cap mid-run**

- This is by design — FREE is 1 query × 25 listings. Upgrade to a PAID Apify plan to unlock bulk arrays, polygon mode, DLD enrichment, and unlimited query counts.

**DLD enrichment doesn't fire**

- Two requirements: PAID tier (FREE has enrichment disabled) AND `includeDld: true` in your input. The per-listing `DldDeedEnriched` charge only fires on successful fetches — failed enrichment is non-fatal and silently skipped.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location beyond what listings publicly expose. They only extract what users (sellers, agents, agencies) have chosen to share publicly on the Dubizzle listing pages. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data (agent names, agency profiles, contact details where the agent has chosen to expose them). Personal data is protected by the **GDPR** in the European Union, the UAE's **PDPL** (Personal Data Protection Law), and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### ⚠️ Trademark Disclaimer

This Actor is an **independent tool** and is not affiliated with, endorsed by, or sponsored by **Dubizzle**, **OLX Group**, the **Dubai Land Department (DLD)**, the **Real Estate Regulatory Agency (RERA)**, or any of their subsidiaries or affiliates. All trademarks, service marks, trade names, logos, and product names mentioned in this Actor or its documentation (including but not limited to Dubizzle, OLX, DLD, RERA, and Dubailand) remain the property of their respective owners.

Use this tool in accordance with the source website's Terms of Service and applicable local law (including UAE law and the UAE Personal Data Protection Law / PDPL). The Actor extracts only publicly available data; you are solely responsible for ensuring that your use of the data complies with the relevant terms of service and data-protection regulations.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository on the Apify Store
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more PropTech and real-estate automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `purpose` (type: `string`):

Which side of the market to scrape.

• **for-sale** — buy listings (apartments, villas, townhouses)
• **for-rent** — rental listings
• **both** — runs each query twice, once for sale and once for rent (PAID — doubles the query count)

## `searchMode` (type: `string`):

How to specify what to scrape.

• **bylocation** — by location name (e.g. 'Dubai Marina')
• **bylocationid** — by numeric location ID (use autocomplete to find IDs)
• **bycoordinates** — by lat/long + radius (km)
• **bypolygon** — by polygon vertices (JSON array)
• **byurl** — by a full Dubizzle search URL
• **byid** — direct listing lookup by listing\_id + category\_id

## `maxResults` (type: `integer`):

Hard cap on listings returned per query. Auto-paginates until cap is reached or search is fully drained. Default 50. FREE tier is always capped at 25 listings per run.

## `locationName` (type: `string`):

Free-text location like 'Dubai Marina', 'JBR', 'Downtown Dubai', 'Business Bay'. Resolved server-side.

## `locationNames` (type: `array`):

Array of location names. PAID tier only.

## `locationId` (type: `integer`):

Numeric Dubizzle location ID. Examples: 63 = Dubai Marina, 199 = Dubai (city). Use the autocomplete endpoint or check Dubizzle URL.

## `locationIds` (type: `array`):

Array of numeric location IDs. PAID tier only.

## `latitude` (type: `string`):

Latitude in decimal degrees. Example: 25.0805 (Dubai Marina).

## `longitude` (type: `string`):

Longitude in decimal degrees. Example: 55.1403 (Dubai Marina).

## `radius` (type: `integer`):

Search radius in kilometers around the centre point.

## `polygon` (type: `string`):

JSON array of \[lat,lng] points. Minimum 3 points. Example: \[\[25.08,55.14],\[25.10,55.14],\[25.10,55.18]]

## `searchUrl` (type: `string`):

Paste a Dubizzle search results URL (e.g. https://www.dubizzle.com/property-for-sale/residential/dubai/).

## `listingId` (type: `string`):

Numeric Dubizzle listing\_id. Must be combined with categoryId.

## `categoryId` (type: `integer`):

Numeric Dubizzle category\_id (e.g. 31 = Apartment for Sale, 30 = Villa for Sale). Available in any search response.

## `includeDld` (type: `boolean`):

When ON, fetches Dubai Land Department (DLD) deed/building data for each listing — building registry, floor count, parking spaces, off-plan project metadata, validation URL. Adds 1 extra API call + a DldDeedEnriched charge per listing. Disabled on FREE tier.

## `includeSimilar` (type: `boolean`):

When ON, fetches up to 12 similar listings for each result. Adds 1 extra API call + a SimilarEnriched charge per listing. Disabled on FREE tier.

## Actor input object example

```json
{
  "purpose": "for-sale",
  "searchMode": "bylocation",
  "maxResults": 50,
  "locationName": "Dubai Marina",
  "locationId": 63,
  "latitude": "25.0805",
  "longitude": "55.1403",
  "radius": 2,
  "polygon": "[[25.08,55.14],[25.10,55.14],[25.10,55.18]]",
  "searchUrl": "https://www.dubizzle.com/property-for-sale/residential/dubai/",
  "listingId": "17485226",
  "categoryId": 31,
  "includeDld": false,
  "includeSimilar": false
}
```

# Actor output Schema

## `results` (type: `string`):

Structured Dubizzle listings (sale + rent) with optional DLD building data and similar-listings enrichment.

## `htmlReport` (type: `string`):

HTML summary with run stats, market KPIs (median price, AED/sqft, area + type breakdowns), and per-query totals.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/dubizzle-property-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/dubizzle-property-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call sian.agency/dubizzle-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/dubizzle-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Dubizzle Property Scraper — Dubai/UAE + DLD Deed Data",
        "description": "Scrape Dubizzle Dubai/UAE property listings — 6 search modes (location, coordinates, polygon, URL, ID), bilingual EN+AR, agents, and the unique Dubai Land Department deed/building data layer no other Apify actor exposes. Sale + rent. RERA permit lookup. Market KPIs.",
        "version": "1.0",
        "x-build-id": "RMd8So645CCYhtqB8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~dubizzle-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-dubizzle-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~dubizzle-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-dubizzle-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~dubizzle-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-dubizzle-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "purpose": {
                        "title": "🏠 Listing Purpose",
                        "enum": [
                            "for-sale",
                            "for-rent",
                            "both"
                        ],
                        "type": "string",
                        "description": "Which side of the market to scrape.\n\n• **for-sale** — buy listings (apartments, villas, townhouses)\n• **for-rent** — rental listings\n• **both** — runs each query twice, once for sale and once for rent (PAID — doubles the query count)",
                        "default": "for-sale"
                    },
                    "searchMode": {
                        "title": "🧭 Search Mode",
                        "enum": [
                            "bylocation",
                            "bylocationid",
                            "bycoordinates",
                            "bypolygon",
                            "byurl",
                            "byid"
                        ],
                        "type": "string",
                        "description": "How to specify what to scrape.\n\n• **bylocation** — by location name (e.g. 'Dubai Marina')\n• **bylocationid** — by numeric location ID (use autocomplete to find IDs)\n• **bycoordinates** — by lat/long + radius (km)\n• **bypolygon** — by polygon vertices (JSON array)\n• **byurl** — by a full Dubizzle search URL\n• **byid** — direct listing lookup by listing_id + category_id",
                        "default": "bylocation"
                    },
                    "maxResults": {
                        "title": "📊 Max results per query",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on listings returned per query. Auto-paginates until cap is reached or search is fully drained. Default 50. FREE tier is always capped at 25 listings per run.",
                        "default": 50
                    },
                    "locationName": {
                        "title": "📍 Location Name (used when Search Mode = bylocation)",
                        "type": "string",
                        "description": "Free-text location like 'Dubai Marina', 'JBR', 'Downtown Dubai', 'Business Bay'. Resolved server-side.",
                        "default": "Dubai Marina"
                    },
                    "locationNames": {
                        "title": "📋 Bulk Location Names (PAID)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Array of location names. PAID tier only.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationId": {
                        "title": "🆔 Location ID (used when Search Mode = bylocationid)",
                        "type": "integer",
                        "description": "Numeric Dubizzle location ID. Examples: 63 = Dubai Marina, 199 = Dubai (city). Use the autocomplete endpoint or check Dubizzle URL.",
                        "default": 63
                    },
                    "locationIds": {
                        "title": "📋 Bulk Location IDs (PAID)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Array of numeric location IDs. PAID tier only.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "latitude": {
                        "title": "🗺 Latitude (used when Search Mode = bycoordinates)",
                        "type": "string",
                        "description": "Latitude in decimal degrees. Example: 25.0805 (Dubai Marina).",
                        "default": "25.0805"
                    },
                    "longitude": {
                        "title": "🗺 Longitude (used when Search Mode = bycoordinates)",
                        "type": "string",
                        "description": "Longitude in decimal degrees. Example: 55.1403 (Dubai Marina).",
                        "default": "55.1403"
                    },
                    "radius": {
                        "title": "🧭 Radius (km)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Search radius in kilometers around the centre point.",
                        "default": 2
                    },
                    "polygon": {
                        "title": "🔷 Polygon vertices (used when Search Mode = bypolygon)",
                        "type": "string",
                        "description": "JSON array of [lat,lng] points. Minimum 3 points. Example: [[25.08,55.14],[25.10,55.14],[25.10,55.18]]"
                    },
                    "searchUrl": {
                        "title": "🔗 Dubizzle Search URL (used when Search Mode = byurl)",
                        "type": "string",
                        "description": "Paste a Dubizzle search results URL (e.g. https://www.dubizzle.com/property-for-sale/residential/dubai/)."
                    },
                    "listingId": {
                        "title": "🆔 Listing ID (used when Search Mode = byid)",
                        "type": "string",
                        "description": "Numeric Dubizzle listing_id. Must be combined with categoryId."
                    },
                    "categoryId": {
                        "title": "🏷 Category ID (used when Search Mode = byid)",
                        "type": "integer",
                        "description": "Numeric Dubizzle category_id (e.g. 31 = Apartment for Sale, 30 = Villa for Sale). Available in any search response."
                    },
                    "includeDld": {
                        "title": "🏛️ Include DLD deed data (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches Dubai Land Department (DLD) deed/building data for each listing — building registry, floor count, parking spaces, off-plan project metadata, validation URL. Adds 1 extra API call + a DldDeedEnriched charge per listing. Disabled on FREE tier.",
                        "default": false
                    },
                    "includeSimilar": {
                        "title": "🔁 Include similar listings (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches up to 12 similar listings for each result. Adds 1 extra API call + a SimilarEnriched charge per listing. Disabled on FREE tier.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
