Руководство по интеграции, написанное на основе документированного поведения 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.
curl --fail-with-body \
-H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
"https://carimage.dev/api/v1/vin/WP0AA2A96RS201834"{
"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.
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
# 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.