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 पेलोड, और ध्यान रखने वाली बातें दी गई हैं:
| फ़ील्ड | आने वाले संदेश में इसमें क्या होता है |
|---|---|
text | body, संपर्क द्वारा टाइप किया गया संदेश |
image | एक id, url, mime_type, और कोई भी caption |
video | वही मीडिया फ़ील्ड, साथ में कोई भी caption |
audio | वही मीडिया फ़ील्ड, साथ में वॉइस नोट पर voice; इसमें कैप्शन नहीं होता |
sticker | वही मीडिया फ़ील्ड, साथ में animated |
document | वही मीडिया फ़ील्ड, साथ में कोई भी filename और caption |
location | latitude और 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);media = client.whatsapp.messages.media(
"wam_01kya19eknftrs2s6p82asmvnh", "waf_01kyb2m4xq7whs0d8n3prv6tez"
)
print(media.content_type, media.content_length)media, err := client.Whatsapp.Messages.Media(context.Background(),
"wam_01kya19eknftrs2s6p82asmvnh", "waf_01kyb2m4xq7whs0d8n3prv6tez")
if err != nil {
log.Fatal(err)
}
fmt.Println(media.ContentType, media.ContentLength)$media = $bird->whatsapp->messages->media('wam_01kya19eknftrs2s6p82asmvnh', 'waf_01kyb2m4xq7whs0d8n3prv6tez');
file_put_contents('photo.jpg', $media->data);
echo $media->contentType, ' ', $media->contentLength;bird whatsapp media <message-id> <media-id>curl -L -X GET "https://{region}.platform.bird.com/v1/whatsapp/messages/{message_id}/media/{media_id}" \
-H "Authorization: Bearer $TOKEN"आपको बाइट्स उसी 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 वेबहुक देखें।
अगले कदम
- सर्विस संदेश: इन्हीं सामग्री आर्म का भेजने वाला पक्ष
- WhatsApp संदेश भेजना: सर्विस विंडो के भीतर जवाब देना, और किसी संदेश को उद्धृत करना
- WhatsApp वेबहुक: वे सभी इवेंट जिनकी आप सदस्यता ले सकते हैं
- WhatsApp लॉग: डैशबोर्ड में बातचीत देखना
- WhatsApp ग्रुप मैसेज प्राप्त करना: प्रतिभागी, ग्रुप और ग्रुप की सर्विस विंडो
संबंधित संसाधन
इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।