Sign inGet started

WhatsApp संदेश प्राप्त करना

इनबाउंड संदेश उसी रिसोर्स पर आते हैं जिस पर आउटबाउंड संदेश होते हैं; पोल करने के लिए कोई अलग इनबॉक्स एंडपॉइंट नहीं है। इन्हें डैशबोर्ड में संदेश सूची से पढ़ें, या सूची को इनबाउंड पर फ़िल्टर करके API पर GET /v1/whatsapp/messages/{id} से पढ़ें।
हर इनबाउंड संदेश कस्टमर सर्विस विंडो को उस संदेश के अपने टाइमस्टैम्प के बाद 24 घंटे तक बढ़ा देता है, और इसी कारण आपका फ़्री-फ़ॉर्म जवाब डिलीवर हो पाता है। कोई संदेश जो Bird तक देर से पहुँचता है, वह उस विंडो को लेकर आता है जो उसके संपर्क ने वास्तव में दी थी, और पहले से रिकॉर्ड पर मौजूद बाद की डेडलाइन कभी छोटी नहीं की जाती।

इनबाउंड संदेश में क्या होता है

हर इनबाउंड संदेश एक साझा एन्वेलप रखता है: एक id, direction: "inbound", from में संपर्क, to में आपका अपना नंबर, received का एक status, और एक created_at। इसके साथ ठीक एक कंटेंट फ़ील्ड होती है, जो बताती है कि संपर्क ने क्या भेजा:
कोड उदाहरण
{
  "id": "wam_01kya19eknftrs2s6p82asmvnh",
  "direction": "inbound",
  "from": { "phone_number": "+14155550100" },
  "to": { "phone_number": "+13124495569" },
  "status": "received",
  "text": { "body": "Is my order out for delivery yet?" },
  "created_at": "2026-08-25T09:04:11Z"
}
from संपर्क को उस पहचान से नाम देता है जो WhatsApp रिपोर्ट करता है: एक E.164 phone_number, एक bsuid, या दोनों, साथ ही वे username और display_name जो वे प्रकाशित करते हैं। जिस संपर्क ने WhatsApp यूज़रनेम अपनाया है, वह बिना किसी फ़ोन नंबर के भी आप तक पहुँच सकता है; क्या स्टोर करना है और नंबर कैसे माँगना है, इसके लिए बिज़नेस-स्कोप्ड यूज़र ID देखें।
इन कंटेंट फ़ील्ड में से एक, जिसे आर्म कहते हैं, वह बताती है कि उन्होंने क्या भेजा, और किसी भी संदेश पर ठीक एक आर्म सेट होती है। हर आर्म का अपना पेज है, जिसमें रीड शेप, whatsapp.received पेलोड, और किन बातों का ध्यान रखना है:
फ़ील्डइनबाउंड में क्या होता है
textbody, वह संदेश जो संपर्क ने टाइप किया
imageएक id, url, mime_type, और कोई भी caption
videoवही मीडिया फ़ील्ड, साथ ही कोई भी caption
audioवही मीडिया फ़ील्ड, साथ ही वॉइस नोट पर voice; कोई कैप्शन नहीं होता
stickerवही मीडिया फ़ील्ड, साथ ही animated
documentवही मीडिया फ़ील्ड, साथ ही कोई भी filename और caption
locationlatitude और longitude, और कभी-कभी name, address, या एक url
contact_cardsसंपर्क द्वारा शेयर किए गए एक या अधिक कॉन्टैक्ट कार्ड
interactive_replyसंपर्क द्वारा टैप किए गए बटन या पंक्ति का slug और text
unsupportedवह WhatsApp कंटेंट टाइप जिसे API मॉडल नहीं करता, जैसे कि ऑर्डर
दो टैप एक ऐसे आर्म पर आते हैं जिसकी आप उम्मीद नहीं करेंगे। एक लोकेशन रिक्वेस्ट का जवाब सामान्य इनबाउंड location के रूप में आता है, और एक कॉन्टैक्ट इन्फ़ो रिक्वेस्ट का जवाब contact_cards के रूप में आता है, इसलिए टैप के लिए केवल interactive_reply को देखने वाला इंटीग्रेशन दोनों को चूक जाता है।

इनबाउंड मीडिया फ़ेच करना

एक इनबाउंड image, video, audio, sticker, या document फ़ाइल के बजाय Bird द्वारा स्टोर की गई फ़ाइल के रेफ़रेंस के रूप में आता है:
कोड उदाहरण
{
  "image": {
    "id": "waf_01kyb2m4xq7whs0d8n3prv6tez",
    "url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kya19eknftrs2s6p82asmvnh/media/waf_01kyb2m4xq7whs0d8n3prv6tez",
    "mime_type": "image/jpeg",
    "caption": "Is this the right part?"
  }
}
चैनल के मीडिया मेथड से बाइट्स फ़ेच करें, message id और मीडिया id पास करें:
const media = await bird.whatsapp.messages.media(
  "wam_01kya19eknftrs2s6p82asmvnh",
  "waf_01kyb2m4xq7whs0d8n3prv6tez",
);
console.log(media.contentType, media.contentLength);
आपको बाइट्स उनके लिए घोषित mime_type स्टोरेज के साथ वापस मिलते हैं। कोई ऐसी id जिसे Bird पहचान नहीं पाता, 404 लौटाती है, और आउटबाउंड संदेश में सर्व करने के लिए कोई स्टोर्ड मीडिया नहीं होता।
एक संदेश आने के बाद 30 दिनों तक पढ़ा जा सकता है, और उसका मीडिया उससे ज़्यादा समय तक नहीं रहता। यह एंडपॉइंट फ़ाइल सर्व करने से पहले संदेश पढ़ता है, इसलिए जब वह विंडो बीत जाती है तो दोनों 404 का जवाब देते हैं। जो फ़ाइल आपको ज़्यादा समय तक चाहिए उसे तब तक स्टोर कर लें जब तक संदेश अभी भी पढ़ने योग्य है। एक ऐसा मामला है जो पहले समाप्त होता है: स्टोर्ड बाइट्स विंडो पूरी होने से पहले ही हट जाएँ; तब फ़ेच 410 E15021 का जवाब देता है, और संदेश अभी भी मीडिया के mime_type और caption के साथ पढ़ा जा सकता है।
अंदरूनी तौर पर यह एंडपॉइंट 302 का जवाब देता है जिसमें 15 मिनट के लिए मान्य एक प्रीसाइन्ड URL होता है। SDK और CLI यह हॉप आपके लिए लेते हैं। सीधे कॉल करते समय, प्रीसाइन्ड URL अपना क्रेडेंशियल खुद रखता है, इसलिए रीडायरेक्ट किए गए रिक्वेस्ट को आपका Authorization हेडर भी नहीं भेजना चाहिए। दोनों भेजने पर फ़ेल होता है। curl -L क्रॉस-होस्ट रीडायरेक्ट पर हेडर को अपने आप हटा देता है; जो क्लाइंट हेडर को यथावत फ़ॉरवर्ड करता है उसे Location को एक अलग, बिना ऑथेंटिकेशन वाले रिक्वेस्ट के रूप में फ़ेच करना होगा।

उद्धृत जवाब

in_reply_to_message_id उस संदेश को नाम देता है जिसका इनबाउंड संदेश जवाब देता है, जब WhatsApp इसे रिप्लाई के रूप में चिह्नित करता है:
कोड उदाहरण
{
  "id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
  "direction": "inbound",
  "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
  "text": { "body": "Yes, that one" }
}
WhatsApp हर रिप्लाई को चिह्नित नहीं करता, और एक अचिह्नित रिप्लाई में कोई ID नहीं होती। यह फ़ील्ड तब भी छोड़ दी जाती है जब उद्धृत संदेश को Bird के पास मौजूद किसी संदेश से मिलान नहीं किया जा सकता: इस वर्कस्पेस द्वारा रिकॉर्डिंग शुरू करने से पहले भेजा गया संदेश, या Bird द्वारा WhatsApp की अपनी message id रखने की 15 दिन की सीमा पार कर चुका संदेश। मिलान न होने पर फ़ील्ड छोड़ दी जाती है, रिपोर्ट नहीं की जाती, जो वैसा ही दिखता है जैसे कोई रिप्लाई जो किसी चीज़ का जवाब नहीं देता।
इस फ़ील्ड को एक संकेत मानें, कुंजी नहीं। आपके अपने सेंड पर metadata यहाँ मदद नहीं करता, क्योंकि यह आपके संदेश पर रहता है और कभी संपर्क के जवाब तक नहीं पहुँचता, इसलिए जिस इंटीग्रेशन को यह जानना ज़रूरी है कि कौन सा जवाब किस सवाल का है, वह खुद ट्रैक करता है कि उसने उस संपर्क से आखिरी बार कौन सा सवाल पूछा था। आउटबाउंड पक्ष के लिए किसी संदेश को उद्धृत करना देखें।

वेबहुक

सूची को पोल करने के बजाय इनबाउंड संदेश आते ही उस पर कार्रवाई करने के लिए whatsapp.received की सदस्यता लें। पेलोड इवेंट एन्वेलप के ऊपर कंटेंट रखता है, इसलिए एंडपॉइंट को फ़ॉलो-अप रीड की ज़रूरत नहीं:
कोड उदाहरण
{
  "type": "whatsapp.received",
  "timestamp": "2026-08-25T09:04:11.118Z",
  "data": {
    "whatsapp_id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
    "workspace_id": "ws_01ky7m235keycbnwyajabe1a6b",
    "direction": "inbound",
    "from": { "phone_number": "+14155550100", "display_name": "Alex Rivera" },
    "to": { "phone_number": "+13124495569" },
    "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
    "interactive_reply": {
      "type": "button",
      "button": { "slug": "cancel-booking", "text": "Cancel" }
    },
    "tags": null,
    "metadata": null
  }
}
पूरे एन्वेलप और बाकी इवेंट सूची के लिए WhatsApp इवेंट्स देखें।

अगले कदम