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
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.
Der Upstream kann interne Phasen durchlaufen (waiting, generating) — diese werden in der öffentlichen API nicht widergespiegelt; während des Pollings bleibt der Job processing.
Terminalstatus: success (enthält resultUrls, wird bei Erfolg berechnet) oder fail (keine Berechnung).
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}
Parameter
Typ
Beschreibung
status
string
submitting | 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.
Gebührenbetrag in USD (0 bei Fehler oder vor Abschluss).
failMsg
string | null
Sichere Nachricht bei einem Fehler oder einem nicht terminalen media_submission_uncertain.
errorCode
string | null
Fehlercode (media_generation_failed) oder nicht-terminierendes media_submission_uncertain.
retryGuidance
string | null
Bei 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 akzeptiertsk-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
Parameter
Typ
Beschreibung
mediaWebhookUrl
HTTPS-URL
Eine ö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.
balanceWebhookUrl
HTTPS-URL
Ein 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)
Parameter
Typ
Beschreibung
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.
Retries
outbox
Insgesamt 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 dedup
required
Deduplizieren Sie anhand des Paars aus jobId + status und gestalten Sie Ihren Handler idempotent. Verwenden Sie den Webhook nicht als alleinige Zustandsquelle.
Content-Type
application/json
Der Body ist JSON mit den Feldern jobId, status, model, kind, resultUrls, failMsg, createdAt.
Fehler von POST /api/media/generate
HTTP
Wann
Gebühr
Erneut versuchen
202
Auftrag angenommen (ok: true, jobId)
Nein (nur nach Erfolg)
—
400
Ungültiges JSON / ungültiger Request-Body
Nein
Korrigieren Sie die Anfrage
401
Fehlender oder ungültiger API-Schlüssel
Nein
Authorization prüfen
402
Unzureichendes Guthaben (Zulassung)
Nein
Guthaben aufladen
422
Unbekanntes Modell, ungültige opts, ok: false von der Fassade
Nein
Fix model/opts
502
media_submit_failed — Upstream nicht verfügbar
Nein
Erneut versuchen mit Backoff
503
priceUnavailable, routing guard, VIDEO_DISABLED, veo ohne Preis
Nein
Anderes Modell / später
Fehler bei der Statusabfrage und endgültige Fehler
HTTP / Status
Bedeutung
Gebühr
404
Auftrag nicht gefunden oder eine fremde jobId
Nein
processing
Der Auftrag wird noch ausgeführt
Nein
success
Fertig, resultUrls befüllt
Ja — priceRub in der Antwort
fail
Generierung fehlgeschlagen
No (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.