WhatsApp संदेश भेजना
यह गाइड भेजने वाले एंडपॉइंट, POST /v1/whatsapp/messages, के बारे में है। आप एक JSON पेलोड बनाते हैं, जिसमें एक प्राप्तकर्ता और ठीक एक प्रकार की सामग्री होती है: पहले से स्वीकृत टेम्पलेट, या ऐसा सर्विस संदेश जिसमें टेक्स्ट, इमेज, वीडियो, ऑडियो, स्टिकर, दस्तावेज़, लोकेशन, संपर्क कार्ड या टैप करने लायक कोई चीज़ हो। Bird एक संदेश ID के साथ 202 Accepted लौटाता है और संदेश को एसिंक्रोनस रूप से डिलीवर करता है। इन दोनों में से आप कौन-सा भेज सकते हैं, यह ग्राहक सेवा विंडो पर निर्भर करता है। हर अनुरोध एक प्राप्तकर्ता को एक संदेश भेजता है, और कोई बैच एंडपॉइंट नहीं है।
न्यूनतम भेजने का उदाहरण
सबसे छोटे मान्य पेलोड में एक to प्राप्तकर्ता और उसके slug के साथ एक template होता है। कोई खास भाषा चाहिए तो language जोड़ें; इसे छोड़ने पर टेम्पलेट की डिफ़ॉल्ट भाषा भेजी जाती है। टेम्पलेट जो भी वेरिएबल घोषित करता है, उन्हें components के ज़रिए भरें।
curl कॉल में US होस्ट दिया गया है; अगर आपकी कुंजी bk_eu1_ से शुरू होती है, तो उसकी जगह https://eu1.platform.bird.com को कॉल करें। SDK आपकी कुंजी से रीजन पढ़ लेते हैं, इसलिए वे कोई होस्ट सेट नहीं करते।
const msg = await bird.whatsapp.send({
to: "+15551234567",
template: {
slug: "bird_otp",
components: [{ type: "body", parameters: [{ type: "text", text: "123456" }] }],
},
});
console.log(msg.id, msg.status);msg = client.whatsapp.send(
to="+31612345678",
template="bird_otp",
language="en",
components=[{"type": "body", "parameters": [{"type": "text", "text": "123456"}]}],
)
print(msg.id, msg.status)code := "123456"
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+15551234567",
Template: "bird_otp",
Language: "en",
Components: []bird.WhatsAppMessageTemplateComponent{{
Type: "body",
Parameters: &[]bird.WhatsAppMessageTemplateComponentParameter{{Type: "text", Text: &code}},
}},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)$message = $bird->whatsapp->send(
to: '+15551234567',
template: 'bird_otp',
language: 'en',
components: [
(new WhatsAppMessageTemplateComponent())
->setType('body')
->setParameters([
(new WhatsAppMessageTemplateComponentParameter())->setType('text')->setText('123456'),
]),
],
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--components '[{"parameters":[{"text":"1234","type":"text"}],"type":"body"},{"parameters":[{"text":"1234","type":"text"}],"type":"button"}]' \
--language en \
--template bird_otp \
--to +31612345678curl -X POST "https://{region}.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "+31612345678",
"template": {
"slug": "bird_otp",
"language": "en",
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "1234"
}
]
},
{
"type": "button",
"parameters": [
{
"type": "text",
"text": "1234"
}
]
}
]
}
}'ग्राहक सेवा विंडो
इन दोनों में से आप कौन-सा भेज सकते हैं, यह एक ही स्थिति पर निर्भर करता है: ग्राहक सेवा विंडो खुली है या नहीं।
संपर्क आपके बिज़नेस नंबर पर संदेश भेजकर या कॉल करके विंडो खोलता है। विंडो 24 घंटे खुली रहती है, और हर बार जब वह आपको फिर से संदेश भेजता है, यह अवधि नए सिरे से शुरू होती है। विंडो खुली रहने तक आप सर्विस संदेश भेज सकते हैं, यानी कोई भी फ़्री-फ़ॉर्म सामग्री: टेक्स्ट, इमेज, वीडियो, ऑडियो, स्टिकर, दस्तावेज़, लोकेशन या इंटरैक्टिव संदेश। विंडो बंद होने के बाद केवल पहले से स्वीकृत टेम्पलेट ही उन तक पहुँचता है, और उस पर उनका जवाब विंडो को फिर से खोल देता है।
Bird आपके लिए विंडो पर नज़र रखता है, इसलिए बंद विंडो में भेजा गया सर्विस संदेश कुछ भी बनने या शुल्क लगने से पहले ही अस्वीकार कर दिया जाता है: अनुरोध 422 E15044 WhatsAppServiceWindowClosed लौटाता है। यह जाँच पूरी तरह भरोसेमंद नहीं है और अनिश्चित स्थिति में संदेश को आगे जाने देती है, इसलिए 202 इस बात का प्रमाण नहीं है कि भेजते समय विंडो सच में खुली थी। अगर स्वीकार होने और भेजे जाने के बीच विंडो बंद हो जाए, तो संदेश एसिंक्रोनस रूप से विफल होता है, और संदेश के last_error पर service_window_expired दिखता है।
पूरे जीवनचक्र के लिए ग्राहक सेवा विंडो देखें: विंडो किससे खुलती है, किससे नए सिरे से शुरू होती है, और मूल्य निर्धारण पर उसका क्या असर होता है।
पेलोड तैयार करना
प्राप्तकर्ता
to एक गंतव्य बताता है, जो फ़ोन नंबर, बिज़नेस-स्कोप्ड यूज़र ID या ग्रुप ID के रूप में दिया जाता है। फ़ोन नंबर E.164 फ़ॉर्मैट में होता है: शुरुआत में +, फिर देश कोड और सब्सक्राइबर नंबर, जैसे +14155550100। हम नंबर की जाँच करते हैं, इसलिए जो मान असली और डायल करने योग्य नंबर नहीं हो सकता (गलत लंबाई, अनअसाइन्ड प्रीफ़िक्स), उसे कोई शुल्क लगने से पहले 422 WhatsAppInvalidRecipient के साथ अस्वीकार कर दिया जाता है। प्राप्तकर्ताओं की कोई array और कोई बैच भेजना नहीं है, इसलिए जो लोग एक ग्रुप में नहीं हैं, उन तक पहुँचने के लिए हर प्राप्तकर्ता के लिए एक कॉल करनी होती है।
US.13491208655302741918 जैसी बिज़नेस-स्कोप्ड यूज़र ID ऐसे संपर्क को संबोधित करती है जिसका फ़ोन नंबर आपके पास नहीं है। इसी तरह आप उस संपर्क को जवाब देते हैं जिसने बिना नंबर के आपसे संपर्क किया। इसमें दो बातें बदलती हैं: भेजने वाला नंबर उसी बिज़नेस पोर्टफ़ोलियो का होना चाहिए जिस तक ID सीमित है, और वन-टाइम-सत्यापन कोड टेम्पलेट के लिए फ़ोन नंबर ज़रूरी है। Bird-प्रबंधित ऐसा टेम्पलेट स्वीकार करते समय ही 422 WhatsAppRecipientNotSupportedForTemplate के साथ अस्वीकार हो जाता है। आपके वर्कस्पेस का बनाया ऑथेंटिकेशन टेम्पलेट स्वीकार हो जाता है और फिर विफल होता है, क्योंकि Meta को इसके लिए फ़ोन नंबर चाहिए।
to एक और रूप भी लेता है: wag_01krdgeqcxet5s7t44vh8rt9mg जैसी WhatsApp ग्रुप ID, जो उस ग्रुप चैट के हर प्रतिभागी को संदेश भेजती है। ग्रुप में भेजने पर from छोड़ दिया जाता है और डिलीवरी एक प्राप्तकर्ता के बजाय पूरे ग्रुप के लिए रिपोर्ट होती है, इसलिए WhatsApp ग्रुप को भेजना इसे अलग पेज पर समझाता है।
टेम्पलेट
template भेजे जाने वाले पूर्व-स्वीकृत टेम्पलेट को बताता है:
slug(ज़रूरी): टेम्पलेट का slug, जैसेbird_order_confirmation। यह आपके कैटलॉग के किसी टेम्पलेट से मेल खाना चाहिए (छोटे अक्षर, अंक और अंडरस्कोर)।language: टेम्पलेट का भाषा टैग, जैसेenयाpt-BR। टेम्पलेट की डिफ़ॉल्ट भाषा भेजने के लिए इसे छोड़ दें। अगर आप ऐसी भाषा देते हैं जो टेम्पलेट में नहीं है, तो422लौटता है जिसमें उपलब्ध भाषाएँ सूचीबद्ध होती हैं। स्वीकार किया गया संदेश तय हुई भाषा वापस दिखाता है।components: वे मान जो टेम्पलेट के वेरिएबल भरते हैं (देखें कंपोनेंट और पैरामीटर)। जिस टेम्पलेट में वेरिएबल नहीं हैं, उसके लिए इसे छोड़ दें।
अपने टेम्पलेट, उनकी भाषाएँ और हर एक का रेंडर किया गया प्रीव्यू टेम्पलेट पेज पर देखें।
कंपोनेंट और पैरामीटर
टेम्पलेट में वेरिएबल होते हैं, नाम वाले ({{ref}}, {{amount}}) या क्रमांक वाले ({{1}}, {{2}})। इनके मान आप components के ज़रिए देते हैं। हर कंपोनेंट एक type (body या button) और एक parameters ऐरे बताता है। हर पैरामीटर अपना type (text, image, video, gif, document या location) बताता है और उससे मेल खाता फ़ील्ड रखता है: text में एक सादी स्ट्रिंग, image/video/gif/document में एक सार्वजनिक https url, और location में नक्शे पर एक बिंदु। नाम वाले पैरामीटर वाले टेम्पलेट में हर पैरामीटर पर name ज़रूरी है, जो टेम्पलेट में घोषित नामों से ठीक-ठीक मेल खाना चाहिए (फ़ील्ड संदर्भ देखें)। क्रम-आधारित टेम्पलेट name छोड़ देता है और अपने मान {{n}} क्रम में लेता है, इसलिए पहला पैरामीटर {{1}} भरता है। दोनों ही स्थितियों में, जो पैरामीटर टेम्पलेट की घोषणा से मेल नहीं खाते, उन पर 422 WhatsAppTemplateParameterMismatch लौटता है। वायर पर एक header कंपोनेंट टाइप भी मौजूद है: Bird-प्रबंधित टेम्पलेट पर इसे हटा दिया जाता है, क्योंकि कोई भी Bird-प्रबंधित टेम्पलेट हेडर वेरिएबल घोषित नहीं करता। आपके वर्कस्पेस द्वारा बनाए गए टेम्पलेट पर इसे आगे भेजा जाता है, और इसी तरह मीडिया-हेडर वाले यूटिलिटी या मार्केटिंग टेम्पलेट को अपनी इमेज मिलती है।
उदाहरण के लिए, एक वन-टाइम सत्यापन कोड टेम्पलेट, जिसका बॉडी टेक्स्ट {{1}} is your verification code है और जिसका बटन कोड कॉपी करता है, कोड को बॉडी पैरामीटर और बटन पैरामीटर दोनों के रूप में क्रम से लेता है (name के बिना):
{
"components": [
{ "type": "body", "parameters": [{ "type": "text", "text": "481920" }] },
{ "type": "button", "parameters": [{ "type": "text", "text": "481920" }] }
]
}श्रेणी और प्रेषक
टेम्पलेट की श्रेणी (authentication, utility या marketing) तय करती है कि WhatsApp मैसेज को कैसे संभालता है, और गंतव्य देश के साथ मिलकर यह भी कि उसकी लागत कितनी होगी।
प्रेषक किसका है, इससे तय होता है कि आपको उसे बताना है या नहीं:
- Bird-प्रबंधित टेम्पलेट (जिसका स्लग
bird_से शुरू होता है) उस नंबर से भेजा जाता है जो Bird उस श्रेणी के लिए रखता है, इसलिएfromन दें। इसे सेट करने पर422WhatsAppSenderNotAllowedलौटता है। - बाकी सब कुछ अपना प्रेषक
fromमें बताता है: किसी भी टाइप का सर्विस मैसेज, और आपके वर्कस्पेस द्वारा बनाया गया कोई भी टेम्पलेट। नंबर आपके वर्कस्पेस का होना चाहिए। इसे छोड़ने पर422WhatsAppSenderRequiredलौटता है, और जिस नंबर से वर्कस्पेस भेज नहीं सकता, उस पर422WhatsAppSenderNotFoundलौटता है। बनाया गया टेम्पलेट भी उसी WhatsApp Business Account पर होना चाहिए जिस पर नंबर है, वरना भेजने पर422WhatsAppSenderWABAMismatchलौटता है।
फ़ोन नंबर सेटअप में दोनों तरह के नंबर और अपना नंबर जोड़ने का तरीका बताया गया है।
सर्विस मैसेज
template की जगह text, image, video, audio, sticker, document, location, contact_cards या interactive में से ठीक एक भेजें। ये नौ सभी सर्विस मैसेज हैं, इसलिए इनके लिए ग्राहक सेवा विंडो खुली होनी चाहिए। इनमें से हर एक के लिए from भी ज़रूरी है, जो आपके वर्कस्पेस का नंबर हो; Bird के प्रबंधित नंबर इन्हें नहीं भेज सकते।
text:{ "body": "..." }, अधिकतम 4,096 अक्षर।bodyमें पहले URL का लिंक प्रीव्यू दिखाने के लिए"preview_url": trueजोड़ें।image,video,audio,sticker,document: हर एक एक सार्वजनिकhttpsURL लेता है, जिसे WhatsApp भेजते समय फ़ेच करता है (url), इसलिए साइन किया गया URL भेजने की प्रक्रिया पूरी होने तक मान्य रहना चाहिए।httpURL सीधे अस्वीकार कर दिया जाता है। फ़ाइल WhatsApp खुद फ़ेच करता है, इसलिए ऐसा URL जिस तक वह पहुँच न सके, जो असमर्थित टाइप देता हो, या जिसकी फ़ाइल अपने टाइप की आकार सीमा से बड़ी हो, स्वीकार तो हो जाता है पर बाद में विफल होता है। तब मैसेज केlast_errorपरmedia_rejectedआता है औरdescriptionमें WhatsApp का अपना कारण होता है।image,videoऔरdocumentएक वैकल्पिकcaptionभी लेते हैं;documentएक वैकल्पिकfilenameभी लेता है;audioवॉइस-नोट के रूप में दिखाने के लिए एक वैकल्पिकvoiceफ़्लैग लेता है।location:{ "latitude": ..., "longitude": ... }(दोनों आवश्यक, दशमलव डिग्री में) और वैकल्पिकnameतथाaddress।contact_cards: एक ही संदेश में साझा किए गए अधिकतम पाँच संपर्कों की array। हर कार्ड केnameमेंformatted_nameऔर कम से कम एक अन्य भाग (first_name,last_name,middle_name,prefixयाsuffix) होना चाहिए;phone_numbers,emails,urlsऔरaddressesमें से हर एक में अधिकतम दस प्रविष्टियाँ हो सकती हैं, औरorgतथाbirthday(YYYY-MM-DDके रूप में) वैकल्पिक हैं। E.164 फ़ॉर्मेट मेंphone_numberदेने पर उस कार्ड में एक बटन जुड़ जाता है, जो उस नंबर के साथ चैट खोलता है।interactive: बॉडी टेक्स्ट के साथ टैप करने लायक कुछ, छह प्रकारों में से एक में: रिप्लाई बटन, सूची मेनू, लिंक बटन, मीडिया कैरोसेल, या एक अकेला बटन जो प्राप्तकर्ता से उसकी लोकेशन या फ़ोन नंबर माँगता है। इंटरैक्टिव संदेश में हर प्रकार का wire स्वरूप, टैप से बनने वाले जवाब और सीमाएँ बताई गई हैं।
{
"to": "+16505551234",
"from": "+13124495648",
"text": { "body": "Your order shipped: https://example.com/track/A1B2C3", "preview_url": true }
}जिस अनुरोध में कोई सामग्री नहीं है, या एक से अधिक प्रकार की सामग्री है, उसे 422 के साथ अस्वीकार कर दिया जाता है।
किसी संदेश को उद्धृत करना
अपना संदेश किसी संदेश के जवाब के रूप में भेजने के लिए in_reply_to_message_id में उस WhatsApp संदेश की ID सेट करें, ठीक वैसे ही जैसे WhatsApp ऐप में रिप्लाई टैप करने पर संदेश उद्धृत होता है। प्राप्तकर्ता को आपका संदेश दिखता है और उसके ऊपर उद्धृत संदेश। संदेश को जब भी पढ़ा जाता है, यह फ़ील्ड वापस आता है।
यह उलटी दिशा में भी काम करता है: जिस इनबाउंड संदेश को WhatsApp जवाब के रूप में चिह्नित करता है, उसमें इसी फ़ील्ड में उद्धृत संदेश की ID होती है। इसी से आप जानते हैं कि कोई जवाब आपके किस संदेश का उत्तर है। जिस इनबाउंड संदेश को WhatsApp चिह्नित नहीं करता, उसमें कोई ID नहीं होती, और ID का पता लगाना चूक भी सकता है। भरोसेमंद मिलान के लिए स्पष्ट इंटरैक्टिव रिप्लाई पहचानकर्ताओं को अपने ऐप्लिकेशन में संग्रहीत बातचीत या टास्क की स्थिति के साथ इस्तेमाल करें। आउटगोइंग metadata आउटगोइंग रिकॉर्ड पर ही रहता है और जवाब पर अपने आप कॉपी नहीं होता।
भेजने का अनुरोध स्वीकार होने से पहले ही उद्धरण की जाँच हो जाती है। इसलिए जो उद्धरण दिखाया नहीं जा सकता, उससे अनुरोध ही विफल हो जाता है और न कुछ बनता है, न कोई शुल्क लगता है। अगर id इस वर्कस्पेस के किसी संदेश की नहीं है, या संदेश 15 दिनों से पुराना है (संदेश इतने ही दिन उद्धृत किया जा सकता है), तो 404 E15071 WhatsAppReferencedMessageNotFound लौटता है। अगर id ऐसे संदेश की है जो कभी WhatsApp तक नहीं पहुँचा, या जो इस अनुरोध के to और from से अलग बातचीत का है, तो 422 E15072 WhatsAppMessageNotQuotable लौटता है। अगर Bird उस स्टोर तक नहीं पहुँच पाता जो यह जाँच करता है, तो अनुरोध 503 E15073 WhatsAppMessageLookupUnavailable लौटाता है, जिसके लिए फिर से प्रयास करना उचित है। उद्धरण टेम्पलेट भेजने और फ़्री-फ़ॉर्म संदेश भेजने, दोनों में काम करता है।
{
"to": "+16505551234",
"from": "+13124495648",
"in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
"text": { "body": "Yes, that slot is still free." }
}टैग और मेटाडेटा
दो वैकल्पिक फ़ील्ड किसी संदेश के साथ आपका अपना संदर्भ जोड़ते हैं। दोनों API रीड में वापस आते हैं और संदेश के हर webhook इवेंट के साथ भेजे जाते हैं:
tags: अधिकतम 20 संरचित{ "name": ..., "value": ... }लेबल, कम cardinality वाले उन आयामों के लिए जिनसे आप फ़िल्टर और रिपोर्ट करते हैं (जैसे कोई कैंपेन या प्रयोग का कोई वेरिएंट)। नाम और मान में ASCII अक्षर, अंक, अंडरस्कोर और हाइफ़न हो सकते हैं। नाम अधिकतम 32 वर्णों के और एक अनुरोध में अद्वितीय होने चाहिए, और मान अधिकतम 64 वर्णों के। संदेश सूची को टैग से फ़िल्टर करें (?tag=campaignया?tag=campaign:launch-week)। Metrics पेज डिलीवरी को टैग के अनुसार बाँटकर दिखाता है।metadata: एक मनचाहा JSON ऑब्जेक्ट, serialize करने पर अधिकतम 2 KB, हर अनुरोध के उस संदर्भ के लिए जिससे आपको फ़िल्टर नहीं करना है (जैसे कोई आंतरिक ऑर्डर ID या सेशन संदर्भ)।
{
"tags": [{ "name": "campaign", "value": "order-confirmations" }],
"metadata": { "order_id": "ord_8271" }
}फ़ील्ड संदर्भ
| फ़ील्ड | प्रकार | आवश्यक | सीमाएँ / टिप्पणियाँ |
|---|---|---|---|
to | string | हाँ | प्रति संदेश एक प्राप्तकर्ता: E.164 फ़ोन नंबर, बिज़नेस-स्कोप्ड यूज़र ID, जिसे कोई भी वन-टाइम सत्यापन कोड टेम्पलेट स्वीकार नहीं करता, या WhatsApp ग्रुप ID (wag_…), जो उस ग्रुप के हर प्रतिभागी को भेजता है |
from | string (E.164) | नहीं** | Bird-प्रबंधित टेम्पलेट के लिए इसे छोड़ दें, क्योंकि वह अपना प्रेषक खुद चुनता है, और ग्रुप भेजने के लिए भी, जो ग्रुप का अपना नंबर इस्तेमाल करता है; सर्विस मैसेज और आपके वर्कस्पेस द्वारा बनाए गए टेम्पलेट के लिए यह ज़रूरी है, और यह आपके वर्कस्पेस के स्वामित्व वाला नंबर होना चाहिए |
template.slug | string | नहीं** | ऐसा टेम्पलेट स्लग जिसे आपका वर्कस्पेस भेज सकता है; Bird-प्रबंधित स्लग bird_ से शुरू होते हैं |
template.language | string | नहीं* | टेम्पलेट का भाषा टैग (en, pt-BR); टेम्पलेट की डिफ़ॉल्ट भाषा भेजने के लिए इसे छोड़ दें |
template.components | array | नहीं | टेम्पलेट के वेरिएबल भरता है; कंपोनेंट type या तो body होता है या button |
template.components[].parameters[].name | string | नहीं† | वह प्लेसहोल्डर जिसे यह मान भरता है, जैसे ref; नामित पैरामीटर वाले टेम्पलेट के लिए यह आवश्यक है और टेम्पलेट में घोषित नामों से मेल खाना चाहिए, जबकि पोज़िशनल टेम्पलेट में इसे छोड़ दिया जाता है |
interactive | object | नहीं** | बॉडी टेक्स्ट के साथ टैप की जा सकने वाली एक प्रकार की सामग्री; यह सर्विस मैसेज है, इसलिए इसके लिए सर्विस विंडो खुली होनी चाहिए। देखें इंटरैक्टिव मैसेज |
in_reply_to_message_id | string | नहीं | इस वर्कस्पेस में मौजूद कोई WhatsApp मैसेज ID, जो आपके भेजे गए मैसेज में उद्धृत होता है; रीड में वापस लौटाया जाता है। देखें मैसेज उद्धृत करना |
tags | array | नहीं | अधिकतम 20 {name, value} लेबल; नाम ≤ 32 अक्षर, मान ≤ 64, नाम अद्वितीय |
metadata | object | नहीं | कोई भी JSON, सीरियलाइज़ करने पर अधिकतम 2 KB |
* language वैकल्पिक है; इसे छोड़ने पर टेम्पलेट की डिफ़ॉल्ट भाषा भेजी जाती है।
† नामित पैरामीटर वाले टेम्पलेट में हर पैरामीटर पर name आवश्यक है। स्थितीय टेम्पलेट में इसे छोड़ दें। देखें कंपोनेंट और पैरामीटर।
** template या कोई एक सर्विस मैसेज कंटेंट फ़ील्ड (text, image, video, audio, sticker, document, location, interactive) में से ठीक एक भेजें; देखें सर्विस मैसेज।
एसिंक मॉडल: 202 का क्या अर्थ है
सफल भेजने पर मैसेज ID और status: accepted के साथ 202 Accepted लौटता है। 202 तभी लौटाया जाता है जब भेजने का अनुरोध स्थायी रूप से स्वीकार हो चुका हो; स्वीकार किया गया अनुरोध कभी चुपचाप हटाया नहीं जाता। जिन गंभीर विफलताओं को आप ठीक कर सकते हैं, वे तुरंत 422 के साथ विफल होती हैं: अमान्य प्राप्तकर्ता, अज्ञात टेम्पलेट slug या भाषा, पैरामीटर का मेल न खाना, या बंद ग्राहक सेवा विंडो में भेजा गया सर्विस मैसेज (WhatsAppServiceWindowClosed)। वॉलेट में धनराशि न होना इनमें शामिल नहीं है: अनुरोध स्वीकार हो जाता है, और जब Bird शुल्क लेने का प्रयास करता है, तब मैसेज insufficient_balance के साथ rejected पर समाप्त होता है। वास्तविक डिलीवरी एसिंक्रोनस रूप से होती है: जब हम मैसेज WhatsApp को सौंपते हैं तो वह sent पर जाता है, फिर रसीद आने पर अंतिम स्थिति (delivered या failed) पर पहुँचता है, जिसकी सूचना इवेंट, वेबहुक और रीड एंडपॉइंट के ज़रिए मिलती है। पढ़े जाने की रसीद स्थिति के रूप में नहीं, बल्कि अलग से read_at टाइमस्टैम्प और whatsapp.read इवेंट के रूप में दिखाई जाती है।
गोपनीयता से जुड़ी एक बात: authentication-श्रेणी के टेम्पलेट के लिए API भरे गए मान कभी नहीं लौटाता। ऐसे संदेशों के लिए 202 इको और बाद का हर रीड एक खाली components ऐरे लौटाता है, इसलिए सत्यापन कोड कभी दोबारा दिखाई नहीं देता।
सुरक्षित रूप से फिर से प्रयास करना
हर तार्किक भेजने के लिए एक अद्वितीय मान के साथ Idempotency-Key हेडर भेजें, तब फिर से प्रयास करना सुरक्षित हो जाता है। अगर आपका पहला अनुरोध सफल हुआ लेकिन आपको प्रतिक्रिया नहीं मिली (टाइमआउट, कनेक्शन टूटना), तो उसी कुंजी के साथ उसे दोबारा भेजने पर मूल परिणाम लौटता है। डुप्लिकेट संदेश न भेजा जाता है और न उसका शुल्क लगता है। दोबारा चलाई गई प्रतिक्रिया में Idempotency-Replay हेडर होता है। कुंजी के फ़ॉर्मेट और उसे कितने समय तक रखा जाता है, यह जानने के लिए idempotency देखें।
जवाब प्राप्त करना
आने वाले संदेश उसी रिसोर्स पर आते हैं जिस पर भेजे गए संदेश होते हैं, और उनमें से हर एक सेवा विंडो को रीसेट करता है। WhatsApp संदेश प्राप्त करना में API के ज़रिए उन्हें पढ़ना, संपर्क की भेजी मीडिया फ़ाइलें लाना और whatsapp.received वेबहुक शामिल हैं।
लागत और बिलिंग
WhatsApp की कीमत प्रति संदेश तय होती है, जो टेम्पलेट की श्रेणी और प्राप्तकर्ता के देश पर निर्भर करती है; देखें WhatsApp मूल्य निर्धारण। किसी संदेश का शुल्क दो चरणों में, दो अलग-अलग समय पर लगता है, और संदेश पर मौजूद cost ऑब्जेक्ट दोनों की जानकारी देता है:
| फ़ील्ड | यह क्या है | यह कब दर्ज होता है |
|---|---|---|
transaction_amount | भेजने को संभालने के लिए Bird का शुल्क | जब Bird स्वीकार किए गए भेजने के अनुरोध को प्रोसेस करता है, डिस्पैच से पहले |
passthrough_amount | संदेश मूल्य में Meta का हिस्सा, जिसे Bird आगे पास करता है | जब कोई लागू delivered या read रसीद आती है |
amount | अब तक मूल्य निर्धारित किए गए घटकों का योग | हर घटक दर्ज होने के साथ बढ़ता है |
currency_code | आपके संगठन के वॉलेट की मुद्रा, जो दोनों घटकों में समान होती है | पहले घटक के साथ |
दोनों राशियाँ दशमलव स्ट्रिंग हैं, और इनमें कर शामिल नहीं है।
Note: a service message carries no Meta share until September 30th 2026, and neither does a utility template delivered inside an open customer service window. From October 1st 2026 Meta charges for both, except inside a 72-hour free entry point window, and with 1,000 free service messages per business phone number per month: October 2026 pricing changes.
दोनों घटकों का मूल्य अलग-अलग इनपुट पर तय होता है। Bird का शुल्क आपके भेजे गए टेम्पलेट की श्रेणी और प्राप्तकर्ता के देश पर आधारित होता है। देश फ़ोन नंबर के कंट्री कोड से तय होता है, या बिज़नेस-स्कोप्ड यूज़र ID पर भेजे गए संदेश में उस ID के दो-अक्षर वाले प्रीफ़िक्स से। Meta का हिस्सा उस श्रेणी पर आधारित होता है जो Meta स्वयं लागू रसीद पर रिपोर्ट करता है, और यह टेम्पलेट की श्रेणी से अलग हो सकती है: जब Meta के गंतव्य, व्यवसाय-स्थान और पात्रता नियम लागू होते हैं, तो Meta authentication-international रिपोर्ट कर सकता है। देखें WhatsApp authentication-international दरें।
cost में क्या दिखता है, यह इस पर निर्भर करता है कि संदेश कितना आगे पहुँचा है:
202के समय,costnull होता है। अभी तक किसी चीज़ का मूल्य तय नहीं हुआ है।- प्रोसेसिंग के बाद,
transaction_amountसेट हो जाता है औरamountउसके बराबर होता है।passthrough_amountnull ही रहता है। - लागू
deliveredयाreadरसीद आने के बाद, सफलतापूर्वक दर्ज किया गया Meta शुल्कpassthrough_amountको भरता है, औरamountदर्ज किए गए घटकों को दर्शाता है।
null घटक का अर्थ है कि उस प्रोजेक्शन में कोई राशि दर्ज नहीं है; इससे यह साबित नहीं होता कि संदेश मुफ़्त था। जिस घटक का मूल्य स्पष्ट रूप से शून्य तय किया गया हो, वह "0.00000" दिखाता है।
दोनों शुल्क अलग-अलग तरीके से विफल भी होते हैं। Bird का शुल्क fail closed होता है: अगर 202 के बाद यह इसलिए पूरा नहीं हो पाता कि वॉलेट में भेजने के लिए पर्याप्त राशि नहीं है या रूट का कोई मूल्य कॉन्फ़िगर नहीं है, तो संदेश त्रुटि कोड insufficient_balance या price_not_found के साथ rejected पर समाप्त होता है, और कोई शुल्क नहीं लगता। rejected संदेश कभी WhatsApp तक नहीं पहुँचा, और यही उसे failed से अलग करता है। Meta का हिस्सा fail open होता है: अगर रसीद आने के समय वॉलेट में राशि कम है या दर मौजूद नहीं है, तो देखी गई संदेश स्थिति को पलटे बिना शुल्क छोड़ दिया जाता है। दूसरे शुल्क की वजह से आपकी डिलीवरी कभी नहीं रुकती।
अगर Bird ने किसी संदेश पर शुल्क लगाया है, तो बाद में डिलीवरी विफल होने पर भी वह आउटबाउंड शुल्क बना रहता है। जब Meta हल किए जा सकने वाली श्रेणी और गंतव्य के साथ सामान्य मूल्य निर्धारण रिपोर्ट करता है, तब Meta शुल्क लागू delivered या read कॉलबैक से प्रोसेस होता है। दोनों कॉलबैक पथ एक ही शुल्क पहचान का उपयोग करते हैं और बिलिंग सेवा के डुप्लिकेट-निवारण पर निर्भर रहते हैं। दोबारा चलाई गई रसीदों का मिलान बिलिंग रिकॉर्ड से करें, संदेश प्रोजेक्शन को स्थायी डेबिट रसीद न मानें। सेवा या मुफ़्त-प्रवेश मूल्य निर्धारण से Meta घटक शून्य हो सकता है; हल न हुआ घटक इस बात का प्रमाण नहीं है कि संदेश मुफ़्त था।
वित्तीय मिलान के लिए बिलिंग लेजर का उपयोग करें। संदेश के cost फ़ील्ड शुल्कों के प्रोजेक्शन हैं और इनमें देरी हो सकती है या ये अधूरे रह सकते हैं। संदेश अवलोकनों और बिलिंग रिकॉर्ड के अंतर के लिए WhatsApp मेट्रिक्स देखें।
WhatsApp इवेंट में लागत शामिल नहीं होती। किसी भी घटक को पढ़ने के लिए GET /v1/whatsapp/messages/{id} से संदेश को दोबारा पढ़ें।
अगले चरण
- सर्विस संदेश: ग्राहक सेवा विंडो के भीतर टेक्स्ट, मीडिया और इंटरैक्टिव सामग्री भेजें
- टेम्पलेट: टेम्पलेट चुनें और उसके वेरिएबल के मान दें
- WhatsApp संदेश प्राप्त करना: जवाब पढ़ें और आने वाला मीडिया प्राप्त करें
- संदेश स्थिति वेबहुक: डिलीवरी और विफलता के अपडेट प्राप्त करें
- Idempotency:
Idempotency-Keyहेडर के साथ सुरक्षित रूप से फिर से प्रयास करें
संबंधित संसाधन
इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।