Skip to content
اللغة: العربية

الـ API للمطوّرين

تنسيق أخطاء الـ API ورموز الأخطاء

آخر تحديث 1 نوفمبر 2026 القراءة: 5 د

كيف تُبنى استجابات الأخطاء في واجهة LinkHarbor API، وما معنى أهم رموز الأخطاء، وكيف ينبغي أن تتفاعل شيفرتك معها.

كل استجابة خطأ من الـ API لها التنسيق نفسه. ينبغي أن تعتمد شيفرتك على رمز الخطأ في الحقل error، لا على النص في message: فالرمز يبقى ثابتًا، أما النص فقد يتغير ويُترجم إلى لغة الحساب.

بنية استجابة الخطأ

مثال: 422 validation_failed
{
  "error": "validation_failed",
  "message": "Some of the information provided is invalid. Please check and try again.",
  "details": [
    { "field": "title", "reason": "minLength", "message": "…" }
  ],
  "request_id": "6b1f0c2e-…"
}
error
رمز مقروء آليًا، مثل not_found. وفي معظم الأخطاء يوجد أيضًا في الترويسة X-Error-Code، لكن اعتمد على الحقل في الجسم.
message
وصف مقروء للبشر بلغة الحساب: مع مفتاح API لغة مالك مساحة العمل، ومع تطبيق متصل لغة الشخص الذي ربطه. وبدون رمز وصول صالح – مثلًا مع الخطأ 401 من فحص الرمز – تتبع اللغة Accept-Language، وإلا فهي الإنجليزية. وتذكر الترويسة Content-Language اللغة المستخدمة.
details
موجود فقط عندما يكون هناك ما يُضاف. في 422 الناتج عن التحقق من المدخلات يكون قائمة فيها field وreason وmessage لكل مشكلة؛ وفي 422 الناتج عن منطق العمل وفي كل الأخطاء الأخرى يكون كائنًا، مثلًا مع reason أو retry_after_sec أو قائمة issues. وعند تجاوز حجم ما يحتوي على field وreason وlimit، وفي 413 request_too_large على max_bytes وmax_kb. لذا تحقّق مما إذا كان details قائمة.
request_id
معرّف الطلب. وهو موجود أيضًا في الترويسة X-Request-Id. أرفقه عند التواصل مع الدعم.

الاستثناءات: استجابة 429 rate_limited فيها الحقل retry_after_sec بدلًا من details؛ ومع 429 و403 insufficient_scope يغيب request_id عن الجسم. وليس للخطأ 401 من فحص الرمز ولا للخطأ 422 من فحص المخطط ترويسة X-Error-Code، ومع فحص المخطط لا يُترجم إلا message في المستوى الأعلى، أما الرمز validation_failed فيبقى ثابتًا، والنصوص داخل details تبقى بالإنجليزية. أما الترويسة X-Request-Id فموجودة دائمًا.

أهم الرموز

HTTPerrorالمعنىما العمل
400invalid_jsonالجسم ليس JSON صالحًاتحقّق من JSON
400bad_requestContent-Type خاطئ أو طلب مشوّهاضبط Content-Type: application/json
401missing_bearer_tokenلا يوجد رمز في الترويسة Authorizationاضبط الترويسة Authorization: Bearer …
401invalid_tokenالرمز منتهي الصلاحية أو غير صالح، أو المفتاح محذوفاحصل على رمز جديد؛ وإذا لم يفد ذلك، فتحقّق من المفتاح
401invalid_api_keyمعرّف مفتاح أو سر خاطئ عند استبدال الرمزتحقّق من بيانات الاعتماد
402plan_limit_reachedتم بلوغ حد الخطة، مثلًا للروابط المختصرةقم بالترقية أو احذف إدخالات
403insufficient_scopeالنطاق مفقود أو نقطة النهاية غير مفعّلة لمفاتيح APIأنشئ مفتاحًا بالنطاق الصحيح
403forbiddenلا صلاحية لهذا الإجراءنفّذه في لوحة التحكم
403feature_not_availableالميزة غير مشمولة في الخطةتحقّق من الخطة
403block_type_requires_planنوع الكتلة متاح فقط في خطة أعلىاختر نوع كتلة آخر أو قم بالترقية
403template_lockedقالب مميز غير متاح في الخطة الحاليةاختر قالبًا من GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredمساحة العمل مقفلة أو للقراءة فقط بسبب دفعة مستحقةسوِّ الدفع في لوحة التحكم
404not_foundالمورد غير موجود أو لا يتبع مساحة عملكتحقّق من المعرّف
409conflictتعارض عام مع الحالة الحاليةأعد تحميل الحالة وغيّر المدخلات
409workspace_template_in_useقالب مساحة العمل ما زال مستخدمًا في صفحات؛ والعدد في details.countانقل الصفحات إلى قالب آخر، ثم احذفه
409handle_taken, slug_takenالمعرّف أو الـ slug للرابط المختصر مستخدم بالفعلاختر قيمة أخرى
409form_in_use, page_not_private, page_not_published, never_publishedتعارض مع الحالة: النموذج ما زال على صفحة، أو الصفحة ليست خاصة أو غير منشورة، أو لم تُنشر قطغيّر الحالة، ثم حاول مجددًا
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedتم بلوغ حد الكمية أو التخزين في الخطةأزل إدخالات أو قم بالترقية
409draft_not_publishableفي المسودة مشكلات؛ والقائمة في details.issuesأصلح المشكلات، ثم انشر مجددًا
413request_too_largeالجسم أكبر من المسموح لنقطة النهاية هذه (64 KB أو 1 MB أو 2 MB)؛ والحد في details.max_kbأرسل بيانات أقل في كل طلب، انظر حدود المعدل
413payload_too_largeالملف المرفوع أكبر من 10 MBصغّر الملف
422validation_failedمدخلات غير صالحة أو حقل غير معروف؛ والتفاصيل في detailsصحّح الحقول كما هو موضّح في details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostالمعرّف محجوز، أو الرابط الهدف غير صالح أو غير مسموحاختر قيمة أخرى
422workspace_template_disabledقالب مساحة العمل المحدد معطّلفعّل القالب تحت «النطاقات والقوالب» أو اختر قالبًا آخر
422template_css_external, template_section_invalidقالب مساحة العمل: CSS يحمّل من خوادم خارجية، أو قسم {{#if}}/{{#unless}}/{{#each}} موضوع في مكان خاطئأزل العناوين الخارجية، أو أغلق القسم داخل الوسم نفسه أو النص نفسه
422custom_css_externalCSS المخصص يحمّل شيئًا من خوادم خارجيةأزل العناوين الخارجية من CSS
429rate_limited, api_key_lockedطلبات كثيرة جدًا، أو المفتاح مقفل بعد محاولات فاشلةانتظر المدة التي يذكرها Retry-After أو details.retry_after_sec
500internal_errorخطأ غير متوقعحاول مجددًا لاحقًا، ودوّن request_id
503service_unavailableالخدمة غير متاحة مؤقتًاحاول مجددًا بعد فاصل زمني

قراءة أخطاء المدخلات

مع 422 validation_failed تسرد details كل مشكلة على حدة: field هو مسار الحقل (بشرطات مائلة للكائنات المتداخلة، مثل theme_config/button_style)، وreason هي القاعدة التي خولفت، مثل required أو minLength أو maxLength أو enum أو additionalProperties. ومع additionalProperties تذكر الرسالة الحقول غير المعروفة، وغالبًا ما يكون السبب خطأً إملائيًا في اسم الحقل.

التعامل الموصى به في شيفرتك

  • 400 و413 و422: لا تعد المحاولة، بل أصلح الطلب
  • 401 invalid_token: احصل على رمز جديد مرة واحدة وأعد المحاولة
  • 403: لا تعد المحاولة؛ تحقّق من النطاق أو الخطة أو ممّن يُسمح له بذلك
  • 404: تحقّق من المعرّف؛ وبعد الحذف يكون هذا طبيعيًا
  • 409: أعد تحميل الحالة وقرّر ما إذا كان الإجراء ما زال مطلوبًا
  • 429: انتظر المدة التي يذكرها Retry-After، ثم أعد المحاولة، انظر حدود المعدل
  • 500 و503: أعد المحاولة بضع مرات بفواصل متزايدة

لم تجد ما تبحث عنه؟

أخبرنا بما تحتاج إليه، وسيساعدك فريق الدعم لدينا شخصيًا.

تواصل مع الدعم