توثيق Bulk Template Message API
تتيح لكم واجهة API هذه إرسال رسائل القوالب إلى عدة مستلمين في وقت واحد عبر قناة WhatsApp.
تُعالَج الرسائل بشكل غير متزامن؛ يعيد طلب API فوراً bulkMessageId، بينما تُوضع الرسائل في قائمة الانتظار وتُعالَج في الخلفية.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/send.js
الميزات الرئيسية
- إرسال رسائل قوالب جماعية إلى 1–5,000 مستلم في طلب واحد
- متغيرات مخصّصة لكل مستلم (HEADER وBODY وBUTTONS وCAROUSEL)
defaultPayloadمشترك لجميع المستلمين مع دمجpayloadالخاص بكل مستلم (isMerge)- إرسال مجدول (
scheduleAt) - تحديد المستلمين بواسطة
username(رقم الهاتف) أوuserIdأوsessionId - إرسال عدة رسائل إلى المستخدم نفسه ضمن طلب جماعي واحد
referenceIdاختياري لتتبّع السجلات مع الأنظمة الخارجية- إسناد المحادثات تلقائياً إلى مستخدم أو مجموعة عمل بعد الإرسال (
action)
لا تستطيع واجهة API هذه إرسال إلا القوالب المعتمدة من Meta.
يجب أن يطابق اسم القالب ورمز اللغة تماماً القالب المسجَّل في Meta Business Manager.
معاملات الطلب
المعاملات ذات المستوى الأعلى
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
channelUsername | string | نعم | رقم قناة WhatsApp المستخدم لإرسال الرسالة (مثل "908506669933") |
connectorBrand | string | نعم | العلامة التجارية لموصّل القناة. القيمة المدعومة حالياً: "whatsapp" |
title | string | لا | عنوان الحملة. يُستخدم للعرض في لوحة التحكم. القيمة الافتراضية: "-" |
scheduleAt | string (ISO 8601) | لا | تاريخ ووقت الإرسال المجدول (مثل "2026-06-10T10:00:00.000Z"). إذا حُذف، تُرسل الرسائل فوراً. |
defaultPayload | object | مشروط* | حمولة القالب الافتراضية المطبقة على جميع المستلمين. مطلوبة إذا لم يقدّم أحد المستلمين payload خاصاً به. |
recipients | array | نعم | قائمة المستلمين. الحد الأدنى 1 والحد الأقصى 5,000 مستلم. |
action | object | لا | إجراء يُطبَّق على المحادثة بعد الإرسال. assign-to-user أو assign-to-workgroup. |
*إذا قدّم كل مستلم payload خاصاً به، فإن defaultPayload اختياري.
بنية المستلم
يجب تقديم واحد فقط من username أو userId أو sessionId لكل مستلم. لا يمكن استخدام عدة معرّفات معاً، وسيؤدي حذفها جميعاً إلى خطأ.
لإرسال عدة رسائل إلى المستخدم نفسه ضمن طلب جماعي واحد، أضيفوا المعرّف نفسه إلى قائمة المستلمين عدة مرات.
| الحقل | النوع | الوصف |
|---|---|---|
username | string | رقم هاتف المستلم (مثل "905554443322"). إذا لم يكن المستخدم موجوداً في النظام، يُنشأ تلقائياً. |
userId | string | معرّف مستخدم موجود في النظام. |
sessionId | string | معرّف جلسة محادثة موجودة في النظام. |
referenceId | string | معرّف مرجعي اختياري (بحد أقصى 256 حرفاً) للمطابقة مع سجلات الأنظمة الخارجية (CRM أو الطلبات أو التذاكر وغيرها). يجب أن يكون فريداً ضمن الطلب الجماعي إن وُجد. |
payload | object | حمولة القالب الخاصة بالمستلم (اختيارية). إذا كان isMerge: true، فتُدمج مع defaultPayload. |
isMerge | boolean | يتجاوز سلوك الدمج لهذا المستلم (اختياري). إذا حُذف، يُستخدم defaultPayload.isMerge. |
بنية الإجراء
| الحقل | النوع | الوصف |
|---|---|---|
action.key | string | "assign-to-user" يُسند المحادثة إلى موظف محدد؛ و"assign-to-workgroup" يُسندها إلى مجموعة عمل. |
action.value | string | معرّف المستخدم أو مجموعة العمل المستهدفة. |
بنية حمولة القالب
يشترك defaultPayload وpayload الخاص بالمستلم في البنية نفسها. في رسائل القوالب يجب تحديد type: "template".
{
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR",
"variables": []
},
"isMerge": true
}
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
type | string | نعم | نوع الحمولة. لرسائل القوالب: "template" |
template.templateName | string | نعم* | اسم القالب المسجَّل في Meta. اختياري في حمولات المستلمين عند استخدام isMerge: true (يُورَّث من الافتراضي). |
template.languageCode | string | لا | رمز لغة القالب (مثل "tr" أو "en" أو "tr-TR" أو "en-US"). يجب أن يطابق تماماً اللغة المسجَّلة في Meta. |
template.variables | array | لا | قائمة المتغيرات المطبقة على مكوّنات القالب. مفصَّلة أدناه. |
isMerge | boolean | لا | true: تُدمج حمولة المستلم دمجاً عميقاً مع defaultPayload. false أو محذوف: تحل حمولة المستلم محل defaultPayload بالكامل. |
- إذا كان
defaultPayload.isMerge: trueوقدّم المستلمpayloadخاصاً به، يُطبَّق دمج عميق. - مع الدمج العميق، يكفي أن يقدّم المستلم
variablesفقط؛ ويُورَّثtemplateNameوlanguageCodeمن الحمولة الافتراضية. - يتجاوز حقل
isMergeالخاص بالمستلم قيمةdefaultPayload.isMerge. - إذا لم يقدّم المستلم
payload، تُستخدمdefaultPayloadدائماً.
بنية المتغيرات
يقابل كل عنصر في المصفوفة variables مكوّناً من مكوّنات القالب. لا يجوز أن يظهر نوع المكوّن (type) إلا مرة واحدة في المصفوفة.
| type | الوصف | parameters | cards |
|---|---|---|---|
"HEADER" | مكوّن رأس القالب. متغير نصي أو رابط وسائط (صورة أو فيديو أو مستند) | نعم | — |
"BODY" | متغيرات النص الأساسي للقالب | نعم | — |
"BUTTONS" | متغيرات لاحقة الرابط الديناميكية للأزرار | نعم | — |
"CAROUSEL" | مكوّنات الشرائح لقوالب العرض الدوّار | — | نعم |
صيغ المعاملات
يمكن تقديم الحقل parameters بثلاث صيغ مختلفة:
// Format 1: Array (index-based) — for placeholders like {{1}}, {{2}}, {{3}}
"parameters": ["value1", "value2", "value3"]
// Format 2: Object (numeric keys) — alternative representation for {{1}}, {{2}}
"parameters": { "1": "value1", "2": "value2" }
// Format 3: Object (named keys) — for placeholders like {{name}}, {{amount}}
"parameters": { "name": "John", "amount": "150 USD" }
- إذا كان قالب Meta لديكم يستخدم عناصر نائبة مثل
{{1}}و{{2}}، فاستخدموا صيغة المصفوفة أو صيغة الكائن بمفاتيح رقمية. - إذا كان قالبكم يستخدم عناصر نائبة مسمّاة مثل
{{firstName}}أو{{orderTotal}}، فاستخدموا صيغة الكائن بمفاتيح مسمّاة. - عند استخدام المصفوفات، الترتيب مهم: العنصر الأول يقابل
{{1}}والثاني{{2}}وهكذا.
مكوّن HEADER
استخدموا المكوّن HEADER عندما يحتوي رأس القالب على وسائط (صورة أو فيديو أو مستند) أو نص ديناميكي.
// Media header (image URL)
{
"type": "HEADER",
"parameters": ["https://example.com/product-image.jpg"]
}
// Text header variable
{
"type": "HEADER",
"parameters": ["Special Campaign"]
}
مكوّن BODY
يُستخدم للمتغيرات النصية الديناميكية داخل النص الأساسي للقالب.
// Array format — when the template uses {{1}}, {{2}}, {{3}}
{
"type": "BODY",
"parameters": ["John", "ORD-12345", "150.00 USD"]
}
// Named format — when the template uses {{name}}, {{orderAmount}}
{
"type": "BODY",
"parameters": {
"name": "John",
"orderAmount": "150.00 USD"
}
}
مكوّن BUTTONS
يُستخدم للأزرار ذات لاحقة الرابط الديناميكية. إذا احتوى القالب على عدة أزرار روابط، فلا تُفهرَس بالتسلسل إلا الأزرار التي فيها متغيرات (تُتجاهل الأزرار التي بلا متغيرات وأزرار FLOW).
// Single URL button suffix variable
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345"]
}
// Multiple URL button suffix variables (first URL button, second URL button)
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345", "cancel/ORD-12345"]
}
مكوّن CAROUSEL
في قوالب العرض الدوّار، تُحدَّد متغيرات المكوّنات بشكل منفصل لكل شريحة.
{
"type": "CAROUSEL",
"cards": [
{
"components": [
{
"type": "HEADER",
"parameters": ["https://example.com/card1.jpg"]
},
{
"type": "BODY",
"parameters": ["Product A", "99.00 USD"]
}
]
},
{
"components": [
{
"type": "HEADER",
"parameters": ["https://example.com/card2.jpg"]
},
{
"type": "BODY",
"parameters": ["Product B", "149.00 USD"]
}
]
}
]
}
يجب أن يطابق طول المصفوفة cards تماماً عدد الشرائح المعرَّفة في القالب.
أمثلة
1. قالب بسيط — بلا متغيرات ومحتوى واحد لجميع المستلمين
هذه أبسط طريقة لإرسال قالب ثابت بلا متغيرات إلى عدة مستلمين.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "General Announcement",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "hello_world",
"languageCode": "tr-TR"
}
},
"recipients": [{ "username": "905554443301" }, { "username": "905554443302" }, { "username": "905554443303" }]
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/send.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "General Announcement",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "hello_world",
"languageCode": "tr-TR"
}
},
"recipients": [
{ "username": "905554443301" },
{ "username": "905554443302" },
{ "username": "905554443303" }
]
}'
- يُنشأ المستلمون المحددون بواسطة
usernameتلقائياً إذا لم يكونوا موجودين في النظام - يستخدم جميع المستلمين
defaultPayloadنفسه؛ ولا حاجة إلى بيانات خاصة بكل مستلم - عند عدم تحديد
isMerge، يستخدم كل مستلمdefaultPayloadمباشرة
2. قالب بمتغيرات نص أساسي مشتركة
يُرسل القالب نفسه إلى جميع المستلمين بقيم المتغيرات نفسها. يحتوي القالب على عناصر نائبة مثل {{1}} و{{2}}.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Summer Campaign",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "promo_notification",
"languageCode": "tr-TR",
"variables": [
{
"type": "BODY",
"parameters": ["30%", "July 31, 2026"]
}
]
}
},
"recipients": [{ "username": "905554443301" }, { "username": "905554443302" }]
}
- في هذا المثال، قد يحتوي نص القالب الأساسي على محتوى مثل: "استمتعوا بخصم
{{1}}في حملتنا! العرض ساري حتى{{2}}." - يحل
parameters[0]محل{{1}}، بينما يحلparameters[1]محل{{2}}
3. قالب مخصّص — متغيرات لكل مستلم مع isMerge
تُستخدم قيم متغيرات مختلفة لكل مستلم. بضبط isMerge: true في defaultPayload، يكفي أن يقدّم المستلمون variables فقط؛ ويُورَّث templateName وlanguageCode من الحمولة الافتراضية.
في هذا المثال، يتضمن القالب رأس وسائط ومتغيرات نص أساسي مخصّصة.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Personal Order Notification",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR"
},
"isMerge": true
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "HEADER",
"parameters": ["https://s3.example.com/product-a.jpg"]
},
{
"type": "BODY",
"parameters": ["Ahmet", "ORD-001", "150.00 TRY"]
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "HEADER",
"parameters": ["https://s3.example.com/product-b.jpg"]
},
{
"type": "BODY",
"parameters": ["Fatma", "ORD-002", "289.00 TRY"]
}
]
}
}
}
]
}
- بفضل
isMerge: true، لا حاجة إلى تكرارtemplateNameفي حمولة كل مستلم - مصفوفة
variablesالخاصة بكل مستلم مستقلة تماماً - يجب أن يكون رابط وسائط الرأس متاحاً للعموم
- إذا حُذف
typeفي حمولة المستلم، يُورَّثdefaultPayload.type
4. متغير زر رابط
استخدموا المكوّن BUTTONS عندما يحتوي القالب على زر بلاحقة رابط ديناميكية. مثلاً رقم تتبّع يُلحَق بالرابط الأساسي https://example.com/track/.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Shipment Tracking Notification",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "shipment_tracking",
"languageCode": "tr-TR"
},
"isMerge": true
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": ["Ahmet", "TK-98765"]
},
{
"type": "BUTTONS",
"parameters": ["TK-98765"]
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": ["Recep", "TK-12345"]
},
{
"type": "BUTTONS",
"parameters": ["TK-12345"]
}
]
}
}
}
]
}
- تُطابَق معاملات
BUTTONSبحسب ترتيب الأزرار التي تحتوي على متغيرات - تُتجاهل أزرار FLOW والأزرار التي بلا متغيرات؛ ولا تنطبق الفهرسة إلا على أزرار الروابط الديناميكية
- إذا كان رابط زر القالب
https://example.com/track/{{1}}، فإنparameters[0]يحل محل{{1}}
5. إرسال مجدول
جدولوا إرسال رسالة في تاريخ ووقت مستقبليين. يجب تقديم scheduleAt بصيغة طابع زمني UTC وفق ISO 8601.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Morning Campaign Message",
"scheduleAt": "2026-06-10T07:00:00.000Z",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "morning_campaign",
"languageCode": "en-US"
},
"isMerge": true
},
"action": {
"key": "assign-to-workgroup",
"value": "WORKGROUP_ID"
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": { "name": "Ahmet", "discountRate": "25" }
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": { "name": "Zeynep", "discountRate": "40" }
}
]
}
}
}
]
}
- يجب تقديم
scheduleAtبالمنطقة الزمنية UTC (مثلاً للساعة 10:00 صباحاً بتوقيت تركيا، استخدموا07:00:00.000Z) - يستخدم هذا المثال صيغة المعاملات المسمّاة؛ ويجب أن يحتوي القالب على عناصر نائبة مثل
{{name}}و{{discountRate}} - مع
action، تُسند المحادثات التي أنشأها إرسال الرسائل تلقائياً إلى مجموعة العمل المحددة
الاستجابة
يعيد الطلب الناجح bulkMessageId يمكن استخدامه لتتبّع عملية الإرسال:
{
"bulkMessageId": "abc123xyz789"
}
استجابات الأخطاء
| الحالة | الوصف |
|---|---|
Channel not found | لم يُعثر على قناة موثَّقة تطابق channelUsername وconnectorBrand |
Channel is not verified | القناة المطابقة موجودة لكنها لم تُوثَّق بعد |
invalidRequest | قُدّمت عدة معرّفات لمستلم، أو حمولة مطلوبة مفقودة |
channelNotFound | لم يُعثر على قناة نشطة تطابق channelId المقدَّم |
schema-error | فشل حقل في جسم الطلب في التحقق من المخطط (حقل مطلوب مفقود، أو نوع غير صحيح، أو قيمة غير مدعومة) |
يمكن استخدام bulkMessageId المُعاد مع نقاط النهاية أدناه للاستعلام عن إحصاءات الإرسال وإيقافه.
Stats — إحصاءات الإرسال
يجلب الحالة الراهنة لإرسال رسالة جماعية. يعيد أعداد السجلات المعلّقة والناجحة والفاشلة والملغاة.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stats.js
معاملات الطلب
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
bulkMessageId | string | نعم | معرّف الرسالة الجماعية المراد تتبّعها (يُعاد من createBulkPerRecipient) |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stats.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
الاستجابة
{
"bulkMessage": {
"_id": "abc123xyz789",
"slug": "my-workspace",
"title": "Campaign Title",
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"connectorSlug": "whatsapp-cloud",
"payload": {
"recipientCount": 100,
"defaultPayloadType": "template",
"jobId": "job_abc123"
},
"schedule": {
"date": "2026-06-10T07:00:00.000Z",
"type": "later"
},
"createdAt": "2026-06-08T10:00:00.000Z",
"updatedAt": "2026-06-08T10:30:00.000Z"
},
"stats": {
"pending": 45,
"success": 42,
"failed": 3,
"cancelled": 10,
"total": 100
}
}
حقول Stats
| الحقل | النوع | الوصف |
|---|---|---|
stats.pending | number | عدد السجلات التي لا تزال تنتظر في القائمة |
stats.success | number | عدد السجلات التي عُولجت بنجاح للإرسال |
stats.failed | number | عدد السجلات التي واجهت خطأ في الإرسال |
stats.cancelled | number | عدد السجلات الملغاة |
stats.total | number | إجمالي عدد السجلات (pending + success + failed + cancelled) |
يشير stats.success إلى أن النظام سلّم الرسالة بنجاح. وهو لا يضمن أن Meta سلّمت الرسالة إلى المستلم. أما تحديثات الحالة اللاحقة الصادرة عن Meta (مثل delivered أو read أو failed) فلا تؤثر في هذا العداد ولا تنعكس هنا.
- نقطة النهاية stats: تعرض حالة مهمة الإرسال (pending وsuccess وfailed وcancelled)
- نقطة النهاية message-stats: تعرض حالة الرسالة الفعلية (
pendingوsendingوsentوdeliveredوreadوerrorوغيرها) - قد تنجح المهمة بينما لا تكون الرسالة قد سُلّمت أو قُرئت بعد
المعرّف المرجعي
referenceId حقل اختياري يمكنكم استخدامه لمطابقة سجلات الإرسال بمعرّف من نظامكم الخاص لأغراض التتبّع (مثل رقم الطلب أو معرّف التذكرة).
إذا قُدّم، يجب أن يكون فريداً ضمن الطلب الجماعي (بحد أقصى 256 حرفاً).
- استخدامه غير مطلوب
- لا يمكن تكراره ضمن الرسالة الجماعية نفسها
- يمكن إعادة استخدامه عبر رسائل جماعية مختلفة
Message Stats — حالة رسائل WhatsApp
يجلب إحصاءات حالة الرسائل لرسالة جماعية. وعلى عكس نقطة النهاية stats، تعرض هذه النقطة message.status الفعلي لكل سجل بدلاً من حالة المهمة.
حالات الرسائل الممكنة: pending وsending وsent وdelivered وread وdeleted وwarning وerror وunknown وnot-sended
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/message-stats.js
معاملات الطلب
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
bulkMessageId | string | نعم | معرّف الرسالة الجماعية المراد الاستعلام عنها |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/message-stats.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
الاستجابة
{
"bulkMessage": {
"_id": "abc123xyz789",
"slug": "my-workspace",
"type": "perRecipient",
"title": "Campaign Title"
},
"messageStats": {
"pending": 5,
"sending": 2,
"sent": 10,
"delivered": 45,
"read": 30,
"deleted": 2,
"warning": 1,
"error": 3,
"unknown": 0,
"not-sended": 2,
"no-message": 10,
"total": 120
}
}
حقول Message Stats
| الحقل | النوع | الوصف |
|---|---|---|
pending | number | رسائل لم تُرسل بعد |
sending | number | رسائل قيد الإرسال حالياً |
sent | number | رسائل سُلّمت إلى WhatsApp ولم تصل بعد |
delivered | number | رسائل وصلت إلى هاتف المستلم |
read | number | رسائل قرأها المستلم |
deleted | number | رسائل محذوفة |
warning | number | رسائل بها تحذيرات |
error | number | رسائل بها أخطاء |
unknown | number | رسائل بحالة غير معروفة |
not-sended | number | رسائل تعذّر إرسالها |
no-message | number | سجلات بلا رسالة بعد (لا تزال في القائمة) |
total | number | إجمالي عدد السجلات |
- يشير ارتفاع عدد
no-messageإلى أن الإرسال لا يزال جارياً - يبيّن عدد
deliveredنجاح وصول الرسائل - يمكن استخدام عدد
readلقياس تفاعل الحملة - يمكنكم استعلام نقطة النهاية هذه دورياً للتتبّع الفوري
بنية Options — التقسيم إلى صفحات والتصفية والفرز
يوفّر المعامل options المستخدم في نقطتي النهاية list وlist-with-messages بنية قياسية للتقسيم إلى صفحات والتصفية والفرز.
حقول Options
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
pagination | object | لا | إعدادات التقسيم إلى صفحات |
filtering | object | لا | معايير التصفية |
sorting | object | لا | إعدادات الفرز (مثل {"createdAt": -1}) |
بنية التقسيم إلى صفحات
| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
currentPage | number | 1 | رقم الصفحة المراد جلبها |
pageItems | number | 50 | عدد السجلات في الصفحة (الحد الأقصى: 50) |
بنية التصفية
تتم التصفية بصيغة استعلام MongoDB. يمكنكم التصفية بحسب حقول السجل. وفي نقطة النهاية list-with-messages يمكنكم أيضاً التصفية بحسب حقول الرسالة (مثل message.status).
// Filter by record status
{
"options": {
"filtering": {
"status": "success"
}
}
}
// Filter by referenceId
{
"options": {
"filtering": {
"referenceId": "ORDER-12345"
}
}
}
// Filter by message status (only list-with-messages)
{
"options": {
"filtering": {
"message.status": "delivered"
}
}
}
// Filter by multiple statuses using $in (MongoDB operator)
{
"options": {
"filtering": {
"message.status": {
"$in": ["delivered", "read"]
}
}
}
}
// Exclude specific statuses using $nin (MongoDB operator)
{
"options": {
"filtering": {
"message.status": {
"$nin": ["error", "not-sended"]
}
}
}
}
بنية الفرز
يتم الفرز بصيغة فرز MongoDB. تعني 1 تصاعدياً و-1 تنازلياً.
// Sort by creation date descending (newest first)
{
"options": {
"sorting": {
"createdAt": -1
}
}
}
// Sort by multiple fields
{
"options": {
"sorting": {
"status": 1,
"createdAt": -1
}
}
}
مثال على الاستخدام المركّب
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 2,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
},
"sorting": {
"createdAt": -1
}
}
}
يفرز هذا المثال الرسائل المُسلَّمة من الأحدث إلى الأقدم.
- ادمجوا
filteringمعpaginationللاستعلامات المستهدفة - تتضمن الاستجابة
options.pagination.totalCountوoptions.pagination.totalPagesللتنقّل - لا يعمل مرشِّح
message.statusإلا في نقطة النهايةlist-with-messages
Records — تفاصيل السجلات وعرضها
يعرض جميع سجلات الإرسال لرسالة جماعية. يمثل كل سجل رسالة واحدة أُرسلت إلى مستلم.
List — قائمة السجلات
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list.js
معاملات الطلب
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
bulkMessageId | string | نعم | معرّف الرسالة الجماعية المراد عرضها |
options | object | لا | خيارات التقسيم إلى صفحات والتصفية والفرز. راجعوا بنية Options للتفاصيل. |
الطلب — الاستخدام الأساسي
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
الطلب — التصفية بحسب حالة محددة
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"status": "success"
}
}
}
يعرض سجلات الإرسال الناجحة فقط (record.status = "success").
الاستجابة
{
"bulkMessageRecords": [
{
"_id": "record_1",
"bulkMessageId": "abc123xyz789",
"slug": "my-workspace",
"userId": "user_123",
"sessionId": "session_456",
"messageId": "msg_789",
"referenceId": "ORDER-12345",
"status": "success",
"createdAt": "2026-06-10T10:00:00.000Z"
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {}
}
}
List With Messages — قائمة مع تفاصيل الرسائل
له ميزات نقطة النهاية list نفسها (التقسيم إلى صفحات والتصفية والفرز). والفرق الوحيد: إذا كان للسجل messageId، يُعاد أيضاً كائن message المرتبط به. وهذا يتيح لكم رؤية حالة الرسالة (delivered أو read أو error وغيرها) وحمولتها في استعلام واحد.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list-with-messages.js
الطلب — الاستخدام الأساسي
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
الطلب — التصفية بحسب حالة الرسالة
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
}
}
}
يجلب هذا المثال الرسائل ذات الحالة "delivered" فقط.
الطلب — عرض الرسائل الفاشلة
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "error"
}
}
}
يُستخدم لمراجعة الرسائل التي واجهت أخطاء في الإرسال.
الاستجابة
{
"bulkMessageRecords": [
{
"_id": "record_1",
"bulkMessageId": "abc123xyz789",
"userId": "user_123",
"messageId": "msg_789",
"referenceId": "ORDER-12345",
"status": "success",
"message": {
"_id": "msg_789",
"status": "delivered",
"payload": {
"type": "template",
"template": {
"templateName": "order_notification"
}
},
"createdAt": "2026-06-10T10:01:00.000Z",
"deliveredAt": "2026-06-10T10:01:05.000Z"
}
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {}
}
}
حقول السجل
| الحقل | النوع | الوصف |
|---|---|---|
_id | string | معرّف السجل |
bulkMessageId | string | معرّف الرسالة الجماعية التي ينتمي إليها هذا السجل |
userId | string | معرّف مستخدم المستلم |
sessionId | string | معرّف جلسة المحادثة |
messageId | string | معرّف الرسالة المُرسَلة (null إذا لم تُرسل بعد) |
referenceId | string | المعرّف المرجعي الاختياري (إن قُدّم) |
status | string | حالة السجل: pending أو success أو failed أو cancelled |
message | object | تفاصيل الرسالة (في list-with-messages فقط) |
مقارنة List وList-With-Messages
| الميزة | list | list-with-messages |
|---|---|---|
| التقسيم إلى صفحات | نعم | نعم |
| التصفية | نعم (حقول السجل فقط) | نعم (حقول السجل والرسالة) |
| كائن الرسالة | لا | نعم (إذا وُجد messageId) |
| الأداء | سريع | متوسط (ينفّذ JOIN) |
| مرشِّح message.status | غير متاح | متاح |
- list: عرض كل السجلات بسرعة، والتصفية بحسب referenceId، والتحقق من حالات السجلات
- list-with-messages: الاطلاع على حالات رسائل WhatsApp (delivered وread)، وفحص حمولات الرسائل
- أمثلة على التصفية:
{"status": "failed"}— سجلات الإرسال الفاشلة{"referenceId": "ORDER-123"}— معرّف مرجعي محدد{"message.status": "delivered"}— الرسائل المُسلَّمة (list-with-messages فقط){"message.status": "read"}— الرسائل المقروءة (list-with-messages فقط){"message.status": "error"}— الرسائل التي بها أخطاء (list-with-messages فقط){"message.status": {"$in": ["delivered", "read"]}}— الرسائل المُسلَّمة أو المقروءة (list-with-messages فقط){"message.status": {"$nin": ["error", "not-sended"]}}— الرسائل باستثناء الأخطاء وغير المُرسَلة (list-with-messages فقط){"status": {"$in": ["success", "pending"]}}— السجلات الناجحة أو المعلّقة
- نقطة النهاية
listأسرع؛ فضّلوها لفحوص الحالة العامة - استخدموا
list-with-messagesعندما تحتاجون إلى تفاصيل الرسائل - الحد الأقصى للسجلات في الصفحة (pageItems) هو 50؛ وتكون القيمة الافتراضية 50 إذا لم تُحدَّد
- لا يعمل مرشِّح
message.statusإلا فيlist-with-messages - السجلات ذات messageId الفارغ سيكون كائن
messageفيها فارغاً
Stop — إلغاء الإرسال
يوقف إرسال رسالة جماعية جارٍ. تُلغى المهمة الموجودة في القائمة، وتُنقل جميع السجلات pending إلى الحالة cancelled. أما السجلات التي عُولجت بالفعل بحالة success أو failed فلا تتأثر.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stop.js
لا يمكن التراجع عن هذا الإجراء. ولا يمكن استئناف إرسال تم إيقافه.
معاملات الطلب
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
bulkMessageId | string | نعم | معرّف الرسالة الجماعية المراد إيقافها |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stop.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
الاستجابة
عند نجاح الطلب يكون جسم الاستجابة فارغاً. وتشير حالة HTTP 200 إلى أن العملية اكتملت بنجاح.
{}
- لا يمكن إيقاف إلا الرسائل الجماعية التي أُنشئت عبر واجهة API هذه
- بعد إيقاف الإرسال، يمكنكم استخدام نقطة النهاية
statsللتحقق من عدد السجلات الملغاة - إذا تعذّر العثور على الرسالة الجماعية، تعيد API الخطأ:
bulkMessageNotFound