الويب هوك الصادر: إشعارات فورية لنظامك
ما هو الويب هوك الصادر: الأحداث العشرة ورسالة ping، شكل الرسالة والترويسات، تسجيل الرابط من اللوحة أو الـ API، وشروط الرابط (https، المنفذان 443 و8443، عنوان عام)، وميزة الباقة والحد الأقصى.
آخر تحديث 22 أكتوبر 2026 · آخر تحقق 22 أكتوبر 2026
ما هو الويب هوك الصادر؟#
بدل أن يسأل نظامك المنصة كل دقيقة «هل تغيّر شيء؟»، تُرسل المنصة نفسها طلب POST بجسم JSON إلى رابط HTTPS تحدده أنت حالما يقع حدث، مثل تسليم طرد. كل رسالة موقّعة وتُعاد محاولتها عند الفشل (راجع مقالتي التحقق من التوقيع وإعادة المحاولة).
من يستطيع استخدامه#
- التاجر (تاجر منصة): من لوحة التاجر أو من الـ API. أما التاجر الذي أنشأته شركة توصيل فلا يستطيع استخدامه: يتلقى
403 api_not_allowedفي الـ API، وتعيد اللوحة توجيهه مع تنبيه. - مدير شركة التوصيل: من لوحة الشركة فقط (لا يوجد API للويب هوك في واجهة الشركة). تتلقى الشركة أحداث طرودها وحدها.
- الباقة (حين تنطبق الباقات على حسابك): يلزم تفعيل ميزة «الويب هوك» في الباقة لإضافة رابط جديد (وإلا
403 plan_featureفي الـ API، ورسالة الباقة في اللوحة)، ويحتاج مسار الـ API أيضاً إلى ميزةapi. وعدد الروابط هو الأقل بين 10 وقيمة «عدد روابط الويب هوك» في الباقة (الافتراضي في نموذج الباقة الجديدة 3 للتجار و5 للشركات، والقيمة الفارغة أو0تعني السقف 10 فقط).
شروط الرابط#
- يبدأ بـ
https://حصراً ولا يزيد على 500 حرف؛ لأن الرسائل تحمل بيانات الزبائن. - بلا اسم مستخدم وكلمة مرور داخل الرابط (
user:pass@)، وبلا منفذ غير 443 أو 8443. - يجب أن يُحَلّ اسم النطاق عبر DNS، وأن تكون كل عناوينه (IPv4 و IPv6) عامة: تُرفض العناوين الخاصة والمحجوزة وعناوين الحلقة المحلية (loopback) وعناوين الارتباط المحلي (link-local) وعناوين CGNAT (
100.64.0.0/10). يُعاد هذا الفحص عند كل إرسال. - لا تُتَّبع إعادة التوجيه (3xx تُعدّ فشلاً)، ويجب الرد بـ 2xx خلال 10 ثوانٍ.
تسجيل رابط#
افتح صفحة الويب هوك
التاجر: من «الويب هوك والـ API» افتح بطاقة «إشعارات لنظامك (Webhook صادر)» واضغط «إدارة الويب هوك». مدير الشركة: من «الربط والـ API» اضغط «الويب هوك» أو «إدارة الروابط والسجل».
أضف رابطاً
افتح «رابط جديد» وأدخل «رابط الاستقبال»، واكتب اسماً اختيارياً في «اسم (اختياري)»، ثم علّم الأحداث المطلوبة أو «كل الأحداث». يأتي حدث «تغيّر حالة الطرد» معلَّماً مسبقاً. أبقِ «مفعّل» معلَّماً واضغط «إضافة».
انسخ مفتاح التوقيع
بعد الإضافة يعرض «مفتاح التوقيع» كاملاً، ثم يظهر مقنَّعاً مع أيقونات إظهار ونسخ وتجديد. التجديد يُبطل المفتاح القديم فوراً.
جرّب بـ «إرسال تجربة»
تُرسل المنصة رسالة
pingموقّعة إلى رابطك وتُظهر رد نظامك (رمز HTTP) أو سبب الفشل.أو سجّل الرابط عبر الـ API (للتاجر)
أرسل
POST /api/v1/webhooksبمفتاح الـ API. يعيد الرد201مع الحقلsecretمرة واحدة فقط.
- مفاتيح الـ API الحالية (تُعرض مخفية)
- اسم المنصة أو النظام الذي ستربطه
- أنشئ مفتاحاً جديداً
- افتح توثيق الـ API
curl -X POST https://YOUR_PLATFORM_DOMAIN/api/v1/webhooks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Warehouse system","url":"https://example.com/webhooks/delivery-syria","events":["parcel.delivered","parcel.returned"]}'
للإدارة أيضاً: GET /api/v1/webhooks وPATCH وDELETE على /api/v1/webhooks/{id} وPOST /api/v1/webhooks/{id}/test، وGET /api/v1/webhooks/events. في الـ API تختار * أو أسماء أحداث دقيقة (نمط مثل parcel.* يعطي 422 validation_failed). سجل الرسائل وإعادة الإرسال متاحان في اللوحة فقط.
الأحداث#
عشرة أحداث، إضافة إلى ping:
| الحدث | متى يُرسل |
|---|---|
parcel.created |
إنشاء طرد (من اللوحة أو الـ API أو متجر مربوط) |
parcel.status_changed |
تغيّرات الحالة التي تجري عبر مسار عمل الطرد (التوصيل والإرجاع والعودة إلى المستودع وتغيير الحالة العام ومزامنة شركة الشحن الخارجية) والانتقال التلقائي إلى الحالة 5 (الاستلام في المستودع) بعد الإنشاء مباشرة؛ ولا تُرسل من نماذج الموظفين المخصصة للاستلام والفروع ولا من بعض نماذج التراجع (راجع أدناه) |
parcel.out_for_delivery |
صار الطرد مع المندوب (الحالتان 7 و8) |
parcel.delivered |
تسليم كامل أو جزئي (9 و32)، وفيه cod_collected |
parcel.returning |
فشل التسليم والطرد في طريق العودة |
parcel.returned |
استلم التاجر المرتجع (30 و13) |
parcel.cancelled |
أفادت شركة الشحن الخارجية المربوطة بالمنصة بأن الطرد أُلغي وعاد المبلغ لرصيدك (لا يُرسل إن كان الطرد مسلَّماً كلياً أو جزئياً، أو استلمه التاجر مرتجعاً، أو كان في خطوة فشل التسليم والعودة، أو سبق استرجاع مبلغه). لا يُرسل عند الإلغاء بـ POST /parcels/{tracking}/cancel |
parcel.awaiting_funds |
حُفظ الطلب لأن الرصيد لا يكفي (مع wait_for_balance أو طلبات المتاجر) |
wallet.topup |
أُضيف رصيد إلى محفظة الشحن (recharge)، بموافقة يدوية أو بدفع إلكتروني |
wallet.withdrawal |
قُبل طلب سحب المستحقات أو رُفض |
ping |
رسالة التجربة؛ لا تُختار ضمن الأحداث |
- قد يُرسل تغيّر واحد في حالة الطرد رسالتين:
parcel.status_changedوحدث المرحلة (مثلparcel.delivered)، ولكل منهماX-DS-Event-Idخاص. والطرد الجديد يرسل عادةًparcel.createdثمparcel.status_changed(الحالة 5)؛ وطردawaiting_fundsالذي يُموَّل لاحقاً يرسلparcel.status_changedلاparcel.created. - نماذج الموظفين المخصصة للاستلام والفروع (إسناد الاستلام أو إعادة جدولته، واستلام مندوب الاستلام للطرد، والتحويل إلى فرع أو الاستلام فيه) ونماذج التراجع عن خطوات الاستلام والمستودع والفروع والتوصيل (التراجع عن إسناد الاستلام، وإعادة جدولة الاستلام، واستلام مندوب الاستلام للطرد، والاستلام في المستودع، والتحويل إلى فرع، والاستلام في الفرع، وإسناد التوصيل، وإعادة جدولة التوصيل) لا ترسل أي ويب هوك. أما التراجع عن التسليم الكامل أو الجزئي وعن خطوات الإرجاع فيرسل
parcel.status_changed. والحالة التي تُضبط عبر مسار تغيير الحالة العام (واجهة الـ API لتطبيق الموظفين على الجوال، ومسار تغيير الحالة العام، ومزامنة شركة الشحن الخارجية) ترسلparcel.status_changedأيضاً. اقرأ الطرد بـGET /parcels/{tracking}حين تحتاج حالته الحالية. - أحداث
wallet.*للتجار فقط. وتتلقى الشركة أحداثparcel.*الثمانية لطرود شركتها، ويضيف جسم الرسالةmerchantوdeliveryman.
شكل الرسالة#
POST بالترويستين Content-Type: application/json وUser-Agent: DeliverySyria-Webhook/2.0، مع هذه الترويسات:
| الترويسة | المعنى |
|---|---|
X-DS-Event |
اسم الحدث |
X-DS-Event-Id |
معرّف الحدث (evt_ ثم 24 حرفاً صغيراً)؛ نفسه في كل المحاولات والروابط |
X-DS-Delivery |
UUID للرسالة الواحدة لكل رابط؛ نفسه في المحاولات |
X-DS-Attempt |
رقم المحاولة ابتداءً من 1 |
X-DS-Timestamp |
وقت الإرسال بالثواني (Unix)، ويتجدد عند كل محاولة |
X-DS-Signature |
sha256= ثم التوقيع بصيغة hex (سداسي عشري) |
{
"id": "evt_xxxxxxxxxxxxxxxxxxxxxxxx",
"event": "parcel.delivered",
"created_at": "2026-10-14T14:32:05+00:00",
"data": {
"id": 1043,
"tracking_number": "DS261013AB12CD",
"reference": "ORDER-1043",
"stage": "delivered",
"status_code": 9,
"recipient": { "name": "Example Name", "phone": "0900000000" },
"cod_amount": 50.0,
"cod_collected": 50.0,
"tracking_url": "https://YOUR_PLATFORM_DOMAIN/t/DS261013AB12CD"
}
}
dataفي أحداث الطرد هو كائن الطرد نفسه في الـ API (مختصر في المثال). أماwallet.*فتحملidوamountوcurrency(دائماًUSD) وrecharge_balanceمع حقول تختلف حسب الحدث.status_label(في كائن الطرد الكامل) نص محلّي، فاعتمد علىstatus_codeوstage. وتاريخcreated_atبالتوقيت العالمي UTC (+00:00).
أخطاء شائعة#
- نظامك بطيء أو يعيد التوجيه (مثل التحويل من
www.example.comإلىexample.com): يُحتسب فشلاً. أعِد 2xx فوراً وعالج في الخلفية. - افتراض وصول الرسالة مرة واحدة وبالترتيب: قد تتكرر الرسالة أو تتأخر؛ تجاهل ما عالجته بحسب
X-DS-Event-Id. - الرابط الموقوف لا يستقبل شيئاً: لا تُخزَّن الأحداث أثناء الإيقاف (راجع مقالة إعادة المحاولة).
الصلاحيات والحدود#
- في اللوحة: إضافة رابط وتجربته وإعادة إرسال رسالة محدودة بـ 20 و10 و30 في الدقيقة على الترتيب (حدود الـ API في مقالة حدود الطلبات).
- إذا خلت الباقة من ميزة الويب هوك فلا تُرسل المنصة أحداثاً؛ أما انتهاء الاشتراك وحده فلا يوقف الإرسال.
API
GET /api/v1/webhooks/eventsGET /api/v1/webhooksPOST /api/v1/webhooksPATCH /api/v1/webhooks/{id}DELETE /api/v1/webhooks/{id}POST /api/v1/webhooks/{id}/test