Przewodnik wdrożeniowy oparty na udokumentowanym działaniu API; nie wymienia żadnego klienta. Opublikowano .
Problem: rekord wskazuje samochód, którego nikt nie widzi
Formularz wyceny, polisa i pierwsze zgłoszenie szkody identyfikują pojazd w ten sam sposób: po numerze VIN wpisanym przez klienta lub odczytanym z dowodu rejestracyjnego. Wszystko, co człowiek potem widzi o samochodzie, to tekst: rok, marka, model i ewentualnie wersja wyposażenia. Pytanie „Czy to Państwa pojazd?” obok linijki tekstu zachęca do odpowiedzi „tak” na cokolwiek.
Obraz modelu wskazanego przez VIN pozwala klientowi i likwidatorowi szkód od razu sprawdzić, czy w dokumentacji figuruje właściwy typ samochodu. Nie pokazuje jednak, o który konkretnie samochód chodzi: render jest studyjną ilustracją marki, modelu i roku z katalogu i nie przedstawia żadnego konkretnego fizycznego pojazdu. Ten jeden fakt kształtuje całą opisaną niżej integrację.
Jak wygląda integracja
- Dekodowanie przy przyjęciu. Proces wyceny lub system polis dekoduje VIN raz, bezpłatnie, i zapisuje identyfikator pojazdu z katalogu razem z polisą. Szkody zgłaszane w ramach polisy dziedziczą ten identyfikator.
- Jeden widok wszędzie.
front-3-4, główne ujęcie, w jednym polu na ekranie wyceny, w stanowisku obsługi szkód, w PDF z wyceną i w portalu polis, dzięki czemu każdy ekran pokazuje model w ten sam sposób. - Podpisane URL-e, nigdy klucz. Przeglądarki i generatory PDF wczytują URL-e bez klucza, generowane przez Państwa serwer.
- Słowa tam, gdzie obraz nie wystarczy. Wersja, wyposażenie dodatkowe, kolor w dokumentacji, uszkodzenia i przebieg pozostają w tekście i na zdjęciach, a przy obrazie widnieje informacja, że jest poglądowy.
Krok 1: bezpłatne dekodowanie numeru VIN
GET /api/v1/vin/{vin} jest bezpłatny i wymaga klucza z uprawnieniem images:read. Zwraca zdekodowane pola z danych vPIC agencji NHTSA (rok, marka, model, wersja wyposażenia, seria, typ nadwozia, silnik i każdy inny atrybut znany vPIC), a gdy pojazd jest w katalogu – także obiekt vehicle z jego stałym id i gotową ścieżką 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"
}
}Proszę odczytać trim: „Carrera, Carrera T, Carrera 4”. Wzorzec tego VIN obejmuje trzy wersje wyposażenia, więc nawet dekodowanie nie określi, którą z nich obejmuje polisa, a render 911 z 2024 roku tym bardziej. Należy poprosić klienta o potwierdzenie wersji, zapisać ją jako tekst razem z series i body_class, a obraz niech pokazuje model.
- VIN z błędną cyfrą kontrolną nadal zostanie zdekodowany, z
valid: falsei opisem problemu werrors;suggested_vinoznacza znakiem!pozycję, którą vPIC uważa za błędną — to właśnie należy pokazać osobie wpisującej numer. - Formularz, który ma tylko pierwsze znaki, może wysłać częściowy VIN: co najmniej pięć znaków, z
*w miejscu każdej nieznanej pozycji i opcjonalnymyear. 404oznacza, że vPIC nie ma zapisu tego wzorca. vPIC obejmuje pojazdy produkowane na rynek amerykański, więc dla innych rynków należy zacząć od marki i modelu przezPOST /api/v1/images/resolve, co również jest bezpłatne.
Krok 2: zapisanie identyfikatora pojazdu w polisie i zgłoszeniu szkody
Należy zapisać data.vehicle.id w polisie jako zwykły ciąg znaków i kopiować go do każdej szkody zgłoszonej z tej polisy. Identyfikator jest deterministyczny i trwały: ten sam pojazd ma ten sam identyfikator przy każdym wdrożeniu i po każdym wydaniu katalogu, więc można go bezpiecznie używać jako klucza obcego, a każde kolejne żądanie podaje vehicle=veh_78qtwrgh37bkr zamiast marki i modelu.
Gdy data.vehicle ma wartość null, zdekodowanej marki i modelu nie ma w katalogu, jak w przypadku przyczep i niektórych podwozi użytkowych. Zdekodowane pola nadal można wyświetlić. Należy je pokazać bez obrazu i nigdy nie wstawiać w ich miejsce podobnego samochodu.
Krok 3: jeden widok w aktach szkody i w PDF-ie z ofertą
Ekran wyceny, panel obsługi szkód i portal polis to aplikacje przeglądarkowe, więc serwer generuje podpisane URL-e przez POST /api/v1/image-urls: każdy URL zalicza swój obraz jako obraz pojazdu w danym miesiącu w chwili wygenerowania, do 50 na wywołanie, a jego wczytywanie jest bezpłatne aż do wygaśnięcia. Kadr warto ustalić raz i używać go ponownie: front-3-4 w ramce 640×400 z fit: "contain" oraz trim z niewielkim padding, aby coupé i pickup wypełniały ramkę tak samo. Czas ważności każdego URL-a zależy od miejsca, w którym jest wyświetlany:
- Stanowisko obsługi szkód. URL należy generować w chwili renderowania ekranu. Domyślny czas ważności (1 godzina) wystarcza na sesję pracy, a szkoda otwarta ponownie następnego dnia dostaje nowy URL.
- PDF z ofertą. Gdy PDF jest generowany z HTML, renderer raz wczytuje obraz i go osadza, więc domyślny czas ważności w zupełności wystarcza, a usługa PDF nigdy nie ma dostępu do Państwa klucza.
format: "jpg"spłaszcza obraz na białe tło, a tego właśnie potrzebuje dokument. - Portal polis i e-mail o odnowieniu. Działają dłużej niż jakikolwiek czas ważności, dlatego należy generować URL z
renew: trueittl_seconds: 604800(7 dni). URL nadal działa, odnowienie liczy obraz raz w miesiącu, w którym nastąpi, i nic więcej, jeśli został już policzony w tym miesiącu, arenew_days: 365, najdłuższa dozwolona wartość, obejmuje roczny okres polisy.
Kluczowi generującemu URL-e należy przypisać listę dozwolonych originów w panelu: URL wczytany z innej witryny zwraca 403 z origin_not_allowed, a programy pocztowe i przeglądarki PDF, które nie wysyłają nagłówka Referer, nadal go wczytują. Unieważnienie klucza kończy działanie wszystkich wygenerowanych nim URL-i.
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` }
);
}Krok 4: oznaczenie jako model, nigdy jako ubezpieczony samochód
Opis należy umieścić tam, gdzie jest obraz, a nie tylko w przypisie: w tekście alternatywnym i w podpisie pod obrazem. Render pokazuje markę, model i rocznik w wybranym lakierze, a color może odpowiadać kolorowi z polisy (nazwa gotowego koloru lub dowolny kod hex). Nadal jest to jednak model w tym lakierze, a nie samochód klienta.
<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>Ile to kosztuje i jaki plan wybrać
- Bezpłatne: dekodowanie VIN, resolve, zapytania do katalogu i każde wczytanie podpisanego URL w okresie jego ważności.
- Jeden obraz pojazdu: każdy pojazd w każdym lakierze i ujęciu, liczony raz w miesiącu niezależnie od tego, ile razy zostanie dostarczony, wygenerowany lub odnowiony, w dowolnym rozmiarze i formacie.
- Obrazy pojazdów miesięcznie: lejek ofertowy obejmuje wiele różnych pojazdów, a każdy plan zawiera określoną ich liczbę miesięcznie: Free 100, Pro 2500 i Business 10 000; w planie Enterprise warunki są negocjowane. Obraz już naliczony w tym miesiącu jest zawsze serwowany, a żądanie ponad limit otrzymuje odpowiedź 402, zanim cokolwiek zostanie naliczone, więc plan warto dobrać do liczby wycenianych pojazdów.
W planie płatnym licencja obejmuje render umieszczony w materiałach, które Państwa produkt tworzy dla swoich użytkowników, w tym w ofercie lub raporcie, przez cały okres aktywności planu; szczegóły zawiera licencja.
CLI, SDK i 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? })iclient.createImageUrls(…), jak wyżej;client.resolve(query)dla pojazdu bez numeru VIN. - MCP:
decode_vinicreate_car_image_urlsnależą do podstawowego zestawu narzędzi, więc asystent mający szkodę w kontekście może odpowiedzieć na prośbę „pokaż ubezpieczony model” na podstawie VIN zapisanego w aktach. Konfiguracja jest opisana na stronie MCP.
Najczęściej zadawane pytania
- Czy obraz może zastąpić zdjęcia ubezpieczonego pojazdu?
- Nie. To studyjny render marki, modelu i rocznika z katalogu, a nie zdjęcie, i nie przedstawia żadnego konkretnego pojazdu. Pomaga klientowi lub likwidatorowi szkód sprawdzić, czy rekord wskazuje właściwy rodzaj samochodu. Stan, uszkodzenia, wersja wyposażenia, opcje i modyfikacje wynikają ze zdjęć, oględzin i zdekodowanego tekstu, a obraz powinien być oznaczony jako poglądowy.
- Ile kosztuje obraz w każdej ofercie?
- Dekodowanie VIN jest bezpłatne. Zdjęcie liczy się jako jeden obraz pojazdu w miesiącu w chwili wygenerowania jego podpisanego URL-a lub dostarczenia jego bajtów na Państwa serwer, a potem może być wyświetlane dowolnie często; ładowanie podpisanego URL-a jest bezpłatne do momentu jego wygaśnięcia. Odnawiany URL liczy obraz raz w każdym kolejnym miesiącu, w którym zostanie otwarty, i nic w miesiącach, w których nikt go nie ogląda.
- VIN został zdekodowany, ale vehicle ma wartość null. Co dalej?
- Dekoder rozpoznał pojazd, ale katalog nie zawiera wpisu dla tej marki, modelu i rocznika, co zdarza się w przypadku przyczep i niektórych podwozi użytkowych. Należy wyświetlić zdekodowane pola bez obrazu i nigdy nie podstawiać podobnego samochodu. Warto przeszukać katalog na wypadek innej pisowni, a jeśli pojazdu naprawdę brakuje, zgłosić prośbę na publicznej tablicy zgłoszeń.
- Czy dekodowanie VIN działa dla pojazdów spoza rynku USA?
- Dekoder korzysta z danych vPIC agencji NHTSA, które obejmują pojazdy produkowane na rynek amerykański, dlatego poprawnie wpisany VIN z innego rynku może zwrócić 404 lub zostać zdekodowany bez modelu. Taki samochód należy wtedy wyszukać po marce, modelu i roku za pomocą bezpłatnego endpointu resolve; sam katalog obejmuje modele z innych rynków.
- Jak długo akta szkody mogą przechowywać obraz?
- Dopóki plan jest aktywny. W płatnym planie licencja obejmuje render w materiałach generowanych przez Państwa produkt, w tym w ofertach i raportach; w ciągu 30 dni od zakończenia planu przechowywane kopie są usuwane. Aby zachować obrazy w dokumentacji na zawsze, należy kupić je jako Image Pack. Rendery mogą też być z czasem ulepszane, dlatego rekord, który musi zachować dokładnie to, co widział klient, powinien przechowywać plik, a nie URL.