# DubiCars — UAE car marketplace (used + new, all seven emirates)

> 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.
> ReefAPI engine `dubicars` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/dubicars/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/dubicars/v1/search — 3 credits
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.

**Parameters:**
- `make_id` (integer, optional) — Numeric make id as dubicars publishes it (Toyota 105, Nissan 75, BMW 13, Mercedes Benz 69, Ford 36, Lexus 59). Call the `makes` action for the full list of 168.
- `model_id` (integer, optional) — Numeric model id, scoped to the make. Call `models` with `make_id` for the list (Toyota Land Cruiser, Camry, Hilux…).
- `condition` (enum, optional, default "any") — New / used split. Measured bite: `new` cuts the site total from 25,068 to 12,164, while `used` returns 25,067 — on dubicars 'used' effectively means the whole stock. [one of: any, used, new]
- `emirate` (enum, optional) — Emirate the car is listed in. Measured stock at capture: Dubai 22,547 · Sharjah 1,379 · Abu Dhabi 753 · Ajman 330 · Al Ain 38 · Ras Al Khaimah 10 · Fujairah 8 · Umm Al Quwain 2. [one of: abu-dhabi, ajman, dubai, fujairah, ras-al-khaimah, sharjah, umm-al-quwain, al-ain]
- `seller_type` (enum, optional) — Dealer stock or private-owner cars. [one of: dealer, private]
- `year_min` (integer, optional) — Earliest model year (inclusive).
- `year_max` (integer, optional) — Latest model year (inclusive).
- `price_min` (integer, optional) — Lowest asking price in AED.
- `price_max` (integer, optional) — Highest asking price in AED.
- `km_min` (integer, optional) — Lowest odometer reading in kilometres.
- `km_max` (integer, optional) — Highest odometer reading in kilometres.
- `sort` (enum, optional, default "newest") — Result order. Every option was verified monotonic on live rows. 🔴 `newest` is the site's own 'Latest', which orders by the REFRESH (bump) time, not by when the ad was created — a re-bumped 2015 listing appears above a brand-new one. [one of: newest, promoted, price_asc, price_desc, year_desc, year_asc, km_asc, km_desc]
- `page` (integer, optional, default 1) — 1-based page of 30 rows. 🔴 dubicars refuses page 31 and above outright, so a single query exposes at most 900 rows however large its total is. A page above 30 is clamped and reported in `meta.warnings`.
- `max_results` (integer, optional, default 30) — Stop after this many rows, walking pages of 30. Capped at 900, the site's reachable ceiling.
- `include_pii` (boolean, optional, default false) — Include a PRIVATE seller's display name and phone number. Dealer names and phones are professional business facts and are always returned.

**Returns:** `rows[]` plus a `summary`. Each row: id, url, title, make_id, model_id, year, kilometers (+ kilometers_reported), condition, price / price_currency / price_type / price_list / price_disagrees, emirate (+ emirate_slug), regional_specs, is_gcc_spec, listing_tier, is_premium, photos_count, image, refreshed_at, was_refreshed, position, seller_type, seller_name, seller_phone, seller_phone_alt, seller_id, seller_business_kind, seller_origin, seller_page, seller_pii_withheld. `price_currency` is read back from the source on every row rather than assumed. `summary` carries total_results (the site's own count for this query), reachable_results (min(total, 900) — dubicars refuses page 31+), last_page, has_more, page, page_size and filters_applied. `refreshed_at` is a bump time; dubicars publishes no creation date.

**Example request body:**
```json
{
  "make_id": 105,
  "condition": "used",
  "emirate": "dubai",
  "sort": "newest",
  "max_results": 30
}
```

### POST https://api.reefapi.com/dubicars/v1/detail — 3 credits
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.

**Parameters:**
- `url` (string, required) — Full listing URL exactly as `search` returns it in `rows[].url`, e.g. https://www.dubicars.com/2015-mercedes-benz-g500-…-909663.html. A bare numeric id is not enough: dubicars serves listings only at their slug URL.
- `include_pii` (boolean, optional, default false) — Include a PRIVATE seller's display name and phone number. Dealer contact details are always returned.

**Returns:** One listing: id, url, title, description (the seller's own text), make, model, year, kilometers, price / price_currency / price_type, condition, body_type, fuel_type, transmission, cylinders, seats, doors, exterior_color, interior_color, steering_side, regional_specs, emirate, photos[] and photos_count, seller{type, name, phone, page, business_kind}, refreshed_at, specs{} (the site's own label/value rows verbatim). VIN, engine displacement, horsepower, trim and the creation date are not published by dubicars and are absent rather than guessed.

**Example request body:**
```json
{
  "url": "https://www.dubicars.com/2015-mercedes-benz-g500-mercedes-g-class-g500-modified-to-latest-g63-exterior-909663.html"
}
```

### POST https://api.reefapi.com/dubicars/v1/count — 1 credit
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.

**Parameters:**
- `make_id` (integer, optional) — Numeric make id as dubicars publishes it (Toyota 105, Nissan 75, BMW 13, Mercedes Benz 69, Ford 36, Lexus 59). Call the `makes` action for the full list of 168.
- `model_id` (integer, optional) — Numeric model id, scoped to the make. Call `models` with `make_id` for the list (Toyota Land Cruiser, Camry, Hilux…).
- `condition` (enum, optional, default "any") — New / used split. Measured bite: `new` cuts the site total from 25,068 to 12,164, while `used` returns 25,067 — on dubicars 'used' effectively means the whole stock. [one of: any, used, new]
- `emirate` (enum, optional) — Emirate the car is listed in. Measured stock at capture: Dubai 22,547 · Sharjah 1,379 · Abu Dhabi 753 · Ajman 330 · Al Ain 38 · Ras Al Khaimah 10 · Fujairah 8 · Umm Al Quwain 2. [one of: abu-dhabi, ajman, dubai, fujairah, ras-al-khaimah, sharjah, umm-al-quwain, al-ain]
- `seller_type` (enum, optional) — Dealer stock or private-owner cars. [one of: dealer, private]
- `year_min` (integer, optional) — Earliest model year (inclusive).
- `year_max` (integer, optional) — Latest model year (inclusive).
- `price_min` (integer, optional) — Lowest asking price in AED.
- `price_max` (integer, optional) — Highest asking price in AED.
- `km_min` (integer, optional) — Lowest odometer reading in kilometres.
- `km_max` (integer, optional) — Highest odometer reading in kilometres.

**Returns:** `{total_results, reachable_results, pages_available, fully_reachable, filters_applied}`. `fully_reachable` is false when the query's total exceeds the 900 rows paging can reach.

**Example request body:**
```json
{
  "make_id": 105,
  "condition": "used"
}
```

### POST https://api.reefapi.com/dubicars/v1/makes — 1 credit
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.

**Parameters:** none

**Returns:** `rows[]` of {make_id, name, logo}. Sorted as dubicars publishes them.

### POST https://api.reefapi.com/dubicars/v1/models — 2 credits
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.

**Parameters:**
- `make_id` (integer, optional) — Make to list models for (Toyota 105). Omit for every make in one call — that answer is large, so prefer scoping it.

**Returns:** `rows[]` of {make_id, make_name, model_id, name, url_key, group_id}.

**Example request body:**
```json
{
  "make_id": 105
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=dubicars
- Human docs page: https://reefapi.com/docs/dubicars
- Overview page: https://reefapi.com/dubicars-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
