إنتقل إلى المحتوى الرئيسي

رسائل واتساب

هذه النقاط الأربع تفتح إضافة مرسل واتساب عبر الواجهة البرمجية: قوالب رسائل الطلبات التي اعتمدتها المنصة، ورصيد واتساب الخاص بالمتجر، وسجل الرسائل المرسلة للزبائن، ونداء يرسل قالباً واحداً لزبون طلب واحد. الرسالة المرسلة عبر الواجهة البرمجية تخضع لقواعد الرسائل التلقائية نفسها: تُخصم رسالة واحدة من الرصيد، والرسالة التي يرفضها واتساب تُعاد إلى الرصيد، والرسالة التي لا تُرسل لا يُخصم منها شيء.

لا يمكن إرسال نص حرّ. كل رسالة هي أحد القوالب الستة المذكورة أسفله، تُملأ من بيانات الطلب (الاسم الأول للزبون، رقم الطلب، اسم المتجر، شركة التوصيل، مكتب الاستلام، المبلغ)، بالعربية أو الفرنسية، مع زر "تتبع طلبي".

قبل أن تبدأ​

  • يجب أن تكون إضافة مرسل واتساب مفعّلة في المتجر (صفحة الإضافات في لوحة التحكم). نقاط القراءة الثلاث تعمل بدونها، أما الإرسال فيُرجع 403 addon_not_active.
  • شحن الرصيد يتم من صفحة الإضافة في لوحة التحكم (/dashboard/whatsapp-sender، زر شحن الرصيد). الواجهة البرمجية تقرأ الرصيد ولا تشحنه.
  • الرسائل تُرسل إلى الأرقام الجزائرية للهاتف النقال فقط (05 أو 06 أو 07). أي رقم آخر يُتجاوز بـ invalid_number دون أي خصم.
  • يحتاج المفتاح صلاحيات واتساب. مفاتيح المنصة الجديدة تحصل على الاثنتين افتراضياً. الصلاحيات تُجمَّد لحظة إنشاء المفتاح، فالمفتاح الذي أُنشئ قبل الإصدار v1.6 لا يملكهما: أنشئ مفتاحاً جديداً لاستعمال هذه النقاط.
النطاقالوصف
whatsapp:readالاطلاع على قوالب رسائل واتساب ورصيدك وسجل الرسائل المرسلة
whatsapp:sendإرسال رسائل واتساب لزبائنك بخصوص طلباتهم (تُخصم كل رسالة من رصيد واتساب)

GET /v1/whatsapp/templates​

قائمة القوالب: النص العربي والفرنسي، وقيم مثال لكل خانة، وحالة الاعتماد لكل لغة.

المصادقة: مفتاح منصة بصلاحية whatsapp:read.

الحالة هي آخر ما قرأته المنصة من واتساب. تُحدَّث مرة كل 10 دقائق على الأكثر ما دامت الرسائل تُرسل، وUNKNOWN تعني أنها لم تُقرأ بعد. هذا النداء لا يتصل بواتساب أبداً. لا تُرسل إلا القوالب المعتمدة APPROVED: الإرسال بلغة قالبها غير معتمد يُتجاوز بـ template_not_approved دون أي خصم.

الطلب​

curl 'https://api.dzbuild.app/v1/whatsapp/templates' \
-H "Authorization: Bearer $DZ_KEY"

الاستجابة 200​

يظهر هنا عنصر واحد من الستة.

{
"data": {
"items": [
{
"key": "shipped_home",
"name": "dz_order_shipped_home",
"toggle": "shipped",
"languages": {
"ar": {
"body": "أهلاً {{1}}، طلبك رقم {{2}} من {{3}} في الطريق مع {{4}}.\nسيصلك خلال {{5}}. سيتصل بك عامل التوصيل قبل الوصول، يرجى إبقاء هاتفك متاحاً وتجهيز المبلغ: {{6}} دج.\nاضغط على الزر لتتبع طلبك.",
"example": ["أحمد", "1024", "متجري", "Yalidine", "يوم إلى 3 أيام", "3500"],
"status": "APPROVED"
},
"fr": {
"body": "Bonjour {{1}}, votre commande n° {{2}} chez {{3}} est en route avec {{4}}.\nLivraison prévue sous {{5}}. Le livreur vous appellera avant d'arriver : restez joignable et préparez le montant de {{6}} DA.\nAppuyez sur le bouton pour suivre votre commande.",
"example": ["Ahmed", "1024", "Ma Boutique", "Yalidine", "1 à 3 jours", "3500"],
"status": "APPROVED"
}
}
}
]
}
}

القوالب الستة​

keytoggleما يقرؤه الزبون
receivedreceivedوصل طلبه وسيتصل به المتجر لتأكيده.
confirmedconfirmedتم تأكيد طلبه وهو قيد التجهيز، مع المبلغ المطلوب.
shipped_homeshippedطلبه في الطريق إلى عنوانه، مع مدة التوصيل المتوقعة المضبوطة في الإضافة.
shipped_deskshippedطلبه في الطريق إلى مكتب استلام تذكره الرسالة.
delivery_faileddelivery_failedلم يتمكن الموصل من الوصول إليه اليوم وسيعاود المحاولة غداً.
desk_readydesk_readyالطرد ينتظره في مكتب الاستلام.

toggle هو مفتاح الرسالة التلقائية في إعدادات الإضافة الذي يتبعه القالب. يتحكم في الرسائل التلقائية فقط، والإرسال عبر الواجهة البرمجية لا يأخذه بعين الاعتبار.

GET /v1/whatsapp/balance​

الرصيد وحالة الإضافة وعدّادات الرسائل التي تظهر في صفحة الإضافة.

المصادقة: مفتاح منصة بصلاحية whatsapp:read.

الطلب​

curl 'https://api.dzbuild.app/v1/whatsapp/balance' \
-H "Authorization: Bearer $DZ_KEY"

الاستجابة 200​

{
"data": {
"balance": 412,
"low_balance": false,
"addon_active": true,
"stats": {
"sent": 12,
"delivered": 230,
"read": 158,
"failed": 4,
"used_month": 96
}
}
}
الحقلالمعنى
balanceعدد الرسائل المتبقية في الرصيد. المتجر الذي لم يشحن أبداً رصيده 0.
low_balancetrue عندما يقل الرصيد عن 50 رسالة.
addon_activeهل إضافة مرسل واتساب مفعّلة في المتجر.
stats.sent، stats.delivered، stats.read، stats.failedرسائل آخر 30 يوماً حسب حالتها الحالية. الرسالة التي قرأها الزبون تُحسب في read فقط.
stats.used_monthالرسائل المخصومة من الرصيد منذ أول الشهر، بما فيها التي أُعيدت لاحقاً.

GET /v1/whatsapp/messages​

رسائل المتجر من الأحدث إلى الأقدم: الرسائل التلقائية (source قيمته auto) والمرسلة عبر الواجهة البرمجية (source قيمته api). رقم هاتف الزبون لا يُرجَع أبداً.

المصادقة: مفتاح منصة بصلاحية whatsapp:read.

معاملات الاستعلام​

المعاملالنوعالافتراضيملاحظات
order_idأرقاملا شيءرسائل هذا الطلب فقط. أي قيمة ليست أرقاماً فقط تُرجع 400 bad_request.
limitint50من 1 إلى 200.
cursorstringلا شيءقيمة next_cursor من الصفحة السابقة. انظر الترقيم.

الطلب​

curl 'https://api.dzbuild.app/v1/whatsapp/messages?order_id=6894' \
-H "Authorization: Bearer $DZ_KEY"

الاستجابة 200​

{
"data": {
"items": [
{
"id": 4181,
"order_id": 6894,
"event": "shipped_home",
"source": "api",
"status": "read",
"language": "fr",
"template_name": "dz_order_shipped_home",
"error_title": null,
"refunded": false,
"created_at": "2026-09-26 10:14:03"
},
{
"id": 4180,
"order_id": 6894,
"event": "confirmed",
"source": "auto",
"status": "delivered",
"language": "ar",
"template_name": "dz_order_confirmed",
"error_title": null,
"refunded": false,
"created_at": "2026-09-25 18:02:41"
}
],
"next_cursor": null,
"has_more": false
}
}
الحقلالمعنى
eventفي الرسالة التلقائية: حدث الطلب الذي أطلقها (received أو confirmed أو shipped أو delivery_failed أو desk_ready). في رسالة الواجهة البرمجية: مفتاح القالب المرسل.
sourceauto أو api.
statusانظر الجدول أدناه.
languagear أو fr.
template_nameاسم القالب المسجّل لدى واتساب.
error_titleسبب تجاوز الرسالة أو فشلها، وإلا فـ null.
refundedtrue بعد أن تعود رسالة الإرسال الفاشل إلى الرصيد.
created_atبصيغة YYYY-MM-DD HH:MM:SS بتوقيت الخادم.
statusالمعنى
queuedمدفوعة وتنتظر (قيد الإرسال). ترسلها المنصة خلال دقيقة تقريباً.
sendingتُسلَّم الآن إلى واتساب (قيد الإرسال).
sentقبلها واتساب (أُرسلت).
deliveredوصلت إلى هاتف الزبون (وصلت).
readفتحها الزبون (قُرئت).
failedلم يتمكن واتساب من إيصالها (فشلت). تعود الرسالة إلى الرصيد خلال دقائق وتصبح refunded قيمتها true.
skippedلم تُرسل ولم يُخصم منها شيء (لم تُرسل). error_title يذكر السبب.

الرسالة المتجاوزة تحمل أحد هذه الأسباب في error_title:

error_titleالمعنى
invalid_numberرقم غير صالح: الهاتف ليس رقماً جزائرياً للنقال.
suppressedرقم بلا واتساب.
template_not_approvedالقالب بانتظار الموافقة في تلك اللغة.
empty_paramبيانات ناقصة: الطلب ينقصه معطى يحتاجه القالب.

POST /v1/orders/{id}/whatsapp​

يضع قالباً واحداً في طابور الإرسال لزبون طلب واحد ويخصم رسالة واحدة من الرصيد. ترسلها المنصة خلال دقيقة تقريباً.

المصادقة: مفتاح منصة بصلاحية whatsapp:send. يتطلب Idempotency-Key.

الجسم​

الحقلالنوعإلزاميملاحظات
templatestringنعمقيمة key من GET /v1/whatsapp/templates، أو shipped التي تختار shipped_home أو shipped_desk أو desk_ready حسب نوع توصيل الطلب (منزل أو مكتب أو استلام).
languagear أو frلاالافتراضي هو لغة الرسائل المختارة في إعدادات الإضافة، أو لغة المتجر إن لم تُختر لغة.

ما يفعله النداء​

  1. يتحقق من أن الإضافة مفعّلة وأن الطلب تابع للمتجر. طلب متجر آخر يُرجع 404 مثل طلب غير موجود.
  2. لا يأخذ مفاتيح الرسائل التلقائية في الإضافة بعين الاعتبار: يمكنك إرسال قالب أوقفه التاجر للرسائل التلقائية.
  3. كل قالب يُرسل مرة واحدة لكل طلب عبر الواجهة البرمجية. النداء الثاني يُرجع 409 already_sent مع id وstatus للرسالة السابقة. الاستثناء الوحيد محاولة سابقة تم تجاوزها، مثلاً لأن الرقم كان غير صالح ثم صُحّح في الطلب: عندها يعيد النداء المحاولة.
  4. يتحقق من الرقم واعتماد القالب وبيانات الطلب. أي مشكلة تُرجع 422 وسببها هو رمز الخطأ، وتُسجَّل رسالة متجاوزة دون أي خصم.
  5. يخصم رسالة واحدة من الرصيد. الرصيد الفارغ يُرجع 402 no_credit ولا يُسجَّل شيء.
  6. يُرجع 202. تابع الرسالة بـ GET /v1/whatsapp/messages?order_id= مع رقم الطلب. الرسالة التي يرفضها واتساب تصبح failed وتعود إلى الرصيد.

رسائل الواجهة البرمجية تُحسب منفصلة عن الرسائل التلقائية. إرسال shipped_home عبر الواجهة البرمجية لا يمنع رسالة "الطلب في الطريق" التلقائية للطلب نفسه، والرسالة التلقائية لا تمنع الإرسال عبر الواجهة البرمجية. وكل واحدة مدفوعة.

الطلب​

curl -X POST 'https://api.dzbuild.app/v1/orders/6894/whatsapp' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: wa-6894-shipped-1" \
-d '{"template": "shipped", "language": "fr"}'

الاستجابة 202​

قيمة template هي المفتاح الذي وُضع في الطابور، بعد تحويل shipped إلى القالب المناسب.

{
"data": {
"message_id": 4181,
"status": "queued",
"template": "shipped_home",
"language": "fr"
}
}

الأخطاء​

HTTPالرمزالسبب
400bad_requestرقم الطلب ليس أرقاماً فقط، أو الجسم ليس JSON صالحاً، أو Idempotency-Key غائب أو غير صالح.
402no_creditرصيد واتساب فارغ. لم يُسجَّل شيء.
403forbiddenMissing scope: whatsapp:send
403addon_not_activeإضافة مرسل واتساب غير مفعّلة في المتجر.
404not_foundلا يوجد طلب بهذا الرقم في المتجر.
409already_sentهذا القالب أُرسل من قبل لهذا الطلب عبر الواجهة البرمجية.
422unknown_templatetemplate ليست shipped ولا مفتاحاً من القائمة.
422invalid_languagelanguage ليست ar ولا fr.
422invalid_numberهاتف الطلب ليس رقماً جزائرياً للنقال.
422suppressedهاتف الطلب بلا واتساب.
422template_not_approvedالقالب غير معتمد بعد في تلك اللغة.
422empty_paramالطلب ينقصه معطى يحتاجه القالب.
422idempotency_key_reuseاستُعمل Idempotency-Key نفسه مع جسم مختلف.
500send_failedتعذر وضع الرسالة في الطابور. أعد المحاولة بالمفتاح نفسه.

هكذا يبدو 409 already_sent.

{
"error": {
"code": "already_sent",
"message": "This template was already sent for this order",
"id": 4181,
"status": "delivered"
}
}

إعادة المحاولة وIdempotency-Key​

أول استجابة لكل مفتاح تُحفظ 24 ساعة. إعادة المحاولة بالمفتاح نفسه والجسم نفسه تُرجع تلك الاستجابة مع Idempotency-Replay: 1، حتى لو كانت 402 أو 403 أو 422. لذلك بعد شحن الرصيد أو تفعيل الإضافة أو تصحيح الطلب، أعد المحاولة بـ Idempotency-Key جديد: المفتاح القديم يبقى يُرجع الخطأ القديم. والـ 202 المُعادة تعني أنه لم تُوضع رسالة ثانية في الطابور.

المفتاح نفسه مع جسم مختلف يُرجع 422 idempotency_key_reuse. استجابات 5xx و429 لا تُحفظ أبداً، فأعد المحاولة بالمفتاح نفسه. وإن كانت الرسالة قد وُضعت في الطابور فعلاً قبل الخطأ، تُرجع إعادة المحاولة 409 already_sent مع id الرسالة، ولا يُخصم شيء مرتين. انظر Idempotency.

حدود معروفة​

  • نص مدة التوصيل. القالب shipped_home يحمل مدة التوصيل المتوقعة كما كتبها التاجر في إعدادات الإضافة. رسالة فرنسية من متجر كتب المدة بالعربية تُظهر ذلك النص العربي وسط الرسالة الفرنسية. المدة المكتوبة بالأرقام فقط، مثل 24-72h، تُقرأ بالطريقة نفسها في اللغتين.
  • بطء الإرسال بعد فحص الاعتماد. عندما يمضي أكثر من 10 دقائق على آخر قراءة لحالة اعتماد قالب، يعيد الإرسال قراءتها من واتساب قبل وضع الرسالة في الطابور. يحدث ذلك مرة واحدة على الأكثر لكل قالب ولغة كل 10 دقائق، وقد يؤخر POST حتى 15 ثانية، لذا اضبط مهلة عميل HTTP لديك على 20 ثانية على الأقل.