Skip to content

VanceAI Open API documentation

VanceAI API

Einführung

Führen Sie die KI-Verarbeitung von Bildern und Videos von VanceAI direkt aus Ihrer eigenen Anwendung aus. Ein API-Schlüssel, eine einheitliche Job-API für beide Medientypen und klare Tool-Namen, die alle Details zu Speicherung, Upload und Planung verbergen.

Was Sie tun können

Die API stellt die Verarbeitungs-Engine von VanceAI über eine kleine, stabile Gruppe von REST-Endpunkten bereit. Sie senden einen Job mit einer Datei oder URL, fragen den Status ab und laden das Ergebnis herunter. Bild- und Video-Tools liegen unter derselben Ressource /v1/jobs — das gewählte tool bestimmt Medientyp und Operation.

MediumBeispiel-Tools
BildHochskalieren, Schärfen, Entrauschen, Hintergrundentfernung, Restaurieren, Cartoonisieren, Passfoto
VideoHochskalieren

Basis-URL

Alle API-Anfragen gehen an:

text
https://cloud-vanceai.vanceai.com/api/v1

Jede Antwort ist application/json. Alle Anfragen müssen mit einem API-Schlüssel authentifiziert werden — siehe Authentifizierung.

So funktioniert es

Die API ist vollständig asynchron und basiert auf drei Schritten:

text
POST /v1/jobs            → returns a job_id immediately (status: "queued")
GET  /v1/jobs/{id}       → poll until status is "succeeded" or "failed"
GET  /v1/jobs/{id}/result → fetch a fresh, never-expiring download link

Ein POST blockiert nie während Upload oder Verarbeitung. Es validiert Ihre Anfrage, reserviert den Job und gibt in Millisekunden eine job_id zurück. Ein Hintergrund-Worker übernimmt anschließend Upload, Verarbeitung und Ergebnis — so funktionieren selbst mehrere Gigabyte große Videos ohne HTTP-Timeouts.

Kernkonzepte

KonzeptZusammenfassung
Jobs & LebenszyklusEine Verarbeitungseinheit. Mit POST erstellt, mit GET abgefragt, mit Lebenszyklus: queued → processing → succeeded / failed / canceled.
ToolsKlare, stabile Namen (z. B. upscale, video_upscale), die Medientyp und Operation auswählen.
Credits & AbrechnungDie Verarbeitung verbraucht Credits. Sie werden beim Jobstart reserviert (eingefroren) und bei Fehlschlag oder Abbruch vollständig erstattet.
API-Schlüssel verwaltensk_live_-Schlüssel identifizieren Ihr Konto. Erstellung und Widerruf über Ihr Konto-Dashboard.

In v1 nur Polling

In v1 gibt es keine Webhooks — Sie fragen GET /v1/jobs/{id} zum Abschluss ab. Webhook-Callbacks sind für v1.1 geplant. Den vollständigen v1-Umfang finden Sie im Änderungsprotokoll.

Nächste Schritte

Erste Schritte

Authentifizierung

Die VanceAI-API authentifiziert Anfragen mit einem API-Schlüssel. Ihr Schlüssel trägt die Rechte Ihres Kontos — halten Sie ihn geheim.

API-Schlüssel

Schlüssel sehen so aus und beginnen immer mit dem Präfix sk_live_:

text
sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

Erstellen und widerrufen Sie Schlüssel über Ihr VanceAI-Konto-Dashboard. Der vollständige Schlüssel wird nur einmal bei der Erstellung angezeigt — bewahren Sie ihn sicher auf. Bei Verlust widerrufen Sie den Schlüssel und erstellen einen neuen. Siehe API-Schlüssel verwalten.

Anfragen authentifizieren

Senden Sie Ihren Schlüssel bei jeder Anfrage als Bearer-Token im Header Authorization:

text
Authorization: Bearer sk_live_a1b2c3d4e5f6...

Zum Beispiel, um Ihr Credit-Guthaben abzufragen:

bash
curl https://cloud-vanceai.vanceai.com/api/v1/credits \
  -H "Authorization: Bearer sk_live_a1b2c3d4e5f6..."

Halten Sie Ihren Schlüssel geheim

  • Geben Sie sk_live_-Schlüssel niemals in Client-Code, Mobil-Apps oder öffentlichen Repositories preis.
  • Führen Sie API-Aufrufe nur aus Ihrem eigenen Backend aus.
  • Verwenden Sie pro Anwendung oder Umgebung separate Schlüssel, damit Sie einen widerrufen können, ohne die anderen zu beeinträchtigen.

Authentifizierungsfehler

Ein fehlender, ungültiger oder widerrufener Schlüssel gibt 401 mit einem stabilen Fehlercode zurück:

json
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key provided is invalid or has been disabled.",
    "type": "auth"
  }
}

Die vollständige Liste der Codes und deren Behandlung finden Sie unter Fehler.

Erste Schritte

Schnellstart

Diese Anleitung führt durch einen vollständigen Bildhochskalierungs-Job: senden, abfragen, herunterladen. Es dauert wenige Minuten und nutzt nur curl.

1. Job senden

Senden Sie das Bild als Multipart-Formulardaten zusammen mit dem tool und seiner config. Sie können eine Datei direkt hochladen (bis zu 200 MB) oder stattdessen eine öffentliche image_url übergeben.

Datei hochladen
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -F [email protected] \
  -F tool=upscale \
  -F 'config={"scale":4,"face_enhance":true}' \
  -F output_format=jpg

Oder senden Sie eine URL mit JSON-Body:

URL senden
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/photo.jpg",
    "tool": "upscale",
    "config": { "scale": 4, "face_enhance": true },
    "output_format": "jpg"
  }'

Die Antwort liefert sofort eine job_id und den Status queued:

json
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "upscale",
  "media": "image",
  "credits_estimated": 1.0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

2. Bis zum Abschluss abfragen

Fragen Sie GET /v1/jobs/{job_id} ab, bis status zu succeeded (oder failed) wird. Bei Bildern reicht ein Polling alle ~2 Sekunden.

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c... \
  -H "Authorization: Bearer sk_live_..."
json
{
  "job_id": "job_3f2a9c...",
  "status": "succeeded",
  "progress": 100,
  "tool": "upscale",
  "result_url": "https://.../preview?sign=...",
  "result": { "width": 4000, "height": 3000, "size": 2451234 },
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": "2026-06-11T08:30:42Z"
}

3. Ergebnis herunterladen

Die result_url aus Schritt 2 ist ein signierter Link, der irgendwann abläuft. Für einen Link, der nie abläuft, rufen Sie den Result-Endpunkt auf, der bei Bedarf neu signiert:

bash
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
  -H "Authorization: Bearer sk_live_..." \
  -o upscaled.jpg

Das ist der gesamte Ablauf

Senden → abfragen → herunterladen ist für jedes Tool gleich — nur der tool-Name und die config ändern sich. Video fügt vorab einen Schritt hinzu: Laden Sie die Datei über den zweistufigen Upload hoch und übergeben Sie deren upload_id statt eines Bildes. Die vollständige Liste finden Sie auf der Seite Tools.

Leitfäden

Jobs & Lebenszyklus

Ein Job steht für eine Verarbeitungsaufgabe — Bild oder Video. Sie erstellen ihn, fragen seinen Status ab und laden das Ergebnis herunter. Diese Seite ist die vollständige Referenz für die Ressource /v1/jobs.

Der Job-Lebenszyklus

Jeder Job durchläuft diese Status:

statusBedeutung
queuedAkzeptiert und wartet auf einen Worker. Kann je nach Rückstand kurz hier verweilen.
processingWird bearbeitet. Das Feld phase gibt den Teilschritt an.
succeededFertig. result_url und result sind verfügbar.
failedFehlgeschlagen. error enthält einen stabilen Code.
canceledVon Ihnen abgebrochen. Reservierte Credits werden erstattet.

Während processing präzisiert das Feld phase: uploadingsyncingprocessing. Der numerische progress (0–100) ist erst aussagekräftig, wenn phase processing ist; während Upload/Sync bleibt er 0. Bei großen Videos kann die Upload-Phase Minuten dauern — beurteilen Sie „hängt es?" anhand von phase, nicht progress.

Video hochladen

Videos werden in zwei Schritten direkt in den Speicher hochgeladen, sodass die Bytes nie die API durchlaufen und mehrere Gigabyte große Dateien nicht durch die Anfragegröße begrenzt sind. Rufen Sie zuerst POST /v1/uploads für eine einmalige vorsignierte Upload-URL auf und führen Sie dann ein PUT der Datei dorthin aus. Bilder überspringen dies — laden Sie sie beim Erstellen des Jobs direkt hoch (siehe unten). Direkter Multipart-Upload von Videos wird nicht unterstützt; source_url wird weiterhin als Alternative akzeptiert.

POST/v1/uploads

Anfrageparameter

FieldTypeDescription
file_namerequiredstringDer Dateiname inkl. Videoendung (z. B. clip.mp4). Wird zur Ableitung von Speicherschlüssel und Inhaltstyp verwendet.
file_sizenumberOptional. Dateigröße in Bytes. Wenn angegeben, schlägt die Anfrage sofort fehl, falls das Limit für Einzel-Uploads (max_bytes in der Antwort, ~4,9 GB) überschritten wird; das Limit wird beim Upload ohnehin durchgesetzt.
content_typestringOptionaler MIME-Typ (z. B. video/mp4). Wird bei Weglassen aus der Endung abgeleitet.

Beispiel

bash
curl https://cloud-vanceai.vanceai.com/api/v1/uploads \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "file_name": "clip.mp4",
    "file_size": 734003200,
    "content_type": "video/mp4"
  }'

Antwort — 201 Created

json
{
  "upload_id": "upl_8f3b1c2a...",
  "put_url": "https://<bucket>.r2.cloudflarestorage.com/...&X-Amz-Signature=...",
  "expires_at": "2026-06-13T08:30:00Z",
  "max_bytes": 5261334937
}

put_url ist eine vorsignierte, 24 Stunden gültige URL. Laden Sie die rohen Bytes mit einem einzigen PUT dorthin — ohne Auth-Header, nur die Datei:

Datei hochladen
curl -X PUT --upload-file clip.mp4 \
  -H "Content-Type: video/mp4" \
  "https://<bucket>.r2.cloudflarestorage.com/...&X-Amz-Signature=..."

Sobald das PUT erfolgreich ist, erstellen Sie den Job, indem Sie die upload_id statt einer Datei übergeben — siehe Job erstellen. Jede upload_id ist einmalig verwendbar.

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "upload_id": "upl_8f3b1c2a...",
    "tool": "video_upscale",
    "config": { "scale": 2, "codec": "h264" }
  }'
Antwort — 202 Accepted
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "video_upscale",
  "media": "video",
  "credits_estimated": 0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

Größenlimits & Ablauf

Ein einzelnes PUT kann bis zu ~4,9 GB groß sein (die genaue Byte-Obergrenze ist max_bytes). Das Anfordern eines Uploads für eine größere Datei gibt 413 file_too_large zurück. Die vorsignierte URL läuft nach 24 Stunden ab; eine ungenutzte upload_id wird dann upload_expired, und Sie müssen eine neue anfordern.

Job erstellen

POST/v1/jobs

Wie Sie das Medium bereitstellen, hängt vom Typ ab. Bilder: direkter Datei-Upload (Multipart) oder eine öffentliche URL. Videos: eine upload_id aus dem Upload-Schritt oben oder eine öffentliche source_url. Das tool wählt Medientyp und Operation.

Anfrageparameter

FieldTypeDescription
image / filefileNur Bild: Binär-Upload (Multipart). file ist ein zulässiger Alias. Für Video verwenden Sie upload_id.
upload_idstringNur Video: die von POST /v1/uploads zurückgegebene upload_id nach dem Hochladen der Datei. Einmalig verwendbar.
image_url / source_urlstringEine öffentlich erreichbare URL zum Abrufen (Bild oder Video). Statt einer Datei / upload_id verwenden. source_url ist ein zulässiger Alias.
toolrequiredstringDie Operation, z. B. upscale oder video_upscale. Siehe Tools.
configobjectTool-spezifische Optionen (Bild- und Video-Optionen unterscheiden sich). Siehe Tools.
output_formatstringNur Bild: jpg (Standard), png oder webp. Bei Video ignoriert (verwenden Sie config.codec).

Idempotenz

Übergeben Sie einen Idempotency-Key-Header, um eine Erstellungsanfrage sicher zu wiederholen, ohne den Job zu duplizieren. Siehe Ratenlimits & Idempotenz.

Beispiel

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: a-unique-string" \
  -F [email protected] \
  -F tool=upscale \
  -F 'config={"scale":4,"face_enhance":true}'

Antwort — 202 Accepted

json
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "upscale",
  "media": "image",
  "credits_estimated": 1.0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

Die Antwort kommt zurück, bevor Credits berechnet werden (credits_charged ist 0). credits_estimated ist eine Vorab-Schätzung; die maßgebliche Abbuchung erscheint, sobald der Job processing erreicht. Siehe Credits & Abrechnung.

Große Dateien & URLs

Direkte Bild-Uploads sind auf 200 MB begrenzt; größere Bilder geben 413 file_too_large zurück — wechseln Sie zu source_url. Videos laufen nie über Multipart — laden Sie sie über den Upload-Schritt hoch (ein einzelnes PUT bis zu ~4,9 GB) oder übergeben Sie eine source_url. Der serverseitige URL-Abruf ist gegen SSRF geschützt: Nur http/https sind erlaubt, private/interne Netzwerkziele werden abgelehnt.

Job abrufen

GET/v1/jobs/{job_id}

Gibt den aktuellen Status eines Jobs zurück. Fragen Sie ab, bis der Job einen Endstatus erreicht.

Antwort — 200 (processing)

json
{
  "job_id": "job_3f2a9c...",
  "status": "processing",
  "phase": "uploading",
  "progress": 0,
  "tool": "video_upscale",
  "media": "video",
  "result_url": null,
  "result": null,
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": null
}

Antwort — 200 (succeeded)

json
{
  "job_id": "job_3f2a9c...",
  "status": "succeeded",
  "progress": 100,
  "tool": "upscale",
  "result_url": "https://.../preview?sign=...",
  "result": { "width": 4000, "height": 3000, "size": 2451234 },
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": "2026-06-11T08:30:42Z"
}

Die Form von result ist { width, height, size } für Bilder und { width, height, duration, size, codec } für Video. Die result_url ist ein signierter Link, der abläuft — für einen dauerhaften Link nutzen Sie den Result-Endpunkt unten.

Ergebnis abrufen

GET/v1/jobs/{job_id}/result

Leitet (302) zu einer frisch signierten Result-URL um — bei jedem Aufruf neu signiert, sodass der Link nie veraltet. Verwenden Sie dies zum Herunterladen der Ausgabe, statt result_url zwischenzuspeichern.

bash
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
  -H "Authorization: Bearer sk_live_..." \
  -o result.jpg

Ergebnis noch nicht bereit

Direkt nach dem Erfolg eines Jobs benötigt das Ergebnisobjekt gelegentlich kurz Zeit zur Synchronisierung. Der Endpunkt wiederholt intern, kann aber bei sehr großen Videos kurz 202 result_not_ready zurückgeben — wiederholen Sie es kurz darauf. Das Herunterladen des Ergebnisses kostet nie zusätzliche Credits.

Job abbrechen

POST/v1/jobs/{job_id}/cancel

Bricht einen Job ab, der noch queued oder processing ist. Vor allem für lange Video-Jobs nützlich. Reservierte Credits werden vollständig erstattet.

Antwort — 200
{ "job_id": "job_3f2a9c...", "status": "canceled" }

Ein Job, der bereits succeeded, failed oder canceled ist, gibt 409 not_cancelable zurück.

Job löschen

DELETE/v1/jobs/{job_id}

Löscht einen Job-Datensatz und sein zugehöriges Ergebnis — nützlich zum Bereinigen verarbeiteter Assets aus Datenschutz- oder Compliance-Gründen. Läuft der Job noch, wird er zuvor abgebrochen (und Credits erstattet).

Antwort — 200
{ "job_id": "job_3f2a9c...", "deleted": true }
  • Das Löschen eines bereits gelöschten Jobs gibt weiterhin 200 { "deleted": true } zurück (idempotent).
  • Sie können nur Jobs Ihres eigenen Kontos löschen; andere geben 404 job_not_found zurück.

Leitfäden

Tools

Das an POST /v1/jobs übergebene tool wählt sowohl Medientyp als auch Operation. Bild-Tools verwenden einfache Namen; Video-Tools haben das Präfix video_.

Bild-Tools

Bild-Tools nehmen ein config-Objekt entgegen. Die Option face_enhance (Boolean) ist bei den meisten Tools optional. Setzen Sie output_format in der Anfrage, um jpg / png / webp zu wählen.

toolconfig-Optionen
upscalescale (2 / 4 / 8, Standard 2), face_enhance
sharpenface_enhance
denoiseface_enhance
remove_bgnone
restoreface_enhance
cartoonizestyle, face_enhance
passport_photonone
customprompt, face_enhance
Beispiel-config — upscale
{ "scale": 4, "face_enhance": true }

Validierung

upscale.scale muss 2, 4 oder 8 sein; custom erfordert einen nicht leeren prompt. Ungültige Werte geben 400 invalid_parameter zurück. Sie müssen die Quellabmessungen nicht senden — sie werden beim Upload erkannt und zur Berechnung der Zielgröße verwendet.

Video-Tools

Video-Tools werden Ende-zu-Ende verarbeitet (kein Vorschau-Clip-Modus in v1). Die Optionen quality (high / medium / low) und codec (h264 / h265) gelten nur für video_hdr und video_face_enhance. Bei video_upscale wird die Ausgabe-Kodierung von der Upscaler-Engine bestimmt, daher werden quality / codec nicht verwendet (das Senden hat keine Wirkung).

toolconfig-Optionen
video_upscalescale (2 / 4, Standard 2), fps
video_hdrquality, codec, hdr_color_gamut
video_face_enhanceface_enhanced_mode, quality, codec
Beispiel-config — video_upscale
{ "scale": 2 }

Quellabmessungen werden serverseitig gemessen

Für eine korrekte Abrechnung misst der Server nach dem Upload die tatsächliche Breite, Höhe, Dauer und Bildrate Ihres Videos (per ffprobe) — er vertraut nicht den vom Client gemeldeten Werten. Optional können Sie source_width / source_height / duration in config angeben, um eine Vorab-Credit-Schätzung zu erhalten, doch die maßgebliche Abbuchung basiert stets auf den gemessenen Werten. Die Ausgabeauflösung ist begrenzt (lange Seite 4096, kurze Seite 2160); ein Überschreiten lässt den Job mit resolution_limit_exceeded fehlschlagen, bevor Credits berechnet werden.

Nicht unterstützte Tools

Die Anforderung eines Tools, das nicht existiert — oder noch nicht verfügbar ist (die Video-Operationen translate, colorize und subtitle sind nicht in v1) — gibt 400 unsupported_tool zurück.

Leitfäden

Credits & Abrechnung

Die Verarbeitung verbraucht Credits Ihres Kontos. Credits werden beim Jobstart reserviert und bei Erfolg bestätigt oder bei Fehlschlag bzw. Abbruch vollständig erstattet.

So funktioniert die Abrechnung

Der Credit-Fluss über die Lebensdauer eines Jobs:

PhaseWas mit den Credits passiert
Job erstellt (queued)Noch nichts berechnet — credits_charged ist 0.
Worker beginnt mit der VerarbeitungCredits werden reserviert (eingefroren). Ist Ihr Guthaben zu niedrig, schlägt der Job mit insufficient_credits fehl.
Job succeededDie Reservierung wird bestätigt — Credits werden abgezogen.
Job failed / canceledDie Reservierung wird freigegeben — Credits werden vollständig erstattet.
Herunterladen des ErgebnissesKostenlos — wird nie erneut berechnet.

Vorabprüfung beim Senden

Wenn Sie einen Job per POST senden, prüft die API vor dem Einreihen kurz das Guthaben. Übersteigen die geschätzten Kosten bereits Ihr verfügbares Guthaben, erhalten Sie sofort 402 insufficient_credits — so wird ein großer Upload nicht verschwendet. Die maßgebliche Reservierung erfolgt weiterhin beim Start des Workers.

Guthaben abrufen

GET/v1/credits
bash
curl https://cloud-vanceai.vanceai.com/api/v1/credits \
  -H "Authorization: Bearer sk_live_..."
Response: 200
{ "balance": 999.8, "used": 234.2, "frozen": 12.5 }
FieldTypeDescription
balancenumberSofort verfügbares Guthaben (eingefrorene Beträge bereits ausgenommen).
usednumberVon abgeschlossenen Jobs verbrauchte Credits.
frozennumberAktuell von laufenden Jobs reservierte Credits (noch nicht bestätigt oder freigegeben).

Credit-Beträge sind Dezimalzahlen (manche Operationen kosten einen Bruchteil eines Credits).

Leitfäden

Ratenlimits & Idempotenz

Zwei Limits schützen die Plattform: eine Anfragerate pro Schlüssel und eine Obergrenze gleichzeitiger Jobs pro Konto. Idempotenzschlüssel ermöglichen sicheres Wiederholen der Job-Erstellung.

Anfragerate (pro Schlüssel)

Jeder API-Schlüssel hat ein Anfrageratenlimit. Bei Überschreitung wird 429 rate_limited mit Headern zu Ihrem aktuellen Fenster zurückgegeben:

text
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1718093460

Antworten können auch einen Retry-After-Header (Sekunden) enthalten — beachten Sie ihn vor dem erneuten Versuch.

Parallelität (pro Konto)

Da ein einzelner Video-Job viele Minuten dauern kann, reicht die Anfragerate allein nicht. Es gibt zudem eine Obergrenze für die Anzahl gleichzeitig laufender Jobs Ihres Kontos (queued oder processing) — bei Video meist niedriger als bei Bildern.

Senden über die Obergrenze hinaus gibt 429 concurrency_limit_exceeded zurück. Warten Sie, bis einige laufende Jobs fertig sind, und versuchen Sie es erneut. Die Zählung erfolgt pro Konto, daher umgeht das Verteilen auf mehrere Schlüssel sie nicht.

Polling-Hinweise

v1 hat keine Webhooks, daher fragen Sie GET /v1/jobs/{id} ab. Um die API nicht zu überlasten:

  • Empfohlenes Intervall: etwa 2 s für Bilder, 5–10 s für Video.
  • Beachten Sie den Retry-After-Header, falls vorhanden — er ist ein Hinweis für die nächste Abfrage.
  • Beenden Sie das Polling, sobald der Job einen Endstatus erreicht (succeeded / failed / canceled).

Idempotenz

Netzwerkaussetzer können Sie im Unklaren lassen, ob ein POST /v1/jobs erfolgreich war. Senden Sie zum sicheren Wiederholen einen eindeutigen Idempotency-Key-Header:

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: 8f3b1c2a-...-unique" \
  -F [email protected] \
  -F tool=upscale
  • Das erneute Senden desselben Schlüssels gibt den ursprünglichen Job zurück — kein Duplikat, keine doppelte Abbuchung.
  • Erzeugen Sie pro logischer Anfrage einen neuen Schlüssel (eine UUID eignet sich gut).
  • Die Wiederverwendung eines Schlüssels mit anderem tool oder config gibt 409 idempotency_conflict zurück.

Wie lange ein Schlüssel gültig ist

Ein Schlüssel bleibt an seinen Job gebunden, solange dieser existiert. Das Löschen des Jobs gibt den Schlüssel frei. Es gibt kein separates Ablauffenster.

Leitfäden

Fehler

Fehler haben eine einheitliche JSON-Form mit einem stabilen Code, auf den Sie verzweigen können. Es gibt zwei Arten: Anfragefehler (mit einem HTTP-Fehlerstatus zurückgegeben) und Job-Fehler (bei erfolgreicher HTTP-Abfrage mit status: failed zurückgegeben).

Fehlerformat

json
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your account does not have enough credits for this operation.",
    "type": "billing"
  }
}

code ist ein stabiler String — verzweigen Sie darauf. message ist menschenlesbar und kann sich ändern. type ist die grobe Kategorie: auth, billing, validation, processing, rate_limit oder server.

Anfragefehler (HTTP-Status)

Wird eine Anfrage direkt abgelehnt, erhalten Sie den passenden HTTP-Status und einen error-Body:

HTTPcodeWann
401invalid_api_keyAPI-Schlüssel fehlt, ist ungültig oder deaktiviert.
401unauthorizedAuthentifizierung fehlgeschlagen.
402insufficient_creditsVorab-Guthabenprüfung beim Senden fehlgeschlagen.
400invalid_parameterEin Parameter fehlt oder ist ungültig.
400unsupported_toolDas Tool existiert nicht oder ist in v1 nicht verfügbar.
403geo_restrictedIn Ihrer Region gesperrt.
404job_not_foundKein solcher Job unter Ihrem Konto.
413file_too_largeBild-Direktupload über 200 MB oder Video-Upload über dem Einzel-PUT-Limit (~4,9 GB).
415unsupported_formatDirekter Upload hat ein nicht unterstütztes Format.
409not_cancelableDer Job ist bereits in einem Endzustand.
409idempotency_conflictGleicher Idempotenzschlüssel mit anderem tool/config verwendet.
404upload_not_foundDie upload_id existiert nicht oder gehört zu einem anderen Konto.
409upload_already_consumedDie upload_id wurde bereits von einem anderen Job verwendet (einmalig).
410upload_expiredDie upload_id ist vor der Nutzung abgelaufen (24 h) — fordern Sie eine neue an.
202result_not_readyErgebnis synchronisiert noch — wiederholen Sie /result kurz darauf.
429rate_limitedAnfragerate pro Schlüssel überschritten.
429concurrency_limit_exceededZu viele laufende Jobs für das Konto.
503service_unavailableEine nachgelagerte Abhängigkeit ist vorübergehend nicht verfügbar — wiederholen.
500internal_errorUnerwarteter Serverfehler.

Job-Fehler (status: failed)

Wenn ein Job *asynchron* fehlschlägt, gibt das Abfragen von GET /v1/jobs/{id} HTTP 200 mit status: "failed" und einem Code in error.code zurück. Erwarten Sie keinen 5xx für einen fehlgeschlagenen Job — die Abfrage selbst war erfolgreich.

`error.code`typeWann
processing_failedprocessingDie Verarbeitungs-Engine konnte die Aufgabe nicht abschließen.
processing_timeoutprocessingDer Job überschritt die maximale Verarbeitungszeit (Credits erstattet).
file_too_largevalidationEine abgerufene source_url überschritt 200 MB.
unsupported_formatvalidationEine abgerufene source_url hatte einen Typ, der nicht zum Tool passt.
ssrf_blockedvalidationDie source_url löste sich zu einer unzulässigen (privaten/internen) Adresse auf.
insufficient_creditsbillingDas Guthaben wurde vor der maßgeblichen Reservierung verbraucht.
upload_incompletevalidationDas hochgeladene Objekt fehlt oder ist unvollständig — die Datei wurde vor der Job-Erstellung nicht vollständig per PUT übertragen.
resolution_limit_exceededvalidationDie Ausgabeauflösung überschreitet das Engine-Limit (lange Seite 4096, kurze Seite 2160). Nicht berechnet.

Erneut versuchen

Behandeln Sie service_unavailable und vorübergehende 5xx-Antworten als wiederholbar (idealerweise mit Backoff). Behandeln Sie billing-, auth- und validation-Fehler als dauerhaft — korrigieren Sie die Anfrage, statt es erneut zu versuchen.

Konto

API-Schlüssel verwalten

API-Schlüssel werden über Ihr VanceAI-Konto-Dashboard erstellt und verwaltet. Jeder Schlüssel gehört zu Ihrem Konto und nutzt dessen Credit-Guthaben.

Schlüssel erstellen

Erstellen Sie in Ihrem Dashboard einen neuen Schlüssel und geben Sie ihm einen erkennbaren Namen (z. B. my-app-prod). Das vollständige Geheimnis — beginnend mit sk_live_ — wird nur einmal direkt nach der Erstellung angezeigt.

Kopieren Sie Ihren Schlüssel sofort

Wir speichern nur einen Hash Ihres Schlüssels, niemals den Klartext. Sobald Sie den Erstellungsdialog schließen, kann der vollständige Schlüssel nicht mehr abgerufen werden. Bei Verlust widerrufen Sie den Schlüssel und erstellen einen neuen.

Schlüssel anzeigen

Das Dashboard listet Ihre Schlüssel nach Name, Status, einem kurzen Präfix (z. B. sk_live_a1b2) zur Identifizierung und dem Zeitpunkt der letzten Verwendung auf. Das vollständige Geheimnis wird nie wieder angezeigt — nur das Präfix.

Schlüssel widerrufen

Das Deaktivieren eines Schlüssels wirkt sofort — jede weitere Anfrage damit gibt 401 invalid_api_key zurück.

  • Der Widerruf ist dauerhaft. Es gibt keine Reaktivierung; erstellen Sie stattdessen einen neuen Schlüssel.
  • Sie können nur Schlüssel verwalten, die zu Ihrem eigenen Konto gehören.

Schlüssel sicher rotieren

Mehrere aktive Schlüssel können nebeneinander existieren, was die Rotation nahtlos macht: Erstellen Sie einen neuen Schlüssel, stellen Sie Ihre Anwendung darauf um, bestätigen Sie, dass der Traffic migriert ist, und widerrufen Sie dann den alten Schlüssel. Ein eigener Schlüssel pro Anwendung oder Umgebung begrenzt den Schaden bei einem Leck.

Ressourcen

Versionierung & Änderungsprotokoll

Die API ist im URL-Pfad versioniert. Die aktuelle Version ist v1, bereitgestellt unter /api/v1.

v1 — aktuell

Die erste stabile Version umfasst:

  • Einheitliche Jobs-API für Bild und Video — POST /v1/jobs, GET /v1/jobs/{id}, GET /v1/jobs/{id}/result, POST /v1/jobs/{id}/cancel, DELETE /v1/jobs/{id} und GET /v1/credits.
  • 8 Bild-Tools und 1 Video-Tool (Hochskalieren).
  • Große Dateien: Bild-Direktuploads bis 200 MB; Videos über zweistufigen Direktupload; beliebige Medien über source_url (SSRF-geschützt).
  • Asynchrone Verarbeitung mit Vorab-Credit-Prüfung und Hintergrund-Worker.
  • Credit-Reservierungen mit voller Erstattung bei Fehlschlag oder Abbruch.
  • Stabile Fehlercodes, Idempotency-Key-Unterstützung, Ratenlimits pro Schlüssel und Parallelitätslimits pro Konto.
  • Zweistufiger Video-DirektuploadPOST /v1/uploads stellt eine vorsignierte URL aus, sodass Videos direkt in den Speicher hochgeladen werden (ein einzelnes PUT bis zu ~4,9 GB) und das Anfragegrößenlimit umgehen.
  • Genaue Video-Abrechnung — der Server misst Auflösung, Dauer und Bildrate mit ffprobe und prüft die Ausgabeauflösung vorab gegen das Engine-Limit.