تخطَّ إلى المحتوى
شركاء زد
برامج المطوريننظرة عامة على كل مسارات البناء على زدشركاء التطبيقاتانشر تطبيقك في سوق التطبيقاتشركاء الثيماتأطلق ثيمك في سوق الثيمات
سوق التطبيقاتالتطبيقات المتاحة لتجار زدسوق الثيماتثيمات جاهزة للتثبيت
الدعم
مركز مساعدة الشركاءأدلة الاستخدام وحل المشاكلالتوثيق التقنيالواجهات والـSDK وأدلة التكاملاحجز اجتماعًااجتماع تجاري أو دعم تقني
ما الجديد؟
المدونةأدلة وتحديثات للمطورينسجل التحديثاتآخر تحديثات منصة الشركاءاقترح ميزةبوابة الملاحظات والأفكار
تمكين الشريك
إعلانات الشركاءباقات ظهور في قنوات زدالثيمات المخصصةثيمات تبنيها لتاجر بعينهمجتمع الشركاءتواصل مع مطوّرين يبنون على زد
مكتبة زد
تقارير زدكل ما تحتاج معرفته عن السوقأدلة المطورينمراجع رسمية تبني عليها
ENتسجيل الدخولانضم كشريك الآن
برامج الشركاء
برامج المطورينشركاء التطبيقاتشركاء الثيمات
تصفّح السوق
سوق التطبيقاتسوق الثيمات
الدعم والتمكين
مركز مساعدة الشركاءالتوثيق التقنياحجز اجتماعًاالمدونةسجل التحديثاتاقترح ميزةإعلانات الشركاءالثيمات المخصصةمجتمع الشركاءتقارير زدأدلة المطورين
اللغة
English
تسجيل الدخولانضم كشريك الآن
الرئيسية/المدونة/الواجهات والتكامل
الواجهات والتكامل

حدود الطلبات والأخطاء في Zid API: وزّع طلباتك وتعامل مع 429 واقرأ ردود الأخطاء

كيف يعمل حد 60 طلبًا في الدقيقة، وكيف تتراجع عند 429، وما شكل ردود الأخطاء، وكيف تبقيك الصفحات والتخزين المؤقت والـ Webhooks تحت الحد.

21 أكتوبر 20266 دقائق

الحد: 60 طلبًا في الدقيقة لكل تطبيق في كل متجر

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

تستخدم زد خوارزمية Leaky Bucket: تدخل الطلبات إلى طابور كأنها تُصبّ في دلو، ويتسرّب الدلو بمعدل ثابت، وعندما يمتلئ تُرفض الطلبات الإضافية. وبحسب سياسة الإبطاء (Throttling)، تُحتجز الطلبات الزائدة ويُعاد تنفيذها بتأخير وعدد محاولات قابلين للضبط، ثم تُرفض نهائيًا إذا لم تنجح.

  • يوضح سجل التحديثات أن ردود HTTP 429 تُحتسب ضمن حصتك. فإعادة المحاولة فورًا في حلقة متواصلة تُبقي الدلو ممتلئًا.
  • إذا رأيت أن حالتك تحتاج استثناءً، تطلب زد أن ترسل التفاصيل بالبريد لتقييمها.
عمليًا، 60 طلبًا في الدقيقة تعني في المتوسط طلبًا واحدًا في الثانية. ومع خوارزمية الدلو، يعمل التوزيع المنتظم أفضل من الدفعات المفاجئة.

قراءة ردود زد

يتبع Zid API مبادئ REST ورموز HTTP القياسية. الردود الناجحة تستخدم 200 أو 201 أو 202 (قُبل الطلب ولم تكتمل معالجته) أو 204 (نجح دون محتوى). أما الأخطاء فتأتي بهذا الشكل:

{
  "status": 422,
  "success": false,
  "error": {
    "code": "validation_failed",
    "message": "Invalid input data.",
    "fields": {
      "email": ["Email format is invalid."]
    }
  }
}
  • 400 bad_request: راجع صيغة الطلب والحقول المطلوبة.
  • 401 unauthorized: التوثيق مفقود أو فشل. راجع الـ Tokens.
  • 403 forbidden: فُهم الطلب لكنه رُفض. راجع الصلاحيات.
  • 404 not_found و405 method_not_allowed و406 not_acceptable (عدّل Header Accept) و410 gone (المورد أُزيل نهائيًا، فنظّف أي إشارة إليه).
  • 422 validation_failed: يخبرك Object fields بالمدخلات التي فشلت وسبب فشلها.
  • 429 too_many_requests: خفّف الطلبات وأعد المحاولة لاحقًا.
  • 500 server_error: أعد المحاولة لاحقًا، وتواصل مع الدعم إذا استمرت المشكلة. و503 service_unavailable: انتظر ثم أعد المحاولة.

ليست كل الأخطاء بالشكل نفسه

اقرأ الأخطاء بحذر. فبعض النقاط وأمثلة مركز المساعدة تُرجع شكلًا مختلفًا، فيه status: "error" و Object message يحتوي type وcode وname وdescription:

{
  "status": "error",
  "message": {
    "type": "error",
    "code": "ERROR_ZID_INVENTORY_ADDRESSES_NOT_FOUND",
    "name": "Sorry",
    "description": "Inventory address not found"
  }
}

ويعرض التوثيق أيضًا أخطاء تحقق باللغة العربية، تظهر فيها حتى قيمة code نفسها بالعربية (خطأ في التحقق). لذا ابنِ منطقك أولًا على رمز HTTP، واعتبر code معلومة مساعدة لا ثابتًا مضمونًا، ولا تعتمد على نص الرسالة. دالة صغيرة توحّد الشكلين:

function readZidError(status, body) {
  if (body && body.error) {
    return { status, code: body.error.code,
             message: body.error.message, fields: body.error.fields || {} };
  }
  if (body && body.message && typeof body.message === 'object') {
    return { status, code: body.message.code,
             message: body.message.description, fields: {} };
  }
  return { status, code: null, message: null, fields: {} };
}
تنصح صفحة Responses بمراجعة Headers الرد عند تتبّع المشكلات لأنها تحمل سياقًا إضافيًا في الغالب، وبتسجيل كل الطلبات والردود أثناء التطوير.

التعامل مع 429 و5xx بالتراجع التدريجي

يوصي التوثيق بالتراجع الأُسّي (exponential backoff) عند 429 Too Many Requests. ولا تنشر زد قيم تأخير محددة، فالأرقام أدناه نقطة بداية وليست قاعدة من زد:

async function callZid(doRequest, maxAttempts = 5) {
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
    const res = await doRequest();
    const retryable = [429, 500, 503].includes(res.status);
    if (!retryable) return res;
    const cap = Math.min(60000, 1000 * 2 ** attempt); // 1s, 2s, 4s ... max 60s
    const wait = cap / 2 + Math.random() * (cap / 2);  // add jitter
    await new Promise(r => setTimeout(r, wait));
  }
  throw new Error('Zid API still failing after retries');
}
  • أعد المحاولة فقط لما يمكن تكراره بأمان. إعادة GET لا ضرر فيها، أما إعادة طلب إنشاء فقد تنتج نسخًا مكررة ما لم تتحقق أولًا.
  • لا تُعِد إرسال 400 أو 401 أو 403 أو 404 أو 422 دون تغيير، فلن تنجح حتى تصلح الطلب أو الـ Token أو الصلاحية.
  • اعتبر 401 إشارة لفحص الـ Token لا لإعادة المحاولة. وتجد التجديد في دليل OAuth.

ونصيحة مركز المساعدة لرسالة «Too Many Attempts, Please slow down for few seconds !» تسير في الاتجاه نفسه: قسّم الطلبات أو جدولها.

استخدم الصفحات واطلب بيانات أقل

نقاط القوائم مقسّمة إلى صفحات، وأسماء الـ Parameters تختلف من نقطة لأخرى، فراجع كل واحدة. أمثلة:

  • List Orders (GET /v1/managers/store/orders): المعاملان page وper_page مطلوبان، وأقصى عدد في الصفحة 100 سجل. ويتحكم payload_type في حجم الرد: simple (الافتراضي) دون المنتجات، وtiny بالـ IDs الأساسية فقط، وdefault يتضمن المنتجات وهو الأبطأ.
  • List Customers (GET /v1/managers/store/customers): المعاملان page وper_page اختياريان.
  • نقاط المدونة (مثل /v2/blogs/categories/): المعاملان page وpage_size.

إذا انتهت مهلة طلب كبير برمز 504، ينصح مركز المساعدة باستخدام الصفحات مع حجم أصغر، مثل 50 في الصفحة. وللمزامنة الدورية، تقبل List Orders الـ Parameters date_from وdate_to وdate_attribute (created_at أو updated_at)، فتجلب ما تغيّر منذ آخر تشغيل بدل السجل كاملًا:

GET /v1/managers/store/orders?page=1&per_page=50&payload_type=simple&date_attribute=updated_at&date_from=2026-09-01T00:00:00.000%2B0000

توقّف عن الاستعلام المتكرر: الـ Webhooks والتخزين المؤقت

تطلب زد صراحة ألا تستعلم مرارًا عن تحديثات الحالة. لمتابعة حالة الطلب والدفع استخدم الـ Webhooks: الحدثان order.status.update وorder.payment_status.update يدفعان التغيير إليك، فلا تستهلك أي طلب في الانتظار. ويمكنك تضييق الإرسال أكثر بالشروط (conditions) على order.create وorder.status.update، كما يشرح دليل الـ Webhooks.

  • من الممارسات الجيدة تخزين البيانات التي نادرًا ما تتغير مؤقتًا، مثل تفاصيل المتجر وإعداداته، وتحديثها على جدول أو عند وصول webhook متعلق بها.
  • شغّل طابورًا لكل متجر حتى لا تستهلك عملية استيراد كبيرة لتاجر ما حصة العمل الفوري لمتجره، وقدّم الطلبات التفاعلية على المهام الخلفية.
  • سجّل كل طلب ورد أثناء التطوير، كما توصي صفحة Responses، لترى أين تذهب حصتك.
  • اختبر تكاملك في المتجر التجريبي قبل الإطلاق.

الخلاصة

  • خطّط لـ 60 طلبًا في الدقيقة لكل تطبيق في كل متجر بتوزيع منتظم، وتذكّر أن ردود 429 تُحتسب من الحصة.
  • تراجع تدريجيًا عند 429 و500 و503، ولا تُعِد أخطاء التحقق أو التوثيق دون إصلاح.
  • اقرأ شكلَي الخطأ، وابنِ منطقك على رمز الحالة أولًا لا على نص الرسالة، فحتى code قد يصل بالعربية.
  • استخدم الصفحات (100 كحد أقصى في List Orders)، واطلب ردودًا أخف، وزامن حسب updated_at.
  • استبدل الاستعلام المتكرر بالـ Webhooks، وخزّن مؤقتًا ما نادرًا ما يتغير.

المصادر

  1. Rate Limiting
  2. [Improvement - Apps] Updates to Apps Rate Limiting
  3. Responses
  4. Too Many Attempts, Please slow down for few seconds !
  5. Inventory address not found in calling List Store Locations endpoint
  6. Store Scripts
  7. Timeout response in Get Product / Customer endpoint
  8. List Orders
  9. List Customers
  10. List (Blog Categories)
  11. Webhooks Overview

ابدأ البناء على زد

سجّل بنفسك في بوابة الشركاء، وطوّر واختبر على متجر تجريبي.

أنشئ حسابك ←

جدول المحتويات

  1. الحد: 60 طلبًا في الدقيقة لكل تطبيق في كل متجر
  2. قراءة ردود زد
  3. ليست كل الأخطاء بالشكل نفسه
  4. التعامل مع 429 و5xx بالتراجع التدريجي
  5. استخدم الصفحات واطلب بيانات أقل
  6. توقّف عن الاستعلام المتكرر: الـ Webhooks والتخزين المؤقت

شارك المقال

ابدأ البناء

مقالات ذات صلة

←
الواجهات والتكامل

تأمين تطبيقك على زد: توثيق الـ Webhooks وحماية الـ Tokens وأقل الصلاحيات وTLS

تحقّق من كل webhook عبر Basic Auth، واحفظ الـ Tokens والأسرار على الـ Server، واطلب الصلاحيات التي تستخدمها فقط، واجتز فحوص TLS في زد قبل المراجعة.

6 دقائق
الواجهات والتكامل

التطبيقات المدمجة في زد: ابنِ تجربتك داخل لوحة تحكم التاجر

كيف يعمل تطبيقك داخل لوحة تحكم التاجر، وخطوات الـ Authentication الست، والأدوات التي تساعدك: Zid MUI وZid SDKs وأحداث واجهة المتجر.

6 دقائق
الواجهات والتكامل

الـ Webhooks في زد: الاشتراك، ومتابعة الصحة، واستعادة الروابط المعطّلة

اشترك في أحداث المتجر، وحافظ على سلامة روابطك، وأعِد أي webhook معطّل إلى العمل باستخدام أدوات تتبّع الصحة والاستعادة في زد.

4 دقائق
شركاء زد

برامج الشركاء

برامج المطورينشركاء التطبيقاتشركاء الثيماتأنشئ حسابك

الموارد

المدونةإعلانات الشركاءتقارير زدالتوثيق التقنيمركز مساعدة الشركاءسجل التحديثاتاقترح ميزة

تصفّح السوق

سوق التطبيقاتسوق الثيمات

الشروط والسياسات

شروط شركاء التطبيقاتشروط شركاء الثيماتسياسة الثيمات التجاريةسياسة الخصوصية

تواصل معنا

احجز اجتماعًا تجاريًااحجز اجتماع دعم تقنيمجتمع مصممي الثيمات
زد — القدرة التقنية للتقنية والاتصالاتEnglish
Al-Qudrah Al-Taqniyah for Technology and Communication Companyرقم السجل التجاري 1010365366رقم ضريبة القيمة المضافة 300827827900003