E-commerce & Marketplaces

How do you get che168 (二手车之家) used-car listings as JSON without getting blocked?

Call ReefAPI's che168 search action and read listings with listing_id, title, price_cny, mileage_km, first_registration, city, dealer_id and spec_id back as JSON. The one thing to get right before you store anything is the unit: che168 quotes prices in 万元 (ten thousand yuan) and mileage in 万公里 (ten thousand kilometres), so a listing that reads 151.8 is 1,518,000 yuan. Both forms come back on every row.

che168 engineLive JSON6 steps1,000 free credits

This guide demonstrates the real che168 API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.

Use case

Chinese used-car pricing, import sourcing, cross-market vehicle arbitrage and residual-value research.

Step by step

Call the live endpoint

  1. 1

    Read the unit before you read the number

    price_wan_cny and mileage_wan_km are the source's own figures in units of ten thousand; price_cny and mileage_km are the absolute values. Store the absolute ones and keep the 万 figures for anything you show a Chinese dealer.

  2. 2

    Start from brands, not from a guessed name

    The brand filter takes che168's pinyin slug. Call brands for all 618, then pass one back to get its series slugs. suggest returns numeric series ids, which are a different thing.

  3. 3

    Search once, enrich cheaply

    search costs a half-megabyte page; car_summary is a kilobyte. Pull the result set, then run car_summary over the ids you kept rather than car_detail over all of them.

  4. 4

    Join on spec_id, never on a VIN

    There is no VIN in this market. spec_id names the exact factory trim and is the strongest identifier available; combine it with first_registration and mileage_km.

  5. 5

    Page on pages_available and stop at 100

    There is no result total. Read pagination.pages_available, and remember the source silently repeats page 100 — narrow the filter instead of asking for page 150.

  6. 6

    Send sort explicitly if order matters

    Eight sorts are offered and each was verified by reading the order returned. There is no newest-car-first option, so combine min_year with newest.

Code

Copy the request

These snippets use the captured request params for che168/v1/search.

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}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.che168.search with {"city":"beijing","limit":20}.
Real response

Captured output from ReefAPI

Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/che168/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "city": "beijing",
    "limit": 20
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "che168",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 18116.3,
    "record_count": 20,
    "bytes": 495738,
    "cache_hit": false,
    "stop_reason": "complete",
    "upstream_requests": 2,
    "filters": {
      "city": "beijing",
      "sort": "default",
      "page": 1
    },
    "source_url": "https://www.che168.com/beijing/a0_0msdgscncgpi1ltocsp1exx0/",
    "city_ids": [
      110100
    ],
    "city_resolved": "beijing",
    "charged_credits": 2,
    "version": "1.0.0",
    "request_id": "0f230c402b874e5b",
    "queue_ms": 2.1,
    "fetched_at": "2026-10-11T12:01:41.097Z"
  },
  "data": {
    "results": [
      {
        "listing_id": 59776000,
        "url": "https://www.che168.com/dealer/201407/59776000.html",
        "title": "奔驰G级 2022款 G 500",
        "price_cny": 1518000,
        "price_wan_cny": 151.8,
        "new_car_price_cny": 2053700,
        "mileage_km": 13000,
        "mileage_wan_km": 1.3,
        "first_registration": "2022-08",
        "year": 2022,
        "city": "北京",
        "city_id": 110100,
        "province_id": 110000,
        "brand_id": 36,
        "series_id": 60,
        "spec_id": 54727,
        "dealer_id": 201407,
        "dealer_note": "12年黑金会员",
        "image": "https://2sc2.autoimg.cn/escimg/g33/M03/2F/AE/440x330_q87_c42_autohomecar__ChxpVWqlLAaADDHhAAm6FzFid0s612.jpg",
        "listed_at": "2026-10-10T13:06:26Z",
        "tags": [
          "90天回购保障"
        ],
        "is_new_car": false,
        "is_certified": false,
        "has_extended_warranty": false,
        "is_factory_certified": false
      },
      {
        "listing_id": 60094644,
        "url": "https://www.che168.com/dealer/201407/60094644.html",
        "title": "揽胜 2023款 3.0 L6 360PS 盛世版",
        "price_cny": 958000,
        "price_wan_cny": 95.8,
        "new_car_price_cny": 1550100,
        "mileage_km": 27000,
        "mileage_wan_km": 2.7,
        "first_registration": "2023-01",
        "year": 2023,
        "city": "北京",
        "city_id": 110100,
        "province_id": 110000,
        "brand_id": 49,
        "series_id": 69,
        "spec_id": 57781,
        "dealer_id": 201407,
        "dealer_note": "12年黑金会员",
        "image": "https://2sc2.autoimg.cn/escimg/g34/M08/7E/C2/440x330_q87_c42_autohomecar__ChxpWGrJxh-ANSrnAAk29_inxXs953.jpg",
        "listed_at": "2026-10-10T12:59:43Z",
        "tags": [
          "90天回购保障"
        ],
        "is_new_car": false,
        "is_certified": false,
        "has_extended_warranty": false,
        "is_factory_certified": false
      },
      {
        "listing_id": 59269937,
        "url": "https://www.che168.com/dealer/201407/59269937.html",
        "title": "Cayenne 2022款 Cayenne 3.0T 铂金版",
        "price_cny": 538000,
        "price_wan_cny": 53.8,
        "new_car_price_cny": 1105000,
        "mileage_km": 19000,
        "mileage_wan_km": 1.9,
        "first_registration": "2022-01",
        "year": 2022,
        "city": "北京",
        "city_id": 110100,
        "province_id": 110000,
        "brand_id": 40,
        "series_id": 172,
        "spec_id": 55408,
        "dealer_id": 201407,
        "dealer_note": "12年黑金会员",
        "image": "https://2sc2.autoimg.cn/escimg/g34/M0B/EA/A5/440x330_q87_c42_autohomecar__ChxpV2p1bT6AI7UyAAr57h2FW5E781.jpg",
        "listed_at": "2026-10-04T10:25:21Z",
        "tags": [
          "90天回购保障"
        ],
        "is_new_car": false,
        "is_certified": false,
        "has_extended_warranty": false,
        "is_factory_certified": false
      }
    ],
    "total_reported": null,
    "total_note": "che168 does not publish a result count. `pages_available` is the highest page its own pager links to; it saturates at 100 for broad filters, and page 101+ silently repeats page 100.",
    "pagination": {
      "page": 1,
      "per_page": 56,
      "returned": 20,
      "pages_available": 100,
      "has_more": true,
      "max_page": 100
    },
    "filters_applied": {
      "city": "beijing",
      "sort": "default",
      "page": 1
    },
    "city_ids_in_results": [
      110100
    ],
    "year_filter": null,
    "city_padding": false,
    "source_url": "https://www.che168.com/beijing/a0_0msdgscncgpi1ltocsp1exx0/"
  }
}
Manual way

Why this is hard manually

The unit is the trap, and it is a ten-thousand-fold one. China quotes used cars in 万元 — ten thousand yuan — and distance in 万公里. A car whose page says 151.8 and 1.3 costs 1,518,000 yuan and has done 13,000 km. Scrape the numbers off the page as they appear and drop them into a column beside a dollar auction feed and every figure you have is wrong by four orders of magnitude, with nothing in the data to flag it.

There is no VIN. This is the single biggest difference from the Korean and American markets, and it is not a scraping failure: che168 does not publish the seventeen-character number at all. What its page carries is a 32-character opaque vehicle token plus a 48-hex signature, used only to build its own claim-history and service-record links, and both of those sit behind a login. If your pipeline joins vehicles by VIN, this market cannot be joined that way.

A mistyped city does not fail. We asked for two cities that do not exist and both returned HTTP 200 with a full page of cars from all over the country — so a typo in a city slug hands you national data labelled as one city's, with no error anywhere. Separately, a city whose filtered result set is thin gets quietly padded with cars from neighbouring markets, which looks identical unless you check every row's own city id.

There is no result count to page against. We searched a complete half-megabyte result page for one. Every number-of-cars string on it turned out to belong to a script template, a sidebar shop's own inventory, or a tag tooltip. And paging is finite in a way the pager does not admit: pages 1, 2, 3, 20 and 99 of one city shared zero ids, but page 100, page 101 and page 150 returned the identical rows.

ReefAPI way

Why ReefAPI solves it

Every price and distance arrives in both units. price_wan_cny carries the source's own figure and price_cny carries the multiplication done; mileage_wan_km sits beside mileage_km. We publish both rather than choosing for you, because the 万 figure is what a Chinese dealer will quote back at you and the absolute one is what your database wants. new_car_price_cny carries the struck-through original list price where the listing shows one.

vin comes back as null with vin_published false, and the two opaque identifiers travel under names that say what they are: vehicle_token and vin_lookup_signature. Nothing is reverse-engineered into a plausible-looking VIN. What you can join on instead is brand_id, series_id, spec_id, first_registration and mileage_km — and spec_id is strong, because it names the exact factory trim rather than the model.

The trim sheet is the thing this market has that the others do not. Pass a search row's spec_id to model_specs and you get 71 named parameters out of Autohome's model database: trim name, manufacturer, the price when new, body structure, class, engine, gearbox, fuel, seat count and about fifteen grouped sections. A trim never changes, so it is cached for a week and costs one credit. car_options is the companion call for what that individual car was fitted with.

The city filter is checked for you. The engine compares the slug you sent against the market the source says it applied, and refuses the call with INVALID_PARAM when they differ — so the silent fallback to national results cannot reach your data. Where a valid city is padded with neighbouring stock, the response reports city_padding true and lists every city id present rather than hiding it.

total_reported is null with a note saying the source publishes no count, and pagination.pages_available carries the one real signal it does publish: the highest page its own pager offers. has_more is false at page 100, the measured ceiling. Nothing multiplies 56 by 100 into a total that would look authoritative and be invented.

Eleven actions share the engine: search, dealer_cars, car_detail, car_summary, car_photos, car_options, condition_report, model_specs, suggest, cities and brands. The cost shape matters here: search reads a half-megabyte page because the source renders its list server-side, while car_summary is one kilobyte, car_photos 2.9 KB and car_options 2.4 KB. Search once, then enrich with the cheap per-car calls — car_summary answered in under a second on every call we made.

brands is where an integration starts, because the search brand filter wants the source's own pinyin slug: 618 brands with their Chinese names, and 94 series for BMW when you pass the brand back. suggest does a different job — it turns a keyword into the source's model series with the live number of cars on sale and the real minimum and maximum asking price, which is a market-size answer in a single call. No che168 account, login or token is involved anywhere.

FAQ

Questions developers ask

Do I need a che168 account?

No. Everything the engine reads is public and logged-out. You send a ReefAPI key; there is no che168 login, token or OAuth flow.

Why is the price 151.8 instead of something in yuan?

Because China quotes used cars in 万元, ten thousand yuan, and 151.8 of those is 1,518,000 yuan. The engine returns both: price_wan_cny is the source's figure and price_cny is the absolute amount. Mileage works the same way.

Can I get the VIN?

No, and not because of a wall. che168 does not publish the seventeen-character VIN on a public listing. It exposes a 32-character opaque vehicle token and a 48-hex lookup signature, both only usable inside its own logged-in tools. vin comes back null with vin_published false rather than filled with something that looks like a VIN.

How do I find private sellers rather than dealers?

You cannot, and the measurement is worth knowing: the private-seller filter returns zero cars nationwide, on a genuine result page with all its filter furniture present. che168's public inventory is dealer-consigned. The filter value is still accepted so you can confirm it yourself.

What happens if I get the city slug wrong?

The engine refuses the call with INVALID_PARAM. Left to itself the source answers a bad slug with HTTP 200 and the whole country's cars, which is worse than an error because it looks like a result. Call cities for the 372 slugs it accepts.

Why does my single-city search contain other cities?

Because the source pads a thin result with cars from neighbouring markets. That is its behaviour, not an error, so the response reports city_padding true and lists every city id present. Filter on each row's city_id if you need strictly one market.

How many cars can I page through?

About 5,600 per filter: 56 a page to page 100. Beyond that the source repeats page 100 silently, which we measured on pages 101 and 150, so has_more is false at the ceiling. Narrow by city, brand or price band to reach more.

Is there accident history?

Partly. A detail record carries the roadworthiness-test expiry, the insurance expiry, the previous-owner count and the source's own sentence about major accident, flood and fire damage, quoted as written. The separate third-party inspection report exists but is rare: of nine listings sampled across three parts of the site, none had one published, and the response says report_published false rather than implying a clean history.

Is the data in English?

No. Titles, cities, colours, engine descriptions and spec parameters come back in Chinese, as che168 publishes them. Nothing is machine-translated. Ids, prices, mileages and dates are language-neutral, and the cities and brands directories give you both the Latin slug and the Chinese name.

What is spec_id and why does it matter?

It is Autohome's factory trim id, and it is the most useful identifier in this engine. Pass it to model_specs for 71 named parameters including the original list price. It identifies the model year and trim, not the individual car, so it is stable enough to cache.