أكواد الأخطاء وحالات HTTP

يعيد كل إخفاق كودًا ثابتًا يقرأه الحاسوب إلى جانب حالة HTTP. تفرّع على الكود، لا على نصّ الرسالة أبدًا: الرسائل مكتوبة للبشر وقد يُعاد صياغتها، أما الأكواد فجزء من العقد.

كل الأكواد الـ 42 التي يمكن أن تعيدها واجهة الموزّعين البرمجية، مصنَّفة حسب سبب الخطأ. كل مدخل يذكر حالة HTTP التي يصل بها والتغيير الذي يحلّه.

المصادقة (401)

الكودHTTPماذا يعنيكيف تحلّه
MISSING_API_KEY401مفتاح API مطلوبلم تُرسَل ترويسة Authorization، أو أن صيغتها غير صحيحة.أضف الترويسة: Authorization: Bearer <keyId>.<secret>action: FIX_INPUT · retryable: false · retry_after: null
INVALID_API_KEY401مفتاح API غير صالحمفتاح API المرسل لا يطابق أي مفتاح نشط في النظام.تأكد من صحة معرّف المفتاح والسر. وعند الحاجة، أعد توليد المفتاح من لوحة الوصول إلى API.action: FIX_INPUT · retryable: false · retry_after: null

الصلاحيات (403)

الكودHTTPماذا يعنيكيف تحلّه
ACCOUNT_DISABLED403الحساب معطّللم يعد هذا الخطأ يُرجَع. أي حساب لا يمكنه إنشاء طلبات يتلقى الرد ACCOUNT_FROZEN (HTTP 403).تعامل مع رمز الخطأ ACCOUNT_FROZEN بدلاً من هذا الرمز.لم تعد الواجهة تُرجعه، وحلّ محله ACCOUNT_FROZEN
ACCOUNT_FROZEN403الحساب مجمّدجُمّد حسابك مؤقتاً، وغالباً ما يكون السبب نشاطاً مريباً.تواصل مع الدعم لإلغاء تجميد حسابك.action: CONTACT_SUPPORT · retryable: false · retry_after: null
IP_NOT_ALLOWED403عنوان IP غير موجود في قائمة السماحصدر الاستدعاء من عنوان IP غير مدرج في قائمة السماح الخاصة بمفتاح API.أضف عنوان IP لخادمك إلى قائمة السماح من لوحة الوصول إلى API، أو ألغِ قيود IP.action: FIX_INPUT · retryable: false · retry_after: null

التحقق من الطلب (400)

الكودHTTPماذا يعنيكيف تحلّه
MISSING_REQUIRED_FIELD400حقل مطلوب مفقودأحد الحقول المطلوبة غير موجود في جسم الطلب. في متطلبات اللاعب، يحدد details.field اسم الحقل المفقود.راجع توثيق نقطة الوصول، وراجع GET /catalog/category/:categoryId/requirements لمعرفة حقول اللاعب، ثم أرسل كل الحقول المطلوبة.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_FORMAT400صيغة أحد المعاملات غير صالحةأحد حقول المتطلبات بصيغة خاطئة (مثل نص في حقل رقمي). يحدد details.field اسم الحقل.راجع متطلبات الفئة مجدداً، وأرسل الحقل بالصيغة التي يتوقعها data_type الخاص به وقواعد التحقق.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_VALUE400قيمة أحد المعاملات غير صالحةقيمة أحد حقول المتطلبات خارج النطاق المسموح (أقل من الحد الأدنى، أو أكبر من الحد الأقصى، أو ليست ضمن select_options الخاصة به). يحدد details.field اسم الحقل.أرسل قيمة تسمح بها متطلبات الفئة لهذا الحقل.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_LENGTH400طول أحد المعاملات غير صالحقيمة أحد الحقول المطلوبة أقصر أو أطول من الحد المسموح. يذكر details.field اسم هذا الحقل.راجع الحدين الأدنى والأقصى للطول (min_length و max_length) في متطلبات الفئة.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_UUID_FORMAT400صيغة UUID غير صالحةقيمة order_id ليست بصيغة UUID صالحة.استخدم أي إصدار صالح من معرّف UUID، مثل v1 أو v4 أو v7 أو غيرها من الإصدارات. ويجب أن يأتي المعرّف على الشكل التالي: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_QUANTITY400الكمية غير صالحةيجب أن تكون الكمية عدداً صحيحاً موجباً.أرسل الكمية عدداً صحيحاً >= 1.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_CATEGORY_ID400معرّف الفئة غير صالحقيمة categoryId المرسلة ليست رقماً صالحاً.استخدم مستكشف الكتالوج أو GET /catalog/categories للعثور على معرّفات فئات صالحة.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_BIG_CATEGORY_ID400معرّف الفئة الرئيسية غير صالحقيمة bigCategoryId المرسلة ليست رقماً صالحاً.ابحث عن معرّفات الفئات الرئيسية الصالحة عبر مستكشف الكتالوج أو GET /catalog/big-categories.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_ITEM_ID400معرّف العنصر غير صالحمعرّف العنصر المرسل غير صالح.تجد معرّفات العناصر الصالحة في مستكشف الكتالوج أو عبر GET /catalog/subcategories.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_SUBCATEGORY400الفئة الفرعية غير صالحةمعرّف الفئة الفرعية غير موجود.تحقّق من sub_category_id عبر نقاط نهاية الكتالوج.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PRODUCT_CONFIG400إعدادات المنتج غير صالحةلم يعد هذا الرمز يُرسَل. عند نقص حقل مطلوب يصلك الآن MISSING_REQUIRED_FIELD، وعند تعذّر بيع المنتج حالياً يصلك PRODUCT_UNAVAILABLE.استبدل معالجتك لهذه الاستجابة بالاستجابتين البديلتين MISSING_REQUIRED_FIELD و PRODUCT_UNAVAILABLE في تطبيقاتك.لم تعد الواجهة تُرجعه، وحلّ محله MISSING_REQUIRED_FIELD
INVALID_PAGINATION400معاملات ترقيم الصفحات غير صالحةقيمة page أو limit خارج النطاق المسموح.اجعل قيمة page لا تقل عن 1، وقيمة limit بين 1 و 100.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_DATE_FORMAT400صيغة التاريخ غير صالحةالقيمة المرسلة في أحد المعاملين created_after أو created_before لا تمثل تاريخاً صالحاً وفق معيار ISO 8601.اكتب التاريخ بصيغة ISO 8601: 2024-01-01T00:00:00Z.action: FIX_INPUT · retryable: false · retry_after: null

التحقق من اللاعب (400 / 429 / 503)

الكودHTTPماذا يعنيكيف تحلّه
PLAYER_NOT_FOUND400اللاعب غير موجودأكدت اللعبة أن معرّف اللاعب هذا غير موجود. لا يُرسَل هذا الرمز إلا بعد تأكيد صريح، أما إذا تعذّر التحقق من المعرّف فيصلك PLAYER_CHECK_UNAVAILABLE.تأكد من صحة معرّف اللاعب، وتحقق مما إذا كانت اللعبة تتطلب zone_id.action: FIX_INPUT · retryable: false · retry_after: null
PLAYER_CHECK_UNAVAILABLE503يتعذّر التحقق من معرّفات اللاعبين لهذه اللعبة حالياًلا يمكن فحص معرّفات اللاعبين في هذه اللعبة في الوقت الحالي. معرّف اللاعب لم يُرفض.كرّر الطلب نفسه بعد retry_after ثانية. لا تخبر عميلك بأن المعرّف خاطئ.action: RETRY_LATER · retryable: true · retry_after: 60
PLAYER_BUSY429يجري التحقق من معرّف اللاعب هذا بالفعلما زال طلب آخر لمعرّف اللاعب نفسه قيد التحقق.أرسل الطلب مرة أخرى بعد retry_after ثانية.action: RETRY_SOON · retryable: true · retry_after: 5
PLAYER_VALIDATION_FAILED400فشل التحقق من اللاعبلم يعد هذا الرمز يُرسَل. إذا تعذّر التحقق من معرّف اللاعب حالياً يصلك PLAYER_CHECK_UNAVAILABLE (HTTP 503).تعامل في تطبيقك مع الرمز PLAYER_CHECK_UNAVAILABLE بدلاً من هذا الرمز.لم تعد الواجهة تُرجعه، وحلّ محله PLAYER_CHECK_UNAVAILABLE
REGION_MISMATCH400لا يمكن لمنطقة هذا اللاعب استلام هذا المنتجينتمي اللاعب إلى منطقة لا يمكن توصيل هذا المنتج إليها. يتضمن الخطأ الحقلين player_region و player_name.اختر المنتج المخصص لمنطقة اللاعب.action: CHOOSE_OTHER · retryable: false · retry_after: null

قواعد العمل (400 / 409)

الكودHTTPماذا يعنيكيف تحلّه
INSUFFICIENT_BALANCE400رصيد المحفظة غير كافٍلا يكفي رصيد محفظتك لإتمام هذا الطلب.اشحن محفظتك من صفحة الشحن قبل تقديم الطلب.action: TOP_UP · retryable: false · retry_after: null
OUT_OF_STOCK400نفد مخزون المنتجالمنتج المطلوب غير متوفر في المخزون حالياً.حاول لاحقاً أو اختر منتجاً آخر.action: RETRY_LATER · retryable: true · retry_after: null
INSUFFICIENT_STOCK400الوحدات المتوفرة أقل من الكمية المطلوبةعدد الوحدات المتوفرة أقل مما طلبته. بخلاف OUT_OF_STOCK، يمكنك معالجة هذا الخطأ: يحدد error.max_quantity عدد الوحدات التي يمكن طلبها الآن. لم يُخصم أي مبلغ.أعد إرسال الطلب بكمية تساوي error.max_quantity أو أقل.action: FIX_INPUT · retryable: false · retry_after: null
PRODUCT_UNAVAILABLE409هذا المنتج غير متاح مؤقتاًالمنتج موجود لكن لا يمكن بيعه حالياً.أعد المحاولة لاحقاً، أو اختر منتجاً مختلفاً.action: RETRY_LATER · retryable: true · retry_after: null
PRICING_UPDATING409يجري تحديث سعر المنتجسعر هذا المنتج قيد التحديث الآن.أرسل الطلب نفسه مجدداً بعد retry_after ثانية، ثم راجع السعر من جديد.action: RETRY_SOON · retryable: true · retry_after: 30
OFFER_NOT_FOUND400هذا العرض غير متاح لحساب هذا اللاعبالعرض المتاح لمرة واحدة فقط (مثل مكافأة أول شحن) غير متوفر لحساب هذا اللاعب، وربما استُخدم من قبل.اختر منتجاً آخر لهذا اللاعب.action: CHOOSE_OTHER · retryable: false · retry_after: null
DUPLICATE_ORDER409معرّف الطلب مكرريوجد طلب سابق بهذا المعرّف UUID. هذه حماية تمنع تنفيذ الطلب نفسه مرتين.أنشئ UUID جديداً لكل طلب جديد. إذا ظهر هذا الخطأ عند إعادة المحاولة فالمحاولة الأولى قد سُجّلت: اطّلع على ذلك الطلب عبر GET /orders/{orderId} بدلاً من إنشاء طلب آخر.action: CHECK_ORDER · retryable: false · retry_after: null
PRICE_INCREASED400ارتفع السعر عن المتوقعسعر الوحدة الحالي أعلى من قيمة expected_unit_price التي أرسلتها.احصل على السعر الحالي للمنتج من المسار GET /catalog/subcategory/:id/price، ثم حدّث سعر الوحدة المتوقع في الحقل expected_unit_price داخل طلب الشراء ليساوي هذا السعر.action: FIX_INPUT · retryable: false · retry_after: null
SUBCATEGORY_DISABLED400الفئة الفرعية معطّلةلم يعد هذا الخطأ يُرسَل. المنتج الذي لا يمكن بيعه حالياً يُرجع PRODUCT_UNAVAILABLE (HTTP 409).تعامل مع رمز الخطأ PRODUCT_UNAVAILABLE بدلاً من هذا الرمز.لم تعد الواجهة تُرجعه، وحلّ محله PRODUCT_UNAVAILABLE

غير موجود (404)

الكودHTTPماذا يعنيكيف تحلّه
ORDER_NOT_FOUND404الطلب غير موجودلا يوجد طلب بالمعرّف المرسَل.تأكد من صحة معرّف الطلب.action: FIX_INPUT · retryable: false · retry_after: null
ITEM_NOT_FOUND404العنصر غير موجودلا يحتوي الكتالوج على العنصر المطلوب.استخدم نقاط نهاية الكتالوج للعثور على معرّفات عناصر صحيحة.action: FIX_INPUT · retryable: false · retry_after: null
NO_REQUIREMENTS_FOUND404لا توجد متطلبات لهذه الفئةلا تملك هذه الفئة حالياً متطلبات لاعب يمكن إرجاعها.حاول مرة أخرى لاحقاً أو اختر فئة أخرى.action: RETRY_LATER · retryable: true · retry_after: null
ITEM_NOT_AVAILABLE404العنصر غير متاحلم يعد هذا الخطأ يُرسَل. العنصر الموجود الذي لا يمكن بيعه حالياً يُرجع PRODUCT_UNAVAILABLE (HTTP 409).تعامل مع رمز الخطأ PRODUCT_UNAVAILABLE بدلاً من هذا الرمز.لم تعد الواجهة تُرجعه، وحلّ محله PRODUCT_UNAVAILABLE

التحقق من الطلبات المجمّعة (400)

الكودHTTPماذا يعنيكيف تحلّه
INVALID_ORDER_IDS_FORMAT400صيغة order_ids غير صحيحةيجب أن يكون الحقل order_ids مصفوفة من النصوص.أرسل order_ids بهذا الشكل: { "order_ids": ["uuid1", "uuid2"] }.action: FIX_INPUT · retryable: false · retry_after: null
EMPTY_ORDER_IDS400مصفوفة المعرّفات order_ids فارغةلا يمكن أن تكون مصفوفة order_ids فارغة.أضف معرّف طلب واحداً على الأقل إلى المصفوفة.action: FIX_INPUT · retryable: false · retry_after: null
TOO_MANY_ORDER_IDS400عدد معرّفات الطلبات كبير جداًيمكن الاستعلام عن 50 معرّف طلب كحد أقصى في المرة الواحدة.قسّم طلبك إلى دفعات لا تتجاوز كل منها 50 معرّفاً.action: FIX_INPUT · retryable: false · retry_after: null

حد معدل الطلبات (429)

الكودHTTPماذا يعنيكيف تحلّه
RATE_LIMIT_EXCEEDED429تم تجاوز حد الطلباتلقد تجاوزت عدد الاستدعاءات المسموح به لهذا المسار. مجموعات الحدود التي تُحتسب بالدقيقة، وهي مسارات الكتالوج والطلبات والحساب، ترسل الترويسات X-RateLimit-Limit وX-RateLimit-Remaining وX-RateLimit-Reset مع كل استجابة تصلك، ويكرر الحقل details القيم limit وremaining (وتكون قيمتها 0) وretry_after وwindow_seconds. أما المسار POST /player/validate فيُحتسب استهلاكه من حصتك اليومية من عمليات التحقق من اللاعبين، ولذلك لا يرسل هذه الترويسات، ويحمل رد الخطأ 429 الخاص به القيم limit وcurrent وremaining وreset_at وreset_in_seconds داخل الكائن error. وفي كلتا الحالتين يحدد الحقل error.retry_after والترويسة Retry-After عدد الثواني التي عليك انتظارها.انتظر عدد الثواني المذكور في retry_after أو في ترويسة Retry-After قبل إعادة المحاولة. وفي نقاط النهاية ذات الحصة بالدقيقة، راقب X-RateLimit-Remaining حتى لا تبلغ الحد أصلاً.action: RETRY_LATER · retryable: true · retry_after: ثانية حتى إعادة التعيين

أخطاء الخادم (5xx)

الكودHTTPماذا يعنيكيف تحلّه
INTERNAL_ERROR500خطأ داخلي في الخادمحدث خطأ غير متوقع في الخادم.أعد إرسال الطلب بعد مرور retry_after ثانية. ومع POST /orders/create استخدم قيمة order_id نفسها، فلا يمكن عندها أن يُنشأ الطلب مرتين. إذا استمر الخطأ فتواصل مع الدعم.action: RETRY_LATER · retryable: true · retry_after: 30
SERVICE_UNAVAILABLE503الخدمة غير متاحة مؤقتاًلم يعد هذا الخطأ يُرسَل. أي عطل من جهة الخادم يُرجع INTERNAL_ERROR (HTTP 500)؛ والرمز 503 الوحيد هو PLAYER_CHECK_UNAVAILABLE عندما يتعذر التحقق من معرّف اللاعب في الوقت الحالي.استبدل معالجتك لهذه الاستجابة بالاستجابتين البديلتين INTERNAL_ERROR و PLAYER_CHECK_UNAVAILABLE في تطبيقك.لم تعد الواجهة تُرجعه، وحلّ محله INTERNAL_ERROR

جديد على المنصة؟ ابدأ من نظرة عامة على واجهة شحن الألعاب للموزّعين، أو اقرأ نظرة عامة على برنامج موزّعي SHOP2TOPUP لمعرفة كيفية عمل حساب الشريك.

مرجع أكواد أخطاء API — كل كود وطريقة حلّه