المظهر
اللغة

الـ webhooks ودورة حياة مهام الوسائط

سجّل mediaWebhookUrl، واستقبل طلب POST عند اكتمال المهمة، واستعلم عبر GET /api/media/jobs/{id}، وتعامل مع رموز الأخطاء، وافهم حدود الفوترة وعدم التكرار.

دليل تشغيلي لمهام الوسائط غير المتزامنة: تسجيل webhook، والحالات، والاستطلاع، وأكواد الأخطاء، والرسوم، وحدود idempotency — بدقة وفقًا للتنفيذ الحالي في الكود.

دورة حياة المهمة

  1. POST /api/media/generate — عند النجاح 202 و{ ok: true, jobId, status: "processing" }. ولا توجد في الـ API حالتان منفصلتان queued / running: فحتى انتهاء المهمة يرى العميل processing.
  2. قد يمرّ المزوّد upstream بمراحل داخلية (waiting، generating) — وهي لا تظهر في واجهة API العامة؛ وأثناء الاستعلام يبقى المهمة processing.
  3. الحالات النهائية: success (يحمل resultUrls، ويُحتسب عند النجاح) أو fail (دون احتساب).
  4. يُسجَّل الإكمال مرة واحدة: عبر رد الاتصال من المصدر أو عند استعلام مؤجَّل في GET /api/media/jobs/{id}.

الاستعلام: GET /api/media/jobs/{id}

GEThttps://getvibeapi.com/api/media/jobs/{id}
المعلمةالنوعالوصف
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[]روابط موقّعة /api/media/file/{id}/{idx}?sig=… (بدون مفتاح API).
priceRubnumberمبلغ الرسوم بالدولار الأمريكي (0 عند الفشل أو قبل الاكتمال).
failMsgstring | nullرسالة آمنة عند الفشل أو عند وجود media_submission_uncertain غير نهائي.
errorCodestring | nullرمز الخطأ (media_generation_failed) أو media_submission_uncertain غير النهائي.
retryGuidancestring | nullعند ظهور media_submission_uncertain: إرشاد آمن لإعادة الاستعلام عن المهمة نفسها jobId لاحقًا وعدم إنشاء مهمة مكررة تلقائيًا.
# 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":...}
الفاصل الموصى به للاستقصاء الدوري: 3–5 ثوانٍ، مع تراجع أُسّي يصل إلى 30 ثانية. وتُحدد مهلة العميل وفق اتفاقية مستوى الخدمة لتطبيقك (قد يستغرق توليد الفيديو دقائق).

تسجيل الـ webhook

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

عنوان URL واحد لكل حساب: mediaWebhookUrl. يُضبط في dashboard → Webhooks أو عبر API باستخدام جلسة الحساب (ملف ارتباط بعد تسجيل الدخول). ونقطة النهاية لا تقبل sk-pv-… — بل جلسة موثّقة فقط.

# 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
المعلمةالنوعالوصف
mediaWebhookUrlHTTPS URLعنوان HTTPS عام؛ تُرفض العناوين الخاصة/عناوين الاسترجاع الذاتي ونطاقاتنا الخاصة (للحماية من SSRF)، ويُعاد التحقق من العنوان قبل كل عملية تسليم. تعيد السلسلة الفارغة أو null ضبطه.
balanceWebhookUrlHTTPS URLWebhook منفصل لانخفاض الرصيد (وليس للوسائط)، ويُوقّع باستخدام سر الحساب نفسه، x-pv-event: balance.low. الحد الأدنى هو balanceWebhookThresholdRub.

تسليم الـ webhook عند اكتمال المهمة

عندما تصل المهمة إلى حالة نهائية، يُنشئ GetVibe حدثًا منطقيًا واحدًا ويسلّمه عبر POST إلى mediaWebhookUrl المسجَّل. التسليم محدود: تقدّم الخدمة حتى 5 محاولات إجمالًا. وقد تصل الحمولة نفسها أكثر من مرة.

// 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"
}
سلوك التسليم (كما في الشيفرة)
المعلمةالنوعالوصف
Signature / auth—يُوقَّع كل تسليم باستخدام Standard Webhooks: الرؤوس webhook-id وwebhook-timestamp وwebhook-signature (v1، وHMAC-SHA256 بترميز base64 للقيمة “id.timestamp.body”). يظهر سر الحساب في لوحة التحكم → Webhooks، ويُعاد إلى مفتاح API باسم accountSecret عبر GET /api/media/webhook-secret؛ وتُوقَّع عمليات التسليم إلى webhook_url المحدد لكل طلب باستخدام سر ذلك المفتاح (الحقل secret). ارفض أي طلب ذي توقيع غير صحيح أو طابع زمني أقدم من 5 دقائق.
Retriesoutboxحتى 5 محاولات إجمالًا؛ والفاصل بعد كل فشل: 1، 2، 4، 8 دقائق. وبعد استنفاد المحاولات ينتقل الحدث إلى FAILED ولم يعد يُسلَّم تلقائيًا. ويبقى الاستعلام GET /api/media/jobs/{id} هو مصدر الحالة.
Receiver deduprequiredأزل التكرار وفق زوج jobId + status واجعل المعالج خاملًا تكرارًا (idempotent). لا تستخدم الـ webhook كمصدر الحالة الوحيد.
Content-Typeapplication/jsonالجسم JSON بحقول jobId وstatus وmodel وkind وresultUrls وfailMsg وcreatedAt.

أخطاء POST /api/media/generate

HTTPمتىالرسومإعادة المحاولة
202تم قبول المهمة (ok: true, jobId)لا (فقط بعد النجاح)—
400JSON غير صالح / جسم الطلبلاأصلح الطلب
401مفتاح API مفقود أو غير صالحلاالتحقق من Authorization
402رصيد غير كافٍ (القبول)لااشحن الرصيد
422طراز غير معروف، خيارات غير صالحة، ok: false من الواجهةلاFix model/opts
502media_submit_failed — المورّد غير متاحلاإعادة المحاولة مع التراجع التدريجي
503priceUnavailable، وحارس التوجيه، وVIDEO_DISABLED، وveo دون سعرلاطراز آخر / لاحقًا

أخطاء الاستعلام والفشل النهائي

HTTP / الحالةالمعنىالرسوم
404المهمة غير موجودة أو jobId تابع لجهة أخرىلا
processingالمهمة ما زالت قيد التنفيذلا
successتم، وامتلأت resultUrlsنعم — priceRub في الإجابة
failفشل التوليدNo (priceRub = 0)

الفوترة وعدم التكرارية

  • يُحتسب مرة واحدة عند النجاح. في finalizeJob يكون الانتقال processing → success|fail ذرّيًا: فتكرار الاستدعاء أو الاستعلام لا ينشئ احتسابًا ثانيًا.
  • fail — مجانًا. لا يُخصم أي مبلغ عند الحالة fail.
  • عرض السعر عند القبول. إذا حُفظ عرض سعر عند الإنشاء، فسيُحتسب هو نفسه بالضبط عند النجاح (ولن يتجاوز أبدًا القياس الفعلي لدى المزوّد الأعلى).
  • إنشاء مفتاح منع التكرار — عبر الترويسة. إرسال POST متكرر إلى /api/media/generate دون الترويسة ينشئ مهمة جديدة واحتسابًا جديدًا عند النجاح. أرسل Idempotency-Key (حتى 255 حرفًا ASCII): إعادة المحاولة بالمفتاح والجسم نفسيهما خلال 24 ساعة تعيد jobId نفسها دون مهمة جديدة؛ أما المفتاح نفسه مع جسم مختلف فيعيد 422، و409 ما دام الطلب الأول قيد المعالجة. ويظهر jobId الخاص بالتوليد المدفوع أيضًا في GET /v1/generations (الحقل job_id).
  • الـ Webhook محدود بخمس محاولات. يُنشأ حدث منطقي واحد لكل انتقال نهائي، لكن محاولات التسليم قد تتكرر. وبعد خمس محاولات فاشلة يكتسب الحدث الحالة FAILED. ويجب على معالج العميل إزالة تكرار الزوج jobId + status.
انظر أيضاً: توليد الوسائط، كتالوج طرازات الوسائط، الأخطاء والحدود (رموز 401/402/429 الشائعة لـ /v1).
خطافات الويب للوسائط في GetVibe API — الحالات والأخطاء والفوترة | GetVibe API