Dubizzle.com Scraper - Property, Motors, Agents & UAE Listings
Pricing
from $1.00 / 1,000 listing results
Dubizzle.com Scraper - Property, Motors, Agents & UAE Listings
From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings. Search by filters or URLs with auto pagination. Returns price, beds, baths, area, agent/agency contacts, WhatsApp, email, GPS, photos, amenities, verification, and Dubai Land Department history.
Pricing
from $1.00 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
16
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Dubizzle Scraper: UAE Property, Motors and Agent Listings
Dubizzle Scraper turns dubizzle.com into structured data across the United Arab Emirates: property for sale, property for rent, used cars (motors) and the property agents directory. Get price, beds, baths, area, GPS coordinates, verification status, and full agent, agency and contact details on every card, plus an optional detail pass for the complete description, categorized amenities, photo gallery and Dubai Land Department transaction history. Search by city and filters, or paste any Dubizzle URL you already refined in a browser, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Four sections, one actor. Property for sale, property for rent, motors and the agents directory, across all eight UAE city slugs the site serves.
- Two ways in. Search mode builds the URL from city, price, bedrooms, area, furnishing, completion status and sort, so you don't craft links by hand. URL mode takes any Dubizzle link you already refined in a browser.
- Nothing dropped by default. Every card already returns the full nested agent, agency and contact objects, plus geocoded coordinates, even without the detail pass.
- Optional detail mode. Adds the full description, categorized amenities, agent email, permit numbers, the full photo gallery and, for Dubai property, Dubai Land Department transaction history. Billed when you turn it on, or when you paste a single listing URL in URL mode, which always returns the full detail record.
- One predictable cap. Max listings, not a page limit, decides run size and cost.
- Resumable and checkpointed runs. Point Resume at a previous run to collect only what it doesn't already have, and a run that gets restarted by the platform continues on its own instead of starting over.
- Incremental mode for recurring monitoring. Schedule the same search and get back only what actually changed, with the state tracked for you between runs.
Use Cases
- Property portals and PropTech tools: mirror live for-sale and for-rent inventory with agent contact details already attached.
- Market and pricing research: track price, area and bedroom mix across UAE cities and neighborhoods over time.
- Used-car aggregation: pull motors listings for price comparison and inventory tracking.
- Agency and lead-generation tools: build a directory of agents and agencies with phone, WhatsApp and verification status.
- Change monitoring: schedule a recurring run and get notified only when new listings appear or a tracked listing's price or details change.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing. Every record also carries
scrapedAt(when the row was fetched) anddetailMissing(true only when detail mode was on and this one listing's detail fetch didn't land this run); both are bookkeeping fields, not listing content, so they aren't shown below.
| Field | Example |
|---|---|
id | "12345678" |
url | "https://dubai.dubizzle.com/property-for-sale/residential/apartment/2026/1/1/sample-0/" |
title | "Sample Listing Title" |
price / currency | 1500000 / "AED" |
section | "property-for-sale" |
categorySlug | "apartment" |
bedrooms / bathrooms | 2 / 2 |
area / areaUnit | 1200 / "sqft" |
city / neighborhood | "Dubai" / "Sample Community" |
latitude / longitude | 25.0000 / 55.0000 |
isVerified | true |
agentName | "Agent Name" |
agencyName | "Sample Agency" |
phoneNumber / whatsapp | "+971500000000" / "+971500000000" |
addedOn | 1700000000 |
furnished / completionStatus | true / "completed" |
propertyReference | "REF-0001" |
hasDldHistory / photosCount | true / 12 |
raw | { complete upstream listing object } |
description | full text, detail mode only |
amenities | categorized facility list, detail mode only |
email | agent email, detail mode only |
dldHistory | Dubai Land Department transactions, detail mode only, Dubai property only |
changeType / changedFields | "NEW" / ["price"], incremental mode only |
firstSeenAt / lastSeenAt | ISO timestamps, incremental mode only |
Motors (used cars) and property agents directory results come through this same record shape. A motors record carries the same fields, with the property-only ones (bedrooms, bathrooms, area, completionStatus) empty; vehicle detail like make, model, mileage and year lives inside raw rather than a dedicated top-level field. A property agents record represents the agent's own profile card: agentName is the agent's own display name, phoneNumber and whatsapp are the agent's own numbers, and the property-specific fields are empty.
How to Use
- Pick a mode:
search(city and filters) orurl(paste links). - For search mode, choose the city or cities, the section (property for sale, property for rent, motors, or agents) and any filters. For URL mode, paste one or more Dubizzle links.
- Turn on Include listing details if you need the full description, amenities, email and photo gallery, and set Max listings to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search mode, basic:
{"mode": "search","locations": ["dubai"],"section": "property-for-sale","propertyType": "residential","maxListings": 20}
Search mode with filters and sort:
{"mode": "search","locations": ["dubai", "abu-dhabi"],"section": "property-for-rent","propertyType": "apartment","minPrice": 50000,"maxPrice": 150000,"minBedrooms": 1,"maxBedrooms": 2,"furnishing": "furnished","sortBy": "newest","maxListings": 50}
Motors (used cars):
{"mode": "search","locations": ["dubai"],"section": "motors","maxListings": 30}
URL mode, multiple links, with detail mode on:
{"mode": "url","urls": ["https://dubai.dubizzle.com/en/property-for-sale/residential/","https://uae.dubizzle.com/en/property-agents/"],"fetchDetails": true,"maxListings": 100}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/dubizzle-com-scraper").call(run_input={"mode": "search","locations": ["dubai"],"section": "property-for-sale","maxListings": 20,})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"], listing["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/dubizzle-com-scraper').call({mode: 'search',locations: ['dubai'],section: 'property-for-sale',maxListings: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Detail mode and the listings cap
Max listings is the one cap that decides run size; Max pages is an optional extra bound on top of it, not a substitute for it, and can be left at 0 so each search walks as deep as the source allows on its own. Detail mode (fetchDetails) adds one extra fetch per listing and is billed as a per-item surcharge only for listings that actually reach the dataset, never for one an incremental run decides to suppress. A single listing URL pasted in URL mode is always fetched as a full detail record and always carries this surcharge, even with detail mode off. Include Dubai Land Department history only takes effect when detail mode is on and the listing is a Dubai property; it's ignored everywhere else.
Resume and incremental mode (recurring updates)
Resume (resumeFromRunId) continues one specific interrupted run: paste its run or dataset id and this run skips every listing already collected there, so a follow-up run plus the original together give you the full set without double charges. The actor also checkpoints its own progress automatically within a run, so a platform restart or a retry of a failed run picks up where it stopped instead of re-collecting anything.
Incremental mode (incrementalMode) is for a different job: scheduling the same search repeatedly and getting back only what changed. The actor remembers the previous run itself, keyed on your filters (or a State key you set, unaffected by Max pages/Max listings), and classifies every listing as NEW, UPDATED (with changedFields), UNCHANGED (skipped and not billed unless Emit unchanged is on), or EXPIRED (only after a run that reached the natural end of every search or URL, with no cap hit and no Resume, and only with Emit expired on). REAPPEARED is not something a normal scheduled run produces by itself: it only appears for a listing that an earlier complete run already marked EXPIRED, and that later shows up again. Combining Incremental mode with Resume fails fast if that search already has saved incremental state; combining them the first time, before any state exists, is fine and bootstraps a new monitoring baseline from the resumed dataset.
What Incremental mode compares. Every listing field takes part in the comparison, including price, title, bedrooms, area, agent and agency details and, with detail mode on, description, amenities, photos and permit. Left out of the comparison but kept in the output: the scrape timestamp, the detail-fetch status flag, the raw detail payload, the Dubai Land Department history (so a new transaction alone does not mark a listing UPDATED), and the promotion flags promoted, featuredListing and highlightedAd together with the same three flags inside the raw card (raw.promoted, raw.featured_listing, raw.highlighted_ad), which flip with paid promotion rather than with the listing itself. Use Ignore fields when detecting changes (incremental mode only) (ignoreFieldsForChanges) to leave out more: a top-level name such as price, or a dotted path such as raw.some_field for a nested value. Ignored fields stay in every row and never appear in changedFields. Changing the ignore list does not mark tracked listings UPDATED by itself. A run that starts from a pasted URL at ?page=2 or later, or that is capped, never produces EXPIRED rows, because it did not see the whole search.
URL shapes
| Shape | Example | Notes |
|---|---|---|
| City property search | https://dubai.dubizzle.com/en/property-for-sale/residential/ | Walks pages from 1. Live-verified; part of the default |
| Paginated | https://dubai.dubizzle.com/en/property-for-sale/residential/?page=2 | Starts from the given page; same confirmed path as above, with the page parameter the search mode walks |
| Rent sub-category | https://dubai.dubizzle.com/en/property-for-rent/residential/apartmentflat/ | Any property sub-category path. Not live-verified in URL mode |
| Motors listing | https://dubai.dubizzle.com/motors/used-cars/ | No /en/ prefix. Not live-verified in URL mode |
| Agents directory | https://uae.dubizzle.com/en/property-agents/ | Not live-verified in URL mode; the Agents section of search mode is the supported route |
| Single listing permalink | a listing page link | Returned as a full detail record |
A link with the Arabic /ar/ prefix, a non-Dubizzle link, or a page that is not a property, motors or agents page logs a clear warning for that URL instead of failing silently. In search mode, Locations accepts typed city names such as Abu Dhabi or Ras Al Khaimah; a name that matches no city stops the run with an error.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search builds the URL from filters; url scrapes pasted URLs. |
locations | array | none (prefill: ["dubai"]) | City slugs: dubai, abu-dhabi, sharjah, ras-al-khaimah, ajman, fujairah, umm-al-quwain, al-ain. Search mode. If left empty, the actor still searches Dubai, a code fallback rather than a schema default. |
section | string | property-for-sale | property-for-sale, property-for-rent, motors, or property-agents. Search mode. |
propertyType | string | residential | Property sub-type for the property sections. Search mode. |
minPrice | integer | none | Minimum price in AED. Search mode. |
maxPrice | integer | none | Maximum price in AED. Search mode. |
minBedrooms | integer | none | Minimum bedrooms. Property sections. |
maxBedrooms | integer | none | Maximum bedrooms. Property sections. |
minArea | integer | none | Minimum built-up area in sqft. Property sections. |
maxArea | integer | none | Maximum built-up area in sqft. Property sections. |
furnishing | string | any | any, furnished, unfurnished. Property sections. |
completionStatus | string | any | any, completed, off-plan. Property sections. |
sortBy | string | popular | popular, newest, oldest, price-asc, price-desc, verified. Search mode. |
urls | array | the two default example URLs (see URL shapes) | Full Dubizzle URLs. URL mode. Filter fields are ignored here. Leaving the field untouched in URL mode now scrapes the two default examples instead of nothing; send an empty list to scrape nothing. |
maxPages | integer | 0 | Optional bound on pages per search or URL. 0 = walk as deep as the source serves, stopping on its own at the storefront's reported total or a repeated page. Does not cap listings; use Max listings for that. |
maxListings | integer | 20 | The single result cap. 0 = unlimited, bounded by Max pages or the storefront total. |
fetchDetails | boolean | false | Include the full record for each listing (description, amenities, email, full photo gallery, permit numbers). Billed as a per-item surcharge. |
includeDldHistory | boolean | true | With detail mode on, also pull Dubai Land Department history for Dubai property listings. Ignored otherwise. |
resumeFromRunId | string | none | ID of a previous run (or dataset) of this actor. Listings already there are skipped, so this run returns only new ones. |
incrementalMode | boolean | false | For a scheduled run against the same search. Classifies every listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against remembered state. |
stateKey | string | none | Names the monitoring campaign so it keeps its own baseline. Left empty, one is auto-derived from your search filters. Incremental mode only. |
emitUnchanged | boolean | false | Also return (and bill) UNCHANGED listings every run. Incremental mode only. |
emitExpired | boolean | false | Also return (and bill) a one-time EXPIRED row for a tracked listing that disappeared, only after a run that reached the natural end of the search. Incremental mode only. |
ignoreFieldsForChanges | array | [] | Field names or dotted paths to leave out of change detection. Ignored fields stay in the output. Incremental mode only. |
proxy | object | none (prefill: Apify Residential, country AE) | Connection settings. If this field is omitted, the actor falls back to its own built-in backup connection instead of Apify Residential and logs a warning; see Plan Requirement below. |
mcpConnectors | array | none | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": "12345678","url": "https://dubai.dubizzle.com/property-for-sale/residential/apartment/2026/1/1/sample-0/","title": "Sample Listing Title","price": 1500000,"currency": "AED","section": "property-for-sale","categorySlug": "apartment","bedrooms": 2,"bathrooms": 2,"area": 1200,"areaUnit": "sqft","city": "Dubai","neighborhood": "Sample Community","latitude": 25.0000,"longitude": 55.0000,"isVerified": true,"agentName": "Agent Name","agencyName": "Sample Agency","phoneNumber": "+971500000000","whatsapp": "+971500000000","addedOn": 1700000000,"furnished": true,"completionStatus": "completed","propertyReference": "REF-0001","hasDldHistory": true,"photosCount": 12,"isPremium": false,"recordType": "listing","detailMissing": false,"scrapedAt": "2026-01-01T00:00:00Z","raw": { "external_id": 12345678, "name": { "en": "Sample Listing Title" } }}
Plan Requirement
Dubizzle sits behind an interstitial ("Pardon Our Interruption") that is served with a normal HTTP 200 status, so a plain request on a datacenter connection does not get listings. Datacenter proxies are not enough: keep the prefilled Connection setting (Apify Residential proxy, country AE), which needs a paid Apify plan. The actor then clears the interstitial with its own browser step before reading pages.
If the Connection field is left unset, the actor falls back to its own built-in backup connection and can return few or no listings.
What you see when the connection is the problem:
- Warning in the log: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable."
- Info in the log: "Served over the backup connection (the default connection was unavailable)." when the backup served the pages.
- Run fails (no page could be read) with one of: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required" (every connection refused), "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Dubizzle pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." A run that could not read any page is marked failed, never a quiet empty success.
A single listing URL pasted in URL mode is always fetched as a full detail record and carries the detail surcharge, even with detail mode off.
Pricing
You pay per listing that reaches the dataset, a surcharge only for listings where detail mode actually fetched extra data, and a small per-run start event. Failed or suppressed rows are never billed. In Incremental mode UNCHANGED rows are skipped and not billed unless Emit unchanged is on, and EXPIRED rows are billed only when Emit expired is on. The Pricing tab shows the current rates.
Output views and extra fields
The dataset has three views: Overview (core card fields plus the incremental columns), Detail (description, amenities, photos, emails, permit, payment plan, Dubai Land Department history) and Changes (id, url, title, price and change columns for incremental runs). Multi-search runs also store an OUTPUT summary per search.
Cards now also carry additive fields lifted from the live card: coordinates, tourUrl, videoUrl, tour360, building, neighborhoods, hasWhatsappNumber, and the agency fields agencySlug and agencyLogo. The promotion flags featuredListing, promoted and highlightedAd are also in every row. Detail records add contactEmail and contactWebsite. Fields are null when the listing has no value for them. The promotion flags are left out of change detection (see What Incremental mode compares), and tracked listings are not re-marked UPDATED just because these fields now exist.
Default input change
In URL mode, leaving Urls untouched now scrapes the two default example URLs (see URL shapes) instead of nothing. Send an empty list to scrape nothing.
FAQ
How much does it cost?
You pay per listing returned, plus a surcharge only for listings where detail mode actually fetched extra data. The Pricing tab shows current rates. Use Max listings to cap the cost of any run.
Is it legal to scrape Dubizzle?
This actor collects only publicly available listing data. You are responsible for how you use it: follow Dubizzle's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Contact details on a listing belong to the person or agency that posted it, so handle them accordingly.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab against the same search and turn on Incremental mode. Each run then returns only NEW and UPDATED listings, unchanged ones are skipped and not billed, and EXPIRED only appears once a full, uncapped, non-resumed run has confirmed a tracked listing is really gone.
What's the difference between Resume and Incremental mode?
Resume continues one specific interrupted run from a pasted run or dataset id, useful for a single very large one-off collection. Incremental mode is for a recurring, scheduled run against the same search: the actor remembers state itself between runs, no id to paste. They solve different problems and can be combined once, to bootstrap a new monitoring baseline from an existing dataset, but not once that baseline already exists.
Why did my run fail instead of returning an empty dataset?
A run stops with a clear error when no results page could be loaded (see Plan Requirement), when resumeFromRunId points to a run or dataset it cannot read, when Incremental mode is combined with Resume on a search that already has saved incremental state, or when a Locations entry in search mode matches no known city (a name that matches no city stops the run with an error instead of silently searching somewhere else). Everything else, an empty URLs list in URL mode, or a scheduled Incremental run where nothing changed since last time, finishes as a normal successful run that simply returns zero or few rows. An empty Locations input in search mode does not return zero rows; it falls back to searching Dubai.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each result into Notion, Linear or Airtable.
๐ Want more car data?
Pair this actor with these related scrapers from the same team:
| ๐ Trade Me NZ Scraper Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property... | ๐ท๏ธ Gumtree.com Scraper Scrape Gumtree.com classifieds across motors, property, jobs, services, pets and goods... |
| ๐ท๏ธ Avito.ru Scraper From $1/1K. Scrape structured listings from Avito.ru by region, category, filters, or... | ๐ท๏ธ Subito.it Scraper Scrape Subito.it listings across cars, real estate, marketplace, jobs, and more. Search... |
| ๐ท๏ธ Gumtree AU Scraper Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real... | ๐ท๏ธ Kleinanzeigen.de Scraper From $1/1K. Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.