logoPandorLabs
Shopping

Dubizzle UAE Listings

Dubizzle classifieds across the UAE — cars, property, electronics, furniture, jobs and more — by search term, emirate, category and price, with AED prices, listing attributes, seller type, photos and posting dates. Filter to recently posted listings to monitor a search for new items.

dubizzle-listingsdubizzleuaedubaiclassifiedsmarketplaceshoppingmonitoring

0 rows in the dataset

Download the dataset

Get every row this scraper has collected as one CSV or JSONL file. If the data is older than maxAgeHours, the scraper is re-run with its configured settings first. The key needs the datasets:export scope.

DOWNLOAD_ID=$(curl -s -X POST "https://api.pandorlabs.com/v1/datasets/dubizzle-listings/downloads" \  -H "Authorization: Bearer $PANDORLABS_KEY" \  -H "Content-Type: application/json" \  -d '{"maxAgeHours":24,"format":"csv"}' | jq -r '.id')while true; do  STATUS=$(curl -s "https://api.pandorlabs.com/v1/downloads/$DOWNLOAD_ID" \    -H "Authorization: Bearer $PANDORLABS_KEY" | jq -r '.status')  [ "$STATUS" != "refreshing" ] && break  sleep 5donecurl -s "https://api.pandorlabs.com/v1/downloads/$DOWNLOAD_ID/file" \  -H "Authorization: Bearer $PANDORLABS_KEY" \  -o dataset.csv

The rate is 1 credit per 100 rows cached and 2 credits live, charged on the rows in the dataset when the download becomes ready. A failed refresh is not charged. The file stays downloadable for 24 hours. See pricing.

Start a run

To choose the targets yourself, send the parameters below as input. The call returns 202 with the run; the key needs the scrapers:run scope and the account a positive credit balance.

curl -X POST "https://api.pandorlabs.com/v1/scrapers/dubizzle-listings/runs" \  -H "Authorization: Bearer $PANDORLABS_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "queries": [        "iphone 15 pro",        "land cruiser",        "ps5"      ],      "emirates": [        "dubai"      ],      "categories": [        "motors/used-cars",        "classified/mobile-phones-pdas"      ],      "minPrice": 0    }  }'

A run is billed at the live rate once it finishes: 2 credits per 100 rows it collected. A run that collects nothing costs nothing.

Parameters

Every parameter is optional. Anything you leave out uses the default shown here; an unknown name or an invalid value is rejected with a 400 that lists each problem.

Targeting

  • queries

    string[]

    Search terms

    One search per term, the same as typing it into the Dubizzle search bar. Leave empty to list everything that matches the other filters.

    Default
    none
    Example
    iphone 15 pro, land cruiser, ps5
  • emirates

    enum[]

    Emirates

    Leave empty to search all of the UAE.

    Default
    none
    Allowed values
    dubai
    abu-dhabi
    sharjah
    ajman
    ras-al-khaimah
    fujairah
    umm-al-quwain
    al-ain
  • categories

    string[]

    Categories

    Dubizzle category paths or category page URLs. Top level: motors, property-for-sale, property-for-rent, classified, jobs, jobs-wanted, community. Deeper paths such as motors/used-cars/toyota narrow further. Leave empty for every category.

    Default
    none
    Example
    motors/used-cars, classified/mobile-phones-pdas

Filters

  • minPrice

    number

    Min price (AED)

    Default
    0
    Range
    at least 0
  • maxPrice

    number

    Max price (AED)

    0 means no upper limit.

    Default
    0
    Range
    at least 0
  • postedWithinHours

    number

    Posted within (hours)

    Only listings posted in the last N hours. Set it to the interval between monitoring runs to get just the new listings each time. 0 means any age.

    Default
    0
    Range
    0 to 8760
  • sort

    enum

    Sort

    Default
    newest
    Allowed values
    relevance
    newest
    price-low

Advanced

  • maxListings

    number

    Max listings per run

    Across all search terms together. Raise it to 10,000,000 to pull every listing matching a search.

    Default
    1000
    Range
    1 to 10000000
  • requestDelayMs

    number

    Delay between requests (ms)

    Default
    300
    Range
    0 to 30000
Input as JSON Schema

The same schema the API validates against. Use it as a tool input schema or to generate a typed client.

inputSchema
{  "type": "object",  "additionalProperties": false,  "properties": {    "queries": {      "type": "array",      "items": {        "type": "string"      },      "maxItems": 1000,      "title": "Search terms",      "description": "One search per term, the same as typing it into the Dubizzle search bar. Leave empty to list everything that matches the other filters.",      "default": [],      "examples": [        "iphone 15 pro, land cruiser, ps5"      ]    },    "emirates": {      "type": "array",      "items": {        "type": "string",        "enum": [          "dubai",          "abu-dhabi",          "sharjah",          "ajman",          "ras-al-khaimah",          "fujairah",          "umm-al-quwain",          "al-ain"        ]      },      "uniqueItems": true,      "title": "Emirates",      "description": "Leave empty to search all of the UAE.",      "default": []    },    "categories": {      "type": "array",      "items": {        "type": "string"      },      "maxItems": 1000,      "title": "Categories",      "description": "Dubizzle category paths or category page URLs. Top level: motors, property-for-sale, property-for-rent, classified, jobs, jobs-wanted, community. Deeper paths such as motors/used-cars/toyota narrow further. Leave empty for every category.",      "default": [],      "examples": [        "motors/used-cars, classified/mobile-phones-pdas"      ]    },    "minPrice": {      "type": "number",      "minimum": 0,      "title": "Min price (AED)",      "default": 0    },    "maxPrice": {      "type": "number",      "minimum": 0,      "title": "Max price (AED)",      "description": "0 means no upper limit.",      "default": 0    },    "postedWithinHours": {      "type": "number",      "minimum": 0,      "maximum": 8760,      "title": "Posted within (hours)",      "description": "Only listings posted in the last N hours. Set it to the interval between monitoring runs to get just the new listings each time. 0 means any age.",      "default": 0    },    "sort": {      "type": "string",      "enum": [        "relevance",        "newest",        "price-low"      ],      "title": "Sort",      "default": "newest"    },    "maxListings": {      "type": "number",      "minimum": 1,      "maximum": 10000000,      "title": "Max listings per run",      "description": "Across all search terms together. Raise it to 10,000,000 to pull every listing matching a search.",      "default": 1000    },    "requestDelayMs": {      "type": "number",      "minimum": 0,      "maximum": 30000,      "title": "Delay between requests (ms)",      "default": 300    }  }}

Run, poll, read rows

The run is asynchronous. Poll it until it reaches a terminal status and its billing is paid, then page through its rows. Until then the rows endpoint answers 409 (still queued or running) or 402 (payment required).

RUN_ID=$(curl -s -X POST "https://api.pandorlabs.com/v1/scrapers/dubizzle-listings/runs" \  -H "Authorization: Bearer $PANDORLABS_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "queries": [        "iphone 15 pro",        "land cruiser",        "ps5"      ],      "emirates": [        "dubai"      ],      "categories": [        "motors/used-cars",        "classified/mobile-phones-pdas"      ],      "minPrice": 0    }  }' | jq -r '.id')while true; do  RUN=$(curl -s "https://api.pandorlabs.com/v1/runs/$RUN_ID" \    -H "Authorization: Bearer $PANDORLABS_KEY")  STATUS=$(echo "$RUN" | jq -r '.status')  BILLING=$(echo "$RUN" | jq -r '.billing.status')  case "$STATUS" in queued|running) ;; *) [ "$BILLING" != "pending" ] && break ;; esac  sleep 5doneecho "$RUN" | jq '{status, rowCount, billing}'curl -s "https://api.pandorlabs.com/v1/runs/$RUN_ID/rows?page=1&limit=100" \  -H "Authorization: Bearer $PANDORLABS_KEY"

See the API reference for pagination, cancelling and listing runs.

Output fields

Rows have no fixed schema; these are the fields observed in the rows collected so far. Coverage is the share of rows where the field is present.

No rows collected yet, so no fields have been observed. Run the scraper once and they will appear here.

© 2026 PandorLabs LLC. All rights reserved.