WzGate
Build your own website

الأخطاء

شكلا الخطأ اللذان تعيدهما الواجهة العامّة، وجدول بكل رمز يمكنك التفرّع عليه — تعريف الموقع والمفاتيح والروبوتات والمعاينات والتحقّق وحدود المعدّل.

هناك شكلان للخطأ، وواحد منهما فقط يحمل 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_FOUND404الموقع مسوّدة، أو المؤسّسة لا تدير موقعًا أصلًا. الإجابة واحدة للحالتين عمدًا.
SITE_PAUSED503الموقع موقوف مؤقتًا من النظام. أعد المحاولة لاحقًا؛ لا خطأ عندك.
SITE_ORIGIN_MISMATCH403X-Site تسمّي موقعًا لا يتبع النطاق (أو المؤسّسة) الذي جاء منه الطلب.
PUBLIC_TENANT_REQUIRED400لم يعرّف شيء الموقع: لا نطاق مُضاف ولا X-Site ولا X-Subdomain.

انظر تعريف موقعك.

مفاتيح الواجهة

الرمزالحالةمتى
SITE_KEY_REQUIRED401وصلت كتابة بلا X-Api-Key، أو بمفتاح لا يعرفه النظام.
SITE_KEY_REVOKED401المفتاح مُلغى أو مُدوَّر.
SITE_KEY_ORIGIN_MISMATCH403مفتاح قابل للنشر استُعمل من مصدر ليس من نطاقات الموقع، أو مفتاح يتبع موقعًا آخر.

وما دام الطرح في وضع المراقبة فهذه تُسجَّل ولا تُعاد. انظر المفاتيح وCORS.

فحص الروبوتات

الرمزالحالةمتى
BOT_CHECK_REQUIRED400كتابة محميّة بمفتاح قابل للنشر وبلا X-Turnstile-Token.
BOT_CHECK_FAILED403رفضت Cloudflare الرمز — منتهٍ أو مُعاد استعماله أو مزوّر.

انظر الحماية من الروبوتات.

طلبات المعاينة

الرمزالحالةماذا تفعل الواجهة
VIEWING_SLOT_INVALID400الوقت ليس من مواعيد الموقع المضبوطة. أعد جلب المواعيد.
VIEWING_DAY_CLOSED400الموقع لا يستقبل معاينات في ذلك اليوم. أعد جلب المواعيد.
VIEWING_SLOT_TOO_SOON400ضمن مهلة الإشعار الدنيا للموقع. اعرض وقتًا أبعد.
VIEWING_SLOT_TAKEN409حجزه شخص آخر بين فتح الصفحة والإرسال. أعد جلب المواعيد وامسح الوقت المختار.

الأربعة تعني للزائر الشيء نفسه — «هذا الوقت لم يعد متاحًا، اختر غيره» — فاجعلها رسالة واحدة، وأبطِل ما خزّنته من 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_INVALID400إضافة نطاق ليس اسم مضيف (localhost، كلمة مجرّدة، رابط بمسار).
DOMAIN_TAKEN409المضيف مرتبط بموقع بالفعل — ربّما لمؤسّسة أخرى. والرسالة لا تقول لمن.
DOMAIN_NOT_FOUND404التصرّف في نطاق ليس على هذا الموقع.
DOMAIN_NOT_VERIFIED400جعل نطاق أساسيًّا وقد تركه مسار TXT القديم معلّقًا. احذفه وأضفه من جديد.
RICH_TEXT_TOO_LONG400حفظ نصّ «من نحن» أو نصّ قانوني فوق حدّه (٥٠٠٠ حرف صافٍ لـ«من نحن» و٥٠٠٠٠ للقانوني). يحمل details الحقول { field, locale, max, actual }.
SITE_TYPE_NOT_ALLOWED400إنشاء موقع أو تغيير نوعه إلى نوع يحتاج وحدة غير مفعّلة للمؤسّسة.
SITE_LIMIT400إنشاء موقع ثانٍ بلا خاصيّة تعدّد المواقع.

On this page