Car Image API

Müşteriler · Bayi, ithal araç ve VIN araçları

Bayi yazılımında bir VIN'i veya stok listesini her araç için bir fotoğrafa dönüştürme

Bayi ve ithalat yazılımları, bir VIN'den ya da stok listesi satırından her kayıtta stüdyo görseline nasıl ulaşır: ücretsiz VIN çözümleme, resolve, kalıcı kimlikler ve imzalı URL'ler.

Sorun: Kayıtta fotoğraftan aylar önce VIN bulunur

CRM, ERP veya bayi yönetim sistemindeki (DMS) bir stok kaydı hayatına bir VIN, bir stok numarası ve bir fiyat olarak başlar. Fotoğraf, galeri fotoğrafçısı geldiğinde gelir; bazı stoklar için ise hiç gelmez: yolda olan bir araç, hâlâ yenilenmekte olan bir takas aracı, model adı DMS'nin görsel akışındaki hiçbir şeyle eşleşmeyen bir ithal araç, kimsenin basın fotoğrafını lisanslamadığı 1990'lardan bir otomobil. Bu kaydı gösteren her ekran (satış temsilcisinin listesi, alıcının ekspertiz değerlendirmesi, müşterinin teklifi) bunun yerine gri bir yer tutucu gösterir.

API'yi kullanan bayi ve ithalat araçları bu yer tutucuyu kaydın zaten sahip olduğu bilgilerle doldurur. Kayıtta VIN varsa görsele ulaşmak için tek bir ücretsiz çözümleme yeterlidir. Yalnızca stok listesindeki bir satır varsa serbest metinle resolve işlemi sonuca ulaştırır. Her iki durumda da kayıt sabit bir araç kimliği tutar ve her ekran aynı aracı aynı şekilde render eder.

Bir bayi entegrasyonu nasıl görünür?

  • Kayıt sırasında çözümleyin. VIN, kayıt oluşturulurken bir kez çözümlenir ve katalogdaki araç kimliği yanında saklanır. Sonraki hiçbir adımda marka veya model adı yazılmaz.
  • Liste için bir görünüm, ayrıntı için bir görünüm. Envanter listeleri için geniş bir kutuda düz bir side; ayrıntı sayfası ve teklif için front-3-4.
  • Geniş yıl aralığı. İthal ve ikinci el stok 1990'lara kadar uzanır ve yeni gelen araçlar gibi render edilir: katalog, Japon iç pazarına özgü modeller dahil, 1990 yılından güncel model yılına kadar uzanır.
  • Uygulama içinde imzalı URL'ler. CRM bir tarayıcıda çalıştığından, sunucunun oluşturduğu anahtarsız imzalı URL'leri yükler: çağrı başına en fazla elli tane, bir haftadan uzun süre kalan kayıtlar için yenilenerek.

1. Adım: VIN'i ücretsiz çözümleyin

GET /api/v1/vin/{vin} ücretsizdir ve yalnızca bir API anahtarı gerektirir. Çözümlenmiş yıl, marka, model, donanım paketi, gövde sınıfı, motor ve NHTSA'nın vPIC verilerinin bildiği diğer tüm öznitelikleri; katalogda araç varsa da sabit kimliğini ve hazır bir image_path değerini içeren bir vehicle nesnesini döndürür. Kısmi VIN'ler de çalışır: En az beş karakter, bilinmeyen her konum için * ve isteğe bağlı bir year ipucu.

Çözümleme
curl -s -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/vin/1HGCM82633A004352"
200 OK (kısaltılmış)
{
  "data": {
    "vin": "1HGCM82633A004352",
    "valid": true,
    "year": 2003,
    "make": "Honda",
    "model": "Accord",
    "trim": "EX-V6",
    "body_class": "Coupe",
    "vehicle": {
      "id": "veh_3qfyk22gfhsx3",
      "make": "Honda",
      "model": "Accord",
      "year": 2003,
      "image_path": "/api/v1/images/car?vehicle=veh_3qfyk22gfhsx3"
    }
  },
  "request_id": "req_01j9x…"
}

Adım 1b: elinizde yalnızca stok listesindeki bir satır olduğunda

İthal stok çoğu zaman bir elektronik tablo olarak gelir: bir yıl, bir marka, açık artırma şirketinin kullandığı yazımla bir model adı, bir donanım veya paket kodu. POST /api/v1/images/resolve ücretsiz ve deterministiktir: ifadedeki yıl, renk ve görünüm sözcüklerini ayıklar, kalanıyla kataloğu arar ve üzerine işlem yapabileceğiniz bir güven puanıyla birlikte kesin parametreleri döndürür.

Stok listesindeki bir satırı çözümleme
curl -s -X POST https://carimage.dev/api/v1/images/resolve \
  -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "2019 toyota voxy zs side"}'
200 OK (kısaltılmış)
{
  "data": {
    "params": {
      "vehicle_id": "veh_9w0nvw7jphp6r",
      "make": "toyota",
      "model": "voxy",
      "year": 2019,
      "view": "side",
      "color": "silver"
    },
    "display": {
      "make_name": "TOYOTA",
      "model_name": "VOXY"
    },
    "confidence": "low",
    "image_path": "/api/v1/images/car?make=toyota&model=voxy&year=2019&view=side&color=silver"
  },
  "request_id": "req_01j9x…"
}

Araç doğru (2019 Toyota Voxy) ancak güven düzeyi low, çünkü "ZS" kataloğun tanımadığı bir donanım seviyesi ve eşleştirme bu bilgi atlanarak yapıldı. Toplu içe aktarmada high sonuçlarını tamamlanmış sayın; medium ve low sonuçlarını candidates listesiyle birlikte bir kişinin incelemesine sunun. Tabloda yıl ve marka zaten ayrı sütunlardaysa bunları year ve make alanları olarak gönderin ve query içinde yalnızca modeli bırakın; eşleşme çok daha temiz olur. Hiç araç kelimesi içermeyen bir ifade 400 döndürür; eşleşen modeli olmayan bir marka ise modeli sorabilmeniz için markanın yıllarını listeleyen bir 404 döndürür.

2. Adım: Araç kimliğini kayıtta saklayın

Hangi yoldan gelmiş olursanız olun, vehicle.id değerini (veya params.vehicle_id) stok kaydında düz bir metin sütunu olarak saklayın. Bu değer deterministik ve kalıcıdır: aynı araç her dağıtımda ve her katalog sürümünden sonra aynı kimliğe sahiptir, bu yüzden yabancı anahtar olarak güvenle kullanılabilir. Bundan sonra her görsel isteği vehicle=veh_… biçimindedir; bu yanlış yazılamaz ve üreticinin yeniden adlandırdığı ya da bir kaynağın farklı şekilde kaydettiği bir marka, saklanan bir URL'yi asla bozmaz.

Adım 3: liste için bir görünüm, detay sayfası için bir görünüm

Envanter listeleri geniş ve alçaktır; bu yüzden 2:1 oranlı bir kutuda düz yan görünüm genellikle tercih edilir: her araç aynı yöne bakar ve aynı taban çizgisinde durur. trim=1&padding=6 sığdırmadan önce görseli araca göre kırpar; böylece bir Hilux ile bir Yaris satırı aynı şekilde doldurur. fit=contain ise tuvali şeffaf kenar boşluklarıyla tam olarak 640×320 tutar. Ayrıntı sayfası 1024 boyutunda front-3-4 kullanır ve ikisi aynı önbelleği paylaşır: belirtmediğiniz bir boya rengi her ikisinde de gümüştür.

Tek bir kaydın liste görseli
curl --fail-with-body -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/images/car?vehicle=veh_3qfyk22gfhsx3&view=side&w=640&h=320&fit=contain&trim=1&padding=6&format=webp" \
  -o stock-4471.webp

4. Adım: İmzalı URL'lerle CRM'de gösterin

CRM tarayıcıda çalışır ve tarayıcı asla API anahtarını tutmamalıdır. Bir ekran stoktaki araçların bir sayfasını listelediğinde, sunucu POST /api/v1/image-urls ile her kayıt için bir imzalı URL oluşturur (çağrı başına en fazla elli; her URL'nin görseli ayın bir araç görseli olarak sayılır) ve sayfa bunları herhangi bir görsel gibi yükler. Aylarca stokta kalan bir kayıt için iki ayar önemlidir:

  • ttl_seconds: 604800 ve renew: true: URL yedi günlük TTL'den sonra da çalışmaya devam eder; bir yenileme, görseli denk geldiği ayda bir kez sayar, o ay zaten sayılmışsa başka bir şey saymaz. Araca kimsenin bakmadığı aylarda hiçbir şey sayılmaz.
  • Senkronizasyonun her sayfası için bir Idempotency-Key: yeniden denenen bir istek ilk yanıtı aynen döndürür ve hiçbir şeyi iki kez oluşturmaz.

Üreten anahtarı panelden CRM'in origin'iyle sınırlandırın; başka bir siteye sızan URL 403 yanıtı verir. Anahtarı iptal etmek, ürettiği tüm URL'leri geçersiz kılar. Planın o ayki araç görselleri tükenirse yenileme 402 yanıtı verir ve aynı URL, limit sıfırlandığında veya plan yükseltildiğinde yeniden çalışır. Tüm yaşam döngüsü imzalı URL belgelerinde yer alır.

TypeScript SDK ile araç kabulü ve stok listesi
import { CarImageClient } from "@meterapp/car-image-sdk";

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

// On intake: VIN in, vehicle id on the record. Free.
const { data: decoded } = await client.decodeVin(stock.vin);
if (decoded.vehicle) {
  stock.vehicleId = decoded.vehicle.id; // veh_…, permanent; the record never spells a car again
  stock.trim = decoded.trim;            // shown next to the image, never claimed by it
}

// When the CRM draws the stock list: one signed URL per record, up to fifty per call.
// The browser loads them; the key never leaves the server.
const { data: urls } = await client.createImageUrls(
  page.map((row) => ({
    vehicle: row.vehicleId, view: "side",
    width: 640, height: 320, fit: "contain", trim: true, padding: 6, format: "auto",
  })),
  { ttlSeconds: 604_800, renew: true, renewDays: 365, idempotencyKey: `stock-list:${syncRunId}:${pageIndex}` }
);

CLI, SDK ve MCP

npx @meterapp/car-image
# decode for free; the output names the vehicle id and a ready-to-run image command
npx @meterapp/car-image vin 1HGCM82633A004352
npx @meterapp/car-image vin 1HGCM82633A004352 --json | jq -r .data.vehicle.id

# a partial VIN from a faded door sticker: at least five characters, * for each unknown position
npx @meterapp/car-image vin "1HGCM826*3A" --year 2003

# the list image for one record
npx @meterapp/car-image get --vehicle veh_3qfyk22gfhsx3 --view side --width 640 --height 320 --fit contain --trim --padding 6 --format webp --out stock-4471.webp
  • SDK: Yukarıdaki gibi client.decodeVin(vin, { year? }), client.resolve(query), client.getImage({ vehicle, … }) ve client.createImageUrls(…).
  • MCP: decode_vin, resolve_vehicle, get_car_image ve create_car_image_urls temel araç setinde yer alır; böylece bağlamında stok sistemi bulunan bir asistan, kayıttaki VIN'den yola çıkarak "4471 numaralı stok için fotoğraf" isteğini yanıtlayabilir. Kurulum MCP sayfasında, çözücünün alanları ve hataları ise VIN belgelerinde yer alır.

Sıkça sorulan sorular

Her stok kaydına bir fotoğraf eklemenin maliyeti nedir?
VIN çözümleme ücretsizdir. Her boya ve görünümdeki her araç bir araç görselidir ve ne kadar sık, hangi boyutta gösterilirse gösterilsin ayda bir kez sayılır; If-None-Match ile yeniden kontrol etmek ücretsizdir. İmzalı bir URL, görselini oluşturulduğunda sayar ve renew: true ile, açıldığı sonraki her ayda bir kez daha sayar. Stokunda birkaç bin araç bulunan bir bayi grubu ayda birkaç bin araç görseli gösterir; bu nedenle planı sergilenen stoka göre seçin.
VIN çözümleniyor ancak vehicle null dönüyor. Şimdi ne yapmalı?
Kod çözücü marka, model ve yılı tanıdı ancak katalogda bu kombinasyon için bir kayıt yok: bir römork, bazı ticari şasiler ya da kaynakların henüz kaydetmediği bir model adı olabilir. Çözümlenen alanları gösterin, yazım farklı olabileceği için kataloğu GET /api/v1/vehicles?q= ile arayın ve aracı istek panosunda talep edin; POST /api/v1/requests, açık bir isteği çoğaltmak yerine ona oy ekler.
VIN çözümleme, ithal araçları ve ABD'de hiç satılmamış araçları kapsıyor mu?
Çözümleyici NHTSA'nın vPIC verilerini kullanır; bu nedenle NHTSA'ya kayıt yaptıran bir üreticinin VIN'i tam olarak çözümlenir. ABD için hiç sertifikalandırılmamış bir araç çoğu zaman model bilgisi olmadan yalnızca üretici ve yıl olarak çözümlenir, bazıları ise hiç çözümlenmez. Bu tür stoklar için bunun yerine ruhsat belgesinden çözümleme yapın: katalog dünya çapındadır, 1990 yılından itibaren başlar ve Toyota Voxy gibi Japonya iç pazarına özel modelleri de içerir.
Render, kayıttaki donanım seviyesini gösteriyor mu?
Hayır. Katalog marka, model ve yıla göre eşleştirir; bu nedenle EX-V6 coupe ile LX sedan aynı 2003 Accord olarak render edilir. VIN çözümlemesinden gelen trim ve body_class bilgisini görselin yanında metin olarak tutun ve render'ı asla o belirli araç olarak tanımlamayın.
Bayi web sitesi, CRM ile aynı URL'leri kullanabilir mi?
Bunları, izin verilen kaynaklar (allowed origins) listesinde site bulunan bir anahtardan üretin; bir tarayıcının başka herhangi bir siteden yüklediği URL 403 origin_not_allowed yanıtı döndürür. E-posta istemcisi gibi Referer içermeyen yüklemeler geçer. CRM ve web sitesi tek bir anahtarı ve tek bir URL kümesini paylaşabilir ya da her biri ayrı bir anahtar kullanarak birinin tek başına iptal edilebilmesini sağlayabilir.