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

الأخطاء

تستخدم حالات فشل Platform API رموز حالة HTTP القياسية. تقريبًا كل حالة فشل تحمل سلسلة subcode مستقرة يجب على العملاء التفريع بناءً عليها — فرمز الحالة وحده غامض (403 يغطي scope والمنتج وorigin وIP ونوع المفتاح).

الغلاف

تعيد معظم الأخطاء غلاف detail بأسلوب FastAPI:

{ "detail": "<subcode>" }

حمولات 429 المنظمة (map_load_quota_exceeded, b2b_overloaded, org_overloaded, tile_access_restricted) هي كائنات مسطحة في المستوى الأعلى — دون غلاف detail:

{ "error": "map_load_quota_exceeded", "meter": "map_loads", "limit": 50000, "used": 50000 }

تحافظ أخطاء 429 ذات string-detail (map-load hard stops) على الغلاف:

{ "detail": "map_load_hard_stop" }

تبلغ بعض endpoints غير المتدفقة عن حالات الفشل كـ HTTP 200 مع مفتاح error — وأبرزها POST /chat/control/route. أي عميل يعتمد على status فقط سيتعامل معها كنجاح. اقرأ body دائمًا.

الجدول

الحالةSubcodeالمعنىما الذي يجب فعله
401(no detail)مفتاح مفقود / غير صالح / ملغى / منتهيتحقق من قيمة المفتاح وأنه غير ملغى. Viewer لا يحتاج إلى مفتاح.
401publishable_requires_sessionتم إرسال مفتاح publishable (kld_pk_…) كـ bearer مباشراستخدمه عبر SDK الذي يبدله بجلسة.
403insufficient_scopeمفتاح صالح لكنه يفتقر إلى scope الخاص بالمسارأنشئ / أعد إنشاء مفتاح بالـ scope الصحيح (ai / maps / design).
403tier_capability_not_allowedالمفتاح المخزن كان يملك الإمكانية، لكن الخطة الحالية للمؤسسة لم تعد تسمح بها (عادةً تخفيض Pro→Free)قم بترقية الخطة، أو استخدم منتجًا تسمح به الخطة الحالية.
403origin_requiredتم استخدام مفتاح publishable دون Origin للمتصفح (مثل الاستخدام من الخادم)مفاتيح publishable للمتصفح فقط.
403session_origin_mismatchOrigin الخاص بالطلب غير موجود في allowlist الخاصة بالمفتاححدّث allowed origins على المفتاح (راجع الحصول على مفتاح API).
403product_not_allowedالمفتاح غير مسموح له باستخدام هذا المنتجأنشئ مفتاحًا يسمح بهذا المنتج (أو استخدم viewer، فهو لا يحتاج إلى مفتاح).
403server_key_in_browserتم استخدام server key (kld_sk_…) من المتصفحمفاتيح server للخادم فقط؛ كما أنها محظورة عبر CORS.
403ip_not_allowedتم استخدام server key من IP خارج allowlist الخاصة بهحدّث IP allowlist للمفتاح أو أرسل الطلب من عنوان مسموح.
403publishable_key_requiredتمت محاولة SDK session exchange باستخدام شيء غير مفتاح publishableاستخدم مفتاح kld_pk_… في خطوة session-exchange.
403sessions_disabledإصدار الجلسات معطل لهذا deploymentتواصل مع الدعم — هذه حالة تشغيلية وليست إعدادًا للعميل.
403sessions_not_configuredبنية الجلسات غير مهيأةتواصل مع الدعم.
422(various)body للطلب غير صحيح البنيةأصلح payload (راجع Endpoints). عند mint، تعني unknown_scope / unknown_product قيمة غير معروفة؛ ويعني publishable_live_requires_origins أنه تم إنشاء مفتاح publishable حي دون allowed origins.
429(flat) map_load_quota_exceededتم استهلاك الحصة الشهرية لتحميلات الخرائط لدى المؤسسةقم بالترقية أو قلل تحميلات basemap.
429map_load_hard_stopالمؤسسة المدفوعة تجاوزت حصة map-loads بمقدار 5×يتوقف التقديم هنا؛ أما النطاق المرن فوق الحصة فيستمر في العمل.
429(flat) tile_access_restrictedتم رفض طلب Tile (غالبًا بسبب فقدان origin من allowlist). يحمل Retry-After: 3600أضف origin الصفحة إلى allowlist الخاصة بالمفتاح؛ وأعد المحاولة بعد المدة الموجودة في header.
429(flat) b2b_overloadedيتم تطبيق global request-sheddingتراجع وأعد المحاولة مع jitter.
429(flat) org_overloadedrequest shedding على مستوى المؤسسةتراجع وأعد المحاولة.
429limiter_unavailablerate limiter غير متاح مؤقتًاتعامل معه كحالة مؤقتة؛ أعد المحاولة.
429rate_limitedعدد كبير جدًا من الطلبات حاليًااحترم Retry-After.
503(no detail)خدمة المفاتيح غير متاحة مؤقتًامؤقت — أعد المحاولة قريبًا.

إدارة المفاتيح

حالات الفشل من POST/PATCH/DELETE /shared-api/api-keys/* (باستخدام Cognito org-admin JWT، وليس platform key):

الحالةSubcodeالمعنى
403free_plan_publishable_onlyالمؤسسات على خطة Free يمكنها إنشاء مفاتيح publishable فقط.
403plan_requiredلا يوجد لدى المؤسسة صف API plan معروف.
403tier_capability_not_allowedحاول PATCH توسيع مفتاح إلى ما يتجاوز ما تسمح به الخطة الحالية للمؤسسة.
403vendor_scope_requires_acknowledgementيتطلب scope vendor علامة إقرار صريحة لكل مفتاح.
409key_limit_reachedوصلت المؤسسة إلى الحد الأقصى لعدد المفاتيح لكل مؤسسة في خطتها.

راجع الحصول على مفتاح API لمعرفة عملية mint الكاملة ومسار تحديث PATCH.

أخطاء البث

في SSE stream، يصل الفشل النهائي كحدث error بدلًا من HTTP status (لأن الاستجابة بدأت بالفعل بـ 200):

event: error
data: { "type":"error", "message":"…", "code":"…", "partial_text":"…" }

تعامل مع حدث error كنهاية لذلك stream. أما حدث quota أثناء البث فـ ليس خطأ — بل هو العداد الذي يخبرك بكمية الميزانية المتبقية. يجب على العملاء تجاهل أسماء الأحداث غير المعروفة — فقد تتم إضافة أحداث جديدة ضمن العقد المستقر دون تحديث الإصدار.

CORS "محظور" في المتصفح

إذا أبلغ المتصفح عن حظر CORS في طلب حقيقي، فإن Origin الخاص بالطلب غير موجود في allowlist الخاصة بالمفتاح — وليست مشكلة auth. راجع CORS & allowed origins.