एक 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 जीवनचक्र
POST /api/media/generate — सफलता पर 202 और { ok: true, jobId, status: "processing" }। API में अलग queued / running statuses नहीं हैं: job पूरा होने तक client को processing दिखता है।
Upstream internal stages (waiting, generating) से गुज़र सकता है — ये public API में reflect नहीं होते; polling के दौरान job processing ही रहता है।
Terminal statuses: success (has resultUrls, charged on success) या fail (no charge)।
Completion एक बार दर्ज होता है: upstream callback के ज़रिए या GET /api/media/jobs/{id} में lazy poll पर।
पोलिंग: GET /api/media/jobs/{id}
GEThttps://getvibeapi.com/api/media/jobs/{id}
Parameter
Type
विवरण
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.
resultUrls
string[]
Signed URLs /api/media/file/{id}/{idx}?sig=… (कोई API key नहीं)।
priceRub
number
USD में charge amount (fail पर या completion से पहले 0)।
failMsg
string | null
fail पर safe message या एक non-terminal media_submission_uncertain।
errorCode
string | null
Error code (media_generation_failed) या non-terminal media_submission_uncertain।
retryGuidance
string | null
media_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 आवश्यकताएँ
Parameter
Type
विवरण
mediaWebhookUrl
HTTPS URL
एक सार्वजनिक HTTPS पता; निजी/लूपबैक पतों और हमारे अपने डोमेन को अस्वीकार किया जाता है (SSRF सुरक्षा), और हर डिलीवरी से पहले पते की दोबारा जाँच की जाती है। खाली स्ट्रिंग या null इसे रीसेट कर देता है।
balanceWebhookUrl
HTTPS 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 (कोड के अनुसार)
Parameter
Type
विवरण
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 मिनट से पुराना टाइमस्टैम्प वाला अनुरोध अस्वीकार करें।
Retries
outbox
कुल अधिकतम 5 attempts; failure के बाद interval: 1, 2, 4, 8 मिनट। attempts खत्म होने पर event FAILED में चला जाता है और अपने आप deliver नहीं होता। Polling GET /api/media/jobs/{id} ही state का source बना रहता है।
Receiver dedup
required
jobId + status की जोड़ी से deduplicate करें और अपने handler को idempotent बनाएँ। webhook को state का एकमात्र स्रोत न मानें।
Content-Type
application/json
Body JSON है जिसमें fields jobId, status, model, kind, resultUrls, failMsg, createdAt हैं।
POST /api/media/generate त्रुटियाँ
HTTP
कब
Charge
Retry
202
Job स्वीकृत (ok: true, jobId)
No (केवल success के बाद)
—
400
अमान्य JSON / request body
No
request ठीक करें
401
API key गुम या अमान्य
No
Check Authorization
402
अपर्याप्त बैलेंस (प्रवेश)
No
Balance top up करें
422
Unknown model, invalid opts, facade से ok: false
No
Fix model/opts
502
media_submit_failed — अपस्ट्रीम अनुपलब्ध
No
बैकऑफ़ के साथ पुनः प्रयास करें
503
priceUnavailable, रूटिंग गार्ड, VIDEO_DISABLED, बिना मूल्य वाला veo
No
दूसरा model / बाद में
पोलिंग त्रुटियाँ और अंतिम विफलताएँ
HTTP / स्थिति
अर्थ
Charge
404
job नहीं मिला या कोई foreign jobId
No
processing
Job अभी भी चल रहा है
No
success
हो गया, resultUrls भर गए
हाँ — response में priceRub
fail
Generation विफल रही
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 करना चाहिए।