01 Guides
API docs: your first request in five minutes
apiauto.space is a JSON REST API: used-car catalogs of Korea (Encar), China (Che168) and US auctions (Copart, IAAI) in one record format.
South Korea (Encar) — more than 140,000 active cars; China (Che168) — more than 230,000; USA (Copart and IAAI) — more than 80,000. How the markets differ: data boundaries.
Base URL and schema
| What | Value |
|---|---|
| Base URL | https://api.apiauto.space/v1 |
| Format | JSON, UTF-8; times in ISO 8601 UTC |
| Key | X-API-Key — key and headers |
| Pagination | by cursor: next_cursor of the previous page |
| Schema | openapi.json · Swagger UI · Redoc |
The integration cycle
- ImportCopy a market to your side:
GET /v1/carswith the cursor, up to 100 cars per request. - Poll the changesOnce an hour ask
GET /v1/changes?since=…: new cars, removed cars and price changes. - UpdateFetch new ones by
GET /v1/cars/{id}, mark removed ones as sold. In detail: keeping a catalog in sync.
Quick start
- Open the bot and take a demo key: one day, 100 data requests, up to 20 cars per request, all three markets.
- Save the key in the APIAUTO_KEY environment variable: it is shown once.
- Send a request:
curl -s "https://api.apiauto.space/v1/cars?market=kr&brand=Kia&limit=20" \
-H "X-API-Key: $APIAUTO_KEY"import os
import httpx
client = httpx.Client(
base_url="https://api.apiauto.space/v1",
headers={"X-API-Key": os.environ["APIAUTO_KEY"]},
timeout=30,
)
# Two pages of 20: every car returned counts against the quota.
params = {"market": "kr", "brand": "Kia", "limit": 20}
for _ in range(2):
page = client.get("/cars", params=params).raise_for_status().json()
for car in page["items"]:
print(car["id"], car["title"], car["price"])
if not page["next_cursor"]:
break
params["cursor"] = page["next_cursor"]const response = await fetch(
"https://api.apiauto.space/v1/cars?market=cn&limit=20",
{ headers: { "X-API-Key": process.env.APIAUTO_KEY } },
);
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const { items, next_cursor } = await response.json();
console.log(items.map((car) => car.title));
console.log("records left:", response.headers.get("X-Quota-Remaining"));<?php
$ch = curl_init("https://api.apiauto.space/v1/cars?market=us&limit=20");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("APIAUTO_KEY")],
CURLOPT_RETURNTRANSFER => true,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("HTTP $status: $body");
}
foreach (json_decode($body, true)["items"] as $car) {
echo $car["id"], " ", $car["title"], PHP_EOL;
}Ready clients exist: pip install apiauto-space — the Python library, npm i apiauto — the JavaScript and TypeScript library. Their code and Encar examples are on GitHub.
The answer is a page of cars and the cursor of the next page. One record looks like this (shortened: two photo links and the first raw fields):
{
"id": "encar:43123480",
"market": "kr",
"source": "encar",
"source_id": "43123480",
"title": "2024 Volvo V60 Cross Country 2 Gen B5 Ultimate AWD",
"brand": "Volvo",
"model": "V60 Cross Country",
"generation": "V60 Cross Country 2 Gen",
"trim": "B5 Ultimate AWD",
"year": 2024,
"mileage_km": 33375,
"fuel": "gasoline",
"transmission": null,
"engine_cc": null,
"body_type": null,
"color": null,
"vin": null,
"price": {
"amount": "40900000.00",
"currency": "KRW"
},
"price_usd": "30101.68",
"location": {
"country": "KR",
"region": "Daegu",
"city": null
},
"photo_count": 4,
"listing_url": "https://fem.encar.com/cars/detail/43123480",
"is_active": true,
"first_seen_at": "2026-11-09T10:07:40.261677Z",
"last_seen_at": "2026-11-09T10:07:40.261677Z",
"disappeared_at": null,
"updated_at": "2026-11-09T10:07:40.261677Z",
"source_mode": "replica",
"photos": [
"https://api.apiauto.space/img/encar:43123480/1.jpg?exp=…&sig=…",
"https://api.apiauto.space/img/encar:43123480/2.jpg?exp=…&sig=…"
],
"raw": {
"badge": "B5 얼티메이트 AWD",
"has_vin": false,
"form_year": "202405",
"sell_type": "normal",
"body_class": null,
"office_city": "대구",
"badge_detail": null,
"has_accident": false
}
}Keep the key on your server. The API does not allow browser requests (CORS is off), and a key in page code is visible to every visitor.
Guides
Endpoints
GET /v1/cars Car catalogThe GET /v1/cars endpoint: filters by make, model, year, price and mileage, sorting, the cursor and sample answers with real Encar, Che168, Copart and IAAI cars.GET /v1/cars/{id} Car by idThe GET /v1/cars/{id} endpoint: the full record of one Encar, Che168, Copart or IAAI car by an id like encar:…, including cars taken off sale within 14 days.GET /v1/changes Change feedThe GET /v1/changes endpoint: new cars, cars taken off sale, price drops and rises with a percentage threshold — since a moment, with a cursor.GET /v1/us/live Live US searchThe GET /v1/us/live endpoint: search Copart and IAAI lots at the auction data provider when a car is not in the copy. Pro and Max plans, a separate counter.GET /v1/references/… ReferencesFree references: a market's makes and models with car counts, the allowed values of fuel, gearbox and body, and market freshness. They spend no quota.GET /v1/usage Quota usageThe GET /v1/usage endpoint: the plan, its term, the period quota and how much of it is spent — in total and per market, live US search included. Free.| More | What it does | Quota |
|---|---|---|
GET /img/{id}/{n}.jpg | A car photo by the signed link from the record. | free |
GET /healthz | Health: 503 when any market is past its freshness threshold. | free |