MailLandDocs
خطافات الويب

نظرة عامة على Webhooks

احصل على إشعارات فورية حول أحداث البريد الإلكتروني عبر webhooks

تُرسل Webhooks إشعارات HTTP فورية إلى خادمك عند وقوع أحداث البريد الإلكتروني، التسليم، والارتداد، والشكاوى، وغير ذلك. بدلاً من الاستعلام المتكرر عن تغييرات الحالة، تُرسل MailLand الأحداث إلى endpoint الخاص بك فور وقوعها.

كيف تعمل Webhooks

تهيئة webhook

سجّل عنوان URL الخاص بـ endpoint وحدد الأحداث التي تريد تلقيها.

ترسل Mail.Land الأحداث

عند وقوع حدث (مثل تسليم بريد إلكتروني)، ترسل MailLand طلب HTTP POST موقَّعاً إلى endpoint الخاص بك مع بيانات الحدث.

يستجيب خادمك

أعد رمز حالة 2xx لتأكيد الاستلام. تؤدي الردود غير 2xx إلى إعادة المحاولة تلقائياً.

إنشاء Webhook

POST https://api.mail.land/v1/webhooks
Create a webhook
curl -X POST https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains"
  }'

حقول الطلب

الحقلالنوعمطلوبالوصف
namestringلااسم قابل للقراءة لهذا الـ webhook
webhookUrlstringنعمعنوان URL للـ endpoint بصيغة HTTPS لتلقي الأحداث
productsarrayلاتصفية المنتج: transactional، marketing، inbound، system
eventsarrayلاالأحداث المحددة للاشتراك (راجع الأحداث)
includeFutureEventsbooleanلاتلقي الأحداث الجديدة المضافة إلى المنتجات المشتركة (الافتراضي: true)
scopestringلاall_domains (الافتراضي) أو selected_domains
domainIdsarrayلامعرّفات النطاقات للتصفية (مطلوب إذا كان scope هو selected_domains)

الاستجابة

الحالة: 201 Created

Webhook created response
{
  "webhook": {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains",
    "domainIds": [],
    "isActive": true,
    "createdAt": "2026-02-17T10:00:00Z",
    "successCount": 0,
    "failureCount": 0,
    "consecutiveFailures": 0,
    "pauseThreshold": 10
  },
  "secret": "whsec_a1b2c3d4e5f6g7h8i9j0..."
}

يُعرض secret مرة واحدة فقط عند إنشاء الـ webhook. احفظه بأمان: ستحتاجه للتحقق من توقيعات webhook. إذا فقدته، يمكنك إعادة توليده، مما يُلغي صلاحية السر القديم.

يجب أن تستخدم عناوين URL الخاصة بالـ webhook بروتوكول HTTPS. تتحقق MailLand من العناوين في مواجهة هجمات SSRF: يتم رفض عناوين الشبكات الخاصة (127.0.0.1، 10.x، 192.168.x، إلخ). يتم التسليم عبر HTTPS على المنفذ 443 فقط؛ ويُرفض أي عنوان على منفذ آخر، أو يشير إلى خوادم MailLand أو أسماء مضيفيها، بالرمز 400 WEBHOOK_DESTINATION_NOT_ALLOWED. استخدام منفذ TLS مختلف يتطلب موافقة صريحة من دعم MailLand.

قائمة Webhooks

GET https://api.mail.land/v1/webhooks
List webhooks
curl -X GET https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
List response
[
  {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced"],
    "isActive": true,
    "lastTriggeredAt": "2026-02-17T12:30:00Z",
    "lastSuccessAt": "2026-02-17T12:30:00Z",
    "successCount": 1542,
    "failureCount": 3,
    "consecutiveFailures": 0,
    "createdAt": "2026-02-10T08:00:00Z"
  }
]

يُرجع ما يصل إلى 100 webhook مرتبة حسب تاريخ الإنشاء (الأحدث أولاً).

عرض تفاصيل Webhook

GET https://api.mail.land/v1/webhooks/{id}
Get webhook detail
curl -X GET https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

يُرجع التهيئة الكاملة للـ webhook بالإضافة إلى أحدث 50 سجل تسليم. راجع منطق إعادة المحاولة للاطلاع على تفاصيل سجلات التسليم.

تحديث Webhook

PUT https://api.mail.land/v1/webhooks/{id}
Update webhook
curl -X PUT https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "All Events",
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "isActive": true
  }'

جميع الحقول اختيارية: أدرج فقط الحقول التي تريد تغييرها.

اختبار Webhook

أرسل حدثاً تجريبياً للتحقق من أن endpoint الخاص بك يعمل:

POST https://api.mail.land/v1/webhooks/{id}/test
Test a webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Test result
{
  "success": true,
  "statusCode": 200,
  "statusText": "OK",
  "durationMs": 145,
  "responseBody": "{\"received\": true}",
  "headersSent": {
    "X-MLND-Signature": "t=1708171200,v1=abc123...",
    "X-MLND-Event-Id": "evt_test_abc123",
    "X-MLND-Event-Version": "1",
    "X-MLND-Event": "webhook.test",
    "X-MLND-Webhook-Id": "k3m9x2p7qw4rtz",
    "X-MLND-Attempt": "1"
  },
  "wouldReceiveRealEvents": true,
  "liveEvents": ["message.delivered", "message.bounced"],
  "dormantEvents": {},
  "subscriptionWarning": null
}

يستخدم إرسال الاختبار التوقيع نفسه ومسار التسليم نفسه المستخدمين مع الحدث الحقيقي، لذا يثبت نجاحه هنا صحة عنوانك وبروتوكول TLS والتحقق من توقيعك.

لكنه لا يثبت اشتراكك: يُرسل الاختبار عند الطلب ولا يُوجَّه بحسب الأحداث التي اخترتها. تجيب الحقول الأربعة الأخيرة عن ذلك على حدة:

الحقلالمعنى
wouldReceiveRealEventsهل يمكن لأي حدث حقيقي أن يصل إلى نقطة النهاية هذه أصلًا
liveEventsالأحداث المشترَك بها التي تجتاز المرشّح نفسه الذي يطبّقه الموزّع
dormantEventsالأحداث المشترَك بها التي لن تصل أبدًا، لكل منها سببه
subscriptionWarningتُملأ عندما تكون نقطة النهاية قابلة للوصول لكنها خاملة بصورة دائمة

الحالة المهمة هي "success": true مع "wouldReceiveRealEvents": false: نقطة النهاية تعمل لكنها غير مشترِكة في أي شيء يمكن تسليمه.

إذا فشل الاختبار، يُشير حقل errorType إلى السبب: ssrf_blocked (أشار العنوان، أو إعادة توجيه منه، إلى وجهة ترفض المنصة الإرسال إليها) أو network_error (انتهاء المهلة أو فشل TLS أو رفض الاتصال؛ ويحمل errorMessage التفاصيل).

إعادة توليد السر

إذا فقدت سر الـ webhook أو احتجت إلى تدويره:

POST https://api.mail.land/v1/webhooks/{id}/regenerate-secret
Regenerate webhook secret
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
New secret
{
  "secretKey": "whsec_x9y8z7w6v5u4..."
}

تُلغي إعادة توليد السر صلاحية السر القديم فوراً. حدّث كود التحقق في خادمك قبل تسليم الـ webhook التالي، وإلا ستُرفض الأحداث الصحيحة.

نطاق النطاق

افتراضياً، تتلقى webhooks الأحداث لجميع النطاقات في مساحة العمل الخاصة بك. لتقييد webhook بنطاقات محددة:

Domain-scoped webhook
{
  "webhookUrl": "https://your-app.com/webhooks/mailland",
  "scope": "selected_domains",
  "domainIds": ["d4n8q1zt5wm3xc", "b7r2mv9k0jy4pw"]
}

ستُشغّل webhook فقط الأحداث المتعلقة بتلك النطاقات.

الإيقاف المؤقت التلقائي عند حدوث أعطال

تُوقف MailLand Webhooks تلقائياً بعد 10 أعطال متتالية في التسليم (قابل للتهيئة عبر pauseThreshold). يمنع ذلك إهدار الموارد على endpoints المعطّلة.

عند إيقاف webhook مؤقتاً:

  • يُعيَّن الطابع الزمني pausedAt
  • يصف pausedReason سبب الإيقاف المؤقت
  • يُرسَل حدث account.webhook_paused إلى webhooks الأخرى النشطة لديك
  • يُنشأ إشعار داخل التطبيق

استئناف Webhook موقوف مؤقتاً

بعد إصلاح المشكلة، استأنف التسليم:

POST https://api.mail.land/v1/webhooks/{id}/resume
Resume a paused webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/resume \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

يمسح هذا الأمر حالة الإيقاف المؤقت، ويُعيد تعيين عداد الأعطال المتتالية، ويُعيد تفعيل الـ webhook (تصبح isActive قيمتها true من جديد)، بحيث تُسلَّم الأحداث المستقبلية إليه بشكل طبيعي.

حذف Webhook

DELETE https://api.mail.land/v1/webhooks/{id}
Delete a webhook
curl -X DELETE https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

يُرجع 204 No Content. إذا كان الـ webhook مستخدماً من قِبل مسارات البريد الوارد، فسيتم تحديث تلك المسارات أو تعطيلها تلقائياً.

ردود الأخطاء

الحالةالكودالوصف
400INVALID_REQUESTعنوان URL أو الأحداث أو تهيئة النطاق غير صالحة
403PLAN_LIMIT_REACHEDتم الوصول إلى الحد الأقصى من Webhooks لخطتك
404(بدون محتوى)معرّف الـ webhook غير موجود: تُعاد من عمليات الجلب والتحديث والحذف وإعادة توليد السر والاستئناف
404RESOURCE_NOT_FOUNDمعرّف الـ webhook غير موجود، تُعاد من /test فقط

الخطوات التالية

في هذه الصفحة