الأخطاء
شكلا الخطأ اللذان تعيدهما الواجهة العامّة، وجدول بكل رمز يمكنك التفرّع عليه — تعريف الموقع والمفاتيح والروبوتات والمعاينات والتحقّق وحدود المعدّل.
هناك شكلان للخطأ، وواحد منهما فقط يحمل code.
أخطاء المجال تحمل رمزًا
{
"success": false,
"statusCode": 409,
"code": "VIEWING_SLOT_TAKEN",
"message": "That time has just been booked — please pick another.",
"details": { "propertyId": "…", "date": "2026-09-20", "slot": "11:00" },
"path": "/api/public/viewing-requests",
"method": "POST",
"timestamp": "2026-09-14T09:30:27.019Z"
}code في المستوى الأعلى لا داخل حقل آخر. وdetails اختياري ويختلف مع كل
رمز. تفرّع على code، ولا تتفرّع أبدًا على message المكتوبة للبشر والمترجمة مع
الوقت.
أخطاء التحقّق لا تحمل رمزًا
الجسم أو الاستعلام الذي ترفضه الواجهة هو 400 فيه مصفوفة نصوص في message
وبلا code إطلاقًا:
{
"success": false,
"statusCode": 400,
"message": ["property type should not exist"],
"error": "Bad Request",
"path": "/api/public/properties",
"method": "GET"
}ودالّة واحدة في طبقة الاتصال تغطّي الحالتين:
function apiError(body: any) {
if (body?.code) return { code: body.code as string, message: body.message };
const message = Array.isArray(body?.message) ? body.message.join(', ') : body?.message;
return { code: 'VALIDATION_FAILED', message };
}وبغير هذا الفحص سيعرض نصف نماذجك [object Object].
تعريف الموقع
| الرمز | الحالة | متى |
|---|---|---|
SITE_NOT_FOUND | 404 | الموقع مسوّدة، أو المؤسّسة لا تدير موقعًا أصلًا. الإجابة واحدة للحالتين عمدًا. |
SITE_PAUSED | 503 | الموقع موقوف مؤقتًا من النظام. أعد المحاولة لاحقًا؛ لا خطأ عندك. |
SITE_ORIGIN_MISMATCH | 403 | X-Site تسمّي موقعًا لا يتبع النطاق (أو المؤسّسة) الذي جاء منه الطلب. |
PUBLIC_TENANT_REQUIRED | 400 | لم يعرّف شيء الموقع: لا نطاق مُضاف ولا X-Site ولا X-Subdomain. |
انظر تعريف موقعك.
مفاتيح الواجهة
| الرمز | الحالة | متى |
|---|---|---|
SITE_KEY_REQUIRED | 401 | وصلت كتابة بلا X-Api-Key، أو بمفتاح لا يعرفه النظام. |
SITE_KEY_REVOKED | 401 | المفتاح مُلغى أو مُدوَّر. |
SITE_KEY_ORIGIN_MISMATCH | 403 | مفتاح قابل للنشر استُعمل من مصدر ليس من نطاقات الموقع، أو مفتاح يتبع موقعًا آخر. |
وما دام الطرح في وضع المراقبة فهذه تُسجَّل ولا تُعاد. انظر المفاتيح وCORS.
فحص الروبوتات
| الرمز | الحالة | متى |
|---|---|---|
BOT_CHECK_REQUIRED | 400 | كتابة محميّة بمفتاح قابل للنشر وبلا X-Turnstile-Token. |
BOT_CHECK_FAILED | 403 | رفضت Cloudflare الرمز — منتهٍ أو مُعاد استعماله أو مزوّر. |
انظر الحماية من الروبوتات.
طلبات المعاينة
| الرمز | الحالة | ماذا تفعل الواجهة |
|---|---|---|
VIEWING_SLOT_INVALID | 400 | الوقت ليس من مواعيد الموقع المضبوطة. أعد جلب المواعيد. |
VIEWING_DAY_CLOSED | 400 | الموقع لا يستقبل معاينات في ذلك اليوم. أعد جلب المواعيد. |
VIEWING_SLOT_TOO_SOON | 400 | ضمن مهلة الإشعار الدنيا للموقع. اعرض وقتًا أبعد. |
VIEWING_SLOT_TAKEN | 409 | حجزه شخص آخر بين فتح الصفحة والإرسال. أعد جلب المواعيد وامسح الوقت المختار. |
الأربعة تعني للزائر الشيء نفسه — «هذا الوقت لم يعد متاحًا، اختر غيره» — فاجعلها
رسالة واحدة، وأبطِل ما خزّنته من
GET /public/properties/{id}/viewing-slots، وامسح الوقت المختار. تُعلّم نقطة
المواعيد الأوقات المحجوزة بـ available: false أصلًا؛ والـ 409 لا يغلق إلا السباق
بين زائرَين.
حسابات الزوّار
رموز VISITOR_TOKEN_REQUIRED وVISITOR_TOKEN_INVALID وVISITOR_EMAIL_TAKEN
وVISITOR_CREDENTIALS_INVALID وVISITOR_EMAIL_NOT_VERIFIED وOTP_INVALID
وOTP_EXPIRED وOTP_LOCKED وRESET_TOKEN_INVALID وأخواتها مشروحة مع طريقة
معالجتها في حسابات الزوّار.
«غير موجود» والسقوف
أخطاء 404 من الكتالوج موحّدة الشكل: PROPERTY_NOT_FOUND وPROJECT_NOT_FOUND
وLOCATION_NOT_FOUND وVIEWING_REQUEST_NOT_FOUND
وVISITOR_SAVED_SEARCH_NOT_FOUND وOWNER_SUBMISSION_NOT_FOUND، ولكل منها
details: { id }. أما FAVORITES_CAP (409) فهو المفضّل الحادي عشر من نوعه.
حدود المعدّل
الرفض هو HTTP 429 بلا code في الجسم — الحالة نفسها هي الإشارة. توقّف، وتراجع،
وأخبر الزائر أن يحاول بعد قليل؛ ولا تُعِد المحاولة في حلقة ضيّقة، ولا تُعِد محاولة
كتابة تلقائيًّا أبدًا.
أخطاء لن تلقاها إلا داخل النظام
هذه من واجهة الموظّفين لا من /api/public/*. وهي هنا لأنها ما تراه أثناء إعداد
الموقع.
| الرمز | الحالة | السطح |
|---|---|---|
DOMAIN_INVALID | 400 | إضافة نطاق ليس اسم مضيف (localhost، كلمة مجرّدة، رابط بمسار). |
DOMAIN_TAKEN | 409 | المضيف مرتبط بموقع بالفعل — ربّما لمؤسّسة أخرى. والرسالة لا تقول لمن. |
DOMAIN_NOT_FOUND | 404 | التصرّف في نطاق ليس على هذا الموقع. |
DOMAIN_NOT_VERIFIED | 400 | جعل نطاق أساسيًّا وقد تركه مسار TXT القديم معلّقًا. احذفه وأضفه من جديد. |
RICH_TEXT_TOO_LONG | 400 | حفظ نصّ «من نحن» أو نصّ قانوني فوق حدّه (٥٠٠٠ حرف صافٍ لـ«من نحن» و٥٠٠٠٠ للقانوني). يحمل details الحقول { field, locale, max, actual }. |
SITE_TYPE_NOT_ALLOWED | 400 | إنشاء موقع أو تغيير نوعه إلى نوع يحتاج وحدة غير مفعّلة للمؤسّسة. |
SITE_LIMIT | 400 | إنشاء موقع ثانٍ بلا خاصيّة تعدّد المواقع. |