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.
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.
che168 API
6 of 11 endpoints, ready to run
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.
// 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.
No OAuth app, no request signing, no per-site account. One key covers all 440 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
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.
{}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.
{"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.
{"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.
{"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.
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}'{
"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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
endpoints
credits per call
Pricing and assortment teams use che168 to search che168's live used-car inventory.
Brand-protection teams use che168 to get everything che168 publishes about one listing, merged from its page and three of its JSON end….
Retail analysts use che168 to get the cheap one-listing lookup.
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 →- 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 -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}'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"])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.
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.