إرسال الرسائل
يرسل POST /v1/messages نصاً أو وسائط إلى شخص أو مجموعة أو قناة.
{
"sessionId": "8d4c1f0e-3b9a-4f57-9a3e-2c1d0b7a6e55",
"to": "963912345678",
"text": "Your order #1042 has shipped."
}
| الحقل | |
|---|---|
sessionId |
الجلسة التي تُرسل منها. اختياري مع مفتاح الجلسة أو عند وجود جلسة واحدة في الحساب |
to |
رقم هاتف بالصيغة الدولية (أرقام فقط)، أو معرّف JID: …@s.whatsapp.net (شخص)، …@g.us (مجموعة)، …@newsletter (قناة تديرها) |
text |
النص، أو تعليق الوسائط |
imageUrl، videoUrl، documentUrl، audioUrl |
رابط https يحمّله YASend ويرسله، رابط واحد لكل رسالة |
caption، fileName |
تعليق الوسائط، واسم الملف الظاهر للمستند |
quotedMessageId |
الرد على رسالة (بمعرّفها في واتساب) |
templateKey |
يعلّم الرسالة كقالب، مثل otp_login. راجع رموز التحقق |
expiresInSeconds |
للإرسال غير المتزامن فقط: يُلغى الإرسال إذا لم يتم خلال هذه المدة (30 ثانية – 72 ساعة، والافتراضي 24 ساعة) |
متزامن أم غير متزامن
المتزامن (الافتراضي). يعود الطلب بعد أن يقبل واتساب الرسالة.
{ "id": "5b0c…", "status": "sent", "waMessageId": "3EB0C4…", "tookMs": 4210, "mode": "sync", … }
يستغرق ذلك عادةً 3–10 ثوانٍ، لأن YASend يباعد بين رسائل كل رقم كما يفعل الإنسان، وهذا ما يحمي رقمك من الحظر.
غير المتزامن (?async=true). تحصل على 202 Accepted فوراً:
curl -X POST "https://api.yasend.dev/v1/messages?async=true" \
-H "Authorization: Bearer $YASEND_KEY" -H "Content-Type: application/json" \
-d '{"sessionId": "'$SESSION_ID'", "to": "963912345678", "text": "Hi!"}'
# 202 → {"id": "5b0c…", "status": "queued", "expiresAt": "…", …}
ثم يرسل YASend الرسالة نيابةً عنك ويُبلغك بالنتيجة:
- عبر الويب هوك
message.sentأوmessage.failed(الويب هوك)؛ - أو عبر
GET /v1/messages/{id}إن كنت تفضّل الاستعلام الدوري.
الإرسال غير المتزامن:
- يحفظ الترتيب. رسالة واحدة في كل مرة لكل جلسة، الأقدم أولاً.
- ينتظر انتهاء المشكلات المؤقتة. إذا كانت الجلسة تعيد الاتصال، أو بلغت حصة يومية أو حد إحماء،
تبقى الرسالة
queuedوتُعاد محاولتها بتباعد متزايد. يبيّنerrorآخر سبب، ويبيّنnextAttemptAtموعد المحاولة التالية. - تنتهي صلاحيته. إذا تعذّر الإرسال حتى
expiresAtتفشل الرسالة بالرمزEXPIRED. - لا يُكرّر أبداً. إذا كان ممكناً أن يكون واتساب قد استلم الرسالة دون أن نتأكد من ذلك، تفشل
بالرمز
DELIVERY_UNKNOWNبدلاً من إعادة المحاولة، لأن تكرار رمز التحقق أسوأ من فشل واضح. - يمكن إلغاؤه وهو في الانتظار عبر
POST /v1/messages/{id}/cancel.
استخدم الإرسال غير المتزامن لكل ما فيه كمية، ولكل طلب ينتظره مستخدموك.
حالة الرسالة
status |
|
|---|---|
queued |
غير متزامن: بانتظار دورها أو بانتظار إعادة المحاولة |
sending |
قيد الإرسال الآن |
sent |
قبلها واتساب، وصار waMessageId متوفراً |
failed |
لم تُرسل. راجع error.code |
canceled |
أُلغيت وهي في الانتظار |
تعني sent أن واتساب قَبِل الرسالة. أما إشعارات التسليم والقراءة فتصل لاحقاً عبر الويب هوك
message.status، مرتبطة بـ waMessageId.
يعرض GET /v1/messages رسائلك المرسلة مؤخراً (الأحدث أولاً). يمكنك التصفية بـ sessionId وstatus،
والتنقل بين الصفحات بـ before=<nextBefore>.
لا نحتفظ برسائلك. بمجرد إرسال الرسالة (أو فشلها أو إلغائها) نمسح نصها وروابط وسائطها والمستلم. يعيد
GET /v1/messagesوGET /v1/messages/{id}سجل التسليم فقط: المعرّف والحالة والخطأ والأوقات، مع حقلtoفارغ، ويُحذف السجل نفسه بعد نحو 3 أيام. احتفظ بنسختك الخاصة إن احتجت إليها.
منع التكرار (Idempotency)
أخطاء الشبكة واردة. لإعادة محاولة الإرسال بأمان، أضف الترويسة Idempotency-Key: من 1 إلى 255 محرفاً
قابلاً للطباعة، فريدة لكل رسالة. معرّف الطلب أو رمز التحقق في نظامك خيار جيد.
curl -X POST https://api.yasend.dev/v1/messages -H "Idempotency-Key: otp-req-7f3a91" ...
| التكرار | النتيجة |
|---|---|
| المفتاح نفسه والمحتوى نفسه | الرسالة الأصلية (Idempotent-Replayed: true). لا تُرسل مرة ثانية أبداً، والإرسال الفاشل يُعيد خطأه نفسه |
| المفتاح نفسه بمحتوى مختلف | 422 IDEMPOTENCY_KEY_REUSED |
| المفتاح نفسه والطلب المتزامن الأول ما زال جارياً | 409 IDEMPOTENCY_IN_PROGRESS |
المجموعات والقنوات
أرسل إلى مجموعة بمعرّفها، مثل [email protected]:
GET /v1/sessions/{id}/groupsيعرض مجموعاتك؛POST /v1/sessions/{id}/groupsينشئ مجموعة.
وأرسل إلى قناة تديرها بمعرّفها …@newsletter.
بعد الإرسال
تعمل نقاط النهاية التالية على رسالة بمعرّفها في واتساب (waMessageId):
| الطلب | |
|---|---|
GET /v1/sessions/{id}/messages/{waMessageId} |
آخر حالة تسليم (بلا نص ولا مستلم: لا نحتفظ بهما) لمدة يومين تقريباً |
PATCH /v1/sessions/{id}/messages/{waMessageId} {"text": "…"} |
تعديل نص مُرسل (للرسائل الحديثة: الاتصال هو من يتذكر المحادثة، لا نحن) |
DELETE /v1/sessions/{id}/messages/{waMessageId} |
حذف لدى الجميع |
POST /v1/sessions/{id}/messages/{waMessageId}/decrypt-media |
تنزيل صورة أو فيديو أو مستند مستلَم. ثم GET /v1/sessions/{id}/media/{fileName}. يُحفظ الملف نحو ساعة واحدة فقط، فنزّله فور فك التشفير |