Description
What is WhatsApp calling over SIP?
WhatsApp calling over SIP is a way of running the WhatsApp Business Calling API through the Session Initiation Protocol (SIP) instead of Graph API calls and webhooks. When SIP is enabled on a business phone number, a customer's WhatsApp call reaches the business as a SIP INVITE that Meta sends to the business's own SIP server — a PBX, a session border controller (SBC) or a cloud contact centre — and the business places outbound WhatsApp calls by sending an INVITE to Meta. Agents keep the phones, queues and call recording they already have; WhatsApp becomes one more trunk.
Configuration lives in the number's calling settings: calling.sip.status set to ENABLED and a servers array with one server's hostname, port (5061 by default) and optional request_uri_user_params, such as a trunk group. Meta's SIP domain is wa.meta.vc, signalling must use TLS, and your server needs a valid certificate for the hostname you configured. Meta generates a SIP password for each number and app, returned as sip_user_password by GET /{PHONE_NUMBER_ID}/settings?include_sip_credentials=true, and digest authentication runs both ways: you answer a 407 Proxy Authentication Required when you call out, and you can challenge Meta's INVITEs for inbound calls.
Media is the part teams underestimate. By default the SDP must support ICE, DTLS-SRTP and Opus (opus/48000/2), so the SBC has to handle WebRTC-style media rather than your application code. Choosing SDES key exchange instead puts the SRTP key in the SDP and removes ICE, STUN and DTLS, and PCMA and PCMU can be enabled alongside Opus. Meta tags its SIP messages with headers such as x-wa-meta-wacid (the call ID), x-wa-meta-phone-number-id, x-wa-meta-cta-payload and, on BYE, x-wa-meta-call-duration. The protocol itself is covered on the SIP page; this one is the WhatsApp-specific integration.
Key takeaways
- WhatsApp calling over SIP routes Calling API calls to and from your own SIP server, such as a PBX, SBC or contact centre, instead of the Graph API call endpoints.
- Enable it per number in
calling.sipsettings with one server'shostnameandport(5061 by default); signalling to and fromwa.meta.vcis TLS only. - Meta uses SIP digest authentication with a per-number password from
GET /{PHONE_NUMBER_ID}/settings?include_sip_credentials=true. - Media is DTLS-SRTP with ICE by default, or SDES-keyed SRTP; Opus is required, and PCMA and PCMU can be added.
- With SIP on, the calling Graph endpoints are unavailable and calling webhooks stop unless you enable
webhook_delivery.
Properties
WhatsApp calling over SIP: key facts and limits
- Meta SIP domain
- wa.meta.vc
- Transport
- TLS only; your server on port 5061 by default
- SIP servers per number
- One
- Authentication
- SIP digest, Meta-generated password per number and app
- Media
- DTLS-SRTP with ICE (default) or SDES-keyed SRTP
- Codecs
- Opus required; PCMA and PCMU optional
- Call webhooks
- Off unless webhook_delivery is ENABLED; no SDP in them
- Diagnostics
- Health Status API field can_receive_call_sip
Mechanics
How does WhatsApp calling over SIP work?
step 1 — Prepare the SIP server
Expose TLS (port 5061 by default) with a valid certificate for the hostname, support digest authentication and Opus, and allowlist Meta's published IP addresses for both signalling and media.
step 2 — Enable SIP on the number
POST
calling.sipwithstatus: ENABLEDand one entry inservers; addrequest_uri_user_paramsfor trunk routing andwebhook_delivery: ENABLEDif your CRM still needs call events.step 3 — Fetch the SIP password
Read
sip_user_passwordfromGET /{PHONE_NUMBER_ID}/settings?include_sip_credentials=trueand keep it in a secrets store. To rotate it, disable SIP with an empty server list, re-enable it and fetch again.step 4 — Take inbound calls
Meta sends an INVITE to your server for each user-initiated call. Challenge it with digest auth, read the
x-wa-meta-*headers to route it, and answer 200 OK with your SDP.step 5 — Place outbound calls
Send an INVITE to
sip:+<E.164 number>@wa.meta.vc;transport=tls, answer Meta's 407 with aProxy-Authorizationheader, and call only users who have granted call permission.step 6 — Diagnose
Test the certificate with
openssl s_client -verify_hostname, and check the Health Status API'scan_receive_call_sipfield when calls do not arrive.
Usage
WhatsApp calling over SIP in code
POST https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/settingsAuthorization: Bearer {ACCESS_TOKEN}Content-Type: application/json{"calling": {"status": "ENABLED","sip": {"status": "ENABLED","webhook_delivery": "ENABLED","servers": [{"hostname": "sbc.example.in","port": 5061,"request_uri_user_params": { "tgrp": "wacall", "trunk-context": "byoc.example.in" }}]},"audio": { "additional_codecs": ["PCMA", "PCMU"] }}}
One SIP server per number. With SIP enabled, the number signals calls only over SIP.
Caveats
Common mistakes with WhatsApp calling over SIP
A certificate that does not match the hostname
Meta validates your server's certificate against the configured hostname, and a mismatch fails the TLS handshake before any INVITE is sent. Test with
openssl s_client -verify_hostnamebefore enabling SIP.An SBC that cannot do ICE and DTLS
Calls set up but carry no audio when the media path cannot complete ICE and DTLS-SRTP. Upgrade the SBC's WebRTC support or switch to SDES key exchange.
Expecting Graph endpoints and webhooks to keep working
With SIP enabled, the calling Graph endpoints are unavailable and calling webhooks stop. Turn on
webhook_deliveryif other systems depend oncall_createdandterminateevents.Firewall rules based on SIP headers
Allowlist Meta's IP addresses by packet source for signalling and media, not by addresses in headers such as
Via. mTLS covers signalling only, never media.Several apps, several SIP servers
A number supports one SIP server, and when several apps configure their own, Meta ends the call as soon as any server sends BYE. Keep one integration in charge of the number's calls.
Why it matters
Why does WhatsApp calling over SIP matter?
Most businesses that take calls already own a voice stack: queues, IVR, skills routing, recording, quality monitoring and workforce management. Rebuilding all of it in WebRTC just for WhatsApp makes little sense. SIP lets WhatsApp calls land in the same contact centre as phone calls, routed by the same rules to the same agents, while the call stays a WhatsApp call for the customer: free to place from the chat they were already in, and tied to their WhatsApp identity.
Example
Example: A Chennai lender's contact centre takes WhatsApp calls
A Chennai-based consumer lender already runs an SBC and queue software for its toll-free line. It enables SIP on its WhatsApp number, pointing at its SBC on port 5061 with tgrp=wacall, so WhatsApp calls arrive on their own trunk group. The IVR reads x-wa-meta-cta-payload: callers who tapped "Call about my loan" in a repayment reminder skip the menu and reach the loans queue with the loan ID already on screen, while callers from the chat header go to a Tamil-or-English language menu. Recording and quality review work unchanged, and with webhook_delivery on, the CRM logs each call against the customer's chat history.
Notes
Best practices for WhatsApp calling over SIP
- Use
request_uri_user_paramssuch astgrpto land WhatsApp calls on their own trunk group. - Map
x-wa-meta-cta-payloadandx-wa-meta-deeplink-payloadinto the IVR to skip menus for known contexts. - Store
sip_user_passwordin a secrets manager and rotate it by disabling and re-enabling SIP. - Log
x-wa-meta-wacidon every call record to join it to chat history and Meta's call events.
Questions
WhatsApp Calling over SIP FAQs
- Can I connect WhatsApp Business calls to my existing PBX?
- Yes, if it can speak SIP over TLS with digest authentication and Opus. Enable SIP in the number's calling settings and point it at your SIP server or SBC: user-initiated calls then arrive as INVITEs, and outbound calls go to
wa.meta.vc. - What is wa.meta.vc?
- It is Meta's SIP domain for WhatsApp calling. Your server sends business-initiated INVITEs to
sip:+<E.164 number>@wa.meta.vc;transport=tls, and Meta answers with a digest challenge before connecting the call. - Do I still need WebRTC with WhatsApp SIP calling?
- Not in your application code, but your media path must meet Meta's requirements. By default that means ICE, DTLS-SRTP and Opus at the SBC; choosing SDES removes ICE and DTLS and keys SRTP from the SDP instead.
- Do WhatsApp calling webhooks still arrive when SIP is enabled?
- Not by default. With SIP on, the calling Graph endpoints are unavailable and calling webhooks stop unless you set
webhook_deliverytoENABLED, which sendscall_createdandterminateevents without SDP. - How do I get the SIP password for WhatsApp calling?
- Call
GET /{PHONE_NUMBER_ID}/settings?include_sip_credentials=trueand readsip_user_passwordunder the server entry. Meta generates one per number and app; to rotate it, disable SIP with an empty server list, re-enable it and fetch the new password.