Car Image API

ユースケース · 保険

保険金請求と見積もりのための車両画像

保険契約や保険金請求のVINを無料でデコードして車両IDを保持し、保険対象モデルのラベル付き画像を1枚、請求ファイルと見積もりPDFに表示します。

API のドキュメントに記載された動作に基づいて作成した構築ガイドです。特定の顧客名は挙げていません。 公開。

課題:記録上の車両を誰も目にすることができない

見積もりフォーム、保険契約記録、事故の初期報告はいずれも、車両を同じ方法で特定します。顧客が入力した、または登録書類から読み取ったVINです。その後、担当者が目にする車両情報はすべてテキストで、年式、メーカー、モデル、場合によってはグレードだけです。テキスト1行の横で「これはお客様の車両ですか?」と尋ねても、何にでも「はい」と答えさせてしまいます。

VIN からデコードしたモデルの画像があれば、顧客と損害査定担当者は、記録に正しい種類の車が登録されているかをひと目で確認できます。ただし、どの車かまでは示せません。レンダリングはカタログ上のメーカー、モデル、年式をスタジオで描いたイラストであり、特定の実在車両を描写するものではありません。この事実が、以下の統合全体の設計を左右します。

連携の全体像

  • 受付時にデコードします。見積もりフローまたは保険契約システムが VIN を一度だけ無料でデコードし、カタログの車両 ID を契約と一緒に保存します。その契約に対して開かれた保険金請求は、この ID を引き継ぎます。
  • どこでも同じビュー。ヒーローアングルである front-3-4 を、見積もり画面、保険金請求の作業画面、見積もり PDF、契約者ポータルで同じボックスに表示し、すべての画面でモデルを同じように見せます。
  • キーではなく署名付き URL を使用。ブラウザや PDF レンダラーは、サーバーで発行したキー不要の URL を読み込みます。
  • 画像で伝えられないことは文字で。トリム、オプション、登録上の色、損傷、走行距離はテキストと写真で示し、画像には参考イメージであることを明記します。

ステップ1:VINを無料でデコードする

GET /api/v1/vin/{vin} は無料で、images:read 権限を持つキーが必要です。NHTSA の vPIC データからデコードしたフィールド(年式、メーカー、モデル、トリム、シリーズ、ボディクラス、エンジン、その他 vPIC が把握するすべての属性)を返し、カタログにその車両がある場合は、固定の id とすぐに使える image_path を含む vehicle オブジェクトも返します。

見積もりの 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 のパターンは3つのトリムに該当するため、デコードでも契約がどのトリムを対象としているかは判断できず、2024年式 911 のレンダリングではなおさらわかりません。顧客にトリムを確認してもらい、series や body_class と一緒にテキストとして保持し、画像ではモデルを示すようにしてください。

  • チェックディジットが誤っている VIN もデコードされ、valid: false と、errors に問題の内容が返されます。suggested_vin は vPIC が誤りと判断した文字を ! で示すため、入力中のユーザーにはこれを表示してください。
  • 先頭の数文字しかわからないフォームでは、部分的な VIN を送信できます。5文字以上で、不明な位置ごとに * を使い、year は任意で指定できます。
  • 404 は、vPIC にそのパターンの記録がないことを意味します。vPIC は米国市場向けの車両を対象としているため、他市場の車両は POST /api/v1/images/resolve を使ってメーカーとモデルから探してください。こちらも無料です。

ステップ2:車両IDを保険契約と保険金請求に保持する

data.vehicle.id をプレーンな文字列として保険契約に保存し、その契約に対して起こされるすべての請求にコピーします。この ID は決定的かつ永続的です。同じ車両はどのデプロイでも、どのカタログリリース後でも同じ ID を持つため、外部キーとして安全に使えます。以降のリクエストでは、メーカーとモデルを記述する代わりに vehicle=veh_78qtwrgh37bkr と指定します。

data.vehicle が null の場合、デコードされたメーカーとモデルはカタログにありません(トレーラーや一部の商用シャシーなど)。それでもデコードされた項目は表示できます。画像なしで表示し、似た車で代用することは決してしないでください。

ステップ3:請求ファイルと見積PDFで同じ1つのビューを使う

見積もり画面、請求処理の作業画面、契約者ポータルはブラウザアプリなので、サーバーが POST /api/v1/image-urls で署名付き URL を発行します。発行時に URL 1 つにつき 1 クレジット、1 回の呼び出しで最大 50 件、失効するまでは読み込み無料です。画像の構図は一度決めたら同じ形を再利用します。front-3-4 を 640×400 のボックスに fit: "contain" で収め、trim に少しの padding を加えて、クーペもピックアップも同じようにボックスを埋めるようにします。各 URL の有効期間は、表示する場所によって決まります:

  • 請求処理の作業画面。画面の描画時に発行します。デフォルトの有効期間 1 時間 で 1 回の作業セッションをカバーでき、翌日に再び開いた請求には新しい URL が発行されます。
  • 見積もり PDF。PDF を HTML からレンダリングする場合、レンダラーは画像を一度読み込んで埋め込むため、デフォルトの有効期間で十分です。また、PDF サービスがキーを保持することもありません。format: "jpg" は画像を白背景に合成するため、ドキュメントに適しています。
  • 契約者ポータルと更新案内メール。これらはどの有効期間よりも長く使われるため、renew: trueとttl_seconds: 604800(7日)を指定して発行します。URLは引き続き機能し、開かれた週ごとに追加で1クレジットがかかります。許容される最長値であるrenew_days: 365で、1年間の契約期間をカバーできます。

ダッシュボードで、URL を発行するキーに許可するオリジンのリストを設定します。他のサイトから読み込まれた URL は origin_not_allowed とともに 403 を返しますが、Referer を送信しないメールクライアントや PDF ビューアーでは引き続き読み込めます。キーを失効させると、そのキーで発行したすべての 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:被保険車両ではなく、モデルとしてラベルを付ける

ラベルは脚注だけでなく、画像のある場所に付けてください。代替テキストと、画像下のキャプションの両方です。レンダリング画像は、選択した塗装色でメーカー、モデル、年式を表示します。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 の読み込みすべて。
  • 1 クレジット:サーバーに配信される画像1枚ごと、または発行されるURL1件ごと。さらに、更新されるURLが開かれた週が1週追加されるごとに加算されます。
  • 個別車両数:見積もりファネルでは多様な車両が扱われ、各プランでは月あたりの個別車両数に上限があります:Free 100、Pro 2,500 と Business 15,000。Enterprise には上限がありません。今月すでに提供済みの車両は常に許可され、上限を超えるリクエストは課金前に拒否されます。そのため、プランはクレジットではなく、見積もり対象の車両数に合わせて選んでください。

有料プランでは、プランが有効な間、貴社の製品がユーザー向けに生成するもの(見積もりやレポートを含む)の中でレンダリング画像を使用することがライセンスの対象となります。詳細はライセンスをご覧ください。

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(…)。VIN のない車両には client.resolve(query) を使います。
  • MCP:decode_vin と create_car_image_urls はコアツールセットに含まれているため、保険金請求の内容をコンテキストに持つアシスタントは、登録済みの VIN をもとに「保険対象のモデルを見せて」という依頼に回答できます。セットアップ方法はMCP ページをご覧ください。

よくある質問

この画像を被保険車両の写真の代わりに使えますか?
いいえ。これはカタログ上のメーカー、モデル、年式に基づくスタジオレンダーであり、写真ではなく、特定の車両を描写するものではありません。顧客や損害査定担当者が、記録に正しい種類の車が登録されていることを確認するのに役立ちます。状態、損傷、グレード、オプション、改造については写真、検査、デコードされたテキストから判断し、画像にはイメージである旨を明記してください。
すべての見積もりに画像を付けると、費用はいくらですか?
VIN のデコードは無料です。画像は、署名付き URL の発行時、またはバイトデータがサーバーに配信された時点で 1 クレジット かかります。署名付き URL の読み込みは失効するまで無料です。更新型 URL は、開かれた週ごとに追加で 1 クレジット かかり、誰も閲覧しなかった週は無料です。
VIN はデコードできたのに vehicle が null です。どうすればよいですか?
デコーダーはその車両を認識しましたが、カタログにそのメーカー、モデル、年式のエントリーがありません。これはトレーラーや一部の商用シャシーで起こります。デコードされた項目を画像なしで表示し、似た車で代用しないでください。表記が異なる可能性もあるためカタログを検索し、本当に存在しない場合は公開リクエストボードで追加を依頼してください。
VIN デコードは米国市場以外の車両にも対応していますか?
デコーダーは NHTSA の vPIC データを使用しており、米国市場向けの車両が対象です。そのため、他市場の VIN は正しく入力されていても 404 が返ったり、モデルなしでデコードされたりすることがあります。その場合は、無料の resolve エンドポイントでメーカー、モデル、年式から車両を探してください。カタログ自体は他市場の車名もカバーしています。
請求ファイルで画像をどのくらいの期間保持できますか?
ファイルが存在する限り可能です。有料プランでは、見積書やレポートを含め、お客様の製品が生成するものの中でレンダリングを使用するライセンスが付与されます。プラン期間中に提供されたレンダリングは、保存済みのドキュメントも含め、プラン終了後もそのライセンスが維持されます。レンダリングは今後改善される場合もあるため、顧客が見たものを正確に残す必要がある記録には、URL ではなくファイルを保存してください。

続きを読む

導入事例 · ディーラー向けソフトウェア販売店向けソフトウェアで、VINや在庫リストから全車両の画像を用意する方法在庫記録には、写真よりずっと前からVINと在庫番号があります。ディーラー向けツールはVINを無料でデコードし、車両IDを記録に保持して、署名付きURLを通じてCRMで一貫したビューを表示します。