Design
Sprache

Webhooks und der Lebenszyklus von Medienaufträgen

Registrieren Sie eine mediaWebhookUrl, empfangen Sie einen POST, wenn ein Auftrag abgeschlossen ist, fragen Sie GET /api/media/jobs/{id} ab, behandeln Sie Fehlercodes und machen Sie sich mit den Limits für Abrechnung und Idempotenz vertraut.

Betriebsleitfaden für asynchrone Medienjobs: Webhook-Registrierung, Status, Abfragen, Fehlercodes, Abrechnung und Idempotenzlimits — strikt gemäß der aktuellen Implementierung im Code.

Auftragslebenszyklus

  1. POST /api/media/generate – bei Erfolg 202 und { ok: true, jobId, status: "processing" }. In der API gibt es keine separaten Statuswerte queued / running: Bis der Job abgeschlossen ist, sieht der Client processing.
  2. Der Upstream kann interne Phasen durchlaufen (waiting, generating) — diese werden in der öffentlichen API nicht widergespiegelt; während des Pollings bleibt der Job processing.
  3. Terminalstatus: success (enthält resultUrls, wird bei Erfolg berechnet) oder fail (keine Berechnung).
  4. Der Abschluss wird einmal erfasst: über den Upstream-Callback oder bei einer verzögerten Abfrage unter GET /api/media/jobs/{id}.

Statusabfrage: GET /api/media/jobs/{id}

GEThttps://getvibeapi.com/api/media/jobs/{id}
ParameterTypBeschreibung
statusstringsubmitting | processing | success | fail. submitting + media_submission_uncertain is non-terminal; within about 10–15 minutes such a submission is closed as fail (media_submission_not_started) without a charge — create a new task.
resultUrlsstring[]Signierte URLs /api/media/file/{id}/{idx}?sig=… (kein API-Schlüssel).
priceRubnumberGebührenbetrag in USD (0 bei Fehler oder vor Abschluss).
failMsgstring | nullSichere Nachricht bei einem Fehler oder einem nicht terminalen media_submission_uncertain.
errorCodestring | nullFehlercode (media_generation_failed) oder nicht-terminierendes media_submission_uncertain.
retryGuidancestring | nullBei media_submission_uncertain: eine sichere Anweisung, später dieselbe jobId abzufragen und nicht automatisch ein Duplikat zu erstellen.
# 2. poll the job until it is ready
curl https://getvibeapi.com/api/media/jobs/JOB_ID \
  -H "Authorization: Bearer $GETVIBE_API_KEY"
# → {"status":"success","resultUrls":["https://..."],"priceRub":...}
Empfohlenes Polling-Intervall: 3–5 s, mit einem exponentiellen Backoff bis zu 30 s. Das clientseitige Timeout richtet sich nach der SLA Ihrer Anwendung (die Videogenerierung kann Minuten dauern).

Webhook-Registrierung

GEThttps://getvibeapi.com/api/webhooks
PATCHhttps://getvibeapi.com/api/webhooks

Eine URL pro Konto: mediaWebhookUrl. Konfiguriert unter Dashboard → Webhooks oder über die API mit einer Kontositzung (einem Cookie nach der Anmeldung). Der Endpunkt akzeptiert sk-pv-… — ausschließlich eine authentifizierte Sitzung.

# Example (a dashboard session is required, not an API key)
curl -X PATCH https://getvibeapi.com/api/webhooks \
  -H "Content-Type: application/json" \
  -b "session=YOUR_SESSION" \
  -d '{"mediaWebhookUrl":"https://example.com/webhooks/media"}'

# Clear the URL
curl -X PATCH https://getvibeapi.com/api/webhooks \
  -H "Content-Type: application/json" \
  -b "session=YOUR_SESSION" \
  -d '{"mediaWebhookUrl":null}'
URL-Anforderungen
ParameterTypBeschreibung
mediaWebhookUrlHTTPS-URLEine öffentliche HTTPS-Adresse; private Adressen und Loopback-Adressen sowie unsere eigenen Domains werden abgelehnt (SSRF-Schutz), und die Adresse wird vor jeder Zustellung erneut überprüft. Eine leere Zeichenfolge oder null setzt sie zurück.
balanceWebhookUrlHTTPS-URLEin separater Webhook für einen niedrigen Kontostand (nicht für Medien), signiert mit demselben Kontogeheimnis, x-pv-event: balance.low. Der Schwellenwert ist balanceWebhookThresholdRub.

Webhook-Zustellung bei Auftragsabschluss

Wenn ein Auftrag einen endgültigen Status erreicht, erstellt GetVibe ein logisches Ereignis und übermittelt es über POST an den registrierten mediaWebhookUrl. Die Zustellung ist begrenzt: Der Dienst unternimmt insgesamt bis zu 5 Versuche. Dieselbe Nutzlast kann mehr als einmal eintreffen.

// POST to your mediaWebhookUrl when a job finishes
{
  "jobId": "...",
  "status": "success",            // or "fail"
  "model": "veo-3.1",
  "kind": "video",                // image | video | audio | music | 3d
  "resultUrls": ["https://getvibeapi.com/api/media/file/..."],
  "failMsg": null,
  "createdAt": "2026-06-17T10:00:00.000Z"
}
Zustellverhalten (wie im Code)
ParameterTypBeschreibung
Signature / auth—Jede Zustellung wird mit Standard Webhooks signiert: mit den Headern webhook-id, webhook-timestamp und webhook-signature (v1, base64-HMAC-SHA256 von „id.timestamp.body“). Das Kontogeheimnis wird im Dashboard → Webhooks angezeigt und bei GET /api/media/webhook-secret als accountSecret an einen API-Schlüssel zurückgegeben; Zustellungen an eine webhook_url pro Anfrage werden mit dem Geheimnis dieses Schlüssels (dem Feld secret) signiert. Lehnen Sie Anfragen mit einer ungültigen Signatur oder einem Zeitstempel ab, der älter als 5 Minuten ist.
RetriesoutboxInsgesamt bis zu 5 Versuche; Intervall nach einem Fehler: 1, 2, 4, 8 Minuten. Nach Ausschöpfung der Versuche wechselt das Ereignis zu FAILED und wird nicht mehr automatisch zugestellt. Polling von GET /api/media/jobs/{id} bleibt die Quelle für den Status.
Receiver deduprequiredDeduplizieren Sie anhand des Paars aus jobId + status und gestalten Sie Ihren Handler idempotent. Verwenden Sie den Webhook nicht als alleinige Zustandsquelle.
Content-Typeapplication/jsonDer Body ist JSON mit den Feldern jobId, status, model, kind, resultUrls, failMsg, createdAt.

Fehler von POST /api/media/generate

HTTPWannGebührErneut versuchen
202Auftrag angenommen (ok: true, jobId)Nein (nur nach Erfolg)—
400Ungültiges JSON / ungültiger Request-BodyNeinKorrigieren Sie die Anfrage
401Fehlender oder ungültiger API-SchlüsselNeinAuthorization prüfen
402Unzureichendes Guthaben (Zulassung)NeinGuthaben aufladen
422Unbekanntes Modell, ungültige opts, ok: false von der FassadeNeinFix model/opts
502media_submit_failed — Upstream nicht verfügbarNeinErneut versuchen mit Backoff
503priceUnavailable, routing guard, VIDEO_DISABLED, veo ohne PreisNeinAnderes Modell / später

Fehler bei der Statusabfrage und endgültige Fehler

HTTP / StatusBedeutungGebühr
404Auftrag nicht gefunden oder eine fremde jobIdNein
processingDer Auftrag wird noch ausgeführtNein
successFertig, resultUrls befülltJa — priceRub in der Antwort
failGenerierung fehlgeschlagenNo (priceRub = 0)

Abrechnung und Idempotenz

  • Wird bei Erfolg einmal berechnet. In finalizeJob ist der Übergang processing → success|fail atomar: Ein wiederholter Callback oder Polling-Vorgang erzeugt keine zweite Berechnung.
  • fail – kostenlos. Bei einem fail-Status wird keine Belastung vorgenommen.
  • Aufnahmeangebot. Wenn bei der Erstellung ein Angebot gespeichert wurde, wird bei Erfolg genau dieses berechnet (niemals mehr als die tatsächliche Abrechnung des Upstreams).
  • Idempotenz erstellen – per Header. Ein wiederholter POST an /api/media/generate ohne den Header erstellt einen neuen Job und berechnet bei Erfolg erneut. Senden Sie Idempotency-Key (bis zu 255 ASCII-Zeichen): Ein erneuter Versuch mit demselben Schlüssel und Body innerhalb von 24 Stunden gibt dieselbe jobId ohne einen neuen Job zurück; derselbe Schlüssel mit einem anderen Body ergibt 422 und 409, solange die erste Anfrage noch verarbeitet wird. Die jobId einer kostenpflichtigen Generierung wird auch in GET /v1/generations angezeigt (im Feld job_id).
  • Der Webhook ist auf fünf Versuche begrenzt. Für jeden endgültigen Statuswechsel wird ein logisches Ereignis erstellt, die Zustellversuche können sich jedoch wiederholen. Nach fünf Fehlversuchen erhält das Ereignis den Status FAILED. Der Client-Handler muss das Paar jobId + status deduplizieren.
Siehe auch: Mediengenerierung, Medienmodellkatalog, Fehler und Limits (häufige 401/402/429-Codes für /v1).
GetVibe API-Medien-Webhooks – Status, Fehler, Abrechnung | GetVibe API