الرسايل
جدولة رسالة
/v2/messages- الصلاحية:
messages:send - Idempotency-Key:إجباري
- متاحة عند الطلب
- بيبعت رسايل
متاحة عند الطلب
الجدولة متاحة عند الطلب ومقفولة افتراضيًا: لحد ما تتفعّل لك، أي طلب فيه scheduleAt بيرد 422 SCHEDULING_DISABLED. الرسالة المجدولة هي المحتوى الوحيد اللي مرسلات بتحتفظ بيه (متشفّر، 30 يوم بالكتير)، عشان كده بتفضل مقفولة إلا لو طلبت من الدعم تفعيلها. الإرسال دلوقتي (من غير scheduleAt) شغال دايمًا.
متاحة عند الطلب: الجدولة مقفولة افتراضيًا (422 SCHEDULING_DISABLED) لأن الرسالة المجدولة هي المحتوى الوحيد اللي مرسلات بتحتفظ بيه — مشفّر، 30 يوم بحد أقصى، وبيتمسح أول ما تتبعت. اطلب تفعيلها من الدعم. الغيها بـ DELETE /v2/messages/{id}.
البارامترات
الهيدرز
| الاسم | النوع | القيود | الوصف |
|---|---|---|---|
Idempotency-Keyإجباري | النوعstring | القيود≤ 191 حرف | الوصفid فريد من عندك للعملية دي (حد أقصى 191 حرف ASCII). لو كررت بنفس المفتاح ونفس الـ body بيرجعلك أول رد ومعاه Idempotent-Replayed: true — عمرها ما تتنفذ مرتين. بيتحفظ 24 ساعة. |
X-Request-Idاختياري | النوعstring | القيود— | الوصفاختياري: id الطلب بتاعك وبيرجعلك (غير كده بنعمل req_…). اديه للدعم لو احتجت. |
الـ Body
| الاسم | النوع | القيود | الوصف |
|---|---|---|---|
numberIdإجباري | النوعstring | القيود— | الوصفالرقم اللي هتشتغل عليه (الـ id من GET /v2/numbers). المفتاح المقصور على أرقام معينة يستخدمها هي بس. |
toإجباري | النوعstring | القيود— | الوصفالمستلم: رقم دولي أرقام بس من غير + أو أصفار في الأول (مثلًا 201001234567 أو 966501234567). |
typeإجباري | النوعstring | القيود— | الوصفنوع الرسالة: text و image و video و audio و voice و document و sticker و location و contact و poll و event و buttons و list و cta_url. كل نوع له حقوله — شوف الجدول تحت. |
textاختياري | النوعstring | القيود— | الوصفنص الرسالة. تنسيق واتساب بيعدّي زي ما هو (*عريض* و _مائل_ و ~مشطوب~). |
referenceاختياري | النوعstring | القيود≤ 128 حرف | الوصفالـ id بتاعك (رقم أوردر، تذكرة…). بيرجعلك في ويب هوك message.status و interactive.reply وتقدر تفلتر بيه في GET /v2/messages. |
scheduleAtاختياري | النوعstring (date-time) | القيود— | الوصفوقت ISO 8601 بعد دقيقة لحد 30 يوم. متاح عند الطلب (غير كده 422 SCHEDULING_DISABLED). |
أنواع الرسايل
type | الحقول | ملاحظات |
|---|---|---|
text | الحقولtext (1–4096), linkPreview | ملاحظاتتنسيق واتساب بيعدّي. معاينة أول رابط https بتتعمل بأمان لو ينفع. |
image | الحقولmedia, caption ≤ 1024, viewOnce | ملاحظاتJPEG · PNG · WebP، حد أقصى 5 ميجا. |
video | الحقولmedia, caption, viewOnce, gif, videoNote | ملاحظاتMP4 · 3GPP، حد أقصى 16 ميجا. videoNote: دائري، ≤ 60 ثانية، من غير تعليق. |
audio | الحقولmedia | ملاحظاتOGG · MP3 · M4A · AAC · AMR، حد أقصى 16 ميجا. بيظهر كملف صوت. |
voice | الحقولmedia, viewOnce | ملاحظاتبيظهر كرسالة صوتية (OGG/Opus بيحافظ على شكل الموجة). |
document | الحقولmedia, fileName ≤ 120, caption | ملاحظاتأي ملف ماعدا البرامج، حد أقصى 100 ميجا. |
sticker | الحقولmedia | ملاحظاتWebP لحد 500 كيلو زي ما هو؛ PNG / JPG / GIF لحد 5 ميجا بيتحولوا. |
location | الحقولlatitude, longitude, name ≤ 100, address ≤ 200 | ملاحظاتموقع ثابت (الموقع المباشر مش ممكن من رقم مربوط). |
contact | الحقولcontacts[] 1–5: name, phones[] 1–3, email, organization | ملاحظاتالـ vCard بيتعمل على السيرفر. |
poll | الحقولname ≤ 255, options[] 2–12, selectableCount | ملاحظاتالأصوات بتوصل كويب هوك poll.vote. |
event | الحقولname, startAt, endAt, description, locationName | ملاحظاتتجريبي: بعض الموبايلات بتعرض الحدث في المحادثات الفردية كرسالة مش مدعومة. |
buttons | الحقولbody.text, buttons[] 1–3, header, footer, fallback | ملاحظاتالبديل بالأرقام افتراضيًا؛ والردود بتوصل كـ interactive.reply. |
list | الحقولbody.text, list.buttonText, list.sections[] (≤ 10 rows) | ملاحظاتزرار قائمة بيفتح الاختيارات. |
cta_url | الحقولbody.text, cta.title ≤ 20, cta.url | ملاحظاتزرار رابط واحد؛ قواعد الروابط بتتطبق على الرابط. |
الطلب
curl -X POST "https://mursilat.com/api/v2/messages" \
-H "Authorization: Bearer $WASLA_API_KEY" \
-H "Idempotency-Key: order-1042-confirm" \
-H "Content-Type: application/json" \
-d '{
"numberId": "cm1abcd2345efgh6789ijkl",
"to": "201001234567",
"type": "text",
"text": "تذكير بموعدك بكرة الساعة 5",
"scheduleAt": "2026-10-14T13:00:00+02:00"
}'const res = await fetch('https://mursilat.com/api/v2/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WASLA_API_KEY}`,
'Idempotency-Key': 'order-1042-confirm',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"numberId": "cm1abcd2345efgh6789ijkl",
"to": "201001234567",
"type": "text",
"text": "تذكير بموعدك بكرة الساعة 5",
"scheduleAt": "2026-10-14T13:00:00+02:00"
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
headers = {"Authorization": f"Bearer {os.environ['WASLA_API_KEY']}", "Idempotency-Key": "order-1042-confirm"}
res = requests.post(
"https://mursilat.com/api/v2/messages",
headers=headers,
json={
"numberId": "cm1abcd2345efgh6789ijkl",
"to": "201001234567",
"type": "text",
"text": "تذكير بموعدك بكرة الساعة 5",
"scheduleAt": "2026-10-14T13:00:00+02:00"
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://mursilat.com/api/v2/messages');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WASLA_API_KEY'),
'Idempotency-Key: order-1042-confirm',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'numberId' => 'cm1abcd2345efgh6789ijkl',
'to' => '201001234567',
'type' => 'text',
'text' => 'تذكير بموعدك بكرة الساعة 5',
'scheduleAt' => '2026-10-14T13:00:00+02:00'
], JSON_UNESCAPED_UNICODE),
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) { throw new Exception($data['error']['code'] . ': ' . $data['error']['message']); }
print_r($data);{
"numberId": "cm1abcd2345efgh6789ijkl",
"to": "201001234567",
"type": "text",
"text": "تذكير بموعدك بكرة الساعة 5",
"scheduleAt": "2026-10-14T13:00:00+02:00"
}الرد
200مثال
{
"id": "3EB0A1B2C3D4E5F60718",
"numberId": "cm1abcd2345efgh6789ijkl",
"status": "scheduled",
"type": "text",
"reference": "order-1042",
"scheduledAt": "2026-10-14T11:00:00.000Z",
"interactionId": null,
"format": null,
"fallbackIncluded": null,
"estimatedDelayMs": null
}شكل الرد
حقول الرد في المثال. افتح الكائنات والقوايم.
responseobject10 حقل
- idstring "3EB0A1B2C3D4E5F60718"
- numberIdstring "cm1abcd2345efgh6789ijkl"
- statusstring "scheduled"
- typestring "text"
- referencestring "order-1042"
- scheduledAtstring "2026-10-14T11:00:00.000Z"
- interactionIdnull null
- formatnull null
- fallbackIncludednull null
- estimatedDelayMsnull null
الأخطاء
غير أخطاء المصادقة وحدود الطلبات والتحقق اللي ممكن ترجع من أي endpoint:
- 422SCHEDULING_DISABLEDالرسائل المجدولة مش مفعّلة (متاحة عند الطلب).
- 400SCHEDULE_AT_INVALIDscheduleAt لازم من دقيقة لـ 30 يوم قدام.
- 422SCHEDULE_MEDIA_URL_ONLYالميديا المجدولة لازم media.url.
حماية الرقم والسلوك
وقت الإرسال حماية الرقم بتتطبق عادي. الرفض اللي ممكن يتكرر (فاصل، حد، ساعات هدوء، رقم واقف أو مفصول) بيتأجل لحد 24 ساعة؛ والباقي بيفشل وبيوصلك ويب هوك message.status: failed.
جرّب
ابعت الطلب ده من متصفحك لـ API مرسلات.
مثال موثّقمعاينة — النسخة دي من التوثيق مش على mursilat.com، فالكونسول بيعرض المثال الموثّق بدل ما يكلم الـ API.
متخزن في ذاكرة التبويب ده بس: عمره ما بيتحفظ ولا بيتحط في الرابط، وبيتبعت لـ mursilat.com بس. لو عملت reload بيتنسي.