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

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

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

ميز بين رفض الطلب وفشل التفريغ. في الحالة الأولى، لم يقبل 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رابط شراء باقة أو شحن دقائق إضافية.
minutes_needed، minutes_remaininginsufficient_minutesالدقائق المطلوبة والدقائق المتبقية في رصيدك. تكون المطلوبة null إذا لم نعرف المدة بعد.
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، أو لا يكفي لمدة التسجيل.
402no_active_planلاحاولت شحن دقائق إضافية دون باقة مدفوعة نشطة. هذا الخطأ من endpoint الفوترة في لوحة التحكم، لا من endpoints التفريغ.
404not_foundلالا يوجد تفريغ بهذا المعرف، أو أنه يتبع فريقا آخر.
409upload_incompleteلالم تصل بعض أجزاء الملف. أرسلها ثم أكد اكتمال الرفع من جديد.
409invalid_stateلالم يعد التفريغ في حالة انتظار الرفع؛ لا يمكنك إرسال أجزاء أو تأكيد اكتمالها.
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.
500internal_errorنعمواجهنا خطأ داخليا. انتظر قليلا وحاول مجددا.
503service_unavailableنعمtranscript1 غير متاح مؤقتا. حاول بعد قليل.

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

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

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

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

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

قد يصل رد قبول الطلب ثم يفشل التفريغ لاحقا. عند status=failed، يحتوي الكائن على error: { "code", "message" }. اقرأ error عند متابعة الحالة أو عند استقبال webhook من نوع transcription.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تعذر تحويل الصوت إلى نص رغم تكرار المحاولة.نعم، جرب لاحقا.

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

تاريخ التحديث 19 أكتوبر 2026