मुख्य कंटेंट तक स्किप करें

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 इस्तेमाल करना चाहिए।

  1. एंडपॉइंट पाथ को v2 पर ले जाएँ: …/api/bulk-message/… बदलकर …/api/v2/bulk-operation/… हो जाता है, और …/api/bulk-message-records/… बदलकर …/api/v2/bulk-operation-items/… हो जाता है। send अनुरोध की बॉडी नहीं बदलती; एक अनुरोध में अब 5,000 की जगह 100,000 तक प्राप्तकर्ता आ सकते हैं।
  2. अनुरोधों में bulkMessageId की जगह bulkOperationId भेजें।
  3. stats.js की जगह show.js इस्तेमाल करें।
  4. जवाबों को नीचे दी गई तालिका के नए फ़ील्ड नामों के साथ पढ़ें।

v2 एंडपॉइंट सिर्फ़ उन्हीं बल्क ऑपरेशन को जानते हैं जो v2 send से बनाए गए हों। स्विच करने से पहले v1 से बनाए गए किसी बल्क संदेश को ट्रैक करने के लिए, उसके लिए v1 एंडपॉइंट ही इस्तेमाल करते रहें।

एंडपॉइंट​

v1v2जवाब में क्या बदलता है
bulk-message/send.jsv2/bulk-operation/send.js{ bulkMessageId } बदलकर { bulkOperationId } हो जाता है
bulk-message/stats.jsv2/bulk-operation/show.js{ bulkMessage, stats } बदलकर { bulkOperation } हो जाता है
bulk-message/message-stats.jsv2/bulk-operation/message-stats.jsकाउंटर messageStats के अंदर की जगह रूट पर होते हैं
bulk-message/stop.jsv2/bulk-operation/stop.jsकुछ नहीं
bulk-message-records/list.jsv2/bulk-operation-items/list.jsbulkMessageRecords बदलकर bulkOperationItems हो जाता है
bulk-message-records/list-with-messages.jsv2/bulk-operation-items/list-with-messages.jslist जैसा ही, और हर आइटम में session भी होता है

फ़ील्ड के नाम​

v1v2
stats.successbulkOperation.progress.succeeded
stats.pending, stats.failed, stats.cancelled, stats.totalbulkOperation.progress.pending, .failed, .cancelled, .total
—bulkOperation.progress.unknown, bulkOperation.status, bulkOperation.result.outcome
bulkMessage (बल्क संदेश)bulkOperation (बल्क ऑपरेशन)
bulkMessageRecord (रिकॉर्ड)bulkOperationItem (आइटम)
अनुरोधों में, send के जवाब में और रिकॉर्ड पर bulkMessageIdbulkOperationId
रिकॉर्ड का username / userId / sessionId, जैसा भेजा गयाpayload.username / payload.userId / payload.sessionId
रिकॉर्ड का referenceIdpayload.referenceId
रिकॉर्ड का payload (प्राप्तकर्ता का टेम्पलेट पेलोड)payload.payload
भेजने के बाद रिकॉर्ड का userId, sessionId, messageIdresult.userId, result.sessionId, result.messageId
रिकॉर्ड की स्थिति successsucceeded
असफल रिकॉर्ड पर रिकॉर्ड का errorMessageerror.message, error.code और error.retryable के साथ
—position (recipients में प्राप्तकर्ता का इंडेक्स)
फ़िल्टर {"status": "success"}{"status": "succeeded"}
फ़िल्टर {"referenceId": "…"}{"payload.referenceId": "…"}
send के एरर schema-error, invalidRequestzod-schema-error, संदेश में अमान्य फ़ील्ड के पाथ के साथ

मुख्य विशेषताएँ​

  • एक ही अनुरोध में 1–100,000 प्राप्तकर्ताओं को बल्क टेम्पलेट संदेश भेजें
  • हर प्राप्तकर्ता के लिए वैयक्तिकृत वेरिएबल (HEADER, BODY, BUTTONS, CAROUSEL)
  • सभी प्राप्तकर्ताओं के लिए साझा defaultPayload, और प्राप्तकर्ता-विशिष्ट payload के साथ मर्ज (isMerge)
  • शेड्यूल्ड डिलीवरी (scheduleAt)
  • username (फ़ोन नंबर), userId या sessionId से प्राप्तकर्ता तय करें
  • एक ही बल्क अनुरोध में एक ही उपयोगकर्ता को कई संदेश भेजें
  • बाहरी सिस्टम के साथ रिकॉर्ड ट्रैक करने के लिए वैकल्पिक referenceId
  • भेजने के बाद बातचीत को अपने आप किसी उपयोगकर्ता या वर्कग्रुप को सौंपें (action)
चेतावनी

यह API सिर्फ़ वही टेम्पलेट भेज सकती है जो Meta से मंज़ूर हों।

टेम्पलेट का नाम और भाषा कोड ठीक वही होने चाहिए जो Meta Business Manager में रजिस्टर्ड टेम्पलेट का है।

अनुरोध पैरामीटर​

टॉप-लेवल पैरामीटर​

पैरामीटरप्रकारज़रूरीविवरण
channelUsernamestringहाँसंदेश भेजने के लिए इस्तेमाल होने वाला WhatsApp चैनल नंबर (जैसे "908506669933")
connectorBrandstringहाँचैनल कनेक्टर ब्रांड। फ़िलहाल समर्थित मान: "whatsapp"
titlestringनहींकैंपेन का शीर्षक। डैशबोर्ड में दिखाने के लिए इस्तेमाल होता है। डिफ़ॉल्ट: "-"
scheduleAtstring (ISO 8601)नहींशेड्यूल की गई डिलीवरी की तारीख़ और समय (जैसे "2026-06-10T10:00:00.000Z")। छोड़ने पर संदेश तुरंत भेजे जाते हैं।
defaultPayloadobjectसशर्त*सभी प्राप्तकर्ताओं पर लागू होने वाला डिफ़ॉल्ट टेम्पलेट पेलोड। अगर किसी प्राप्तकर्ता का अपना payload नहीं है तो ज़रूरी है।
recipientsarrayहाँप्राप्तकर्ताओं की सूची। कम से कम 1, अधिकतम 100,000 प्राप्तकर्ता।
actionobjectनहींभेजने के बाद बातचीत पर लागू होने वाली कार्रवाई। assign-to-user या assign-to-workgroup।

*अगर हर प्राप्तकर्ता अपना payload देता है, तो defaultPayload वैकल्पिक है।

प्राप्तकर्ता की संरचना​

हर प्राप्तकर्ता के लिए username, userId या sessionId में से ठीक एक देना ज़रूरी है। एक से ज़्यादा पहचानकर्ता साथ में इस्तेमाल नहीं किए जा सकते, और सब छोड़ देने पर एरर आएगा।

एक ही बल्क अनुरोध में एक ही उपयोगकर्ता को कई संदेश भेजने के लिए, वही पहचानकर्ता प्राप्तकर्ता सूची में कई बार जोड़ें।

फ़ील्डप्रकारविवरण
usernamestringप्राप्तकर्ता का फ़ोन नंबर (जैसे "905554443322")। अगर उपयोगकर्ता सिस्टम में नहीं है, तो वह अपने आप बना दिया जाता है।
userIdstringसिस्टम में मौजूद किसी उपयोगकर्ता की आईडी।
sessionIdstringसिस्टम में मौजूद किसी बातचीत सेशन की आईडी।
referenceIdstringबाहरी सिस्टम के रिकॉर्ड (CRM, ऑर्डर, टिकट आदि) से मिलान के लिए वैकल्पिक रेफ़रेंस आईडी (अधिकतम 256 वर्ण)। दिए जाने पर बल्क के भीतर यूनिक होनी चाहिए।
payloadobjectप्राप्तकर्ता-विशिष्ट टेम्पलेट पेलोड (वैकल्पिक)। अगर isMerge: true है, तो इसे defaultPayload के साथ मर्ज किया जाता है।
isMergebooleanइस प्राप्तकर्ता के लिए मर्ज व्यवहार को बदलता है (वैकल्पिक)। छोड़ने पर defaultPayload.isMerge इस्तेमाल होता है।

Action की संरचना​

फ़ील्डप्रकारविवरण
action.keystring"assign-to-user" बातचीत को किसी ख़ास एजेंट को सौंपता है; "assign-to-workgroup" उसे किसी वर्कग्रुप को सौंपता है।
action.valuestringलक्ष्य उपयोगकर्ता या वर्कग्रुप की आईडी।

टेम्पलेट पेलोड की संरचना​

defaultPayload और प्राप्तकर्ता-विशिष्ट payload की संरचना एक जैसी होती है। टेम्पलेट संदेशों के लिए type: "template" देना ज़रूरी है।

{
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR",
"variables": []
},
"isMerge": true
}
फ़ील्डप्रकारज़रूरीविवरण
typestringहाँपेलोड का प्रकार। टेम्पलेट संदेशों के लिए: "template"
template.templateNamestringहाँ*Meta में रजिस्टर्ड टेम्पलेट का नाम। isMerge: true इस्तेमाल करने पर प्राप्तकर्ता पेलोड में वैकल्पिक (डिफ़ॉल्ट से विरासत में मिलता है)।
template.languageCodestringनहींटेम्पलेट का भाषा कोड (जैसे "tr", "en", "tr-TR", "en-US")। यह Meta में रजिस्टर्ड भाषा से ठीक मेल खाना चाहिए।
template.variablesarrayनहींटेम्पलेट कंपोनेंट पर लागू होने वाले वेरिएबल की सूची। नीचे विस्तार से।
isMergebooleanनहींtrue: प्राप्तकर्ता पेलोड defaultPayload के साथ डीप-मर्ज होता है। false या छोड़ा गया: प्राप्तकर्ता पेलोड defaultPayload को पूरी तरह बदल देता है।
isMerge का व्यवहार
  • अगर defaultPayload.isMerge: true है और प्राप्तकर्ता अपना payload देता है, तो डीप मर्ज लागू होता है।
  • डीप मर्ज में प्राप्तकर्ता सिर्फ़ variables दे सकता है; templateName और languageCode डिफ़ॉल्ट पेलोड से विरासत में मिलते हैं।
  • प्राप्तकर्ता का isMerge फ़ील्ड defaultPayload.isMerge को बदल देता है।
  • अगर प्राप्तकर्ता payload नहीं देता, तो हमेशा defaultPayload इस्तेमाल होता है।

वेरिएबल की संरचना​

variables ऐरे का हर आइटम एक टेम्पलेट कंपोनेंट से मेल खाता है। एक कंपोनेंट प्रकार (type) ऐरे में सिर्फ़ एक बार आ सकता है।

typeविवरणparameterscards
"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"]
}

कैरोसेल टेम्पलेट के लिए, कंपोनेंट वेरिएबल हर कार्ड के लिए अलग से तय किए जाते हैं।

{
"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" }
}
]
}
}
}
]
}
सुझाव
  • scheduleAt UTC टाइम ज़ोन में देना ज़रूरी है (जैसे तुर्किये के समय के अनुसार सुबह 10:00 बजे के लिए 07:00:00.000Z इस्तेमाल करें)
  • यह उदाहरण नामित पैरामीटर फ़ॉर्मैट इस्तेमाल करता है; टेम्पलेट में {{name}} और {{discountRate}} जैसे प्लेसहोल्डर होने चाहिए
  • action के साथ, संदेश भेजने से बनी बातचीत अपने आप बताए गए वर्कग्रुप को सौंप दी जाती हैं

जवाब​

सफल अनुरोध एक bulkOperationId लौटाता है, जिसे डिलीवरी प्रक्रिया ट्रैक करने के लिए इस्तेमाल किया जा सकता है:

{
"bulkOperationId": "abc123xyz789"
}

एरर जवाब​

स्टेटसविवरण
recipients field is requiredrecipients फ़ील्ड नहीं भेजा गया
Channel not foundchannelUsername और 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

अनुरोध पैरामीटर​

पैरामीटरप्रकारज़रूरीविवरण
bulkOperationIdstringहाँट्रैक किए जाने वाले बल्क ऑपरेशन की आईडी (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 के अंदर होते हैं।

फ़ील्डप्रकारविवरण
statusstringबल्क ऑपरेशन की स्थिति: preparing, scheduled, pending, running, stopping, stopped, completed, failed
progress.totalnumberआइटम की कुल संख्या
progress.pendingnumberवे आइटम जो अब भी कतार में इंतज़ार कर रहे हैं
progress.succeedednumberडिलीवरी के लिए सफलतापूर्वक प्रोसेस हुए आइटम
progress.failednumberवे आइटम जिनमें डिलीवरी एरर आया
progress.cancellednumberstop से रद्द किए गए आइटम
progress.unknownnumberवे आइटम जिनका नतीजा तय नहीं हो सका
result.outcomestringबल्क ऑपरेशन पूरा होने के बाद का अंतिम नतीजा: success, partial, all-failed, cancelled, unknown
result.hasErrorsbooleanअगर कम से कम एक आइटम असफल रहा तो true
scheduleAtstringशेड्यूल किया गया डिलीवरी समय (सिर्फ़ शेड्यूल किए गए बल्क ऑपरेशन के लिए)
startedAt, completedAtstringडिलीवरी कब शुरू हुई और कब पूरी हुई
नोट

progress.succeeded बताता है कि संदेश सिस्टम ने सफलतापूर्वक आगे सौंप दिया। यह इस बात की गारंटी नहीं है कि Meta ने संदेश प्राप्तकर्ता तक पहुँचा दिया। Meta से बाद में आने वाले स्टेटस अपडेट (जैसे delivered, read या failed) इस काउंटर को प्रभावित नहीं करते और यहाँ दिखाई नहीं देते।

Show बनाम Message Stats
  • 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

अनुरोध पैरामीटर​

पैरामीटरप्रकारज़रूरीविवरण
bulkOperationIdstringहाँजिस बल्क ऑपरेशन के बारे में पूछना है उसकी आईडी
{
"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 फ़ील्ड​

फ़ील्डप्रकारविवरण
pendingnumberजो संदेश अभी भेजे नहीं गए
sendingnumberजो संदेश अभी भेजे जा रहे हैं
sentnumberजो संदेश WhatsApp को सौंपे गए, अभी डिलीवर नहीं हुए
deliverednumberजो संदेश प्राप्तकर्ता के फ़ोन तक डिलीवर हुए
readnumberजो संदेश प्राप्तकर्ता ने पढ़ लिए
deletednumberहटाए गए संदेश
warningnumberचेतावनी वाले संदेश
errornumberएरर वाले संदेश
unknownnumberअज्ञात स्थिति वाले संदेश
not-sendednumberजो संदेश भेजे नहीं जा सके
no-messagenumberबिना संदेश वाले आइटम (अब भी कतार में, असफल या रद्द)
totalnumberआइटम की कुल संख्या
उपयोग के सुझाव
  • बल्क ऑपरेशन के running रहते no-message की ज़्यादा गिनती बताती है कि डिलीवरी अभी जारी है
  • delivered की गिनती सफल संदेश डिलीवरी दिखाती है
  • read की गिनती से कैंपेन के एंगेजमेंट को मापा जा सकता है
  • रीयल-टाइम ट्रैकिंग के लिए आप इस एंडपॉइंट को समय-समय पर पोल कर सकते हैं

Options की संरचना — पेजिनेशन, फ़िल्टरिंग और सॉर्टिंग​

list और list-with-messages एंडपॉइंट में इस्तेमाल होने वाला options पैरामीटर पेजिनेशन, फ़िल्टरिंग और सॉर्टिंग के लिए एक मानक संरचना देता है।

Options फ़ील्ड​

फ़ील्डप्रकारज़रूरीविवरण
paginationobjectनहींपेजिनेशन सेटिंग
filteringobjectनहींफ़िल्टरिंग मानदंड
sortingobjectनहींसॉर्टिंग सेटिंग (जैसे {"position": 1})

Pagination की संरचना​

अगर pagination नहीं भेजा जाता, तो पहला पेज अधिकतम 50 आइटम के साथ लौटाया जाता है। अगर भेजा जाता है, तो currentPage ज़रूरी है।

फ़ील्डप्रकारडिफ़ॉल्टविवरण
currentPagenumber—जो पेज नंबर पाना है (pagination भेजने पर ज़रूरी)
pageItemsnumber50प्रति पेज आइटम की संख्या (अधिकतम: 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

अनुरोध पैरामीटर​

पैरामीटरप्रकारज़रूरीविवरण
bulkOperationIdstringहाँजिस बल्क ऑपरेशन की सूची चाहिए उसकी आईडी
optionsobjectनहींपेजिनेशन, फ़िल्टरिंग, सॉर्टिंग विकल्प। विवरण के लिए 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": {}
}
}

आइटम फ़ील्ड​

फ़ील्डप्रकारविवरण
_idstringआइटम आईडी
bulkOperationIdstringवह बल्क ऑपरेशन आईडी जिससे यह आइटम जुड़ा है
positionnumberअनुरोध के recipients ऐरे में प्राप्तकर्ता का क्रम, 0 से शुरू
payloadobjectप्राप्तकर्ता ठीक वैसा ही जैसा अनुरोध में भेजा गया (username / userId / sessionId, referenceId, payload, isMerge)
statusstringआइटम की स्थिति: pending, succeeded, failed, cancelled, unknown
errorobjectसिर्फ़ failed आइटम पर: code, message और retryable
result.userIdstringप्राप्तकर्ता उपयोगकर्ता आईडी
result.sessionIdstringबातचीत सेशन आईडी
result.messageIdstringभेजे गए संदेश की आईडी (अगर कोई संदेश नहीं भेजा गया तो मौजूद नहीं)
completedAtstringआइटम कब प्रोसेस हुआ
messageobjectसंदेश का विवरण (सिर्फ़ list-with-messages में)
sessionobjectबातचीत का विवरण (सिर्फ़ list-with-messages में)

List बनाम List-With-Messages की तुलना​

सुविधाlistlist-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
चेतावनी

इस कार्रवाई को पलटा नहीं जा सकता। रोकी गई डिलीवरी दोबारा शुरू नहीं की जा सकती।

अनुरोध पैरामीटर​

पैरामीटरप्रकारज़रूरीविवरण
bulkOperationIdstringहाँजिस बल्क ऑपरेशन को रोकना है उसकी आईडी
{
"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.