प्लैटफ़ॉर्म

कॉलबैक (वेबहुक)

पोलिंग करने के बजाय, इमेज या वीडियो के अनुरोध में callback_url दें. तैयार होने या विफल होने पर Zurelay नतीजे को उस URL पर POST करता है, साथ में सिग्नेचर भी भेजता है ताकि आप पुष्टि कर सकें कि यह हमने भेजा है.

कॉलबैक का अनुरोध करें

इनमें से किसी भी अनुरोध में callback_url जोड़ें. यह सार्वजनिक इंटरनेट पर उपलब्ध https URL होना चाहिए.

एंडपॉइंटक्या होता है
POST /v1/videosवीडियो बनाने की प्रक्रिया हमेशा की तरह शुरू होती है. पूरी होने पर कॉलबैक में तैयार वीडियो मिलता है (या विफल होने की वजह). पोलिंग की ज़रूरत नहीं.
POST /v1/images/generationsइमेज तैयार होने का इंतज़ार करने के बजाय तुरंत 202 और अनुरोध का id लौटाता है, बैकग्राउंड में इमेज बनाता है, फिर कॉलबैक भेजता है.
POST /v1/images/editsएडिट के लिए भी यही तरीका है: JSON फ़ील्ड, या मल्टीपार्ट अनुरोध में फ़ॉर्म फ़ील्ड.
curl https://api.zurelay.com/v1/videos \
-H "Authorization: Bearer $ZURELAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"prompt": "A fox running through fresh snow at dawn",
"seconds": 5,
"callback_url": "https://example.com/hooks/zurelay"
}'

कॉलबैक वाले इमेज अनुरोध

callback_url के बिना, इमेज अनुरोध इंतज़ार करता है और जवाब में इमेज लौटाता है, जैसे OpenAI का API करता है. इसे जोड़ने पर अनुरोध तुरंत स्वीकार होता है और जवाब में जॉब मिलता है. शुल्क तभी लगता है जब इमेज बनती हैं:

जवाब
HTTP/1.1 202 Accepted
x-request-id: req_6fJd0kQ3pW9xT2mB7cZ1hR4u
{
"id": "req_6fJd0kQ3pW9xT2mB7cZ1hR4u",
"object": "image.generation",
"model": "nano-banana-pro",
"status": "in_progress",
"created_at": 1791000000,
"completed_at": null,
"data": [],
"url_expires_at": null,
"cost": null,
"error": null,
"callback_url": "https://example.com/hooks/zurelay"
}
GET/v1/images/{id}

आप इसकी पोलिंग भी कर सकते हैं: GET /v1/images/{id} वही ऑब्जेक्ट लौटाता है, और उसका status जब completed हो जाता है, तो data में नए लिंक मिलते हैं. कॉलबैक में हमेशा लिंक होते हैं, base64 नहीं, चाहे response_format कुछ भी हो.

हम क्या भेजते हैं

हर इवेंट के लिए एक POST, जिसकी JSON बॉडी में होते हैं: type, timestamp और data, यानी जॉब ठीक उसी रूप में जैसा API लौटाता है (वीडियो ऑब्जेक्ट, या ऊपर दिया गया इमेज अनुरोध), साथ में 24 घंटे तक काम करने वाले डाउनलोड लिंक.

इवेंटकब
video.completedवीडियो तैयार है: data.url से इसे डाउनलोड करें.
video.failedइसे बनाया नहीं जा सका: data.error में वजह है. आपसे कोई शुल्क नहीं लिया गया.
image.completedइमेज तैयार हैं: data.data में हर इमेज का लिंक है.
image.failedकोई इमेज नहीं बनी: data.error में वजह है. आपसे कोई शुल्क नहीं लिया गया.
वीडियो का कॉलबैक
POST /hooks/zurelay HTTP/1.1
content-type: application/json
user-agent: Zurelay-Webhooks/1.0 (+https://zurelay.com/docs/webhooks)
webhook-id: msg_2c1f9e0b7a4d4f6e8b3a91c05d7e6f42
webhook-timestamp: 1791000094
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
"type": "video.completed",
"timestamp": "2026-10-03T03:21:34.000Z",
"data": {
"id": "video_Qm3v8Rk2Lx7Pa1Zt9Ws4Yn6B",
"object": "video",
"model": "seedance-2.0",
"status": "completed",
"progress": 100,
"created_at": 1791000000,
"completed_at": 1791000093,
"expires_at": 1793592000,
"seconds": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"size": "1280x720",
"generate_audio": true,
"url": "https://…/video_Qm3v8Rk2Lx7Pa1Zt9Ws4Yn6B.mp4?token=…",
"url_expires_at": 1791086494,
"cost": 0.45,
"error": null,
"callback_url": "https://example.com/hooks/zurelay"
}
}
इमेज का कॉलबैक (बॉडी)
{
"type": "image.completed",
"timestamp": "2026-10-03T03:20:41.000Z",
"data": {
"id": "req_6fJd0kQ3pW9xT2mB7cZ1hR4u",
"object": "image.generation",
"model": "nano-banana-pro",
"status": "completed",
"created_at": 1791000000,
"completed_at": 1791000041,
"data": [{ "url": "https://…/req_6fJd0kQ3pW9xT2mB7cZ1hR4u-1.png?token=…" }],
"url_expires_at": 1791086441,
"cost": 0.07,
"error": null,
"callback_url": "https://example.com/hooks/zurelay"
}
}
हेडरवैल्यू
webhook-idmsg_…: इस कॉलबैक की हर दोबारा कोशिश में एक जैसा रहता है. पहले ही प्रोसेस किए गए कॉलबैक को छोड़ने के लिए इसका इस्तेमाल करें.
webhook-timestampयह कोशिश कब भेजी गई थी, Unix सेकंड में.
webhook-signaturev1, फिर सिग्नेचर (नीचे देखें). सीक्रेट बदलने के बाद एक दिन तक दो सिग्नेचर होते हैं, जिनके बीच स्पेस होता है.
user-agentZurelay-Webhooks/1.0

सिग्नेचर की पुष्टि करें

कॉलबैक Standard Webhooks फ़ॉर्मैट का पालन करते हैं, जिसका इस्तेमाल OpenAI के वेबहुक भी करते हैं. सिग्नेचर, <webhook-id>.<webhook-timestamp>.<body> का HMAC-SHA256 है, जो आपके वर्कस्पेस के साइनिंग सीक्रेट को कुंजी बनाकर तैयार किया जाता है और base64 में होता है. सीक्रेट (जो whsec_ से शुरू होता है) डैशबोर्ड के API कुंजियां पेज पर मिलेगा. इसे सिर्फ़ अपने सर्वर पर रखें.

import os
from fastapi import FastAPI, HTTPException, Request
from standardwebhooks.webhooks import Webhook # pip install standardwebhooks
webhook = Webhook(os.environ["ZURELAY_WEBHOOK_SECRET"]) # whsec_…
app = FastAPI()
@app.post("/hooks/zurelay")
async def zurelay_hook(request: Request):
body = await request.body() # the raw bytes: the signature covers exactly these
try:
event = webhook.verify(body, dict(request.headers))
except Exception:
raise HTTPException(status_code=400)
handle(event) # event["type"], event["data"]; keep it quick, or queue it
return {"ok": True}
  • मूल बॉडी की जांच करें: JSON को पार्स करके दोबारा सीरियलाइज़ करने से बाइट बदल जाते हैं, और उनके साथ सिग्नेचर भी.
  • पांच मिनट से पुराने webhook-timestamp को अस्वीकार करें: इससे कोई भी इंटरसेप्ट किए गए कॉलबैक को दोबारा नहीं चला सकेगा. लाइब्रेरी यह जांच आपके लिए करती हैं.
  • सीक्रेट बदलने पर तुरंत नया सीक्रेट मिल जाता है (मालिक और एडमिन इसे API कुंजियां पेज पर बदल सकते हैं). पुराना सीक्रेट भी 24 घंटे तक नए के साथ साइन करता रहता है, इसलिए एक दिन के भीतर अपने सर्वर को नए सीक्रेट पर स्विच कर दें.

पहले जवाब दें, फिर काम करें

15 सेकंड के भीतर कोई भी 2xx लौटाएं और कॉलबैक डिलीवर हुआ माना जाएगा. पहले इवेंट सहेजें और जवाब दें; वीडियो या इमेज बाद में डाउनलोड करें. कॉलबैक एक से ज़्यादा बार आ सकता है (मिसाल के लिए, अगर आपका जवाब रास्ते में खो गया हो), इसलिए हर कॉलबैक को सिर्फ़ एक बार प्रोसेस करने के लिए webhook-id का इस्तेमाल करें.

दोबारा कोशिशें

इसके अलावा कुछ भी होने पर (गड़बड़ी वाला स्टेटस, रीडायरेक्ट, 15 सेकंड में जवाब न मिलना, या सर्वर तक न पहुंच पाना) दोबारा कोशिश होती है, कुल छह बार:

कोशिशकब भेजा जाता है
1जॉब पूरा होते ही
21 मिनट बाद
3उसके 5 मिनट बाद
4उसके 30 मिनट बाद
5उसके 2 घंटे बाद
6उसके 8 घंटे बाद, फिर इसे विफल चिह्नित कर दिया जाता है

हर कॉलबैक डैशबोर्ड के अनुरोध में अपने अनुरोध के साथ दिखता है: वह कहाँ भेजा गया, हर कोशिश में क्या जवाब मिला और अगली कोशिश कब होगी। वहाँ कॉलबैक फिर भेजें से उसे तुरंत दोबारा भेजा जाता है, चाहे वह पहले पहुँच चुका हो या नहीं। हर कोशिश में उसके अंदर के लिंक नए होते हैं।

कॉलबैक सिर्फ़ सार्वजनिक इंटरनेट पर मौजूद https URL पर भेजे जाते हैं: localhost, निजी पते या ऐसे किसी पते पर रिज़ॉल्व होने वाले URL पर नहीं। ये रीडायरेक्ट का पालन नहीं करते, इसलिए अंतिम URL का इस्तेमाल करें। डेवलपमेंट के दौरान इन्हें आज़माने के लिए टनल (ngrok, Cloudflare Tunnel) या रिक्वेस्ट इंस्पेक्टर का इस्तेमाल करें।

कोई सवाल है, या कुछ छूट गया है? हमारी सहायता टीम से पूछें और हम ईमेल से जवाब देंगे, आम तौर पर एक मिनट के भीतर.