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 देखें।

इन कंटेंट फ़ील्ड में से एक, जिसे arm कहते हैं, उसमें वह होता है जो संपर्क ने भेजा, और किसी भी संदेश पर ठीक एक arm सेट होता है। हर arm का अपना पेज है, जिसमें पढ़ने का स्वरूप, 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?"
  }
}

चैनल के मीडिया मेथड से बाइट्स प्राप्त करें, और उसमें मैसेज 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 के साथ एक presigned URL लौटाता है, जो 15 मिनट तक मान्य रहता है। SDK और CLI यह अगला कदम आपके लिए खुद पूरा करते हैं। सीधे कॉल करने पर, presigned URL में उसका अपना क्रेडेंशियल होता है, इसलिए रीडायरेक्ट किए गए अनुरोध में आपका Authorization हेडर नहीं भेजा जाना चाहिए। दोनों भेजने पर अनुरोध विफल होता है। curl -L किसी दूसरे होस्ट पर रीडायरेक्ट होने पर हेडर खुद हटा देता है। जो क्लाइंट हेडर को ज्यों का त्यों आगे भेजता है, उसे Location को एक अलग, बिना प्रमाणीकरण वाले अनुरोध से फ़ेच करना होगा।

उद्धृत जवाब

जब WhatsApp किसी इनबाउंड संदेश को जवाब के रूप में चिह्नित करता है, तब in_reply_to_message_id उस संदेश को बताता है जिसका वह जवाब है:

कोड उदाहरण
{
  "id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
  "direction": "inbound",
  "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
  "text": { "body": "Yes, that one" }
}

WhatsApp हर जवाब को चिह्नित नहीं करता, और बिना चिह्न वाले जवाब में कोई ID नहीं होती। यह फ़ील्ड तब भी नहीं आता जब उद्धृत संदेश का मिलान Bird के पास मौजूद किसी संदेश से नहीं हो पाता: जैसे इस वर्कस्पेस में संदेश रिकॉर्ड होना शुरू होने से पहले भेजा गया संदेश, या वह संदेश जो उन 15 दिनों से पुराना है जितने समय तक Bird WhatsApp की अपनी संदेश id रखता है। मिलान न होने पर फ़ील्ड कोई गलत मान नहीं देता, बल्कि गायब रहता है, इसलिए यह किसी चीज़ का जवाब न देने वाले संदेश जैसा ही दिखता है।

इस फ़ील्ड को कुंजी नहीं, बल्कि संकेत मानें। आपके भेजे संदेश पर 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 वेबहुक देखें।

अगले कदम

इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।