DubiCars API & Scraper
The DubiCars API returns dubicars.com, a United Arab Emirates car marketplace, as clean JSON in five actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search filters the live stock by make and model id, new or used, emirate (Dubai, Abu Dhabi, Sharjah, Ajman, Al Ain, Ras Al Khaimah, Fujairah, Umm Al Quwain), dealer or private seller, model-year range, price range in AED and odometer range, with eight sort orders that were each checked to actually reorder the results: newest, the site's own promoted order, price up or down, model year up or down and mileage up or down. Each row carries the listing id and URL, title, make and model ids, model year, kilometres, the asking price with its currency read back from the source, the earlier list price when the ad carries one, condition, emirate, regional specs (GCC, American, European, Japanese, Canadian, Chinese, Korean), the GCC-spec flag, the listing's placement tier, photo count, cover image, the seller's kind and id, and the time the ad was last refreshed. detail adds the seller's own description, the full spec sheet - body type, fuel, cylinders, transmission, steering side, seats, doors, exterior and interior colour, and engine capacity, horsepower and drive type where the ad publishes them - plus every gallery photo and the dealer's name, phone and dealer page. count answers how many cars match a filter combination in a single tiny request, which is how you size a market or check a query before paging it. makes lists all 168 makes with the ids the other actions take; models lists a make's models. Two honesty notes we publish on every call rather than in the small print: a single search query reaches at most 900 rows however large its total, and the site's "newest" order is the ad's last-refresh time, not the date it was created - so an ad from 2015 that was bumped today sorts above one posted this morning. On 2026-10-06, eight different live searches returned 248 rows with id, URL, title, year, kilometres, price, currency, condition, emirate, regional specs, make id, model id, placement tier, photo count, cover image and seller kind filled on 248 of 248, and ten listings pulled at random from those rows returned complete detail 10 of 10 with the photo count matching the site's own count on every one. No DubiCars account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
How much DubiCars stock sits in each emirate - and how much of it an API call can reach
Measured on 2026-10-06 with the count action. The right-hand column is the honest one: DubiCars refuses to serve a result page beyond the thirtieth, so one query exposes at most 900 rows no matter how many it reports. Narrow queries are fully reachable; the big ones are not, and the API says so in every response.
| Emirate | Cars listed | Reachable in one query |
|---|---|---|
| Dubai | 22,547 | 900 of them |
| Sharjah | 1,379 | 900 of them |
| Abu Dhabi | 753 | all 753 |
| Ajman | 330 | all 330 |
| Al Ain | 38 | all 38 |
| Ras Al Khaimah | 10 | all 10 |
| Fujairah | 8 | all 8 |
| Umm Al Quwain | 2 | all 2 |
| All emirates, unfiltered | 25,067 | 900 of them |
To go past 900 on a big query, split it - by make, by model, by price band, by emirate - or walk the same query from both ends with sort=price_asc and sort=price_desc. Every search response returns total_results, reachable_results and fully_reachable so your code can decide without guessing.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/dubicars/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"make_id": 105,
"condition": "used",
"emirate": "dubai",
"sort": "newest",
"max_results": 30
}
}{
"ok": true,
"meta": {
"api": "dubicars",
"endpoint": "search",
"mode": "live",
"latency_ms": 1640.9,
"record_count": 30,
"bytes": 804025,
"cache_hit": false,
"completeness_pct": 3.33,
"stop_reason": "limit_reached",
"warnings": [
"dubicars reports 6938 cars for this query but only 900 of them can be paged to; narrow the query (make, model, emirate, price band) or walk it from both ends with sort=price_asc and sort=price_desc"
],
"charged_credits": 1,
"version": "1.0.0",
"request_id": "461a241a76064a41",
"queue_ms": 1.6,
"fetched_at": "2026-10-06T14:47:17.969Z"
},
"data": {
"rows": [
{
"id": 1032016,
"url": "https://www.dubicars.com/2026-toyota-highlander-25l-at-2026-model-1032016.html",
"title": "New Toyota Highlander LTD HEV",
"make_id": 105,
"model_id": 1558,
"year": 2026,
"kilometers": 0,
"kilometers_reported": false,
"condition": "new",
"emirate": "Dubai",
"emirate_slug": "dubai",
"regional_specs": "GCC",
"is_gcc_spec": true,
"listing_tier": "basic",
"is_premium": false,
"photos_count": 24,
"image": "https://www.dubicars.com/images/9104e0/650x380/mohd-fairoos/892aa320-2db4-4bc9-87be-c8d40f768234.jpeg",
"refreshed_at": "2026-10-06 18:42:06",
"was_refreshed": true,
"position": 1,
"price": 189000,
"price_currency": "AED",
"price_type": "fixed",
"price_list": null,
"price_disagrees": false,
"seller_type": "dealer",
"seller_name": "Mohd Fairoos",
"seller_phone": "[redacted-phone]",
"seller_phone_alt": null,
"seller_id": 2908,
"seller_business_kind": "Independent Dealer",
"seller_origin": "Export",
"seller_page": "https://www.dubicars.com/dealers/dubai-mohd-fairoos-2908",
"seller_pii_withheld": false
},
{
"id": 1032010,
"url": "https://www.dubicars.com/2026-toyota-highlander-25l-at-2026-model-1032010.html",
"title": "New Toyota Highlander LTD HEV",
"make_id": 105,
"model_id": 1558,
"year": 2026,
"kilometers": 0,
"kilometers_reported": false,
"condition": "new",
"emirate": "Dubai",
"emirate_slug": "dubai",
"regional_specs": "GCC",
"is_gcc_spec": true,
"listing_tier": "basic",
"is_premium": false,
"photos_count": 25,
"image": "https://www.dubicars.com/images/fa2ada/650x380/mohd-fairoos/5ad03c23-2e89-44fe-b930-d04458ce736a.jpeg",
"refreshed_at": "2026-10-06 18:42:05",
"was_refreshed": true,
"position": 2,
"price": 189000,
"price_currency": "AED",
"price_type": "fixed",
"price_list": null,
"price_disagrees": false,
"seller_type": "dealer",
"seller_name": "Mohd Fairoos",
"seller_phone": "[redacted-phone]",
"seller_phone_alt": null,
"seller_id": 2908,
"seller_business_kind": "Independent Dealer",
"seller_origin": "Export",
"seller_page": "https://www.dubicars.com/dealers/dubai-mohd-fairoos-2908",
"seller_pii_withheld": false
},
{
"id": 1032009,
"url": "https://www.dubicars.com/2026-toyota-prado-1032009.html",
"title": "New Toyota Prado ADVENTURE",
"make_id": 105,
"model_id": 1781,
"year": 2026,
"kilometers": 0,
"kilometers_reported": false,
"condition": "new",
"emirate": "Dubai",
"emirate_slug": "dubai",
"regional_specs": "GCC",
"is_gcc_spec": true,
"listing_tier": "basic",
"is_premium": false,
"photos_count": 17,
"image": "https://www.dubicars.com/images/25c777/650x380/al-nojoom-cars/7aeaacd5-fe19-4f3d-b06c-65d51afd261e.jpeg",
"refreshed_at": "2026-10-06 18:30:46",
"was_refreshed": false,
"position": 3,
"price": null,
"price_currency": "AED",
"price_type": "on_request",
"price_list": null,
"price_disagrees": false,
"seller_type": "dealer",
"seller_name": "Al Nojoom Cars",
"seller_phone": "[redacted-phone]",
"seller_phone_alt": "[redacted-phone]",
"seller_id": 3124,
"seller_business_kind": "Exporter",
"seller_origin": "Export",
"seller_page": "https://www.dubicars.com/dealers/dubai-al-nojoom-cars-3124",
"seller_pii_withheld": false
}
],
"summary": {
"total_results": 6938,
"reachable_results": 900,
"results_cap": 900,
"fully_reachable": false,
"page": 1,
"pages_read": 1,
"page_size": 30,
"last_page": 30,
"max_page": 30,
"has_more": true,
"filters_applied": {
"condition": "used",
"make_id": 105,
"emirate": "dubai",
"sort": "newest"
}
}
}
}What the DubiCars API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search dubicars' UAE car stock by make, model, condition, emirate, seller type, model year, price and mileage, with eight verified sort orders. Returns 30 rows a page with price, mileage, year, emirate, regional specs, seller kind and the listing's refresh time. 🔴 A single query reaches at most 900 rows (the site refuses page 31+) even when it reports tens of thousands — `summary.total_results` and `summary.reachable_results` always say both numbers. | Price-intelligence teams call search to search dubicars' UAE car stock by make, model, condition, emirate, seller type, model year, p…. | make_id, model_id, condition, emirate, seller_type, ... |
| detail | The full record for one listing: the seller's own description, the complete spec sheet (body type, fuel, cylinders, transmission, steering side, seats, doors, both colours, regional specs), every gallery photo and the seller block. Takes the listing URL from a `search` row — dubicars has no id-only listing route, so the URL (or id + slug) is required. | Classifieds aggregators call detail to get the full record for one listing. | url, include_pii |
| count | How many cars match a filter combination, from dubicars' own count endpoint — one tiny request, no result parsing. Built for market sizing and for checking whether a query fits under the 900-row reachable ceiling before you page through it. | Resale and arbitrage tools call count to get how many cars match a filter combination, from dubicars' own count endpoint. | make_id, model_id, condition, emirate, seller_type, ... |
| makes | Every car make dubicars lists, with the numeric `make_id` that `search`, `count` and `models` take, plus the make's logo. 168 makes at capture. | Lead-generation teams call makes to get every car make dubicars lists, with the numeric `make_id` that `search`, `count` and `models`…. | none |
| models | Every model dubicars lists for one make, with the numeric `model_id` that `search` and `count` take. Omit `make_id` to get all makes at once. | Price-intelligence teams call models to get every model dubicars lists for one make, with the numeric `model_id` that `search` and `count…. | make_id |
Call search from your stack
curl -X POST https://api.reefapi.com/dubicars/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make_id":105,"condition":"used","emirate":"dubai","sort":"newest","max_results":30}'import requests
r = requests.post(
"https://api.reefapi.com/dubicars/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"make_id": 105,
"condition": "used",
"emirate": "dubai",
"sort": "newest",
"max_results": 30
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/dubicars/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"make_id": 105,
"condition": "used",
"emirate": "dubai",
"sort": "newest",
"max_results": 30
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.dubicars.search with {"make_id":105,"condition":"used","emirate":"dubai","sort":"newest","max_results":30}.Who uses this API and why
- UAE dealer-pricing and residual-value teams call search per make and model to track asking prices in AED by emirate and mileage band.
- Car-buying and lead-gen apps call detail on a search row to show the seller's description, the full spec sheet and every photo in their own UI.
- Market-sizing and supply dashboards call count with different filter combinations to measure how much stock exists per emirate, per make and per price band in one request each.
- Import and export desks filter by regional specs and the GCC-spec flag to find cars that match a destination market's requirements.
- Anyone building a UAE vehicle dataset calls makes and models first to get the numeric ids the search filters take, instead of guessing names.
Questions developers ask before integrating
Does the DubiCars API have a keyword search?
No, and that is deliberate. DubiCars accepts a free-text keyword and then ignores it: a search for "toyota" returned the whole unfiltered catalogue of 25,067 cars with a Mercedes as the first result. Rather than ship a box that does nothing, the API filters by numeric make and model ids, which the site does honour - the makes and models actions give you those ids. If you send a keyword anyway, the response tells you why it cannot work.
How many results can one search return?
Up to 900. DubiCars serves thirty pages of thirty rows and refuses anything deeper, which was checked on page 31, 32, 33, 50, 100, 331, 332, 333, 500 and 5,000 - every one refused, while page 30 served normally. Every response reports total_results, reachable_results and fully_reachable, so you always know whether you are seeing all of a query or the first 900 of it.
Is "newest" the date the car was listed?
No. DubiCars orders its "latest" view by the time an ad was last refreshed, not by when it was created, and sellers refresh old ads to push them back up. On one measured page of newest-first results the listing ids ran from 909,663 to 1,028,627 while the site's id counter was already past 1,031,900 - so that page was full of older ads bumped today. The API returns that timestamp honestly as refreshed_at with a was_refreshed flag beside it, and does not offer a listed_at field, because DubiCars does not publish one anywhere. If you are tracking genuinely new stock, diff on listing ids between runs.
What currency are the prices in?
AED, and the API tells you so on every row rather than assuming it. DubiCars changes both the currency and the number depending on where it thinks the reader is - the same Nissan Patrol was served at 66,700 in one currency and 244,900 AED in another. This API pins the UAE storefront and then reads the currency back out of the response, so price and price_currency always agree with what DubiCars itself published.
Does it return dealer contact details?
Yes for dealers: name, phone, a second phone when the ad carries one, the dealer's own page and the kind of business DubiCars classes them as. Dealers were 24,000 of the 25,068 cars on the site at the time of measurement. Private owners are different - their display name and phone are withheld unless you explicitly pass include_pii, which is the same rule our other classifieds APIs follow.
What does the full detail call give me that search does not?
The seller's own description, the complete spec sheet and every photo. Across ten random listings the detail call returned twelve to fifteen spec rows - model year, kilometres, regional specs, body type, fuel type, cylinders, transmission, steering side, seats, doors, exterior colour, interior colour, and engine capacity, horsepower and drive type on the ads that publish them - and the photo list matched DubiCars' own photo count on all ten, from seven images up to twenty-five.
Does new versus used actually filter anything?
new does, used barely. Asking for new cuts the site total from 25,068 to 12,164, and cuts Toyota from 7,245 to 5,438. Asking for used returns 25,067 of 25,068 - on DubiCars "used" effectively means the entire stock. Both numbers are measured and the parameter's own description says this, so you do not pay for a filter that does nothing.
What does DubiCars not publish?
VIN, trim level, service history, view counts and the date an ad was created are not on the page, so they are not in the response - absent rather than guessed. Engine capacity, horsepower and drive type appear on part of the stock only, so they are returned inside the spec sheet exactly as DubiCars wrote them instead of being promised as top-level fields.
What is the DubiCars API?
DubiCars API is a ReefAPI endpoint group for uae car marketplace: used and new stock from dealers and private owners across all seven emirates, priced in aed. It returns live JSON through POST requests under /dubicars/v1.
Is the DubiCars API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. DubiCars calls use the same shared credit balance as every other ReefAPI engine.
Do I need a DubiCars login or account?
No login to DubiCars is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the DubiCars data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the DubiCars API use?
DubiCars actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call DubiCars from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call dubicars actions with the same key, credit pool and JSON envelope used by normal REST requests.