CarStat.dev
Руководство

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

/cars потоково выгружает все активные автомобили из ваших источников с полными отчётами через серверный курсор. Используйте его для локальной копии; /search — только для пользовательских запросов.

GET /carslimit до 2000, без scroll_id
сохранить data[]upsert по id, пропуск, если hash не изменился
GET next_urlбез изменений, до истечения курсора
scroll_id nullпроход завершён
архивацияавтомобилей, не встреченных в этом проходе
  1. Начните проходЗапросите /cars без scroll_id. Задавайте фильтры, например domains[] или is_leasing, только здесь.
  2. Следуйте next_url в точностиСохраняйте тот же ключ и фильтры на протяжении всего прохода. Изменение domains[] или is_leasing посреди прокрутки возвращает 422.
  3. Запрашивайте до истечения курсораscroll_time — от 1 до 15 минут (по умолчанию 10), считая от последнего запроса. При 403/404 с "scroll id was expired" начните новый проход.
  4. Завершите проход, затем архивируйтеПроход заканчивается, когда scroll_id равен null, а data пуст. Только после этого помечайте не встреченные автомобили как проданные.

Выполняйте полный проход 2–3 раза в день. Архивированные автомобили сразу исчезают из /search и /cars, но остаются доступны через /cars/{car_id} и /listing/{domain_id}/{listing_id} с archived: true около месяца.

Цикл полного экспорта
url="https://api.lotarius.com/cars?limit=2000&api_key=$CARS_API_KEY"

while [ -n "$url" ]; do
  page=$(curl -sfg "$url" -H "Accept: application/json") || { echo "cursor expired, restart"; exit 1; }
  echo "$page" | jq -c '.data[]' >> cars.ndjson
  url=$(echo "$page" | jq -r '.next_url // empty')
done
Последняя страницаLive
{
  "scroll_id": null,
  "data": [],
  "total": 3217391,
  "message": "No more data"
}