حالة الرسالة
المتابعة، الإلغاء، وقرار الرسائل unknown.
متابعة الرسالة
GET /messages/{message_id}
HTTP 200
{
"success": true,
"message": {
"message_id": "msg_…",
"status": "sent",
"to": "9665xxxxxxxx",
"type": "text",
"client_reference": "order-123",
"provider_message_id": "…",
"last_error_code": null,
"created_at": "…",
"updated_at": "…"
},
"request_id": "…"
} queued | في الطابور بانتظار الإرسال — يمكن إلغاؤها. |
sending | جاري تسليمها لواتساب. |
sent | قبلها واتساب وأعطاها provider_message_id. |
failed | فشل الإرسال — السبب في last_error_code (WORKER_DIED: تعطل الإرسال عندنا مرتين لنفس الرسالة). |
blocked | لم تُرسل لأن الجلسة غير متصلة أو لأن واتساب يقيّد الحساب مؤقتاً — السبب في last_error_code. |
cancelled | ألغيتها قبل الإرسال. |
unknown | انقطع الاتصال أثناء التسليم ولا نعرف هل وصلت أم لا — تحتاج قراراً منك (قسم حالة الرسالة). last_error_code: TIMEOUT أو WORKER_DIED. |
حالة الرسالة تنتهي عند sent. الوصول للجهاز والقراءة يصلان عبر حدث message.ack في Webhook: ack = 1 خادم، 2 وصلت للجهاز، 3 قُرئت، 4 شُغّلت (صوت/فيديو).
إلغاء رسالة
POST /messages/{message_id}/cancel
HTTP 200 { "success": true, "message_id": "msg_…", "status": "cancelled" }
HTTP 409 { "code": "CANNOT_CANCEL", … } متاح فقط والرسالة queued ولم يبدأ إرسالها؛ غير ذلك يرجع 409 CANNOT_CANCEL. رصيد التجربة يُعاد عند الإلغاء.
قرار الرسائل unknown
POST /messages/{message_id}/unknown-decision
{ "decision": "sent" } // treat as sent
{ "decision": "failed" } // treat as failed
{ "decision": "resend", "confirm_duplicate": true }
HTTP 202 (resend)
{ "success": true, "decision": "resend", "new_message_id": "msg_…", "status": "queued" } تحقق من المحادثة على الجوال ثم اختر: sent أو failed لإغلاق الرسالة، أو resend لإرسال نسخة جديدة. resend يتطلب confirm_duplicate = true لأن الأصل ربما وصل فعلاً، ويُنشئ message_id جديداً. يمكنك الاشتراك في حدث message.unknown لتعرف بها فوراً.