Первый запрос за пять минут.
apiauto.space — REST API с JSON: каталоги подержанных машин Кореи (Encar), Китая (Che168) и аукционов США (Copart, IAAI) в одном формате записи. Базовый адрес — https://api.apiauto.space/v1.
Полная схема — в Swagger UI (можно отправлять запросы) и в Redoc; машиночитаемо — openapi.json.
Быстрый старт
- Откройте бота и возьмите демо-ключ: сутки, 100 запросов за данными, до 20 машин за запрос, все три рынка.
- Сохраните ключ в переменную окружения APIAUTO_KEY: он показывается один раз.
- Отправьте запрос:
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;
}Ответ — страница машин и курсор следующей страницы. Так выглядит одна запись (сокращено: две ссылки на фото и первые поля raw):
{
"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
}
}Держите ключ на сервере. API не разрешает запросы из браузера (CORS выключен), а ключ в коде страницы увидит любой посетитель.
Ключ и заголовки
Каждый запрос к данным передаёт ключ в заголовке X-API-Key. Ключ хранится у нас только в виде хеша; потерянный ключ перевыпускается в боте — старый работает ещё 24 часа, квота не сбрасывается.
| Заголовок ответа | Что значит |
|---|---|
X-Quota-Limit | Квота периода: машин в месяц (в демо — запросов за сутки). |
X-Quota-Remaining | Сколько осталось. |
X-Quota-Reset | Когда квота обновится, ISO 8601 UTC. |
X-RateLimit-Limit | Запросов в секунду по тарифу. |
X-RateLimit-Remaining | Осталось в текущей секунде. |
X-RateLimit-Reset | Секунд до сброса счётчика (1). |
Retry-After | При 429 и некоторых 503: через сколько секунд повторить. |
X-Data-Age-Seconds | Возраст копии рынка в секундах. |
Методы
| Метод | Что делает | Квота |
|---|---|---|
GET /v1/cars | Каталог рынка с фильтрами и курсором. | машины в ответе |
GET /v1/cars/{id} | Одна машина по id (encar:…, che168:…, copart:…, iaai:…). | 1 запись |
GET /v1/changes | Лента изменений: новые, снятые, цены. Pro и выше. | события в ответе |
GET /v1/references/brands | Марки рынка с числом машин. | бесплатно |
GET /v1/references/models | Модели марки с числом машин. | бесплатно |
GET /v1/references/dictionaries | Допустимые значения fuel, transmission, body_type и других полей. | бесплатно |
GET /v1/references/markets | Свежесть рынков, число машин, доступ по тарифу. | бесплатно |
GET /v1/us/live | Живой поиск США за пределами копии. Pro и выше. | отдельный счётчик |
GET /v1/usage | Расход квоты по рынкам. | бесплатно |
GET /img/{id}/{n}.jpg | Фото машины по подписанной ссылке из записи. | бесплатно |
GET /healthz | Проверка состояния: 503, если какой-то рынок старше порога свежести. | бесплатно |
GET /v1/cars
Обязателен только market (kr, cn, us). Остальные параметры сужают выборку:
| Параметр | Значение |
|---|---|
brand, model, trim | Точное совпадение; написание — как в /v1/references/brands и /models. |
year_min, year_max | Год выпуска. |
price_min, price_max | Цена в валюте рынка (KRW, CNY, USD). |
price_usd_min, price_usd_max | Цена в долларах по дневному курсу ЕЦБ. |
mileage_max | Пробег, км. |
fuel, transmission, body_type | Значения из /v1/references/dictionaries. |
has_photos | true / false |
is_active | По умолчанию true; false — снятые с продажи за последние 14 дней. |
q | До 6 слов названия (год, марка, модель, комплектация); короткие слова вроде k5, x5 — целиком. |
sort | -first_seen (default), first_seen, price, -price, year, -year, mileage, -mileage |
limit | 1–100, по умолчанию 20 (в демо до 20). |
cursor | Значение next_cursor прошлой страницы. |
Ответ: {"items": [...], "next_cursor": "…" | null, "count": 1834 | null}. count — сколько машин подходит под фильтры, если их не больше 10 000; больше — null. Пагинация только курсором: страница не «плывёт», когда каталог меняется. Параметр offset не поддерживается — запрос с ним получит 400.
Запись о машине
У всех рынков одни и те же ключи. Чего источник не даёт — null, а не догадка. Всё, что есть только у источника, — в raw.
| Поле | Что значит |
|---|---|
id | source:source_id, стабилен навсегда. |
market, source | kr · encar, cn · che168, us · copart | iaai |
title | Год, марка, модель, комплектация одной строкой. |
brand, model, trim | Латиницей; марки написаны одинаково во всех рынках. |
year, mileage_km, engine_cc | Числа; пробег в километрах. |
fuel, transmission, body_type, color | Канонические английские значения. |
vin | Если источник его дал. |
price | {amount, currency} — цена в валюте рынка (у США — ставка или «купить сейчас»). |
price_usd | Та же цена в долларах по дневному курсу ЕЦБ. |
location | {country, region, city} |
photos, photo_count | Подписанные ссылки на фото и их число. |
listing_url | Объявление в источнике (у США — null). |
is_active, first_seen_at, last_seen_at, disappeared_at, updated_at | Статус и время в UTC. |
raw | Поля источника как есть, включая исходные написания (raw.source_values). |
Фото
Ссылки в photos подписаны и действуют около суток — храните id машины, а не ссылку, и берите свежую запись, когда нужно. Фото отдаёт наш сервер из кэша; запросы к /img квоту не тратят.
GET /v1/changes
Параметры: market, since (обязателен, ISO 8601 с часовым поясом), type (added, disappeared, price_drop, price_up; можно несколько), min_pct (порог изменения цены в процентах, по умолчанию 0.5), limit, cursor. Каждое событие — одна запись квоты. Тарифы Pro, Max и демо.
GET /v1/us/live
Поиск по аукционам США у поставщика данных — для лотов, которых нет в копии. Параметры: make, model, year_min, year_max, price_max, page. Отдельный месячный счётчик: Pro — 2 000, Max — 10 000 запросов. Когда поставщик недоступен или исчерпал свой лимит, ответ — 503 с retry_after.
Квота и лимиты
Каталог и лента изменений списывают число возвращённых машин и событий, а не запросов: ответ с 37 машинами — 37 записей, пустой ответ квоту тарифа не тратит. Демо считает любой запрос за данными.
| Тариф | Квота | Рынков | Запросов/с | limit | Лента | Live US |
|---|---|---|---|---|---|---|
| Демо | 100 запросов за сутки | 3 | 1 | 20 | ✓ | — |
| Start | 100 000 машин в месяц | 1 | 2 | 100 | — | — |
| Pro | 500 000 машин в месяц | 2 | 5 | 100 | ✓ | 2 000 |
| Max | 2 000 000 машин в месяц | 3 | 10 | 100 | ✓ | 10 000 |
Квота месяца обновляется 1-го числа в 00:00 UTC. После окончания оплаченного периода ключ работает ещё 3 дня на пятой части скорости тарифа (но не меньше 1 запроса в секунду), затем отвечает 401 — продление в течение 90 дней сохраняет тот же ключ.
Границы рынков
| Рынок | Обновление | VIN | Фото | Чего нет |
|---|---|---|---|---|
| Корея · Encar | каждый час | редко (~0,1 %) | обычно 4 | коробка передач, объём двигателя |
| Китай · Che168 | каждый час | нет | много | VIN |
| США · Copart, IAAI | каждый час | да | много | архив прошедших торгов; кузов у части лотов |
Возраст копии рынка приходит в заголовке X-Data-Age-Seconds каждого ответа каталога. Текущая свежесть рынков — на странице статуса и в /v1/references/markets. Подробнее о рынках — на главной.
Ошибки
Тело ошибки — всегда JSON вида {"error": "code", ...} с полезными полями.
| HTTP | error | Когда |
|---|---|---|
| 400 | bad_request | Неверный параметр, limit выше тарифа, передан offset. Поле detail объясняет. |
| 401 | unauthorized | Нет ключа, ключ неверный, отозван или подписка закончилась. |
| 402 | quota_exhausted | Квота периода исчерпана; reset_at — когда обновится. |
| 403 | market_not_in_plan | Рынок не входит в тариф; markets — какие входят. |
| 403 | feature_not_in_plan | Лента изменений или живой поиск США не входят в тариф. |
| 403 | invalid_signature · link_expired | Ссылка на фото подделана или устарела. |
| 404 | not_found | Нет такой машины или пути. |
| 429 | rate_limited | Больше запросов в секунду, чем позволяет тариф; retry_after. |
| 502 | image_upstream_unavailable · invalid_image_upstream | Источник не отдал фото. |
| 503 | upstream_unavailable · upstream_quota_exhausted · upstream_invalid_response | Живой поиск США: поставщик недоступен; retry_after. |
| 500 | internal_error | Ошибка у нас; администраторы уже знают. |
Версии
Внутри /v1 поля не удаляются и не переименовываются; новые необязательные поля могут появляться — не падайте на незнакомых ключах. Несовместимые изменения выйдут под /v2 с переходным периодом, о котором предупредим в боте.
Changelog
2026-09 · v1
- Каталог, машина по id, лента изменений, справочники, расход, живой поиск США.
- Подписанные ссылки на фото через /img.
- Марки и модели во всех рынках пишутся одинаково (Ford, Mercedes-Benz, CX-5, XC60); исходные написания — в raw.source_values.
- В /v1/references/markets — data_age_seconds и stale: насколько свежа копия каждого рынка.