Для партнёров
API Avtoorder для партнёров
JSON API только для чтения к автомобилям, доступным на avtoorder.com, включая автомобили в Китае, с оценкой доставки «под ключ».
Что даёт API
Всё доступно только для чтения и отдаётся в JSON. Базовый адрес:
https://avtoorder.com/api/v1- Список автомобилей с фильтрами, сортировкой и постраничной выдачей.
- Карточка автомобиля с оценкой цены «под ключ» для выбранного направления.
- Марки и доступные модели каждой марки.
- Фото по ссылкам нашего CDN в четырёх размерах (384, 640, 1080 и 1920 px).
Фильтры списка автомобилей (неизвестный параметр или минимум больше максимума отклоняются с кодом 400):
GET /cars
page (default 1), pageSize (1-100, default 24),
brand, model (needs brand),
yearMin, yearMax, priceMinCny, priceMaxCny,
mileageMinKm, mileageMaxKm,
fuel (gasoline|diesel|electric|hybrid|plugin_hybrid),
condition (new|used),
sort (recommended|price_asc|price_desc|mileage_asc|year_desc|newest),
default recommended
locale (en|ru|zh), default ru
GET /cars/{id} destination (default RU_VLA),
locale (default ru)
GET /brands
GET /brands/{brand}/models
GET /me
GET /media/{token} w=384|640|1080|1920 (default 1080),
no API key neededКак получить доступ
Ключи выдаёт наша команда, самостоятельной регистрации нет. Расскажите о вашей компании и о том, как вы будете использовать данные, и мы согласуем область действия ключа и лимиты.
- Откройте форму обратной связи и выберите тему «Сотрудничество».
- Напишите «API access», название компании, сценарий использования и IP-адреса серверов, с которых будете обращаться.
- Мы создадим для вас клиента и передадим ключ по закрытому каналу. Ключ показывается один раз, сохраните его надёжно.
- У ключа есть область действия: весь каталог или только автомобили из собственного наличия Avtoorder. Вызовите GET /me, чтобы увидеть её.
Быстрый старт
Передавайте ключ в заголовке Authorization. Замените заглушку своим ключом.
Список автомобилей марки
curl -H "Authorization: Bearer avto_live_YOUR_KEY" \
"https://avtoorder.com/api/v1/cars?brand=BRAND_KEY&pageSize=24&sort=price_asc"Один автомобиль с оценкой «под ключ»
curl -H "Authorization: Bearer avto_live_YOUR_KEY" \
"https://avtoorder.com/api/v1/cars/CAR_ID?locale=en"Ключи марок берите из GET /brands, идентификаторы автомобилей из ответа со списком.
Допустимые значения destination для GET /cars/{id} (по умолчанию RU_VLA):
RU_VLA, RU_NSK, RU_MOW, KZ_ALA, UZ_TAS, BY_MSK, KG_FRUПолная схема каждого метода есть в интерактивной документации.
Аутентификация и безопасность
- Передавайте ключ только как Authorization: Bearer avto_live_… в заголовке запроса.
- Ключ в строке запроса отклоняется с кодом 400 key-in-query, а сам ключ помечается как скомпрометированный: адреса попадают в логи и историю браузера. Если это случилось, перевыпустите ключ.
- Ключ можно ограничить списком IP-адресов.
- Ключ можно перевыпустить с переходным периодом, в течение которого старый ключ ещё работает, и в любой момент немедленно отозвать.
- Храните ключи на сервере. Не встраивайте их в браузерный или мобильный код.
Лимиты запросов
У каждого ключа есть лимит в минуту и суточная квота (сутки считаются по UTC). Ваши лимиты возвращает GET /me. Кроме того, на входе в сеть действует лимит на IP-адрес.
- Каждый ответ с успешной аутентификацией содержит заголовки RateLimit и RateLimit-Policy. RateLimit относится только к минутному окну; использование за сутки возвращает GET /me.
- При превышении лимита вы получите 429 с заголовком Retry-After (секунды). Подождите это время перед повтором.
- Неудачные попытки аутентификации ограничиваются отдельно.
- Повторяйте 429 и 503 с экспоненциальной задержкой. Остальные ошибки 4xx не повторяйте без изменений.
- Некоторые запросы, ответ на которые ещё не закэширован, выполняются 10–15 секунд; закладывайте до 30 секунд на запрос.
Ошибки
Ошибки возвращаются в формате application/problem+json (RFC 9457). Поле type — ссылка на соответствующую строку ниже. Текст detail на английском и предназначен для разработчиков. Поддерживаются только GET и HEAD: другие методы отклоняются (405 с пустым телом, для ссылок на фото — 403); для JSON-эндпоинтов OPTIONS возвращает список разрешённых методов.
Пример
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 12
RateLimit-Policy: "minute";q=60;w=60, "day";q=20000;w=86400
RateLimit: "minute";r=0;t=12
{
"type": "https://avtoorder.com/en/developers#error-rate-limited",
"title": "Rate limit exceeded",
"status": 429,
"requestId": "0f3c…"
}| Код | HTTP | Что это значит |
|---|---|---|
| missing-credentials | 401 | Заголовок Authorization не передан или в нём указана схема, отличная от Bearer. |
| invalid-credentials | 401 | Ключ неизвестен или имеет неверный формат. |
| key-revoked | 401 | Ключ отозван. Запросите у нас новый. |
| key-expired | 401 | Срок действия ключа истёк. |
| client-disabled | 401 | Ваша учётная запись отключена. Свяжитесь с нами. |
| ip-not-allowed | 403 | Запрос пришёл с IP-адреса, которого нет в списке разрешённых для ключа. |
| key-in-query | 400 | Ключ передан в URL. Перенесите его в заголовок Authorization и перевыпустите ключ. |
| invalid-request | 400 | Параметр неизвестен или некорректен либо минимум больше максимума (например, yearMin > yearMax). Массив errors перечисляет каждую проблему по пути. |
| not-found | 404 | Автомобиль или марка не существует либо вне области действия вашего ключа. |
| rate-limited | 429 | Превышен лимит в минуту. См. Retry-After. |
| quota-exceeded | 429 | Превышена суточная квота. Сбрасывается в 00:00 UTC. |
| auth-throttled | 429 | Слишком много неудачных попыток аутентификации с вашего IP-адреса. Подождите и повторите. |
| upstream-busy | 503 | Каталог временно перегружен. Повторите с задержкой. |
| unavailable | 503 | API сейчас недоступен: идёт обновление сервиса или API не настроен. Повторите чуть позже. |
| internal | 500 | Непредвиденная ошибка на нашей стороне. Укажите requestId при обращении к нам. |
| edge-rate-limited | 429 | Слишком много запросов с одного IP-адреса, отклонено на входе в сеть до обращения к API. Снизьте частоту и повторите позже. |
Синхронизация всего каталога
Один запрос никогда не вернёт весь каталог, поэтому обходите его по маркам и срезам.
- Вызовите GET /brands, чтобы получить ключи всех марок.
- Для каждой марки запрашивайте GET /cars?brand=KEY&pageSize=100 и увеличивайте page, пока data не окажется пустым или page.hasMore не станет false.
- Разбейте каждую марку на срезы: сначала по одному году (yearMin и yearMax равны одному и тому же году), затем по ценовым диапазонам (например, по 10 000 CNY через priceMinCny и priceMaxCny). Каждый срез обходите постранично так же. Чем уже срезы, тем полнее охват.
- truncated: true означает, что результат может быть неполным: часть каталога удаётся просмотреть лишь частично. Сужение фильтров повышает охват, но truncated может остаться true даже для пустого или полностью полученного среза, поэтому не сужайте фильтры в ожидании false: его может так и не быть.
- Идентификаторы автомобилей стабильны: используйте их как первичный ключ и обновляйте автомобиль каждый раз, когда он снова приходит в ответе. Если автомобиля нет в одном ответе, это ещё не значит, что его сняли с продажи: удаляйте автомобиль, только если он не встретился за всю полную синхронизацию.
- fetchedAt — время вашего ответа, а не данных. Данные могут быть старше до 24 часов, поэтому синхронизация чаще раза в час мало что даёт.
О данных
- Цена «под ключ» (turnkeyEstimate) — оценка, а не предложение. В ней есть isEstimate: true, использованный курс, его источник (fx.rateSource) и время фиксации (fx.capturedAt).
- Все допущения, сделанные при расчёте, перечислены в customs.assumptions. totalIsLowerBound: true (неизвестна мощность двигателя или таможенная пошлина) означает, что реальная сумма может быть выше. Неизвестная дата регистрации отмечается отдельно (registrationUnknown), но не делает сумму нижней границей.
- Если цена автомобиля неизвестна, priceCny равен null, а priceOnRequest равен true. Никогда не 0. Для таких автомобилей оценки нет, а turnkeyUnavailableReason равен price_on_request. Для некоторых объявлений мы вообще не рассчитываем стоимость «под ключ» (например, для объявлений с ценой в USD, см. askingPrice.currency) — тогда turnkeyUnavailableReason равен not_offered_for_listing.
- totalEstimate в списках приблизителен, может меняться между страницами и может быть равен 0, даже когда truncated равно true. Не используйте его, чтобы решить, когда остановить обход.
- sort=recommended (по умолчанию) — смешанное ранжирование, в котором чередуются автомобили из разных частей каталога; newest — тоже смешанное ранжирование, но внутри каждой части каталога более новые автомобили идут первыми, это не строгая сортировка по дате публикации; price_asc и price_desc — по возрастанию и по убыванию цены; mileage_asc — сначала с наименьшим пробегом; year_desc — сначала с наибольшим year. year — год автомобиля в том виде, в каком его указывает объявление: у большинства подержанных автомобилей это год первой регистрации, у некоторых — модельный год. firstRegistration — месяц и год первой регистрации, если они известны.
- fuel берётся из объявления — из указанного в нём типа силовой установки, если он надёжен, иначе из однозначного обозначения технологии или двигателя в названии (например, DM-i — это plugin_hybrid, 280TSI — gasoline) — и равно null, если ни то ни другое его не указывает. Автомобиль с fuel: null не попадает под фильтр fuel, поэтому в выдаче с этим фильтром — автомобили, у которых этот тип известен, а не обязательно все такие. Гибриды с увеличенным запасом хода (EREV) указываются как hybrid. condition: used — автомобиль не отмечен как новый; автомобили с condition: null тоже могут попадать в выдачу, в том числе при фильтре condition=used.
- locale задаёт язык названий и подписей там, где есть перевод; названия автомобилей, комплектации и некоторые значения характеристик часто приходят на английском или китайском независимо от locale.
- GET /brands возвращает ключи марок, известных каталогу: у некоторых сейчас может не быть автомобилей, а count равен null, если количество неизвестно. Ключи марок и моделей могут содержать не только ASCII-символы (например, китайские), поэтому кодируйте их для URL.
- Фото отдаются по нашим собственным ссылкам (размеры 384, 640, 1080 и 1920 через ?w=). Ссылки стабильны, но не гарантированно вечны: после отзыва ключа новые фото по ним больше не загружаются, хотя уже закэшированные изображения могут ещё какое-то время открываться, а ссылка на удалённое фото перестаёт работать. Обновляйте их из API при повторной синхронизации.
- VIN-номера скрыты, кроме автомобилей из собственного наличия Avtoorder.
Условия использования
- Не перепродавайте и не распространяйте сырые данные API как самостоятельный информационный продукт. Показ автомобилей вашим клиентам допустим.
- Указание источника не требуется.
- Мы можем отозвать ключ в любой момент при нарушении условий, утечке ключа или злоупотреблении сервисом.
- Лимиты и квоты применяются строго.
- Храните ключ в тайне и сразу сообщите нам, если он стал известен посторонним.
- API может меняться. Совместимые добавления не анонсируются, несовместимые изменения выходят в новой версии пути.
Интерактивная документация
Пробуйте все методы прямо в браузере и скачайте машиночитаемую спецификацию OpenAPI.