API والمطورون

الويب هوك (Webhooks)

يرسل الويب هوك الأحداث إلى خادمك لحظة وقوعها، فلا تحتاج إلى الاستعلام المتكرر من الواجهة البرمجية. ترسل المنصة طلب POST موقّعًا إلى رابط تتحكم فيه عند وصول رسالة أو تغيّر حالة تسليم.


إنشاء نقطة استقبال

انتقل إلى الإعدادات ← المطورون وافتح قسم Webhooks.

إعدادات المطورين

أضف نقطة استقبال وحدد:

الحقلالوصف
URLرابط HTTPS خاص بك، ويجب أن يكون متاحًا للوصول العام
Eventsالأحداث التي تريد استقبالها — انظر أدناه
Channelتحديد قناة واحدة، أو تركها All channels
Connectionsتقييد الاستقبال باتصالات محددة (اختياري)

سيتم توليد مفتاح توقيع (Signing Secret) خاص بك. انسخه — ستحتاجه للتحقق من الطلبات.


الأحداث

الحدثمتى يقع
message.receivedعند وصول رسالة واردة على أي قناة مشترك بها
message.statusعند تغير حالة تسليم رسالة صادرة

ليست كل القنوات تبلّغ عن حالة التسليم:

القناةmessage.receivedmessage.status
واتساب — Baileys وBusiness وCloud APIنعمنعم
فيسبوك ماسنجرنعمنعم
إنستجرامنعمنعم
تيليجرامنعملا
ودجت المحادثةنعملا
البريد الإلكترونينعملا

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


ترويسات الطلب

يحمل كل طلب ثلاث ترويسات:

الترويسةمعناها
X-RabtCRM-Signatureتوقيع HMAC بصيغة sha256=<hex> لمحتوى الطلب الخام
X-RabtCRM-Eventاسم الحدث
X-RabtCRM-Deliveryمعرّف ثابت للحدث، لا يتغير عبر إعادة المحاولات

محتوى الطلب

يستخدم كل طلب نفس الغلاف:

{
  "event": "message.received",
  "eventId": "evt_9f2c1a5b7d3e4f60",
  "teamId": 12,
  "channelType": "META-CLOUD",
  "sourceId": 99,
  "sourceName": "Main WhatsApp",
  "timestamp": "2026-08-29T10:15:04.221Z",
  "data": {
    "chatId": 32896,
    "remoteJid": "201025884633@s.whatsapp.net",
    "messageId": "wamid.HBgMMjAx...",
    "fromMe": false,
    "contactName": "Ahmed",
    "messageType": "conversation",
    "text": "مرحبًا، هل ما زال متوفرًا؟",
    "media": null,
    "timestamp": "2026-08-29T10:15:03.000Z"
  }
}

وعند إرفاق ملف يصبح الحقل media كائنًا بدلًا من null:

"media": {
  "url": "https://media.rabtcrm.com/...",
  "mimetype": "image/jpeg",
  "caption": "الأزرق"
}

أما حدث message.status فيحمل حقل data أصغر:

{
  "event": "message.status",
  "eventId": "evt_41b8c07e9a2d5f13",
  "teamId": 12,
  "channelType": "META-CLOUD",
  "sourceId": 99,
  "sourceName": "Main WhatsApp",
  "timestamp": "2026-08-29T10:15:09.882Z",
  "data": {
    "chatId": 32896,
    "remoteJid": "201025884633@s.whatsapp.net",
    "messageId": "wamid.HBgMMjAx...",
    "status": "delivered",
    "errorMessage": null
  }
}

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

احسب HMAC-SHA256 لـ محتوى الطلب الخام باستخدام مفتاح التوقيع، ثم قارنه بترويسة X-RabtCRM-Signature.

مهم: احسب التوقيع على البايتات الخام كما وصلت. تحليل الـ JSON ثم إعادة تحويله إلى نص يغيّر البايتات ولن يتطابق التوقيع أبدًا.

import crypto from 'crypto';

function verify(rawBody, header, secret) {
  const expected =
    'sha256=' + crypto.createHmac('sha256', secret).update(rawBody, 'utf8').digest('hex');
  // مقارنة بزمن ثابت — لا تستخدم === أبدًا
  const a = Buffer.from(expected);
  const b = Buffer.from(header || '');
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
import hmac, hashlib

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    expected = 'sha256=' + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, header or '')

الاستجابة

أرجع أي رمز حالة من نوع 2xx بأسرع ما يمكن. وأي رد آخر يُعد فشلًا ويؤدي إلى إعادة المحاولة.

نفّذ معالجتك الفعلية بعد إرسال الرد — فإذا استغرق معالجك أكثر من 10 ثوانٍ، تنتهي مهلة الطلب وتُعاد المحاولة رغم أنك استقبلته بالفعل.


إعادة المحاولات

تُعاد محاولة التسليم الفاشل 5 مرات بفواصل زمنية متزايدة:

المحاولةالفاصل عن سابقتها
الأولىدقيقة واحدة
الثانية5 دقائق
الثالثة30 دقيقة
الرابعةساعتان
الخامسة6 ساعات

وبعد 6 محاولات إجمالًا يُسجَّل التسليم كفاشل ولا تُعاد المحاولة مرة أخرى.


تجاهل التكرار عبر معرّف التسليم

تبقى قيمة X-RabtCRM-Delivery (وكذلك eventId) ثابتة عبر كل إعادة محاولة لنفس الحدث. احفظ المعرّفات التي عالجتها وتجاهل المكرر منها — فقد يصلك الحدث نفسه أكثر من مرة، لأن التسليم مضمون "مرة واحدة على الأقل" وليس "مرة واحدة بالضبط".


القيود

لأسباب أمنية يجب أن يكون رابط الويب هوك متاحًا على الإنترنت العام. وتُرفض العناوين الداخلية والخاصة — مثل localhost والنطاقات الخاصة 10.x و192.168.x و172.16–31.x وعناوين link-local ونقاط بيانات الخدمات السحابية. كما لا يتم اتباع عمليات إعادة التوجيه.


الخطوة التالية

أرسل الرسائل برمجيًا من تطبيقك الخاص.

إرسال الرسائل ←