CarSensor API & Scraper
The CarSensor API returns Japan's largest used-car marketplace as clean JSON, in five actions: search, listing, dealer, makers and models.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
carsensor.net is Recruit's marketplace and it is where the Japanese used-car trade actually advertises: on 2026-10-02 its live catalogue held 519,200 cars — 146,704 in Kanto, 76,516 in Tokai, 74,464 in Kansai, 67,773 in Kyushu, 40,240 in Tohoku, 35,036 in Hokuriku/Koshinetsu, 31,719 in Chugoku, 28,579 in Hokkaido and 18,169 in Shikoku, which add up to exactly the national figure. By class that is 454,685 Japanese-brand cars and 64,515 imports, 203,908 kei cars, 138,031 hybrids and 6,755 EVs, 111,656 SUVs, 68,570 minivans, 55,710 commercial vans, 22,341 trucks, 2,611 campers and 2,590 wheelchair-accessible vehicles, with 107,861 cars carrying a manufacturer certification and 489,368 declared free of accident-repair history. search narrows that by free-text keyword, any of 119 makers and their models, any of the 47 prefectures or 9 regions or a single municipality, price, first-registration year, odometer, engine displacement, body style, fuel, drivetrain, gearbox, seats, doors, remaining shaken inspection, warranty type, vehicle class, and 70 equipment and condition codes from one-owner and non-smoker to adaptive cruise control and a sunroof — and sorts by total payable, vehicle price, year, mileage or displacement in either direction. Every row carries the listing id, the public URL, the maker, the full title with grade, the dealer's badge line, the total payable AND the vehicle price separately in plain yen beside the exact string the site prints, the first-registration year, the odometer in kilometres, the remaining inspection, the accident-repair declaration, the warranty and servicing status, the city it sits in, photos, and the selling dealer with its postal address. listing adds the complete spec sheet as CarSensor's own tables print it — body style, colour, gearbox, displacement, engine type, seats, doors, drivetrain, steering side, chassis-number tail, plus the new-car dimensions, wheelbase, kerb weight and fuel grade — the Japanese condition fields (修復歴 accident-repair history, 車検 inspection expiry, 法定整備 statutory servicing, リサイクル料 recycling fee, one-owner, service-record book, non-smoker), every photo of that car at full size and as a thumbnail, the equipment panel with each item marked fitted or not, the optional purchase plans each with their own total and fees, and the dealer's resolvable page. dealer returns one dealer's profile and, on request, its entire advertised stock. makers returns all 119 maker codes with live counts (Toyota 118,750, Honda 74,460, Suzuki 72,148, Daihatsu 61,206, Nissan 55,726); models returns one maker's model table with a count per model (Prius 9,196, Alphard 7,688, Aqua 6,851). Verified on 2026-10-02: 29 of 29 live checks behaved as expected on two separate runs — 16 successes and 13 error cases each landing on the right code — all 27 search row fields filled on 210 of 210 rows sampled across seven different shelves, all 53 detail fields on 12 of 12 records, 6 of 6 round-trips returning the same id with a title and a price, and on 12 detail records the parsed yen price matched the two other figures the page publishes for the same car 12 of 12, with zero mismatches. No CarSensor account — one ReefAPI key and the standard { ok, data, meta, error } envelope.
What is actually on the site — live car counts on 2026-10-02
These are counts read off the live index, one call each, not estimates. They move as cars are listed and sold; every search response carries the matching total in the response body. The nine regional figures below sum to exactly 519,200, which is the national total the site itself prints.
| slice | parameter | live cars | note |
|---|---|---|---|
| Whole of Japan | — | 519,200 | the site's own counter |
| Kanto (Tokyo, Kanagawa, Saitama, Chiba, Ibaraki, Tochigi, Gunma, Yamanashi) | region=kanto | 146,704 | largest region |
| Tokai (Aichi, Shizuoka, Gifu, Mie) | region=tokai | 76,516 | |
| Kansai (Osaka, Hyogo, Kyoto, Shiga, Nara, Wakayama) | region=kansai | 74,464 | |
| Kyushu and Okinawa | region=kyushu | 67,773 | |
| Tohoku | region=tohoku | 40,240 | |
| Hokuriku / Koshinetsu | region=hokuriku | 35,036 | |
| Chugoku | region=chugoku | 31,719 | |
| Hokkaido | region=hokkaido | 28,579 | |
| Shikoku | region=shikoku | 18,169 | smallest region |
| Kei cars (the 660 cc class) | vehicle_class=K | 203,908 | 39% of the market |
| Hybrids | vehicle_class=H | 138,031 | |
| Imported cars | vehicle_class=Y | 64,515 | |
| Commercial vans | vehicle_class=S | 55,710 | |
| Trucks | body_type=T | 22,341 | |
| Campers / motorhomes | vehicle_class=C | 2,611 | |
| Wheelchair-accessible vehicles | vehicle_class=F | 2,590 | |
| Electric | fuel=4 | 6,755 | |
| Diesel | fuel=2 | 44,295 | |
| Manufacturer-certified used | certified_only=true | 107,861 | dealer-backed, with a factory warranty |
| Declared free of accident-repair history | equipment=REP0 | 489,368 | 94% of the catalogue |
| One owner from new | equipment=WOF1 | 102,397 | |
| 2023 or newer | year_from=2023 | 162,919 | |
| Under 20,000 km | mileage_max=20000 | 155,260 | |
| Under 500,000 JPY vehicle price | price_max=500000 | 62,842 | |
| Over 5,000,000 JPY vehicle price | price_min=5000000 | 48,265 | |
| Manual gearbox | transmission=MT | 39,732 | 8% — manuals are rare here |
| Left-hand drive | steering=L | 8,984 | Japan drives on the left |
By prefecture the same day: Saitama 40,789 · Aichi 39,856 · Osaka 29,908 · Hokkaido 28,579 · Chiba 27,949 · Fukuoka 25,930 · Kanagawa 22,881 · Hyogo 20,328 · Tokyo 17,241 · Shizuoka 15,988 · Okinawa 7,839 · Tottori 2,033. Note that Tokyo is NOT the biggest market — the dealer lots are in the surrounding prefectures, which is exactly the kind of thing a count tells you and an assumption does not. By maker: Toyota 118,750 · Honda 74,460 · Suzuki 72,148 · Daihatsu 61,206 · Nissan 55,726 · Mazda 20,136 · Mitsubishi 15,271 · Subaru 14,559 · Mercedes-Benz 9,598 · BMW 8,673 · Lexus 8,599 · MINI 5,839 · Volkswagen 5,495 · Audi 4,787 · Isuzu 4,213 · Mitsubishi Fuso 4,172 · Hino 3,969 · Porsche 3,132 · Volvo 3,094 · Jeep 2,834, with 119 maker codes in all. By model, within Toyota: Prius 9,196 · Alphard 7,688 · Aqua 6,851 · Voxy 6,354 · Harrier 5,483 · Sienta 5,423 — 235 Toyota models are listed in all, and Mazda's 86 lead with CX-5 3,523 · Roadster 1,332 · Flair Wagon 1,290. 🔴 Three things to know before you build against this. Page size is fixed at 30 and the source accepts no override. Whatever page number you ask for, if it is past the end the source returns the LAST page's rows with HTTP 200 instead of an error — so the API computes last_page from the source's own total and sets page_clamped so you can tell. And CarSensor's own search panel offers a body type (コンパクトカー) that its own backend rejects with a 404, so that one option is deliberately not offered here; most compact cars sit under Hatchback, which has 244,422.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/carsensor/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "prius",
"max_results": 20
}
}{
"ok": true,
"meta": {
"api": "carsensor",
"endpoint": "search",
"mode": "live",
"latency_ms": 1874.1,
"record_count": 30,
"bytes": 381611,
"cache_hit": false,
"upstream_requests": 1,
"source_url": "https://www.carsensor.net/usedcar/index.html?KW=prius",
"warnings": {
"ignored_params": [
"max_results"
],
"detail": "CarSensor accepts and silently ignores parameters it does not know (measured: an unknown name left both control totals unchanged), so these were NOT sent. Check the spelling against the action's parameter list."
},
"charged_credits": 1,
"version": "1.0.0",
"request_id": "0441e18618a64472",
"queue_ms": 2.1
},
"data": {
"total_results": 32,
"page": 1,
"page_size": 30,
"returned": 30,
"last_page": 2,
"page_clamped": false,
"has_more": true,
"dropped_non_listing_tiles": 0,
"listings": [
{
"listing_id": "AU5597215074",
"url": "https://www.carsensor.net/usedcar/detail/AU5597215074/index.html",
"photo_key": "U00044636745",
"maker": "トヨタ",
"title": "プリウスPHV 1.8 A レザーパッケージ トヨタセーフティセンスP/純ナビ/クルコン",
"new_arrival": false,
"tags": [
"販売店保証",
"購入プラン付"
],
"price_total_jpy": 3017000,
"price_total_display": "301.7万円",
"price_total_is_rounded": true,
"price_body_jpy": 2910000,
"price_body_display": "291.0万円",
"price_currency": "JPY",
"price_kind": "total_and_body",
"year": 2017,
"mileage_km": 65000,
"mileage_display": "6.5万km",
"inspection_until": "'28/04",
"repair_history": "なし",
"warranty": "保証付",
"maintenance": "法定整備無",
"location": "岩手県北上市",
"card_specs": [
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"images": [
"https://ccsrpcma.carsensor.net/CSphoto/bkkn/636/745/U00044636745/U00044636745_001L.JPG",
"https://ccsrpcml.carsensor.net/CSphoto/ml/636/745/U00044636745/SU00044636745_1_001.jpg",
"https://ccsrpcml.carsensor.net/CSphoto/ml/636/745/U00044636745/SU00044636745_2_001.jpg"
],
"image": "https://ccsrpcma.carsensor.net/CSphoto/bkkn/636/745/U00044636745/U00044636745_001L.JPG",
"image_count": 4,
"dealer": {
"shop_code": "309517003",
"name": "ブラウン北上店",
"address": "岩手県北上市村崎野14地割32-3",
"image": "https://ccsrpcma.carsensor.net/shopinfo/images/309/517/003/main.jpg",
"page_url": null
}
},
{
"listing_id": "AU7154496302",
"url": "https://www.carsensor.net/usedcar/detail/AU7154496302/index.html",
"photo_key": "UJ0053413126",
"maker": "トヨタ",
"title": "プリウス 1.8 S E-Four 4WD E-Four 4WD 純正ナビ プリウス 1.8S E-Four 4WD 2016年式 12.1万キロ シルバー ナビゲーション バックカメラ ETC車載器 ドラレコ アルミホイール スマートキー テレビ CDプレーヤー DVD再生 Bluetooth対応",
"new_arrival": false,
"tags": [
"販売店保証",
"購入プラン付",
"オンライン相談可"
],
"price_total_jpy": 950000,
"price_total_display": "95万円",
"price_total_is_rounded": true,
"price_body_jpy": 880000,
"price_body_display": "88.0万円",
"price_currency": "JPY",
"price_kind": "total_and_body",
"year": 2016,
"mileage_km": 121000,
"mileage_display": "12.1万km",
"inspection_until": "'27/07",
"repair_history": "なし",
"warranty": "保証付",
"maintenance": "法定整備付",
"location": "岐阜県瑞穂市",
"card_specs": [
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"images": [
"https://ccsrpcma.carsensor.net/CSphoto/bkkn/413/126/UJ0053413126/UJ0053413126_002L.JPG",
"https://ccsrpcml.carsensor.net/CSphoto/ml/413/126/UJ0053413126/SUJ0053413126_1_002.jpg",
"https://ccsrpcml.carsensor.net/CSphoto/ml/413/126/UJ0053413126/SUJ0053413126_2_001.jpg"
],
"image": "https://ccsrpcma.carsensor.net/CSphoto/bkkn/413/126/UJ0053413126/UJ0053413126_002L.JPG",
"image_count": 4,
"dealer": {
"shop_code": "303120010",
"name": "CAR GO(カーゴー) 瑞穂店",
"address": "岐阜県瑞穂市十九条119-1",
"image": "https://ccsrpcma.carsensor.net/shopinfo/images/303/120/010/main.jpg",
"page_url": null
}
},
{
"listing_id": "AU6895695667",
"url": "https://www.carsensor.net/usedcar/detail/AU6895695667/index.html",
"photo_key": "UJ0052143186",
"maker": "トヨタ",
"title": "プリウス 1.8 S パール 純正ナビ バックカメラ ETC車載器 アルミホイール プリウス 1.8S 2016年式 10.4万キロ ナビゲーション スマートキー ステアリングリモコン プッシュスタート ハイブリッド オートエアコン 電動格納ミラー",
"new_arrival": false,
"tags": [
"販売店保証",
"購入プラン付",
"オンライン相談可"
],
"price_total_jpy": 1029000,
"price_total_display": "102.9万円",
"price_total_is_rounded": true,
"price_body_jpy": 949000,
"price_body_display": "94.9万円",
"price_currency": "JPY",
"price_kind": "total_and_body",
"year": 2016,
"mileage_km": 104000,
"mileage_display": "10.4万km",
"inspection_until": "車検整備付",
"repair_history": "なし",
"warranty": "保証付",
"maintenance": "法定整備付",
"location": "岐阜県瑞穂市",
"card_specs": [
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"label": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"images": [
"https://ccsrpcma.carsensor.net/CSphoto/bkkn/143/186/UJ0052143186/UJ0052143186_002L.JPG",
"https://ccsrpcml.carsensor.net/CSphoto/ml/143/186/UJ0052143186/SUJ0052143186_1_001.jpg",
"https://ccsrpcml.carsensor.net/CSphoto/ml/143/186/UJ0052143186/SUJ0052143186_2_001.jpg"
],
"image": "https://ccsrpcma.carsensor.net/CSphoto/bkkn/143/186/UJ0052143186/UJ0052143186_002L.JPG",
"image_count": 4,
"dealer": {
"shop_code": "303120010",
"name": "CAR GO(カーゴー) 瑞穂店",
"address": "岐阜県瑞穂市十九条119-1",
"image": "https://ccsrpcma.carsensor.net/shopinfo/images/303/120/010/main.jpg",
"page_url": null
}
}
],
"query": "prius",
"geography": null,
"filters": {
"KW": "prius"
},
"sort": null
}
}What the CarSensor API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search CarSensor's live used-car inventory. Needs at least one narrowing parameter — `query`, `prefecture`, `region`, `city`, `maker`, `model` or any filter — because without one the source would hand back the whole 519 000-car national list 30 rows at a time; the error says so rather than returning it. Every filter here was measured biting against TWO controls in the same run (a narrow keyword search and a whole prefecture), and the numbers are in each parameter's description. 🔴 Page size is fixed by the source at 30 and there is no override. The source does not error on a page past the end: it silently repeats the LAST page (measured on two different result sets), so `last_page` is computed from the source's own total and `page_clamped` tells you when that happened. 🔴 Prices come back as plain yen. The site itself prints 万円 (ten-thousand yen) units, e.g. `68.1万円`, so every `*_jpy` field is that figure times 10 000 and `*_display` carries the source's own string beside it. Mileage is the same: the card prints `1.7万km` and `mileage_km` returns 17000. | Price-intelligence teams call search to search CarSensor's live used-car inventory. | query, prefecture, region, city, maker, ... |
| listing | Full detail of one car by id or URL: the complete spec sheet as the source's own tables print it (body style, colour, gearbox, displacement, engine type, seats, doors, drivetrain, steering side, chassis-number tail, plus the new-car dimensions, wheelbase, kerb weight and fuel grade), Japan's own condition fields (修復歴 accident-repair history, 車検 inspection expiry, 法定整備 statutory servicing, リサイクル料 recycling fee, one-owner, service-record book, non-smoker), the full photo set for THAT car, the dealer's own pitch line, the optional purchase plans each with their own total payable and fees, and the selling dealer with its resolvable dealer page. 🔴 Three independent price witnesses are returned, not one: the printed 万円 figure, the exact yen the page carries as an HTML attribute, and the yen in the page's own structured data — plus `price_body_witnesses_agree`, so a silent scale error is visible instead of invisible. A withdrawn or non-existent listing returns NOT_FOUND: the source answers 404 on a page that says 掲載終了 ("listing ended"), which is an answer about the car, so it is never retried. | Classifieds aggregators call listing to get full detail of one car by id or URL. | listing_id, url |
| dealer | One used-car dealer's profile page: trading name, registered company name, postal address, enquiry line, opening hours and closing days, and the review scores the source publishes, plus every label/value row of its own profile tables. With `include_stock` it also returns that dealer's whole advertised stock in the same row shape `search` uses. 🔴 `shop_id` and `prefecture` are required TOGETHER: the source keys the page on the pair and a real dealer id requested under the wrong prefecture answers 404 (measured). `listing` returns both for every car, and `dealer.page_url` can be passed as `url` instead. An unknown id answers 404 → NOT_FOUND. | Resale and arbitrage tools call dealer to get one used-car dealer's profile page. | shop_id, prefecture, url, include_stock |
| makers | The maker resolver `search` needs, because its `maker` parameter takes a code. Returns every one of the 119 two-letter maker codes CarSensor publishes, with the maker's Japanese name, the country group the source files it under (Japan, Germany, USA, UK, Sweden, France, Italy, Spain, Russia, China, Korea, Thailand, Malaysia, South Africa, other) and the number of cars it has listed right now — so a brand can be sized before it is searched. Measured 2026-10-02: Toyota 118 750, Honda 74 460, Nissan 55 726, Mazda 20 136, Mercedes-Benz 9 598, Lexus 8 599. One request, 77 880 B, cached six hours. Use the `models` action for one maker's model table. | Lead-generation teams call makers to get the maker resolver `search` needs, because its `maker` parameter takes a code. | none |
| models | One maker's model table — the resolver for `search`'s `model` parameter. Each row carries the `model_code` that parameter takes, the model's Japanese name and the live count the source prints beside it. 🔴 `live_listings` comes back null, never 0, for the models the source lists without a count: it publishes the maker's whole model history including cars nobody is selling today (measured 86 Mazda models, of which 55 carry a count; 235 rows for Toyota). Much heavier than `makers` — measured 1 655 747 B for Toyota and 692 682 B for Mazda against 77 880 B for the entire maker table — which is why it is a separate action rather than a parameter. Cached six hours. | Price-intelligence teams call models to get one maker's model table. | maker |
Call search from your stack
curl -X POST https://api.reefapi.com/carsensor/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"prius","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/carsensor/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "prius",
"max_results": 20
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/carsensor/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "prius",
"max_results": 20
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.carsensor.search with {"query":"prius","max_results":20}.Who uses this API and why
- Track Japanese used-car supply and asking prices at national scale: 519,200 live cars with the vehicle price and the total payable separately in yen, the odometer in kilometres, the model year and the accident-repair declaration on every row, filterable to any of 47 prefectures or a single municipality.
- Source export stock from Japan: 203,908 kei cars, 138,031 hybrids, 64,515 imports and 22,341 trucks, with the engine displacement, drivetrain, steering side, remaining shaken inspection and the dealer's address on every row — and 489,368 cars declared free of accident-repair history, which is the field an export buyer screens on first.
- Build a dealer-level inventory feed: every listing resolves to its selling dealer, and one dealer call with include_stock returns that dealer's whole advertised stock plus its address, opening hours and review scores — one request instead of thirty.
- Price a specific car against the live market: filter to one model code, year range and mileage band — Prius has 9,196 cars listed, Alphard 7,688, CX-5 3,523 — then sort by total payable to see the real spread including each dealer's fees, which the vehicle price alone hides.
- Monitor the certified and EV ends of the market: 107,861 manufacturer-certified cars with their warranty terms and inspection certificates, and 6,755 electric cars, each with the full equipment panel marked fitted or not fitted rather than a catalogue of options the car may not have.
Questions developers ask before integrating
The site shows prices like 68.1万円. What do I actually get back?
Plain yen, and the site's own string beside it so you can check us. Japanese car sites price in 万円, which is ten-thousand yen, and CarSensor prints the number and the unit in two separate places — so 68.1万円 is 681,000 JPY, not 68. The API reads the unit off the page rather than assuming it, returns price_total_jpy 681000 and price_body_jpy 561000 as integers, and returns price_total_display "68.1万円" and price_body_display "56.1万円" next to them. Mileage works identically: the card prints 1.7万km and you get mileage_km 17000 with mileage_display "1.7万km". An engine that read those numbers at face value would be out by a factor of 10,000, so we publish both and let you verify.
How do I know the price is right and not a parsing error?
Because the detail page publishes the vehicle price THREE times and we return all three. It is printed as 56.1万円, carried again as an exact yen figure in the page's markup, and carried a third time in the page's own structured data. The API returns price_body_jpy (our conversion), price_body_jpy_attr and price_body_jpy_ldjson (the page's own two figures) and price_body_witnesses_agree, which compares them on every record. Measured across 12 detail records: 12 of 12 agreed, zero mismatches, on both of our two separate verification runs. We also recompute the arithmetic: price_total_matches_body_plus_fees checks that the vehicle price plus the fees equals the printed total, and that came back true 12 of 12. If any of those ever disagreed you would see it as a false in the response rather than finding out from a customer.
Why are there two different prices on every car?
Because Japan quotes both, they are genuinely different numbers, and merging them would be wrong. 本体価格 is the vehicle on its own; 支払総額 is what you actually pay, including tax, registration and the dealer's 諸費用 fees. On one measured car that is 561,000 and 681,000 with 120,000 of fees in between — a 21% gap. You get price_body_jpy, price_total_jpy and price_fees_jpy as separate fields, never a single "price". Many dealers also offer optional purchase plans with their own totals, and those come back in purchase_plans: on the same car the base plan was 681,000, a roadside-assistance plan 687,000 and a cleaning plan 692,000, all on the identical vehicle price. One line against us: the vehicle price has an exact yen figure, but CarSensor publishes the TOTAL only to 0.1万円 — 1,000-yen — resolution, so price_total_is_rounded is true on every record rather than us pretending both are exact.
Does a filter actually do anything, or does the site just ignore it?
Every filter we expose was measured narrowing a same-run control, and we used two controls because one gives the wrong answer. The clearest case is exclude_kei: against a Prius keyword control it moved nothing at all, 11,002 to 11,002 — because no Prius is a kei car, which is an honest result and not a broken filter — and against a whole-prefecture control it bit properly, 29,908 to 20,796. Both numbers are in our published logs. 36 filters were measured this way, for example price_max 1,000,000 taking 11,002 to 2,832 and 29,908 to 8,125; year_from 2020 to 3,918 and 15,107; mileage_max 50,000 to 4,450 and 17,716; SUV to 630 and 6,175; 4WD to 952 and 4,837; seven seats to 199 and 3,412; left-hand drive to 12 and 786; two years of inspection left to 179 and 2,599. Handles the source accepts and does nothing with are deliberately not exposed, and an unknown value is rejected with INVALID_PARAM before the call is made rather than quietly returning an unfiltered result.
What equipment can I filter on, and can I combine several?
70 of CarSensor's own condition and equipment codes, and yes, they AND together — measured on three at once: no-accident-history alone matched 10,254 cars in a control, adding one-owner took it to 2,006 and adding a sunroof to 168, each step strictly narrower. There is no "maximum three filters" ceiling here. The list is the site's own vocabulary, covering condition (no accident-repair history, one owner, non-smoker, service-record book, registered-but-unused, ex-display, ex-rental, cold-climate spec, eco-car tax eligible), safety (autonomous emergency braking, adaptive cruise control, lane-keep assist, blind-spot monitor, 360-degree camera, parking sensors, the Japanese "Support Car" package, pedal-misapplication guard), comfort (heated and ventilated seats, leather, electric seats, three rows, walk-through, power tailgate, sunroof, dashcam, ETC toll transponder, 1500 W household outlet) and styling (alloy wheels, full aero kit, lowered or lifted suspension, resprayed). A code the source does not recognise is rejected here, because upstream it is accepted and silently ignored — which would hand you an unfiltered result that looked filtered.
How do I search one area, and how precise can I get?
Three levels. region takes one of the nine the site uses and they are a true partition — their totals summed to exactly the 519,200 national figure, so nothing is double counted or missing. prefecture takes any of the 47 by its romanised name. city takes CarSensor's own municipality code for a single town, and it composes with a prefecture: on one measured query a keyword matching 11,002 cars nationwide came down to 6 cars in one city, and that same city code under the wrong prefecture honestly returned 0 rather than silently ignoring one of them. City codes come back in the breadcrumb of every listing response, so you never have to guess one. One important line against us: a prefecture name the site does not know returns the FULL national list with HTTP 200 upstream rather than an error, so the API validates all 47 names and the 9 regions before calling and rejects a typo with INVALID_PARAM. You cannot pass a region and a prefecture together — the site has one geography slot and silently keeps one — so that combination is refused instead of guessed.
How many rows per page, and can I page through everything?
Thirty, fixed by the source, with no override — measured on pages 1, 2, 100 and 1000, with the remainder on the last page. The whole result set is pageable; there is no hidden reachable-results ceiling. But there is one trap and we handle it for you: if you ask for a page past the end, the source answers HTTP 200 with the LAST page's rows rather than an error. Measured twice — pages 17308 and 20000 of a 17,307-page set both returned page 17307's 20 rows byte for byte, and pages 368 and 9999 of a 367-page set both returned page 367's 22 rows. So every response carries last_page computed from the source's own total, page_clamped true when the source did that, and has_more which is false on the last page — follow has_more and you can never walk into it.
Is the row order stable, and what can I sort by?
The default order is reproducible: two consecutive calls with no sort returned the same first five listings in the same order. Sixteen sorts are available, and note that total payable and vehicle price sort separately because they are different numbers — cheapest total payable, dearest total payable, cheapest vehicle price, dearest vehicle price, newest and oldest listing, newest and oldest model year, lowest and highest mileage, smallest and largest engine, cars with or without inspection left first, and accident-free or repaired cars first. All five values we spot-checked reordered the first five rows. An unrecognised sort value breaks the call upstream with a 404, so it is validated here and comes back as INVALID_PARAM.
What does the equipment list on a detail record mean?
It means what is fitted, and we had to be careful about that. CarSensor renders the WHOLE equipment catalogue on every car's page and greys out the items that car does not have — on one measured car, 56 items listed and 17 actually fitted. Returning the list as-is would have claimed adaptive cruise control, lane-keep assist and a 360-degree camera on a car with none of them. So every row in equipment carries a fitted flag, and equipment_fitted is just the names that are really on the car, grouped by the site's own four categories (safety, comfort, interior, exterior). Filled on 12 of 12 records sampled.
What Japanese-market fields do I get that a generic car API would not have?
The ones that actually decide a price in Japan. 修復歴 — whether the car has accident-repair history, which is the single biggest value signal in this market and which 489,368 of the 519,200 live cars declare clean. 車検 — how much of the compulsory roadworthiness certificate is left, because a buyer otherwise pays to renew it; you get the expiry month on the row and can filter on at least 6, 12 or 24 months remaining. 法定整備 — whether statutory servicing is included before handover. リサイクル料 — whether the recycling levy is already paid. 認定中古車 — manufacturer certification, on 107,861 cars. The era-dated registration year as the site prints it (2011(H23), Heisei 23). The kei-car class, which is 203,908 cars and a tax category, not a size. The 車台末尾番号, the chassis-number tail. And 福祉車両 welfare-vehicle and キャンピングカー camper classes with their own equipment codes. All of them filled 12 of 12 on the records we sampled.
What do I get about the selling dealer?
CarSensor has no private sellers at all — every one of the 519,200 listings belongs to a registered dealer — so the dealer is always there. Every search row carries the dealer's trading name and full postal address (210 of 210 rows sampled, across seven different shelves). Every listing adds the dealer's numeric id and its resolvable dealer page. The dealer action then returns that dealer's profile: trading name, registered company name, postal address, opening hours, closing days, its own tagline, the badges CarSensor awards it, and the customer review scores published on the page with the sample size beside them. With include_stock you also get that dealer's entire advertised inventory in the same row shape as search — one extra call instead of thirty. One line against us: the only phone number the dealer page publishes is CarSensor's own free-dial number that forwards to the dealer, not the dealer's direct line, so it comes back as enquiry_phone with enquiry_phone_is_tracking_line true rather than as a telephone field you might trust.
How do I find the right maker and model code?
Two actions exist for exactly that, and they return the live tables rather than a snapshot. makers returns all 119 maker codes with the maker's Japanese name, the country group CarSensor files it under and the number of cars it has listed right now — so you can size a brand before searching it (Toyota 118,750, Honda 74,460, Suzuki 72,148, Daihatsu 61,206, Nissan 55,726, Mercedes-Benz 9,598, Lexus 8,599). models returns one maker's model table with the same live count per model: 235 rows for Toyota led by Prius 9,196, 86 for Mazda led by CX-5 3,523. Several models in one search are a genuine OR — Prius at 9,196 plus Crown came back as 10,619. One honest note: CarSensor lists a maker's whole model history, including models nobody is selling today, and for those it prints no count — so live_listings comes back null rather than a made-up 0.
What is NOT in here?
Things CarSensor does not publish, which we would rather name than have you discover. No sold prices and no price history — this is live asking-price inventory, so if you want a time series you have to collect it yourself. No depreciation curves or valuation estimates. No VIN: you get the chassis-number tail only, which is what the public page shows. No per-listing view count or posting timestamp. No facet counts alongside your results — the source prints one total per query and nothing else, so we do not invent a breakdown. No private sellers, because the site has none. No dealer geo-coordinates or aggregate rating, because the dealer page publishes neither. And no compact-car body type, because CarSensor's own backend rejects the option its own search panel offers.
What happens on a dead listing or a search that matches nothing?
Both are answers and both are typed properly. A listing that has sold or been withdrawn comes back as NOT_FOUND and is not retried: the source serves a real page saying 掲載終了, "listing ended", and that is a fact about the car rather than a problem with the request. A search that genuinely matches nothing returns ok with zero rows and total_results 0 — measured live, a city code under the wrong prefecture does exactly that. A malformed listing id is INVALID_PARAM, a missing one MISSING_PARAM, and a dealer id requested under the wrong prefecture is NOT_FOUND because the source keys the dealer page on the pair. 13 error cases were measured on two separate runs and all 13 landed on the right code both times.