che168 API

Read China's used-car market, trim sheet included

che168 API returns live che168 data as clean JSON for che168 The primary endpoint, search, returns matching records including listing id, title, price cny, price wan cny and new car price cny.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a che168 endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
C
/che168/v1

11 active endpoints, on 1 and 2 credit tiers.

  • POST/che168/v1/search
  • POST/che168/v1/car_detail
  • POST/che168/v1/car_summary
  • POST/che168/v1/car_photos
  • POST/che168/v1/car_options
  • POST/che168/v1/condition_report
  • POST/che168/v1/model_specs
  • +4 more

What che168 endpoints does ReefAPI ship?

11 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

11 endpoints

search

2 cr

Search che168's live used-car inventory.

required
—
optional
city, brand, series, vehicle_class, keyword, min_price, max_price, min_year, max_year, max_mileage_km, min_mileage_km, gearbox, seller_type, displacement, body_type, color, fuel, seats, emission_standard, drivetrain, induction, dealer_id, sort, page, limit

car_detail

2 cr

Everything che168 publishes about one listing, merged from its page and three of its JSON end…

required
listing_id
optional
include_report, include_photos

car_summary

1 cr

The cheap one-listing lookup.

required
listing_id
optional
—

car_photos

1 cr

Every photo URL che168 holds for a listing, from its own photo JSON (~3 KB) rather than the 3…

required
listing_id
optional
—

car_options

1 cr

The comfort/safety equipment che168 lists for one car (lane keeping, adaptive cruise, 360 cam…

required
listing_id
optional
spec_id

condition_report

2 cr

che168's third-party condition and accident report for one listing.

required
listing_id
optional
dealer_id, vehicle_token

model_specs

1 cr

The full factory specification sheet for one trim (spec_id) straight from Autohome's model da…

required
spec_id
optional
—

suggest

1 cr

Resolve a keyword to che168's own brand/series entries, each with the LIVE number of cars on…

required
query
optional
—

dealer_cars

2 cr

One dealer's whole live inventory on che168, paged.

required
dealer_id
optional
city, sort, page, limit

brands

1 cr

che168's brand catalogue.

required
—
optional
brand

cities

1 cr

che168's complete market list.

required
—
optional
near_city_id

Every parameter, every allowed value →

che168 API

6 of 11 endpoints, ready to run

View docs ↗

Live Chinese listings with the price given twice — in yuan and in 万元, the ten-thousand-yuan unit the market actually quotes — plus mileage in kilometres, the month of first registration, the city, the dealer id and the factory trim id that unlocks the spec sheet. Eighteen filters and eight sort orders, every one of them checked against what the source returned.

2 credits0 required · 6 optional
POST/che168/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the che168 API works

che168 is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 440 engines.

02
Call
POST /che168/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Price a Chinese car you have no identifiers for

The filters want the source's own pinyin, so a first integration does not start from a guess at a brand name. It starts from the directories, which need nothing hard-coded, and it finishes on the cheap per-car call rather than the expensive one.

01brands
POST/che168/v1/brands
{}

Every brand slug with its Chinese name. Pass one back as brand to get its series slugs. These are the spellings the search filter accepts — suggest returns numeric ids, not slugs.

02search
POST/che168/v1/search
{"city": "beijing", "brand": "baoma", "max_price": 20, "sort": "price_asc", "page": 1}

56 rows a page with price in both units, mileage in kilometres, registration month, city and the trim id. Read pagination.pages_available rather than looking for a result total — the source publishes none.

03car_summary
POST/che168/v1/car_summary
{"listing_id": "<id from a search row>"}

One kilobyte per car: dealer, seller type, rating, finance terms. Run this across the whole result set; it is what makes a nightly sync affordable.

04model_specs
POST/che168/v1/model_specs
{"spec_id": "<spec_id from the same row>"}

The factory trim sheet, cached for a week because a trim does not change. This is where the equipment and the original list price come from.

A priced, mileage-stamped, trim-resolved slice of the Chinese market from a brand name and nothing else — and only the cars you shortlisted cost you a detail call.

request
curl -X POST https://api.reefapi.com/che168/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"city":"beijing","limit":20}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "che168",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

One market, the price twice, and the identity the source will not give you

Measured against the live source across four cities, eighteen filters and ten sort codes. Four of these go against us, and the first decides whether this engine is any use to you at all.

Against us: there is no VIN on a Chinese listing

The seventeen-character VIN is not published. The record carries vin as null with vin_published false, and hands through the two opaque identifiers the source does use — a 32-character vehicle token and a 48-hex lookup signature — under names that say what they are. Neither is a VIN and neither decodes to one. If you join to a history or valuation database by VIN, this market cannot be joined that way: brand, series, trim id, registration month and mileage are the key you have. Our Korean engine does return the full VIN; this one cannot, and no amount of effort on our side changes that.

The price arrives in two units, and only one of them is yuan

China quotes used cars in 万元 — ten thousand yuan. A car listed at 151.8 costs 1,518,000 yuan. Every row carries price_wan_cny with the source's own figure and price_cny with the multiplication done, and the same pair exists for distance: mileage_wan_km beside mileage_km. We did not pick one for you. A bare 151.8 in a price column next to a dollar auction feed is a ten-thousand-fold error, and it is the easiest mistake to make with this source.

Against us: the public inventory is dealer-only

The seller-type filter for private owners returns zero cars nationwide — on a genuine result page with all its filter furniture present, not an error page. Dealer and certified-dealer both return full pages, and they return disjoint sets of dealers. So this is the source's answer rather than a broken filter: its public listings are dealer-consigned. The value is still offered, labelled with that measurement, so nobody reads the empty result as a fault.

Against us: a mistyped city does not fail, it silently goes national

We asked for two cities that do not exist. Both answered HTTP 200 with a full page of cars from all over the country, which would have handed you national data labelled as one city's. The engine catches it by comparing your slug against the market the source says it applied, and refuses the call. Separately, a real city whose filtered set is thin gets padded with cars from neighbouring markets — that one is reported as city_padding rather than refused, with every row's own city id beside it so you can slice it yourself.

Against us: the full inspection report is rare

A detail record does carry the roadworthiness-test expiry, the insurance expiry, the warranty expiry where one exists, the number of previous owners, and the source's own sentence about major accident, flood and fire damage. The separate third-party condition report is a different thing: its endpoint answers reliably, but of nine listings sampled across three different parts of the site, not one had a report published — it covers a narrow inspected-stock segment. The response says report_published false in that case rather than inventing a clean bill of health, and the demand and condition indices beside it do come back every time.

No result total exists, so none is reported

We searched a full half-megabyte result page for a count. Every number-of-cars string on it belongs to a script template, a sidebar shop's own inventory, or a tag tooltip. There is no result total anywhere. total_reported is therefore null with a note saying why, and pagination.pages_available carries the one real signal the source does publish: the highest page its own pager offers.

Paging is real to 100 pages, then it repeats

Pages 1, 2, 3, 20 and 99 of one city shared zero listing ids with one another, 56 rows each. Page 100, page 101 and page 150 returned the identical ids. So one filter reaches about 5,600 cars and then stops silently. has_more is false at the ceiling, and the way deeper is a narrower filter, not a higher page number.

Every sort was checked by reading the order that came back

Cheapest-first returned 0.60, 0.68, 0.69, 0.72. Dearest-first returned 2050, 1288, 968. Lowest-mileage returned four cars at zero before the first at 0.001. Oldest-car returned 1991/01, 1991/04, 1993/03. Newest-listing returned a page published that same day. One further code the source offers returned 56 cars whose registration date was uniformly its unknown-date placeholder, so we cannot say what it orders and it is not offered. The consequence: there is no newest-car-first sort. Combine min_year with newest.

The trim sheet is what this market has that others do not

Every search row carries a factory trim id, and that id returns 71 named parameters from Autohome's model database — trim name, manufacturer, the price when new, body structure, class, engine, gearbox, fuel, seats and about fifteen grouped sections. The car's own equipment list is a separate 2.4 KB call. A trim does not change, so the spec sheet is cached for a week and costs a single credit.

A dead listing id is unambiguous

An invented id answers NOT_FOUND with the source's own wording — that the car has been taken down — not an empty list and not a block. The message also says plainly that from outside, sold and never-existed cannot be told apart, so a sync can close the row instead of retrying it forever.

Business-level dealer data only

Dealer company name, numeric id, rating out of five and years as a member. No contact names and no phone numbers: the listing page does carry a named contact person and the parser drops it rather than publish it, which is also why there is nothing left to redact in the payload.

Chinese text, as the source publishes it

Titles, city names, colours, engine descriptions and every spec parameter come back in Chinese. Nothing is machine-translated, because a translation we invented is a value we cannot stand behind. Ids, prices, mileages and dates are language-neutral, and the city and brand directories give you both the Latin slug and the Chinese name so you can label your own interface.

What people build with che168

The jobs this data is most often used for.

11

endpoints

1/2

credits per call

01

Pricing and assortment teams use che168 to search che168's live used-car inventory.

02

Brand-protection teams use che168 to get everything che168 publishes about one listing, merged from its page and three of its JSON end….

03

Retail analysts use che168 to get the cheap one-listing lookup.

04

Catalog enrichment teams use che168 to get every photo URL che168 holds for a listing, from its own photo JSON (~3 KB) rather than the 3….

What che168 data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 440 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/che168/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"city":"beijing","limit":20}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/che168/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "city": "beijing",
  "limit": 20
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up che168.

Get a free key →
What is the che168 API?▾

che168 API is a ReefAPI endpoint group for che168 It returns live JSON through POST requests under /che168/v1.

Is the che168 API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. che168 calls use the same shared credit balance as every other ReefAPI engine.

Do I need a che168 login or account?▾

No login to che168 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 che168 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 che168 API use?▾

che168 actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call che168 from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call che168 actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the che168 API a che168 scraper?▾

It is the managed alternative to a DIY che168 scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same che168 back as clean JSON.

Why does my che168 scraper keep getting blocked?▾

Most che168 scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.

5 More APIs APIs on the same key

One key, one credit pool, one response envelope. If you are pulling che168, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 439 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-11.