التوثيقالتعامل مع الأخطاء

التعامل مع الأخطاء

افهم ردود الخطأ ورموزها، واعرف متى تعيد المحاولة ومتى تحتاج إلى تعديل الطلب.

ميز بين رفض الطلب وفشل التفريغ. في الحالة الأولى، لم يقبل API الطلب. وفي الثانية، قبله وبدأت المعالجة، لكنها انتهت لاحقا بحالة failed في حقل status.

بنية رد الخطأ

تأتي أخطاء الطلبات على /v1 بهذه البنية:

{
  "error": {
    "code": "insufficient_minutes",
    "message": "Not enough minutes",
    "retryable": false,
    "action_url": "https://transcript1.com/dashboard/billing",
    "minutes_needed": 20,
    "minutes_remaining": 3
  }
}

اكتب منطق معالجة الخطأ بناء على code، لا نص الرسالة. اعرض message للمستخدم، لكن لا تعتمد على ثبات صياغتها. إذا كانت retryable تساوي true، فقد ينجح الطلب نفسه بعد الانتظار.

قد تجد حقولا إضافية إلى جانب retryable توضح ما تحتاج إلى فعله:

الحقلرمز الخطأ المرتبط بهما الذي يوضحه؟
action_urlinsufficient_minutes، no_active_plan، topup_needs_userرابط شراء باقة أو شحن دقائق إضافية.
minutes_needed، minutes_remaininginsufficient_minutesالدقائق المطلوبة والدقائق المتبقية في رصيدك. تكون المطلوبة null إذا لم نعرف المدة بعد.
reason، packstopup_needs_userسبب عدم الخصم من البطاقة، وعدد الحزم المطلوبة.
supported_platformsunsupported_platformقيم المنصات المقبولة وهي ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteأرقام الأجزاء التي لم تصل أثناء الرفع.
max_bytesmedia_too_largeحد حجم الملف المسموح لحسابك بالبايت.
paramsinvalid_requestكائن يحدد الحقول غير الصالحة وسبب الخطأ في كل منها، عند فحص body أو query.

لماذا لم يقبل API الطلب؟

رمز HTTPcodeهل تعيد المحاولة؟السبب أو الإجراء المطلوب
400، 422invalid_requestلاحقل أو معامل ناقص أو غير صالح، أو JSON غير صالح في body. من أمثلته الجمع بين diarize وsource: "captions"، أو بين reuse_recent وwebhook_url.
422invalid_urlلاأرسل رابطا من YouTube أو X أو TikTok أو Instagram أو Facebook أو Bluesky، أو إحدى المنصات في المصادر والخيارات. تأكد أيضا أن platform يطابق الرابط.
422unsupported_platformلاأرسلت قيمة غير مدعومة في platform.
422unsupported_mediaلاامتداد الملف الذي رفعته غير مدعوم.
401unauthorizedلابيانات المصادقة غائبة أو غير صالحة أو انتهت صلاحيتها أو ألغيت. وقد يكون token الرفع غير صالح أو منتهي الصلاحية.
403insufficient_scopeلالا يملك OAuth token صلاحية transcriptions:read أو transcriptions:write المطلوبة.
403email_not_verifiedلاأكد بريدك الإلكتروني أولا لتتمكن من إنشاء تفريغ أو جلسة مباشرة.
402insufficient_minutesلارصيدك القابل للاستخدام 0، أو لا يكفي لمدة التسجيل، أو أقل من دقيقة واحدة بدأت في جلسة مباشرة. إذا كان الشحن التلقائي مفعلا، يحاول transcript1 الشحن أولا. اشترِ الدقائق عبر action_url، أو دع وكيلا يشتريها عبر POST /v1/topups أو أداة MCP المسماة top_up.
402no_active_planلاحاولت شحن دقائق إضافية دون باقة مدفوعة نشطة. يصدر هذا الخطأ من POST /v1/topups ومن endpoints الفوترة في لوحة التحكم، لا من endpoints التفريغ.
402topup_needs_userفقط مع pending وin_progressلم يخصم POST /v1/topups من البطاقة. يوضح reason السبب: not_allowed (بيانات الاعتماد غير مسموح لها بشراء الشحن، أو مستخدمها ليس مشرفا في الفريق)، أو cap_reached (لم يعد في الحد الشهري للوكلاء هامش)، أو card_declined أو authentication_required أو no_card. يمكن للمستخدم شراء الحزم عبر action_url. ومع pending (لم يتأكد الدفع بعد) وin_progress (عملية شحن أخرى جارية)، قد يكتمل الدفع لاحقا: أعد المحاولة لاحقا بقيمة Idempotency-Key نفسها بدلا من توجيه المستخدم إلى الشراء.
404not_foundلالا يوجد تفريغ بهذا المعرف، أو أنه يتبع فريقا آخر.
409upload_incompleteلالم تصل بعض أجزاء الملف. أرسلها ثم أكد اكتمال الرفع من جديد.
409invalid_stateلالم يعد التفريغ في حالة انتظار الرفع؛ لا يمكنك إرسال أجزاء أو تأكيد اكتمالها.
409session_endedلاانتهت جلسة مباشرة، لذا لا يستطيع POST /v1/live/sessions/:id/token إصدار رمز مميز. يُرسل أيضا بوصفه حدث error في WebSocket.
422unsupported_languageلاقيمة language في جلسة مباشرة غير مدعومة.
422unsupported_translationلالغة translate_to في جلسة مباشرة غير مدعومة، أو الترجمة المباشرة غير متاحة.
409idempotency_conflictلااستخدمت قيمة Idempotency-Key سابقا مع معاملات مختلفة.
413media_too_largeلاتجاوز الملف الحجم المسموح. راجع رفع الملفات.
413invalid_requestلاتجاوز body بصيغة JSON حد 1 MB. للملفات الكبيرة، يكون الرمز media_too_large بدلا منه.
429rate_limitedنعمتجاوزت عدد الطلبات المسموح في الدقيقة. انتظر عدد الثواني المحدد في Retry-After.
429too_many_active_jobsنعمبلغت حد التفريغات الجارية أو عمليات الرفع المفتوحة. انتظر المدة المحددة في Retry-After.
429too_many_live_sessionsنعماستُخدمت جلسات باقتك المباشرة المتزامنة كلها. انتظر عدد الثواني (30) المحدد في Retry-After.
500internal_errorنعمواجهنا خطأ داخليا. انتظر قليلا وحاول مجددا.
503service_unavailableنعمtranscript1 غير متاح مؤقتا. حاول بعد قليل.
503live_capacityنعمالسعة المباشرة كلها مستخدمة. انتظر عدد الثواني (30) المحدد في Retry-After ثم أنشئ الجلسة من جديد.
503live_unavailableلاالتفريغ المباشر غير متاح الآن.

إذا اعتمد طلب المتصفح على cookie تسجيل الدخول بدلا من Bearer، نتحقق أيضا من الموقع الذي أرسله. طلب موقع آخر يعيد 403 forbidden_origin. هذا الفحص لا يؤثر في استدعاءات API التي تستخدم ترويسة Authorization.

مع كل 429، تجد في Retry-After عدد الثواني التي يجب انتظارها. حدود كل باقة موضحة في الفوترة وحدود الاستخدام.

متى ترسل الطلب من جديد؟

  • أعد الطلب نفسه فقط مع retryable: true. ينطبق ذلك على rate_limited وtoo_many_active_jobs وtoo_many_live_sessions وlive_capacity وinternal_error وservice_unavailable، وعلى topup_needs_user عندما تكون قيمة reason هي pending أو in_progress. انتظر Retry-After إن وجد، وإلا فزد مدة الانتظار بين المحاولات.
  • إذا كررت POST /v1/transcriptions أو POST /v1/topups، احتفظ بقيمة Idempotency-Key نفسها. إذا نجح الطلب الأول، فلن تدفع مرتين.
  • لبقية الرموز، عالج سبب الخطأ قبل إرسال الطلب مجددا.

التفريغ المباشر

يستخدم POST /v1/live/sessions ونقاط النهاية المباشرة الأخرى بنية الرد نفسها. وتنطبق عليها أيضا الرموز invalid_request وunsupported_language وinsufficient_minutes وemail_not_verified، إضافة إلى رموز التفريغ المباشر في الجدول أعلاه. إنشاء الجلسة ليس idempotent، لذا تنشئ إعادة المحاولة بعد too_many_live_sessions أو live_capacity جلسة جديدة.

بعد أن تقوم الجلسة، تصل المشكلات عبر WebSocket بوصفها أحداث error ورموز إغلاق، لا أخطاء HTTP. راجع التفريغ المباشر لكل الأحداث.

رمز الإغلاقالمعنى
1000إغلاق عادي، بعد session.ended.
1011خطأ غير متوقع في الخادم. استأنف الجلسة برمز مميز جديد.
1012إعادة تشغيل الخادم، بعد reconnect. استأنف الجلسة برمز مميز جديد.
4001الرمز المميز غير صالح أو منتهي أو مستخدم من قبل.
4004لم تُعثر على الجلسة أو انتهت بالفعل.
4008مخالفة للبروتوكول: إطار صوت بطول فردي أو بحجم كبير أكثر من اللازم.
4010حلّ محله اتصال أحدث بالجلسة نفسها.

الجلسة المباشرة التي تنتهي لسبب مثل balance_exhausted أو idle_timeout ليست خطأ: فهي ترسل session.ended مع سبب الانتهاء وتُحفظ. راجع أسباب الانتهاء.

إذا فشل التفريغ بعد قبول الطلب

قد يصل رد قبول الطلب ثم يفشل التفريغ لاحقا. عند status=failed، يحتوي الكائن على error: { "code", "message" }. اقرأ error عند متابعة الحالة أو عند استقبال webhook من نوع transcription.failed. عند فشل الترجمة يُرسَل webhook من النوع transcription.translation.failed، ولا يفشل التفريغ بسببها.

error.codeماذا حدث؟هل تفيد محاولة أخرى؟
media_unavailableالفيديو غير موجود أو لم يعد متاحا.لا؛ تحقق من الرابط.
media_privateلا يمكن جلب الفيديو لأنه خاص.لا؛ اختر منشورا عاما، أو فيديو YouTube عاما أو غير مدرج.
login_requiredلا تتيح المنصة مشاهدة الفيديو دون تسجيل الدخول.لا؛ فشل دائم لا نعيد محاولته.
no_audioلا يحتوي الفيديو على مسار صوتي.لا؛ فشل دائم لا نعيد محاولته.
age_restrictedيفرض الفيديو قيودا عمرية.لا؛ ارفع الملف بدلا من الرابط.
live_streamالبث ما زال مباشرا، أو لم يبدأ بعد.انتظر انتهاء البث.
no_captionsاخترت source=captions، ولم نجد مسار ترجمة نصية مناسبا.اختر source: "auto" أو "stt".
media_too_longتجاوز التسجيل حد تحويل الصوت إلى نص، وهو 5 ساعات.لا؛ قسم التسجيل إلى ملفات أقصر.
unsupported_mediaتعذر قراءة الملف أو لم نجد فيه مسارا صوتيا.لا؛ أرسل ملفا مدعوما.
no_speechلم يُرصد أي كلام.لا.
unsupported_languageلغة التسجيل غير مدعومة.لا؛ اضبط language على رمز مدعوم أو "auto".
insufficient_minutesنفدت الدقائق قبل خصم تكلفة التفريغ، ولم يتمكن الشحن التلقائي، إن كان مفعلا، من إضافة دقائق.اشحن دقائق إضافية أولا.
fetch_failedتعذر جلب التسجيل رغم تكرار المحاولة.نعم، جرب لاحقا.
transcription_failedتعذر تحويل الصوت إلى نص رغم تكرار المحاولة.نعم، جرب لاحقا.

إذا فشل التفريغ أو ألغيته، لا تدفع شيئا. نعيد إلى رصيدك أي دقائق خصمناها له.

تاريخ التحديث 5 نوفمبر 2026