Eine Anleitung auf Grundlage des dokumentierten Verhaltens der API; sie nennt keinen Kunden. Veröffentlicht am .
Das Problem: Die Auktion läuft, bevor die Fotos da sind
Ein Auktionskatalog geht online, sobald die Einlieferungen vorliegen: eine VIN, eine Losnummer und ein Auktionsdatum für jedes Fahrzeug. Die Fotos kommen, wenn das Auto auf dem Gelände eintrifft und der Fotograf beim Auto ist – bei einem Teil der Auktion erst nach Beginn der Gebotsphase. Bis dahin ist jedes dieser Lose ein grauer Kasten neben einer Textzeile.
Ein Katalog-Rendering füllt die Fläche mit dem richtigen Modelljahr. Eine Auktion ist aber auch genau der Ort, an dem ein Rendering niemals als das Fahrzeug selbst durchgehen darf: Bieter bewerten den Zustand, und ein Rendering zeigt keinen, weil es kein bestimmtes physisches Fahrzeug darstellt. Alles Folgende ergibt sich daraus, beides gleichzeitig im Blick zu behalten.
So sieht die Integration aus
- Ein Rendering pro Los anhand seiner VIN, nur angezeigt, bis die eigenen Fotos des Loses eintreffen.
- Eine Katalogauswahl für die Lose, deren VIN sich nicht decodieren lässt.
- Ein Hinweis auf dem Bild: „Katalog-Rendering, nicht dieses Los“.
- Eine URL pro Los, einmalig erzeugt unter einem
Idempotency-Key, gültig für die gesamte Dauer der Auktion.
Schritt 1: von der VIN des Loses zu einer Fahrzeug-ID
GET /api/v1/vin/{vin} ist kostenlos. Wenn der Katalog das Fahrzeug enthält, liefert die Antwort data.vehicle.id, die stabile ID, die Sie am Los speichern; die dekodierte Ausstattungsvariante, Karosserie und Motorisierung bleiben im Text des Loses. Der Katalog reicht von 1990 bis 2027, sodass ältere Fahrzeuge einer Auktion genauso gerendert werden wie die neuesten. Der Leitfaden für Versicherungen erklärt eine Dekodierung Feld für Feld, und die VIN-Dokumentation behandelt unvollständige VINs und Fehler.
# 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'Schritt 2: Keine dekodierbare VIN? Wählen Sie das Fahrzeug aus dem Katalog
Manche Lose kommen ohne dekodierbare VIN: ein Fahrzeug für einen anderen Markt, eine von der Quelle falsch eingegebene VIN, ein Einlieferungsblatt mit Baujahr, Marke und Modell und sonst nichts. Statten Sie das Einlieferungsformular mit drei Dropdowns aus, die von GET /api/v1/vehicles gespeist werden – kostenlos und öffentlich: ?year= listet die Marken mit einem Modell in diesem Jahr, und ?year=&makeId= listet die Modelle dieser Marke, jeweils mit der Fahrzeug-ID dieses Modelljahrs.
# 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"
},
"…"
]
}
}Derselbe Katalog ist als offenes Paket @meterapp/vehicle-db verfügbar, sodass die Dropdowns auch offline mit der identischen Liste arbeiten können. So oder so enthält das Los am Ende dieselbe Art von ID wie eine dekodierte VIN, und kein nachgelagertes System muss Fahrzeugnamen als Freitext verarbeiten.
Wenn eine ganze Einlieferungsliste auf einmal eintrifft, liest POST /api/v1/vehicles/check bis zu 2.000 Einträge pro Aufruf, jeden so geschrieben wie in der Liste und mit der Losnummer als ref, und beantwortet jeden einzelnen: ein Treffer mit der zu speichernden ID, Vorschläge, kein Treffer oder eine ungültige Zeile. Nichts wird gerendert und nichts berechnet; Details finden Sie in der Dokumentation zu vehicles.
Schritt 3: Das Rendering als Rendering kennzeichnen
Platzieren Sie den Hinweis auf dem Bild selbst, wo der Blick eines Bieters landet, und im Alt-Text, nicht nur in der Beschreibung darunter. Zustand, Kilometerstand, Schäden, Ausstattung und die Lackierung des Fahrzeugs gehören in den Lostext und, sobald vorhanden, in die Fotos. Wenn die Fotos eintreffen, verschwindet das Rendering.
<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>Schritt 4: eine URL pro Los, einmal erstellt
Erzeugen Sie die URL des Loses bei der Erfassung mit POST /api/v1/image-urls und einem Idempotency-Key, der aus Auktion und Los gebildet wird, aus Buchstaben, Ziffern, ., _, : und -. Die URL wird bei der Erzeugung bezahlt (1 Credit), daher würde eine wiederholte Erfassung ohne Key zweimal erzeugen und bezahlen. Mit Key:
- Derselbe Schlüssel mit demselben Body innerhalb von 24 Stunden gibt die erste Antwort erneut zurück, einschließlich derselben URL, mit
Idempotent-Replayed: trueund ohne erneute Abbuchung. - Derselbe Key mit einem anderen Body ergibt
422, und ein Retry, der die erste Anfrage überholt, ergibt409mitRetry-After. Legen Sie also beim Anlegen des Loses alles im Body fest, einschließlich der Lebensdauer, und speichern Sie es zusammen mit dem Los. - Speichern Sie die URL auch am Los: Der Schlüssel schützt Wiederholungsversuche, und die gespeicherte URL ist das, was die Seiten für den Rest der Auktion auslesen.
Bei einem ganzen Katalog, der auf einmal importiert wird, lassen sich bis zu 50 Lose pro Aufruf erzeugen, mit einem Idempotency-Key pro Batch; jede URL in der Antwort gibt das Fahrzeug und die Optionen zurück, für die sie erzeugt wurde.
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 chargedSchritt 5: Lebensdauer der URL an die Auktion anpassen
ttl_seconds reicht bis 604800 (7 Tage); ein größerer Wert wird darauf begrenzt. Bei einer Auktion, die innerhalb der Woche endet, setzen Sie ihn auf die verbleibende Zeit bis zum Ende. Der Platzhalter funktioniert dann nicht mehr, sobald die Gebotsphase endet, und danach antwortet die URL mit 403.
- Eine zeitlich begrenzte Auktion von mehr als 7 Tagen: Erzeugen Sie die URL mit
renew: true,ttl_secondsauf dem Maximalwert undrenew_dayspassend zur Auktionsdauer. Jede weitere Woche, in der das Los geöffnet wird, kostet 1 Credit, Wochen ohne Aufrufe kosten nichts, und die Verlängerung endet beirenews_until. - Belassen Sie
max_usesbei 0, dem Standardwert: Eine unbegrenzte URL ist während ihrer gesamten Gültigkeit öffentlich cachebar, eine begrenzte dagegen istprivate, no-storeund schickt jeden Aufruf an den Origin-Server. - Beschränken Sie den erzeugenden Schlüssel im Dashboard auf die Domains Ihrer Auktion: Ein auf eine andere Website kopiertes Losbild antwortet mit
403.
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 arriveNach der Größe der Auktion planen
Jedes Los ist ein eigenes Fahrzeug, es sei denn, zwei Lose haben dieselbe Marke, dasselbe Modell und dasselbe Jahr. Jeder Plan begrenzt die Zahl unterschiedlicher Fahrzeuge pro Monat: Free 100, Pro 2.500 und Business 15.000; Enterprise ohne Obergrenze. Ein Fahrzeug, das in diesem Monat bereits ausgeliefert wurde, ist immer erlaubt. Ein Batch, der das Limit überschreiten würde, wird vollständig abgelehnt, bevor etwas berechnet wird, und die Antwort nennt Plan und Limit. Wählen Sie den Plan nach den Losen, die Sie pro Monat einstellen, nicht nach den Credits. Die Marketplace-Story beschreibt, wie Sie einen großen Import innerhalb der Rate- und Render-Limits takten.
Häufig gestellte Fragen
- Kann das Rendering online bleiben, wenn die Fotos des Loses eintreffen?
- Ersetzen Sie es. Das Rendering ist ein Platzhalter für das Modelljahr, und ein Bieter sollte sich nie fragen müssen, welches Bild das tatsächlich verkaufte Fahrzeug zeigt. Behält eine Seite es als Referenz, bleibt die Kennzeichnung dabei.
- Was passiert nach der Auktion mit der URL?
- Sie läuft ab, wenn ihre Gültigkeitsdauer endet oder wenn eine sich erneuernde URL das Ende ihres Erneuerungszeitraums erreicht, und antwortet dann mit 403. Bis dahin hat das Los eigene Fotos oder ein Ergebnis, und das Archiv der Auktion sollte die Fotos zeigen. Wird der Schlüssel widerrufen, mit dem die URLs erstellt wurden, enden sie alle auf einmal.
- Ein erneuter Versuch hat 422 zurückgegeben. Warum?
- Derselbe Idempotency-Key kam mit einem anderen Body zurück. Die übliche Ursache ist eine Gültigkeitsdauer, die beim erneuten Versuch anhand der Uhrzeit neu berechnet wird. Legen Sie die Gültigkeitsdauer beim Anlegen des Loses fest und speichern Sie sie – dann sendet der erneute Versuch denselben Body und erhält erneut die erste Antwort.
- Kann das Rendering die Lackierung des Loses zeigen?
- Ja: color akzeptiert jeden der vordefinierten Namen oder einen Hexwert, sodass das Bild ohne Aufpreis zur Lackierung auf dem Einlieferungsbeleg passen kann. Es zeigt aber weiterhin das Modell in dieser Farbe, nicht das Los selbst, daher bleibt der Hinweis bestehen.
- Was kostet eine Auktion mit 400 Losen?
- 400 Credits: 1 Credit pro Los, wenn seine URL erzeugt wird, und eine wiederholte Erzeugung kostet nichts. Jeder Abruf innerhalb der Gültigkeitsdauer der URL ist kostenlos. Die Pläne begrenzen die Zahl verschiedener Fahrzeuge pro Monat (Free 100, Pro 2.500 und Business 15.000; Enterprise ohne Obergrenze), und Lose mit gleicher Marke, gleichem Modell und Baujahr zählen nur einmal.