# Cars24 India — used cars, inspection reports, hubs & live filter counts

> Search Cars24's Indian used-car catalogue — both its own refurbished stock and the owner-direct cars on the same platform. 30,170 cars across 184 cities on 2026-10-01, counted from the source's own facet endpoint. Returns the car, its price in rupees, odometer, year, variant, colour, seats, owner count, masked RTO plate, body/fuel/gearbox, where it physically stands (locality + coordinates), the canonical cars24.com URL, the photo count, when it was first listed, the seller kind and Cars24's own finance estimate. Every filter below was measured against the count the source itself published for that value in the same run. 🔴 Two honesty notes you should plan for: the source caps `total_available` at 10,000 (so an all-India query returns `total_is_capped: true` and you should read the real population from `filters`), and one page is at most 30 rows — walk further with `cursor`, which was measured to have zero overlap and to reach 100 % of a city's published total.
> ReefAPI engine `cars24` · 8 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/cars24/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/cars24/v1/search — 3 credits
Search Cars24's Indian used-car catalogue — both its own refurbished stock and the owner-direct cars on the same platform. 30,170 cars across 184 cities on 2026-10-01, counted from the source's own facet endpoint. Returns the car, its price in rupees, odometer, year, variant, colour, seats, owner count, masked RTO plate, body/fuel/gearbox, where it physically stands (locality + coordinates), the canonical cars24.com URL, the photo count, when it was first listed, the seller kind and Cars24's own finance estimate. Every filter below was measured against the count the source itself published for that value in the same run. 🔴 Two honesty notes you should plan for: the source caps `total_available` at 10,000 (so an all-India query returns `total_is_capped: true` and you should read the real population from `filters`), and one page is at most 30 rows — walk further with `cursor`, which was measured to have zero overlap and to reach 100 % of a city's published total.

**Parameters:**
- `city_id` (integer, optional) — Cars24's own city id. 184 cities are served; call the `cities` action for the whole list with a live car count each. Measured in one run: 2 = New Delhi (2,941 cars, exactly the "2941 Used Cars in New Delhi" headline the site printed in the same minute), 1 = Delhi NCR cluster (6,924). 🔴 OMIT IT AND YOU SEARCH ALL OF INDIA — but the source caps the reported total at 10,000 there, so `total_is_capped` comes back true and the real population (30,170 on 2026-10-01) must be read from the `filters` action.
- `make` (enum, optional) — Manufacturer, lower-case exactly as Cars24 keys it. Measured all-India: `maruti` → 7,996 of 30,170; `hyundai` → 6,050. Counts per city come from the `filters` action. [one of: maruti, hyundai, tata, honda, mahindra, renault, kia, ford, toyota, volkswagen, mg, skoda, nissan, jeep, datsun, chevrolet, mercedes benz, audi, bmw, citroen, fiat, volvo, landrover, jaguar, mitsubishi, ssangyong, isuzu, force motors, byd, mahindra renault, mini, premier]
- `model` (string, optional) — Model name within the make, lower-case as the source keys it (`swift`, `creta`, `nexon`, `wagon r 1.0`). Measured: `make=maruti` + `model=swift` → 935 all-India. `filters` with `facet=make_model` returns the whole make → model tree with a count on every node. An unknown model is not an error: `ok:true`, 0 results, a warning.
- `seller_kind` (enum, optional) — Whose car it is. Measured all-India: Cars24-owned 6,746 + owner-direct 23,424 = 30,170, i.e. exactly the whole catalogue, so the two buckets are complete and disjoint. Only Cars24-owned stock carries an inspection report. [one of: cars24, owner]
- `fuel` (array, optional) — One or more fuel types. Several values are sent as the source's own any-of form and were proved additive: petrol+diesel → 2,229 in New Delhi = 1,911 + 318 exactly. [one of: petrol, diesel, cng, electric, hybrid]
- `body_type` (array, optional) — Body style. Measured all-India: SUV 12,470, hatchback 11,858, sedan 5,835. Cars24 India publishes only these three. [one of: suv, hatchback, sedan]
- `transmission` (enum, optional) — Measured all-India: manual 23,086, automatic 7,084 (= 30,170). [one of: manual, automatic]
- `transmission_type` (enum, optional) — The exact gearbox technology, which Cars24 breaks out separately. Measured all-India: `cvt` → 1,274. Works on its own, without `transmission`. [one of: mt, imt, amt, tc, cvt, dct]
- `colour` (array, optional) — Exterior colour. Measured all-India: white 12,143, black 2,100, purple 64. [one of: white, silver, red, blue, black, brown, yellow, orange, green, purple]
- `seats` (array, optional) — Seat count. Measured all-India: 5-seat 25,611, 7-seat 2,614, 9-seat 11. [one of: 4, 5, 6, 7, 8, 9]
- `owners` (array, optional) — How many owners the car has had. Measured all-India: first owner 18,799, fourth 640. The source publishes no bucket above 4. [one of: 1, 2, 3, 4]
- `features` (array, optional) — Equipment the car must have. Measured all-India: sunroof 5,370, ventilated seats 1,488, 360-degree camera 1,388. Several values are ANDed by the source, so each one you add narrows the result. [one of: bluetooth, parkingassist, rearac, alloywheels, applecarplayandroidauto, infotainmentsystem, pushbuttonstart, cruisecontrol, topmodel, gpsnavigation, tpms, sunroof/moonroof, leatherseats, ventilatedseats, 360degreecamera, specialregno]
- `price_min` (integer, optional) — Lowest drive-away price in whole Indian rupees (INR — NOT paise, NOT lakh). Measured all-India: 200,000–400,000 → 8,144.
- `price_max` (integer, optional) — Highest drive-away price in whole rupees. The source's own slider stops at 19,500,000 (1.95 crore) nationally.
- `year_min` (integer, optional) — Earliest model year. The source's own slider starts at 2001. Measured in New Delhi: 2020–2026 → 1,108 of 2,941.
- `year_max` (integer, optional) — Latest model year.
- `km_min` (integer, optional) — Lowest odometer reading in kilometres.
- `km_max` (integer, optional) — Highest odometer reading in kilometres. Measured all-India: 0–30,000 → 4,468; in New Delhi 0–20,000 → 249.
- `discount_pct_min` (integer, optional) — Only cars Cars24 itself flags as discounted by at least this percentage. Measured all-India: 10 % or more → 2,221; 20 % or more → 464.
- `rto_state` (string, optional) — Two-letter state RTO code, capitalised as the source keys it (`Dl`, `Mh`, `Hr`, `Up`, `Ka`). Measured all-India: `Mh` → 5,088. `filters` with `facet=rto` lists every state with its city codes and counts.
- `rto_code` (string, optional) — City RTO code as the source keys it: first letter upper, rest lower (`Dl8c`, `Hr26`, `Up16`). Measured all-India: `Dl8c` → 598; inside New Delhi → 405.
- `hub_code` (string, optional) — Only cars standing at one Cars24 branch, keyed by the hub code in lower case (`lc_101`, `in_car_cc_2_fc_4`). Measured: `lc_101` → 196. The `hubs` action and `filters` with `facet=hub` both list the codes.
- `lat` (number, optional) — Latitude, only needed for `sort=nearest`.
- `lon` (number, optional) — Longitude, only needed for `sort=nearest`.
- `sort` (enum, optional, default "best_match") — Result order. 🔴 A value outside this list is NOT rejected by the source — it answers HTTP 200, echoes the bad value back in its own response and silently serves the default order. This endpoint therefore validates `sort` itself and tells you the accepted set. [one of: best_match, newest, price_asc, price_desc, km_asc, km_desc, age_asc, age_desc, nearest]
- `max_results` (integer, optional, default 20) — Rows for this call, 1–30. 30 is a measured hard ceiling: asking for 50, 100, 200, 500 or 1000 all returned exactly 30 rows with HTTP 200 and an unchanged total. Use `cursor` to walk further.
- `cursor` (string, optional) — Opaque continuation token: pass back the `next_cursor` from the previous `search` response, with the SAME filters and the SAME `sort`. Measured: six consecutive pages gave 120 rows and 120 unique ids (overlap 0), and a small city was walked to exhaustion — 69 of 69 published cars reached, 100 %.

**Returns:** {results[], total_available, total_is_capped, returned, page_ceiling, next_cursor, sort, city{}, seller_kind_counts{}, headline} — each result: car_id, url, title, make, model, variant, year, price_inr, price_display, odometer_km, fuel, transmission, body_type, colour, seats, owners, rto_code, plate_masked, registered_on, listed_on, locality, latitude, longitude, photo_count, seller_kind, seller_label, hub_id, assurance, emi{}, badges[], image_url.

**Example request body:**
```json
{
  "city_id": 2,
  "max_results": 3
}
```

### POST https://api.reefapi.com/cars24/v1/detail — 2 credits
One car in full, from Cars24's own car-detail endpoint — 79 keys on the car measured. Everything a `search` row carries plus: Cars24's INSPECTION REPORT (`condition`: per-area imperfection count, the source's own OK/WARN/ERROR status, its written note and, where published, the inspector's engine clip) with the defect photographs; the complete spec and feature table as Cars24 groups it (71 rows on the car measured); tyre tread life per wheel; the service-history summary; insurance type and fitness-certificate expiry; the hub it stands at with street address and opening hours; the photo gallery grouped exterior / interior / tyres / defects; Cars24's own buying highlights and promises; and how many people have wishlisted it. 🔴 Measured and published honestly: an OWNER-DIRECT car has no inspection report and no service history — those come back null with a warning naming them, never faked. A dead id returns NOT_FOUND, not an empty success.

**Parameters:**
- `car_id` (string, required) — Cars24's own listing id (it calls it `appointmentId`) — the trailing number of any cars24.com car URL, e.g. 13421894115 in /buy-used-hyundai-eon-2015-cars-new-delhi-13421894115/, and the `car_id` of every `search` row. An id that does not exist returns NOT_FOUND.

**Returns:** One car object: every search field plus condition{areas[],checkpoints[]}, specs[], features_present[], tyres[], service_history{}, insurance_type, fitness_valid_until, last_serviced_on, hub{}, gallery{}, photo_count, highlights[], promises[], overview[], price_ex_charges_inr, wishlist_count, make_id, model_id, variant_id.

**Example request body:**
```json
{
  "car_id": "13421894115"
}
```

### POST https://api.reefapi.com/cars24/v1/batch_detail — 2 credits
Search-grade rows for up to 10 car ids in ONE upstream request — the cheapest way to refresh a watchlist. Measured: 5 ids → 5 rows in 63 KB (~12.6 KB per car) against 85 KB for one `detail`. Ids the source no longer publishes are returned in `missing` instead of silently disappearing; if none of the ids resolve you get NOT_FOUND. This is NOT the full detail record — no inspection report, no spec table; use `detail` for those.

**Parameters:**
- `car_ids` (array, required) — Up to 10 Cars24 listing ids in one call. Measured: 5 ids in one upstream request returned all 5 rows in 63 KB — about 12.6 KB per car against 85 KB for a single `detail`, so a batch is genuinely cheaper per car. Ids that no longer exist come back in `missing`.

**Returns:** {results[], returned, requested, missing[]} — rows as in `search`.

**Example request body:**
```json
{
  "car_ids": [
    "13421894115",
    "13386161730"
  ]
}
```

### POST https://api.reefapi.com/cars24/v1/price_breakdown — 1 credit
Cars24's own line-by-line breakdown of the drive-away price for one car: base price, RC-transfer price, government-mandated third-party insurance and any further charges, each with the source's own title, explanation and amount in rupees. Measured on car 13421894115: base ₹178,583 + RC transfer ₹10,000 + insurance, summing to the ₹191,102 the listing headline prints. A tiny call — 1.9 KB. A dead id returns NOT_FOUND.

**Parameters:**
- `car_id` (string, required) — Cars24's own listing id (it calls it `appointmentId`) — the trailing number of any cars24.com car URL, e.g. 13421894115 in /buy-used-hyundai-eon-2015-cars-new-delhi-13421894115/, and the `car_id` of every `search` row. An id that does not exist returns NOT_FOUND.

**Returns:** {car_id, title, subtitle, charges[{id,title,amount_inr,description,note}], total_inr} — total_inr is the sum of the published lines.

**Example request body:**
```json
{
  "car_id": "13421894115"
}
```

### POST https://api.reefapi.com/cars24/v1/filters — 2 credits
The live filter vocabulary WITH a car count on every value — the honest way to size a market before searching it, and the only way to see past the 10,000 cap the search surface puts on its own total. 18 filter groups: the whole make → model tree (32 makes, 35 Maruti models), fuel, body, transmission with its sub-types, colour, seats, owner count, 16 equipment flags, state and city RTO codes, the Cars24 hubs in the city, discount bands and paid add-ons, plus the price / year / odometer sliders' own break points. Pass `city_id` for one city's counts, omit it for all of India (30,170 cars on 2026-10-01).

**Parameters:**
- `city_id` (integer, optional) — Cars24's own city id. 184 cities are served; call the `cities` action for the whole list with a live car count each. Measured in one run: 2 = New Delhi (2,941 cars, exactly the "2941 Used Cars in New Delhi" headline the site printed in the same minute), 1 = Delhi NCR cluster (6,924). 🔴 OMIT IT AND YOU SEARCH ALL OF INDIA — but the source caps the reported total at 10,000 there, so `total_is_capped` comes back true and the real population (30,170 on 2026-10-01) must be read from the `filters` action.
- `facet` (enum, optional) — Return only this one filter group instead of all 18. Omit for everything. [one of: make_model, budget, year, odometer, fuel, body_type, transmission, colour, seats, owners, seller_kind, features, rto, hub, discount, extras, smart_picks]

**Returns:** {total_available, groups[{group, source_name, operator, kind, values[{value, label, count, children[]}], range_points[]}]}

**Example request body:**
```json
{
  "city_id": 2,
  "facet": "make_model"
}
```

### POST https://api.reefapi.com/cars24/v1/cities — 2 credits
Every Indian city Cars24 serves — 184 on 2026-10-01 — with its city id, its cars24.com URL, whether Cars24 features it, a live total car count and, per city, the makes on sale with a count each. This is the lookup you need before `search`, because `city_id` is Cars24's own numeric key. Measured: Delhi NCR id 1, 7,040 cars, Maruti 2,140 of them.

**Parameters:**
- `query` (string, optional) — Case-insensitive substring of the city name. Measured: `delhi` matches Delhi NCR and New Delhi.
- `featured_only` (boolean, optional, default false) — Only the cities Cars24 flags as featured.
- `with_brands` (boolean, optional, default true) — Include the per-city make counts. Turn it off for a much smaller answer.

**Returns:** {results[{city_id, name, slug, url, car_count, featured, brands[{make, count, url}]}], returned}

**Example request body:**
```json
{
  "with_brands": false
}
```

### POST https://api.reefapi.com/cars24/v1/hubs — 1 credit
Cars24's physical branches in one city, as Cars24 publishes them: street address, locality, pincode, coordinates, Google-maps link, opening hours, working days and weekly off, how many cars stand there, whether it is an elite hub, the branch's own page URL and the sales manager's name the site prints. Measured: city 2 (New Delhi) → 4 hubs in 9.6 KB; city 1 (Delhi NCR) → more, 23.9 KB. A city id with no hubs answers with an empty body upstream and is returned as NOT_FOUND rather than a crash.

**Parameters:**
- `city_id` (integer, required) — Cars24 city id — see the `cities` action.

**Returns:** {results[{hub_id, hub_code, name, locality, address, pincode, latitude, longitude, map_url, open_from, open_to, working_days[], weekly_off[], cars_at_hub, is_elite_hub, sales_manager, url, image_url}], returned}

**Example request body:**
```json
{
  "city_id": 2
}
```

### POST https://api.reefapi.com/cars24/v1/similar — 2 credits
The cars Cars24 itself recommends against one listing — its own similar-cars surface, returned as full `search`-grade rows. Useful for comparables and for pricing a car against its live alternatives. Measured: one id → 20 rows in 132 KB. 🔴 A dead id answers HTTP 200 with an empty `content` array upstream; that is reported as NOT_FOUND, never as an empty success.

**Parameters:**
- `car_id` (string, required) — Cars24's own listing id (it calls it `appointmentId`) — the trailing number of any cars24.com car URL, e.g. 13421894115 in /buy-used-hyundai-eon-2015-cars-new-delhi-13421894115/, and the `car_id` of every `search` row. An id that does not exist returns NOT_FOUND.

**Returns:** {car_id, results[], returned} — rows as in `search`.

**Example request body:**
```json
{
  "car_id": "13421894115"
}
```

## 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=cars24
- Human docs page: https://reefapi.com/docs/cars24
- Overview page: https://reefapi.com/cars24-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
