Car Image API

Casos de uso · Seguros

Imágenes de coches para siniestros y presupuestos de seguros

Decodifique gratis el VIN de una póliza o un siniestro, guarde su id de vehículo y muestre una vista etiquetada del modelo asegurado en el expediente del siniestro y en el PDF del presupuesto.

Una guía de implementación escrita a partir del comportamiento documentado de la API; no menciona a ningún cliente. Publicado el .

El problema: el registro nombra un coche que nadie puede ver

Un formulario de cotización, un registro de póliza y una primera notificación de siniestro identifican el vehículo de la misma forma: por su VIN, escrito por un cliente o leído de un documento de matriculación. Todo lo que una persona ve después sobre el coche es texto: un año, una marca, un modelo y quizá una versión. Preguntar "¿es este su vehículo?" junto a una línea de texto invita a responder que sí a cualquier cosa.

Una imagen del modelo al que corresponde el VIN permite al cliente y al perito comprobar de un vistazo que el registro identifica el tipo de coche correcto. No puede mostrar qué coche concreto: un render es una ilustración de estudio de una marca, modelo y año del catálogo, y no representa ningún vehículo físico específico. Ese hecho condiciona toda la integración que sigue.

Cómo es la integración

  • Decodifique al dar de alta. El flujo de cotización o el sistema de pólizas decodifica el VIN una sola vez, sin coste, y guarda el id de vehículo del catálogo junto con la póliza. Los siniestros abiertos sobre esa póliza lo heredan.
  • Una sola vista en todas partes. front-3-4, el ángulo principal, en un mismo recuadro en la pantalla de cotización, el panel de siniestros, el PDF de la cotización y el portal de pólizas, para que todas las pantallas muestren el modelo de la misma forma.
  • URL firmadas, nunca la clave. Los navegadores y los generadores de PDF cargan URL sin clave que genera su servidor.
  • Palabras para lo que una imagen no puede decir. La versión, el equipamiento opcional, el color registrado, los daños y el kilometraje se quedan en texto y fotos, y la imagen indica que es representativa.

Paso 1: decodifique el VIN, gratis

GET /api/v1/vin/{vin} no cuesta nada y requiere una clave con images:read. Responde con los campos decodificados de los datos vPIC de la NHTSA (año, marca, modelo, acabado, serie, tipo de carrocería, motor y cualquier otro atributo que conozca vPIC) y, cuando el catálogo tiene el vehículo, un objeto vehicle con su id estable y un image_path listo para usar.

Decodifique el VIN de la cotización
curl --fail-with-body \
  -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/vin/WP0AA2A96RS201834"
200 OK (recortado)
{
  "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"
  }
}

Lea el trim: "Carrera, Carrera T, Carrera 4". El patrón de este VIN abarca tres versiones, así que ni siquiera la decodificación puede decir cuál asegura la póliza, y mucho menos un render del 911 de 2024. Pida al cliente que confirme la versión, guárdela como texto junto con series y body_class, y deje que la imagen muestre el modelo.

  • Un VIN con un dígito de control incorrecto se decodifica igualmente, con valid: false y el problema en errors; suggested_vin marca con ! el carácter que vPIC considera erróneo, que es lo que debe mostrarse a la persona que lo escribe.
  • Un formulario que solo tiene los primeros caracteres puede enviar un VIN parcial: al menos cinco caracteres, con * en cada posición desconocida y un year opcional.
  • Un 404 significa que vPIC no tiene registro del patrón. vPIC cubre vehículos fabricados para el mercado estadounidense, así que, para otros mercados, parta de la marca y el modelo con POST /api/v1/images/resolve, que también es gratuito.

Paso 2: conserve el id del vehículo en la póliza y en el siniestro

Guarde data.vehicle.id en la póliza como una cadena simple y cópielo en cada siniestro abierto contra ella. El id es determinista y permanente: el mismo vehículo tiene el mismo id en cada despliegue y tras cada versión del catálogo, por lo que es seguro como clave foránea, y cada solicitud posterior indica vehicle=veh_78qtwrgh37bkr en lugar de escribir una marca y un modelo.

Cuando data.vehicle es null, la marca y el modelo decodificados no están en el catálogo, como ocurre con los remolques y algunos chasis comerciales. Puede seguir mostrando los campos decodificados. Muéstrelos sin imagen y nunca ponga un coche similar en su lugar.

Paso 3: una vista en el expediente del siniestro y en el PDF de la cotización

La pantalla de cotización, el panel de siniestros y el portal de pólizas son aplicaciones de navegador, así que su servidor emite URL firmadas con POST /api/v1/image-urls: 1 crédito por URL cuando se emite, hasta 50 por llamada, y gratis de cargar hasta que caduca. Encuadre la imagen una vez y reutilice la forma: front-3-4 en un recuadro de 640×400 con fit: "contain", y trim con un poco de padding para que un cupé y una pickup llenen el recuadro de la misma manera. Cuánto debe durar cada URL depende de dónde se muestre:

  • El panel de siniestros. Emita la URL cuando se dibuje la pantalla. La vigencia predeterminada de 1 hora cubre una sesión de trabajo, y un siniestro que se reabra mañana recibe una URL nueva.
  • El PDF de la cotización. Cuando el PDF se genera a partir de HTML, el renderizador carga la imagen una vez y la incrusta, así que la vigencia predeterminada es más que suficiente, y el servicio de PDF nunca tiene acceso a su clave. format: "jpg" aplana la imagen sobre fondo blanco, que es lo que necesita un documento.
  • El portal de pólizas y el email de renovación. Estos duran más que cualquier vida útil, así que genere la URL con renew: true y ttl_seconds: 604800 (7 días). La URL sigue funcionando, cada semana adicional en la que se abre cuesta 1 crédito, y renew_days: 365, el máximo permitido, cubre una póliza de un año.

Asigne a la clave que emite las URL una lista de orígenes permitidos en el panel: una URL cargada desde otro sitio responde 403 con origin_not_allowed, mientras que los clientes de correo y los visores de PDF, que no envían Referer, la siguen cargando. Revocar la clave invalida todas las URL que emitió.

El alta, el puesto de trabajo, el PDF y el portal, con el SDK de TypeScript
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` }
  );
}

Paso 4: etiquétela como el modelo, nunca como el coche asegurado

Coloque la etiqueta donde está la imagen, no solo en una nota al pie: en el texto alternativo y en un pie de foto bajo la imagen. El render muestra la marca, el modelo y el año en la pintura que usted elija, y color puede seguir el color que figura en la póliza (un nombre predefinido o cualquier hex). Sigue siendo el modelo en esa pintura, no el coche del cliente.

Bloque de vehículo de una cotización
<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>

Cuánto cuesta y qué plan le conviene

  • Gratis: la decodificación de VIN, resolve, las consultas al catálogo y cada carga de una URL firmada dentro de su duración.
  • 1 crédito: cada imagen entregada a su servidor o cada URL emitida, y cada semana adicional en que se abre una URL renovable.
  • Vehículos distintos: un embudo de cotización ve muchos vehículos diferentes, y cada plan limita los vehículos distintos al mes: Free 100, Pro 2500 y Business 15.000; Enterprise: sin límite. Un vehículo ya servido este mes siempre está permitido, y una solicitud que supere el límite se rechaza antes de cobrar nada, así que elija el plan según los vehículos que cotiza, no según los créditos.

En un plan de pago, la licencia cubre un render dentro de lo que su producto genera para sus usuarios, incluidas cotizaciones o informes, mientras el plan esté activo; los detalles están en la licencia.

CLI, SDK y 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? }) y client.createImageUrls(…), como arriba; client.resolve(query) para un vehículo sin VIN.
  • MCP: decode_vin y create_car_image_urls forman parte del conjunto de herramientas principal, así que un asistente con el siniestro en contexto puede responder a "muéstrame el modelo asegurado" a partir del VIN registrado. La configuración está en la página de MCP.

Preguntas frecuentes

¿Puede la imagen sustituir a las fotos del vehículo asegurado?
No. Es un render de estudio de la marca, el modelo y el año del catálogo, no una fotografía, y no representa ningún vehículo concreto. Ayuda a un cliente o a un perito a comprobar que el registro nombra el tipo de coche correcto. El estado, los daños, la versión, los extras y las modificaciones se obtienen de fotos, inspecciones y del texto decodificado, y la imagen debería indicar que es representativa.
¿Cuánto cuesta una imagen en cada presupuesto?
La decodificación del VIN es gratis. La imagen cuesta 1 crédito cuando se emite su URL firmada, o cuando sus bytes se entregan a su servidor; cargar una URL firmada es gratis hasta que caduca. Una URL renovable cuesta 1 crédito más por cada semana en que se abre, y nada en las semanas en que nadie la mira.
El VIN se decodifica, pero vehicle es null. ¿Y ahora qué?
El decodificador reconoció el vehículo, pero el catálogo no tiene ninguna entrada para esa marca, modelo y año, algo que ocurre con remolques y algunos chasis comerciales. Muestre los campos decodificados sin imagen y nunca la sustituya por un coche parecido. Busque en el catálogo por si la grafía es distinta y, si de verdad falta, solicítelo en el tablón público de peticiones.
¿La decodificación de VIN funciona con vehículos de fuera del mercado estadounidense?
El decodificador usa los datos vPIC de la NHTSA, que cubren vehículos fabricados para el mercado estadounidense, por lo que un VIN de otro mercado escrito correctamente puede responder 404 o decodificarse sin modelo. En su lugar, busque ese coche por marca, modelo y año con el endpoint gratuito de resolución; el propio catálogo cubre denominaciones de otros mercados.
¿Durante cuánto tiempo puede conservar la imagen un expediente de siniestro?
Mientras exista el archivo. En un plan de pago, la licencia cubre un render dentro de lo que genera su producto, incluidos una cotización o un informe, y un render entregado con el plan conserva esa licencia cuando el plan termina, también en los documentos almacenados. Además, los renders pueden mejorarse con el tiempo, así que un registro que deba conservar exactamente lo que vio el cliente debe guardar el archivo y no una URL.

Siga leyendo

Caso de cliente · Software para concesionariosCómo convertir un VIN o una hoja de inventario en una foto para cada vehículo en el software de concesionariosUn registro de inventario tiene un VIN y un número de stock mucho antes de tener una foto. Las herramientas para concesionarios decodifican el VIN gratis, guardan el id del vehículo en el registro y muestran una vista coherente en el CRM mediante URL firmadas.