Car Image API

Сценарии использования · Страхование

Изображения автомобилей для урегулирования страховых случаев и расчёта полисов

Бесплатно декодируйте VIN из полиса или заявления о страховом случае, сохраните id автомобиля и покажите один подписанный ракурс застрахованной модели в деле по страховому случаю и в PDF с расчётом стоимости.

Руководство по интеграции, написанное на основе документированного поведения API; конкретные клиенты в нём не упоминаются. Опубликовано .

Проблема: в записи указан автомобиль, которого никто не видит

В форме расчёта страховки, в записи о полисе и в первичном уведомлении об убытке автомобиль указывается одинаково: по VIN, который вводит клиент или который считывается из регистрационного документа. Всё, что человек затем видит об автомобиле, — это текст: год, марка, модель и, возможно, комплектация. Вопрос «Это ваш автомобиль?» рядом со строкой текста располагает к ответу «да» на что угодно.

Изображение модели, в которую расшифровывается VIN, позволяет клиенту и аджастеру с первого взгляда убедиться, что в записи указан автомобиль нужного типа. Какой именно это автомобиль, изображение показать не может: рендер — студийная иллюстрация марки, модели и года из каталога, и он не изображает какое-либо конкретное физическое транспортное средство. Именно этот факт определяет всю описанную ниже интеграцию.

Как выглядит интеграция

  • Расшифровка при оформлении. Процесс расчёта или система полисов один раз бесплатно расшифровывает VIN и сохраняет id автомобиля из каталога вместе с полисом. Страховые случаи, открытые по полису, наследуют его.
  • Один ракурс везде. front-3-4, основной ракурс, в одной и той же рамке на экране расчёта, в рабочем месте урегулирования убытков, в PDF с расчётом и на портале полисов, чтобы на каждом экране модель выглядела одинаково.
  • Подписанные URL, а не ключ. Браузеры и генераторы PDF загружают URL без ключа, которые создаёт ваш сервер.
  • Словами — то, чего не покажет изображение. Комплектация, опции, цвет по документам, повреждения и пробег остаются в тексте и на фотографиях, а изображение помечено как иллюстративное.

Шаг 1: бесплатно расшифруйте VIN

GET /api/v1/vin/{vin} бесплатен и требует ключа с images:read. Он возвращает декодированные поля из данных vPIC от NHTSA (год, марка, модель, комплектация, серия, класс кузова, двигатель и все прочие атрибуты, известные vPIC), а если автомобиль есть в каталоге — объект vehicle с его постоянным идентификатором и готовым image_path.

Декодирование VIN из расчёта
curl --fail-with-body \
  -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/vin/WP0AA2A96RS201834"
200 OK (сокращено)
{
  "data": {
    "vin": "WP0AA2A96RS201834",
    "valid": true,
    "errors": [],
    "suggested_vin": null,
    "year": 2024,
    "make": "Porsche",
    "model": "911",
    "trim": "Carrera, Carrera T, Carrera 4",
    "series": "Type 992",
    "body_class": "Coupe",
    "vehicle": {
      "id": "veh_78qtwrgh37bkr",
      "make": "Porsche",
      "model": "911",
      "year": 2024,
      "image_path": "/api/v1/images/car?vehicle=veh_78qtwrgh37bkr"
    },
    "source": "vpic-db"
  }
}

Посмотрите на trim: «Carrera, Carrera T, Carrera 4». Шаблон этого VIN охватывает три комплектации, поэтому даже декодирование не может сказать, какую из них страхует полис, а рендер 911 2024 года — тем более. Попросите клиента подтвердить комплектацию, храните её как текст вместе с series и body_class, а изображение пусть показывает модель.

  • VIN с неверной контрольной цифрой всё равно декодируется — с valid: false и описанием проблемы в errors; suggested_vin отмечает символом ! знак, который vPIC считает ошибочным, — именно это и стоит показать человеку, который вводит номер.
  • Форма, в которой есть только первые символы, может отправить частичный VIN: не менее пяти символов, * на месте каждой неизвестной позиции и, при необходимости, year.
  • 404 означает, что в vPIC нет записи для этого шаблона. vPIC охватывает автомобили, выпущенные для рынка США, поэтому для других рынков начинайте с марки и модели через POST /api/v1/images/resolve — это тоже бесплатно.

Шаг 2: сохраните id автомобиля в полисе и в деле по страховому случаю

Храните data.vehicle.id в полисе как обычную строку и копируйте его в каждый убыток, заявленный по этому полису. Идентификатор детерминирован и постоянен: у одного и того же автомобиля один и тот же id при каждом деплое и после каждого выпуска каталога, поэтому его можно безопасно использовать как внешний ключ, а во всех последующих запросах указывать vehicle=veh_78qtwrgh37bkr вместо марки и модели.

Если data.vehicle равно null, расшифрованных марки и модели нет в каталоге — как у прицепов и некоторых коммерческих шасси. Расшифрованные поля вы всё равно можете показывать. Показывайте их без изображения и никогда не подставляйте вместо него похожий автомобиль.

Шаг 3: один ракурс в деле об убытке и в PDF с расчётом

Экран расчёта стоимости, рабочее место урегулирования убытков и портал полисов — браузерные приложения, поэтому ваш сервер выпускает подписанные URL через POST /api/v1/image-urls: каждый URL в момент выпуска засчитывает своё изображение как изображение автомобиля текущего месяца, до 50 за вызов, и загружается бесплатно до истечения срока. Настройте кадр один раз и используйте те же параметры: front-3-4 в рамке 640×400 с fit: "contain" и trim с небольшим padding, чтобы купе и пикап заполняли рамку одинаково. Срок жизни каждого URL зависит от того, где он показывается:

  • Рабочее место по урегулированию убытков. Создавайте URL при отрисовке экрана. Срок действия по умолчанию — 1 час — покрывает рабочую сессию, а для убытка, повторно открытого на следующий день, создаётся новый URL.
  • PDF с расчётом. Когда PDF формируется из HTML, рендерер загружает изображение один раз и встраивает его, поэтому срока действия по умолчанию вполне хватает, а сервис PDF никогда не получает ваш ключ. format: "jpg" помещает изображение на белый фон — именно это и нужно документу.
  • Портал полисов и письмо о продлении. Они живут дольше любого срока действия ссылки, поэтому создавайте URL с renew: true и ttl_seconds: 604800 (7 дней). URL продолжает работать, продление учитывает изображение один раз в том месяце, на который оно приходится, и ничего сверх этого, если оно уже было учтено в этом месяце, а renew_days: 365 — максимально допустимое значение — покрывает годовой срок действия полиса.

Задайте для ключа, который создаёт URL, список разрешённых источников на панели управления: URL, загруженный с другого сайта, возвращает 403 с origin_not_allowed, а почтовые клиенты и программы просмотра PDF, которые не отправляют Referer, по-прежнему его загружают. Отзыв ключа аннулирует все созданные им URL.

Регистрация убытка, рабочее место специалиста, PDF и портал — с TypeScript SDK
import { CarImageClient, type ImageParams } from "@meterapp/car-image-sdk";

const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });

// Quote or policy intake: the VIN in, the vehicle id and the decoded words on the record. Free.
const { data: decoded } = await client.decodeVin(policy.vin);
policy.vehicleId = decoded.vehicle?.id ?? null; // null: show the decoded text and no picture
policy.trimText = decoded.trim;                 // "Carrera, Carrera T, Carrera 4": words, never the picture

if (policy.vehicleId) {
  // One view, framed once, for every screen and document that shows this policy's car.
  const view: ImageParams = {
    vehicle: policy.vehicleId, view: "front-3-4", color: policy.paintHex ?? "silver",
    width: 640, height: 400, fit: "contain", trim: true, padding: 6,
  };

  // The claims workbench: a URL for this session, minted when the screen draws.
  const { data: [workbench] } = await client.createImageUrls({ ...view, format: "auto" });

  // The quote PDF: the HTML-to-PDF renderer loads the URL once and embeds the picture.
  const { data: [pdf] } = await client.createImageUrls({ ...view, format: "jpg" });

  // The policy portal and the renewal email: one URL that keeps working for the term.
  const { data: [portal] } = await client.createImageUrls(
    { ...view, format: "auto" },
    { ttlSeconds: 604800, renew: true, renewDays: 365, idempotencyKey: `policy:${policy.id}:image` }
  );
}

Шаг 4: подпишите изображение как модель, а не как застрахованный автомобиль

Размещайте пометку там, где находится изображение, а не только в сноске: в alt-тексте и в подписи под изображением. Рендер показывает марку, модель и год выпуска в выбранном вами цвете, а color может соответствовать цвету, указанному в полисе (название из набора или любой hex-код). И всё же это модель в этом цвете, а не автомобиль клиента.

Блок с автомобилем в расчёте страховки
<figure>
  <img src="https://carimage.dev/api/v1/delivery/eyJhbGciOi…" width="640" height="400"
       alt="Representative image of a 2024 Porsche 911, not a photo of the insured vehicle">
  <figcaption>
    2024 Porsche 911 · Coupe · Type 992 · trim on the VIN: Carrera, Carrera T or Carrera 4
    <small>Representative image of the model. Not a photo of the insured vehicle.</small>
  </figcaption>
</figure>

Стоимость и подходящий тариф

  • Бесплатно: декодирование VIN, resolve, запросы к каталогу и каждая загрузка подписанного URL в течение срока его действия.
  • Одно изображение автомобиля: каждый автомобиль в каждом цвете и ракурсе учитывается один раз в месяц, сколько бы раз его ни доставляли, выпускали или продлевали, в любом размере и формате.
  • Изображения автомобилей в месяц: воронка расчёта страховки видит много разных автомобилей, и каждый тариф включает определённое их число в месяц: Free — 100, Pro — 2 500, Business — 10 000; условия Enterprise согласуются индивидуально. Изображение, уже учтённое в этом месяце, отдаётся всегда, а запрос сверх лимита получает ответ 402 ещё до какого-либо учёта, поэтому выбирайте тариф по числу автомобилей, для которых вы делаете расчёты.

На платном тарифе лицензия распространяется на рендер в материалах, которые ваш продукт создаёт для своих пользователей, включая расчёт стоимости или отчёт, пока тариф активен; подробности — в лицензии.

CLI, SDK и MCP

npx @meterapp/car-image
# decode for free and keep the id
npx @meterapp/car-image vin WP0AA2A96RS201834 --json | jq -r .data.vehicle.id

# one renewing URL for the policy's documents, minted once however often intake retries
npx @meterapp/car-image url --vehicle veh_78qtwrgh37bkr --view front-3-4 --width 640 --height 400 \
  --fit contain --trim --padding 6 --format auto --ttl 604800 --renew --renew-days 365 \
  --idempotency-key policy-88213-image
  • SDK: client.decodeVin(vin, { year? }) и client.createImageUrls(…), как описано выше; client.resolve(query) — для автомобиля без VIN.
  • MCP: decode_vin и create_car_image_urls входят в базовый набор инструментов, поэтому ассистент, у которого в контексте есть страховой случай, может по VIN из дела выполнить просьбу «покажите застрахованную модель». Настройка описана на странице MCP.

Часто задаваемые вопросы

Может ли изображение заменить фотографии застрахованного автомобиля?
Нет. Это студийный рендер марки, модели и года из каталога, а не фотография, и он не изображает какой-либо конкретный автомобиль. Он помогает клиенту или эксперту по урегулированию убытков убедиться, что в записи указан автомобиль нужного типа. Состояние, повреждения, комплектация, опции и доработки определяются по фотографиям, результатам осмотра и расшифрованным данным, а на изображении должно быть указано, что оно носит иллюстративный характер.
Сколько стоит изображение в каждом расчёте?
Декодирование VIN бесплатно. Изображение засчитывается как одно изображение автомобиля за месяц, когда создаётся его подписанный URL или его данные доставляются на ваш сервер, а затем отдаётся сколько угодно раз; загрузка по подписанному URL бесплатна, пока не истёк срок его действия. Продлеваемый URL засчитывает изображение один раз в каждом последующем месяце, когда его открывают, и ничего — в месяцы, когда его никто не смотрит.
VIN декодируется, но vehicle равен null. Что делать?
Декодер распознал автомобиль, но в каталоге нет записи для этой марки, модели и года — так бывает с прицепами и некоторыми коммерческими шасси. Покажите декодированные поля без изображения и никогда не подставляйте похожий автомобиль. Поищите в каталоге — возможно, название пишется иначе, а если записи действительно нет, запросите её на публичной доске запросов.
Работает ли декодирование VIN для автомобилей не с рынка США?
Декодер использует данные vPIC от NHTSA, которые охватывают автомобили, выпущенные для рынка США, поэтому правильно введённый VIN с другого рынка может вернуть 404 или декодироваться без модели. В таком случае найдите автомобиль по марке, модели и году через бесплатный эндпоинт resolve: сам каталог охватывает модели и других рынков.
Как долго изображение может храниться в деле об убытке?
Пока ваш тариф активен. На платном тарифе лицензия распространяется на рендер в составе того, что создаёт ваш продукт, включая коммерческое предложение или отчёт; в течение 30 дней после окончания тарифа сохранённые копии удаляются. Чтобы хранить изображения в документах навсегда, купите их в виде пакета изображений. Рендеры со временем могут улучшаться, поэтому если документ должен сохранить ровно то, что видел клиент, храните файл, а не URL.

Читайте также

История клиента · ПО для дилеровКак получить фото каждого автомобиля в дилерском ПО по VIN или складской таблицеУ складской записи есть VIN и складской номер задолго до появления фотографии. Дилерские инструменты бесплатно декодируют VIN, сохраняют id автомобиля в записи и показывают в CRM один единообразный ракурс через подписанные URL.