Перейти к содержимому
Курс ЦБ РФ1 ¥ = 12.28 ₽1 $ = 81.97 ₽1 € = 91.93 ₽

Для партнёров

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

Как получить доступ

Ключи выдаёт наша команда, самостоятельной регистрации нет. Расскажите о вашей компании и о том, как вы будете использовать данные, и мы согласуем область действия ключа и лимиты.

  1. Откройте форму обратной связи и выберите тему «Сотрудничество».
  2. Напишите «API access», название компании, сценарий использования и IP-адреса серверов, с которых будете обращаться.
  3. Мы создадим для вас клиента и передадим ключ по закрытому каналу. Ключ показывается один раз, сохраните его надёжно.
  4. У ключа есть область действия: весь каталог или только автомобили из собственного наличия Avtoorder. Вызовите GET /me, чтобы увидеть её.
Запросить доступ к API

Быстрый старт

Передавайте ключ в заголовке 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-credentials401Заголовок Authorization не передан или в нём указана схема, отличная от Bearer.
invalid-credentials401Ключ неизвестен или имеет неверный формат.
key-revoked401Ключ отозван. Запросите у нас новый.
key-expired401Срок действия ключа истёк.
client-disabled401Ваша учётная запись отключена. Свяжитесь с нами.
ip-not-allowed403Запрос пришёл с IP-адреса, которого нет в списке разрешённых для ключа.
key-in-query400Ключ передан в URL. Перенесите его в заголовок Authorization и перевыпустите ключ.
invalid-request400Параметр неизвестен или некорректен либо минимум больше максимума (например, yearMin > yearMax). Массив errors перечисляет каждую проблему по пути.
not-found404Автомобиль или марка не существует либо вне области действия вашего ключа.
rate-limited429Превышен лимит в минуту. См. Retry-After.
quota-exceeded429Превышена суточная квота. Сбрасывается в 00:00 UTC.
auth-throttled429Слишком много неудачных попыток аутентификации с вашего IP-адреса. Подождите и повторите.
upstream-busy503Каталог временно перегружен. Повторите с задержкой.
unavailable503API сейчас недоступен: идёт обновление сервиса или API не настроен. Повторите чуть позже.
internal500Непредвиденная ошибка на нашей стороне. Укажите requestId при обращении к нам.
edge-rate-limited429Слишком много запросов с одного IP-адреса, отклонено на входе в сеть до обращения к API. Снизьте частоту и повторите позже.

Синхронизация всего каталога

Один запрос никогда не вернёт весь каталог, поэтому обходите его по маркам и срезам.

  1. Вызовите GET /brands, чтобы получить ключи всех марок.
  2. Для каждой марки запрашивайте GET /cars?brand=KEY&pageSize=100 и увеличивайте page, пока data не окажется пустым или page.hasMore не станет false.
  3. Разбейте каждую марку на срезы: сначала по одному году (yearMin и yearMax равны одному и тому же году), затем по ценовым диапазонам (например, по 10 000 CNY через priceMinCny и priceMaxCny). Каждый срез обходите постранично так же. Чем уже срезы, тем полнее охват.
  4. truncated: true означает, что результат может быть неполным: часть каталога удаётся просмотреть лишь частично. Сужение фильтров повышает охват, но truncated может остаться true даже для пустого или полностью полученного среза, поэтому не сужайте фильтры в ожидании false: его может так и не быть.
  5. Идентификаторы автомобилей стабильны: используйте их как первичный ключ и обновляйте автомобиль каждый раз, когда он снова приходит в ответе. Если автомобиля нет в одном ответе, это ещё не значит, что его сняли с продажи: удаляйте автомобиль, только если он не встретился за всю полную синхронизацию.
  6. 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.