تخطي إلى المحتوى
PollsLive

دليل المطوّر

حدود المعدّل والأخطاء

تعتمد واجهة PollsLive حدود معدّل لكل مفتاح، وتعيد كائنات أخطاء JSON متسقة برموز مقروءة آليًا.

حدود المعدّل

تُطبَّق الحدود لكل مفتاح API (أو لكل عميل OAuth) في الدقيقة. وتجاوز الحد يعيد 429 Too Many Requests.

مجموعة نقاط النهايةالحدالنافذة
جميع نقاط النهاية /api/v1/120 طلبًادقيقة واحدة
POST /api/v1/polls20 طلبًا (إضافةً إلى الـ120)دقيقة واحدة لكل مفتاح
POST /api/v1/media30 طلبًادقيقة واحدة
GET /api/v1/polls/{id}/export?format=pdf10 طلباتساعة واحدة لكل مساحة عمل
POST /api/oauth/token10 طلباتدقيقة واحدة لكل client_id

هل تحتاج حدودًا أعلى لتكاملك؟ تواصل مع فريقنا.

عدد الجلسات المباشرة المفتوحة في آنٍ واحد سقف منفصل، لا حد لمعدّل الطلبات: Free غرفة واحدة، Pro واحدة لكل ترخيص مقدّم عرض، وPremium اثنتان. وبلوغه يعيد 403 برمز session_limit. أنهِ غرفة من Studio (أو عبر POST /api/v1/sessions/{id}/control مع end) قبل فتح أخرى.

ترويسات حد المعدّل

تحمل استجابات JSON ترويسات بيانات وصفية عن حد المعدّل:

ترويسات الاستجابة
X-RateLimit-Limit: 120
X-RateLimit-Window: 60s

تجاوز الحد يعيد 429 برمز الخطأ rate_limited. انتظر قبل إعادة المحاولة. ولا توجد ترويسة Retry-After.

صيغة استجابة الخطأ

تعيد جميع أخطاء API جسم JSON يتضمّن كائن error متداخلًا يحوي code مقروءًا آليًا وmessage مقروءة للبشر:

خطأ قياسي
HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": {
    "code": "not_found",
    "message": "Poll not found."
  }
}

أخطاء التحقّق تعيد 422 مع حقل details داخل كائن الخطأ:

خطأ تحقّق
{
  "error": {
    "code": "validation_failed",
    "message": "Request validation failed.",
    "details": {
      "fieldErrors": { "title": ["String must contain at least 1 character(s)"] },
      "formErrors": []
    }
  }
}

أما أخطاء رمز OAuth فتتبع صيغة RFC 6749 §5.2:

خطأ OAuth
{
  "error": "invalid_client",
  "error_description": "Invalid client credentials."
}

رموز الأخطاء

حالة HTTPcodeالمعنى
400invalid_jsonجسم الطلب ليس JSON صالحًا
401missing_authorizationلم يُقدَّم رمز Bearer
401invalid_api_keyمفتاح API غير معروف أو غير صحيح
401revoked_api_keyجرى إبطال المفتاح
401expired_api_keyانتهت صلاحية المفتاح بعد التدوير
401invalid_oauth_tokenرمز OAuth غير صالح أو منتهي الصلاحية
402upgrade_requiredتتطلّب العملية خطة مدفوعة (Pro فما فوق)، أو ميزة لا تشملها الخطة (مثل تصدير PDF)
403insufficient_scopeلا تملك بيانات الاعتماد النطاق الذي تتطلّبه نقطة النهاية هذه
403session_limitلدى مساحة العمل بالفعل العدد المسموح لخطتها من الجلسات المباشرة المتزامنة (POST /sessions)
404not_foundالمورد غير موجود
409already_votedسبق أن صوّت voterId هذا في الاستطلاع (POST /votes)
409already_respondedسبق أن أجاب هذا المصوّت عن الشريحة (POST /responses)
422validation_failedلم يجتَز جسم الطلب التحقّق من المخطّط
429rate_limitedطلبات كثيرة جدًا. أعد المحاولة بعد إعادة ضبط النافذة
500internal_errorخطأ غير متوقّع في الخادم

إعادة المحاولة والتراجع

نوصي باستراتيجية تراجع أسّي مع تشويش عشوائي لتكاملات الإنتاج:

إعادة المحاولة مع التراجع (JavaScript)
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const res = await fetch(url, options);

    if (res.status === 429) {
      // PollsLive does not send Retry-After, so back off exponentially
      // (capped at one minute, the length of a rate-limit window).
      const backoff = Math.min(1000 * 2 ** attempt + Math.random() * 500, 60000);
      await new Promise((r) => setTimeout(r, backoff));
      continue;
    }
    if (res.status >= 500 && attempt < maxRetries) {
      const backoff = Math.min(1000 * 2 ** attempt + Math.random() * 500, 30000);
      await new Promise((r) => setTimeout(r, backoff));
      continue;
    }
    return res;
  }
  throw new Error("Max retries exceeded");
}

لا تُعِد المحاولة عند أخطاء 4xx (عدا 429)، فهي تشير إلى مشكلة في طلبك لن تُحلّ بالإعادة.

صيغة أخطاء OAuth

تعيد نقطة نهاية الرمز (POST /api/oauth/token) الأخطاء بصيغة RFC 6749:

errorالمعنى
invalid_requestمعاملات ناقصة أو مشوّهة
invalid_clientclient_id غير معروف أو client_secret خاطئ
access_deniedالعميل مُبطَل أو محدود المعدّل (429)، أو مساحة العمل على خطة Free (402)
unsupported_grant_typeالمدعوم هو client_credentials فقط

هل لا تزال لديك أسئلة؟

يسعد فريقنا بمساعدتك.

تواصل معنا

نستخدم ملفات تعريف ارتباط ضرورية لإبقائك مسجّل الدخول ولمنع التصويت المكرر. وبإذنك، نستخدم أيضًا Cloudflare Web Analytics لإحصاء مشاهدات الصفحات وWhop Pixel لمعرفة الزيارات التي تؤدي إلى عملية شراء. سياسة ملفات تعريف الارتباط