Webhooks
احصل على إشعارات فورية عند وقوع أحداث في حسابك بـ AgentSend — رسائل جديدة مستلمة، تأكيد تسليم، اكتشاف ارتدادات، والمزيد.
نظرة عامة
بدلاً من استعلام API للبحث عن رسائل جديدة، تتيح Webhooks لـ AgentSend دفع بيانات الحدث إلى خادمك لحظة وقوعه. سجّل نقطة نهاية HTTPS وسيرسل AgentSend طلب POST بحمولة JSON عند إطلاق أي حدث مشترَك فيه.
Webhooks هي الطريقة الموصى بها لبناء وكلاء تفاعليين. عندما يصل رد إلى صندوق وكيلك، يستقبل تطبيقك حمولة الرسالة الكاملة خلال ثوانٍ ويمكنه التصرف فوراً.
يجب أن تكون نقاط نهاية Webhook قابلة للوصول عبر HTTPS. عناوين localhost غير مقبولة. استخدم أداة مثل ngrok أو خدمة نفق عند التطوير محلياً.
إنشاء Webhook
سجّل webhook جديداً بإرسال طلب POST إلى /webhooks. يجب أن تقدّم حقل url؛ وكل الحقول الأخرى اختيارية.
/webhooks
| المعامل | النوع | الوصف |
|---|---|---|
url مطلوب |
string | عنوان HTTPS الذي سينشر AgentSend الأحداث إليه. |
description |
string | تسمية مقروءة لتحديد webhook في لوحة التحكم. |
events |
string[] | قائمة أنواع الأحداث للاشتراك بها. اتركها لتلقي جميع الأحداث. |
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. الحمولة لها مظروف ثابت بصرف النظر عن نوع الحدث.
{
"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. تحقق دائماً من هذا التوقيع قبل معالجة التسليم لحماية نفسك من الطلبات المزوَّرة.
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); });
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 المسجَّلة في حسابك.
# GET /webhooks curl https://api.agentsend.io/webhooks \ -H "x-api-key: $AGENTSEND_API_KEY"
تحديث webhook
غيّر الـ URL أو الوصف أو أنواع الأحداث المشترَك بها. يمكنك أيضاً تدوير سر التوقيع بتمرير "rotateSecret": true — ستتضمن الاستجابة secret جديداً.
# 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 نهائياً. لا تزال التسليمات قيد التنفيذ تُجرى قبل أن يصبح الحذف نافذاً.
# DELETE /webhooks/{id} curl -X DELETE https://api.agentsend.io/webhooks/wh_01j9abc123 \ -H "x-api-key: $AGENTSEND_API_KEY"
مراقبة النشاط
احصل على ملخص لحجم الأحداث الأخيرة ومعدلات الأخطاء لـ webhook محدد.
# 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 لآخر سجل مرئي. |
# 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"
يتضمن كل سجل ما يلي:
- id — المعرّف الفريد لمحاولة التسليم.
- eventId — معرّف الحدث الأصلي.
- eventType — مثل
message.received. - status —
successأوfailedأوpending. - httpStatus — رمز استجابة HTTP الذي تُرجعه نقطة نهايتك.
- durationMs — زمن الرحلة الكاملة بالميلي ثانية.
- attempt — رقم المحاولة (1 = التسليم الأول).
- createdAt — طابع زمني للمحاولة.