Sign inGet Started

WhatsApp संदेश भेजना

यह गाइड सेंड एंडपॉइंट POST /v1/whatsapp/messages को कवर करती है। आप एक JSON पेलोड बनाते हैं जिसमें एक प्राप्तकर्ता और ठीक एक प्रकार का कंटेंट होता है: एक पूर्व-अनुमोदित टेम्पलेट, या एक सर्विस संदेश जिसमें टेक्स्ट, इमेज, वीडियो, ऑडियो, स्टिकर, डॉक्यूमेंट, लोकेशन, कॉन्टैक्ट कार्ड या कुछ टैप करने योग्य सामग्री होती है। Bird एक मैसेज ID के साथ 202 Accepted लौटाता है और asynchronously डिलीवर करता है। आप दोनों में से कौन सा भेज सकते हैं, यह कस्टमर सर्विस विंडो पर निर्भर करता है। हर रिक्वेस्ट एक प्राप्तकर्ता को एक संदेश भेजती है, और कोई बैच एंडपॉइंट नहीं है।

एक न्यूनतम सेंड

सबसे छोटा वैध पेलोड एक to प्राप्तकर्ता और एक template उसके slug के साथ है। कोई विशिष्ट भाषा चाहिए तो language जोड़ें; इसे छोड़ने पर टेम्पलेट की डिफ़ॉल्ट भाषा भेजी जाती है, और टेम्पलेट में घोषित किसी भी वेरिएबल को components के ज़रिए भरें।
curl कॉल US होस्ट का नाम देता है; अगर आपकी key bk_eu1_ से शुरू होती है, तो इसके बजाय https://eu1.platform.bird.com को कॉल करें। SDK आपकी key से रीजन पढ़ लेते हैं, इसलिए वे कोई होस्ट सेट नहीं करते।
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);

कस्टमर सर्विस विंडो

आप दोनों में से कौन सा भेज सकते हैं, यह एक स्थिति पर निर्भर करता है: कस्टमर सर्विस विंडो खुली है या नहीं।
संपर्ककर्ता आपके बिज़नेस नंबर पर संदेश भेजकर या कॉल करके विंडो खोलता है, और यह 24 घंटे तक खुली रहती है, हर बार उनके दोबारा संदेश भेजने पर रीसेट होती है। जब तक यह खुली है, आप सर्विस संदेश भेज सकते हैं, यानी कोई भी फ्री-फ़ॉर्म कंटेंट: टेक्स्ट, इमेज, वीडियो, ऑडियो, स्टिकर, डॉक्यूमेंट, लोकेशन, या इंटरैक्टिव। एक बार यह समाप्त हो जाए, तो केवल पूर्व-अनुमोदित टेम्पलेट ही उन तक पहुँचता है, और उसका जवाब विंडो को फिर से खोल देता है।
Bird आपके लिए विंडो ट्रैक करता है, इसलिए बंद विंडो में भेजा गया सर्विस संदेश कुछ भी बनने या चार्ज होने से पहले अस्वीकार कर दिया जाता है: रिक्वेस्ट 422 E15044 WhatsAppServiceWindowClosed लौटाती है। यह जाँच बेस्ट-एफ़र्ट है और फ़ेल-ओपन होती है, इसलिए 202 इस बात का प्रमाण नहीं है कि डिस्पैच के समय विंडो वास्तव में खुली थी; स्वीकृति और डिस्पैच के बीच विंडो समाप्त हो जाए तो यह asynchronously फ़ेल होती है, संदेश के last_error पर service_window_expired के साथ।
पूरे लाइफ़साइकल के लिए कस्टमर सर्विस विंडो देखें: क्या इसे खोलता है, क्या इसे रीसेट करता है, और यह प्राइसिंग के साथ कैसे इंटरैक्ट करती है।

पेलोड बनाना

प्राप्तकर्ता

to एक गंतव्य निर्दिष्ट करता है, जो फ़ोन नंबर, business-scoped user ID, या group ID हो सकता है। फ़ोन नंबर E.164 फ़ॉर्मैट में होता है: शुरू में +, कंट्री कोड, और सब्सक्राइबर नंबर, जैसे +14155550100। हम नंबर को वैलिडेट करते हैं, इसलिए जो वैल्यू एक वास्तविक, डायल करने योग्य नंबर नहीं हो सकती (गलत लंबाई, अनअसाइंड प्रीफ़िक्स), उसे कुछ भी चार्ज होने से पहले 422 WhatsAppInvalidRecipient के साथ अस्वीकार कर दिया जाता है। कोई recipient array या बैच सेंड नहीं है, इसलिए जो लोग एक ग्रुप में नहीं हैं उन तक पहुँचने के लिए प्रति प्राप्तकर्ता एक कॉल करनी होगी।
एक business-scoped user ID जैसे US.13491208655302741918 उस संपर्ककर्ता को संबोधित करता है जिसका फ़ोन नंबर आपके पास नहीं है, और इसी तरह आप ऐसे संपर्ककर्ता को जवाब देते हैं जो बिना नंबर के आप तक पहुँचा। दो चीज़ें बदलती हैं: भेजने वाला नंबर उसी बिज़नेस पोर्टफ़ोलियो का होना चाहिए जिससे ID स्कोप्ड है, और वन-टाइम-सत्यापन कोड टेम्पलेट को फ़ोन नंबर चाहिए। Bird-मैनेज्ड टेम्पलेट 422 WhatsAppRecipientNotSupportedForTemplate के साथ अनुरोध स्वीकार करने के चरण में ही अस्वीकार कर दिया जाता है; आपके वर्कस्पेस द्वारा बनाया गया ऑथेंटिकेशन टेम्पलेट स्वीकार होता है और फिर फ़ेल हो जाता है, क्योंकि Meta को इसके लिए फ़ोन नंबर चाहिए।
to एक और रूप लेता है: एक WhatsApp group ID जैसे wag_01krdgeqcxet5s7t44vh8rt9mg, जो उस ग्रुप चैट के हर प्रतिभागी को भेजता है। ग्रुप सेंड from को छोड़ देता है और डिलीवरी की रिपोर्ट एक प्राप्तकर्ता के बजाय पूरे ग्रुप में करता है, इसलिए WhatsApp ग्रुप को भेजना इसे अपने अलग पेज पर कवर करता है।

टेम्पलेट

template भेजने के लिए पूर्व-अनुमोदित टेम्पलेट निर्दिष्ट करता है:
  • slug (आवश्यक): टेम्पलेट का slug, जैसे bird_order_confirmation। यह आपके कैटलॉग में किसी टेम्पलेट से मैच होना चाहिए (lowercase अक्षर, अंक, और अंडरस्कोर)।
  • language: टेम्पलेट का language tag, जैसे en या pt-BR। टेम्पलेट की डिफ़ॉल्ट भाषा भेजने के लिए इसे छोड़ दें; जो भाषा टेम्पलेट में नहीं है उसे नाम देने पर 422 लौटता है जो उपलब्ध भाषाओं की सूची देता है। स्वीकृत संदेश resolved भाषा को echo करता है।
  • components: वे वैल्यूज़ जो टेम्पलेट के वेरिएबल्स को भरती हैं (देखें कम्पोनेंट और पैरामीटर)। बिना वेरिएबल्स वाले टेम्पलेट के लिए इसे छोड़ दें।
अपने टेम्पलेट, उनकी भाषाएँ, और हर एक का rendered प्रीव्यू Templates पेज पर ब्राउज़ करें।

कम्पोनेंट और पैरामीटर

टेम्पलेट में वेरिएबल्स होते हैं, नामित ({{ref}}, {{amount}}) या क्रमांकित ({{1}}, {{2}})। आप उनकी वैल्यूज़ components के ज़रिए देते हैं। हर कम्पोनेंट एक type (body या button) और एक parameters array निर्दिष्ट करता है। हर पैरामीटर अपना type (text, image, video, gif, document, या location) निर्दिष्ट करता है और उससे मेल खाने वाला फ़ील्ड रखता है: text एक सादी string, image/video/gif/document एक पब्लिक https url, और location मैप पर एक बिंदु। नामित पैरामीटर वाले टेम्पलेट के लिए हर पैरामीटर पर name ज़रूरी है, जो टेम्पलेट में घोषित नामों से बिल्कुल मेल खाना चाहिए (देखें फ़ील्ड रेफ़रेंस)। positional टेम्पलेट name को छोड़ देता है और वैल्यूज़ को {{n}} क्रम में लेता है, इसलिए पहला पैरामीटर {{1}} को भरता है। दोनों स्थितियों में, जो पैरामीटर टेम्पलेट की घोषणा से मेल नहीं खाते वे 422 WhatsAppTemplateParameterMismatch लौटाते हैं। वायर पर एक header कम्पोनेंट टाइप भी मौजूद है: Bird-managed टेम्पलेट पर इसे छोड़ दिया जाता है, क्योंकि कोई भी Bird-managed टेम्पलेट हेडर वेरिएबल घोषित नहीं करता, लेकिन आपके वर्कस्पेस द्वारा बनाए गए टेम्पलेट पर इसे फ़ॉरवर्ड किया जाता है, और इसी तरह एक media-header utility या marketing टेम्पलेट को अपनी इमेज मिलती है।
उदाहरण के लिए, एक one-time-passcode टेम्पलेट जिसका body {{1}} is your verification code पढ़ता है और जिसका बटन कोड कॉपी करता है, कोड को body पैरामीटर और बटन पैरामीटर दोनों के रूप में लेता है, positionally (बिना name):
कोड उदाहरण
{
  "components": [
    { "type": "body", "parameters": [{ "type": "text", "text": "481920" }] },
    { "type": "button", "parameters": [{ "type": "text", "text": "481920" }] }
  ]
}

कैटेगरी और सेंडर

टेम्पलेट की कैटेगरी (authentication, utility, या marketing) यह तय करती है कि WhatsApp संदेश को कैसे ट्रीट करता है और, गंतव्य देश के साथ, इसकी लागत क्या होती है।
सेंडर का मालिक कौन है, यह तय करता है कि आप उसे नाम दें या नहीं:
  • एक Bird-managed टेम्पलेट (जिसका slug bird_ से शुरू होता है) उस नंबर से भेजता है जो Bird उस कैटेगरी के लिए रखता है, इसलिए from को छोड़ दें। इसे सेट करने पर 422 WhatsAppSenderNotAllowed लौटता है।
  • बाकी सब कुछ from में अपना सेंडर निर्दिष्ट करता है: किसी भी प्रकार का सर्विस मैसेज, और आपके वर्कस्पेस द्वारा बनाया गया कोई भी टेम्पलेट। नंबर आपके वर्कस्पेस के स्वामित्व वाला होना चाहिए। इसे छोड़ने पर 422 WhatsAppSenderRequired लौटता है, और जिस नंबर से वर्कस्पेस भेज नहीं सकता उसके लिए 422 WhatsAppSenderNotFound लौटता है। बनाए गए टेम्पलेट को उसी WhatsApp Business Account पर भी होना चाहिए जिस पर नंबर है, अन्यथा सेंड 422 WhatsAppSenderWABAMismatch लौटाता है।
फ़ोन नंबर सेटअप दोनों प्रकार के नंबर और आपका अपना नंबर कैसे कनेक्ट होता है, यह कवर करता है।

सर्विस मैसेज

template के बजाय, text, image, video, audio, sticker, document, location, contact_cards, या interactive में से ठीक एक रखें। सभी नौ सर्विस मैसेज हैं, इसलिए इन्हें एक खुली customer service window की ज़रूरत है। इन सभी को from भी चाहिए, जो आपके वर्कस्पेस के स्वामित्व वाला नंबर हो; Bird के managed नंबर इसे नहीं भेज सकते।
  • text: { "body": "..." }, अधिकतम 4,096 अक्षर। body में पहले URL का लिंक प्रीव्यू रेंडर करने के लिए "preview_url": true जोड़ें।
  • image, video, audio, sticker, document: हर एक सेंड के समय WhatsApp द्वारा फ़ेच किया जाने वाला एक पब्लिक https URL लेता है (url), इसलिए signed URL को सेंड से ज़्यादा समय तक वैध रहना चाहिए। http URL सीधे अस्वीकार कर दिया जाता है। WhatsApp फ़ाइल को खुद फ़ेच करता है, इसलिए जो URL पहुँच से बाहर है, जो असमर्थित टाइप सर्व करता है, या जो फ़ाइल अपने टाइप की साइज़ सीमा से बड़ी है, वह स्वीकार होकर बाद में विफल होती है, संदेश के last_error पर media_rejected के साथ और description में WhatsApp का अपना कारण। image, video, और document एक वैकल्पिक caption भी लेते हैं; document एक वैकल्पिक filename भी लेता है; audio वॉइस-नोट रेंडरिंग के लिए एक वैकल्पिक voice फ़्लैग लेता है।
  • location: { "latitude": ..., "longitude": ... } (दोनों आवश्यक, दशमलव डिग्री) साथ ही वैकल्पिक name और address।
  • contact_cards: एक संदेश में शेयर किए गए अधिकतम पाँच contacts की 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: body text और टैप करने योग्य कुछ, छह प्रकारों में से एक में: reply buttons, एक list menu, एक link button, एक media carousel, या एक सिंगल बटन जो प्राप्तकर्ता से उनकी लोकेशन या फ़ोन नंबर माँगता है। Interactive messages हर प्रकार की वायर शेप, टैप से उत्पन्न रिप्लाइज़, और सीमाओं को कवर करता है।
कोड उदाहरण
{
  "to": "+16505551234",
  "from": "+13124495648",
  "text": { "body": "Your order shipped: https://example.com/track/A1B2C3", "preview_url": true }
}
बिना कंटेंट वाला, या एक से अधिक प्रकार वाला अनुरोध 422 के साथ अस्वीकार कर दिया जाता है।

संदेश को उद्धृत करना

in_reply_to_message_id को एक WhatsApp message ID पर सेट करें ताकि आपका संदेश उसके रिप्लाई के रूप में भेजा जाए, ठीक वैसे ही जैसे WhatsApp ऐप में reply टैप करने पर संदेश उद्धृत होता है। प्राप्तकर्ता को आपका संदेश उद्धृत संदेश के ऊपर दिखता है, और यह फ़ील्ड संदेश की हर read पर वापस आता है।
यह दूसरी तरफ़ भी काम करता है: जिस इनबाउंड संदेश को WhatsApp रिप्लाई के रूप में चिह्नित करता है, वह उसी फ़ील्ड में उद्धृत संदेश की ID रखता है, और इसी से आप जानते हैं कि रिप्लाई आपके किस संदेश का जवाब है। जिस इनबाउंड संदेश को WhatsApp चिह्नित नहीं करता उसमें कोई ID नहीं होती, और resolution भी चूक सकता है। विश्वसनीय correlation के लिए, अपने ऐप्लिकेशन की संग्रहीत conversation या task state के साथ explicit interactive reply identifiers का उपयोग करें। आउटगोइंग metadata आउटगोइंग रिकॉर्ड पर रहता है और अपने आप रिप्लाई पर कॉपी नहीं होता।
उद्धरण सेंड स्वीकार होने से पहले resolve किया जाता है, इसलिए जो उद्धरण रेंडर नहीं हो सकता वह अनुरोध को ही विफल कर देता है और कुछ भी बनाया या चार्ज नहीं किया जाता। जो id इस वर्कस्पेस में कोई संदेश नहीं दर्शाती, या जो 15 दिन से पुरानी है जब तक संदेश उद्धृत किया जा सकता है, वह 404 E15071 WhatsAppReferencedMessageNotFound लौटाती है। जो id ऐसे संदेश को दर्शाती है जो WhatsApp तक कभी नहीं पहुँचा, या इस सेंड के to और from से अलग conversation का संदेश है, वह 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 reads पर वापस आते हैं और संदेश के हर webhook इवेंट के साथ भेजे जाते हैं:
  • tags: low-cardinality dimensions के लिए अधिकतम 20 structured { "name": ..., "value": ... } labels जिनके आधार पर आप फ़िल्टर और रिपोर्ट करते हैं (कोई कैम्पेन, कोई experiment variant)। नाम और वैल्यू ASCII अक्षर, अंक, अंडरस्कोर, और हाइफ़न लेते हैं; नाम अधिकतम 32 अक्षर और एक सेंड में अद्वितीय, वैल्यू अधिकतम 64। टैग से संदेश सूची फ़िल्टर करें (?tag=campaign या ?tag=campaign:launch-week), और Metrics पेज टैग के अनुसार डिलीवरी का विश्लेषण करता है।
  • metadata: एक arbitrary JSON object, serialized रूप में अधिकतम 2 KB, प्रति-सेंड संदर्भ के लिए जिसे आपको फ़िल्टर dimension के रूप में नहीं चाहिए (कोई internal order ID, कोई session reference)।
कोड उदाहरण
{
  "tags": [{ "name": "campaign", "value": "order-confirmations" }],
  "metadata": { "order_id": "ord_8271" }
}

फ़ील्ड रेफ़रेंस

फ़ील्डटाइपआवश्यकसीमाएँ / नोट्स
tostringहाँप्रति संदेश एक प्राप्तकर्ता: एक E.164 फ़ोन नंबर, एक business-scoped user ID जिसे कोई one-time-passcode टेम्पलेट स्वीकार नहीं करता, या एक WhatsApp group ID (wag_…) जो उस ग्रुप के हर प्रतिभागी को भेजता है
fromstring (E.164)no**Bird-managed टेम्पलेट के लिए छोड़ें, जो अपना सेंडर खुद चुनता है, और ग्रुप सेंड के लिए, जो ग्रुप का अपना नंबर उपयोग करता है; सर्विस मैसेज और आपके वर्कस्पेस द्वारा बनाए गए टेम्पलेट के लिए आवश्यक, और आपके वर्कस्पेस के स्वामित्व वाला नंबर होना चाहिए
template.slugstringno**आपका वर्कस्पेस जो भेज सकता है वह टेम्पलेट slug; Bird-managed slugs bird_ से शुरू होते हैं
template.languagestringno*टेम्पलेट language tag (en, pt-BR); टेम्पलेट की डिफ़ॉल्ट भाषा भेजने के लिए छोड़ दें
template.componentsarraynoटेम्पलेट के वेरिएबल्स भरता है; कम्पोनेंट type body या button होता है
template.components[].parameters[].namestringno†वह placeholder जिसे यह वैल्यू भरती है, जैसे ref; named-parameter टेम्पलेट के लिए आवश्यक और टेम्पलेट के घोषित नामों से मेल खाना चाहिए, positional टेम्पलेट के लिए छोड़ें
interactiveobjectno**Body text और एक प्रकार का टैप करने योग्य कंटेंट; एक सर्विस मैसेज, इसलिए इसे खुली service window चाहिए। देखें Interactive messages
in_reply_to_message_idstringnoइस वर्कस्पेस का एक WhatsApp message ID, जो आपके भेजे गए संदेश में उद्धृत होता है; reads पर echo होता है। देखें संदेश उद्धृत करना
tagsarraynoअधिकतम 20 {name, value} labels; name ≤ 32 chars, value ≤ 64, names अद्वितीय
metadataobjectnoArbitrary JSON, serialized रूप में अधिकतम 2 KB
* language वैकल्पिक है; इसे छोड़ने पर टेम्पलेट की डिफ़ॉल्ट भाषा भेजी जाती है। † name named-parameter टेम्पलेट के हर पैरामीटर पर आवश्यक है। positional टेम्पलेट के लिए इसे छोड़ दें। देखें कम्पोनेंट और पैरामीटर। ** template या किसी एक service-message content फ़ील्ड (text, image, video, audio, sticker, document, location, interactive) में से ठीक एक रखें; देखें सर्विस मैसेज।

async मॉडल: 202 का मतलब

सफल भेजने पर 202 Accepted एक मैसेज ID और status: accepted के साथ लौटता है। 202 तभी लौटाया जाता है जब भेजना स्थायी रूप से स्वीकार हो जाए; इसे कभी स्वीकार करके चुपचाप छोड़ा नहीं जाता। जो गंभीर विफलताएँ आप ठीक कर सकते हैं, वे तुरंत 422 के साथ विफल होती हैं: अमान्य प्राप्तकर्ता, अज्ञात टेम्पलेट स्लग या भाषा, पैरामीटर बेमेल, या बंद कस्टमर सर्विस विंडो में भेजा गया सर्विस मैसेज (WhatsAppServiceWindowClosed)। फंड-रहित वॉलेट इनमें नहीं है: भेजना स्वीकार हो जाता है, और जब Bird चार्ज करने का प्रयास करता है तो मैसेज rejected पर insufficient_balance के साथ समाप्त होता है। वास्तविक डिलीवरी असिंक्रोनस रूप से होती है: जब हम मैसेज WhatsApp को सौंपते हैं तो यह sent पर चला जाता है, फिर रसीद आने पर एक अंतिम स्थिति (delivered या failed) पर पहुँचता है, जो इवेंट्स, वेबहुक्स, और रीड एंडपॉइंट्स के ज़रिए रिपोर्ट होता है। रीड रसीद एक अलग read_at टाइमस्टैम्प और whatsapp.read इवेंट के रूप में सामने आती है, न कि एक स्टेटस के रूप में।
एक गोपनीयता नोट: authentication-category टेम्पलेट के लिए API कभी भरी हुई वैल्यूज़ नहीं लौटाता। 202 echo और हर बाद की read उन संदेशों के लिए एक खाली components array रखती है, ताकि सत्यापन कोड कभी दोबारा सामने न आए।

सुरक्षित रूप से फिर से प्रयास करना

प्रत्येक logical सेंड के लिए Idempotency-Key हेडर में एक अद्वितीय वैल्यू भेजें, और फिर से प्रयास करना सुरक्षित हो जाता है। अगर आपका पहला अनुरोध सफल हुआ लेकिन आपने प्रतिक्रिया नहीं देखी (timeout, कनेक्शन टूटना), तो उसी key के साथ रीप्ले करने पर डुप्लिकेट संदेश भेजने और चार्ज करने के बजाय मूल परिणाम लौटता है। रीप्ले की गई प्रतिक्रिया एक Idempotency-Replay हेडर रखती है। key फ़ॉर्मैट और retention के लिए idempotency देखें।

रिप्लाई प्राप्त करना

इनबाउंड संदेश आउटबाउंड संदेशों के समान resource पर आते हैं, और हर एक service window को रीसेट करता है। WhatsApp संदेश प्राप्त करना उन्हें API पर पढ़ना, किसी contact द्वारा भेजा गया मीडिया फ़ेच करना, और whatsapp.received webhook को कवर करता है।

लागत और बिलिंग

WhatsApp प्रति संदेश प्राइस किया जाता है, टेम्पलेट की कैटेगरी और प्राप्तकर्ता के देश के आधार पर; देखें WhatsApp pricing। संदेश दो चरणों में, दो अलग-अलग समय पर चार्ज होता है, और संदेश पर cost object दोनों की रिपोर्ट करता है:
फ़ील्डयह क्या हैयह कब आता है
transaction_amountसेंड को हैंडल करने के लिए Bird की फ़ीसजब Bird स्वीकृत सेंड को डिस्पैच से पहले प्रोसेस करता है
passthrough_amountसंदेश मूल्य में Meta का हिस्सा, जो Bird पास-थ्रू करता हैजब कोई applicable delivered या read रसीद आती है
amountअब तक प्राइस किए गए कम्पोनेंट्स का योगहर कम्पोनेंट आने पर बढ़ता है
currency_codeआपके organization wallet की करेंसी, दोनों कम्पोनेंट्स में साझापहले कम्पोनेंट के साथ
दोनों राशियाँ decimal strings हैं, कर रहित।
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 की फ़ीस आपके भेजे गए टेम्पलेट की कैटेगरी और प्राप्तकर्ता के देश का उपयोग करती है, जो फ़ोन नंबर के कंट्री कोड से आता है या, business-scoped user ID को भेजे गए सेंड पर, उस ID के दो-अक्षर प्रीफ़िक्स से। Meta का हिस्सा उस कैटेगरी का उपयोग करता है जो Meta स्वयं applicable रसीद पर रिपोर्ट करता है, जो टेम्पलेट की कैटेगरी से भिन्न हो सकती है: Meta authentication-international रिपोर्ट कर सकता है जब उसके destination, business-location और eligibility नियम लागू होते हैं। देखें WhatsApp authentication-international rates।
cost क्या दिखाता है यह इस पर निर्भर करता है कि संदेश कितनी दूर तक पहुँचा है:
  • 202 पर, cost null है। कुछ भी प्राइस नहीं हुआ है।
  • प्रोसेसिंग के बाद, transaction_amount सेट हो जाता है और amount उसके बराबर होता है। passthrough_amount null रहता है।
  • एक applicable delivered या read रसीद के बाद, सफलतापूर्वक रिकॉर्ड किया गया Meta चार्ज passthrough_amount को पॉप्युलेट करता है, और amount रिकॉर्ड किए गए कम्पोनेंट्स को दर्शाता है।
null कम्पोनेंट का मतलब है कि उस projection में कोई राशि रिकॉर्ड नहीं है; यह इस बात का प्रमाण नहीं कि संदेश मुफ़्त था। स्पष्ट रूप से शून्य पर प्राइस किया गया कम्पोनेंट "0.00000" दिखाता है।
दोनों चार्ज अलग-अलग तरीके से विफल भी होते हैं। Bird की फ़ीस बंद विफल होती है: जब 202 के बाद यह पूरी नहीं हो पाती क्योंकि वॉलेट सेंड को कवर नहीं कर सकता या रूट पर कोई configured कीमत नहीं है, तो संदेश error code insufficient_balance या price_not_found के साथ rejected पर समाप्त होता है, और कुछ भी चार्ज नहीं होता। rejected संदेश कभी WhatsApp तक नहीं पहुँचा, और यही बात इसे failed से अलग करती है। Meta का हिस्सा खुला विफल होता है: अगर रसीद आने पर वॉलेट में कमी है या rate नहीं मिलता, तो चार्ज को छोड़ दिया जाता है बिना observed message state को उलटे। आपकी डिलीवरी दूसरे चार्ज से कभी नहीं रुकती।
Bird द्वारा चार्ज किया गया संदेश वह आउटबाउंड चार्ज बनाए रखता है भले ही डिलीवरी बाद में विफल हो। Meta फ़ीस एक applicable delivered या read callback से प्रोसेस होती है जब Meta resolvable कैटेगरी और destination के साथ regular pricing रिपोर्ट करता है। दोनों callback paths समान fee identity का उपयोग करते हैं और billing service के deduplication पर निर्भर करते हैं। message projection को स्थायी debit receipt मानने के बजाय replayed receipts को billing records से reconcile करें। Service या free-entry pricing Meta कम्पोनेंट को शून्य बना सकती है; unresolved कम्पोनेंट इस बात का प्रमाण नहीं कि संदेश मुफ़्त था।
वित्तीय reconciliation के लिए billing ledger का उपयोग करें। संदेश cost फ़ील्ड चार्जेज़ के projection हैं और पीछे रह सकते हैं या अधूरे रह सकते हैं। message observations और billing records के बीच अंतर के लिए WhatsApp metrics देखें।
WhatsApp events लागत नहीं रखते। किसी भी कम्पोनेंट को पढ़ने के लिए, संदेश को GET /v1/whatsapp/messages/{id} के साथ वापस पढ़ें।

अगले कदम