Webhooks
سجّل نقاط نهاية HTTP لتلقي إشعارات الأحداث الفورية. افحص سجلات التسليم وراقب النشاط عبر اشتراكات webhook.
تتطلب جميع الطلبات ترويسة x-api-key. العنوان الأساسي لكل نقطة نهاية هو https://api.agentsend.io.
كائن Webhook
كل نقطة نهاية تُرجع webhook تُعيد هذا الشكل. يُضمَّن حقل secret فقط في استجابة POST /webhooks — خزّنه بأمان، إذ لا يمكن استرجاعه.
{
"id": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"url": "https://your-app.com/webhooks/agentsend",
"description": "Production inbound handler",
"events": ["message.received", "message.bounced"],
"isActive": true,
"createdAt": "2026-04-16T10:00:00.000Z",
"updatedAt": "2026-04-16T10:00:00.000Z"
}| الحقل | النوع | الوصف |
|---|---|---|
id | string (uuid) | المعرّف الفريد لـ webhook. |
url | string (uri) | نقطة HTTPS التي يسلّم AgentSend الأحداث إليها. |
description | string | null | تسمية اختيارية مقروءة لـ webhook. |
events | string[] | null | مصفوفة أنواع الأحداث المشترَك بها. null أو مصفوفة فارغة تعني تسليم كل الأحداث. |
isActive | boolean | ما إذا كان webhook يستقبل الأحداث حالياً. |
createdAt | string (ISO 8601) | وقت إنشاء webhook. |
updatedAt | string (ISO 8601) | وقت آخر تحديث لـ webhook. |
إنشاء Webhook
سجّل نقطة webhook جديدة. تُرجع 201 Created مع كائن Webhook وحقل secret. استخدم السر للـتحقق من تواقيع webhook — يُرجع مرة واحدة فقط ولا يمكن استرجاعه لاحقاً.
جسم الطلب
| المعامل | Type | Description |
|---|---|---|
url مطلوب |
string (uri) | عنوان HTTPS الذي سينشر AgentSend الأحداث إليه. يجب أن يكون URI صالحاً يبدأ بـhttps://. |
description |
string | تسمية مقروءة لتحديد webhook في لوحة التحكم والسجلات. |
events |
string[] | قائمة أنواع الأحداث للاشتراك بها. اتركها أو مرّر مصفوفة فارغة لتلقي كل الأحداث. القيم الصالحة: domain.verified، message.received، message.sent، message.delivered، message.bounced، message.complained. |
مثال على الطلب
const res = await fetch("https://api.agentsend.io/webhooks", { method: "POST", headers: { "x-api-key": process.env.AGENTSEND_API_KEY, "Content-Type": "application/json", }, body: JSON.stringify({ url: "https://your-app.com/webhooks/agentsend", description: "Production inbound handler", events: ["message.received", "message.bounced"], }), }); const webhook = await res.json(); console.log(webhook.secret); // Save this — it won't be shown again
الاستجابة — 201 Created
{
"id": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"url": "https://your-app.com/webhooks/agentsend",
"description": "Production inbound handler",
"events": ["message.received", "message.bounced"],
"isActive": true,
"secret": "whsec_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
"createdAt": "2026-04-16T10:00:00.000Z",
"updatedAt": "2026-04-16T10:00:00.000Z"
}يُرجع secret عند الإنشاء فقط. خزّنه فوراً في متغير بيئة آمن — لا يمكنك استرجاعه مجدداً عبر API.
قائمة Webhooks
تُرجع جميع webhooks المسجَّلة لحسابك. لا تُضمَّن الأسرار أبداً في استجابات القائمة أو الحصول.
Request Example
const res = await fetch("https://api.agentsend.io/webhooks", { headers: { "x-api-key": process.env.AGENTSEND_API_KEY }, }); const { data } = await res.json(); console.log(`${data.length} webhooks registered`);
الاستجابة — 200 OK
{
"data": [
{
"id": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"url": "https://your-app.com/webhooks/agentsend",
"description": "Production inbound handler",
"events": ["message.received", "message.bounced"],
"isActive": true,
"createdAt": "2026-04-16T10:00:00.000Z",
"updatedAt": "2026-04-16T10:00:00.000Z"
}
]
}الحصول على كتالوج الأحداث
تُرجع القائمة الكاملة لأنواع الأحداث التي يمكن لـ webhooks الاشتراك بها، مع أسمائها وأوصافها. استخدمها لملء واجهات اختيار الأحداث أو للتحقق من أسماء الأحداث أثناء التشغيل.
Request Example
const res = await fetch("https://api.agentsend.io/webhooks/catalog", { headers: { "x-api-key": process.env.AGENTSEND_API_KEY }, }); const { data } = await res.json(); data.forEach(e => console.log(e.name, e.description));
Response — 200 OK
{
"data": [
{
"name": "domain.verified",
"description": "Fired when a custom domain passes DNS verification."
},
{
"name": "message.received",
"description": "Fired when an inbound email arrives in an inbox."
},
{
"name": "message.sent",
"description": "Fired when an outbound message is accepted by the recipient mail server."
},
{
"name": "message.delivered",
"description": "Fired when delivery to the recipient mailbox is confirmed."
},
{
"name": "message.bounced",
"description": "Fired when a message hard-bounces."
},
{
"name": "message.complained",
"description": "Fired when a recipient marks the message as spam."
}
]
}قائمة سجلات التسليم
تُرجع قائمة بمحاولات تسليم webhook الفردية، مرتَّبة بالأحدث أولاً. استخدمها لتصحيح التسليمات الفاشلة وفحص الحمولات ومراجعة رموز الاستجابة من نقطة نهايتك.
معاملات الاستعلام
| Parameter | Type | Description |
|---|---|---|
webhookId |
string (uuid) | رشّح السجلات على webhook محدد. إذا تُركت، تُرجع سجلات كل webhooks. |
status |
enum | رشّح حسب نتيجة التسليم. إحدى القيمتين success أو failed. |
event |
string | رشّح حسب نوع الحدث، مثل message.received. |
limit |
integer | الحد الأقصى لعدد سجلات الإرجاع. الافتراضي 20. |
hours |
integer | نافذة الرجوع بالساعات. الافتراضي 168 (7 أيام). |
Request Example
const params = new URLSearchParams({ webhookId: "wh_01hx9k2v3w4x5y6z7a8b9c0d", status: "failed", limit: "50", hours: "24", }); const res = await fetch( `https://api.agentsend.io/webhooks/logs?${params}`, { headers: { "x-api-key": process.env.AGENTSEND_API_KEY } } ); const { data } = await res.json(); data.forEach(log => console.log(log.event, log.responseStatus));
Response — 200 OK
{
"data": [
{
"id": "whl_01hx9k2v3w4x5y6z7a8b9c0d",
"webhookId": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"event": "message.received",
"status": "failed",
"responseStatus": 503,
"durationMs": 4821,
"attempts": 3,
"createdAt": "2026-04-16T11:05:00.000Z"
}
]
}الحصول على النشاط
تُرجع نشاط تسليم مُجمَّعاً (عدد النجاح والفشل عبر الزمن) لـ webhook واحد أو للكل. مفيد لرسم مخططات في لوحة مراقبة.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
webhookId |
string (uuid) | حدد النشاط على webhook محدد. إذا تُرك، يُرجع النشاط عبر كل webhooks. |
hours |
integer | نافذة الرجوع بالساعات. الافتراضي 6. |
Request Example
const res = await fetch( "https://api.agentsend.io/webhooks/activity?webhookId=wh_01hx9k2v3w4x5y6z7a8b9c0d&hours=24", { headers: { "x-api-key": process.env.AGENTSEND_API_KEY } } ); const activity = await res.json(); console.log(activity.successCount, activity.failureCount);
Response — 200 OK
{
"webhookId": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"hours": 24,
"successCount": 142,
"failureCount": 3,
"buckets": [
{ "timestamp": "2026-04-15T11:00:00.000Z", "success": 18, "failure": 0 },
{ "timestamp": "2026-04-15T12:00:00.000Z", "success": 24, "failure": 1 }
]
}الحصول على Webhook
استرجع webhook واحداً حسب معرّفه. لا يُرجع السر أبداً بعد الإنشاء.
معاملات المسار
| Parameter | Type | Description |
|---|---|---|
id مطلوب |
string (uuid) | معرّف webhook المطلوب استرجاعه. |
Request Example
const res = await fetch( `https://api.agentsend.io/webhooks/${webhookId}`, { headers: { "x-api-key": process.env.AGENTSEND_API_KEY } } ); const webhook = await res.json(); console.log(webhook.isActive, webhook.events);
Response — 200 OK
تُرجع كائن Webhook واحداً (دون secret).
{
"id": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"url": "https://your-app.com/webhooks/agentsend",
"description": "Production inbound handler",
"events": ["message.received", "message.bounced"],
"isActive": true,
"createdAt": "2026-04-16T10:00:00.000Z",
"updatedAt": "2026-04-16T10:00:00.000Z"
}تحديث Webhook
حدّث خاصية واحدة أو أكثر لـ webhook قائم. جميع حقول الجسم اختيارية — ستتغير فقط الحقول التي تقدمها. استخدم isActive: false لإيقاف التسليمات مؤقتاً دون حذف webhook.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id مطلوب |
string (uuid) | معرّف webhook المطلوب تحديثه. |
Request Body
| Parameter | Type | Description |
|---|---|---|
url |
string (uri) | عنوان وجهة جديد. يجب أن يبدأ بـhttps://. |
description |
string | تسمية محدَّثة قابلة للقراءة. |
events |
string[] | يستبدل القائمة الكاملة لأنواع الأحداث المشترَك بها. مرّر مصفوفة فارغة للاشتراك بكل الأحداث. |
isActive |
boolean | اضبط على false لإيقاف التسليمات، أو true لاستئنافها. |
Request Example
const res = await fetch( `https://api.agentsend.io/webhooks/${webhookId}`, { method: "PUT", headers: { "x-api-key": process.env.AGENTSEND_API_KEY, "Content-Type": "application/json", }, body: JSON.stringify({ events: ["message.received", "message.delivered", "message.bounced"], isActive: true, }), } ); const updated = await res.json(); console.log(updated.events); // updated event list
Response — 200 OK
تُرجع كائن Webhook المحدَّث.
{
"id": "wh_01hx9k2v3w4x5y6z7a8b9c0d",
"url": "https://your-app.com/webhooks/agentsend",
"description": "Production inbound handler",
"events": ["message.received", "message.delivered", "message.bounced"],
"isActive": true,
"createdAt": "2026-04-16T10:00:00.000Z",
"updatedAt": "2026-04-16T12:34:00.000Z"
}حذف Webhook
احذف webhook نهائياً. ستتوقف جميع تسليمات الأحداث المستقبلية إلى تلك النقطة فوراً. تُحفَظ سجلات التسليم المرتبطة بـ webhook لأغراض التدقيق.
هذا الإجراء لا رجعة فيه. إذا أردت إيقاف التسليمات مؤقتاً، استخدم PUT /webhooks/{id} مع isActive: false بدلاً من ذلك.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id مطلوب |
string (uuid) | معرّف webhook المطلوب حذفه. |
Request Example
await fetch( `https://api.agentsend.io/webhooks/${webhookId}`, { method: "DELETE", headers: { "x-api-key": process.env.AGENTSEND_API_KEY }, } ); // 204 No Content
الاستجابة — 204 No Content
تُرجع جسماً فارغاً عند النجاح.
أنواع الأحداث
يمكن تمرير أنواع الأحداث التالية إلى events عند إنشاء أو تحديث webhook. اترك حقل events بالكامل (أو مرّر مصفوفة فارغة) لتلقي كل الأحداث.
| الحدث | Description |
|---|---|
domain.verified | اجتاز نطاق مخصص التحقق من DNS وأصبح جاهزاً للاستخدام. |
message.received | وصلت رسالة واردة إلى أحد صناديقك. |
message.sent | قبل خادم بريد المستلم رسالة صادرة. |
message.delivered | تم تأكيد التسليم إلى صندوق المستلم (حيث يدعم ذلك). |
message.bounced | تم تلقي ارتداد حاد — العنوان غير موجود أو رفض التسليم. |
message.complained | وسم مستلم الرسالة كبريد مزعج. |
للاطلاع على أشكال الحمولة الكاملة لكل نوع حدث، راجع الدليل المفاهيمي لـ Webhooks.