نظرة عامة على 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/webhookscurl -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"
}'حقول الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
name | string | لا | اسم قابل للقراءة لهذا الـ webhook |
webhookUrl | string | نعم | عنوان URL للـ endpoint بصيغة HTTPS لتلقي الأحداث |
products | array | لا | تصفية المنتج: transactional، marketing، inbound، system |
events | array | لا | الأحداث المحددة للاشتراك (راجع الأحداث) |
includeFutureEvents | boolean | لا | تلقي الأحداث الجديدة المضافة إلى المنتجات المشتركة (الافتراضي: true) |
scope | string | لا | all_domains (الافتراضي) أو selected_domains |
domainIds | array | لا | معرّفات النطاقات للتصفية (مطلوب إذا كان scope هو selected_domains) |
الاستجابة
الحالة: 201 Created
{
"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/webhookscurl -X GET https://api.mail.land/v1/webhooks \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."[
{
"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}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}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}/testcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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-secretcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"secretKey": "whsec_x9y8z7w6v5u4..."
}تُلغي إعادة توليد السر صلاحية السر القديم فوراً. حدّث كود التحقق في خادمك قبل تسليم الـ webhook التالي، وإلا ستُرفض الأحداث الصحيحة.
نطاق النطاق
افتراضياً، تتلقى webhooks الأحداث لجميع النطاقات في مساحة العمل الخاصة بك. لتقييد 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}/resumecurl -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}curl -X DELETE https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."يُرجع 204 No Content. إذا كان الـ webhook مستخدماً من قِبل مسارات البريد الوارد، فسيتم تحديث تلك المسارات أو تعطيلها تلقائياً.
ردود الأخطاء
| الحالة | الكود | الوصف |
|---|---|---|
400 | INVALID_REQUEST | عنوان URL أو الأحداث أو تهيئة النطاق غير صالحة |
403 | PLAN_LIMIT_REACHED | تم الوصول إلى الحد الأقصى من Webhooks لخطتك |
404 | (بدون محتوى) | معرّف الـ webhook غير موجود: تُعاد من عمليات الجلب والتحديث والحذف وإعادة توليد السر والاستئناف |
404 | RESOURCE_NOT_FOUND | معرّف الـ webhook غير موجود، تُعاد من /test فقط |
الخطوات التالية
- الأحداث: مرجع كامل لجميع أنواع الأحداث والبيانات
- التحقق من التوقيع: التحقق من أصالة الـ webhook
- منطق إعادة المحاولة: فهم سلوك إعادة المحاولة ومعالجة الأعطال