WhatsApp contact info requests
Contact info request एक WhatsApp संदेश के नीचे एक बटन लगाता है जो प्राप्तकर्ता से फ़ोन नंबर साझा करने के लिए कहता है। इसे तब उपयोग करें जब आपको किसी से संपर्क करने के लिए नंबर चाहिए, जैसे कॉलबैक या बुकिंग पुष्टि के लिए, न कि किसी सेव किए गए पते के लिए। लोकेशन के लिए, location requests का उपयोग करें।
Contact info request भेजें
interactive.type को request_contact_info पर सेट करें, एक body_text के साथ और कुछ नहीं। WhatsApp बटन को खुद रेंडर करता है, इसलिए इसे लेबल करने के लिए कुछ नहीं है:
const msg = await bird.whatsapp.send({
to: "+16505551234",
from: "+13124495648",
interactive: {
type: "request_contact_info",
body_text:
"To confirm your booking we need a number to reach you on. Tap below to share yours.",
},
});
console.log(msg.id, msg.status);msg = client.whatsapp.send(
to="+16505551234",
from_="+13124495648",
interactive={
"type": "request_contact_info",
"body_text": "To confirm your booking we need a number to reach you on. Tap below to share yours.",
},
)
print(msg.id, msg.status)package main
import (
"context"
"fmt"
"log"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+16505551234",
From: "+13124495648",
Interactive: &bird.WhatsAppInteractiveSend{
Type: "request_contact_info",
BodyText: "To confirm your booking we need a number to reach you on. Tap below to share yours.",
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)
}$interactive = (new WhatsAppMessageSendRequestInteractive())
->setType('request_contact_info')
->setBodyText('To confirm your booking we need a number to reach you on. Tap below to share yours.');
$message = $bird->whatsapp->send(
to: '+16505551234',
from: '+13124495648',
interactive: $interactive,
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--from +13124495648 \
--interactive '{"body_text":"To confirm your booking we need a number to reach you on. Tap below to share yours.","type":"request_contact_info"}' \
--to +16505551234{
"name": "whatsapp_send",
"arguments": {
"from": "+13124495648",
"interactive": {
"body_text": "To confirm your booking we need a number to reach you on. Tap below to share yours.",
"type": "request_contact_info"
},
"to": "+16505551234"
}
}curl -X POST "https://{region}.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "+16505551234",
"from": "+13124495648",
"interactive": {
"type": "request_contact_info",
"body_text": "To confirm your booking we need a number to reach you on. Tap below to share yours."
}
}'from हर service message पर ज़रूरी है: आपके वर्कस्पेस का अपना नंबर, Bird-managed नहीं। इस type का कोई अपना फ़ील्ड नहीं है, और schema header, footer_text, और हर दूसरे type के फ़ील्ड (buttons, list, cta_url, cards) को पूरी तरह रोकता है, इसलिए body_text ही पूरा संदेश है, जो अधिकतम 1,024 कैरेक्टर का हो सकता है। Meta इस type के लिए कोई body-length सीमा नहीं बताता; Bird वह 1,024-कैरेक्टर सीमा लागू करता है जो list menu को छोड़कर हर दूसरे interactive type पर लागू होती है।
in_reply_to_message_id इस type पर भी काम करता है, उसी बातचीत में किसी पुराने संदेश को quote करने के लिए। resolution कैसे काम करता है और क्या छूट सकता है, इसके लिए हब का quoting a message to correlate a reply देखें।
साझा किए गए contact को पढ़ना
टैप करने पर कोई interactive_reply नहीं बनता। यह एक सामान्य inbound संदेश के रूप में आता है जिसमें एक contact_cards array होता है:
कोड उदाहरण
{
"id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
"direction": "inbound",
"from": { "phone_number": "+16505551234", "bsuid": "US.13491208655302741918" },
"to": { "phone_number": "+13124495648" },
"status": "received",
"contact_cards": [
{
"origin": "contact_request",
"phone_numbers": [{ "phone_number": "+14155550829", "type": "cell" }]
}
],
"created_at": "2026-08-26T10:00:00Z"
}contact_cards एक array है, और जिस contacts संदेश में कोई card नहीं था, वह absent फ़ील्ड के बजाय [] के रूप में वापस आता है। यही फ़ील्ड आपके द्वारा भेजा गया card भी ले जाता है, इसलिए इस अनुरोध का जवाब देने वाले card को origin से अलग पहचाना जाता है, न कि उस फ़ील्ड से जिस पर वह आता है। किसी card को अपना जवाब मानने से पहले origin की जाँच अनिवार्य है। origin तब contact_request होता है जब card इस अनुरोध का जवाब है, या other जब contact ने बिना माँगे card साझा किया, जो पूरी तरह किसी तीसरे व्यक्ति का हो सकता है और contact का बिल्कुल नहीं। टैप में केवल phone_numbers[].{phone_number, type} होता है और vcard नहीं आता; पूरा contact object, जिसमें name, org, birthday और बाकी सब शामिल है, केवल origin: "other" पर आता है। आप यह रिप्लाई message list या GET /v1/whatsapp/messages/{id} के ज़रिए देखते हैं; उस पूरे पथ के लिए हब का reading a reply देखें।
जवाब को सवाल से जोड़ना
Location request के विपरीत, Meta इस type के रिप्लाई पर कोई context नहीं डालता, इसलिए in_reply_to_message_id resolve होने के बजाय omit हो जाता है। from और अपने हाल के send के आधार पर correlate करें, या स्वीकार करें कि यह संभव नहीं है। एक ही contact को भेजे गए दो अनुत्तरित अनुरोध अलग नहीं किए जा सकते: रिप्लाई पर कुछ भी यह नहीं बताता कि वह किस अनुरोध का जवाब है, इसलिए जो वर्कस्पेस पहले का जवाब आने से पहले दूसरा contact info request भेजता है, वह नहीं बता सकता कि कौन सा card किसके जवाब में आया।
यह location requests से जानबूझकर किया गया अंतर है: उस type का रिप्लाई Meta का अपना context लेकर आता है, इसलिए in_reply_to_message_id resolve हो जाता है और हब का quoting a message to correlate a reply तंत्र जवाब को अपने आप वापस जोड़ देता है। Contact info request के रिप्लाई में ऐसा कोई तंत्र नहीं है।
इसके बजाय template के अंदर पूछना
request_contact_info interactive message, REQUEST_CONTACT_INFO template button का फ्री-फ़ॉर्म समकक्ष है, जो उसी contact card की माँग करता है लेकिन उस प्राप्तकर्ता तक पहुँच सकता है जिसकी customer service window बंद है। Interactive message तब उपयोग करें जब प्राप्तकर्ता ने हाल ही में आपको संदेश भेजा हो और आप इस बातचीत के लिए अनुरोध को अपने शब्दों में लिखना चाहें; template button तब उपयोग करें जब window बंद हो, या जब यह अनुरोध उस संदेश के साथ जाए जिसे आप पहले से template के रूप में भेजते हैं। Template से भेजने के लिए WhatsApp templates देखें।
ध्यान देने योग्य बातें
- Customer service window खुली होनी चाहिए। Contact info request एक service message है, जो केवल खुली window के अंदर डिलीवर हो सकता है; हब की customer service window देखें। Window की जाँच fail-open है, इसलिए 202 इस बात का प्रमाण नहीं है कि भेजते समय window वास्तव में खुली थी।
- from आपके वर्कस्पेस का अपना नंबर होना चाहिए, और जिस window का खुला होना ज़रूरी है वह उस नंबर से जुड़ी है, पूरे वर्कस्पेस से नहीं।
- रिप्लाई को id से अनुरोध से नहीं जोड़ा जा सकता। Meta की तरफ़ कोई context न होने का मतलब है कि रिप्लाई पर in_reply_to_message_id omit हो जाता है; from और अपने हाल के send के आधार पर correlate करें।
- अस्वीकृति मौन होती है। WhatsApp प्राप्तकर्ता को एक share sheet दिखाता है, और उसे dismiss करने पर न कोई संदेश आता है और न कोई webhook। contact_cards संदेश की अनुपस्थिति ही एकमात्र संकेत है, इसलिए जवाब का इंतज़ार करने वाले किसी भी flow को decline event के बजाय अपना खुद का timeout लगाना होगा।
- कोई हेडर नहीं, कोई फ़ुटर नहीं, और कोई बटन लेबल नहीं। Schema इस type पर header और footer_text को पूरी तरह रोकता है, और बटन को लेबल करने के लिए कोई फ़ील्ड नहीं है। प्राप्तकर्ता जो कुछ भी पढ़ता है वह body_text में होना चाहिए।
- साझा किया गया नंबर उस नंबर से मेल खाएगा इसकी गारंटी नहीं है जिससे contact चैट कर रहा है। Meta चेतावनी देता है कि उपयोगकर्ता की ID और फ़ोन नंबर हमेशा मेल नहीं खा सकते, इसलिए यह न मानें कि साझा किया गया नंबर from.phone_number के बराबर है। यह E.164 होगा इसकी भी गारंटी नहीं है: Bird जहाँ parse हो सके वहाँ इसे normalize करता है और जहाँ न हो सके वहाँ जैसा है वैसा पास करता है।
- रिप्लाई एक contact_cards संदेश है, interactive_reply नहीं। जो integration केवल टैप के लिए interactive_reply देखता है वह इस type को पूरी तरह मिस कर देगा, और वह भी जो केवल दूसरे request type के लिए inbound location देखता है।
Schema यहाँ जो भी व्यक्त कर सकता है, एक बहुत लंबा body_text, एक header, एक footer_text, या buttons, list, cta_url, cards में से कोई भी, बिना किसी catalog code के एक सामान्य request-validation failure है। जो quote resolve नहीं होता वह कुछ भी बनने या चार्ज होने से पहले request को fail कर देता है: 404 E15071 जब id ऐसे संदेश का नाम लेती है जो इस वर्कस्पेस में नहीं है, 422 E15072 जब वह ऐसे संदेश का नाम लेती है जिसे quote नहीं किया जा सकता। पूरी interactive error table के लिए हब का errors और किसी भी WhatsApp send में आने वाली errors के लिए Sending WhatsApp messages देखें।
अगले कदम
- WhatsApp interactive messages: सभी छह interactive types में क्या समान है
- Location requests: फ़ोन नंबर के बजाय लोकेशन माँगें
- WhatsApp templates: उस प्राप्तकर्ता तक पहुँचें जिसकी customer service window बंद है
- Sending WhatsApp messages: request envelope, 202 मॉडल, और सुरक्षित फिर से प्रयास
संबंधित संसाधन
इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।
गाइड देखेंConnecting WhatsApp to Bird: from buying a number to a live channelकॉन्सेप्ट समझेंWhat is the 24-hour customer service window on WhatsApp?टूल का उपयोग करेंWhatsApp message builderक्षमता जानेंWhatsApp
अभ्यास करें और इम्प्लीमेंटेशन ब्रीफ़ पाएँ