Webhooks

سجّل نقاط نهاية HTTP لتلقي إشعارات الأحداث الفورية. افحص سجلات التسليم وراقب النشاط عبر اشتراكات webhook.

تتطلب جميع الطلبات ترويسة x-api-key. العنوان الأساسي لكل نقطة نهاية هو https://api.agentsend.io.

كائن Webhook

كل نقطة نهاية تُرجع webhook تُعيد هذا الشكل. يُضمَّن حقل secret فقط في استجابة POST /webhooks — خزّنه بأمان، إذ لا يمكن استرجاعه.

json
{
  "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"
}
الحقل النوع الوصف
idstring (uuid)المعرّف الفريد لـ webhook.
urlstring (uri)نقطة HTTPS التي يسلّم AgentSend الأحداث إليها.
descriptionstring | nullتسمية اختيارية مقروءة لـ webhook.
eventsstring[] | nullمصفوفة أنواع الأحداث المشترَك بها. null أو مصفوفة فارغة تعني تسليم كل الأحداث.
isActivebooleanما إذا كان webhook يستقبل الأحداث حالياً.
createdAtstring (ISO 8601)وقت إنشاء webhook.
updatedAtstring (ISO 8601)وقت آخر تحديث لـ webhook.

إنشاء Webhook

POST /webhooks

سجّل نقطة webhook جديدة. تُرجع 201 Created مع كائن Webhook وحقل secret. استخدم السر للـتحقق من تواقيع webhook — يُرجع مرة واحدة فقط ولا يمكن استرجاعه لاحقاً.

جسم الطلب

المعاملTypeDescription
url مطلوب string (uri) عنوان HTTPS الذي سينشر AgentSend الأحداث إليه. يجب أن يكون URI صالحاً يبدأ بـhttps://.
description string تسمية مقروءة لتحديد webhook في لوحة التحكم والسجلات.
events string[] قائمة أنواع الأحداث للاشتراك بها. اتركها أو مرّر مصفوفة فارغة لتلقي كل الأحداث. القيم الصالحة: domain.verified، message.received، message.sent، message.delivered، message.bounced، message.complained.

مثال على الطلب

javascript
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

json
{
  "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

GET /webhooks

تُرجع جميع webhooks المسجَّلة لحسابك. لا تُضمَّن الأسرار أبداً في استجابات القائمة أو الحصول.

Request Example

javascript
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

json
{
  "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"
    }
  ]
}

الحصول على كتالوج الأحداث

GET /webhooks/catalog

تُرجع القائمة الكاملة لأنواع الأحداث التي يمكن لـ webhooks الاشتراك بها، مع أسمائها وأوصافها. استخدمها لملء واجهات اختيار الأحداث أو للتحقق من أسماء الأحداث أثناء التشغيل.

Request Example

javascript
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

json
{
  "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."
    }
  ]
}

قائمة سجلات التسليم

GET /webhooks/logs

تُرجع قائمة بمحاولات تسليم webhook الفردية، مرتَّبة بالأحدث أولاً. استخدمها لتصحيح التسليمات الفاشلة وفحص الحمولات ومراجعة رموز الاستجابة من نقطة نهايتك.

معاملات الاستعلام

ParameterTypeDescription
webhookId string (uuid) رشّح السجلات على webhook محدد. إذا تُركت، تُرجع سجلات كل webhooks.
status enum رشّح حسب نتيجة التسليم. إحدى القيمتين success أو failed.
event string رشّح حسب نوع الحدث، مثل message.received.
limit integer الحد الأقصى لعدد سجلات الإرجاع. الافتراضي 20.
hours integer نافذة الرجوع بالساعات. الافتراضي 168 (7 أيام).

Request Example

javascript
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

json
{
  "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"
    }
  ]
}

الحصول على النشاط

GET /webhooks/activity

تُرجع نشاط تسليم مُجمَّعاً (عدد النجاح والفشل عبر الزمن) لـ webhook واحد أو للكل. مفيد لرسم مخططات في لوحة مراقبة.

Query Parameters

ParameterTypeDescription
webhookId string (uuid) حدد النشاط على webhook محدد. إذا تُرك، يُرجع النشاط عبر كل webhooks.
hours integer نافذة الرجوع بالساعات. الافتراضي 6.

Request Example

javascript
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

json
{
  "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

GET /webhooks/{id}

استرجع webhook واحداً حسب معرّفه. لا يُرجع السر أبداً بعد الإنشاء.

معاملات المسار

ParameterTypeDescription
id مطلوب string (uuid) معرّف webhook المطلوب استرجاعه.

Request Example

javascript
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).

json
{
  "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

PUT /webhooks/{id}

حدّث خاصية واحدة أو أكثر لـ webhook قائم. جميع حقول الجسم اختيارية — ستتغير فقط الحقول التي تقدمها. استخدم isActive: false لإيقاف التسليمات مؤقتاً دون حذف webhook.

Path Parameters

ParameterTypeDescription
id مطلوب string (uuid) معرّف webhook المطلوب تحديثه.

Request Body

ParameterTypeDescription
url string (uri) عنوان وجهة جديد. يجب أن يبدأ بـhttps://.
description string تسمية محدَّثة قابلة للقراءة.
events string[] يستبدل القائمة الكاملة لأنواع الأحداث المشترَك بها. مرّر مصفوفة فارغة للاشتراك بكل الأحداث.
isActive boolean اضبط على false لإيقاف التسليمات، أو true لاستئنافها.

Request Example

javascript
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 المحدَّث.

json
{
  "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

DELETE /webhooks/{id}

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

هذا الإجراء لا رجعة فيه. إذا أردت إيقاف التسليمات مؤقتاً، استخدم PUT /webhooks/{id} مع isActive: false بدلاً من ذلك.

Path Parameters

ParameterTypeDescription
id مطلوب string (uuid) معرّف webhook المطلوب حذفه.

Request Example

javascript
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.