النطاقات والأخطاء
امنح أقل قدر من الصلاحيات، وتعامل مع كل رمز خطأ ثابت في واجهة API العامة.
امنح أقل قدر من الصلاحيات، وتعامل مع كل رمز خطأ ثابت في واجهة API العامة.
تتطلب كل عملية في واجهة API العامة نطاقًا صريحًا واحدًا. وإذا كانت بيانات الاعتماد صالحة لكنها لا تملك هذا النطاق، فستتلقى الخطأ 403 insufficient_scope؛ ولا تتم ترقيتها أبدًا بصمت إلى صلاحيات أوسع.
مرجع النطاقات#
| النطاق | ما يتيحه |
|---|---|
account:read | قراءة الحساب المصادَق عليه والخطة والاستحقاقات وملخص المحفظة |
tickets:read | قراءة تذاكر الدعم ورسائلها |
tickets:write | تحديث التذاكر وتعيين أعضاء الفريق وإضافة ملاحظات داخلية أو ردود للعملاء |
team:read | قراءة أعضاء الفريق والدعوات المعلّقة وأحداث التدقيق المسموح بها |
team:write | إنشاء الدعوات أو إلغاؤها وإدارة أدوار أعضاء الفريق من غير المالكين |
integrations:read | فحص عمليات تثبيت GitHub App والمستودعات المصرّح بها |
integrations:write | إعداد تغييرات التكامل وإنشاء طلبات سحب مسودة |
sites:read | عرض المواقع واسترجاعها |
sites:write | إنشاء المواقع وتحديثها ونشرها وإلغاء نشرها وحذفها |
agents:read | قراءة إعدادات الـ agent |
agents:write | تحديث سلوك الـ agent ولغته وصوته وإعدادات التضمين |
knowledge:read | عرض مصادر المعرفة والأسئلة الشائعة |
knowledge:write | إنشاء مصادر المعرفة والأسئلة الشائعة وتحديثها وحذفها |
conversations:read | عرض المحادثات واسترجاع رسائلها |
conversations:write | تولّي محادثة: الرد على الزائر باسم النشاط التجاري، وإيقاف الـ agent مؤقتًا فيها، وإعادتها إليه |
leads:read | عرض الـ leads الذين تم جمعهم |
leads:write | إنشاء الـ leads وتحديثهم وتأهيلهم وقبولهم في مسار الفرص |
pipeline:read | قراءة المراحل والحسابات والفرص والأنشطة والإسناد وحالة مزامنة CRM |
pipeline:write | ضبط المراحل؛ وإنشاء الفرص والحسابات أو تحديثها؛ واستيراد نتائج CRM أو إعادة محاولتها |
analytics:read | قراءة أحداث تحليلات الموقع |
connectors:read | عرض حالة الـ connectors دون إرجاع الأسرار |
connectors:write | إنشاء الـ connectors وتحديثها وتفعيلها وتعطيلها وإزالتها |
domains:read | أُزيل. يُحتفظ به لأغراض التوافق فقط؛ إذ تعيد كل مسارات /domains الخطأ 409 لأن النطاقات المخصصة غير متاحة |
domains:write | أُزيل. يُحتفظ به لأغراض التوافق فقط؛ إذ تعيد كل مسارات /domains الخطأ 409 |
broadcasts:read | عرض الرسائل الجماعية وحالة التسليم |
broadcasts:write | إنشاء المسودات ووضع إرسال رسالة جماعية في قائمة الانتظار |
notifications:read | عرض إشعارات المالك |
notifications:write | تعليم الإشعارات كمقروءة أو غير مقروءة |
monetization:read | عرض منتجات تحقيق الدخل |
monetization:write | إنشاء المنتجات وتحديثها وتفعيلها وإلغاء تفعيلها وحذفها |
usage:read | قراءة أحداث الاستخدام المقاس |
webhooks:read | عرض نقاط نهاية webhook وحالة التسليم |
webhooks:write | إنشاء نقاط نهاية webhook وحذفها |
استخدم نطاقات القراءة لمهام إعداد التقارير. وأضف نطاق الكتابة فقط عندما ينفّذ التكامل هذا التعديل فعلًا. فعلى سبيل المثال، يحتاج تصدير الـ leads عادةً إلى sites:read وleads:read، لا إلى sites:write أو agents:write.
أخطاء النطاقات#
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}أضف النطاق الناقص إلى المفتاح من الإعدادات ← المطوّر ← تعديل، أو أنشئ مفتاحًا بديلًا وحدّث السر المخزَّن على الخادم. يغيّر التعديل اسم المفتاح ونطاقاته في مكانه؛ أما تاريخ انتهاء صلاحيته والرمز المميّز فيبقيان كما هما. لا يمكن تعديل المفاتيح الصادرة عبر OAuth؛ أعد ربط التطبيق لتغيير ما مُنح من صلاحيات.
غلاف الخطأ#
تستخدم جميع أخطاء API البنية العليا نفسها:
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};اعتمد في المعالجة على error.code لا على message الإنجليزية، فقد تتحسن الرسائل دون تغيير الإصدار. سجّل error.request_id وترويسة الاستجابة x-request-id مع اسم العملية والحالة ورقم محاولة إعادة الطلب، لكن لا تسجّل أبدًا ترويسة التفويض أو أسرار الطلب.
مرجع الحالات والرموز#
| HTTP | الرمز الثابت | المعنى | الاستجابة المعتادة |
|---|---|---|---|
400 | invalid_request | فشل التحقق من الصحة أو أن أحد الحقول غير مدعوم | صحّح الحقول الواردة في details؛ ولا تعِد المحاولة بالمدخلات نفسها |
400 | invalid_json | الجسم ليس كائن JSON أو يحتوي على JSON غير صالح | أرسل كائن JSON صالحًا واحدًا |
401 | authentication_required | ترويسة Bearer مفقودة | أرفق بيانات اعتماد من جهة الخادم |
401 | invalid_api_key | المفتاح غير صالح أو منتهي الصلاحية أو ملغى، أو لم يعد مالكه موجودًا | استبدل المفتاح أو دوّره |
403 | subscription_required | لا يملك المالك خطة مدفوعة نشطة | استعد الاشتراك قبل إعادة المحاولة |
403 | insufficient_scope | تفتقر بيانات الاعتماد إلى نطاق العملية | أنشئ بيانات اعتماد بديلة بأقل قدر من الصلاحيات |
403 | account_paused | وصول API متوقف مؤقتًا للحساب | استأنف وصول API أو تواصل مع مالك الحساب |
404 | not_found | لم يُعثر على نقطة النهاية أو المورد المملوك | تحقق من المسار ومن المعرّف التابع للمستأجر |
409 | conflict | حالة المورد الحالية تمنع تنفيذ الإجراء | اقرأ الحالة الحالية قبل إعادة المحاولة |
413 | payload_too_large | جسم JSON يتجاوز حد الطلب البالغ 256 KB | أرسل جسمًا أصغر؛ وقسّم المحتوى الكبير على عدة طلبات |
415 | invalid_request | جسم التعديل ليس application/json | أرسل Content-Type: application/json |
429 | rate_limit_exceeded | استُنفدت حصة الدقيقة الواحدة في خطة المفتاح | انتظر حسب Retry-After وأضف تأخيرًا عشوائيًا (jitter) |
500 | internal_error | تعذّر إكمال الطلب | أعد محاولة العملية الآمنة أو القابلة للتكرار دون أثر جانبي، وأبلغ عن معرّف الطلب |
503 | outcome_unknown | ربما اكتمل التعديل، لكن تعذّر تسجيل نتيجته؛ وقيمة details.retryable هي false | لا تعِد المحاولة. اقرأ المورد لمعرفة ما إذا كان التغيير قد حدث؛ ويستمر مفتاح idempotency نفسه في إرجاع هذه النتيجة |
قد تعيد الموارد الواقعة خارج حساب مالك بيانات الاعتماد الخطأ 404 بدلًا من الكشف عمّا إذا كان معرّف يخص مستأجرًا آخر موجودًا.
تفاصيل التحقق من الصحة#
يعيد التحقق من الحقول مسارات يمكن عرضها بجانب عناصر النموذج لديك:
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}يجب أن تكون أجسام التعديل كائنات JSON. وتُرفض المصفوفات والأجسام الفارغة وبيانات النماذج وJSON المرسل بنوع محتوى نصي.
قرارات إعادة المحاولة#
- أعد محاولة
429بعد عدد الثواني المحدد فيRetry-After. - أعد محاولة
500فقط في عمليات القراءة الآمنة أو عمليات الكتابة المحمية بالمفتاحIdempotency-Keyنفسه. - أعد محاولة
409الخاص بـ idempotency قيد التنفيذ بعد المدة الواردة في الترويسةRetry-After: 2. - لا تعِد محاولة
503 outcome_unknownبشكل أعمى. تحقق من المورد أولًا؛ ولا تستخدم مفتاح idempotency جديدًا إلا بعد التأكد من أن التغيير لم يحدث. - لا تعِد محاولة
400أو401أو403أو404أو413أو تعارض الحالة إلا بعد تغيّر السبب.
راجع حدود المعدل لمعرفة سلوك التراجع، ومرجع API لمعرفة النطاق المطلوب لكل عملية.