إنتقل إلى المحتوى الرئيسي

الأخطاء

كل خطأ من الواجهة البرمجية العامة لمجيب يستخدم نفس الظرف. تفرّع على code (ثابت، إضافي إلى الأبد) — لا تفرّع أبداً على message (مقروء بشرياً، قد يُعاد صياغته دون إشعار).

كيف تبدو استجابة الخطأ؟​

{
"error": {
"type": "validation_error",
"code": "invalid_from_phone",
"message": "The 'from' field must be an E.164 phone number...",
"param": "from",
"correlation_id": "req_01KQ..."
}
}
الحقلحاضر دائماً؟الغرض
typeنعمتصنيف ثابت لكتل catch
codeنعمسبب محدّد ثابت — تفرّع على هذا
messageنعممقروء بشرياً؛ لا تستخدم كمفتاح أبداً
correlation_idنعممعرّف تتبّع لسجلاتنا — اقتبس في تذاكر الدعم
حقول إضافيةأحياناًسياق لكل خطأ (مثل param، available_phones، original_correlation_id)

ما أنواع الخطأ؟​

مجموعة صغيرة وثابتة من التصنيفات. إضافية إلى الأبد — قد تظهر أنواع جديدة، لن يُحذَف أي قائم:

typeHTTP المعتاد
authentication_error401
permission_error403
validation_error413، 422
idempotency_error409 / 422
rate_limit_error429
quota_error402
conflict_error409
not_found_error404
internal_error500، 503 (و401 حين يتعذّر فحص المفتاح)

ما الكتالوج الكامل للرموز؟​

الرموز enum ثابت. رموز جديدة تظهر دون إشعار؛ لا شيء قائم سيُعاد تسميته أو غرضه.

codeHTTPالمعنى
invalid_api_key401مفتاح مفقود، مشوّه، غير معروف، ملغى، أو منتهي الصلاحية. صحّح رأس Authorization.
insufficient_scope403المفتاح يفتقر للنطاق المطلوب (الاستجابة تحوي required_scope).
agent_not_authorized403المفتاح مقيّد بوكلاء معيّنين وهذا ليس منهم.
shared_with_other_agents403قاعدة المعرفة، أو تسجيل دخول موقع أداة ربط نظامك، يستخدمها أيضاً وكلاء لا يستطيع المفتاح العمل عليهم، فلا يستطيع تغييرها.
feature_not_available403باقتك لا تشمل هذا: أدوات ربط نظامك متاحة في الباقات المدفوعة. قم بالترقية، أو استخدم نقاط النهاية التي تشملها باقتك.
not_note_author403لا يعدّل الملاحظة أو يحذفها إلا كاتبها؛ والمفتاح يعمل باسم الشخص الذي أنشأه.
system_note_read_only403الملاحظات التي يسجّلها مجيب، مثل تغييرات حالة العميل المحتمل، لا تُعدَّل ولا تُحذف.
agent_id_required403مفتاح مقيّد ببعض الوكلاء استدعى نقطة واتساب دون agent_id صالح.
agent_not_found404الوكيل ليس من وكلاء منظمتك.
not_found404المحادثة أو جهة الاتصال أو الملاحظة أو العميل المحتمل أو حقل العملاء المحتملين أو قاعدة المعرفة أو القناة أو أداة ربط نظامك أو التعليق لا تخص هذا الوكيل (والمحادثة المحذوفة غير موجودة كذلك)، أو رسالة المحادثة التي طلبتها ليست من رسائلها، أو القناة التي طلبت قوالبها ليست رقم واتساب. وفي سجل الاستخدام: لا يوجد اشتراك لمنظمتك.
message_not_found404GET /v1/whatsapp/messages/{id}: المعرّف غير موجود، أو ينتمي لمنظمة أخرى، أو أُرسلت الرسالة عبر وكيل خارج قائمة وكلاء المفتاح.
endpoint_not_found404لا تطابق أي نقطة /v1/ الطريقةَ والمسار، ومن ذلك معرّف ليس UUID. تحقّق من الأخطاء الإملائية.
lead_capture_not_found404لا يملك الوكيل أداة حفظ عميل، فلا توجد له تعليمات لحفظ العملاء تُقرأ أو تُغيَّر. تواصل مع دعم مجيب لإضافة الأداة.
invalid_request_body422حقل مفقود أو من النوع الخاطئ أو يتجاوز حداً أو يخالف الصيغة (مثل phone لعميل محتمل أو mobile لجهة اتصال ليس بصيغة E.164)، أو قيمة معامل استعلام غير صالحة (الاستجابة تحوي param تُسمّيه).
invalid_request422قاعدة عمل رفضت التغيير (مثل حالة عميل غير معروفة أو مفتاح محجوز لحقل عميل محتمل)، أو cursor ليس مما أعادته الواجهة، أو after في عرض الرسائل ليس رسالة من المحادثة أو أُرسل مع cursor (وكلاهما مع param: after). توضّح message السبب.
invalid_date_range422نافذة التحليلات خارج الحدود: to قبل from، أو تاريخ بعد اليوم بتوقيت UTC، أو نافذة أطول مما تسمح به نقطة النهاية. توضّح message السبب.
no_settings422تحديث إعدادات أو محادثة لم يرسل أي شيء لتغييره.
messaging_window_closed422رد في محادثة لم يكتب عميلها خلال آخر 24 ساعة: لن يوصله واتساب أو فيسبوك أو إنستجرام. لم يُرسَل شيء. وعلى واتساب أرسل قالباً.
channel_not_supported422رد في محادثة على قناة لا يستطيع مجيب الإرسال عليها بعد (TikTok). لم يُرسَل شيء.
comment_already_hidden422hideComment على تعليق مخفي أصلًا.
comment_not_hidden422unhideComment على تعليق غير مخفي.
platform_hide_failed422رفض فيسبوك أو إنستجرام إخفاء التعليق أو إظهاره، كأن يكون قد حُذف، أو تعذّر الوصول إليه. وقد يكون مؤقتًا.
field_not_writable422تحديث للوكيل أرسل قيمة لحقل لا يستطيع المفتاح تغييره: status (فلا يستطيع المفتاح حذف وكيل)، أو ai_model، أو model_provider، أو avatar_url، أو language (الاستجابة تحوي param تُسمّيه). لم يتغيّر شيء.
unknown_timezone422time_zone ليس معرّف منطقة زمنية من IANA بصيغة Region/City، مثل Africa/Cairo (والتوقيت العالمي المنسّق هو Etc/UTC).
invalid_follow_up_platform422قناة متابعة ليست whatsapp أو facebook أو instagram.
invalid_follow_up_steps422خطوات أكثر من المسموح، أو تأخير خارج النطاق المسموح، أو خطوتان بالتأخير نفسه.
assignee_not_allowed422عضو الفريق لا يستطيع فتح الوكيل (ليس من منظمتك، أو مقيّد بوكلاء آخرين)، فلا يمكن إسناد العميل أو المحادثة إليه. اختر شخصاً يظهر له can_open_agent: true في قائمة أعضاء الوكيل.
system_field422حقول العملاء المحتملين المدمجة (built_in: true)، ومنها حالات العملاء المحتملين، لا تُغيَّر ولا تُحذف عبر الواجهة.
lead_field_limit_reached422لدى الوكيل بالفعل أكبر عدد من حقول العملاء المحتملين المخصّصة تسمح الواجهة بإضافته. احذف أولاً حقلاً لم يعد يحتاجه.
connection_inactive409القناة مفصولة (active: false)، فلا يمكن تغيير إعداداتها ولا عرض قوالبها. أعد ربطها من لوحة التحكم أولاً.
connection_needs_reconnection409لم تعد ميتا تقبل صلاحية الوصول لرقم واتساب (أُلغيت أو انتهت، أو غادر الرقم حساب واتساب للأعمال الخاص به)، فلا يمكن قراءة قوالبه. أعد ربط الرقم من لوحة التحكم؛ إعادة المحاولة لن تفيد.
field_key_taken409لدى الوكيل بالفعل حقل عميل محتمل بهذا المفتاح، ومن ذلك الحقول المدمجة. لم يُنشأ شيء. والإنشاء المُعاد بعد ضياع الاستجابة ينتهي هنا أيضاً، فاعرض حقول العملاء المحتملين وتابع.
no_current_usage_period409لا تغطي أي فترة فوترة من اشتراكك الوقت الحالي، فيعامله مجيب على أنه غير مُجدَّد ولا يرد الذكاء الاصطناعي حتى تبدأ فترة. يزول حين يصل التجديد؛ وإن استمر، تواصل مع الدعم مع correlation_id. ويُعيده GET /v1/organization/usage أيضاً حين لا يكون لمنظمتك اشتراك أصلاً.
usage_periods_overlap409أكثر من فترة فوترة من اشتراكك تغطي الوقت الحالي، فلا يستطيع مجيب معرفة الحدود المطبّقة. تواصل مع الدعم مع correlation_id.
login_shared409تسجيل دخول ربط نظامك الذي أرسلته يختلف عن المحفوظ للموقع، أو يحمل سرّاً، وتستخدمه أدوات أخرى. أرسل change_shared_login: true لتغييره لها كلها، أو لا ترسل login.
tool_not_tested409لا تُشغَّل أداة ربط نظامك إلا بعد اختبار ناجح لطلبها الحالي. اختبرها ثم شغّلها.
request_body_too_large413جسم الطلب أكبر من 1 MB.
invalid_agent_id422agent_id ليس UUID صالحاً (نقاط واتساب).
invalid_phone_number422to ليس رقم E.164 صالحاً (نقاط واتساب). أما phone لعميل محتمل أو mobile لجهة اتصال بغير صيغة E.164 فيعيد invalid_request_body.
invalid_from_phone422from ليس رقم E.164 صالحاً.
from_phone_not_found_for_agent422from مكوَّن جيداً لكن لا يطابق أي اتصال واتساب نشط على الوكيل (الاستجابة تحوي available_phones).
template_header_media_url_invalid422template.header_media_url ليس رابط HTTPS كاملاً.
template_not_found422لا يوجد على الاتصال قالب بهذا الاسم، أياً كانت حالته (الاستجابة تحوي available_templates). وحين يتعذّر على مجيب قراءة القوالب من ميتا، أو يكون لدى الرقم قوالب أكثر مما يقرؤه مجيب ولا يكون هذا القالب بينها، يُتخطّى هذا الفحص ويُقبَل الإرسال.
template_not_found_for_language422لا توجد للقالب نسخة بهذه اللغة، أياً كانت حالتها (الاستجابة تحوي available_languages).
idempotency_key_in_progress409طلب بهذا المفتاح لا يزال قيد التنفيذ، أو طلب به رُفض أو فشل بعد أن حجز المفتاح (مثل messaging_window_closed في رد) وقد بدأ قبل أقل من 60 ثانية، أياً كان الجسم. أعد المحاولة بعد Retry-After، أو أرسل الطلب المصحَّح بمفتاح جديد.
idempotency_key_in_use_with_different_params422المفتاح يخص طلباً سابقاً مقبولاً يختلف عن هذا الطلب: بجسم آخر، أو على نقطة نهاية أو محادثة أخرى (فالنص نفسه ردّاً في محادثة أخرى يُعدّ طلباً مختلفاً). الاستجابة تحوي original_correlation_id.
idempotency_unknown_outcome500خلل داخلي في فحص الإعادة الآمنة (غير متوقَّع). أعد المحاولة بالمفتاح والجسم نفسيهما.
unknown_send_outcome500خلل داخلي في قراءة نتيجة الإرسال (غير متوقَّع). استعلم عن الرسالة قبل الإرسال مرة أخرى.
rate_limit_exceeded429تم بلوغ حد المعدّل لكل مفتاح: الحد الافتراضي، أو الحد الأقل الخاص بعرض قوالب واتساب أو بالردود في المحادثات. تراجع وأعد بعد Retry-After.
test_rate_limited429شغّلت شركتك اختبارات كثيرة لأدوات ربط نظامك في هذه الدقيقة (30، عبر مفاتيحها ولوحة التحكم). أعد المحاولة بعد Retry-After.
message_limit_exceeded402محجوز: حد رسائل الاشتراك. لا يُرسَل اليوم.
access_unavailable503تعذّر إجراء فحص الصلاحيات: صلاحيات المفتاح، أو صلاحيات عضو الفريق عند إسناد عميل محتمل أو محادثة. أعد المحاولة بتراجع متصاعد.
meta_unavailable503لم تُعِد ميتا ما طُلب منها، مثل قوالب رقم واتساب (انقطاع، أو انتهاء المهلة، أو حد المعدّل لدى ميتا نفسها). أعد المحاولة بتراجع متصاعد.
internal_server_error500، 401مشكلتنا: أعد بتراجع متصاعد، وإن استمرّت أرسل لنا correlation_id. ومع 401 يعني أننا لم نتمكّن من فحص المفتاح؛ أعد المحاولة ولا تُدوّره.

ما حالات HTTP التي قد تُعيدها الواجهة؟​

الحالةالمعنى
200نجاح مع جسم (قراءة أو تحديث أو إسناد)
201مورد أُنشئ (عميل محتمل، ملاحظة، قاعدة معرفة، حقل عميل محتمل، أداة ربط نظامك، رد في محادثة)
202مقبول للمعالجة غير المتزامنة (رسالة في طابور الإرسال)
204نجاح دون جسم (حذف)
401فشل التوثيق
402محجوز: تجاوز الحصة
403فشل الصلاحيات (نطاق، قائمة الوكلاء، معرفة أو تسجيل دخول مشترك، كاتب الملاحظة، ميزة لا تشملها باقتك)
404مورد غير موجود
409تعارض (مفتاح إعادة قيد التنفيذ، أو قناة مفصولة أو تحتاج إعادة ربط، أو مفتاح حقل عميل محتمل موجود بالفعل، أو عدم وجود فترة فوترة حالية واحدة، أو تسجيل دخول ربط نظامك مشترك، أو أداة لم تُختبر)
413جسم الطلب أكبر من 1 MB
415الجسم لم يُرسَل بصيغة application/json (جسم problem-details قياسي، لا الظرف)
422خطأ تحقق، ومنه جسم ليس JSON صالحاً
429تجاوز حد المعدّل
500خطأ داخلي
503فحص الصلاحيات أو ميتا غير متاح مؤقتاً

أي الأخطاء أعيد المحاولة معها؟​

أعد المحاولة مع المؤقّتة منها فقط. انتظر Retry-After مع 429 ومع 409 idempotency_key_in_progress. واستخدم التراجع المتصاعد مع أخطاء 503، ومع أخطاء 500 عدا unknown_send_outcome، ومع 422 platform_hide_failed (فقد يكون فيسبوك أو إنستجرام غير متاح فحسب)، ومع 401 رمزه internal_server_error. أما بقية الأخطاء فتحتاج تغييراً قبل أن ترسل الطلب مرة أخرى.

الخطأماذا تفعل
409 connection_inactive، 409 connection_needs_reconnectionأعد ربط القناة من لوحة التحكم، ثم حاول مرة أخرى.
409 field_key_takenالحقل موجود بالفعل: اعرض حقول العملاء المحتملين للوكيل وتابع.
409 no_current_usage_periodانتظر: يزول حين يصل التجديد. تواصل مع الدعم إن استمر. وإن لم يكن لديك اشتراك أصلاً فلن يزول حتى تشترك.
409 usage_periods_overlapتواصل مع الدعم مع correlation_id.
409 login_sharedلا ترسل login، أو أرسل change_shared_login: true إن كان يجب أن يتغيّر لكل أدوات الموقع.
409 tool_not_testedاختبر الأداة، ثم شغّلها في طلب مستقل.
500 unknown_send_outcomeاستعلم عن الرسالة قبل إرسالها مرة أخرى.
422 messaging_window_closedانتظر أن يكتب العميل، أو أرسل قالباً على واتساب.
422 platform_hide_failedأعد المحاولة لاحقاً مع التراجع المتصاعد. وإن استمر الفشل فالأرجح أن التعليق حُذف.
422 comment_already_hidden، 422 comment_not_hiddenلا شيء لتصحيحه: التعليق على الحال التي طلبتها. وبعد 500 يعني ذلك أن طلبك الأول نجح.
أي 4xx آخرصحّح الطلب؛ يوضّح code وmessage ما يجب تغييره.

كيف أستخدم correlation_id؟​

احفظه عند كل خطأ. عند تواصلك مع الدعم، الصق correlation_id من الاستجابة الفاشلة — يمكننا تتبّع دورة حياة الطلب الكاملة في سجلاتنا في ثوانٍ.

يمكنك أيضاً إرسال معرّف تتبّع خاص بك وسنحترمه إن كان صالحاً:

curl ... -H "X-Correlation-ID: my-app-trace-abc123"

حتى 128 حرفاً: حروف وأرقام و_ و-. المعرّف الذي يخالف هذه القواعد يُتجاهَل دون أي خطأ ونُولّد بدلاً منه معرّفاً جديداً، لذا خذ المعرّف من رأس الاستجابة ولا تفترض أن معرّفك قد حُفظ. نُعيد المعرّف في رأس الاستجابة X-Correlation-ID ونُضمِّنه في أي ظرف خطأ. إن لم ترسل واحداً، نُولّد req_<26-char ULID>.

أسئلة شائعة​

لماذا يُغطي invalid_api_key كل هذه الحالات الفرعية؟​

رمز واحد يُبسّط منطق العميل — يحتاج كودك فرعاً واحداً فقط لـ"فشل التوثيق". حقل message يُميّز للبشر أثناء التصحيح، لكن لا ينبغي أن تتفرّع على النص. عامل أي invalid_api_key كـ"صحّح المفتاح وأعد".

هل ستضيف رموز خطأ جديدة لاحقاً؟​

نعم. قد تظهر قيم code جديدة دون إشعار مع إضافة الميزات. اجعل عبارات switch/match افتراضياً آمنة — تراجع إلى "خطأ غير معروف، سجّل وأظهر للمستخدم".

ماذا عن أخطاء على مستوى الحقول مع حقول غير صالحة متعدّدة؟​

حالياً، تُعيد الواجهة أول خطأ تحقق تواجهه. قد نُضيف شكلاً أغنى متعدّد الأخطاء لاحقاً كتغيير إضافي (حقل اختياري جديد على الظرف، لا يستبدل الحقول القائمة). الآن، صحّح خطأ واحداً في كل مرة.

ما original_correlation_id؟​

يُعاد على idempotency_key_in_use_with_different_params. يُشير إلى معرّف التتبّع للطلب الذي حجز مفتاح الإعادة أصلاً، حتى تجد ذلك الطلب السابق في سجلات تطبيقك.

ما available_phones؟​

يُعاد على from_phone_not_found_for_agent. يُدرج كل رقم واتساب نشط على الوكيل بصيغة E.164، حتى تُصحّح قيمة from الخاصة بك دون استعلام آخر لاكتشاف ما هو صالح.