Dubizzle.com Scraper at a glance
Dubizzle.com Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, url, title, price and cur, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Lead Generation, Automation
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 27 options
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.
What Dubizzle.com Scraper can do
- 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.
Choose what to collect
These inputs let you configure Dubizzle.com Scraper - Property, Motors, Agents & UAE Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search mode = pick city + section + filters below and the scraper builds the URL for you. URL mode = paste any dubizzle.com listing URL(s) you already refined in a browser. URL mode supports multiple URLs. |
locationsarray | One or more UAE cities, typed naturally ('Abu Dhabi', 'Ras Al Khaimah') or as URL slugs ('abu-dhabi', 'ras-al-khaimah'): Dubai, Abu Dhabi, Sharjah, Ajman, Ras Al Khaimah, Umm Al Quwain, Fujairah, Al Ain. An unknown name stops the run with a clear error. For sub-areas use the city slug; refine further with neighborhood in URL mode. |
sectionstring | Which Dubizzle vertical to search. Property for sale / rent, used motors (cars), or property agents directory. |
propertyTypestring | Property sub-type. 'residential' includes everything residential. Applies only to the property sections. |
minPriceinteger | Minimum price filter in AED. Leave empty for no minimum. Search mode only. |
maxPriceinteger | Maximum price filter in AED. Leave empty for no maximum. Search mode only. |
minBedroomsinteger | Minimum bedrooms (0 = studio). Property sections only. |
Show 20 more inputs
| Input | What it controls |
|---|---|
maxBedroomsinteger | Maximum bedrooms. Property sections only. |
minAreainteger | Minimum built-up area in square feet. Property sections only. |
maxAreainteger | Maximum built-up area in square feet. Property sections only. |
furnishingstring | Furnishing filter. Property sections only. |
completionStatusstring | Completed = ready to move in. Off-plan = under construction / pre-launch. Property sections only. |
sortBystring | How to order results. Search mode only - in URL mode the sort is taken from your pasted URL. |
urlsarray | One or more full dubizzle.com URLs (property, motors, or agents). Multi-URL supported. Filter-mode fields (city, section, price, beds, etc.) are ignored in URL mode - paste the URL exactly as Dubizzle produced it, including any filters. A URL ending with ?page=N starts from that page. |
maxPagesinteger | Optional bound on result pages walked per location / URL. Dubizzle returns ~35 listings per page. Default 0 = walk as deep as the source serves: the run stops on its own once the storefront's reported total is reached or a page returns no new listings. This does NOT cap the number of listings; use Max listings for that. |
maxListingsinteger | The single cap on this run. Default 20 keeps first runs cheap and fast. Set 0 for unlimited (then the run stops at the storefront total / Max pages). |
fetchDetailsboolean | Adds the full description, categorized amenities, agent email + agency license, the full photo gallery (vs SERP cover photo only), RERA/Trakheesi permit, off-plan payment plans, and (for Dubai property) the Dubai Land Department transaction history. Turn off for a faster, cheaper run with just the SERP fields (which already include lat/lng, agent phone, WhatsApp, and basic agency info). Each detail page is an extra fetch, so this run costs a per-item surcharge when enabled. |
includeDldHistoryboolean | When detail mode is on, also pull the Dubai Land Department transaction history for Dubai property listings (past sale prices and dates for the building). Ignored when detail mode is off or for non-Dubai listings. |
resumeFromRunIdstring | Optional. ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings not seen before. Combine both runs' datasets for the full set. Max listings then counts only the new listings. The actor also checkpoints its own progress automatically, so a platform migration or a Resurrect of a FAILED/ABORTED run continues that same run without re-collecting or re-charging what it already pushed. For a recurring/scheduled monitoring campaign against the SAME search instead, use Incremental mode below - the two are complementary, not interchangeable, and combining them on a search with no prior incremental state bootstraps that state from this resumed dataset. |
incrementalModeboolean | For a scheduled/recurring run against the SAME search. When on, the actor remembers the previous run's listings itself (keyed on your filters, see State key) and classifies every listing as NEW, UPDATED, REAPPEARED, or UNCHANGED - UNCHANGED listings are skipped (not pushed, not charged) unless Emit unchanged is on. Compared: every listing field including price, title, bedrooms, area, agent and agency details, and (with details on) description, amenities, photos and permit. Excluded from the comparison but kept in the output: the scrape timestamp, the detail-fetch status flag, the raw detail payload, the Dubai Land Department history, the promotion flags (promoted, featuredListing, highlightedAd, and the same three flags inside raw: raw.promoted, raw.featured_listing, raw.highlighted_ad), plus anything you list in Ignore fields. This is different from Resume above, which continues one specific interrupted run from a pasted run/dataset ID rather than remembering state itself. |
stateKeystring | Optional. Name this monitoring campaign so it keeps its own baseline regardless of which caps you happen to pass. Leave empty to auto-derive one from your search filters (city, section, price, bedrooms, etc. - Max pages/Max listings never affect it, so raising or lowering those does not fork a new baseline or re-bill your whole search). Only relevant when Incremental mode is on. |
emitUnchangedboolean | When off (default), a listing identical to the last incremental run is skipped entirely - not pushed, not charged. Turn on to also emit UNCHANGED rows in the dataset (still marked changeType: UNCHANGED). This returns and bills every listing every run, defeating the point of incremental mode for most users - leave off unless you specifically need the full set every time. Only relevant when Incremental mode is on. |
emitExpiredboolean | When on, a listing tracked by a previous incremental run that no longer appears is emitted once as changeType: EXPIRED (this returns and bills one extra row per delisted listing). Only fires after a run that reached the natural end of every search/URL with no cap hit and no Resume - a capped or resumed run cannot tell "delisted" apart from "not reached yet", so it is skipped that run and retried next time. Only relevant when Incremental mode is on. |
ignoreFieldsForChangesarray | Optional. Field names to leave out of change detection, in addition to the built-in handling (the scrape timestamp, the detail-fetch status flag, the raw detail payload, the Dubai Land Department history, the promotion flags promoted / featuredListing / highlightedAd and raw.promoted / raw.featured_listing / raw.highlighted_ad never trigger UPDATED). Use a top-level name such as price, or a dotted path such as raw.some_field for a nested value. Ignored fields stay in the output. Only used when Incremental mode is on. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON - the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)urlURL (link)titleTitle (text)pricePrice (number)currencyCur (text)sectionSection (text)categorySlugType (text)bedroomsBeds (number)bathroomsBaths (number)areaArea (number)areaUnitUnit (text)cityCity (text)Show 24 more fields
neighborhoodNeighborhood (text)latitudeLat (number)longitudeLng (number)isVerifiedVerified (boolean)agentNameAgent (text)agencyNameAgency (text)phoneNumberPhone (text)whatsappWhatsApp (text)addedOnAdded (text)detailMissingDetail missing (boolean)changeTypeChange (text)changedFieldsChanged fields (array)firstSeenAtFirst seen (text)lastSeenAtLast seen (text)recordTypeRecord type (text)descriptiondescription (text)amenitiesamenities (array)photosphotos (array)emailemail (text)contactEmailContact email (text)contactWebsiteContact website (text)reraPermitPermit (object)paymentPlanPayment plan (object)dldHistoryDLD history (object)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"longitude": 55,
"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"
}
}
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Dubizzle.com Scraper return?
The documented output for Dubizzle.com Scraper includes id, url, title, price, cur, section, type and beds. Availability of each field depends on the source page and the selected mode.
How much does Dubizzle.com Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
