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. The base URL is https://api.apiauto.space/v1.

The full schema is in Swagger UI (you can send requests) and in Redoc; machine-readable at openapi.json.

Quick start

  1. Open the bot and take a demo key: one day, 100 data requests, up to 20 cars per request, all three markets.
  2. Save the key in the APIAUTO_KEY environment variable: it is shown once.
  3. Send a request:
curl
curl -s "https://api.apiauto.space/v1/cars?market=kr&brand=Kia&limit=20" \
  -H "X-API-Key: $APIAUTO_KEY"

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):

GET /v1/cars/encar:42795070
{
  "id": "encar:42795070",
  "market": "kr",
  "source": "encar",
  "source_id": "42795070",
  "title": "2022 BMW 1 Series (F40) M135i xDrive",
  "brand": "BMW",
  "model": "1 Series (F40)",
  "trim": "M135i xDrive",
  "year": 2022,
  "mileage_km": 49000,
  "fuel": "gasoline",
  "transmission": null,
  "engine_cc": null,
  "body_type": null,
  "color": null,
  "vin": null,
  "price": {
    "amount": "30000000.00",
    "currency": "KRW"
  },
  "price_usd": "21920.18",
  "location": {
    "country": "KR",
    "region": "Gyeonggi",
    "city": null
  },
  "photo_count": 4,
  "listing_url": "https://fem.encar.com/cars/detail/42795070",
  "is_active": true,
  "first_seen_at": "2026-09-25T14:04:10.804411Z",
  "last_seen_at": "2026-09-25T14:04:10.804411Z",
  "disappeared_at": null,
  "updated_at": "2026-09-25T14:04:10.804411Z",
  "source_mode": "replica",
  "photos": [
    "https://api.apiauto.space/img/encar:42795070/1.jpg?exp=…&sig=…",
    "https://api.apiauto.space/img/encar:42795070/2.jpg?exp=…&sig=…"
  ],
  "raw": {
    "badge": "M135i xDrive",
    "has_vin": false,
    "form_year": "202209",
    "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.

Key and headers

Every data request sends the key in the X-API-Key header. We keep only a hash of the key; a lost key is rotated in the bot — the old one works for 24 more hours and the quota is not reset.

Response headerMeaning
X-Quota-LimitThe period quota: cars a month (requests a day on the demo).
X-Quota-RemainingHow much is left.
X-Quota-ResetWhen the quota renews, ISO 8601 UTC.
X-RateLimit-LimitRequests per second on the plan.
X-RateLimit-RemainingLeft in the current second.
X-RateLimit-ResetSeconds until the counter resets (1).
Retry-AfterOn 429 and some 503s: seconds to wait before retrying.
X-Data-Age-SecondsThe age of the market copy in seconds.

Endpoints

EndpointWhat it doesQuota
GET /v1/carsA market's catalog with filters and a cursor.cars returned
GET /v1/cars/{id}One car by id (encar:…, che168:…, copart:…, iaai:…).1 record
GET /v1/changesThe change feed: new, removed, prices. Pro and above.events returned
GET /v1/references/brandsA market's makes with car counts.free
GET /v1/references/modelsA make's models with car counts.free
GET /v1/references/dictionariesAllowed values of fuel, transmission, body_type and other fields.free
GET /v1/references/marketsMarket freshness, car counts, plan access.free
GET /v1/us/liveLive US search beyond the copy. Pro and above.a separate counter
GET /v1/usageQuota usage by market.free
GET /img/{id}/{n}.jpgA car photo by the signed link from the record.free
GET /healthzHealth: 503 when any market is past its freshness threshold.free

GET /v1/cars

Only market (kr, cn, us) is required. Other parameters narrow the selection:

ParameterValue
brand, model, trimAn exact match; spelling as in /v1/references/brands and /models.
year_min, year_maxModel year.
price_min, price_maxPrice in the market's currency (KRW, CNY, USD).
price_usd_min, price_usd_maxPrice in dollars at the ECB daily rate.
mileage_maxMileage, km.
fuel, transmission, body_typeValues from /v1/references/dictionaries.
has_photostrue / false
is_activetrue by default; false — taken off sale within the last 14 days.
qUp to 6 words of the title (year, make, model, trim); short words such as k5, x5 match whole.
sort-first_seen (default), first_seen, price, -price, year, -year, mileage, -mileage
limit1–100, 20 by default (up to 20 on the demo).
cursorThe next_cursor of the previous page.

The answer: {"items": [...], "next_cursor": "…" | null, "count": 1834 | null}. count is how many cars match the filters when there are at most 10,000; above that it is null. Pagination is cursor-only, so a page does not shift while the catalog changes. offset is not supported — a request with it gets 400.

The car record

Every market has the same keys. What the source does not provide is null, never a guess. Whatever only the source has is in raw.

FieldMeaning
idsource:source_id, stable for good.
market, sourcekr · encar, cn · che168, us · copart | iaai
titleYear, make, model and trim in one line.
brand, model, trimIn Latin script; makes are spelled the same in every market.
year, mileage_km, engine_ccNumbers; mileage in kilometres.
fuel, transmission, body_type, colorCanonical English values.
vinWhen the source provided it.
price{amount, currency} — the price in the market's currency (US: the bid or buy-now).
price_usdThe same price in dollars at the ECB daily rate.
location{country, region, city}
photos, photo_countSigned photo links and their number.
listing_urlThe listing at the source (null for the US).
is_active, first_seen_at, last_seen_at, disappeared_at, updated_atStatus and times in UTC.
rawSource fields as they are, including the original spellings (raw.source_values).

Photos

Links in photos are signed and work for about a day — keep the car id, not the link, and fetch a fresh record when needed. Photos are served by our server from a cache; /img requests are free.

GET /v1/changes

Parameters: market, since (required, ISO 8601 with a time zone), type (added, disappeared, price_drop, price_up; repeatable), min_pct (the price change threshold in percent, 0.5 by default), limit, cursor. Each event costs one record. Pro, Max and the demo.

GET /v1/us/live

Search US auctions at the data provider — for lots that are not in the copy. Parameters: make, model, year_min, year_max, price_max, page. A separate monthly counter: Pro — 2,000, Max — 10,000 requests. When the provider is down or out of its own limit, the answer is 503 with retry_after.

Quota and limits

The catalog and the change feed count the cars and events returned, not requests: a response with 37 cars costs 37 records, an empty one costs nothing. The demo counts every data request.

PlanQuotaMarketsReq/slimitFeedLive US
Demo100 requests a day3120✓—
Start100,000 cars a month12100——
Pro500,000 cars a month25100✓2,000
Max2,000,000 cars a month310100✓10,000

The monthly quota renews on the 1st at 00:00 UTC. After the paid period ends the key works for 3 more days at a fifth of the plan's rate (at least 1 request per second), then answers 401 — renewing within 90 days keeps the same key.

Market boundaries

MarketUpdatedVINPhotosMissing
Korea · Encarevery hourrare (~0.1%)usually 4transmission, engine size
China · Che168every hournomanyVIN
USA · Copart, IAAIevery houryesmanypast auctions; body type on some lots

The age of the market copy comes in the X-Data-Age-Seconds header of every catalog answer. Current market freshness is on the status page and in /v1/references/markets. More about the markets — on the home page.

Errors

An error body is always JSON like {"error": "code", ...} with useful fields.

HTTPerrorWhen
400bad_requestA bad parameter, limit above the plan, offset given. The detail field explains.
401unauthorizedNo key, a wrong or revoked key, or the subscription has ended.
402quota_exhaustedThe period quota is spent; reset_at says when it renews.
403market_not_in_planThe market is not in the plan; markets lists those that are.
403feature_not_in_planThe change feed or live US search is not in the plan.
403invalid_signature · link_expiredA photo link is forged or expired.
404not_foundNo such car or path.
429rate_limitedMore requests per second than the plan allows; retry_after.
502image_upstream_unavailable · invalid_image_upstreamThe source did not return the photo.
503upstream_unavailable · upstream_quota_exhausted · upstream_invalid_responseLive US search: the provider is unavailable; retry_after.
500internal_errorOur fault; admins are already alerted.

Versioning

Within /v1 fields are never removed or renamed; new optional fields may appear — do not fail on unknown keys. Breaking changes will ship under /v2 with a transition period announced in the bot.

Changelog

2026-09 · v1

  • Catalog, car by id, change feed, references, usage, live US search.
  • Signed photo links through /img.
  • Makes and models are spelled the same in every market (Ford, Mercedes-Benz, CX-5, XC60); the original spellings stay in raw.source_values.
  • /v1/references/markets has data_age_seconds and stale: how fresh each market's copy is.