الردود التلقائية
إنشاء قاعدة
/v2/numbers/{numberId}/auto-replies- الصلاحية:
autoreplies:write - Idempotency-Key:اختياري
- بيغيّر إعدادات
match: EXACT / CONTAINS / STARTS_WITH بتقارن كلمات حرفيًا بعد توحيد الحروف العربي (أ/إ/آ، ى/ي، ة/ه، والتشكيل). REGEX بياخد trigger.patterns: تعبيرات RE2 النمطية (وقت خطّي — مفيش تعليق من التراجع). مقبول "regex" و "starts_with" بحروف صغيرة و trigger.matchType.
البارامترات
المسار
| الاسم | النوع | القيود | الوصف |
|---|---|---|---|
numberIdإجباري | النوعstring | القيود— | الوصفرقم الـ id بتاع الرقم (من GET /v2/numbers). |
الهيدرز
| الاسم | النوع | القيود | الوصف |
|---|---|---|---|
Idempotency-Keyاختياري | النوعstring | القيود≤ 191 حرف | الوصفid فريد من عندك للعملية دي (حد أقصى 191 حرف ASCII). لو كررت بنفس المفتاح ونفس الـ body بيرجعلك أول رد ومعاه Idempotent-Replayed: true — عمرها ما تتنفذ مرتين. بيتحفظ 24 ساعة. |
X-Request-Idاختياري | النوعstring | القيود— | الوصفاختياري: id الطلب بتاعك وبيرجعلك (غير كده بنعمل req_…). اديه للدعم لو احتجت. |
الـ Body
| الاسم | النوع | القيود | الوصف |
|---|---|---|---|
nameإجباري | النوعstring | القيود≤ 120 حرف | الوصفاسم القاعدة (حد أقصى 120). |
enabledاختياري | النوعboolean | القيودالافتراضي true | الوصفfalse بيسيب القاعدة موجودة بس يوقف ردها. |
triggerإجباري | النوعobject | القيود— | الوصفإمتى القاعدة ترد. |
trigger.typeاختياري | النوعstring | القيودواحد من: KEYWORD · FIRST_MESSAGE · AWAY | الوصفKEYWORD (الرسالة فيها/هي كلمة معينة) أو FIRST_MESSAGE (ترحيب بمحادثة جديدة) أو AWAY (برا مواعيد العمل). |
trigger.matchاختياري | النوعstring | القيودواحد من: EXACT · CONTAINS · STARTS_WITH · REGEX | الوصفEXACT أو CONTAINS أو STARTS_WITH (كلمات حرفية بعد توحيد الحروف العربي: أ/إ/آ ← ا، ى ← ي، ة ← ه، من غير تشكيل) أو REGEX (أنماط RE2 في trigger.patterns). أي حالة حروف مقبولة (regex و starts_with)؛ و trigger.matchType اسم بديل. |
trigger.keywordsاختياري | النوعstring[] | القيود≤ 50 عنصر | الوصفلحد 50 كلمة لقواعد EXACT / CONTAINS / STARTS_WITH. |
trigger.patternsاختياري | النوعstring[] | القيود1–10 عنصر | الوصفقواعد REGEX: من 1 لـ 10 أنماط RE2، كل نمط ≤ 200 حرف؛ أي نمط يطابق بيشغّل القاعدة. وقت خطّي — من غير نظر للأمام/للخلف ولا إشارة لمجموعة سابقة. المجموعات بتتحط في الرد كـ {1} و {2} أو {اسم_المجموعة}. |
trigger.regexاختياري | النوعobject | القيود— | الوصفخيارات REGEX. |
trigger.regex.ignoreCaseاختياري | النوعboolean | القيودالافتراضي true | الوصفتجاهل الحروف الكبيرة والصغيرة (افتراضيًا true). |
trigger.regex.normalizeArabicاختياري | النوعboolean | القيودالافتراضي true | الوصفالمطابقة على النص بعد توحيد الحروف العربي: أ/إ/آ ← ا، ى ← ي، ة ← ه، من غير تطويل وتشكيل، والأرقام العربي ← 0–9 (افتراضيًا true). |
trigger.regex.allowLinksInCapturesاختياري | النوعboolean | القيودالافتراضي false | الوصفسيب الروابط في الأجزاء الملتقطة (افتراضيًا false: بتتشال دايمًا عشان محدش يخلّي رقمك يبعت رابط من اختياره). |
scheduleاختياري | النوعobject | null | القيود— | الوصفمواعيد العمل (لقواعد AWAY). null = طول الوقت. |
schedule.timezoneاختياري | النوعstring | القيود— | الوصفالمنطقة الزمنية IANA، مثلًا Africa/Cairo أو Asia/Riyadh. |
schedule.daysاختياري | النوعinteger[] | القيود— | الوصفأيام الشغل، 0 = الأحد … 6 = السبت. |
schedule.startاختياري | النوعstring | القيود— | الوصفوقت الفتح HH:mm. |
schedule.endاختياري | النوعstring | القيود— | الوصفوقت القفل HH:mm. |
replyإجباري | النوعobject | القيود— | الوصفالرد. |
reply.textاختياري | النوعstring | القيود≤ 4096 حرف | الوصفنص الرد؛ {name|بديل} بيحط اسم العميل. |
reply.mediaUrlاختياري | النوعstring | القيود— | الوصفملف https:// عام اختياري يتبعت مع الرد. |
reply.mediaTypeاختياري | النوعstring | القيودواحد من: image · video · document · audio | الوصفنوع reply.mediaUrl. |
cooldownMinutesاختياري | النوعinteger | القيود≥ 0 | الوصفماترُدّش على نفس الشخص بنفس القاعدة تاني قبل الدقايق دي. |
priorityاختياري | النوعinteger | القيود— | الوصفالترتيب لو أكتر من قاعدة اتطابقت: الرقم الأصغر بيتشاف الأول (الافتراضي 0). |
الطلب
curl -X POST "https://mursilat.com/api/v2/numbers/cm1abcd2345efgh6789ijkl/auto-replies" \
-H "Authorization: Bearer $WASLA_API_KEY" \
-H "Idempotency-Key: order-1042-confirm" \
-H "Content-Type: application/json" \
-d '{
"name": "الأسعار",
"trigger": {
"type": "KEYWORD",
"match": "CONTAINS",
"keywords": [
"سعر",
"بكام",
"price"
]
},
"reply": {
"text": "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
},
"cooldownMinutes": 60
}'const res = await fetch('https://mursilat.com/api/v2/numbers/cm1abcd2345efgh6789ijkl/auto-replies', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WASLA_API_KEY}`,
'Idempotency-Key': 'order-1042-confirm',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "الأسعار",
"trigger": {
"type": "KEYWORD",
"match": "CONTAINS",
"keywords": [
"سعر",
"بكام",
"price"
]
},
"reply": {
"text": "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
},
"cooldownMinutes": 60
}),
});
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/numbers/cm1abcd2345efgh6789ijkl/auto-replies",
headers=headers,
json={
"name": "الأسعار",
"trigger": {
"type": "KEYWORD",
"match": "CONTAINS",
"keywords": [
"سعر",
"بكام",
"price"
]
},
"reply": {
"text": "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
},
"cooldownMinutes": 60
},
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/numbers/cm1abcd2345efgh6789ijkl/auto-replies');
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([
'name' => 'الأسعار',
'trigger' => [
'type' => 'KEYWORD',
'match' => 'CONTAINS',
'keywords' => [
'سعر',
'بكام',
'price'
]
],
'reply' => [
'text' => 'أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices'
],
'cooldownMinutes' => 60
], 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);{
"name": "الأسعار",
"trigger": {
"type": "KEYWORD",
"match": "CONTAINS",
"keywords": [
"سعر",
"بكام",
"price"
]
},
"reply": {
"text": "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
},
"cooldownMinutes": 60
}الرد
201مثال
{
"id": "cm3rule0001xyz",
"sessionId": "cm1abcd2345efgh6789ijkl",
"scope": "number",
"name": "الأسعار",
"enabled": true,
"trigger": {
"type": "KEYWORD",
"match": "CONTAINS",
"keywords": [
"سعر",
"بكام",
"price"
]
},
"schedule": null,
"reply": {
"text": "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
},
"cooldownMinutes": 60,
"priority": 0,
"stats": {
"triggered": 42,
"lastTriggeredAt": "2026-10-13T07:40:00.000Z"
},
"createdAt": "2026-10-01T09:00:00.000Z",
"updatedAt": "2026-10-10T09:00:00.000Z"
}شكل الرد
حقول الرد في المثال. افتح الكائنات والقوايم.
responseobject13 حقل
- idstring "cm3rule0001xyz"
- sessionIdstring "cm1abcd2345efgh6789ijkl"
- scopestring "number"
- namestring "الأسعار"
- enabledboolean true
triggerobject3 حقل
- typestring "KEYWORD"
- matchstring "CONTAINS"
keywordsarray3 عنصر
- [0]string "سعر"
- schedulenull null
replyobject1 حقل
- textstring "أهلاً {name|بيك} 👋 الأسعار: https://example.com/prices"
- cooldownMinutesinteger 60
- priorityinteger 0
statsobject2 حقل
- triggeredinteger 42
- lastTriggeredAtstring "2026-10-13T07:40:00.000Z"
- createdAtstring "2026-10-01T09:00:00.000Z"
- updatedAtstring "2026-10-10T09:00:00.000Z"
الأخطاء
غير أخطاء المصادقة وحدود الطلبات والتحقق اللي ممكن ترجع من أي endpoint:
- 403AUTO_REPLIES_NOT_IN_PLANباقتك مش فيها الردود التلقائية.
- 400AUTO_REPLY_KEYWORDS_REQUIREDقاعدة الكلمات محتاجة كلمات.
- 400AUTO_REPLY_PATTERNS_REQUIREDقاعدة التعبير النمطي محتاجة نمط واحد على الأقل.
- 400AUTO_REPLY_REGEX_INVALIDفيه نمط مش تعبير RE2 صحيح، أو بيستخدم حاجة RE2 مش بيدعمها (النظر للأمام/للخلف، الإشارة لمجموعة سابقة، المجموعات الذرّية)، أو عدّى الحدود (200 حرف، {n} ≤ 100، التعقيد)، أو بيطابق رسالة فاضية.
- 400AUTO_REPLY_REGEX_TOO_MANY_PATTERNSالقاعدة أقصاها 10 أنماط.
- 400AUTO_REPLY_REGEX_RULE_LIMITالحساب أقصاه 50 قاعدة تعبير نمطي.
- 503AUTO_REPLY_REGEX_ENGINE_UNAVAILABLEالتعبيرات النمطية مش متاحة دلوقتي.
- 400AUTO_REPLY_SCHEDULE_REQUIREDرد الغياب محتاج مواعيد العمل.
- 400INVALID_SCHEDULEمواعيد أو منطقة زمنية غلط.
حماية الرقم والسلوك
مثال REGEX: {"name":"حالة الطلب","trigger":{"type":"KEYWORD","match":"regex","patterns":["(?:طلب|order)\s*#?(?<order>\d{4,8})"]},"reply":{"text":"طلبك رقم {order} بيتجهز 👍"}}. المجموعات بتتحط في الرد كـ {1} و {2} أو {اسم_المجموعة} (متنضّفة، أقصى 100 حرف لكل واحدة و 1,024 حرف في المجموع؛ والروابط — مواقع أو دومينات أو wa.me / t.me — بتتشال دايمًا إلا لو regex.allowLinksInCaptures = true).
الحدود: ≤ 10 أنماط في القاعدة، ≤ 200 حرف لكل نمط، {n} ≤ 100، ≤ 20 مجموعة، ≤ 50 قاعدة REGEX في الحساب. مش مدعوم في RE2: النظر للأمام/للخلف (?=…) (?<=…)، الإشارة لمجموعة سابقة \1، المجموعات الذرّية. الأنماط بالأرقام 0–9 بس، من غير تشكيل ولا تطويل ولا حروف مخفية. regex.ignoreCase و regex.normalizeArabic شغّالين افتراضيًا. الرسائل الأطول من 4,096 حرف مش بتتقارن بقواعد REGEX.
الترتيب: رقم الأولوية الأصغر الأول، بعدين الكلمات > الترحيب > الغياب؛ وفي نفس الأولوية قواعد REGEX بتتقيّم بعد EXACT / CONTAINS / STARTS_WITH.
جرّب
ابعت الطلب ده من متصفحك لـ API مرسلات.
مثال موثّقمعاينة — النسخة دي من التوثيق مش على mursilat.com، فالكونسول بيعرض المثال الموثّق بدل ما يكلم الـ API.
متخزن في ذاكرة التبويب ده بس: عمره ما بيتحفظ ولا بيتحط في الرابط، وبيتبعت لـ mursilat.com بس. لو عملت reload بيتنسي.