CarHub (Кархаб) API — автомобильные данные из Японии, Кореи и Китая для проектов по всей России. Каталог, характеристики, фотографии и расчёт стоимости — в одном формате.
Адрес /api/v2 закреплён за версией v2. Архивная документация v1 доступна для справки. Публичные /api/v1 и /v1 отключены 5 ноября 2026 года и возвращают 410 Gone; для новых и действующих интеграций используйте v2.
Фильтры, поиск и комплектации
Сначала получите фасеты — доступные варианты и диапазоны. Пользователю показывайте label, в запрос передавайте value.
q — текстовый поиск.
source_country — JP, KR или CN.
manufacturer и model можно повторять в URL для множественного выбора.
engine_type принимает значения через запятую: gasoline,hybrid.
sort — сортировка по цене, году или пробегу. Точные значения — в параметрах каталога.
Выбор комплектации
После выбора одной марки и одной модели запросите GET /cars/trims. Значение trims[].value передайте в trim у каталога и фасетов.
При смене марки или модели сбрасывайте выбранную комплектацию. В запросах фасетов и каталога сохраняйте одинаковый набор фильтров.
price_min/max — цена объявления в валюте источника. landed_price_min/max — полная или предварительная стоимость во Владивостоке в рублях; частичная сумма в этот фильтр не входит.
Фасеты и фильтры
# Значения фильтров: используйте value, показывайте labelcurl --max-time 15 'https://carhubauto.ru/api/v2/cars/facets?source_country=KR'# Одна марка и одна модель → доступные комплектацииcurl --get --max-time 15 'https://carhubauto.ru/api/v2/cars/trims' \ --data-urlencode 'manufacturer=BMW' \ --data-urlencode 'model=X3'# Каталог: варианты берите из ответа фасетовcurl --get --max-time 15 'https://carhubauto.ru/api/v2/cars' \ --data-urlencode 'source_country=KR' \ --data-urlencode 'engine_type=gasoline,hybrid' \ --data-urlencode 'sort=year_desc' \ --data-urlencode 'limit=10'
Курсорная пагинация
limit задаёт размер страницы: от 1 до 100. Продолжение находится в pagination.next_cursor, наличие следующей страницы — в pagination.has_more.
Первый запрос отправляйте без cursor.
Передавайте полученный курсор без изменения вместе с прежними фильтрами и сортировкой.
Заканчивайте обход при has_more=false или пустом next_cursor.
После изменения фильтров или сортировки начинайте с первой страницы. Курсор — непрозрачная строка; разбирать или конструировать его самостоятельно не нужно.
Параметры page и read_version предназначены для отдельно разрешённого партнёрского режима. Публичная интеграция использует cursor; смешивание режимов приводит к ошибке.
Обход каталога · JavaScript
// Сохраняйте один набор фильтров на протяжении обхода.const filters = { limit: "50", source_country: "KR", photo_only: "true" };let cursor = null;do { const url = new URL("https://carhubauto.ru/api/v2/cars"); url.search = new URLSearchParams(filters).toString(); if (cursor) url.searchParams.set("cursor", cursor); const response = await fetch(url, { signal: AbortSignal.timeout(15000) }); if (!response.ok) throw new Error(`HTTP ${response.status}`); const page = await response.json(); // Здесь сохраните или отобразите page.data. console.log(page.data); cursor = page.pagination.has_more ? page.pagination.next_cursor : null;} while (cursor);
Структура автомобиля
Каталог возвращает компактную карточку. Метод GET /cars/{car_id} дополняет её фотографиями, оснащением, характеристиками и статьями расчёта.
identity
Марка, модель, название и комплектация
listing
Год, пробег, цена объявления, валюта и статус продажи
specs
Кузов, двигатель, мощность, привод и другие характеристики
media
Фотографии и панорамы при наличии
pricing
Стоимость во Владивостоке и полнота расчёта
source
Страна и площадка-источник
links
Ссылка на страницу автомобиля
null означает отсутствие значения, а не ноль. Не все характеристики и медиа присутствуют у каждого объявления.
Подтверждённо проданные объявления могут сохраняться с прежним id и listing.sell_status=sold. Показывайте статус продажи; успешный HTTP-ответ сам по себе не подтверждает доступность автомобиля.
Срез публичного ответа от 19 октября 2026. Значения и наличие могут измениться. Полная схема: CarSummary и CarDetail.
Актуальность данных и наличие автомобиля
CarHub объединяет объявления из Японии, Кореи и Китая. Состав данных и частота обновления зависят от площадки-источника. Наличие карточки в каталоге само по себе не подтверждает, что автомобиль сейчас можно купить: проданные объявления остаются доступны по прежним адресам.
Проверяйте подтверждение статуса
Читайте listing.sell_status: active — в продаже, sold — подтверждённо продано, inactive — снято у источника, possibly_sold — статус уточняется.
listing.sell_status_checked_at — время подтверждения статуса у источника; listing.sell_status_origin указывает его происхождение. Если подтверждения нет, эти поля могут быть null. Время generated_at относится к формированию ответа API и не заменяет проверку источника.
Сохраняйте неизвестные значения
Если listing.price равна null, показывайте «Цена уточняется». Не заменяйте её нулём и не вычисляйте итоговую стоимость из неподтверждённой суммы. Не определяйте продажу или резерв по необычной цене.
Для рублёвой суммы используйте pricing.presentation и полноту расчёта. Частичная сумма не является итогом, а цена объявления в исходной валюте не включает все расходы на приобретение и доставку.
Перед оплатой и оформлением автомобиля подтвердите его наличие и условия у продавца или импортёра. Публичный каталог помогает выбрать предложение; он не подменяет подтверждение сделки.
Расчёт стоимости
Для показа цены используйте pricing.presentation: amount_rub — сумма, kind — её вид, label и notice — пояснение для пользователя.
pricing.status
Поле суммы
Как показывать
complete
total_rub
Полный расчёт
estimated
estimated_total_rub
Предварительная сумма с пояснением
partial / manual_review
known_total_rub
Рассчитанная часть стоимости; требуется уточнение
unavailable
Сумма может отсутствовать
Пояснение о недоступности расчёта
Сохраняйте смысл label и notice. Предварительная цена и известная часть расходов не должны выглядеть как окончательный итог.
listing.price_basis=fob означает цену FOB: автомобиль и доставка до экспортного порта Японии уже включены. Повторно не добавляйте японскую доставку; морская перевозка, таможня, утилизационный сбор, комиссия и расходы в России учитываются отдельно. listing.price_observed_at — время проверки исходной цены. Передавайте purchase_price_basis=fob, если используете эту сумму в отдельном запросе расчёта. При неизвестном морском фрахте API вернёт неполный расчёт с ocean_freight в недостающих параметрах.
Уточнение параметров
GET /cars/{car_id}/pricing-preview возвращает предварительный перерасчёт по переданным характеристикам. Требуется хотя бы один уточняющий параметр. Результат не сохраняет изменения в карточку.
Курсы валют и время
GET /currency/rates возвращает текущие доступные курсы за единицу валюты. В готовом расчёте автомобиля проверяйте currency_rate и rates_fetched_at: время расчёта и время получения текущего курса могут различаться.
Фотографии, панорамы и логотипы
Изображения автомобиля
Используйте абсолютные URL из media как есть. main_photo — основное фото, listing_photos — фотографии объявления, configuration_photos — фото комплектации.
При ошибке загрузки сохраняйте данные автомобиля и показывайте состояние «Фото пока недоступно».
Дополнительные материалы
panoramas содержит 360-виды, если они доступны; has_panorama помогает заранее показать элемент интерфейса.
Логотипы марок доступны в logo_url из справочника марок. Для медиа учитывайте заголовки кеширования.
Ошибки и ограничения
Сначала проверяйте HTTP-статус и Content-Type. Ошибки приложения содержат detail; защитный ответ сервера может иметь другой формат.
Публичный лимит приложения — 120 запросов в минуту с одного IP на метод. Дополнительные ограничения сервера могут сработать раньше. При 429 учитывайте Retry-After, если заголовок присутствует.
Повторяйте временные ошибки с увеличением паузы и ограничением числа попыток. Сохраняйте последнюю успешную выдачу и используйте кеширование. Ошибки параметров требуют исправления запроса.
Примеры ошибок
// 404: автомобиль не найден{ "detail": "Car not found" }// 422: limit превышает допустимое значение{ "detail": [{ "type": "less_than_equal", "loc": ["query", "limit"], "msg": "Input should be less than or equal to 100", "input": "500" }]}
Код
Действие клиента
400
Исправить сочетание фильтров или некорректный курсор
403
Проверить право на выбранный режим, например нумерованную выдачу
404
Проверить ID или slug; обновить сохранённые данные
409
В партнёрском режиме с версией начать просмотр заново
422
Проверить detail[].loc и исправить параметр
429
Снизить частоту, выдержать паузу и повторить
503 / 5xx
Сохранить текущий экран; повторить с задержкой
Порядок интеграции
Получите фасеты и постройте фильтры по value и label.
Загружайте каталог небольшими страницами; храните фильтры, сортировку и курсор вместе.
Открывайте полную карточку по id. Проверяйте статус продажи и отсутствующие значения.
Показывайте цену через pricing.presentation, сохраняя оговорки о полноте.
Обрабатывайте таймауты, ошибки HTTP, отсутствие фото и пустые результаты. Кешируйте успешные ответы с учётом их заголовков.
Ваша интеграция должна допускать появление новых полей в ответе. Используйте только нужные поля и обрабатывайте неизвестные значения безопасно.
Справочник
Методы, параметры и ответы
Выберите метод слева или переходите по списку. Типы, обязательные параметры, ограничения и схемы ниже собираются из публичной OpenAPI-спецификации.
Выберите схему, чтобы перейти к её полям в справочнике. Ссылки внутри схем раскрывают вложенные объекты. Пометка required означает обязательное поле; null — отдельное допустимое значение.