# Dubizzle UAE Scraper (`datascrapers/dubizzle-scraper`) Actor

Scrape Dubizzle UAE listings across motors, property, jobs, classifieds, and community — from start URLs, keywords, or category filters.

- **URL**: https://apify.com/datascrapers/dubizzle-scraper.md
- **Developed by:** [Farhan Ali](https://apify.com/datascrapers) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.97 / 1,000 listings

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

**Dubizzle UAE Scraper** creates a structured dataset of classified listings collected from [Dubizzle](https://uae.dubizzle.com), the UAE's largest classifieds marketplace. Each dataset item represents one listing across motors, property, jobs, classifieds, or community sections, and can include price, location, photos, vehicle or property attributes, and seller details, with optional listing details and contact phone numbers. Query the source by Dubizzle URL, keyword, or category and city, control the result limit with `maxItems` and `maxPages`, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or other supported formats.

### Dataset at a glance

| Property | Value |
|---|---|
| Source | dubizzle.com (Dubai, Abu Dhabi, and all seven emirates) |
| Record unit | One classified listing, with optional nested attributes and seller fields |
| Input methods | Dubizzle URL (`startUrls`), keyword (`searchQueries`), or category + city |
| Main identifiers | `listingId`, listing `url` |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML, HTML (Apify dataset exports) |
| Update model | Fresh records per Actor run |
| Pricing | $1 per 1,000 listings; +$1 per 1,000 for details; +$1 per 1,000 for contact details |

### Coverage and available records

The Actor collects listings from public Dubizzle pages using three entry points:

- **URL-based**: Pass Dubizzle search, category, or listing URLs in `startUrls`. Filters already in the URL are kept.
- **Keyword-based**: Pass keywords (for example `"toyota land cruiser"`) in `searchQueries`, optionally combined with a category and city.
- **Category-based**: Set `category` and `city` to scrape a marketplace vertical directly.

Supported categories: `motors` (used cars, rental cars, number plates), `jobs`, `property-for-rent` and `property-for-sale` (residential and commercial), `classified`, and `community`. City scope covers all UAE, Dubai, Abu Dhabi, Sharjah, Ajman, Al Ain, Ras Al Khaimah, Fujairah, and Umm Al Quwain.

Record types and limits:

- **Listing-level records** are always collected: ID, URL, title, price, currency, section, category, city, location, photos, and attributes.
- **Detail fields** are conditional: longer descriptions, seller, coordinates, and extra attributes are returned when `fetchDetails` is enabled.
- **Contact fields** are conditional: seller phone (and WhatsApp/email when present) is returned when `fetchContactDetails` is enabled and a number is extracted.
- **Result cap**: `maxItems` limits the number of listings (`0` means unlimited); `maxPages` limits search-result pages per URL or query (each page holds 25 listings).

Known exclusions: contact numbers are returned only when a number is actually revealed; each run captures page state at run time (no historical snapshots).

### Data dictionary

Field names below match dataset record JSON properties exactly. Fields marked *conditional* appear only when the corresponding input toggle is enabled.

| Field | Type | Nullable | Description | Example |
|---|---:|---|---|---|
| `listingId` | string | No | Dubizzle listing identifier; best stable deduplication key | `16927424` |
| `url` | string | No | Canonical listing URL | `https://dubai.dubizzle.com/motors/used-cars/...` |
| `title` | string | No | Listing title | `Toyota Land Cruiser LC 76 LX 2026 GCC Specs...` |
| `price` | number | Yes | Asking price | `225000.0` |
| `currency` | string | Yes | Currency code | `AED` |
| `section` | string | Yes | Marketplace section | `motors` |
| `category` | string | Yes | Category breadcrumb | `Used Cars > Toyota > Land Cruiser 70 Series` |
| `city` | string | Yes | City / emirate | `Dubai` |
| `location` | string | Yes | Full address | `Ras Al Khor Industrial 2, ... Dubai, UAE` |
| `photos` | string\[] | Yes | Photo URLs | `["https://dbz-images.dubizzle.com/...", ...]` |
| `photosCount` | number | Yes | Number of photos | `14` |
| `attributes.make` | string | Yes | Vehicle make (motors) | `Toyota` |
| `attributes.model` | string | Yes | Vehicle model (motors) | `Land Cruiser 70 Series` |
| `attributes.year` | number | Yes | Vehicle year (motors) | `2026` |
| `attributes.kilometers` | number | Yes | Mileage (motors) | `0` |
| `attributes.fuel_type` | string | Yes | Fuel type (motors) | `Diesel` |
| `attributes.transmission_type` | string | Yes | Transmission (motors) | `Manual Transmission` |
| `attributes.body_type` | string | Yes | Body type (motors) | `SUV` |
| `seller.type` | string | Yes | Seller type code | `IN` |
| `seller.name` | string | Yes | Seller or agent name | `Alkady Cars` |
| `seller.phone` | string | Yes | Seller phone (conditional — `fetchContactDetails`) | `+971564020120` |
| `phoneNumber` | string | Yes | Revealed phone number (conditional — `fetchContactDetails`) | `+971564020120` |
| `latitude` | number | Yes | Map latitude (conditional — `fetchDetails`) | `25.17729372` |
| `longitude` | number | Yes | Map longitude (conditional — `fetchDetails`) | `55.35740405` |
| `postedAt` | string | Yes | Date posted (ISO 8601) | `2026-08-20T09:47:51+00:00` |
| `sourceQuery` | string | Yes | Query that produced the record | `toyota` |
| `detailFetched` | boolean | No | Whether detail enrichment succeeded | `true` |
| `contactFetched` | boolean | No | Whether contact extraction succeeded | `true` |

### Example dataset record

Real record produced with a keyword search (`searchQueries: ["toyota"]`), category `motors/used-cars`, city `dubai`, with details and contact details enabled. The `photos` array is truncated for readability.

```json
{
  "listingId": "16927424",
  "url": "https://dubai.dubizzle.com/motors/used-cars/toyota/land-cruiser-70-series/2026/7/31/toyota-land-cruiser-lc-76-lx-2026-gcc-spec-2-297---b1b8f42ceb9148069f95e69e262e24a7/",
  "title": "Toyota Land Cruiser LC 76 LX 2026 GCC Specs DIFF LOCK , WINCH",
  "price": 225000.0,
  "currency": "AED",
  "section": "motors",
  "category": "Used Cars > Toyota > Land Cruiser 70 Series",
  "city": "Dubai",
  "location": "Ras Al Khor Industrial 2, Ras Al Khor Industrial, Ras Al Khor, Dubai, UAE",
  "photos": ["https://dbz-images.dubizzle.com/images/2026/07/31/e0ac29bb7d90484e96e6019b83ee0fab-.jpg?impolicy=dpv"],
  "photosCount": 14,
  "attributes": {
    "make": "Toyota",
    "model": "Land Cruiser 70 Series",
    "year": 2026,
    "kilometers": 0,
    "fuel_type": "Diesel",
    "transmission_type": "Manual Transmission",
    "body_type": "SUV"
  },
  "seller": {
    "type": "IN",
    "name": "Alkady Cars",
    "phone": "+971564020120"
  },
  "phoneNumber": "+971564020120",
  "latitude": 25.17729372,
  "longitude": 55.35740405,
  "postedAt": "2026-08-20T09:47:51+00:00",
  "sourceQuery": "toyota",
  "detailFetched": true,
  "contactFetched": true
}
```

The record above was produced with this input:

```json
{
  "searchQueries": ["toyota"],
  "category": "motors/used-cars",
  "city": "dubai",
  "maxItems": 100,
  "maxPages": 5,
  "fetchDetails": true,
  "fetchContactDetails": true,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AE" }
}
```

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
| `startUrls` | array (requestListSources) | No\* | prefill URL | Dubizzle search, category, or listing URLs | URL-based entry point; filters in the URL are kept |
| `searchQueries` | array (stringList) | No\* | — | Keywords (e.g. `"toyota land cruiser"`) | Keyword search, combined with category and city |
| `category` | string | No | `""` | `motors`, `motors/used-cars`, `motors/rental-cars`, `motors/number-plates`, `jobs`, `property-for-rent`, `property-for-rent/residential`, `property-for-rent/commercial`, `property-for-sale`, `property-for-sale/residential`, `property-for-sale/commercial`, `classified`, `community` | Marketplace vertical |
| `city` | string | No | `uae` | `uae`, `dubai`, `abu-dhabi`, `sharjah`, `ajman`, `al-ain`, `ras-al-khaimah`, `fujairah`, `umm-al-quwain` | Geographic scope |
| `priceMin` | integer | No | — | `0` or positive integer | Minimum price in AED |
| `priceMax` | integer | No | — | `0` or positive integer | Maximum price in AED |
| `maxItems` | integer | No | `0` | `0` (unlimited) or positive integer | Maximum listings to collect |
| `maxPages` | integer | No | `0` | `0` (until results run out) or positive integer | Maximum pages per URL or query (25 listings per page) |
| `fetchDetails` | boolean | No | `false` | `true` / `false` | Fetch full listing details (charged as listing details) |
| `fetchContactDetails` | boolean | No | `false` | `true` / `false` | Reveal seller phone/WhatsApp (charged as contact details) |
| `proxyConfiguration` | object | No | Apify proxy, `RESIDENTIAL`, country `AE` | Apify proxy groups or custom proxies | Residential UAE proxies are recommended |

\* Provide `startUrls`, `searchQueries`, or a `category` — at least one source is required.

Minimal request:

```json
{ "category": "motors/used-cars", "city": "dubai" }
```

Advanced request (keyword search with enrichment):

```json
{
  "searchQueries": ["toyota land cruiser", "bmw x5"],
  "category": "motors/used-cars",
  "city": "dubai",
  "priceMax": 250000,
  "maxItems": 100,
  "maxPages": 5,
  "fetchDetails": true,
  "fetchContactDetails": true,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AE" }
}
```

### Retrieve the data through the API

The Actor runs on the Apify platform, so there is no server to host and no crawling infrastructure to maintain.

1. Start the Actor with a JSON input (console or API).
2. Wait for the run to finish, or use a synchronous endpoint if you want the response inline.
3. Retrieve items from the run's default dataset.
4. Paginate or export the dataset.

Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR-APIFY-TOKEN")

run_input = {
    "category": "motors/used-cars",
    "city": "dubai",
    "maxItems": 100,
}

run = client.actor("datascrapers/dubizzle-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["listingId"], item["title"], item["price"], item["currency"])
```

Apify generates ready-to-run Python, JavaScript, and cURL examples on the Actor's API tab. Do not put a real API token in shared code or URLs.

### Data quality and record handling

- **Conditional fields**: latitude, longitude, and extra attributes are present only when `fetchDetails` is enabled; `phoneNumber` and seller phone are present only when `fetchContactDetails` is enabled and a number is extracted.
- **Source changes**: Dubizzle page structure and values can change; unreadable fields are returned as null rather than fabricated.
- **Deduplication**: each run appends fresh records; the Actor does not deduplicate listings across runs. Use `listingId` as the stable key and filter repeated runs against previously stored IDs.
- **Rate limits**: Dubizzle can rate-limit automated traffic; residential UAE proxies are recommended for consistent coverage.
- **Normalization**: `price` is a numeric AED value; `postedAt` is an ISO 8601 UTC timestamp. `detailFetched` and `contactFetched` record whether each enrichment succeeded.

### Export and pipeline examples

| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL / Supabase | Dataset API poll or webhook consumer | Store vehicle or property inventory with price history |
| Google Sheets | Apify Google Sheets integration | Share market shortlists with dealers |
| CRM (HubSpot, Salesforce) | Webhook on run completion | Push new listings into lead pipelines |
| S3 / cloud storage | Scheduled export via Apify scheduler + integration | Archival of market snapshots |

### Pricing and cost examples

The Actor uses pay-per-event pricing with three chargeable events, all billed per 1,000 events:

| Event | Trigger | Rate |
|---|---|---|
| Listing | Every listing record pushed to the dataset | $1 per 1,000 |
| Listing details | `fetchDetails` enabled, listing enriched | $1 per 1,000 |
| Contact details | `fetchContactDetails` enabled, phone extracted | $1 per 1,000 |

Example costs:

| Records | Configuration | Estimated base cost |
|---:|---|---:|
| 1,000 | Listing only | $1.00 |
| 10,000 | Listing only | $10.00 |
| 1,000 | Listing + details | $2.00 |
| 1,000 | Listing + details + contact details | $3.00 |

Apify paid plans reduce the per-1,000 rate. Contact details are charged only when a phone number is actually extracted. Estimates depend on the verified pricing model and the options selected for the run.

### Limitations and responsible data use

- The Actor collects publicly accessible data from Dubizzle pages only.
- Field availability depends on what Dubizzle renders at run time; some values can be null or missing, and site changes can alter fields.
- Detail and contact fields are only collected when their toggles are enabled, and phone numbers are returned only when actually revealed.
- The Actor does not provide historical snapshots unless you store them yourself.
- Large runs require residential proxies; without them, coverage may degrade due to rate limiting.
- You are responsible for compliance with Dubizzle's terms of service, applicable privacy law, and any contractual obligations before using the data.

### Dataset questions

#### What does one dataset item represent?

One classified listing from Dubizzle. Vehicle or property attributes and seller details are nested inside the same record, so a listing with full details still produces a single dataset item.

#### Which field should I use as a unique identifier?

`listingId` is the stable Dubizzle listing identifier and is the recommended deduplication key. The `url` (canonical listing URL) is a reasonable secondary key.

#### Are fields nullable or conditional?

Yes. Latitude, longitude, and extra attributes exist only when `fetchDetails` is enabled; `phoneNumber` and seller phone exist only when `fetchContactDetails` is enabled and a number is extracted. Within available records, fields that Dubizzle does not render are returned as null.

#### Can I retrieve the records as CSV or JSON?

Yes. The dataset can be exported as JSON, CSV, Excel, XML, or HTML from the Apify Console, and queried through the Dataset API.

#### Does the Actor return historical data?

No. Each run captures the state of the pages at run time. To track price changes over time, schedule repeated runs and store the outputs yourself.

#### What counts as a billable result?

Three pay-per-event charges apply: a listing charge for every record ($1 per 1,000), a listing-details charge for each enriched listing ($1 per 1,000), and a contact-details charge for each phone extracted ($1 per 1,000). A listing-only run incurs only the listing charge.

#### Which sections can I scrape?

The Actor covers motors (used cars, rental cars, number plates), jobs, property for rent and for sale (residential and commercial), classifieds, and community sections across all seven emirates.

### Related datasets from Data Scrapers

- **[Zoopla Scraper](https://apify.com/datascrapers/zoopla-scraper)** — UK property listings for comparative real estate market research.
- **[Cars Scraper](https://apify.com/datascrapers/cars-scraper)** — US vehicle listings that can be compared with the UAE motors market.
- **[Apartments Scraper](https://apify.com/datascrapers/apartments-scraper)** — US rental listings for cross-market property analysis.

### Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.

# Actor input Schema

## `startUrls` (type: `array`):

Dubizzle search, category, or listing URLs from dubai.dubizzle.com, uae.dubizzle.com, or other emirate sites (e.g. https://uae.dubizzle.com/motors/used-cars/ or a single listing URL). Filters already in the URL are kept.

## `searchQueries` (type: `array`):

Keywords to search on Dubizzle (e.g. "toyota land cruiser", "studio marina", "driver dubai"). Combined with Category and City when those are set.

## `category` (type: `string`):

Marketplace vertical when you are not pasting a URL. Used with search queries and as a standalone scrape target.

## `city` (type: `string`):

Geographic scope for category and keyword searches. Ignored when a start URL already includes a city subdomain.

## `priceMin` (type: `integer`):

Optional lower price bound applied to search results.

## `priceMax` (type: `integer`):

Optional upper price bound applied to search results.

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

Maximum number of listings to scrape (0 = unlimited).

## `maxPages` (type: `integer`):

Maximum search result pages per start URL or query (0 = until results run out or maxItems is reached). Each page has 25 listings.

## `fetchDetails` (type: `boolean`):

Fetch the full listing JSON for longer descriptions, seller, coordinates, and extra attributes. Search results already include title, price, photos, location, and attributes. Charges the listing-details event per listing that is successfully enriched, in addition to dataset-item. Off by default.

## `fetchContactDetails` (type: `boolean`):

Reveal the seller or agent phone number (and WhatsApp / email when present). Charges the contact-details event only when a number is actually extracted. Off by default.

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

Apify Residential proxies in the UAE are recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://uae.dubizzle.com/motors/used-cars/"
    }
  ],
  "category": "",
  "city": "uae",
  "maxItems": 25,
  "maxPages": 1,
  "fetchDetails": false,
  "fetchContactDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}
```

# Actor output Schema

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

Scraped Dubizzle listings

## `runStats` (type: `string`):

Record count and timestamps for this run

## `input` (type: `string`):

Input configuration stored for this run

# 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 = {
    "startUrls": [
        {
            "url": "https://uae.dubizzle.com/motors/used-cars/"
        }
    ],
    "maxItems": 25,
    "maxPages": 1,
    "fetchDetails": false,
    "fetchContactDetails": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/dubizzle-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 = {
    "startUrls": [{ "url": "https://uae.dubizzle.com/motors/used-cars/" }],
    "maxItems": 25,
    "maxPages": 1,
    "fetchDetails": False,
    "fetchContactDetails": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AE",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://uae.dubizzle.com/motors/used-cars/"
    }
  ],
  "maxItems": 25,
  "maxPages": 1,
  "fetchDetails": false,
  "fetchContactDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}' |
apify call datascrapers/dubizzle-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascrapers/dubizzle-scraper"
        }
    }
}

```

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

## OpenAPI specification

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