API'nin belgelenmiş davranışına dayanarak yazılmış bir uygulama kılavuzu; hiçbir müşterinin adını vermez. tarihinde yayınlandı.
Sorun: satış, fotoğraflardan önce yayına giriyor
Bir müzayede kataloğu, konsinye araçlar gelir gelmez yayımlanır: her araç için bir VIN, bir lot numarası ve bir satış tarihi. Fotoğraflar ise araç sahaya, fotoğrafçı da araca ulaştığında gelir; bu da satışın bir kısmı için teklif verme açıldıktan sonra olur. O zamana kadar bu lotların her biri, bir satır metnin yanında duran gri bir kutudan ibarettir.
Bir katalog render'ı, kutuyu doğru model yılıyla doldurur. Ancak müzayede, bir render'ın asla aracın kendisi yerine geçmemesi gereken yerdir: teklif verenler aracın durumuna göre fiyat biçer ve render hiçbir durum bilgisi göstermez, çünkü belirli bir fiziksel aracı tasvir etmez. Aşağıdaki her şey, bu ikisini aynı anda göz önünde tutmaktan doğar.
Entegrasyon nasıl görünür
- Her lot için VIN'inden bir render, yalnızca lotun kendi fotoğrafları gelene kadar gösterilir.
- Bir katalog seçici: VIN'i çözümlenemeyen lotlar için.
- Görselin üzerinde bir etiket: "Katalog render'ı, bu lot değil".
- Her lot için tek URL, bir kez oluşturulur;
Idempotency-Keyaltında üretilir ve satış süresince geçerli kalır.
1. Adım: lotun VIN'inden araç kimliğine
GET /api/v1/vin/{vin} ücretsizdir. Katalogda araç varsa yanıt, lota kaydedeceğiniz sabit kimlik olan data.vehicle.id değerini içerir; çözümlenen donanım, kasa ve motor bilgileri lotun metninde kalır. Katalog 1990 ile 2027 arasını kapsar, böylece bir müzayedenin eski stoku da en yenisi gibi render edilir. Sigorta kılavuzu bir çözümlemeyi alan alan anlatır; VIN belgeleri ise kısmi VIN'leri ve hataları ele alır.
# the lot's VIN to the vehicle id the lot stores (free); nothing printed means no catalog match
npx @meterapp/car-image vin "$LOT_VIN" --json | jq -r '.data.vehicle.id // empty'Adım 2: Çözümlenebilir bir VIN yok mu? Aracı katalogdan seçin
Bazı lotlar çözümlenebilen bir VIN olmadan gelir: başka bir pazar için üretilmiş bir araç, kaynağın yanlış yazdığı bir VIN ya da yalnızca yıl, marka ve model içeren bir konsinye formu. Konsinye formuna, ücretsiz ve herkese açık olan GET /api/v1/vehicles ile beslenen üç açılır liste ekleyin: ?year= o yılda modeli bulunan markaları listeler, ?year=&makeId= ise o markanın modellerini, her birini o model yılının araç id'siyle birlikte listeler.
# every make with a 2006 model year (free, public)
curl -s "https://carimage.dev/api/v1/vehicles?year=2006"
# {"data":{"year":2006,"makes":[…,{"id":476,"name":"DODGE","slug":"dodge"},…]},…}
# that make's 2006 models, each with the id of its 2006 model year
curl -s "https://carimage.dev/api/v1/vehicles?year=2006&makeId=476"{
"data": {
"year": 2006,
"make_id": 476,
"models": [
{
"name": "Caliber",
"slug": "caliber",
"vehicle_type": "Passenger Car",
"id": "veh_294vq81yq0d3y"
},
{
"name": "Charger",
"slug": "charger",
"vehicle_type": "Passenger Car",
"id": "veh_96j8z47jqfd4r"
},
"…"
]
}
}Aynı katalog, açık kaynaklı @meterapp/vehicle-db paketidir; bu nedenle açılır menüler aynı listeyle çevrimdışı da çalışabilir. Her iki durumda da lot, çözümlenmiş bir VIN ile aynı türde bir kimlik tutar ve sonraki hiçbir adımda araç adı elle yazılmaz.
Bütün bir konsinye listesi tek seferde geldiğinde, POST /api/v1/vehicles/check çağrı başına en fazla 2.000 kayıt okur; her kayıt listede yazıldığı şekliyle ve lot numarası ref olarak gönderilir. Her birine yanıt verir: saklanacak kimlikle bir eşleşme, öneriler, eşleşme yok ya da geçersiz satır. Hiçbir şey render edilmez ve ücret alınmaz; ayrıntılar araç belgelerinde yer alır.
Adım 3: render'ı render olarak etiketleyin
Etiketi yalnızca alttaki açıklamaya değil, teklif verenin gözünün ilk düştüğü yere, yani görselin kendisine ve alt metne de koyun. Aracın durumu, kilometresi, hasarı, donanımları ve boyası lot metninde, fotoğraflar çekildikten sonra da fotoğraflarda yer almalıdır. Fotoğraflar geldiğinde render kaldırılır.
<figure class="lot-image">
<img src="https://carimage.dev/api/v1/delivery/eyJhbGciOi…" width="800" height="450"
alt="Catalog render of a 2006 Dodge Charger, not a photo of lot 117">
<span class="lot-image__badge">Catalog render, not this lot</span>
</figure>
<p>Photos of this lot are on their way. Condition, mileage and damage are in the report.</p>Adım 4: lot başına tek URL, bir kez oluşturulur
Lotun URL'sini kabul aşamasında POST /api/v1/image-urls ve satış ile lottan oluşturulan, harf, rakam, ., _, : ve - içeren bir Idempotency-Key ile oluşturun. URL, oluşturulduğu anda görselini o ayın araç görseli olarak sayar; bu nedenle anahtar olmadan yeniden denenen bir kabul işlemi ikinci bir URL oluşturur. Anahtarla:
- Aynı anahtar aynı gövdeyle 24 saat içinde tekrar gönderilirse ilk yanıt, aynı URL de dahil olmak üzere
Idempotent-Replayed: trueile yeniden döndürülür ve ikinci kez ücret alınmaz. - Aynı anahtar farklı bir gövdeyle gönderilirse
422, ilk isteği geride bırakan bir yeniden deneme iseRetry-Afterile birlikte409döndürür. Bu yüzden lot oluşturulurken geçerlilik süresi dahil gövdedeki her şeyi sabitleyin ve lotla birlikte saklayın. - URL'yi lota da kaydedin: anahtar yeniden denemeleri korur, sayfalar ise satışın geri kalanında bu kayıtlı URL'yi okur.
Tek seferde içe aktarılan bir kataloğun tamamı için, her toplu işte bir anahtar kullanılarak çağrı başına en fazla 50 lot için URL oluşturulabilir; yanıttaki her URL, oluşturulduğu aracı ve seçenekleri geri bildirir.
curl --fail-with-body -X POST https://carimage.dev/api/v1/image-urls \
-H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: sale-2026-10-14:lot-117" \
-d '{"images":[{"vehicle":"veh_96j8z47jqfd4r","view":"side","width":800,"height":450,"fit":"contain","trim":true,"padding":6,"format":"auto"}],"ttl_seconds":259200}'
# run it again: the same URL comes back with Idempotent-Replayed: true, and nothing more is chargedAdım 5: URL'nin geçerlilik süresini satışa göre ayarlayın
ttl_seconds en fazla 604800 (7 gün) olabilir; daha uzun bir değer bu sınıra indirilir. Hafta içinde kapanan bir satış için bunu kapanışa kalan süreye ayarlayın. Böylece yer tutucu görsel, teklif verme sona erdiğinde çalışmayı bırakır ve bundan sonra URL 403 döndürür.
- 7 günden uzun süren zamanlı bir satış:
renew: true, en yüksek değerdettl_secondsve satışı kapsayanrenew_daysile oluşturun. Bir yenileme, görseli denk geldiği ayda bir kez sayar ve görsel o ay zaten sayılmışsa başka bir şey sayılmaz; kimsenin lotu açmadığı haftalar hiçbir şey saymaz ve yenilemerenews_untildeğerinde durur. max_usesdeğerini varsayılan olan 0’da bırakın. Sınırsız bir URL, geçerlilik süresi boyunca herkese açık olarak önbelleğe alınabilir. Sınırlı bir URL iseprivate, no-storeolarak işaretlenir ve her yüklemeyi kaynak sunucuya gönderir.- URL üreten anahtarı kısıtlayın: panelde yalnızca açık artırmanızın alan adlarına izin verin; başka bir siteye kopyalanan lot görseli
403döndürür.
import { CarImageClient, type ImageParams } from "@meterapp/car-image-sdk";
const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });
const lotImage = (vehicle: string): ImageParams => ({
vehicle, view: "side", width: 800, height: 450, fit: "contain", trim: true, padding: 6, format: "auto",
});
// How long the lot's URL lives, decided once from the sale's close.
function lifetime(closesAt: Date) {
const seconds = secondsUntil(closesAt);
return seconds <= 604800
? { ttlSeconds: Math.max(seconds, 60) } // closes within the week
: { ttlSeconds: 604800, renew: true, renewDays: Math.min(daysUntil(closesAt), 365) }; // a longer timed sale
}
// At intake, once per lot. The lifetime is stored with the lot, so a retry sends
// the same body and replays the first answer instead of minting a second URL.
lot.imageLifetime ??= lifetime(sale.closesAt);
const { data: [placeholder] } = await client.createImageUrls(lotImage(lot.vehicleId), {
...lot.imageLifetime,
idempotencyKey: `${sale.id}:lot-${lot.number}`,
});
lot.placeholderUrl = placeholder.url; // replaced by the lot's own photos when they arrivePlanınızı satışın büyüklüğüne göre seçin
Her lot, aracının kendi boyası ve görünümüyle bir araç görselidir (iki lot bu üçünü de paylaşmıyorsa) ve her plan ayda belirli sayıda araç görseli içerir: Free 100, Pro 2.500 ve Business 10.000; Enterprise için sayı görüşülerek belirlenir. Bu ay zaten sayılmış bir görsel her zaman sunulur; kullanım hakkını aşacak bir toplu istek ise hiçbir şey sayılmadan bütünüyle reddedilir ve yanıtta plan ile kullanım hakkı belirtilir. Planı bir ayda listelediğiniz lot sayısına göre seçin. Pazar yeri hikâyesi, büyük bir içe aktarmanın hız ve render sınırları dahilinde nasıl yayılacağını anlatır.
Sıkça sorulan sorular
- Lotun fotoğrafları geldikten sonra render görsel yayında kalabilir mi?
- Değiştirin. Render, model yılı için bir yer tutucudur ve teklif veren biri hangi resmin satılan araç olduğunu asla merak etmek zorunda kalmamalıdır. Bir sayfa onu referans için tutuyorsa etiket de onunla birlikte kalır.
- Satıştan sonra URL'ye ne olur?
- Geçerlilik süresi dolduğunda ya da yenilenen bir URL yenileme süresinin sonuna ulaştığında sona erer ve ardından 403 döndürür. O zamana kadar lotun kendi fotoğrafları ya da bir sonucu olur; satış arşivinde de fotoğraflar gösterilmelidir. URL'leri oluşturan anahtarı iptal etmek hepsini bir anda sonlandırır.
- Bir yeniden deneme 422 döndürdü. Neden?
- Aynı Idempotency-Key farklı bir gövdeyle geldi. Bunun olağan nedeni, geçerlilik süresinin yeniden deneme anında saate göre yeniden hesaplanmasıdır. Geçerlilik süresini lot oluşturulurken belirleyip saklayın; böylece yeniden deneme aynı gövdeyi gönderir ve ilk yanıt tekrar döner.
- Görsel, lotun boya rengini gösterebilir mi?
- Evet: color, hazır renk adlarından herhangi birini veya bir hex değerini kabul eder; böylece görsel, konsinye formundaki boyayla ek ücret olmadan eşleşebilir. Yine de bu, o boyadaki modeldir, lotun kendisi değildir; bu yüzden etiket kalır.
- 400 lotluk bir satışın maliyeti nedir?
- Aylık kotadan 400 araç görseli: URL'si oluşturulduğunda lot başına 1 araç görseli; yeniden denenen bir oluşturma işlemi tekrar sayılmaz. URL'nin geçerlilik süresi içindeki her yükleme ücretsizdir. Planlar ayda Free 100, Pro 2.500 ve Business 10.000 araç görseli içerir; aynı aracı, boyayı ve görünümü paylaşan lotlar bir kez sayılır.