Webhooks

احصل على إشعارات فورية عند وقوع أحداث في حسابك بـ AgentSend — رسائل جديدة مستلمة، تأكيد تسليم، اكتشاف ارتدادات، والمزيد.

نظرة عامة

بدلاً من استعلام API للبحث عن رسائل جديدة، تتيح Webhooks لـ AgentSend دفع بيانات الحدث إلى خادمك لحظة وقوعه. سجّل نقطة نهاية HTTPS وسيرسل AgentSend طلب POST بحمولة JSON عند إطلاق أي حدث مشترَك فيه.

Webhooks هي الطريقة الموصى بها لبناء وكلاء تفاعليين. عندما يصل رد إلى صندوق وكيلك، يستقبل تطبيقك حمولة الرسالة الكاملة خلال ثوانٍ ويمكنه التصرف فوراً.

يجب أن تكون نقاط نهاية Webhook قابلة للوصول عبر HTTPS. عناوين localhost غير مقبولة. استخدم أداة مثل ngrok أو خدمة نفق عند التطوير محلياً.

إنشاء Webhook

سجّل webhook جديداً بإرسال طلب POST إلى /webhooks. يجب أن تقدّم حقل url؛ وكل الحقول الأخرى اختيارية.

POST /webhooks
المعامل النوع الوصف
url مطلوب string عنوان HTTPS الذي سينشر AgentSend الأحداث إليه.
description string تسمية مقروءة لتحديد webhook في لوحة التحكم.
events string[] قائمة أنواع الأحداث للاشتراك بها. اتركها لتلقي جميع الأحداث.
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://myapp.example.com/hooks/agentsend",
    description: "Production inbox events",
    events: ["message.received", "message.bounced"],
  }),
});

const webhook = await res.json();
console.log(webhook.id);     // wh_01j9...
console.log(webhook.secret); // whsec_... store this securely!

يُرجَع secret مرة واحدة فقط في استجابة الإنشاء. خزّنه فوراً في متغير بيئة آمن — لا يمكن استرجاعه، لكن يمكنك تدويره عبر PUT /webhooks/{id}.

أنواع الأحداث

اشترك في أحداث محددة بتمرير معرّفاتها في المصفوفة events. إذا أغفلت المصفوفة، يسلّم AgentSend جميع أنواع الأحداث إلى نقطة نهايتك.

الحدث Description
domain.verified اجتاز نطاق مخصص التحقق من DNS وأصبح جاهزاً للاستخدام.
message.received وصلت رسالة واردة إلى أحد صناديق بريد وكيلك.
message.sent تم قبول رسالة صادرة ووُضعت في قائمة الانتظار للتسليم.
message.delivered أكد خادم بريد المستلم نجاح التسليم.
message.bounced تعذّر تسليم الرسالة (ارتداد حاد أو لين).
message.complained وسم المستلم الرسالة كبريد مزعج عبر عميل البريد.

حمولة Webhook

كل تسليم webhook هو طلب POST بجسم Content-Type: application/json. الحمولة لها مظروف ثابت بصرف النظر عن نوع الحدث.

json — message.received example
{
  "id": "evt_01j9xkq7z8abc",
  "type": "message.received",
  "createdAt": "2026-04-16T10:23:45.000Z",
  "webhookId": "wh_01j9abc123",
  "data": {
    "id": "msg_01j9xkp4n5def",
    "inboxId": "inbox_01j8mq3r2t",
    "threadId": "thr_01j9xkp4m1ghi",
    "fromAddress": "alice@example.com",
    "fromName": "Alice Chen",
    "toAddresses": ["a1b2c3@agentsend.io"],
    "subject": "Re: Your proposal",
    "bodyText": "Looks great, let's move forward.",
    "bodyHtml": "<p>Looks great, let's move forward.</p>",
    "hasAttachments": false,
    "receivedAt": "2026-04-16T10:23:44.812Z"
  }
}

التحقق من التواقيع

يتضمن كل طلب webhook ترويسة X-AgentSend-Signature. وهي تجزئة HMAC-SHA256 للجسم الخام للطلب، موقَّعة بـsecret الخاص بـ webhook. تحقق دائماً من هذا التوقيع قبل معالجة التسليم لحماية نفسك من الطلبات المزوَّرة.

javascript — Express / Node.js
import crypto from "node:crypto";

app.post("/hooks/agentsend", express.raw({ type: "application/json" }), (req, res) => {
  const sig       = req.headers["x-agentsend-signature"];
  const secret    = process.env.AGENTSEND_WEBHOOK_SECRET;
  const expected  = crypto
    .createHmac("sha256", secret)
    .update(req.body) // raw Buffer — do NOT parse JSON first
    .digest("hex");

  if (!crypto.timingSafeEqual(
    Buffer.from(sig),
    Buffer.from(expected)
  )) {
    return res.status(401).send("Invalid signature");
  }

  const event = JSON.parse(req.body);
  // handle event.type …
  res.sendStatus(200);
});
python — Flask
import hmac, hashlib, os
from flask import Flask, request, abort

app = Flask(__name__)

@app.route("/hooks/agentsend", methods=["POST"])
def webhook():
    sig      = request.headers.get("X-AgentSend-Signature", "")
    secret   = os.environ["AGENTSEND_WEBHOOK_SECRET"].encode()
    expected = hmac.new(secret, request.data, hashlib.sha256).hexdigest()

    if not hmac.compare_digest(sig, expected):
        abort(401)

    event = request.get_json()
    # handle event["type"] …
    return "", 200
💡

استخدم دائماً مقارنة ثابتة الزمن (مثل crypto.timingSafeEqual أو hmac.compare_digest) عند التحقق من التواقيع لمنع هجمات التوقيت.

سياسة إعادة المحاولة

يعتبر AgentSend التسليم ناجحاً عندما تستجيب نقطتك بأي رمز حالة HTTP من 2xx خلال 10 ثوانٍ. إذا انتهت مهلة الطلب أو أُرجعت استجابة غير 2xx، يُعاد التسليم بتراجع أسّي:

المحاولة التأخير بعد المحاولة السابقة
إعادة المحاولة 1 5 ثوانٍ
إعادة المحاولة 2 30 ثانية
إعادة المحاولة 3 5 دقائق
إعادة المحاولة 4 30 دقيقة
إعادة المحاولة 5 ساعتان

بعد 5 محاولات فاشلة (6 محاولات إجمالاً) يُعلَّم التسليم كـfailed ولا تُجرى محاولات أخرى. يمكنك فحص التسليمات الفاشلة في سجلات التسليم وإعادة تشغيلها يدوياً من لوحة التحكم.

استجب بـ200 OK في أسرع وقت ممكن. إذا كان منطق معالجتك يستغرق وقتاً، اقبل الحمولة فوراً وعالجها لا‌تزامنياً بقائمة انتظار أو مهمة خلفية.

إدارة Webhooks

تتيح لك واجهة webhooks سرد نقاطك المسجَّلة وتحديثها وحذفها.

قائمة webhooks

تُرجع جميع webhooks المسجَّلة في حسابك.

bash
# GET /webhooks
curl https://api.agentsend.io/webhooks \
  -H "x-api-key: $AGENTSEND_API_KEY"

تحديث webhook

غيّر الـ URL أو الوصف أو أنواع الأحداث المشترَك بها. يمكنك أيضاً تدوير سر التوقيع بتمرير "rotateSecret": true — ستتضمن الاستجابة secret جديداً.

bash
# PUT /webhooks/{id}
curl -X PUT https://api.agentsend.io/webhooks/wh_01j9abc123 \
  -H "x-api-key: $AGENTSEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"events": ["message.received", "message.delivered", "message.bounced"]}'

حذف webhook

يزيل webhook نهائياً. لا تزال التسليمات قيد التنفيذ تُجرى قبل أن يصبح الحذف نافذاً.

bash
# DELETE /webhooks/{id}
curl -X DELETE https://api.agentsend.io/webhooks/wh_01j9abc123 \
  -H "x-api-key: $AGENTSEND_API_KEY"

مراقبة النشاط

احصل على ملخص لحجم الأحداث الأخيرة ومعدلات الأخطاء لـ webhook محدد.

bash
# GET /webhooks/activity
curl "https://api.agentsend.io/webhooks/activity?webhookId=wh_01j9abc123" \
  -H "x-api-key: $AGENTSEND_API_KEY"

سجلات التسليم

تُسجَّل كل محاولة تسليم. استعلم نقطة السجلات لفحص السجل الكامل لـ webhook، بما في ذلك رموز استجابة HTTP وأجسام الاستجابات والتوقيت.

GET /webhooks/logs
معامل الاستعلام Type Description
webhookId string ترشيح السجلات على webhook محدد.
status string success أو failed أو pending.
limit number عدد السجلات المطلوب إرجاعها (الافتراضي 50، الحد الأقصى 200).
before string مؤشر للترقيم؛ مرّر id لآخر سجل مرئي.
bash
# Fetch failed deliveries for a webhook
curl "https://api.agentsend.io/webhooks/logs?webhookId=wh_01j9abc123&status=failed" \
  -H "x-api-key: $AGENTSEND_API_KEY"

يتضمن كل سجل ما يلي: