# che168 API — live Chinese used-car market data scraper (二手车之家 / Autohome): search by city, brand, price, year, mileage, gearbox, seller type, fuel and more; full listing detail with price in CNY, mileage in km, registration date, dealer, owner-transfer count, inspection/insurance expiry, every photo, the factory trim spec sheet and the third-party condition/accident report — no API key, no login

> Search che168's live used-car inventory. Filter by city, brand/series (pinyin from `suggest`), vehicle class, price band, registration age, mileage, gearbox, displacement, seller type (private / dealer / certified dealer), body structure, colour, fuel, seats, emission standard, drivetrain, induction and dealer, then sort and page through. Returns a normalized card per car (price in CNY, mileage in km, first-registration month, city, ids, photo, tags). che168 publishes no result total, so `pagination.pages_available` is the page count its own pager offers; it serves at most 100 pages (56 cars each) per filter. `keyword` does a free-text search instead — Chinese text works best, and che168 ignores the other filters in keyword mode.
> ReefAPI engine `che168` · 11 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/che168/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/che168/v1/search — 2 credits
Search che168's live used-car inventory. Filter by city, brand/series (pinyin from `suggest`), vehicle class, price band, registration age, mileage, gearbox, displacement, seller type (private / dealer / certified dealer), body structure, colour, fuel, seats, emission standard, drivetrain, induction and dealer, then sort and page through. Returns a normalized card per car (price in CNY, mileage in km, first-registration month, city, ids, photo, tags). che168 publishes no result total, so `pagination.pages_available` is the page count its own pager offers; it serves at most 100 pages (56 cars each) per filter. `keyword` does a free-text search instead — Chinese text works best, and che168 ignores the other filters in keyword mode.

**Parameters:**
- `city` (string, optional, default "china") — Market to search: a che168 city pinyin ('beijing', 'shanghai', 'chengdu'), or 'china' for the whole country. Common English and Chinese names are accepted too ('peking', '上海'). Call the `cities` action for the complete live list (372 cities/provinces).
- `brand` (string, optional) — Brand in che168's own pinyin slug ('baoma' = BMW, 'benchi' = Mercedes, 'aodi' = Audi, 'dazhong' = VW). The `brands` action lists all 618 slugs with their Chinese names.
- `series` (string, optional) — Model series slug, used together with `brand` (e.g. brand=baoma, series=baoma3xi). `brands` with a `brand` argument lists that brand's series slugs.
- `vehicle_class` (enum, optional) — Size/body segment, che168's own taxonomy. [one of: micro, small, compact, midsize, mid_large, large, mpv, suv, small_suv, compact_suv, midsize_suv, mid_large_suv, large_suv, sports, minivan, pickup, light_van]
- `keyword` (string, optional) — Free-text search over che168's inventory (Chinese works best, e.g. '宝马', '奥迪A4L'). Mutually usable with `city`; other filters are ignored by che168 in keyword mode.
- `min_price` (integer, optional) — Minimum asking price in 万元 (10 000 CNY) — che168's own unit. 5 = 50 000 CNY.
- `max_price` (integer, optional) — Maximum asking price in 万元 (10 000 CNY). 20 = 200 000 CNY.
- `min_year` (integer, optional) — Earliest first-registration year (converted to che168's vehicle-age filter, so it is accurate to the year).
- `max_year` (integer, optional) — Latest first-registration year.
- `max_mileage_km` (integer, optional) — Mileage ceiling in kilometres. che168 filters in 万公里 (10 000 km) steps, so the value is rounded up to the nearest 10 000 km and the applied value is echoed in meta.filters.
- `min_mileage_km` (integer, optional) — Mileage floor in kilometres (same 10 000 km step).
- `gearbox` (enum, optional) — Transmission type. [one of: manual, automatic]
- `seller_type` (array, optional) — Who is selling. `dealer` and `certified_dealer` both filter (they return disjoint dealer sets). `private` is accepted and che168 answers it with a real, empty result page — measured 0 cars nationwide on 2026-10-11, because its public inventory is dealer-consigned. Combining `private` with another value returns nothing. [one of: dealer, certified_dealer, private]
- `displacement` (array, optional) — Engine displacement band in litres. [one of: <=1.0, 1.1-1.6, 1.7-2.0, 2.1-2.5, 2.6-3.0, 3.1-4.0, >4.0]
- `body_type` (array, optional) — Body structure. [one of: hatchback_2box, sedan_3box, liftback, wagon, hardtop_convertible, soft_convertible, coupe, bus, truck]
- `color` (array, optional) — Exterior colour group. [one of: black, white, silver_grey, red_purple, blue, green, yellow_orange, champagne_brown]
- `fuel` (array, optional) — Fuel/propulsion type. [one of: petrol, diesel, hybrid, new_energy]
- `seats` (array, optional) — Seat count. [one of: 2, 4, 5, 6, 7, 7+]
- `emission_standard` (array, optional) — Emission standard the car meets (China or Euro stage). [one of: china2, china3, china4, china5, china6, euro2, euro3, euro4, euro5, euro6]
- `drivetrain` (array, optional) — Driven wheels. [one of: fwd, rwd, awd]
- `induction` (enum, optional) — Engine induction type. [one of: naturally_aspirated, turbo, supercharged]
- `dealer_id` (integer, optional) — Restrict to one dealer's inventory (`dealer_id` from `search` or `car_detail`).
- `sort` (enum, optional, default "default") — Result ordering. Every option here was verified by reading the ordering che168 actually returned (see the engine's BUILD-LOG). che168's sort bar offers no 'newest car first' — combine `min_year` with `newest` for that. [one of: default, newest, oldest_listing, price_asc, price_desc, mileage_asc, mileage_desc, year_asc]
- `page` (integer, optional, default 1) — Result page. che168 serves 56 cars per page and stops at page 100, so one filter reaches at most ~5 600 cars — narrow the filter (city, brand, price band) to go deeper.
- `limit` (integer, optional, default 56) — Cap the cards returned from the page (1-56). che168 always renders 56; this only trims the response.

**Returns:** results[]{listing_id, url, title, price_cny, price_wan_cny, new_car_price_cny, mileage_km, mileage_wan_km, first_registration, year, city, city_id, brand_id, series_id, spec_id, dealer_id, dealer_note, image, listed_at, tags, is_certified} + pagination{page, per_page, pages_available, has_more} + filters_applied + source_url

**Example request body:**
```json
{
  "city": "beijing",
  "limit": 20
}
```

### POST https://api.reefapi.com/che168/v1/car_detail — 2 credits
Everything che168 publishes about one listing, merged from its page and three of its JSON endpoints: price (CNY and 万), mileage in km, first-registration month, brand/series/trim ids, dealer name + rating + seller type, owner-transfer count, inspection / insurance / warranty expiry, engine, vehicle class, colour, fuel grade, drivetrain, emission standard, every photo, and che168's own condition grade. The 17-character VIN is NOT published by che168 — `vin` is null and `vehicle_token` carries che168's opaque identifier instead.

**Parameters:**
- `listing_id` (integer, required) — che168 listing id (`infoid`) — the number in a listing URL `/dealer/<dealer_id>/<listing_id>.html`, returned as `listing_id` by `search`.
- `include_report` (boolean, optional, default true) — Also fetch che168's third-party condition/accident report and demand indices (2 extra upstream calls, ~0.5 KB). Most listings have no published report — the response then says `report_published: false`.
- `include_photos` (boolean, optional, default true) — Include the full photo list. Photos come from the listing page itself, so turning this off saves no bandwidth; set it false only to shrink the payload.

**Returns:** car{listing_id, url, title, brand, series, spec_id, price_cny, mileage_km, first_registration, year, city, dealer_name, dealer_rating, seller_type, owner_transfers, inspection_valid_until, insurance_valid_until, engine, vehicle_class, color, drivetrain, emission_standard, photos[], vin(null), vehicle_token} + condition{report_published, condition_grade, inspection_items[]} + demand{condition_label, demand_index}

**Example request body:**
```json
{
  "listing_id": 59776000
}
```

### POST https://api.reefapi.com/che168/v1/car_summary — 1 credit
The cheap one-listing lookup: che168's own ~1 KB JSON record for a listing id — title, brand, series, trim id, price, mileage, registration date, city, dealer name + rating + seller type, finance terms, main photo, watch count. Use this instead of `car_detail` when you are enriching thousands of ids and do not need the archive table, photo list or condition report. Returns NOT_FOUND with che168's own wording when a listing has been sold or delisted.

**Parameters:**
- `listing_id` (integer, required) — che168 listing id (`infoid`) — the number in a listing URL `/dealer/<dealer_id>/<listing_id>.html`, returned as `listing_id` by `search`.

**Returns:** car{listing_id, url, title, brand, series, spec_id, price_cny, mileage_km, first_registration, year, city, dealer_name, dealer_rating, seller_type, down_payment_cny, image, follow_count, listed_at}

**Example request body:**
```json
{
  "listing_id": 59776000
}
```

### POST https://api.reefapi.com/che168/v1/car_photos — 1 credit
Every photo URL che168 holds for a listing, from its own photo JSON (~3 KB) rather than the 350 KB page. Cheapest way to pull imagery in bulk.

**Parameters:**
- `listing_id` (integer, required) — che168 listing id (`infoid`) — the number in a listing URL `/dealer/<dealer_id>/<listing_id>.html`, returned as `listing_id` by `search`.

**Returns:** photos[] (absolute https URLs) + photo_count + car{listing_id, title, price_cny, dealer_name, url}

**Example request body:**
```json
{
  "listing_id": 59776000
}
```

### POST https://api.reefapi.com/che168/v1/car_options — 1 credit
The comfort/safety equipment che168 lists for one car (lane keeping, adaptive cruise, 360 camera, heated steering, head-up display, …) as a normalized list with che168's option ids.

**Parameters:**
- `listing_id` (integer, required) — che168 listing id (`infoid`) — the number in a listing URL `/dealer/<dealer_id>/<listing_id>.html`, returned as `listing_id` by `search`.
- `spec_id` (integer, optional) — Factory trim id. Optional — che168 resolves the options from the listing id alone; passing it can return a slightly fuller list.

**Returns:** options[]{option_id, name, icon} + option_count

**Example request body:**
```json
{
  "listing_id": 59776000
}
```

### POST https://api.reefapi.com/che168/v1/condition_report — 2 credits
che168's third-party condition and accident report for one listing: overall grade, per-item inspection results (structural damage, flood, fire, major accident), the claim type, report photos and the link to the full report, plus che168's own condition wording and demand indices. Honest-empty: cars che168 has not had inspected return `report_published: false` instead of an invented clean bill of health — measured on 9 listings across three che168 surfaces, all 9 said false, so treat the report as a bonus and the demand block as the reliable part. Pass `vehicle_token` (from `car_detail`) to keep this cheap: che168 validates that token and will not answer without it, so if you omit it we have to load the ~350 KB listing page to read it off.

**Parameters:**
- `listing_id` (integer, required) — che168 listing id (`infoid`) — the number in a listing URL `/dealer/<dealer_id>/<listing_id>.html`, returned as `listing_id` by `search`.
- `dealer_id` (integer, optional) — Dealer id from `search`/`car_detail`. che168's report endpoint wants it alongside the listing id; omit it and we send 0, which still answers for most listings.
- `vehicle_token` (string, optional) — The opaque vehicle token from `car_detail` (`vehicle_token`). Optional.

**Returns:** condition{report_published, condition_grade, condition_score, summary, report_url, claim_type, inspection_items[]{item, abnormal}, config_items[], report_photos[]} + demand{condition_label, demand_index, search_score, watch_score, enquiry_score, preference_share} + vehicle_token (reuse it on later calls)

**Example request body:**
```json
{
  "listing_id": 59776000
}
```

### POST https://api.reefapi.com/che168/v1/model_specs — 1 credit
The full factory specification sheet for one trim (`spec_id`) straight from Autohome's model database: trim name, manufacturer, MSRP when new, body structure, class, engine, gearbox, fuel, seats and ~15 grouped sections of named parameters. This is the `trim` dimension — pair it with `search`/`car_detail`, which both return `spec_id`.

**Parameters:**
- `spec_id` (integer, required) — Autohome factory trim id (`specid`) — returned as `spec_id` by `search` and `car_detail`. Identifies the exact model year + trim, not the individual car.

**Returns:** spec{spec_id, trim_name, manufacturer, msrp_text, msrp_wan_cny, body_type, vehicle_class, engine, gearbox, fuel_type, seats, groups[]{group, items[]{name, value, param_id}}, param_count}

**Example request body:**
```json
{
  "spec_id": 54727
}
```

### POST https://api.reefapi.com/che168/v1/suggest — 1 credit
Resolve a keyword to che168's own brand/series entries, each with the LIVE number of cars on sale and the real minimum and maximum asking price — a market-size probe in one call ('how many BMW 3-series are for sale in China right now, and in what price band'). It returns che168's numeric `series_id`/`brand_id`, NOT the pinyin slugs `search` filters on: use `brands` for those.

**Parameters:**
- `query` (string, required) — Brand, series or model text. Chinese matches best ('宝马' = BMW, '奥迪A4L'); Latin spellings return fewer matches.

**Returns:** matches[]{keyword, series_id, brand_id, listing_count, min_price_cny, max_price_cny, che168_url} + brand_id + dealer_count

**Example request body:**
```json
{
  "query": "宝马"
}
```

### POST https://api.reefapi.com/che168/v1/dealer_cars — 2 credits
One dealer's whole live inventory on che168, paged. Same normalized card shape as `search`. Use `dealer_id` from any search result or listing detail.

**Parameters:**
- `dealer_id` (integer, required) — che168 dealer id, from `search` or `car_detail`.
- `city` (string, optional, default "china") — Market to search: a che168 city pinyin ('beijing', 'shanghai', 'chengdu'), or 'china' for the whole country. Common English and Chinese names are accepted too ('peking', '上海'). Call the `cities` action for the complete live list (372 cities/provinces).
- `sort` (enum, optional, default "default") — Result ordering. Every option here was verified by reading the ordering che168 actually returned (see the engine's BUILD-LOG). che168's sort bar offers no 'newest car first' — combine `min_year` with `newest` for that. [one of: default, newest, oldest_listing, price_asc, price_desc, mileage_asc, mileage_desc, year_asc]
- `page` (integer, optional, default 1) — Result page. che168 serves 56 cars per page and stops at page 100, so one filter reaches at most ~5 600 cars — narrow the filter (city, brand, price band) to go deeper.
- `limit` (integer, optional, default 56) — Cap the cards returned (1-56).

**Returns:** results[] (same shape as search) + pagination{page, per_page, pages_available, has_more}

**Example request body:**
```json
{
  "dealer_id": 201407
}
```

### POST https://api.reefapi.com/che168/v1/brands — 1 credit
che168's brand catalogue: all 618 brand slugs with their Chinese names. These slugs are what `search`'s `brand` filter takes, and `suggest` does not provide them. Pass `brand` to get that brand's model-series slugs instead (94 for BMW), which `search`'s `series` filter takes.

**Parameters:**
- `brand` (string, optional) — Brand slug. Given, the action returns that brand's series slugs; omitted, it returns the brand list.

**Returns:** brands[]{pinyin, name} (no `brand` given) or series[]{pinyin, name, brand_pinyin} + brand (when `brand` is given)

**Example request body:**
```json
{
  "brand": "baoma"
}
```

### POST https://api.reefapi.com/che168/v1/cities — 1 credit
che168's complete market list — every city and province it sells in, with the area id, the pinyin slug `search` takes and the Chinese name. Read live off the site, so it cannot drift from what `search` accepts.

**Parameters:**
- `near_city_id` (integer, optional) — Optional che168 city id (e.g. 110100 = Beijing). Adds the neighbouring markets che168 suggests for it, which is how buyers widen a search.

**Returns:** cities[]{area_id, pinyin, name, is_province} + nearby[]{city_id, name, pinyin, province_id, province}

**Example request body:**
```json
{
  "near_city_id": 110100
}
```

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