Webhooks और media job lifecycle

एक mediaWebhookUrl register करें, job पूरा होने पर POST प्राप्त करें, GET /api/media/jobs/{id} को poll करें, error codes संभालें, और charging तथा idempotency सीमाएँ समझें।

asynchronous media jobs की operational guide: webhook registration, statuses, polling, error codes, charges और idempotency limits — पूरी तरह code में मौजूद वर्तमान implementation के अनुसार।

Job जीवनचक्र

  1. POST /api/media/generate — सफलता पर 202 और { ok: true, jobId, status: "processing" }। API में अलग queued / running statuses नहीं हैं: job पूरा होने तक client को processing दिखता है।
  2. Upstream internal stages (waiting, generating) से गुज़र सकता है — ये public API में reflect नहीं होते; polling के दौरान job processing ही रहता है।
  3. Terminal statuses: success (has resultUrls, charged on success) या fail (no charge)।
  4. Completion एक बार दर्ज होता है: upstream callback के ज़रिए या GET /api/media/jobs/{id} में lazy poll पर।

पोलिंग: GET /api/media/jobs/{id}

GEThttps://getvibeapi.com/api/media/jobs/{id}
ParameterTypeविवरण
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[]Signed URLs /api/media/file/{id}/{idx}?sig=… (कोई API key नहीं)।
priceRubnumberUSD में charge amount (fail पर या completion से पहले 0)।
failMsgstring | nullfail पर safe message या एक non-terminal media_submission_uncertain।
errorCodestring | nullError code (media_generation_failed) या non-terminal media_submission_uncertain।
retryGuidancestring | nullmedia_submission_uncertain पर: एक सुरक्षित निर्देश कि बाद में उसी jobId को poll करें और स्वतः कोई duplicate न बनाएँ।
# 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":...}
अनुशंसित polling interval: 3–5 s, अधिकतम 30 s तक exponential backoff के साथ। Client-side timeout आपके application SLA के अनुसार है (video generation में कई मिनट लग सकते हैं)।

Webhook पंजीकरण

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

प्रति account एक URL: mediaWebhookUrl। dashboard → Webhooks में या API के ज़रिए account session (लॉगिन के बाद का cookie) से कॉन्फ़िगर किया जाता है। endpoint accept नहीं करता sk-pv-… — केवल authenticated session।

# 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 आवश्यकताएँ
ParameterTypeविवरण
mediaWebhookUrlHTTPS URLएक सार्वजनिक HTTPS पता; निजी/लूपबैक पतों और हमारे अपने डोमेन को अस्वीकार किया जाता है (SSRF सुरक्षा), और हर डिलीवरी से पहले पते की दोबारा जाँच की जाती है। खाली स्ट्रिंग या null इसे रीसेट कर देता है।
balanceWebhookUrlHTTPS URLकम बैलेंस के लिए एक अलग वेबहुक (मीडिया के लिए नहीं), जिस पर खाते के उसी रहस्य से हस्ताक्षर किए जाते हैं, x-pv-event: balance.low। सीमा balanceWebhookThresholdRub है।

job पूरा होने पर Webhook delivery

जब कोई job terminal status पर पहुँचता है, तो GetVibe एक logical event बनाता है और उसे POST के ज़रिए registered mediaWebhookUrl पर deliver करता है। Delivery सीमित है: सेवा कुल अधिकतम 5 प्रयास करती है। वही payload एक से अधिक बार पहुँच सकता है।

// 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"
}
Delivery behavior (कोड के अनुसार)
ParameterTypeविवरण
Signature / auth—हर डिलीवरी पर Standard Webhooks के अनुसार हस्ताक्षर किए जाते हैं: webhook-id, webhook-timestamp और webhook-signature हेडर (v1, “id.timestamp.body” का base64 HMAC-SHA256)। खाते का रहस्य डैशबोर्ड → Webhooks में दिखाया जाता है और GET /api/media/webhook-secret द्वारा API कुंजी को accountSecret के रूप में लौटाया जाता है; प्रति-अनुरोध webhook_url पर की जाने वाली डिलीवरी पर उस कुंजी के रहस्य (secret फ़ील्ड) से हस्ताक्षर किए जाते हैं। गलत हस्ताक्षर या 5 मिनट से पुराना टाइमस्टैम्प वाला अनुरोध अस्वीकार करें।
Retriesoutboxकुल अधिकतम 5 attempts; failure के बाद interval: 1, 2, 4, 8 मिनट। attempts खत्म होने पर event FAILED में चला जाता है और अपने आप deliver नहीं होता। Polling GET /api/media/jobs/{id} ही state का source बना रहता है।
Receiver deduprequiredjobId + status की जोड़ी से deduplicate करें और अपने handler को idempotent बनाएँ। webhook को state का एकमात्र स्रोत न मानें।
Content-Typeapplication/jsonBody JSON है जिसमें fields jobId, status, model, kind, resultUrls, failMsg, createdAt हैं।

POST /api/media/generate त्रुटियाँ

HTTPकबChargeRetry
202Job स्वीकृत (ok: true, jobId)No (केवल success के बाद)—
400अमान्य JSON / request bodyNorequest ठीक करें
401API key गुम या अमान्यNoCheck Authorization
402अपर्याप्त बैलेंस (प्रवेश)NoBalance top up करें
422Unknown model, invalid opts, facade से ok: falseNoFix model/opts
502media_submit_failed — अपस्ट्रीम अनुपलब्धNoबैकऑफ़ के साथ पुनः प्रयास करें
503priceUnavailable, रूटिंग गार्ड, VIDEO_DISABLED, बिना मूल्य वाला veoNoदूसरा model / बाद में

पोलिंग त्रुटियाँ और अंतिम विफलताएँ

HTTP / स्थितिअर्थCharge
404job नहीं मिला या कोई foreign jobIdNo
processingJob अभी भी चल रहा हैNo
successहो गया, resultUrls भर गएहाँ — response में priceRub
failGeneration विफल रहीNo (priceRub = 0)

Billing और idempotency

  • सफलता पर एक बार charge। finalizeJob में transition processing → success|fail atomic है: बार-बार callback या poll करने पर दूसरा charge नहीं बनता।
  • fail — मुफ़्त। fail status पर कोई debit नहीं किया जाता।
  • Admission quote. अगर creation के समय कोई quote save किया गया था, तो success पर ठीक वही charge होता है (actual upstream metering से कभी अधिक नहीं)।
  • Idempotency बनाएँ — header से। header के बिना /api/media/generate पर बार-बार POST करने से नया job और सफलता पर नया charge बनता है। Idempotency-Key भेजें (255 ASCII characters तक): 24 घंटे के भीतर उसी key और body के साथ retry करने पर नया job बनाए बिना वही jobId लौटता है; अलग body के साथ वही key 422 देता है, और पहला request अभी process हो रहा हो तो 409। पेड generation का jobId GET /v1/generations में भी दिखता है (job_id field)।
  • Webhook अधिकतम पाँच attempts तक सीमित है। हर terminal transition पर एक logical event बनता है, लेकिन delivery attempts दोहराए जा सकते हैं। पाँच failures के बाद event को status FAILED मिल जाता है। Client handler को jobId + status जोड़ी को deduplicate करना चाहिए।
यह भी देखें: Media generation, Media model catalog, Errors and limits (/v1 के लिए सामान्य 401/402/429 codes)।
GetVibe API मीडिया वेबहुक्स — स्थितियाँ, त्रुटियाँ, बिलिंग | GetVibe API