كل حمولة webhook ملفوفة:
{
"event": "<event name>",
"store_id": 13,
"occurred_at": "2026-04-30T21:18:21+00:00",
"data": { /* خاص بالحدث، مُوثَّق أدناه */ },
"delivery_id": "9f2c41ab77e05d18"
}
هذه الصفحة توثّق حقل data لكل حدث.
أحداث الطلبات
⚠️ تنبيه — أحداث الطلبات في API v1 تتبع حركة الـ API فقط
يُطلق حدث حالة الطلب فقط حين تتغيّر الحالة عبر الـ API — أي PATCH /v1/orders/{id} أو POST /v1/orders/{id}/cancel. أما التأكيد أو الشحن من لوحة تحكم DZBuild، والإرسال الجماعي إلى التوصيل، وتحديثات تتبّع شركة التوصيل التلقائية، فلا تُطلق شيئًا هنا.
كما أن هناك 7 حالات للطلب لكن 5 أحداث حالة فقط: الانتقال إلى pending والانتقال إلى processing لا يُصدران أي شيء إطلاقًا. فقد ينتقل الطلب pending → processing → shipped ولا ترى سوى order.shipped واحدًا.
إن احتجت أحداثًا تغطي كل مصادر الطلبات وكل تغييرات الحالة، استخدم إضافة Webhooks للتاجر على /dashboard/webhooks بدلًا من ذلك — انظر المقارنة في نظرة عامة على Webhooks.
order.created
يُطلق فقط للطلبات المُنشأة عبر POST /v1/orders. طلبات واجهة المتجر وصفحات الهبوط والطلبات اليدوية من لوحة التحكم لا تُطلق هذا الحدث — فإن ربطت التنفيذ به ستفوّت الغالبية الساحقة من طلبات التاجر.
{
"data": {
"order_id": 6894,
"order_number": "ORD-13-20260317-AD3C",
"customer_phone": "0555000000",
"total": 1000
}
}
هذه المفاتيح الأربعة هي كامل الحمولة. اجلب GET /v1/orders/{id} إن احتجت أي شيء آخر.
order.confirmed
يُطلق عند الانتقال إلى confirmed. يُخصم المخزون في هذه اللحظة.
{
"data": {
"order_id": 6894,
"old_status": "pending",
"new_status": "confirmed"
}
}
order.shipped
{ "data": { "order_id": 6894, "old_status": "processing", "new_status": "shipped" } }
قد تكون old_status حالة لم تُخطَر بها قط — فالانتقال إلى processing في هذا المثال لم يُطلق حدثًا خاصًا به.
order.delivered
{ "data": { "order_id": 6894, "old_status": "shipped", "new_status": "delivered" } }
order.cancelled
يُطلق حين ينتقل الطلب إلى cancelled من pending أو confirmed أو processing — وهذه هي الحالات الوحيدة التي يُسمح بالإلغاء منها. أما POST /v1/orders/{id}/cancel على طلب في حالة shipped أو delivered فيُرجع 400 bad_request ولا يُطلق أي حدث. وإن كان الطلب في حالة مخزون مُلتزَم، يُسترَد المخزون قبل إطلاق هذا الحدث.
{ "data": { "order_id": 6894, "old_status": "confirmed", "new_status": "cancelled" } }
order.returned
{ "data": { "order_id": 6894, "old_status": "delivered", "new_status": "returned" } }
أحداث الدفع
payment.received
محجوز — لا يُصدَر حاليًا. الاسم مقبول في مصفوفة events عند التسجيل ويظهر في allowed_events، لكن لا شيء يُطلقه. تغييرات حالة الدفع لن تصل إلى نقطتك؛ اقرأ GET /v1/orders/{id} إن احتجتها.
تتبّع الاشتراكات والأحداث
signup.counted
يُطلق عند ورود نداء /v1/signups تم احتسابه فعلًا (وليس مكررًا).
{
"data": {
"key_id": "dzpub_live_53f32d45fc356",
"source": "landing-page-1",
"country": "DZ"
}
}
لأسباب خصوصية لا نعيد إرسال email ولا phone ولا external_user_id في الـ webhook — أنظمتك تملك هذه القيم أصلًا. الـ webhook إشارة "هذا الاشتراك احتُسب، انقله إلى CRM لديك".
event.recorded
محجوز — لا يُصدَر حاليًا. POST /v1/events يسجّل الحدث ويزيد الاستهلاك، لكنه لا يُطلق أي webhook.
أحداث المنتجات
product.stock_low
محجوز — لا يُصدَر حاليًا. لا يوجد دفع لتنبيه انخفاض المخزون اليوم.
لكن الحقل الأساسي حقيقي: GET /v1/products/{id} يُرجع low_stock_alert إلى جانب stock_quantity تحت inventory، فيمكنك استعلام الشرط بنفسك.
داخلي / اختبار
webhook.test
يُطلق بـ POST /v1/webhooks/{id}/test. يتيح لك التأكد من أن نقطتك قابلة للوصول دون انتظار حدث حقيقي.
{ "data": { "ts": 1717112657 } }
لا يمكن الاشتراك فيه — فتضمين webhook.test في مصفوفة events عند التسجيل يُرجع 400 bad_request "unknown event: webhook.test. Allowed: …". ويُسلَّم الاختبار إلى الـ webhook الذي تناديه عليه بغض النظر عن قائمة اشتراكاته.
الرؤوس (لكل حدث)
Content-Type: application/json User-Agent: dzbuild-webhook/1 X-DZ-Timestamp: <unix seconds> X-DZ-Signature: <hex hmac-sha256> X-DZ-Delivery-Id: <numeric delivery id>
X-DZ-Delivery-Id هو معرّف تسليم رقمي (مثلًا 4127). وهو ثابت عبر كل إعادة محاولة لذلك التسليم، وهو ليس نفس القيمة delivery_id ذات الـ 16 خانة ست عشرية الموجودة في جسم JSON.
الإصدار
نُضيف أحداثًا جديدة ضمن v1 بحرية (إضافي). عندما نغيّر شكل data لحدث قائم، يكون ذلك تغييرًا يستوجب v2 ويحصل على بادئة مسار جديدة. فيمكن لشيفرتك الاعتماد على:
eventثابت.قد تظهر حقول جديدة على المستوى الأعلى في
data.الأنواع والمعاني الموجودة لن تتغير بدون v2.
ترتيب مفاتيح
dataغير مضمون.