Bulk Template Message API डॉक्यूमेंटेशन — v2
यह API आपको WhatsApp चैनल के ज़रिए एक साथ कई प्राप्तकर्ताओं को टेम्पलेट संदेश भेजने देती है।
संदेश भेजना असिंक्रोनस रूप से प्रोसेस होता है; API अनुरोध तुरंत एक bulkOperationId लौटा देता है, जबकि संदेश कतार में रखे जाते हैं और बैकग्राउंड में प्रोसेस होते हैं।
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/send.js
इस दस्तावेज़ का हर एंडपॉइंट एक कस्टम फ़ंक्शन है। HTTP जवाब की बॉडी में फ़ंक्शन के अपने फ़ील्ड (_id, title, pathString…) होते हैं और एंडपॉइंट का असली जवाब result के अंदर होता है। इस दस्तावेज़ के जवाब वाले उदाहरण result की सामग्री दिखाते हैं:
{
"_id": "function_id",
"title": "Show",
"pathString": "/bulk-message-api-app/api/v2/bulk-operation/show.js",
"result": {
"bulkOperation": { "_id": "abc123xyz789", "status": "running" }
}
}
v1 से माइग्रेट करना
v2, v1 के साथ-साथ चलता है, इसलिए आप अपने समय के अनुसार माइग्रेट कर सकते हैं। v1 एंडपॉइंट (/api/bulk-message/…, /api/bulk-message-records/…) बंद कर दिए जाएँगे; नए इंटीग्रेशन को v2 इस्तेमाल करना चाहिए।
- एंडपॉइंट पाथ को v2 पर ले जाएँ:
…/api/bulk-message/…बदलकर…/api/v2/bulk-operation/…हो जाता है, और…/api/bulk-message-records/…बदलकर…/api/v2/bulk-operation-items/…हो जाता है।sendअनुरोध की बॉडी नहीं बदलती; एक अनुरोध में अब 5,000 की जगह 100,000 तक प्राप्तकर्ता आ सकते हैं। - अनुरोधों में
bulkMessageIdकी जगहbulkOperationIdभेजें। stats.jsकी जगहshow.jsइस्तेमाल करें।- जवाबों को नीचे दी गई तालिका के नए फ़ील्ड नामों के साथ पढ़ें।
v2 एंडपॉइंट सिर्फ़ उन्हीं बल्क ऑपरेशन को जानते हैं जो v2 send से बनाए गए हों। स्विच करने से पहले v1 से बनाए गए किसी बल्क संदेश को ट्रैक करने के लिए, उसके लिए v1 एंडपॉइंट ही इस्तेमाल करते रहें।
एंडपॉइंट
| v1 | v2 | जवाब में क्या बदलता है |
|---|---|---|
bulk-message/send.js | v2/bulk-operation/send.js | { bulkMessageId } बदलकर { bulkOperationId } हो जाता है |
bulk-message/stats.js | v2/bulk-operation/show.js | { bulkMessage, stats } बदलकर { bulkOperation } हो जाता है |
bulk-message/message-stats.js | v2/bulk-operation/message-stats.js | काउंटर messageStats के अंदर की जगह रूट पर होते हैं |
bulk-message/stop.js | v2/bulk-operation/stop.js | कुछ नहीं |
bulk-message-records/list.js | v2/bulk-operation-items/list.js | bulkMessageRecords बदलकर bulkOperationItems हो जाता है |
bulk-message-records/list-with-messages.js | v2/bulk-operation-items/list-with-messages.js | list जैसा ही, और हर आइटम में session भी होता है |
फ़ील्ड के नाम
| v1 | v2 |
|---|---|
stats.success | bulkOperation.progress.succeeded |
stats.pending, stats.failed, stats.cancelled, stats.total | bulkOperation.progress.pending, .failed, .cancelled, .total |
| — | bulkOperation.progress.unknown, bulkOperation.status, bulkOperation.result.outcome |
bulkMessage (बल्क संदेश) | bulkOperation (बल्क ऑपरेशन) |
bulkMessageRecord (रिकॉर्ड) | bulkOperationItem (आइटम) |
अनुरोधों में, send के जवाब में और रिकॉर्ड पर bulkMessageId | bulkOperationId |
रिकॉर्ड का username / userId / sessionId, जैसा भेजा गया | payload.username / payload.userId / payload.sessionId |
रिकॉर्ड का referenceId | payload.referenceId |
रिकॉर्ड का payload (प्राप्तकर्ता का टेम्पलेट पेलोड) | payload.payload |
भेजने के बाद रिकॉर्ड का userId, sessionId, messageId | result.userId, result.sessionId, result.messageId |
रिकॉर्ड की स्थिति success | succeeded |
असफल रिकॉर्ड पर रिकॉर्ड का errorMessage | error.message, error.code और error.retryable के साथ |
| — | position (recipients में प्राप्तकर्ता का इंडेक्स) |
फ़िल्टर {"status": "success"} | {"status": "succeeded"} |
फ़िल्टर {"referenceId": "…"} | {"payload.referenceId": "…"} |
send के एरर schema-error, invalidRequest | zod-schema-error, संदेश में अमान्य फ़ील्ड के पाथ के साथ |
मुख्य विशेषताएँ
- एक ही अनुरोध में 1–100,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, अधिकतम 100,000 प्राप्तकर्ता। |
action | object | नहीं | भेजने के बाद बातचीत पर लागू होने वाली कार्रवाई। assign-to-user या assign-to-workgroup। |
*अगर हर प्राप्तकर्ता अपना payload देता है, तो defaultPayload वैकल्पिक है।
प्राप्तकर्ता की संरचना
हर प्राप्तकर्ता के लिए username, userId या sessionId में से ठीक एक देना ज़रूरी है। एक से ज़्यादा पहचानकर्ता साथ में इस्तेमाल नहीं किए जा सकते, और सब छोड़ देने पर एरर आएगा।
एक ही बल्क अनुरोध में एक ही उपयोगकर्ता को कई संदेश भेजने के लिए, वही पहचानकर्ता प्राप्तकर्ता सूची में कई बार जोड़ें।
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
username | string | प्राप्तकर्ता का फ़ोन नंबर (जैसे "905554443322")। अगर उपयोगकर्ता सिस्टम में नहीं है, तो वह अपने आप बना दिया जाता है। |
userId | string | सिस्टम में मौजूद किसी उपयोगकर्ता की आईडी। |
sessionId | string | सिस्टम में मौजूद किसी बातचीत सेशन की आईडी। |
referenceId | string | बाहरी सिस्टम के रिकॉर्ड (CRM, ऑर्डर, टिकट आदि) से मिलान के लिए वैकल्पिक रेफ़रेंस आईडी (अधिकतम 256 वर्ण)। दिए जाने पर बल्क के भीतर यूनिक होनी चाहिए। |
payload | object | प्राप्तकर्ता-विशिष्ट टेम्पलेट पेलोड (वैकल्पिक)। अगर isMerge: true है, तो इसे defaultPayload के साथ मर्ज किया जाता है। |
isMerge | boolean | इस प्राप्तकर्ता के लिए मर्ज व्यवहार को बदलता है (वैकल्पिक)। छोड़ने पर defaultPayload.isMerge इस्तेमाल होता है। |
Action की संरचना
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
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" | टेम्पलेट का हेडर कंपोनेंट। टेक्स्ट वेरिएबल या मीडिया URL (इमेज, वीडियो, दस्तावेज़) | हाँ | — |
"BODY" | टेम्पलेट की बॉडी के टेक्स्ट वेरिएबल | हाँ | — |
"BUTTONS" | बटन के लिए डायनेमिक URL सफ़िक्स वेरिएबल | हाँ | — |
"CAROUSEL" | कैरोसेल टेम्पलेट के लिए कार्ड कंपोनेंट | — | हाँ |
पैरामीटर के फ़ॉर्मैट
parameters फ़ील्ड तीन अलग फ़ॉर्मैट में दिया जा सकता है:
// फ़ॉर्मैट 1: ऐरे (इंडेक्स-आधारित) — {{1}}, {{2}}, {{3}} जैसे प्लेसहोल्डर के लिए
"parameters": ["value1", "value2", "value3"]
// फ़ॉर्मैट 2: ऑब्जेक्ट (न्यूमेरिक की) — {{1}}, {{2}} के लिए वैकल्पिक रूप
"parameters": { "1": "value1", "2": "value2" }
// फ़ॉर्मैट 3: ऑब्जेक्ट (नामित की) — {{name}}, {{amount}} जैसे प्लेसहोल्डर के लिए
"parameters": { "name": "John", "amount": "150 USD" }
- अगर आपका Meta टेम्पलेट
{{1}},{{2}}जैसे प्लेसहोल्डर इस्तेमाल करता है, तो ऐरे फ़ॉर्मैट या न्यूमेरिक-की ऑब्जेक्ट फ़ॉर्मैट में से कोई एक इस्तेमाल करें। - अगर आपका टेम्पलेट
{{firstName}}या{{orderTotal}}जैसे नामित प्लेसहोल्डर इस्तेमाल करता है, तो नामित-की ऑब्जेक्ट फ़ॉर्मैट इस्तेमाल करें। - ऐरे इस्तेमाल करते समय क्रम मायने रखता है: पहला एलिमेंट
{{1}}से, दूसरा{{2}}से मेल खाता है, और इसी तरह आगे।
HEADER कंपोनेंट
जब टेम्पलेट के हेडर में मीडिया (इमेज, वीडियो, दस्तावेज़) या डायनेमिक टेक्स्ट हो, तब HEADER कंपोनेंट इस्तेमाल करें।
// मीडिया हेडर (इमेज URL)
{
"type": "HEADER",
"parameters": ["https://example.com/product-image.jpg"]
}
// टेक्स्ट हेडर वेरिएबल
{
"type": "HEADER",
"parameters": ["Special Campaign"]
}
BODY कंपोनेंट
टेम्पलेट की बॉडी के अंदर डायनेमिक टेक्स्ट वेरिएबल के लिए इस्तेमाल होता है।
// ऐरे फ़ॉर्मैट — जब टेम्पलेट {{1}}, {{2}}, {{3}} इस्तेमाल करता है
{
"type": "BODY",
"parameters": ["John", "ORD-12345", "150.00 USD"]
}
// नामित फ़ॉर्मैट — जब टेम्पलेट {{name}}, {{orderAmount}} इस्तेमाल करता है
{
"type": "BODY",
"parameters": {
"name": "John",
"orderAmount": "150.00 USD"
}
}
BUTTONS कंपोनेंट
डायनेमिक URL सफ़िक्स वाले बटन के लिए इस्तेमाल होता है। अगर टेम्पलेट में कई URL बटन हैं, तो सिर्फ़ वेरिएबल वाले बटन क्रम से इंडेक्स होते हैं (वेरिएबल रहित बटन या FLOW बटन नज़रअंदाज़ किए जाते हैं)।
// एक URL बटन का सफ़िक्स वेरिएबल
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345"]
}
// कई URL बटन के सफ़िक्स वेरिएबल (पहला URL बटन, दूसरा URL बटन)
{
"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/v2/bulk-operation/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 के साथ हर प्राप्तकर्ता के लिए अलग वेरिएबल
हर प्राप्तकर्ता के लिए अलग वेरिएबल मान इस्तेमाल होते हैं। defaultPayload में isMerge: true सेट करने से प्राप्तकर्ताओं को सिर्फ़ 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ऐरे पूरी तरह स्वतंत्र होता है - हेडर मीडिया URL सार्वजनिक रूप से पहुँच योग्य होना चाहिए
- अगर प्राप्तकर्ता पेलोड में
typeछोड़ा जाए, तोdefaultPayload.typeविरासत में मिलता है
4. URL बटन वेरिएबल
जब टेम्पलेट में डायनेमिक URL सफ़िक्स वाला बटन हो, तब BUTTONS कंपोनेंट इस्तेमाल करें। जैसे, बेस URL 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 बटन और वेरिएबल रहित बटन नज़रअंदाज़ किए जाते हैं; इंडेक्सिंग सिर्फ़ डायनेमिक URL बटन पर लागू होती है
- अगर टेम्पलेट बटन का URL
https://example.com/track/{{1}}है, तोparameters[0]{{1}}की जगह लेता है
5. शेड्यूल्ड डिलीवरी
किसी भविष्य की तारीख़ और समय पर संदेश भेजने के लिए शेड्यूल करें। scheduleAt ISO 8601 UTC टाइमस्टैम्प के रूप में देना ज़रूरी है।
{
"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" }
}
]
}
}
}
]
}
scheduleAtUTC टाइम ज़ोन में देना ज़रूरी है (जैसे तुर्किये के समय के अनुसार सुबह 10:00 बजे के लिए07:00:00.000Zइस्तेमाल करें)- यह उदाहरण नामित पैरामीटर फ़ॉर्मैट इस्तेमाल करता है; टेम्पलेट में
{{name}}और{{discountRate}}जैसे प्लेसहोल्डर होने चाहिए actionके साथ, संदेश भेजने से बनी बातचीत अपने आप बताए गए वर्कग्रुप को सौंप दी जाती हैं
जवाब
सफल अनुरोध एक bulkOperationId लौटाता है, जिसे डिलीवरी प्रक्रिया ट्रैक करने के लिए इस्तेमाल किया जा सकता है:
{
"bulkOperationId": "abc123xyz789"
}
एरर जवाब
| स्टेटस | विवरण |
|---|---|
recipients field is required | recipients फ़ील्ड नहीं भेजा गया |
Channel not found | channelUsername और connectorBrand से मेल खाता कोई वेरिफ़ाई किया हुआ चैनल नहीं मिला |
Channel is not verified | मेल खाता चैनल मौजूद है लेकिन अभी वेरिफ़ाई नहीं हुआ है |
zod-schema-error | अनुरोध बॉडी का कोई फ़ील्ड स्कीमा वैलिडेशन में असफल रहा (ज़रूरी फ़ील्ड गायब, ग़लत प्रकार, असमर्थित मान, किसी प्राप्तकर्ता पर एक से ज़्यादा पहचानकर्ता, या payload गायब)। संदेश में फ़ील्ड का नाम होता है, जैसे recipients.0.referenceId: referenceId must be unique |
लौटाए गए bulkOperationId को नीचे दिए एंडपॉइंट के साथ इस्तेमाल करके डिलीवरी के आँकड़े पूछे जा सकते हैं और डिलीवरी प्रक्रिया रोकी जा सकती है।
Show — बल्क ऑपरेशन की स्थिति और आँकड़े
बल्क ऑपरेशन को उसकी मौजूदा स्थिति और उसके आइटम के डिलीवरी काउंटर के साथ, bulkOperation की के अंदर लौटाता है।
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/show.js
अनुरोध पैरामीटर
| पैरामीटर | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
bulkOperationId | string | हाँ | ट्रैक किए जाने वाले बल्क ऑपरेशन की आईडी (send से लौटाई गई) |
{
"bulkOperationId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/show.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkOperationId": "abc123xyz789"
}'
जवाब
{
"bulkOperation": {
"_id": "abc123xyz789",
"type": "send-bulk-message",
"slug": "my-workspace",
"userId": "agent_user_id",
"payload": {
"title": "Campaign Title",
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"connectorSlug": "om2WabVegaCloud",
"defaultLanguageCode": "tr-TR",
"sentUser": { "firstname": "John", "lastname": "Doe" },
"defaultPayload": {
"type": "template",
"template": { "templateName": "order_confirmation", "languageCode": "tr-TR" },
"isMerge": true
},
"source": { "type": "recipients", "bulkOperationInputGroupId": "group_id" }
},
"status": "running",
"result": { "outcome": "unknown", "hasErrors": false },
"progress": {
"total": 100,
"pending": 45,
"succeeded": 42,
"failed": 3,
"cancelled": 10,
"unknown": 0
},
"scheduleAt": "2026-06-10T07:00:00.000Z",
"createdAt": "2026-06-08T10:00:00.000Z",
"updatedAt": "2026-06-10T07:00:30.000Z",
"startedAt": "2026-06-10T07:00:05.000Z"
}
}
Show फ़ील्ड
फ़ील्ड bulkOperation के अंदर होते हैं।
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
status | string | बल्क ऑपरेशन की स्थिति: preparing, scheduled, pending, running, stopping, stopped, completed, failed |
progress.total | number | आइटम की कुल संख्या |
progress.pending | number | वे आइटम जो अब भी कतार में इंतज़ार कर रहे हैं |
progress.succeeded | number | डिलीवरी के लिए सफलतापूर्वक प्रोसेस हुए आइटम |
progress.failed | number | वे आइटम जिनमें डिलीवरी एरर आया |
progress.cancelled | number | stop से रद्द किए गए आइटम |
progress.unknown | number | वे आइटम जिनका नतीजा तय नहीं हो सका |
result.outcome | string | बल्क ऑपरेशन पूरा होने के बाद का अंतिम नतीजा: success, partial, all-failed, cancelled, unknown |
result.hasErrors | boolean | अगर कम से कम एक आइटम असफल रहा तो true |
scheduleAt | string | शेड्यूल किया गया डिलीवरी समय (सिर्फ़ शेड्यूल किए गए बल्क ऑपरेशन के लिए) |
startedAt, completedAt | string | डिलीवरी कब शुरू हुई और कब पूरी हुई |
progress.succeeded बताता है कि संदेश सिस्टम ने सफलतापूर्वक आगे सौंप दिया। यह इस बात की गारंटी नहीं है कि Meta ने संदेश प्राप्तकर्ता तक पहुँचा दिया। Meta से बाद में आने वाले स्टेटस अपडेट (जैसे delivered, read या failed) इस काउंटर को प्रभावित नहीं करते और यहाँ दिखाई नहीं देते।
- show एंडपॉइंट: आइटम की डिलीवरी स्थिति दिखाता है (
pending,succeeded,failed,cancelled,unknown) - message-stats एंडपॉइंट: संदेश की असली स्थिति दिखाता है (
pending,sending,sent,delivered,read,errorआदि) - कोई आइटम
succeededहो सकता है, लेकिन हो सकता है कि संदेश अभी डिलीवर या पढ़ा न गया हो
रेफ़रेंस आईडी
referenceId एक वैकल्पिक फ़ील्ड है, जिससे आप ट्रैकिंग के लिए डिलीवरी आइटम का मिलान अपने सिस्टम की किसी आईडी (जैसे ऑर्डर नंबर, टिकट आईडी) से कर सकते हैं। यह हर आइटम पर payload.referenceId के रूप में लौटाया जाता है।
दिए जाने पर यह बल्क के भीतर यूनिक होना चाहिए (अधिकतम 256 वर्ण)।
- इस्तेमाल के लिए ज़रूरी नहीं है
- एक ही बल्क ऑपरेशन में दोहराया नहीं जा सकता
- अलग-अलग बल्क ऑपरेशन में दोबारा इस्तेमाल किया जा सकता है
Message Stats — WhatsApp संदेश की स्थिति
किसी बल्क ऑपरेशन के संदेश-स्थिति आँकड़े पाता है। show एंडपॉइंट के विपरीत, यह आइटम की स्थिति की जगह भेजे गए संदेशों का असली 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/v2/bulk-operation/message-stats.js
अनुरोध पैरामीटर
| पैरामीटर | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
bulkOperationId | string | हाँ | जिस बल्क ऑपरेशन के बारे में पूछना है उसकी आईडी |
{
"bulkOperationId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/message-stats.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkOperationId": "abc123xyz789"
}'
जवाब
{
"pending": 5,
"sending": 2,
"sent": 10,
"delivered": 45,
"read": 30,
"deleted": 2,
"warning": 1,
"error": 3,
"unknown": 0,
"not-sended": 2,
"no-message": 20,
"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 | आइटम की कुल संख्या |
- बल्क ऑपरेशन के
runningरहतेno-messageकी ज़्यादा गिनती बताती है कि डिलीवरी अभी जारी है deliveredकी गिनती सफल संदेश डिलीवरी दिखाती हैreadकी गिनती से कैंपेन के एंगेजमेंट को मापा जा सकता है- रीयल-टाइम ट्रैकिंग के लिए आप इस एंडपॉइंट को समय-समय पर पोल कर सकते हैं
Options की संरचना — पेजिनेशन, फ़िल्टरिंग और सॉर्टिंग
list और list-with-messages एंडपॉइंट में इस्तेमाल होने वाला options पैरामीटर पेजिनेशन, फ़िल्टरिंग और सॉर्टिंग के लिए एक मानक संरचना देता है।
Options फ़ील्ड
| फ़ील्ड | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
pagination | object | नहीं | पेजिनेशन सेटिंग |
filtering | object | नहीं | फ़िल्टरिंग मानदंड |
sorting | object | नहीं | सॉर्टिंग सेटिंग (जैसे {"position": 1}) |
Pagination की संरचना
अगर pagination नहीं भेजा जाता, तो पहला पेज अधिकतम 50 आइटम के साथ लौटाया जाता है। अगर भेजा जाता है, तो currentPage ज़रूरी है।
| फ़ील्ड | प्रकार | डिफ़ॉल्ट | विवरण |
|---|---|---|---|
currentPage | number | — | जो पेज नंबर पाना है (pagination भेजने पर ज़रूरी) |
pageItems | number | 50 | प्रति पेज आइटम की संख्या (अधिकतम: 50) |
Filtering की संरचना
फ़िल्टरिंग आइटम के फ़ील्ड पर MongoDB क्वेरी फ़ॉर्मैट में होती है, और फ़ील्ड के नाम ठीक वैसे ही इस्तेमाल होते हैं जैसे वे जवाब में दिखते हैं (जैसे status, payload.referenceId, result.messageId)। list-with-messages एंडपॉइंट में आप संदेश के फ़ील्ड (जैसे message.status) से भी फ़िल्टर कर सकते हैं।
// आइटम की स्थिति से फ़िल्टर करें
{
"options": {
"filtering": {
"status": "succeeded"
}
}
}
// referenceId से फ़िल्टर करें
{
"options": {
"filtering": {
"payload.referenceId": "ORDER-12345"
}
}
}
// संदेश की स्थिति से फ़िल्टर करें (सिर्फ़ list-with-messages)
{
"options": {
"filtering": {
"message.status": "delivered"
}
}
}
// $in (MongoDB ऑपरेटर) से कई स्थितियों के अनुसार फ़िल्टर करें
{
"options": {
"filtering": {
"message.status": {
"$in": ["delivered", "read"]
}
}
}
}
// $nin (MongoDB ऑपरेटर) से ख़ास स्थितियों को बाहर रखें
{
"options": {
"filtering": {
"message.status": {
"$nin": ["error", "not-sended"]
}
}
}
}
// बिना संदेश वाले आइटम सूचीबद्ध करें (सिर्फ़ list-with-messages)
{
"options": {
"filtering": {
"message": {
"$exists": false
}
}
}
}
Sorting की संरचना
सॉर्टिंग MongoDB सॉर्ट फ़ॉर्मैट में होती है। 1 का मतलब आरोही और -1 का मतलब अवरोही क्रम है। position अनुरोध के recipients ऐरे में प्राप्तकर्ता का क्रम है (0 से शुरू)।
// प्राप्तकर्ता जिस क्रम में अनुरोध में भेजे गए, उसी क्रम में सॉर्ट करें
{
"options": {
"sorting": {
"position": 1
}
}
}
// कई फ़ील्ड के अनुसार सॉर्ट करें
{
"options": {
"sorting": {
"status": 1,
"position": 1
}
}
}
संयुक्त उपयोग का उदाहरण
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 2,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
},
"sorting": {
"position": 1
}
}
}
यह उदाहरण डिलीवर हुए संदेशों का दूसरा पेज प्राप्तकर्ताओं के क्रम में सूचीबद्ध करता है।
- लक्षित क्वेरी के लिए
filteringऔरpaginationको साथ में इस्तेमाल करें - जवाब में नेविगेशन के लिए
options.pagination.totalCountऔरoptions.pagination.totalPagesशामिल होते हैं message.statusफ़िल्टर सिर्फ़list-with-messagesएंडपॉइंट में काम करता है
Items — आइटम का विवरण और सूची
किसी बल्क ऑपरेशन के सभी डिलीवरी आइटम सूचीबद्ध करता है। हर आइटम recipients ऐरे की एक प्रविष्टि को दर्शाता है।
List — आइटम सूची
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation-items/list.js
अनुरोध पैरामीटर
| पैरामीटर | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
bulkOperationId | string | हाँ | जिस बल्क ऑपरेशन की सूची चाहिए उसकी आईडी |
options | object | नहीं | पेजिनेशन, फ़िल्टरिंग, सॉर्टिंग विकल्प। विवरण के लिए Options की संरचना देखें। |
अनुरोध — बुनियादी उपयोग
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
अनुरोध — किसी ख़ास स्थिति से फ़िल्टर करें
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"status": "failed"
}
}
}
सिर्फ़ असफल डिलीवरी आइटम सूचीबद्ध करता है, और कारण error में होता है।
जवाब
{
"bulkOperationItems": [
{
"_id": "item_1",
"bulkOperationId": "abc123xyz789",
"bulkOperationBatchId": "batch_1",
"slug": "my-workspace",
"position": 0,
"payload": {
"username": "905554443301",
"referenceId": "ORDER-12345",
"payload": {
"template": {
"variables": [{ "type": "BODY", "parameters": ["Ahmet", "ORD-001"] }]
}
}
},
"status": "succeeded",
"attempt": 1,
"result": {
"userId": "user_123",
"sessionId": "session_456",
"messageId": "msg_789"
},
"createdAt": "2026-06-10T10:00:00.000Z",
"updatedAt": "2026-06-10T10:00:01.000Z",
"completedAt": "2026-06-10T10:00:01.000Z"
},
{
"_id": "item_2",
"bulkOperationId": "abc123xyz789",
"bulkOperationBatchId": "batch_1",
"slug": "my-workspace",
"position": 1,
"payload": { "username": "905554443302", "referenceId": "ORDER-12346" },
"status": "failed",
"attempt": 1,
"error": { "code": "error", "message": "Variable missing", "retryable": false },
"result": { "userId": "user_124", "sessionId": "session_457" },
"createdAt": "2026-06-10T10:00:00.000Z",
"updatedAt": "2026-06-10T10:00:01.000Z",
"completedAt": "2026-06-10T10:00:01.000Z"
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {},
"searching": {}
}
}
List With Messages — संदेश विवरण के साथ सूची
इसमें list एंडपॉइंट की सभी सुविधाएँ हैं (पेजिनेशन, फ़िल्टरिंग, सॉर्टिंग)। अंतर: हर आइटम में, अगर मौजूद हों, तो संबंधित message और session ऑब्जेक्ट भी होते हैं। इससे आप एक ही क्वेरी में संदेश की स्थिति (delivered, read, error आदि) और पेलोड देख सकते हैं।
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation-items/list-with-messages.js
अनुरोध — बुनियादी उपयोग
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
अनुरोध — संदेश की स्थिति से फ़िल्टर करें
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
}
}
}
यह उदाहरण सिर्फ़ "delivered" स्थिति वाले संदेश लाता है।
अनुरोध — असफल संदेश सूचीबद्ध करें
{
"bulkOperationId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "error"
}
}
}
डिलीवरी एरर वाले संदेशों की समीक्षा के लिए इस्तेमाल होता है।
जवाब
{
"bulkOperationItems": [
{
"_id": "item_1",
"bulkOperationId": "abc123xyz789",
"position": 0,
"payload": { "username": "905554443301", "referenceId": "ORDER-12345" },
"status": "succeeded",
"result": {
"userId": "user_123",
"sessionId": "session_456",
"messageId": "msg_789"
},
"message": {
"_id": "msg_789",
"type": "template",
"status": "delivered",
"payload": {
"template": {
"name": "order_notification"
}
},
"createdAt": "2026-06-10T10:01:00.000Z"
},
"session": {
"_id": "session_456",
"status": "opened"
}
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {},
"searching": {}
}
}
आइटम फ़ील्ड
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
_id | string | आइटम आईडी |
bulkOperationId | string | वह बल्क ऑपरेशन आईडी जिससे यह आइटम जुड़ा है |
position | number | अनुरोध के recipients ऐरे में प्राप्तकर्ता का क्रम, 0 से शुरू |
payload | object | प्राप्तकर्ता ठीक वैसा ही जैसा अनुरोध में भेजा गया (username / userId / sessionId, referenceId, payload, isMerge) |
status | string | आइटम की स्थिति: pending, succeeded, failed, cancelled, unknown |
error | object | सिर्फ़ failed आइटम पर: code, message और retryable |
result.userId | string | प्राप्तकर्ता उपयोगकर्ता आईडी |
result.sessionId | string | बातचीत सेशन आईडी |
result.messageId | string | भेजे गए संदेश की आईडी (अगर कोई संदेश नहीं भेजा गया तो मौजूद नहीं) |
completedAt | string | आइटम कब प्रोसेस हुआ |
message | object | संदेश का विवरण (सिर्फ़ list-with-messages में) |
session | object | बातचीत का विवरण (सिर्फ़ list-with-messages में) |
List बनाम List-With-Messages की तुलना
| सुविधा | list | list-with-messages |
|---|---|---|
| पेजिनेशन | हाँ | हाँ |
| फ़िल्टरिंग | हाँ (सिर्फ़ आइटम फ़ील्ड) | हाँ (आइटम + संदेश फ़ील्ड) |
| Message / Session | नहीं | हाँ (अगर मौजूद हों) |
| परफ़ॉर्मेंस | तेज़ | मध्यम (JOIN करता है) |
| message.status फ़िल्टर | उपलब्ध नहीं | उपलब्ध |
- list: सभी आइटम जल्दी सूचीबद्ध करें, referenceId से फ़िल्टर करें, आइटम की स्थिति जाँचें
- list-with-messages: WhatsApp संदेशों की स्थिति (delivered, read) देखें, संदेश पेलोड जाँचें
- फ़िल्टरिंग के उदाहरण:
{"status": "failed"}— असफल डिलीवरी आइटम{"payload.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){"message": {"$exists": false}}— बिना संदेश वाले आइटम (सिर्फ़ list-with-messages){"status": {"$in": ["succeeded", "pending"]}}— वे आइटम जो सफल या लंबित हैं
listएंडपॉइंट तेज़ है; सामान्य स्थिति जाँच के लिए इसे प्राथमिकता दें- जब संदेश का विवरण चाहिए, तब
list-with-messagesइस्तेमाल करें - प्रति पेज अधिकतम आइटम (pageItems) 50 हैं; न बताने पर डिफ़ॉल्ट 50 है
message.statusफ़िल्टर सिर्फ़list-with-messagesमें काम करता है- जिन आइटम में
result.messageIdनहीं है, उनमेंmessageऑब्जेक्ट नहीं होता
Stop — डिलीवरी रद्द करें
चल रही बल्क ऑपरेशन डिलीवरी रोकता है। सभी pending आइटम cancelled स्थिति में चले जाते हैं और बल्क ऑपरेशन stopped हो जाता है। जो आइटम पहले ही succeeded या failed के रूप में प्रोसेस हो चुके हैं, वे प्रभावित नहीं होते। शेड्यूल किए गए बल्क ऑपरेशन को उसके scheduleAt समय से पहले भी रोका जा सकता है।
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/stop.js
इस कार्रवाई को पलटा नहीं जा सकता। रोकी गई डिलीवरी दोबारा शुरू नहीं की जा सकती।
अनुरोध पैरामीटर
| पैरामीटर | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
bulkOperationId | string | हाँ | जिस बल्क ऑपरेशन को रोकना है उसकी आईडी |
{
"bulkOperationId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/v2/bulk-operation/stop.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkOperationId": "abc123xyz789"
}'
जवाब
सफल अनुरोध के लिए जवाब की बॉडी ख़ाली होती है। HTTP 200 स्टेटस बताता है कि ऑपरेशन सफलतापूर्वक पूरा हुआ।
{}
- सिर्फ़ इसी API से बनाए गए बल्क ऑपरेशन रोके जा सकते हैं
- डिलीवरी रोकने के बाद, आप रद्द किए गए आइटम की संख्या (
bulkOperation.progress.cancelled) जाँचने के लिएshowएंडपॉइंट इस्तेमाल कर सकते हैं - अगर बल्क ऑपरेशन नहीं मिलता, तो API यह एरर लौटाती है:
Bulk operation not found.