# Calling

# Cloud API Calling | Developer Documentation

<div id="bkmrk-cloud-api-callingupd">## Cloud API Calling

<div><span>Updated: Mar 10, 2026</span></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>The WhatsApp Business Calling API enables you to initiate and receive calls with users on WhatsApp using Voice over Internet Protocol (VoIP).</div><div id="bkmrk-value-proposition-%28c"><div id="bkmrk-value-proposition-%28c-1"><div>### Value proposition (concise)

</div></div></div><div>**WhatsApp Business Calling: Trusted, Multi-Modal, Feature-Rich Global Connection.**</div><div><table><thead><tr><th><span>Value</span></th><th><span>Description</span></th></tr></thead><tbody><tr><td><div>**Unified Communication**</div></td><td><div>One Number. Message and call. Worldwide.</div></td></tr><tr><td><div>**Branding and Trust**</div></td><td><div>Branding that is built-in, trusted, and global.</div></td></tr><tr><td><div>**Customer Relationship**</div></td><td><div>Increase Stickiness. Deepen Personal Touch.</div></td></tr><tr><td><div>**Sales and Support**</div></td><td><div>Unify Marketing and Support. Unlock Upsell.</div></td></tr><tr><td><div>**Rich Features**</div></td><td><div>Video*, Screen Share*, and Full Call Customization.</div></td></tr><tr><td><div>**Call Deflection**</div></td><td><div>Call in WhatsApp. Improve deflection rates.</div></td></tr><tr><td><div>**Customer Convenience**</div></td><td><div>Free, Universal Access for your customers.</div></td></tr><tr><td><div>**Record Keeping**</div></td><td><div>One Thread. Centralized, Long-Term Record.</div></td></tr></tbody></table>

</div><div id="bkmrk-benefits-for-end-use"><div id="bkmrk-benefits-for-end-use-1"><div>#### Benefits for end-users

</div></div></div><div><table><thead><tr><th><span>Value</span></th><th><span>Description</span></th></tr></thead><tbody><tr><td><div>**Universal Access**</div></td><td><div>Simple, free, and familiar global connection.</div></td></tr><tr><td><div>**Enhanced Safety**</div></td><td><div>Safer due to built-in platform trust/verification.</div></td></tr><tr><td><div>**Centralized History**</div></td><td><div>One unified thread for all voice and text history.</div></td></tr><tr><td><div>**Voicemail Integrated**</div></td><td><div>A voicemail* playable within the chat context.</div></td></tr></tbody></table>

</div><div>Disclaimer: * Feature planned or in development. Reach out to your Meta or partner for more details</div><div id="bkmrk-value-proposition-%28d"><div id="bkmrk-value-proposition-%28d-1"><div>### Value proposition (detailed)

</div></div></div><div>The WhatsApp Business Calling API allows businesses to integrate voice and video* calling directly into their customer engagement strategy, offering a trusted, unified, and feature-rich communication channel.</div><div><table><thead><tr><th><span>Feature </span></th><th><span>Benefit for Your Business </span></th></tr></thead><tbody><tr><td><div><div>**Unified Communication**</div></div></td><td><div><div>**One Number. All Communication. Multi-modal.**Use a single, verified WhatsApp number for all messaging and calling (inbound and outbound), enabling a seamless flow between chat and call, and even chatting while on a call.</div></div></td></tr><tr><td><div><div>**Branding and Trust**</div></div></td><td><div><div>**Branding that is built-in, trusted, and global.**WhatsApp has native support for brand identity with security and verification, which provides instant trust globally, eliminating the need for region-specific third-party trust providers.</div></div></td></tr><tr><td><div><div>**Customer Relationship**</div></div></td><td><div><div>**Increase Stickiness. Deepen Personal Touch.**A single point of contact for both inbound and outbound communication enhances personal touch, increases customer stickiness, and ensures lasting customer loyalty.</div></div></td></tr><tr><td><div><div>**Sales and Support**</div></div></td><td><div><div>**Unify Marketing and Support. Unlock Upsell.**Centralize lead management by unifying support and marketing channels, which streamlines operations and unlocks opportunities for product upsell and cross-sell.</div></div></td></tr><tr><td><div><div>**Rich Features**</div></div></td><td><div><div>**More Than a Call. Get Video*, Screen Sharing*, and Advanced Control.**Beyond voice, businesses can engage customers with video calls and screen sharing for richer, more detailed support and service. Businesses also control the calling experience by configuring calling hours, managing call icon visibility, sending call buttons with expiry, using call deeplinks.</div></div></td></tr><tr><td><div><div>**Call Deflection**</div></div></td><td><div><div>**Call in WhatsApp. Improve deflection rates.**By moving calls to WhatsApp, businesses can seamlessly guide customers to a richer chat experience, leveraging interactive messaging templates to improve deflection and reduce voice-only support costs.</div></div></td></tr><tr><td><div><div>**Customer Convenience**</div></div></td><td><div><div>**Always Free, Always Universal Access.**Offer your customers a convenient and globally accessible communication method that is free for them to use.</div></div></td></tr><tr><td><div><div>**Record Keeping**</div></div></td><td><div><div>**One Thread. Centralized, Long-Term Record.**Maintain a single, persistent thread of all text and voice communications with the customer, serving as a centralized, long-term record for reference.</div></div></td></tr></tbody></table>

</div><div>Disclaimer: * Feature planned or in development. Reach out to your Meta or partner for more details</div><div id="bkmrk-architecture"><div id="bkmrk-architecture-1"><div>### Architecture

</div></div></div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-6fucfh4a.jpeg)(*Right click image and choose “Open in new tab” for enlarged image*)</div><div id="bkmrk-signaling-and-media-"><div id="bkmrk-signaling-and-media--1"><div>#### Signaling and media possible configurations

</div></div></div><div><table><thead><tr><th></th><th><span>Default configuration after enabling calling </span></th><th><span>SIP with WebRTC </span></th><th><span>SIP with SDES media </span></th></tr></thead><tbody><tr><td><div><div>Signaling protocol</div></div></td><td><div><div>Graph APIs + Webhooks</div></div></td><td><div><div>SIP (needs explicit [enablement](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation))</div></div></td><td><div><div>SIP (needs explicit [enablement](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation))</div></div></td></tr><tr><td><div><div>Signaling transport</div></div></td><td><div><div>HTTPS</div></div></td><td><div><div>TLS</div></div></td><td><div><div>TLS</div></div></td></tr><tr><td><div><div>Media protocol</div></div></td><td><div><div>WebRTC (ICE + DTLS<sup>1</sup> + SRTP)</div></div></td><td><div><div>WebRTC (ICE + DTLS + SRTP)</div></div></td><td><div><div>[SDES<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc4568&h=AT4ICNy6ccJ6BY2qfVHlO1Ho3TprO7bBA7ECl0AhYSK2yu-kwaIrXcC7Sjdh_SynPr9uS_gqg_9hbQbVkvAtqRmgdxXZjVI7eqKNxWwt_UnyxFHle5EUNnVgNeVDsqNYTvHseEMfiHoQyfOnHF9rzA) SRTP (needs explicit [enablement](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation))</div></div></td></tr><tr><td><div><div>Audio codec<sup>2</sup></div></div></td><td><div><div>OPUS</div></div></td><td><div><div>OPUS</div></div></td><td><div><div>OPUS</div></div></td></tr></tbody></table>

</div><div>**Notes**</div>
<span>You can use SDES instead of ICE+DTLS with Graph API + Webhook signaling</span><span>Additional audio codecs supported: PCMA, PCMU</span><div id="bkmrk-get-started"><div id="bkmrk-get-started-1"><div>### Get started

</div></div></div><div id="bkmrk-step-1%3A-prerequisite"><div id="bkmrk-step-1%3A-prerequisite-1"><div>#### Step 1: Prerequisites

</div></div></div><div>Before you get started with the Calling API, ensure that:</div>
<span>[Your business number is in use with Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation) (not the WhatsApp Business app)</span><span>Subscribe your app to the `calls` webhook field (unless you plan to use [SIP](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation))</span><span>The same app should also be [subscribed to the WhatsApp Business Account](/books/meta-whatsapp/page/create-a-webhook-endpoint-developer-documentation) of your business phone number.</span><span>This app should have messaging permissions (`whatsapp_business_messaging`) for the business number</span><span>The business must have a daily [messaging limit](/books/meta-whatsapp/page/messaging-limits-developer-documentation) of at least 2,000 unique recipients. More details on [scaling your account capabilities<span>⁠</span>](https://www.facebook.com/business/help/595597942906808).</span><span>[Enable Calling features on your business phone number](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</span><div id="bkmrk-step-2%3A-configure-op"><div id="bkmrk-step-2%3A-configure-op-1"><div>#### Step 2: Configure optional calling features

</div></div></div><div>The WhatsApp Business Calling API offers a number of features that affect when and how calling features appear to users on your WhatsApp profile</div>
<span>Inbound call control allows you to prevent users from placing calls from your business profile</span><span>Business call hours allows you to avoid missed calls and direct users to message when your call center is closed</span><span>Callback requests offer users the option to request a callback when you don’t pick up a call or if your call center is closed</span><div>[Learn more about call control settings](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div><div id="bkmrk-step-3%3A-make-and-rec"><div id="bkmrk-step-3%3A-make-and-rec-1"><div>#### Step 3: Make and receive calls

</div></div></div><div><span></span><div>You can test your WhatsApp Calling integration using public test numbers and Sandbox WhatsApp Business Account.</div><div>[Learn more about testing your WhatsApp Calling API integration](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation)</div></div><div>Cloud API Calling offers two call initiation paths:</div>
<span>**User-initiated calls:** Calls that are made from a WhatsApp user to your business</span><span>**Business-initiated calls:** Calls that are made from your business to a WhatsApp user</span><div id="bkmrk-testing-and-sandbox-"><div id="bkmrk-testing-and-sandbox--1"><div>### Testing and Sandbox accounts

</div></div></div><div><span></span><div>Sandbox accounts are only available to Tech Partners.</div></div><div>[Sandbox accounts](/books/meta-whatsapp/page/set-up-a-sandbox-account-for-calling-developer-documentation) and public test numbers enable you to test you WhatsApp Calling API integration with relaxed calling limitations. Specifically business initiated calling limits are relaxed for Sandbox accounts and public test numbers to help integration and testing efforts.</div><div id="bkmrk-limits-%28per-business"><div id="bkmrk-limits-%28per-business-1"><div>##### Limits (Per business + WhatsApp user pair)

</div></div></div>
<span>Sandbox accounts can send **25 call permissions per day** and **100 per week** (compared to 1 per day and 2 per week for production accounts)</span><span>When business-initiated calls go unanswered or are rejected </span>
<span>**5 consecutive unanswered calls** result in system message to reconsider an approved permission (compared to 2 consecutive unanswered calls for production accounts)</span><span>**10 consecutive unanswered calls** result in an approved permission being automatically revoked. (compared to 4 consecutive unanswered calls for production accounts)</span><div>You obtain a public test number after completing the [Get Started flow.](/books/meta-whatsapp/page/get-started-developer-documentation)</div><div>Your business is <u>not</u> required to have a daily [messaging limit](/books/meta-whatsapp/page/messaging-limits-developer-documentation) of 2,000 unique recipients to test Calling API features when using public test numbers and Sandbox accounts.</div><div>Calling is disabled by default on test numbers. You must [configure calling features in phone number call settings](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) before using the Calling API on a test number.</div><div>[Learn more about Sandbox Accounts for Calling](/books/meta-whatsapp/page/embedded-signup-developer-documentation)</div><div id="bkmrk-availability"><div id="bkmrk-availability-1"><div>### Availability

</div></div></div><div id="bkmrk-user-initiated-calli"><div id="bkmrk-user-initiated-calli-1"><div>##### User-initiated calling

</div></div></div><div>User-initiated calling is available in [every location Cloud API is available](/books/meta-whatsapp/page/faqs-developer-documentation).</div><div id="bkmrk-business-initiated-c"><div id="bkmrk-business-initiated-c-1"><div>##### Business-initiated calling

</div></div></div><div>Business-initiated calling is currently available in [every location Cloud API is available](/books/meta-whatsapp/page/faqs-developer-documentation), **except the following countries:**</div>
<span>USA</span><span>Canada</span><span>Egypt</span><span>Vietnam</span><span>Nigeria</span><div>**Note:** The business phone number’s country code must be in this supported list. The consumer phone number can be from any [country where Cloud API is available.](/books/meta-whatsapp/page/faqs-developer-documentation)</div><div id="bkmrk-next-steps"><div id="bkmrk-next-steps-1"><div>### Next steps

</div></div></div><div>Use the guides below to integrate calling features in your application:</div>
<span>[Learn how to receive user-initiated calls](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation)</span><span>[Learn how to place business-initiated calls](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation)</span><span>[Learn how to drive consumer awareness of calling availability in your business](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)</span><div id="bkmrk-changelog"><div id="bkmrk-changelog-1"><div>### Changelog

</div></div></div><div>Use this table as a centralized place to keep track of feature updates related to WhatsApp Business Calling APIs</div><div><table><thead><tr><th><span>Date </span></th><th><span>Title </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>March 23, 2026</div></div></td><td><div><div>Support for G.711 (PCMA, PCMU) audio codec</div></div></td><td><div><div>New section for G.711 (PCMA/PCMU) audio codec configuration in call settings, including guidelines on transcoding, audio quality, and bandwidth considerations. [Learn more about audio codec settings](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</div></div></td></tr><tr><td><div><div>January 27, 2026</div></div></td><td><div><div>Calling restrictions based on user feedback are now in effect</div></div></td><td><div><div>Learn more about [calling restrictions based on user feedback](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</div></div></td></tr><tr><td><div><div>December 19, 2025</div></div></td><td><div><div>Update in business initiated call limit</div></div></td><td><div><div>The number of business-initiated calls per user has been increased to 100 per day from 10 per day.</div><div>[Learn more about business-initiated call limits](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div></div></td></tr><tr><td><div><div>December 10, 2025</div></div></td><td><div><div>Introduced `restrict_to_user_countries` for call icon settings</div></div></td><td><div><div>Now you can control in which countries the call icon should be visible. [Learn more about call icon country settings](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</div></div></td></tr><tr><td><div><div>October 13, 2025</div></div></td><td><div>
<span>Update in business initiated call limit</span><span>Added “Testing and Sandbox” section to documentation</span></div></td><td><div><div>The number of business-initiated calls per user has been increased to 10 per day from 5 per day.</div><div>[Learn more about business-initiated call limits](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div><div>A [Testing and Sandbox accounts](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) has been added to the documentation</div></div></td></tr><tr><td><div><div>September 29, 2025</div></div></td><td><div><div>Asterisk integration guide</div></div></td><td><div><div>New guide to [integrate with Asterisk](/books/meta-whatsapp/page/integration-examples-developer-documentation)</div></div></td></tr><tr><td><div><div>September 24, 2025</div></div></td><td><div><div>Context propagation from call buttons and deep links</div></div></td><td><div><div>Specify an opaque string in call buttons or call deep links to help with tracking the origin of user-initiated calls. [Learn more](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)</div></div></td></tr><tr><td><div><div>September 8, 2025</div></div></td><td><div><div>Health status API calling update</div></div></td><td><div><div>[Health Status API](/documentation/business-messaging/whatsapp/support/health-status) is now extended to include a new `can_receive_call_sip` field to help you self-diagnose issues related to [SIP](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) setup</div></div></td></tr><tr><td><div><div>September 5, 2025</div></div></td><td><div><div>Introduced new low call pickup calling restrictions</div></div></td><td><div><div>Low call pickup rate restrictions are now in effect. Learn more at [Calling Restriction for Low Call Pickup Rates](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div></div></td></tr><tr><td><div><div>July 21, 2025</div></div></td><td><div><div>Account settings update webhooks</div></div></td><td><div><div>Get webhooks when settings are updated. [Learn more](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</div></div></td></tr></tbody></table>

</div></div>

# Configure Call Settings | Developer Documentation

<div id="bkmrk-configure-call-setti">## Configure Call Settings

<div><span>Updated: Mar 23, 2026</span></div><div><div>**Calling is not enabled by default on a business phone number**</div><div>Use the endpoint to enable Calling API features on a business phone number.</div></div><div><div>**Calling Eligibility**</div><div>To qualify for Calling API features, your business must have a messaging limit of at least 2000 business-initiated conversations in a rolling 24-hour period.</div><div>[Learn more about Quality Ratings and Messaging Limits](/books/meta-whatsapp/page/messaging-limits-developer-documentation)</div></div><div><div>When you test your WhatsApp Calling integration using public test numbers (PTNs) and sandbox accounts, Calling API restrictions are relaxed.</div><div>[Learn more about testing your WhatsApp Calling API integration](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation)</div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>Use these endpoints to view and configure call settings for the WhatsApp Business Calling API.</div><div>You can also [configure session initiation protocol (SIP)](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) for call signaling instead of using Graph API endpoint calls and webhooks.</div><div id="bkmrk-configure%2Fupdate-bus"><div id="bkmrk-configure%2Fupdate-bus-1"><div>### Configure/Update business phone number calling settings

</div></div></div><div>Use this endpoint to update call settings configuration for an individual business phone number.</div><div><div>**WhatsApp clients reflecting latest calling config**</div><div>After you update call configuration, WhatsApp users may take up to 7 days to reflect those changes. Most users refresh much sooner. You can force an immediate refresh in WhatsApp by entering the chat window with business and open the chat info page. Regardless of WhatsApp client behavior, the semantics of settings are still honored on the server side.</div></div><div id="bkmrk-endpoint-parameters"><div id="bkmrk-endpoint-parameters-1"><div>#### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
ID of the business phone number for which you are updating Calling API settings.</div></div></td><td><div><div>`106540352242922`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-calling-status"><div id="bkmrk-calling-status-1"><div>#### Calling status

</div></div></div><div>When the `status` parameter is set to `“ENABLED”`, calling features are enabled for the business phone number. WhatsApp client applications will render the call button icon in both the business chat and business chat profile.</div><div>When the `status` parameter is set to `“DISABLED”`, calling features are **disabled**, and both the business chat and business chat profile **do not display the call button icon.**</div><div>Updates to `status` will update the call button icon in existing business chats in near real-time when the business phone number is in the WhatsApp user’s contacts.</div><div>Otherwise, updates are real-time for a limited number of users in conversation with the business, and are eventual for the rest of the conversations.</div><div id="bkmrk-call-button-icon-vis"><div id="bkmrk-call-button-icon-vis-1"><div>##### Call button icon visibility

</div></div></div><div>When Calling API features are enabled for a business number, you can still choose whether to show the call button icon or not by using the `call_icon_visibility` parameter. Note: Disabling call button icon visibility **does not** disable a WhatsApp user’s ability to make unsolicited calls to your business.</div><div>The behavior for supported options is as follows:</div><div>`DEFAULT`</div><div>The Call button icon will be displayed in the chat menu bar and the business info page, allowing for unsolicited calls to the business by WhatsApp users.</div><div>![Screenshot showing call button icon displayed in WhatsApp chat](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-vsrvmbcw.jpeg)</div><div>`DISABLE_ALL`</div><div>The call button icon is hidden in the chat menu bar and the business info page, and all other entry points external to the chat are also disabled. Consumers cannot make unsolicited calls to the business.</div><div>Your business can still [send interactive messages](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) or [template messages](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) with a Calling API CTA button.</div><div>![Screenshot showing hidden call button icon in WhatsApp chat](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-ubnhuyaf.jpeg)</div><div id="bkmrk-callback-permissions"><div id="bkmrk-callback-permissions-1"><div>#### Callback permissions

</div></div></div><div>Calling a WhatsApp user requires explicit permission from the user. One way to obtain calling permissions is to request permission when a WhatsApp user calls your business.</div><div>You can configure the call permission UI to automatically show in the WhatsApp user’s client app when they call your business number. The user may change their permission selection at any time.</div><div>![Diagram showing callback permissions flow in WhatsApp](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-rc9iee4d.jpeg)</div><div id="bkmrk-call-icons"><div id="bkmrk-call-icons-1"><div>#### Call icons

</div></div></div><div>With the `call_icons` setting, you can specify the countries where these icons should show up.</div><div><div id="bkmrk-audio-codec"><div id="bkmrk-audio-codec-1"><div>#### Audio codec

</div></div></div><div>Opus is the default audio codec for all WhatsApp calls. You can enable G.711 (PCMA/PCMU) codecs for interoperability with legacy telephony systems or PSTN gateways.</div><div id="bkmrk-guidelines-and-consi"><div id="bkmrk-guidelines-and-consi-1"><div>##### Guidelines and considerations

</div></div></div><span>**Opus is the recommended codec.** Opus delivers higher audio quality with lower bandwidth usage and is the default for all WhatsApp calls. Use Opus unless you have a specific requirement for G.711.</span><span>**G.711 requires transcoding.** When a G.711 codec is negotiated, audio is transcoded between Opus (on the WhatsApp user side) and G.711 (on the business side), which can add latency to the call.</span><span>**G.711 has lower audio quality.** G.711 encodes audio at a fixed 64 kbps without advanced compression, resulting in lower fidelity compared to Opus.</span><span>**G.711 uses more bandwidth.** G.711 requires approximately 64 kbps per direction, while Opus achieves comparable or better quality at significantly lower bitrates.</span><span>**Use G.711 only when necessary.** The primary use case is interoperability with legacy telephony infrastructure and PSTN gateways that do not support Opus.</span> </div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>#### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Permissions/Authorization errors</span><span>Invalid status</span><span>Invalid schedule for `call_hours`</span><span>Holiday given in `call_hours` is a past date</span><span>Timezone is invalid in `call_hours`</span><span>`weekly_operating_hours` in `call_hours` cannot be empty</span><span>Date format in `holiday_schedule` for call\_hours is invalid</span><span>More than 2 entries not allowed in `weekly_operating_hours` schedule in `call_hours`</span><span>Overlapping schedule in `call_hours` is not allowed</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-get-phone-number-cal"><div id="bkmrk-get-phone-number-cal-1"><div>### Get phone number calling settings

</div></div></div><div>Use this endpoint to check the configuration of your Calling API feature settings.</div><div>This endpoint can return information for other Cloud API feature settings.</div><div id="bkmrk-endpoint-parameters-3"><div id="bkmrk-endpoint-parameters-4"><div>#### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
ID of the business phone number for which you are getting Calling API settings.</div></div></td><td><div><div>`106540352242922`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-app-permission-requi"><div id="bkmrk-app-permission-requi-1"><div>#### App permission required

</div></div></div><div>`whatsapp_business_management`: Advanced access is required to use the API for end business clients</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>#### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-call-settings-in-wha"><div id="bkmrk-call-settings-in-wha-1"><div>### Call settings in WhatsApp Manager

</div></div></div><div>You can also control your call settings via [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/).</div><div>To access calling controls in WhatsApp Manager:</div><span>Click on **Account tools** &gt; **Phone numbers** panel</span><span>Click the gear icon next to the phone number you are using for calling</span><span>Click the **Calls** tab</span><div>![Screenshot of WhatsApp Manager call settings interface](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-dc5f62ho.jpeg)</div><div id="bkmrk-configure-and-use-ca"><div id="bkmrk-configure-and-use-ca-1"><div>### Configure and use call signaling via session initiation protocol (SIP)

</div></div></div><div>Session Initiation Protocol (SIP) is a signaling protocol used for initiating, maintaining, modifying, and terminating real-time communication sessions between two or more endpoints. You can send and receive call signals using SIP instead of Graph API endpoints.</div><div>[Learn more about how to use and configure SIP](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div><div id="bkmrk-calling-restrictions"><div id="bkmrk-calling-restrictions-1"><div>### Calling restrictions for user feedback

</div></div></div><div>If your calls receive a high negative user feedback, such as blocks and reports, business initiated calling, user initiated calling, or both functionalities on your phone number can be restricted.</div><div id="bkmrk-early-warning"><div id="bkmrk-early-warning-1"><div>#### Early warning

</div></div></div><div>You will be notified when the business phone number is close to being paused as an early warning. The early warning notifications will be communicated via below channels</div><div id="bkmrk-email"><div id="bkmrk-email-1"><div>##### Email

</div></div></div><div>Enforcement emails are sent to the email addresses of all users and admins associated with the business. If you did not receive an email, confirm which email you have designated as the contact email for your app and make sure that it is active, can receive new email, and does not flag the email as junk or spam mail.</div><div id="bkmrk-pause-in-calling-fun"><div id="bkmrk-pause-in-calling-fun-1"><div>#### Pause in calling functionality

</div></div></div><div>Once the negative user feedback reaches a threshold, Cloud API will automatically restrict calling functionality on your phone number for a period of 7 days. While paused the calling phone number will be unable to</div><span>*Make business initiated calls to users*</span><span>*Send call permissions requests*</span><div>Once your phone number has been paused, notifications will be communicated via below channels.</div><div>Note: Any call permissions approved or declined by the users while paused, will still be valid.</div><div id="bkmrk-email-3"><div id="bkmrk-email-4"><div>##### Email

</div></div></div><div>Enforcement emails are sent to the email addresses of all users and admins associated with the business. If you did not receive an email, confirm which email you have designated as the contact email for your app and make sure that it is active, can receive new email, and does not flag the email as junk or spam mail.</div><div id="bkmrk-pause-in-user-initia"><div id="bkmrk-pause-in-user-initia-1"><div>#### Pause in user initiated calling functionality

</div></div></div><div>Once the negative user feedback reaches a threshold, Cloud API will automatically restrict user initiated calling functionality on your phone number for a period of 7 days. While paused the calling phone number will be unable to</div><span>*Receive calls from users*</span><span>*Have call icon visible*</span><div>Once your phone number has been paused, notifications will be communicated via below channels.</div><div id="bkmrk-email-6"><div id="bkmrk-email-7"><div>##### Email

</div></div></div><div>Enforcement emails are sent to the email addresses of all users and admins associated with the business. If you did not receive an email, confirm which email you have designated as the contact email for your app and make sure that it is active, can receive new email, and does not flag the email as junk or spam mail.</div><div id="bkmrk-calling-restrictions-3"><div id="bkmrk-calling-restrictions-4"><div>### Calling restrictions for low call pickup rates

</div></div></div><div>When calling is enabled on your business phone number, you are expected to pick up calls that users place to you.</div><div>If a significant number of calls placed to your calling-enabled business phone number are not picked up, you will be notified and expected to make a change.</div><div id="bkmrk-what-happens-if-you-"><div id="bkmrk-what-happens-if-you--1"><div>#### What happens if you do not pick up calls

</div></div></div><span>**Warning via Email:** You receive an email notification with options to change how you handle incoming calls.</span><span>**Calling becomes restricted on the business phone number:** The calling button will be hidden from users.</span><div id="bkmrk-how-to-mitigate-the-"><div id="bkmrk-how-to-mitigate-the--1"><div>#### How to mitigate the situation

</div></div></div><div id="bkmrk-if-you-receive-a-war"><div id="bkmrk-if-you-receive-a-war-1"><div>##### *If you receive a warning*  


</div></div></div><span>**Continue allowing users to call:**</span> <span>Please identify and address the cause of calls not being picked up and make sure you are properly resourced to handle expected call volumes.</span><span>**Hide call buttons for user-initiated calls:**</span> <span>You can do so either by working with your partner or going to [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/overview/) &gt; Account tools &gt; Phone numbers &gt; select Phone number \[WA phone number\] &gt; Calls &gt; toggle off Display call buttons.</span><span>**Turn off calling altogether:**</span> <span>You can do so either by working with your partner or going to [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/overview/) &gt; Account tools &gt; Phone numbers &gt; select Phone number \[WA phone number\] &gt; Calls &gt; toggle off Allow voice calls.</span><div id="bkmrk-if-the-call-button-i"><div id="bkmrk-if-the-call-button-i-1"><div>##### *If the call button is hidden for the business phone number*  


</div></div></div><span>**Re-display calling buttons:**</span> <span>Please identify and address the cause of calls not being picked up and make sure you are properly resourced to handle expected call volumes.</span><span>Next, display the calling buttons by either working with your partner or going to [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/overview/) &gt; Account tools &gt; Phone numbers &gt; select Phone number \[WA phone number\] &gt; Calls &gt; toggle on Display call buttons.</span><span>**Turn off calling altogether:**</span> <span>You can do so either by working with your partner or going to [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/overview/) &gt; Account tools &gt; Phone numbers &gt; select Phone number \[WA phone number\] &gt; Calls &gt; toggle off Allow voice calls.</span></div>

# Business-Initiated Calls | Developer Documentation

<div id="bkmrk-business-initiated-c">## Business-Initiated Calls

<div><span>Updated: Nov 13, 2025</span></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>The Calling API supports making calls to WhatsApp users from your business.</div><div>The user dictates when calls can be received by [granting call permissions to the business phone number](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation).</div><div id="bkmrk-call-sequence-diagra"><div id="bkmrk-call-sequence-diagra-1"><div>#### Call sequence diagram

</div></div></div><div>![Business-initiated call sequence diagram showing flow between business, Cloud API, and WhatsApp user](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-howb8bjk.jpeg)</div><div>*Note: The `ACCEPTED` call status webhook will typically arrive after the call has been established. The Cloud API primarily sends it for call event auditing.*</div><div id="bkmrk-prerequisites"><div id="bkmrk-prerequisites-1"><div>### Prerequisites

</div></div></div><div>Before you get started with business-initiated calling, ensure that:</div><span>[Subscribe](/books/meta-whatsapp/page/create-a-webhook-endpoint-developer-documentation) to the “calls” webhook field</span><span>[Calling APIs are enabled on your business phone number](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</span><div>Lastly, **before you can call a WhatsApp user, you must obtain their permission to do so.**</div><div>[Learn how to obtain WhatsApp user calling permissions here](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div><div id="bkmrk-business-initiated-c-2"><div id="bkmrk-business-initiated-c-3"><div>### Business-initiated calling flow

</div></div></div><div id="bkmrk-part-1%3A-obtain-permi"><div id="bkmrk-part-1%3A-obtain-permi-1"><div>#### Part 1: Obtain permission to call the WhatsApp user

</div></div></div><div>You can obtain call permissions from the WhatsApp user in one of the following ways:</div><div id="bkmrk-send-a-call-permissi"><div id="bkmrk-send-a-call-permissi-1"><div>##### Send a call permission request message

</div></div></div><div>You can request call permissions by sending the WhatsApp user a permission request. Send it as a free form message during an open customer service window, or use a template message.</div><span>[Learn how to send a **free form** call permission request](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</span><span>[Learn how to send a **template** call permission request](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</span><div id="bkmrk-enable-callback_perm"><div id="bkmrk-enable-callback_perm-1"><div>##### Enable `callback_permission_status` in call settings

</div></div></div><div>When `callback_permission_status` is enabled, the user automatically provides call permission to your business when they place a call to you.</div><div>[Learn how to enable `callback_permission_status`](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div><div id="bkmrk-whatsapp-user-grants"><div id="bkmrk-whatsapp-user-grants-1"><div>##### WhatsApp user grants permanent permissions

</div></div></div><div>The user can also grant permanent permissions to the business at any time through their business profile.</div><div id="bkmrk-part-2%3A-your-busines"><div id="bkmrk-part-2%3A-your-busines-1"><div>#### Part 2: Your business initiates a new call to the WhatsApp user

</div></div></div><div>Now that you have user permission, you can initiate a new call to the WhatsApp user in question.</div><div>If there are no errors, you will receive a successful response:</div><div>*Note: Response with error code `138006` indicates a lack of a call request permission for this business number from the WhatsApp user.*</div><div id="bkmrk-part-3%3A-you-establis"><div id="bkmrk-part-3%3A-you-establis-1"><div>#### Part 3: You establish the call connection using webhook signaling

</div></div></div><div>After you successfully initiate a new call, you receive a Call Connect webhook response containing an `SDP Answer` from Cloud API. Your business will then apply the `SDP Answer` from this webhook to your WebRTC stack to initiate the media connection.</div><div>You then receive an appropriate status webhook, indicating that the call is `RINGING`, `ACCEPTED`, or `REJECTED`:</div><div id="bkmrk-endpoints-for-busine"><div id="bkmrk-endpoints-for-busine-1"><div>### Endpoints for business-initiated calling

</div></div></div><div id="bkmrk-initiate-call"><div id="bkmrk-initiate-call-1"><div>#### Initiate call

</div></div></div><div>Use this endpoint to initiate a call to a WhatsApp user by providing a phone number and a WebRTC call offer. There is a rate limit of 10000 per 24 hours for initiating new calls per business phone number.</div><div id="bkmrk-body-parameters"><div id="bkmrk-body-parameters-1"><div>##### Body parameters

</div></div></div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `phone-number-id`</span><span>Permissions/Authorization errors</span><span>Request format validation errors, for example connection info, sdp, ice</span><span>SDP validation errors</span><span>Calling restriction errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-terminate-call"><div id="bkmrk-terminate-call-1"><div>#### Terminate call

</div></div></div><div>Use this endpoint to terminate an active call.</div><div>This must be done even if there is an `RTCP BYE` packet in the media path. Ending the call this way also ensures pricing is more accurate.</div><div>When the WhatsApp user terminates the call, you do not have to call this endpoint. Once the call is successfully terminated, you will receive a [Call Terminate Webhook](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation).</div><div id="bkmrk-body-parameters-3"><div id="bkmrk-body-parameters-4"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“terminate”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call id`</span><span>Invalid `phone-number-id`</span><span>The WhatsApp user has already terminated the call</span><span>Reject call is already in progress</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-webhooks-for-busines"><div id="bkmrk-webhooks-for-busines-1"><div>### Webhooks for business-initiated calling

</div></div></div><div>With all Calling API webhooks, there is a `”calls”` object inside the `”value”` object of the webhook response. The `”calls”` object contains metadata about the call that is used to action on each call placed or received by your business.</div><div>To receive Calling API webhooks, subscribe to the “calls” webhook field.</div><div>[Learn more about Cloud API webhooks here](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation)</div><div id="bkmrk-call-status-webhook"><div id="bkmrk-call-status-webhook-1"><div>#### Call status webhook

</div></div></div><div>This webhook is sent during the following calling events:</div><span>Ringing: When the WhatsApp user’s client device begins ringing</span><span>Accepted: When the WhatsApp user accepts the call</span><span>Rejected: When the WhatsApp user rejects the call. You also receive the call terminate webhook in this case</span><div>The webhook structure here is similar to the Status webhooks used for the Cloud API messages.</div><div>[*Learn more about Cloud API status webhooks*](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation)</div><div id="bkmrk-webhook-values-for-%22-3"><div id="bkmrk-webhook-values-for-%22-4"><div>##### Webhook values for `"statuses"`

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`id`</div><div>*String*</div></div></td><td><div><div>A unique ID for the call</div></div></td></tr><tr><td><div><div>`timestamp`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of the webhook event</div></div></td></tr><tr><td><div><div>`recipient_id`</div><div>*Integer*</div></div></td><td><div><div>The phone number of the WhatsApp user receiving the call</div></div></td></tr><tr><td><div><div>`status`</div><div>*Integer*</div></div></td><td><div><div>The current call status.</div><div>Possible values:</div><div>`RINGING`: Business initiated call is ringing the user</div><div>`ACCEPTED`: Business initiated call is accepted by the user</div><div>`REJECTED`: Business initiated call is rejected by the user</div></div></td></tr><tr><td><div><div>`biz_opaque_callback_data`</div><div>*String*</div></div></td><td><div><div>Arbitrary string your business passes into the call for tracking and logging purposes.</div><div>Will only be returned if provided through [Initiate New Call API requests](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-call-terminate-webho"><div id="bkmrk-call-terminate-webho-1"><div>#### Call terminate webhook

</div></div></div><div>A webhook notification is sent whenever the call has been terminated for any reason, such as when the WhatsApp user hangs up, or when the business calls the endpoint with an action of `terminate` or `reject`.</div><div id="bkmrk-webhook-values-for-%22-6"><div id="bkmrk-webhook-values-for-%22-7"><div>##### Webhook values for `"calls"`

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`id`</div><div>*String*</div></div></td><td><div><div>A unique ID for the call</div></div></td></tr><tr><td><div><div>`to`</div><div>*Integer*</div></div></td><td><div><div>The number being called (callee)</div></div></td></tr><tr><td><div><div>`from`</div><div>*Integer*</div></div></td><td><div><div>The number of the caller</div></div></td></tr><tr><td><div><div>`event`</div><div>*Integer*</div></div></td><td><div><div>The calling event that this webhook is notifying the subscriber of</div></div></td></tr><tr><td><div><div>`timestamp`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of the webhook event</div></div></td></tr><tr><td><div><div>`direction`</div><div>*String*</div></div></td><td><div><div>The direction of the call being made.</div><div>Can contain either:</div><div>`BUSINESS_INITIATED`, for calls initiated by your business.</div><div>`USER_INITIATED`, for calls initiated by a WhatsApp user.</div></div></td></tr><tr><td><div><div>`start_time`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of when the call started.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`end_time`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of when the call ended.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`duration`</div><div>*Integer*</div></div></td><td><div><div>Duration of the call in seconds.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`biz_opaque_callback_data`</div><div>*String*</div></div></td><td><div><div>Arbitrary string your business passes into the call for tracking and logging purposes.</div><div>Will only be returned if provided through an [Initiate Call API request](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) or [Accept Call request](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation)</div></div></td></tr><tr><td><div><div>`errors.code`</div><div>*Integer*</div></div></td><td><div><div>The `errors` object is present only for failed calls when there is error information available. Code is one of the [calling error codes](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-sdp-overview-and-sam"><div id="bkmrk-sdp-overview-and-sam-1"><div>### SDP overview and sample structures

</div></div></div><div>Session Description Protocol (SDP) is a text-based format used to describe the characteristics of multimedia sessions, such as voice and video calls, in real-time communication applications. SDP provides a standardized way to describe the session’s media streams. This includes media type, codecs, protocols, and parameters for establishing and managing the session.</div><div>In the context of WebRTC, SDP is used to negotiate the media parameters between the sender and receiver, enabling them to agree on the specifics of the media exchange.</div><div>[View SDP sample structures for business-initiated calls](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation)</div></div>

# Obtain User Call Permissions | Developer Documentation

<div id="bkmrk-obtain-user-call-per">## Obtain User Call Permissions

<div><span>Updated: Nov 13, 2025</span></div><div><div>As of November 3, 2025, permanent permissions is now available. Users can now grant a business ongoing permission to call. Users can review and change calling permission for a business at any time in the business profile.</div></div><div><div>Call permission related features are available only in regions where [business initiated calling is available](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation).</div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>If you want to place a call to a WhatsApp user, your business must receive user permission first. When a WhatsApp user grants call permissions, they can be either temporary or permanent.</div><div>Business does not have control over this permission as it is only granted by the user and can only be revoked by the user, at any time. Permanent permission data will be stored until it is revoked.</div><div>You can obtain calling permission from a WhatsApp user in any of the following ways:</div><span>**Send a call permission request to the user** — Send a free-form or templated message requesting calling permission from the user. User has the option to choose between temporary or permanent.</span><span>**Callback permission is provided by the WhatsApp user** — The WhatsApp user automatically provides temporary call permissions by placing a call to the business. The [callback setting must be enabled](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) on the business phone number.</span><span>**WhatsApp user provides call permission via Business Profile** — The WhatsApp user provides call permissions to the business through their business profile.</span><div id="bkmrk-limits-%28per-business"><div id="bkmrk-limits-%28per-business-1"><div>#### Limits (Per business + WhatsApp user pair)

</div></div></div><span>Temporary permissions are **granted for 7 calendar days (168 hours)**</span> <span>Calculated as the number of seconds in a day multiplied by 7, from time of user’s approval.</span><span>Permanent permissions do not expire, but they have the same connected calls limit.</span><span>Your business can make a maximum of **100 connected calls every 24 hours**</span><span>These limits are on the **business phone number**</span><div>These limits are in place to protect WhatsApp users from unwanted calls.</div><div><div>When you test your WhatsApp Calling integration using public test numbers (PTNs) and sandbox accounts, Calling API restrictions are relaxed.</div><div>[Learn more about testing your WhatsApp Calling API integration](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation)</div></div><div id="bkmrk-call-permission-requ"><div id="bkmrk-call-permission-requ-1"><div>### Call permission request basics

</div></div></div><div>You may proactively request a calling permission from a WhatsApp user by sending a permission request message, either as a:</div><span>Free form interactive message</span><span>Template message</span><div>The WhatsApp user may approve (temporary or permanent), decline, or simply not respond to a call permission request.</div><div>**With permissions, the WhatsApp user is in control.** Even if the user provides calling permission, they can revoke that granted permission request at any time. Conversely, if the user declines a permission request, they can still grant calling permission, up until the permission request expires.</div><div>**A call permission request expires** when any of the following occurs:</div><span>The WhatsApp user interacts with a subsequent new call permission request from the business</span><span>7 days after the permission was accepted or declined by the consumer</span><span>7 days after the permission was delivered if the consumer does not respond to the request</span><div>[View client UI behavior for expired permission requests](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div><div>To ensure an optimal user experience around business initiated calling, the following limits are enforced:</div><span>**When sending a calling permission request message**</span> <span>Maximum of 1 permission request in 24h</span><span>Maximum 2 permission requests within 7 days.</span> <span>*These limits reset when any connected call (business-initiated/user-initiated) is made between the business and WhatsApp user.*</span><span>*These limits apply toward permissions requests sent either as free form or template messages.*</span><span>**When business-initiated calls go unanswered or are rejected**</span> <span>2 consecutive unanswered calls result in a system message to reconsider an approved permission</span><span>4 consecutive unanswered calls result in an approved permission being automatically revoked. The user may again update this if they so choose.</span><div>[View client UI behavior for consecutive unanswered calls](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div><div id="bkmrk-free-form-vs-templat"><div id="bkmrk-free-form-vs-templat-1"><div>### Free form vs template call permission request message

</div></div></div><div><div>Call permission request messages are subject to [messaging charges](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation)</div></div><div>A call permission request message can be sent to users in one of the following ways:</div><div>**Send a free form message**</div><span>When you are within a customer service window with a WhatsApp user, you can send a free form message with a call permission request.</span><span>Although a text body will be optional, you should send one to build context with the user. In the case of free form calling permission request messages, header and footer sections are not supported.</span><span>Since the customer service window is open, there is no need to create a conversation window.</span><div>**Create and send a template message**</div><span>Sending a template message allows you to initiate a user conversation with a call permission request.</span><span>Context (that is, a text body) is required when sending a template message with a call permission request.</span><span>With template messages, you can further customize your permission request by adding a message header and footer.</span><div>![Criteria for sending call permission request messages](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-vpkdkcnf.jpeg)</div><div id="bkmrk-client-application-u"><div id="bkmrk-client-application-u-1"><div>### Client application UI experience

</div></div></div><div id="bkmrk-call-permission-requ-3"><div id="bkmrk-call-permission-requ-4"><div>#### Call permission request flow and sample messages

</div></div></div><div id="bkmrk-allow-calls"><div id="bkmrk-allow-calls-1"><div>##### Allow calls

</div></div></div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-zhfvvqor.jpeg)</div><div id="bkmrk-temporarily-allow-ca"><div id="bkmrk-temporarily-allow-ca-1"><div>##### Temporarily allow calls

</div></div></div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-n2p2tqym.jpeg)</div><div id="bkmrk-template-message"><div id="bkmrk-template-message-1"><div>#### Template message

</div></div></div><div><div><div>With header, footer and body ![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-rhcpngle.jpeg)</div></div><div><div>With body only ![Free form message with body only](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-oxultykv.jpeg)</div></div><div><div>With no text body ![Free form message with no text body](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-kuebtvx1.jpeg)</div></div></div><div id="bkmrk-free-form-message-ty"><div id="bkmrk-free-form-message-ty-1"><div>##### Free form message types

</div></div></div><div><div><div>With no text body ![Template message with no text body](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-mmetg8bz.jpeg)</div></div><div><div>With text body only ![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-dzcweatw.jpeg)</div></div></div><div id="bkmrk-updating-call-permis"><div id="bkmrk-updating-call-permis-1"><div>#### Updating call permission on business profile

</div></div></div><div>Users always have the option to change the permission using a new option on the business profile.</div><div><table><thead><tr><th><span>Update call permission on business profile </span></th></tr></thead><tbody><tr><td><div><div>![Business profile screen showing call permission update options](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-xsnrvrum.jpeg)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-consecutive-unanswer"><div id="bkmrk-consecutive-unanswer-1"><div>#### Consecutive unanswered calls

</div></div></div><div><table><thead><tr><th><span>Consecutive unanswered calls </span></th></tr></thead><tbody><tr><td><div><div>2 consecutive unanswered calls — System message for user to update permission</div><div>![System message displayed after 2 consecutive unanswered calls](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-ursqsz1z.jpeg)</div></div></td></tr><tr><td><div><div>4 consecutive unanswered calls — Permissions automatically revoked</div><div>![Notification shown when permissions are automatically revoked after 4 unanswered calls](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-o3knjsyk.jpeg)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-call-permission-requ-6"><div id="bkmrk-call-permission-requ-7"><div>#### Call permission request expiration scenarios

</div></div></div><div><div><div>Permission request expires after 7 days — User interacts with request ![Permission request expires after 7 days — User interacts with request](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-8qtptbyd.jpeg)</div></div><div><div>Permission request expires after 7 days — User does not interact ![Permission request expires after 7 days — User does not interact](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-keflyrqd.jpeg)</div></div></div><div><div><div>Previous permission request expires immediately — User does not interact / New call permission request is received ![Previous permission request expires immediately — User does not interact / New call permission request is received](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-plosgzee.jpeg)</div></div><div><div>Previous permission request expires immediately — User allows / Interacts with the new request ![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-oop9ejyo.jpeg)</div></div></div><div id="bkmrk-send-free-form-call-"><div id="bkmrk-send-free-form-call--1"><div>### Send free form call permission request message

</div></div></div><div><div>Call permission request messages are subject to [messaging charges](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation)</div></div><div>Use this endpoint to send a free form interactive message with a call permission request during a [customer service window](/books/meta-whatsapp/page/sending-messages-developer-documentation). A standard [message status webhook](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation) will be sent in response to this message send.</div><div>**Note:** The call permission request interactive object cannot be edited by the business. Only the message body can be customized.</div><div>[See how this message is rendered on the WhatsApp client](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div><div id="bkmrk-body-parameters"><div id="bkmrk-body-parameters-1"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`to`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The phone number of the WhatsApp user you are messaging</div><div>[Learn more about formatting phone numbers in Cloud API](/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/whatsapp-business-account-phone-number-api)</div></div></td><td><div><div>`+17863476655`</div></div></td></tr><tr><td><div><div>`type`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The type of interactive message you are sending.</div><div>In this case, you are sending a `call_permission_request`.</div><div>[Learn more about interactive messages](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div></div></td><td><div><div>`“call_permission_request”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The action of your interactive message.</div><div>Must be `call_permission_request`.</div></div></td><td><div><div>`“call_permission_request”`</div></div></td></tr><tr><td><div><div>`body`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The body of your message.</div><div>Although this field is optional, it is highly recommended you give context to the WhatsApp user when you request permission to call them.</div></div></td><td><div><div>`"Allow us to call you so we can support you with your order."`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-success-response"><div id="bkmrk-success-response-1"><div>##### Success response

</div></div></div><div>[*Learn more about messaging success responses*](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `phone-number-id`</span><span>Permissions/Authorization errors</span><span>Rate limit reached</span><span>Sending this message to users on older app versions will result in error webhook with error code [131026](/documentation/business-messaging/whatsapp/support/error-codes)</span><span>Calling not enabled</span><span>Calling restriction errors</span><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-create-and-send-call"><div id="bkmrk-create-and-send-call-1"><div>### Create and send call permission request template messages

</div></div></div><div><div>Call permission request messages are subject to [messaging charges](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation)</div></div><div>Use these endpoints to create and send a call permission request message template.</div><div>Once your permission request template message is created, your business can send the template message to the user as a call permission request outside of a customer service window.</div><div>[Learn more about creating and managing message templates](/books/meta-whatsapp/page/templates-developer-documentation)</div><div id="bkmrk-create-message-templ"><div id="bkmrk-create-message-templ-1"><div>#### Create message template

</div></div></div><div>Use this endpoint to create a call permission request message template.</div><div id="bkmrk-body-parameters-3"><div id="bkmrk-body-parameters-4"><div>##### Body parameters

</div></div></div><div>Creating and managing template messages can be done both through Cloud API and the WhatsApp Business Manager interface.</div><div>When creating your call permission request template, ensure you configure `type` as `call_permission_request`.</div><div>[Learn more about creating and managing message templates](/books/meta-whatsapp/page/templates-developer-documentation)</div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`type`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The type of template message you are creating.</div><div>In this case, you are creating a `call_permission_request`.</div></div></td><td><div><div>`“call_permission_request”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-template-status-resp"><div id="bkmrk-template-status-resp-1"><div>##### Template status response

</div></div></div><div>[*Learn more about template status response*](/books/meta-whatsapp/page/templates-developer-documentation)</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid WABA id</span><span>Permissions/Authorization errors</span><span>Template structure/component validation alerts</span><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-get-current-call-per"><div id="bkmrk-get-current-call-per-1"><div>### Get current call permission state

</div></div></div><div>Use this endpoint to get the call permission state for a business phone number with a single WhatsApp user phone number.</div><div id="bkmrk-request-parameters"><div id="bkmrk-request-parameters-1"><div>#### Request parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number you are fetching permissions against.</div><div>[Learn more about formatting phone numbers in Cloud API](/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/whatsapp-business-account-phone-number-api)</div></div></td><td><div><div>`+18762639988`</div></div></td></tr><tr><td><div><div>`<CONSUMER_WHATSAPP_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The phone number of the WhatsApp user who you are requesting call permissions from.</div><div>[Learn more about formatting phone numbers in Cloud API](/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/whatsapp-business-account-phone-number-api)</div></div></td><td><div><div>`+13057765456`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-6"><div id="bkmrk-error-response-7"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `phone-number-id`</span><span>If the consumer phone number is uncallable, the api response will be `no_permission`.</span><span>Permissions/Authorization errors.</span><span>Rate limit reached. A maximum of 100 requests in a 1 second window can be made to the API.</span><span>Calling is not enabled for the business phone number.</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-user-call-permission"><div id="bkmrk-user-call-permission-1"><div>### User call permission reply webhook

</div></div></div><div>This webhook is delivered whenever a user selects or updates their calling permissions. It could be in response to a call permission request sent by the business or it could be the user proactively making a decision.</div><div>The webhook fields values change depending on the circumstances of the user permission decision:</div><span>the user accepts or rejects the request</span><span>the user approves permission by responding to a request or by calling the business</span><span>the user permission is an automatic callback permission in response to a user-initiated call</span><span>the user permission is automatically revoked in response to 4 consecutive unanswered business-initiated calls</span><div>Lastly, the user can grant permanent calling permission to the business, which is represented in the `is_permanent` parameter.</div><div><div>No webhook is sent when a temporary permission expires. The `expiration_timestamp` field included in the accepted permission webhook indicates the time this permission will expire. Alternatively the current permission state can be queried from the [get current call permission state](#bkmrk-get-current-call-per-1) endpoint.</div></div><div id="bkmrk-webhook-sample"><div id="bkmrk-webhook-sample-1"><div>##### Webhook sample

</div></div></div><div id="bkmrk-webhook-values"><div id="bkmrk-webhook-values-1"><div>##### Webhook values

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`customer_phone_number`</div><div>*String*</div></div></td><td><div><div>The phone number of the customer</div></div></td></tr><tr><td><div><div>`context.id`</div><div>*String*</div></div></td><td><div><div>Can be either of two values</div><span>Message ID of the permission request message sent by the business to the customer number. Shows when a permission decision is made by the user in response to a call permission request.</span><span>Call ID of the missed call placed by the business to the customer number. Shows when callback permission is enabled in settings and the user calls the business.</span></div></td></tr><tr><td><div><div>`response`</div><div>*String*</div></div></td><td><div><div>The WhatsApp users response to the call permission request message</div><div>Can be `accept` or `reject`</div></div></td></tr><tr><td><div><div>`is_permanent`</div><div>*Boolean*</div></div></td><td><div><div>Indicates if the permission is permanent or not. For temporary permission this will always be false.</div></div></td></tr><tr><td><div><div>`expiration_timestamp`</div><div>*Integer*</div></div></td><td><div><div>Time in seconds when this call permission expires if the WhatsApp user approved it</div></div></td></tr><tr><td><div><div>`response_source`</div><div>*String*</div></div></td><td><div><div>The source of this permission</div><div>Possible values for accepted call permissions are:</div><span>`user_action`: User approved or rejected the permission</span><span>`automatic`: An automatic permission approval due to the WhatsApp user initiating the call</span></div></td></tr></tbody></table>

</div><div id="bkmrk-webhook-sample-scena"><div id="bkmrk-webhook-sample-scena-1"><div>##### Webhook sample scenarios

</div></div></div><div><table><thead><tr><th><span>Scenario </span></th><th><span>Webhook sample </span></th></tr></thead><tbody><tr><td><div><div>The WhatsApp user approves a temporary call permission from a call permission request message</div></div></td><td></td></tr><tr><td><div><div>The WhatsApp users approves a permanent call permission from a call permission request message</div></div></td><td></td></tr><tr><td><div><div>The WhatsApp users approves a permanent call permission from the business profile</div></div></td><td></td></tr><tr><td><div><div>The WhatsApp users rejects a call permission after receiving a call permission request message</div></div></td><td></td></tr><tr><td><div><div>An automatic temporary callback permission is granted to the business when the WhatsApp user calls the business</div></div></td><td></td></tr><tr><td><div><div>A call permission is automatically revoked when a business makes 4 consecutive unanswered calls to the WhatsApp user</div></div></td><td></td></tr></tbody></table>

</div></div>

# User-initiated calls | Developer Documentation

<div id="bkmrk-user-initiated-calls">## User-initiated calls

<div><span>Updated: Nov 13, 2025</span></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>The Calling API supports receiving calls made by WhatsApp users to your business.</div><div>Your business dictates when calls can be received by [configuring business calling hours and holiday unavailability](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</div><div><div>**Consumer device eligibility**</div><div>Currently, the WhatsApp Business Calling API can accept calls from a consumer’s primary and companion iPhone or Android phones.</div><div>A **primary device** is the consumer’s main device, typically a mobile phone, which holds the authoritative state for the user’s account. It has full access to messaging history and core functionalities. There is exactly one primary device per user account at any given time.</div><div>**Companion devices** are additional devices registered to the user’s account that can operate alongside the primary device. Examples include web clients, desktop apps, tablets, and smart glasses. Companion devices have access to some or all messaging history and core features but are limited compared to the primary device. For Cloud API Calling, **only iPhone and Android phone companion devices are supported for user-initiated calls**.</div><div>**Callback permission functionality on companion devices**</div><div>For businesses that have the [callback setting](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) enabled, this functionality is not supported on companion devices yet.</div></div><div id="bkmrk-prerequisites"><div id="bkmrk-prerequisites-1"><div>### Prerequisites

</div></div></div><div>Before you get started with user-initiated calling, ensure that:</div><span>[Subscribe](/books/meta-whatsapp/page/create-a-webhook-endpoint-developer-documentation) to the **calls** webhook field</span><span>[Enable Calling API features on your business phone number](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</span><div id="bkmrk-call-sequence-diagra"><div id="bkmrk-call-sequence-diagra-1"><div>#### Call sequence diagram

</div></div></div><div>![Call sequence diagram showing the flow of user-initiated calls](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-qlx0pphm.jpeg)</div><div id="bkmrk-endpoints-for-user-i"><div id="bkmrk-endpoints-for-user-i-1"><div>### Endpoints for user-initiated calling

</div></div></div><div id="bkmrk-pre-accept-call"><div id="bkmrk-pre-accept-call-1"><div>#### Pre-accept call

</div></div></div><div>When you pre-accept an inbound call, you allow the calling media connection to be established before attempting to send call media through the connection.</div><div>When you then call the accept call endpoint, media begins flowing immediately since the connection has already been established.</div><div>Pre-accepting calls is recommended because it facilitates faster connection times and avoids [audio clipping issues](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>There is about 30 to 60 seconds after the [Call Connect webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is sent for the business to accept the phone call. If the business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is delivered back to you.</div><div><div>**Note:** Since the WebRTC connection is established before calling the [Accept Call endpoint](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation), make sure to flow the call media only after you receive a 200 OK response back.</div><div>If call media flows too early, the caller will miss the first few words of the call. If call media flows too late, callers will hear silence.</div></div><div id="bkmrk-body-parameters"><div id="bkmrk-body-parameters-1"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“pre_accept”`</div></div></td></tr><tr><td><div><div>`session`</div><div>*JSON object*</div></div></td><td><div><div>**Optional**</div><div>  
Contains the session description protocol (SDP) type and description language.</div><div>Requires two values:</div><div>`sdp_type` — (*String*) **Required**</div><div>“offer”, to indicate SDP offer</div><div>`sdp` — (*String*) **Required**</div><div>The SDP info of the device on the other end of the call. The SDP must be compliant with [RFC 8866<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8866&h=AT4zZJ9FzVQ3vNp7-OCABiqHLC3SPrGAQtzla4yYj9jwhSTiuCZ2EKCnf-0cMLGDfqMr7vChT5WqyVtsmzBWeBYJOdkhM4SK2yuxDvEMd71LwzH7HChGIeKD-eZLKpI_Cky4wQvRzj0SmR0ODAIvKA).</div><div>[Learn more about Session Description Protocol (SDP)<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.rfc-editor.org%2Frfc%2Frfc8866.html&h=AT4zZJ9FzVQ3vNp7-OCABiqHLC3SPrGAQtzla4yYj9jwhSTiuCZ2EKCnf-0cMLGDfqMr7vChT5WqyVtsmzBWeBYJOdkhM4SK2yuxDvEMd71LwzH7HChGIeKD-eZLKpI_Cky4wQvRzj0SmR0ODAIvKA)</div><div>[View example SDP structures](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation)</div></div></td><td></td></tr></tbody></table>

</div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Error related to your payment method</span><span>Invalid Connection info, for example, SDP or ICE</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-accept-call"><div id="bkmrk-accept-call-1"><div>#### Accept call

</div></div></div><div>Use this endpoint to connect to a call by providing a call agent’s SDP.</div><div>You have about 30 to 60 seconds after the [Call Connect Webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is sent to accept the phone call. If your business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is delivered back to you.</div><div id="bkmrk-body-parameters-3"><div id="bkmrk-body-parameters-4"><div>##### Body parameters

</div></div></div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Error related to your payment method</span><span>Invalid Connection info, for example, SDP or ICE</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><span>SDP answer provided in accept does not match the SDP answer given in the [Pre-Accept endpoint](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) for the same `call-id`</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-reject-call"><div id="bkmrk-reject-call-1"><div>#### Reject call

</div></div></div><div>Use this endpoint to reject a call.</div><div>You have about 30 to 60 seconds after the [Call Connect webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is sent to accept the phone call. If the business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) is delivered back to you.</div><div id="bkmrk-body-parameters-6"><div id="bkmrk-body-parameters-7"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“reject”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-6"><div id="bkmrk-error-response-7"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-terminate-call"><div id="bkmrk-terminate-call-1"><div>#### Terminate call

</div></div></div><div>Use this endpoint to terminate an active call.</div><div>This must be done even if there is an `RTCP BYE` packet in the media path. Ending the call this way also ensures pricing is more accurate.</div><div>When the WhatsApp user terminates the call, you do not have to call this endpoint. Once the call is successfully terminated, a [Call Terminate Webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) will be sent to you.</div><div id="bkmrk-body-parameters-9"><div id="bkmrk-body-parameters-10"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“terminate”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-9"><div id="bkmrk-error-response-10"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Reject call is already in progress</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-webhooks-for-user-in"><div id="bkmrk-webhooks-for-user-in-1"><div>### Webhooks for user-initiated calling

</div></div></div><div>With all Calling API webhooks, there is a `”calls”` object inside the `”value”` object of the webhook response. The `”calls”` object contains metadata about the call that is used to action on each call received by your business.</div><div>To receive Calling API webhooks, subscribe to the calls webhook field.</div><div>[Learn more about Cloud API webhooks here](/books/meta-whatsapp/page/managing-webhooks-developer-documentation)</div><div id="bkmrk-call-terminate-webho"><div id="bkmrk-call-terminate-webho-1"><div>#### Call Terminate webhook

</div></div></div><div>A webhook notification is sent whenever the call has been terminated for any reason, such as when the WhatsApp user hangs up, or when the business calls the endpoint with an action of `terminate` or `reject`.</div><div id="bkmrk-webhook-values-for-%22-3"><div id="bkmrk-webhook-values-for-%22-4"><div>##### Webhook values for `"calls"`

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`id`</div><div>*String*</div></div></td><td><div><div>A unique ID for the call</div></div></td></tr><tr><td><div><div>`to`</div><div>*Integer*</div></div></td><td><div><div>The number being called (callee)</div></div></td></tr><tr><td><div><div>`from`</div><div>*Integer*</div></div></td><td><div><div>The number of the caller</div></div></td></tr><tr><td><div><div>`event`</div><div>*Integer*</div></div></td><td><div><div>The calling event that this webhook is notifying the subscriber of</div></div></td></tr><tr><td><div><div>`timestamp`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of the webhook event</div></div></td></tr><tr><td><div><div>`direction`</div><div>*String*</div></div></td><td><div><div>The direction of the call being made.</div><div>Can contain either:</div><div>`BUSINESS_INITIATED`, for calls initiated by your business.</div><div>`USER_INITIATED`, for calls initiated by a WhatsApp user.</div></div></td></tr><tr><td><div><div>`deeplink_payload`</div><div>*String*</div></div></td><td><div><div>Arbitrary string specified in `biz_payload` query param on a call deeplink. Will only be returned if call was initiated from a deeplink with such param.</div><div>See [Call Button Messages and Deep Links ](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)for more details.</div></div></td></tr><tr><td><div><div>`cta_payload`</div><div>*String*</div></div></td><td><div><div>Arbitrary string specified in `payload` field on a call button. Will only be returned if call was initiated from a call button with payload.</div><div>See [Call Button Messages and Deep Links ](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)for more details.</div></div></td></tr><tr><td><div><div>`start_time`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of when the call started.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`end_time`</div><div>*Integer*</div></div></td><td><div><div>The UNIX timestamp of when the call ended.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`duration`</div><div>*Integer*</div></div></td><td><div><div>Duration of the call in seconds.</div><div>Only present when the call was picked up by the other party.</div></div></td></tr><tr><td><div><div>`biz_opaque_callback_date`</div><div>*String*</div></div></td><td><div><div>Arbitrary string your business passes into the call for tracking and logging purposes.</div><div>Will only be returned if provided through an [Initiate Call request](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation) or [Accept Call request](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation)</div></div></td></tr><tr><td><div><div>`errors.code`</div><div>*Integer*</div></div></td><td><div><div>The `errors` object is present only for failed calls when there is error information available. Code is one of the [calling error codes](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-dual-tone-multi-freq"><div id="bkmrk-dual-tone-multi-freq-1"><div>### Dual tone multi frequency (DTMF) support

</div></div></div><div><div>**The dialpad provided by the Calling API only supports DTMF use cases.**</div><div>It does not support consumer-to-consumer calls and does not change any other calling behaviors. For example, the dialpad cannot be used to dial a number and initiate a call or message on WhatsApp.</div></div><div>WhatsApp Business Calling API supports DTMF tones, with the intention to enable BSP applications to support IVR-based systems.</div><div>WhatsApp users can press tone buttons on their client app and these DTMF tones are injected into the WebRTC RTP stream established as a part of the VoIP connection.</div><div>Our WebRTC stream conforms to [RFC 4733<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc4733&h=AT4zZJ9FzVQ3vNp7-OCABiqHLC3SPrGAQtzla4yYj9jwhSTiuCZ2EKCnf-0cMLGDfqMr7vChT5WqyVtsmzBWeBYJOdkhM4SK2yuxDvEMd71LwzH7HChGIeKD-eZLKpI_Cky4wQvRzj0SmR0ODAIvKA) for the transfer of DTMF Digits via RTP Payload.</div><div>There is no webhook for conveying DTMF digits.</div><div id="bkmrk-dtmf-clock-rate"><div id="bkmrk-dtmf-clock-rate-1"><div>#### DTMF clock rate

</div></div></div><div>Only 8000 clock rate is supported in our SDPs. For user-initiated calls, our SDP offer includes only 8000 clock rate. For business-initiated calls, your SDP offer should have 8000 clock rate. Even if it is absent, the API still proceeds with 8000 clock rate against payload type 126.</div><div>The RTP packets representing DTMF events will use the same timestamp base and sequence number base as the regular audio packets. So you don’t have to worry about differing clock rates between audio packets and DTMF packets. The [duration field<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc4733%23section-2.3.5&h=AT4zZJ9FzVQ3vNp7-OCABiqHLC3SPrGAQtzla4yYj9jwhSTiuCZ2EKCnf-0cMLGDfqMr7vChT5WqyVtsmzBWeBYJOdkhM4SK2yuxDvEMd71LwzH7HChGIeKD-eZLKpI_Cky4wQvRzj0SmR0ODAIvKA) of the DTMF packet is calculated using 8000 clock units.</div><div>The API does not support 48000 clock rate for DTMF.</div><div id="bkmrk-sending-dtmf-digits-"><div id="bkmrk-sending-dtmf-digits--1"><div>#### Sending DTMF digits on consumer WhatsApp client

</div></div></div><div>WhatsApp client applications are enhanced to have a dialpad for calls with CloudAPI business phone numbers. The WhatsApp user can press the buttons on the dialpad and send DTMF tones.</div><div>![WhatsApp client dialpad interface for DTMF tones](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-wzp7ueo4.jpeg)</div><div id="bkmrk-sdp-overview-and-sam"><div id="bkmrk-sdp-overview-and-sam-1"><div>### SDP overview and sample SDP structures

</div></div></div><div>Session Description Protocol (SDP) is a text-based format used to describe the characteristics of multimedia sessions, such as voice and video calls, in real-time communication applications. SDP provides a standardized way to convey information about the session’s media streams, including the type of media, codecs, protocols, and other parameters necessary for establishing and managing the session.</div><div>In the context of WebRTC, SDP is used to negotiate the media parameters between the sender and receiver, enabling them to agree on the specifics of the media exchange.</div><div>[View SDP sample structures for user-initiated calls](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation)</div></div>

# SIP Configuration Guide - WhatsApp Business Calling | Developer Documentation

<div id="bkmrk-sip-configuration-gu">## SIP Configuration Guide - WhatsApp Business Calling

<div><span>Updated: Dec 15, 2025</span></div><div><div>When SIP is enabled, you **cannot use calling related Graph API endpoints** and **calling related webhooks are not sent**.</div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>Session Initiation Protocol ([SIP<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc3261&h=AT7eqXkQ2fvXOPMM7YJQGbF-MXwzrOmc1cstVebkR11eOFvFkhJJ7_PwqyI4ltvMnLo3jPSWi6l9JPL5aKp2F-YAwCSpU-RYHm3FexgPyULXK4stJivFB1wf7LGSnGWq9GYIiyr4pkTvj3-IHRTyBQ)) is a signaling protocol used for initiating, maintaining, modifying, and terminating real-time communication sessions between two or more endpoints.</div><div>WhatsApp Business Calling API supports use of SIP as the signaling protocol instead of our Graph API endpoints and Webhooks.</div><div id="bkmrk-before-you-get-start"><div id="bkmrk-before-you-get-start-1"><div>#### Before you get started

</div></div></div><div>Before you get started with SIP call signaling, confirm the following:</div><span>You meet overall [calling pre-requisites](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation)</span><span>Your app has messaging permissions for the business phone number you want to enable SIP for. </span><span>Test this by sending and receiving messages using Graph API messaging endpoints, then use the same app to configure your SIP server on the business phone number for calling.</span><span>Double confirm this by using [health status API](/documentation/business-messaging/whatsapp/support/health-status) with `PHONE_NUMBER_ID`</span><span>Your app mode is “Live”, not “Development”.</span><span>You have a standards compliant third party SIP server that supports [TLS](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) transport and digest authentication</span><div>See [Signaling and media possible configurations](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) for more info</div><div id="bkmrk-calling-flows-using-"><div id="bkmrk-calling-flows-using--1"><div>### Calling flows using SIP

</div></div></div><div>Before you start, make sure you have [enabled and configured SIP on the business phone number](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation). Meta generates a unique SIP user password for each business phone number + app combination. You will need this information and can retrieve it by using the [get Call Settings endpoint.](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div><div id="bkmrk-security"><div id="bkmrk-security-1"><div>#### Security

</div></div></div><span>TLS transport is mandatory for SIP. Meta will present a valid server cert with subject name that covers our SIP domain wa.meta.vc. Your SIP server should do the same as Meta ensures your cert is valid and subject name covers SIP domain you configured on the business phone number </span><span>Meta does NOT support mutual TLS (aka mTLS). This means, when Meta takes the role of a TLS client, your TLS server should not request Client certificate. If you still request client cert, Meta will present a client cert but the cert subject name would refer to a random dynamic host which will not pass certificate validation.</span><span>Meta adds `transport=TLS` to request URI as part of its SIP requests to your SIP server</span><span>For business initiated calls, SIP invite from your SIP server will be challenged using digest auth. See [business-initiated calls](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) for more details</span><span>For user initiated calls, it is highly recommended that you challenge SIP INVITE request from Meta, to use digest auth for more security. See [user-initiated calls](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) for more details</span><div id="bkmrk-how-to-test-if-you-h"><div id="bkmrk-how-to-test-if-you-h-1"><div>#### How to test if you have a valid TLS certificate

</div></div></div><div>When a WhatsApp user calls a business, a common reason for your SIP server to **not** receive the SIP INVITE from Meta is the certificate validation error. You can use information here to confirm valid setup.</div><div>Run the command `openssl s_client -quiet -verify_hostname {hostname} -connect {hostname}:{port}` by properly substituting hostname and port with your values</div><div id="bkmrk-example-of-valid-ser"><div id="bkmrk-example-of-valid-ser-1"><div>##### Example of valid server cert

</div></div></div><div>```
<span>$ openssl s_client </span><span>-</span><span>quiet </span><span>-</span><span>verify_hostname meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com </span><span>-</span><span>connect meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>:</span><span>5061</span><span>Connecting</span><span> to </span><span>64</span><span>:</span><span>ff9b</span><span>::</span><span>68f8</span><span>:</span><span>b0b8
depth</span><span>=</span><span>2</span><span> C</span><span>=</span><span>US</span><span>,</span><span> ST</span><span>=</span><span>New</span><span>Jersey</span><span>,</span><span> L</span><span>=</span><span>Jersey</span><span>City</span><span>,</span><span> O</span><span>=</span><span>The</span><span> USERTRUST </span><span>Network</span><span>,</span><span> CN</span><span>=</span><span>USERTrust</span><span> RSA </span><span>Certification</span><span>Authority</span><span>
verify </span><span>return</span><span>:</span><span>1</span><span>
depth</span><span>=</span><span>1</span><span> C</span><span>=</span><span>AT</span><span>,</span><span> O</span><span>=</span><span>ZeroSSL</span><span>,</span><span> CN</span><span>=</span><span>ZeroSSL</span><span> RSA </span><span>Domain</span><span>Secure</span><span>Site</span><span> CA
verify </span><span>return</span><span>:</span><span>1</span><span>
depth</span><span>=</span><span>0</span><span> CN</span><span>=</span><span>example</span><span>.</span><span>com
verify </span><span>return</span><span>:</span><span>1</span>
```

</div><div id="bkmrk-example-of-hostname%3A"><div id="bkmrk-example-of-hostname%3A-1"><div>##### Example of hostname:port not listening on TLS

</div></div></div><div>```
<span>openssl s_client </span><span>-</span><span>quiet </span><span>-</span><span>verify_hostname lb01</span><span>.</span><span>voice</span><span>.</span><span>usw2</span><span>.</span><span>pure</span><span>.</span><span>cloud </span><span>-</span><span>connect lb01</span><span>.</span><span>voice</span><span>.</span><span>usw2</span><span>.</span><span>pure</span><span>.</span><span>cloud</span><span>:</span><span>5060</span><span>Connecting</span><span> to </span><span>34.211</span><span>.</span><span>206.63</span><span>009F0DFB01000000</span><span>:</span><span>error</span><span>:</span><span>0A000126</span><span>:</span><span>SSL routines</span><span>::</span><span>unexpected eof </span><span>while</span><span> reading</span><span>:</span><span>ssl</span><span>/</span><span>record</span><span>/</span><span>rec_layer_s3</span><span>.</span><span>c</span><span>:</span><span>693</span><span>:</span>
```

</div><div id="bkmrk-example-of-invalid-c"><div id="bkmrk-example-of-invalid-c-1"><div>##### Example of invalid cert

</div></div></div><div>```
<span>$ openssl s_client </span><span>-</span><span>quiet </span><span>-</span><span>verify_hostname meta</span><span>-</span><span>inb</span><span>.</span><span>byoc</span><span>.</span><span>mypurecloud</span><span>.</span><span>com </span><span>-</span><span>connect meta</span><span>-</span><span>inb</span><span>.</span><span>byoc</span><span>.</span><span>mypurecloud</span><span>.</span><span>com</span><span>:</span><span>5061</span><span>Connecting</span><span> to </span><span>64</span><span>:</span><span>ff9b</span><span>::</span><span>3652</span><span>:</span><span>f1c0
depth</span><span>=</span><span>0</span><span> jurisdictionC</span><span>=</span><span>US</span><span>,</span><span> jurisdictionST</span><span>=</span><span>California</span><span>,</span><span> businessCategory</span><span>=</span><span>Private</span><span>Organization</span><span>,</span><span> serialNumber</span><span>=</span><span>1515861</span><span>,</span><span> C</span><span>=</span><span>US</span><span>,</span><span> ST</span><span>=</span><span>Indiana</span><span>,</span><span> L</span><span>=</span><span>Indianapolis</span><span>,</span><span> O</span><span>=</span><span>Genesys</span><span>Cloud</span><span>Services</span><span>,</span><span>Inc</span><span>.,</span><span> CN</span><span>=</span><span>voice</span><span>.</span><span>mypurecloud</span><span>.</span><span>com
verify error</span><span>:</span><span>num</span><span>=</span><span>62</span><span>:</span><span>hostname mismatch
verify </span><span>return</span><span>:</span><span>1</span><span>
depth</span><span>=</span><span>2</span><span> C</span><span>=</span><span>US</span><span>,</span><span> O</span><span>=</span><span>DigiCert</span><span>Inc</span><span>,</span><span> OU</span><span>=</span><span>www</span><span>.</span><span>digicert</span><span>.</span><span>com</span><span>,</span><span> CN</span><span>=</span><span>DigiCert</span><span>High</span><span>Assurance</span><span> EV </span><span>Root</span><span> CA
verify </span><span>return</span><span>:</span><span>1</span><span>
depth</span><span>=</span><span>1</span><span> C</span><span>=</span><span>US</span><span>,</span><span> O</span><span>=</span><span>DigiCert</span><span>Inc</span><span>,</span><span> OU</span><span>=</span><span>www</span><span>.</span><span>digicert</span><span>.</span><span>com</span><span>,</span><span> CN</span><span>=</span><span>DigiCert</span><span> SHA2 </span><span>Extended</span><span>Validation</span><span>Server</span><span> CA
verify </span><span>return</span><span>:</span><span>1</span><span>
depth</span><span>=</span><span>0</span><span> jurisdictionC</span><span>=</span><span>US</span><span>,</span><span> jurisdictionST</span><span>=</span><span>California</span><span>,</span><span> businessCategory</span><span>=</span><span>Private</span><span>Organization</span><span>,</span><span> serialNumber</span><span>=</span><span>1515861</span><span>,</span><span> C</span><span>=</span><span>US</span><span>,</span><span> ST</span><span>=</span><span>Indiana</span><span>,</span><span> L</span><span>=</span><span>Indianapolis</span><span>,</span><span> O</span><span>=</span><span>Genesys</span><span>Cloud</span><span>Services</span><span>,</span><span>Inc</span><span>.,</span><span> CN</span><span>=</span><span>voice</span><span>.</span><span>mypurecloud</span><span>.</span><span>com
verify </span><span>return</span><span>:</span><span>1</span>
```

</div><div>In this case, you can alter the certificate to match your hostname or [change your configured SIP server hostname](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) to match your certificate</div><div id="bkmrk-business-initiated-c"><div id="bkmrk-business-initiated-c-1"><div>#### Business-initiated calls

</div></div></div><div id="bkmrk-prerequisites"><div id="bkmrk-prerequisites-1"><div>##### Prerequisites

</div></div></div><span>You have the required call permission approval from the WhatsApp user </span><span>[Learn how to obtain user calling permissions](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</span><span>[Retrieve Meta generated SIP password](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) and configure it on your SIP server, so it can respond to digest authentication challenge from Meta SIP servers</span><div id="bkmrk-calling-flow"><div id="bkmrk-calling-flow-1"><div>##### Calling flow

</div></div></div><span>Send an initial [SIP INVITE](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) to our servers. Our SIP domain is wa.meta.vc. To initiate a call to WhatsApp user with phone number 11234567890, the SIP request URI should be ‘sip:+11234567890@wa.meta.vc;transport=tls’ </span><span>This request will fail with an “SIP 407 Proxy Authentication required” message.</span><span>Send a 2nd [SIP INVITE](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) with proper Authorization header as per [RFC 3261<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc3261%23section-22&h=AT7eqXkQ2fvXOPMM7YJQGbF-MXwzrOmc1cstVebkR11eOFvFkhJJ7_PwqyI4ltvMnLo3jPSWi6l9JPL5aKp2F-YAwCSpU-RYHm3FexgPyULXK4stJivFB1wf7LGSnGWq9GYIiyr4pkTvj3-IHRTyBQ). </span><span>The Authorization field’s username attribute must match the from header’s user name which is the business phone number</span><span>The password is generated by Meta and you can retrieve it using [get Call Settings endpoint](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</span><span>The username portion of the from header must be the fully normalized business phone number</span><span>The domain name of the from header must match the SIP server you configured on the business phone number</span><span>The `SDP Offer` you include supports ICE, DTLS-SRTP and OPUS (essentially WebRTC media)</span><span>Send the [SIP INVITE](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) to the WhatsApp user number you want to call.</span><div id="bkmrk-user-initiated-calls"><div id="bkmrk-user-initiated-calls-1"><div>#### User-initiated calls

</div></div></div><div id="bkmrk-prerequisites-3"><div id="bkmrk-prerequisites-4"><div>##### Prerequisites

</div></div></div><span>If you plan to use SIP Digest Auth, [retrieve Meta generated SIP password](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) and configure it on your SIP server, so it can respond to digest authentication challenge from Meta SIP servers</span><div id="bkmrk-calling-flow-3"><div id="bkmrk-calling-flow-4"><div>##### Calling flow

</div></div></div><span>The WhatsApp user calls business phone number and is unaware of whether the business is using SIP or Graph API. In other words, the user experience is identical</span><span>If the business phone number is SIP enabled, Meta will send an [SIP INVITE](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) to the SIP server [configured on the business phone number](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</span><span>You respond with [SIP digest auth challenge](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) (recommended) or [SIP OK](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) and pass in an SDP answer</span><div><div>If you are not receiving SIP INVITE from Meta, refer to [SIP specific FAQ](/books/meta-whatsapp/page/faqs-developer-documentation) to troubleshoot further</div></div><div>[View sample SIP requests](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div><div>[Learn more about Session Description Protocol (SDP)<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.rfc-editor.org%2Frfc%2Frfc8866.html&h=AT7eqXkQ2fvXOPMM7YJQGbF-MXwzrOmc1cstVebkR11eOFvFkhJJ7_PwqyI4ltvMnLo3jPSWi6l9JPL5aKp2F-YAwCSpU-RYHm3FexgPyULXK4stJivFB1wf7LGSnGWq9GYIiyr4pkTvj3-IHRTyBQ)</div><div>[View example SDP structures](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation)</div><div id="bkmrk-custom-sip-headers"><div id="bkmrk-custom-sip-headers-1"><div>#### Custom SIP headers

</div></div></div><div>The following custom SIP headers are common to both business and user initiated calls</div><div><table><thead><tr><th><span>Header name </span></th><th><span>Metadata </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>x-wa-meta-call-duration</div></div></td><td><div><div>Optional; String</div></div></td><td><div><div>Call duration in seconds. This is present on SIP BYE requests from Meta for termination of an established call.</div></div></td></tr><tr><td><div><div>x-wa-meta-wacid</div></div></td><td><div><div>Optional; String</div></div></td><td><div><div>WhatsApp call ID. This is present on SIP INVITE request from Meta for a user-initiated call and SIP BYE requests from Meta for termination of an established call.</div></div></td></tr></tbody></table>

</div><div>The following custom SIP headers are specific to user-initiated calls</div><div><table><thead><tr><th><span>Header name </span></th><th><span>Metadata </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>x-wa-meta-cta-payload</div></div></td><td><div><div>Optional; String</div></div></td><td><div><div>Present when user-initiates a call from call button that has business specified payload. [Learn more](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)</div></div></td></tr><tr><td><div><div>x-wa-meta-deeplink-payload</div></div></td><td><div><div>Optional; String</div></div></td><td><div><div>Present when user-initiates a call from call deeplink that has business specified payload. [Learn more](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)</div></div></td></tr></tbody></table>

</div><div id="bkmrk-configure-or-update-"><div id="bkmrk-configure-or-update--1"><div>### Configure or update SIP settings on business phone number

</div></div></div><div>Use this endpoint to update call settings configuration for an individual business phone number.</div><div id="bkmrk-endpoint-parameters"><div id="bkmrk-endpoint-parameters-1"><div>#### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number for which you are updating Calling API settings.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+12784358810`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-body-parameters"><div id="bkmrk-body-parameters-1"><div>#### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`status`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
Enable or disable SIP call signaling for the given business phone number.</div><div>Default is `DISABLED`.</div><div>When `status` is `ENABLED`, this phone number will exclusively use SIP for call signaling and will not work with Graph APIs. No webhooks are sent.</div><div>When `status` is set to `DISABLED`, the SIP `servers` values are not reset.</div><div>If you enable SIP on the same phone number again, the previously configured `servers` values will take effect.</div><div>You can configure both status and SIP servers in the same request</div></div></td></tr><tr><td><div><div>`servers`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The SIP server routing configuration.</div><div>Each phone number can have only one SIP server configured. The servers is an array to be futureproof.</div><div>Previously we allowed multiple apps each with their own SIP server but this setup will not work because Meta will terminate the call after receiving BYE from any of the SIP servers.</div><div>In the GET payload, if you see multiple SIP servers, it means you’ve used the POST API with different access tokens that belong to different apps.</div><div>The associated app is extracted from the access token used to make the API call.</div><div>To delete a previously configured SIP server, pass an empty array to this field. If you still see some servers remaining after you clear, those servers may belong to different apps, so you need to use the corresponding access tokens to clear them.</div><div>Note that at-least 1 SIP server of any app must exist when SIP status is ENABLED. To clear servers for all applications being used with a business phone number, the SIP status should be DISABLED.</div><div>`hostname` — (*String*) **Required**</div><div>The host name of the SIP server.</div><div>Requests must use TLS.</div><div>`port` — (*String*) **Required**</div><div>The port within your SIP server that will accept requests.</div><div>Requests must use TLS.</div><div>Default port is 5061</div><div>`request_uri_user_params` — (*String*) **Optional**</div><div>An optional field for passing any parameters you want included in the user portion of the request URI used in our SIP INVITE to your SIP server.</div><div>Max key/value size is 128 characters.</div><div>An example use case would be Trunk Groups ([RFC 4904<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc4904&h=AT7eqXkQ2fvXOPMM7YJQGbF-MXwzrOmc1cstVebkR11eOFvFkhJJ7_PwqyI4ltvMnLo3jPSWi6l9JPL5aKp2F-YAwCSpU-RYHm3FexgPyULXK4stJivFB1wf7LGSnGWq9GYIiyr4pkTvj3-IHRTyBQ))</div><span>sip:+1234567890@sip.example.com</span><span>tgrp=wacall</span><span>trunk-context=byoc.example.com</span><div>This example has two user parameters for tgrp, and trunk-context.</div><div>The effective SIP request URI line for this would be `sip:+1234567890;tgrp=wacall;trunk-context=byoc.example.com@sip.example.com`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>#### Error response

</div></div></div><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-get-phone-number-cal"><div id="bkmrk-get-phone-number-cal-1"><div>### Get phone number calling settings (SIP)

</div></div></div><div>Use this endpoint to check the configuration of your Calling API feature settings, including SIP values.</div><div>This endpoint can return information for other Cloud API feature settings.</div><div id="bkmrk-endpoint-parameters-3"><div id="bkmrk-endpoint-parameters-4"><div>#### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number for which you are retrieving Calling API settings.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+12784358810`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-app-permission-requi"><div id="bkmrk-app-permission-requi-1"><div>##### App permission required

</div></div></div><div>`whatsapp_business_management`: Advanced access is required to update use the API for end business clients</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>#### Error response

</div></div></div><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-sample-sip-requests"><div id="bkmrk-sample-sip-requests-1"><div>### Sample SIP requests

</div></div></div><div id="bkmrk-business-initiated-c-3"><div id="bkmrk-business-initiated-c-4"><div>#### Business-initiated calls (with WebRTC media)

</div></div></div><div id="bkmrk-initial-sip-invite-r"><div id="bkmrk-initial-sip-invite-r-1"><div>##### Initial SIP INVITE request

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>ftag</span><span>=</span><span>Kc9QZg4496maQ</span><span>;</span><span>nat</span><span>=</span><span>yes</span><span>></span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6081</span><span>:</span><span>798c</span><span>:</span><span>93f8</span><span>:</span><span>5f9b</span><span>:</span><span>bfe8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK0da2</span><span>.</span><span>36614b8977461b486ceabc004c723476.0</span><span>;</span><span>i</span><span>=</span><span>617261</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>137.184</span><span>.</span><span>87.1</span><span>:</span><span>35181</span><span>;</span><span>rport</span><span>=</span><span>56533</span><span>;</span><span>received</span><span>=</span><span>137.184</span><span>.</span><span>87.1</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKQNa6meey5Dj2g
</span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>Kc9QZg4496maQ</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>></span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> dc2c5b33</span><span>-</span><span>1b81</span><span>-</span><span>43ee</span><span>-</span><span>9213</span><span>-</span><span>afb56f4e56ba
</span><span>CSeq</span><span>:</span><span>96743476</span><span> INVITE
</span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:</span><span>mod_sofia@137</span><span>.</span><span>184.87</span><span>.</span><span>1</span><span>:</span><span>35181</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>swrad</span><span>=</span><span>137.184</span><span>.</span><span>87.1</span><span>~</span><span>56533</span><span>~</span><span>3</span><span>></span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>SignalWire</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> MESSAGE</span><span>,</span><span> INFO</span><span>,</span><span> UPDATE</span><span>,</span><span> REGISTER</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
</span><span>Supported</span><span>:</span><span> timer</span><span>,</span><span> path</span><span>,</span><span> replaces
</span><span>Allow</span><span>-</span><span>Events</span><span>:</span><span> talk</span><span>,</span><span> hold</span><span>,</span><span> conference</span><span>,</span><span> refer
</span><span>Session</span><span>-</span><span>Expires</span><span>:</span><span>600</span><span>;</span><span>refresher</span><span>=</span><span>uac
</span><span>Min</span><span>-</span><span>SE</span><span>:</span><span>90</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Disposition</span><span>:</span><span> session
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>2427</span><span>
X</span><span>-</span><span>Relay</span><span>-</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> dc2c5b33</span><span>-</span><span>1b81</span><span>-</span><span>43ee</span><span>-</span><span>9213</span><span>-</span><span>afb56f4e56ba
</span><span>Remote</span><span>-</span><span>Party</span><span>-</span><span>ID</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>party</span><span>=</span><span>calling</span><span>;</span><span>screen</span><span>=</span><span>yes</span><span>;</span><span>privacy</span><span>=</span><span>off
</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>2427</span><span><<</span><span>SDP omitted </span><span>for</span><span> brevity</span><span>>></span>
```

</div><div id="bkmrk-407-response-from-me"><div id="bkmrk-407-response-from-me-1"><div>##### 407 response from Meta

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>407</span><span>Proxy</span><span>Authentication</span><span>Required</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6081</span><span>:</span><span>798c</span><span>:</span><span>93f8</span><span>:</span><span>5f9b</span><span>:</span><span>bfe8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK0da2</span><span>.</span><span>36614b8977461b486ceabc004c723476.0</span><span>;</span><span>i</span><span>=</span><span>617261</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>137.184</span><span>.</span><span>87.1</span><span>:</span><span>35181</span><span>;</span><span>rport</span><span>=</span><span>56533</span><span>;</span><span>received</span><span>=</span><span>137.184</span><span>.</span><span>87.1</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKQNa6meey5Dj2g
</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>ftag</span><span>=</span><span>Kc9QZg4496maQ</span><span>;</span><span>nat</span><span>=</span><span>yes</span><span>></span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> dc2c5b33</span><span>-</span><span>1b81</span><span>-</span><span>43ee</span><span>-</span><span>9213</span><span>-</span><span>afb56f4e56ba
</span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>Kc9QZg4496maQ</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>z9hG4bK0da2</span><span>.</span><span>36614b8977461b486ceabc004c723476.0</span><span>CSeq</span><span>:</span><span>96743476</span><span> INVITE
</span><span>Proxy</span><span>-</span><span>Authenticate</span><span>:</span><span>Digest</span><span> realm</span><span>=</span><span>"wa.meta.vc"</span><span>,</span><span>nonce</span><span>=</span><span>"419ac2415577f8e1"</span><span>,</span><span>opaque</span><span>=</span><span>"440badfc05072367"</span><span>,</span><span>algorithm</span><span>=</span><span>MD5</span><span>,</span><span>qop</span><span>=</span><span>"auth"</span>
```

</div><div id="bkmrk-second-sip-invite-se"><div id="bkmrk-second-sip-invite-se-1"><div>##### Second SIP INVITE sent with authorization

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>ftag</span><span>=</span><span>Kc9QZg4496maQ</span><span>;</span><span>nat</span><span>=</span><span>yes</span><span>></span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>159.65</span><span>.</span><span>244.171</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6081</span><span>:</span><span>798c</span><span>:</span><span>93f8</span><span>:</span><span>5f9b</span><span>:</span><span>bfe8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK1da2</span><span>.</span><span>ed8900012befced853927008d619d374</span><span>.</span><span>0</span><span>;</span><span>i</span><span>=</span><span>617261</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>137.184</span><span>.</span><span>87.1</span><span>:</span><span>35181</span><span>;</span><span>rport</span><span>=</span><span>56533</span><span>;</span><span>received</span><span>=</span><span>137.184</span><span>.</span><span>87.1</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKry3yp9y12p8mc
        </span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>Kc9QZg4496maQ</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>></span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> dc2c5b33</span><span>-</span><span>1b81</span><span>-</span><span>43ee</span><span>-</span><span>9213</span><span>-</span><span>afb56f4e56ba
        </span><span>CSeq</span><span>:</span><span>96743477</span><span> INVITE
        </span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:</span><span>mod_sofia@137</span><span>.</span><span>184.87</span><span>.</span><span>1</span><span>:</span><span>35181</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>swrad</span><span>=</span><span>137.184</span><span>.</span><span>87.1</span><span>~</span><span>56533</span><span>~</span><span>3</span><span>></span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>SignalWire</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> MESSAGE</span><span>,</span><span> INFO</span><span>,</span><span> UPDATE</span><span>,</span><span> REGISTER</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
        </span><span>Supported</span><span>:</span><span> timer</span><span>,</span><span> path</span><span>,</span><span> replaces
        </span><span>Allow</span><span>-</span><span>Events</span><span>:</span><span> talk</span><span>,</span><span> hold</span><span>,</span><span> conference</span><span>,</span><span> refer
        </span><span>Proxy</span><span>-</span><span>Authorization</span><span>:</span><span>Digest</span><span> username</span><span>=</span><span>"17125550259"</span><span>,</span><span> realm</span><span>=</span><span>"wa.meta.vc"</span><span>,</span><span> nonce</span><span>=</span><span>"419ac2415577f8e1"</span><span>,</span><span> uri</span><span>=</span><span>"sip:+12195550714@wa.meta.vc;transport=tls"</span><span>,</span><span> response</span><span>=</span><span>"blah"</span><span>,</span><span> algorithm</span><span>=</span><span>MD5</span><span>,</span><span> cnonce</span><span>=</span><span>"/mVZtYFCEj65YQJCrBEAAg"</span><span>,</span><span> opaque</span><span>=</span><span>"440badfc05072367"</span><span>,</span><span> qop</span><span>=</span><span>auth</span><span>,</span><span> nc</span><span>=</span><span>00000001</span><span>Session</span><span>-</span><span>Expires</span><span>:</span><span>600</span><span>;</span><span>refresher</span><span>=</span><span>uac
        </span><span>Min</span><span>-</span><span>SE</span><span>:</span><span>90</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
        </span><span>Content</span><span>-</span><span>Disposition</span><span>:</span><span> session
        </span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>2427</span><span>
        X</span><span>-</span><span>Relay</span><span>-</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> dc2c5b33</span><span>-</span><span>1b81</span><span>-</span><span>43ee</span><span>-</span><span>9213</span><span>-</span><span>afb56f4e56ba
        </span><span>Remote</span><span>-</span><span>Party</span><span>-</span><span>ID</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>party</span><span>=</span><span>calling</span><span>;</span><span>screen</span><span>=</span><span>yes</span><span>;</span><span>privacy</span><span>=</span><span>off
        </span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
        </span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>2427</span><span><<</span><span>SDP omitted </span><span>for</span><span> brevity</span><span>>></span>
```

</div><div id="bkmrk-example-error-respon"><div id="bkmrk-example-error-respon-1"><div>##### Example error response

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>403</span><span> SIP server wa</span><span>.</span><span>meta</span><span>.</span><span>vc </span><span>from</span><span> INVITE does </span><span>not</span><span> match any SIP server configured </span><span>for</span><span> phone number id </span><span>{</span><span>ID</span><span>}</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>c954</span><span>:</span><span>b533</span><span>:</span><span>ecfb</span><span>:</span><span>5cec</span><span>:</span><span>300</span><span>:</span><span>0</span><span>]:</span><span>39459</span><span>;</span><span>rport</span><span>=</span><span>39459</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>c954</span><span>:</span><span>b533</span><span>:</span><span>ecfb</span><span>:</span><span>5cec</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjf9f3d0bddb3dbe0c9b1e3b486f39784a</span><span>;</span><span>alias</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>148.72</span><span>.</span><span>155.236</span><span>:</span><span>5061</span><span>;</span><span>rport</span><span>=</span><span>30498</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>d014</span><span>:</span><span>8e40</span><span>:</span><span>ddbb</span><span>:</span><span>4ed7</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjfd270ec8</span><span>-</span><span>7aaf</span><span>-</span><span>4a65</span><span>-</span><span>b290</span><span>-</span><span>4bef3b50b7b7</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>-</span><span>dev</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Call</span><span>-</span><span>ID</span><span>:</span><span>91578781</span><span>-</span><span>44f1</span><span>-</span><span>4268</span><span>-</span><span>9a7f</span><span>-</span><span>d7efec1abf72
        </span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17125550259@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>3a63b370</span><span>-</span><span>a697</span><span>-</span><span>4a5a</span><span>-</span><span>82b4</span><span>-</span><span>e8105e23f176
        </span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>e0d30a05</span><span>-</span><span>657b</span><span>-</span><span>47ec</span><span>-</span><span>a668</span><span>-</span><span>e05ca79f9f05
        </span><span>CSeq</span><span>:</span><span>15659</span><span> INVITE
        </span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
        X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
        </span><span>Warning</span><span>:</span><span>399</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc </span><span>"SIP server wa.meta.vc from INVITE does not match any SIP server configured for phone number id {ID}"</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span>
```

</div><div id="bkmrk-sip-bye"><div id="bkmrk-sip-bye-1"><div>##### SIP BYE

</div></div></div><div>```
<span>BYE sip</span><span>:+</span><span>5559800000693@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>137.184</span><span>.</span><span>4.155</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>c074</span><span>:</span><span>cac</span><span>:</span><span>10ed</span><span>:</span><span>4b05</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>i</span><span>=</span><span>8d2dc2</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>143.198</span><span>.</span><span>136.243</span><span>:</span><span>35181</span><span>;</span><span>rport</span><span>=</span><span>38087</span><span>;</span><span>received</span><span>=</span><span>143.198</span><span>.</span><span>136.243</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>NcKQ6mtDKSDQB</span><span>To</span><span>:</span><span>"5559800000693"</span><span><</span><span>sip</span><span>:+</span><span>5559800000693@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>92a01092</span><span>-</span><span>ee78</span><span>-</span><span>4870</span><span>-</span><span>865f</span><span>-</span><span>bc176203a6bd
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgPMjAwNzU2OTA0ODY5OTY1FRIAEhggMjQ4QzUwOUQ1REQ0NDUwNENEQzRFMTgwRTNGQjAwNjEcGAsxMjE0NTU1MTg2ORUCAAA</span><span>CSeq</span><span>:</span><span>98734935</span><span> BYE
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>SignalWire</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> MESSAGE</span><span>,</span><span> INFO</span><span>,</span><span> UPDATE</span><span>,</span><span> REGISTER</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
</span><span>Supported</span><span>:</span><span> timer</span><span>,</span><span> path</span><span>,</span><span> replaces
</span><span>Reason</span><span>:</span><span> Q</span><span>.</span><span>850</span><span>;</span><span>cause</span><span>=</span><span>16</span><span>;</span><span>text</span><span>=</span><span>"NORMAL_CLEARING"</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span><span>
X</span><span>-</span><span>Relay</span><span>-</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> b72c0c65</span><span>-</span><span>e319</span><span>-</span><span>41b3</span><span>-</span><span>afb7</span><span>-</span><span>19ebcca05d38</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span>
```

</div><div id="bkmrk-sip-invite-%28with-sde"><div id="bkmrk-sip-invite-%28with-sde-1"><div>##### SIP INVITE (with SDES)

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>></span><span>CSeq</span><span>:</span><span>2</span><span> INVITE
</span><span>From</span><span>:</span><span>"12145551869"</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>28460006</span><span>_c3356d0b_5cdada8c</span><span>-</span><span>cbf0</span><span>-</span><span>4369</span><span>-</span><span>b02d</span><span>-</span><span>cc97d3c36f2b
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>></span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>66</span><span>
P</span><span>-</span><span>Asserted</span><span>-</span><span>Identity</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>></span><span>Min</span><span>-</span><span>SE</span><span>:</span><span>120</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> f304a1d2cafb8139c1f9ff93a7733586@0</span><span>.</span><span>0.0</span><span>.</span><span>0</span><span>Contact</span><span>:</span><span>"12145551869"</span><span><</span><span>sip</span><span>:+</span><span>12145551869</span><span>@</span><span>172.25</span><span>.</span><span>10.217</span><span>:</span><span>5060</span><span>;</span><span>transport</span><span>=</span><span>udp</span><span>></span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> BYE</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f934</span><span>:</span><span>8894</span><span>:</span><span>7eb5</span><span>:</span><span>24f9</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK1e5a</span><span>.</span><span>0da2ace9cc912d9e5f2595ca4acb9847.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>UDP </span><span>172.25</span><span>.</span><span>10.217</span><span>:</span><span>5060</span><span>;</span><span>rport</span><span>=</span><span>5060</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK5cdada8c</span><span>-</span><span>cbf0</span><span>-</span><span>4369</span><span>-</span><span>b02d</span><span>-</span><span>cc97d3c36f2b_c3356d0b_54</span><span>-</span><span>457463274351249162</span><span>Supported</span><span>:</span><span> timer
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>Twilio</span><span>Gateway</span><span>Proxy</span><span>-</span><span>Authorization</span><span>:</span><span>Digest</span><span> username</span><span>=</span><span>"12145551869"</span><span>,</span><span> realm</span><span>=</span><span>"wa.meta.vc"</span><span>,</span><span> nonce</span><span>=</span><span>"2a487cb01d4ed43b"</span><span>,</span><span> uri</span><span>=</span><span>"sip:+12195550714@wa.meta.vc;transport=tls"</span><span>,</span><span> response</span><span>=</span><span>"3f58df7af575b948625aeffd51bf9060"</span><span>,</span><span> algorithm</span><span>=</span><span>MD5</span><span>,</span><span> cnonce</span><span>=</span><span>"b338deb7f0e004e66353e26d34ad62b7"</span><span>,</span><span> opaque</span><span>=</span><span>"725a06fb2cd89a32"</span><span>,</span><span> qop</span><span>=</span><span>auth</span><span>,</span><span> nc</span><span>=</span><span>00000002</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
X</span><span>-</span><span>Twilio</span><span>-</span><span>CallSid</span><span>:</span><span> CA93eac6be615da5e6836c7059e9555348
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>422</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>422</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=</span><span>root </span><span>1185414872</span><span>1185414872</span><span> IN IP4 </span><span>172.18</span><span>.</span><span>155.180</span><span>
s</span><span>=</span><span>Twilio</span><span>Media</span><span>Gateway</span><span>
c</span><span>=</span><span>IN IP4 </span><span>168.86</span><span>.</span><span>138.232</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
m</span><span>=</span><span>audio </span><span>19534</span><span> RTP</span><span>/</span><span>SAVP </span><span>107</span><span>0</span><span>8</span><span>101</span><span>
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>0</span><span> PCMU</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>107</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>107</span><span> useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>8</span><span> PCMA</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>101</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>101</span><span>0</span><span>-</span><span>16</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>sendrecv</span>
```

</div><div id="bkmrk-sip-ok-%28with-sdes%29"><div id="bkmrk-sip-ok-%28with-sdes%29-1"><div>##### SIP OK (with SDES)

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>200</span><span> OK
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f934</span><span>:</span><span>8894</span><span>:</span><span>7eb5</span><span>:</span><span>24f9</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK1e5a</span><span>.</span><span>0da2ace9cc912d9e5f2595ca4acb9847.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>UDP </span><span>172.25</span><span>.</span><span>10.217</span><span>:</span><span>5060</span><span>;</span><span>rport</span><span>=</span><span>5060</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bK5cdada8c</span><span>-</span><span>cbf0</span><span>-</span><span>4369</span><span>-</span><span>b02d</span><span>-</span><span>cc97d3c36f2b_c3356d0b_54</span><span>-</span><span>457463274351249162</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>></span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> f304a1d2cafb8139c1f9ff93a7733586@0</span><span>.</span><span>0.0</span><span>.</span><span>0</span><span>From</span><span>:</span><span>"12145551869"</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>28460006</span><span>_c3356d0b_5cdada8c</span><span>-</span><span>cbf0</span><span>-</span><span>4369</span><span>-</span><span>b02d</span><span>-</span><span>cc97d3c36f2b
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>0d185053</span><span>-</span><span>2615</span><span>-</span><span>46c7</span><span>-</span><span>8ff2</span><span>-</span><span>250bda494cf1</span><span>CSeq</span><span>:</span><span>2</span><span> INVITE
</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
</span><span>Supported</span><span>:</span><span> timer
X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
</span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob</span><span>;</span><span>X</span><span>-</span><span>FB</span><span>-</span><span>Sip</span><span>-</span><span>Smc</span><span>-</span><span>Tier</span><span>=</span><span>collaboration</span><span>.</span><span>sip_gateway</span><span>.</span><span>sip</span><span>.</span><span>prod</span><span>>;</span><span>isfocus
</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>645</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>1746657286595</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>42da9643</span><span>-</span><span>cb50</span><span>-</span><span>4eca</span><span>-</span><span>95d3</span><span>-</span><span>ca41b3f1f4bb
m</span><span>=</span><span>audio </span><span>3480</span><span> RTP</span><span>/</span><span>SAVP </span><span>107</span><span>101</span><span>
c</span><span>=</span><span>IN IP4 </span><span>157.240</span><span>.</span><span>19.130</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>42da9643</span><span>-</span><span>cb50</span><span>-</span><span>4eca</span><span>-</span><span>95d3</span><span>-</span><span>ca41b3f1f4bb </span><span>WhatsAppTrack1</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>107</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>107</span><span> maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>minptime</span><span>=</span><span>20</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>101</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>1238967757</span><span> cname</span><span>:</span><span>WhatsAppAudioStream1</span>
```

</div><div id="bkmrk-user-initiated-calls-3"><div id="bkmrk-user-initiated-calls-4"><div>#### User-initiated calls (with WebRTC media)

</div></div></div><div id="bkmrk-sip-invite"><div id="bkmrk-sip-invite-1"><div>##### SIP INVITE

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>17015558857@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>e888</span><span>:</span><span>51aa</span><span>:</span><span>d4a4</span><span>:</span><span>c5e0</span><span>:</span><span>300</span><span>:</span><span>0</span><span>]:</span><span>33819</span><span>;</span><span>rport</span><span>=</span><span>33819</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>e888</span><span>:</span><span>51aa</span><span>:</span><span>d4a4</span><span>:</span><span>c5e0</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjNvs</span><span>.</span><span>IZBnUa1W4l8oHPpk3SUMmcx3MMcE</span><span>;</span><span>alias</span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>70</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>bbf1ad6e</span><span>-</span><span>79bb</span><span>-</span><span>4d9c</span><span>-</span><span>8a2c</span><span>-</span><span>094168a10bea</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>17015558857@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>></span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob</span><span>>;</span><span>isfocus
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCAzODg1NTE5NEU1NTBEMTc1RTFFQUY5NjNCQ0FCRkEzRhwYCzE3MDE1NTU4ODU3FQIAAA</span><span>==</span><span>CSeq</span><span>:</span><span>2824</span><span> INVITE
</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>-</span><span>dev</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>
X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>Facebook</span><span>SipGateway</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>1028</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>1741113186367</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>632a909f</span><span>-</span><span>1060</span><span>-</span><span>4369</span><span>-</span><span>96a4</span><span>-</span><span>7bd03e291ee7</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>lite
m</span><span>=</span><span>audio </span><span>3480</span><span> UDP</span><span>/</span><span>TLS</span><span>/</span><span>RTP</span><span>/</span><span>SAVPF </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>57.144</span><span>.</span><span>135.35</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>1775469887</span><span>1</span><span> udp </span><span>2122260223</span><span>57.144</span><span>.</span><span>135.35</span><span>3480</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>3355715111</span><span>1</span><span> udp </span><span>2122262783</span><span>2a03</span><span>:</span><span>2880</span><span>:</span><span>f343</span><span>:</span><span>131</span><span>:</span><span>face</span><span>:</span><span>b00c</span><span>:</span><span>0</span><span>:</span><span>699c</span><span>3480</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>ufrag</span><span>:</span><span>RmDDkfzkwbexPfbC</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>pwd</span><span>:*************************</span><span>
a</span><span>=</span><span>fingerprint</span><span>:********************************************************************************************************</span><span>
a</span><span>=</span><span>setup</span><span>:</span><span>actpass
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>632a909f</span><span>-</span><span>1060</span><span>-</span><span>4369</span><span>-</span><span>96a4</span><span>-</span><span>7bd03e291ee7</span><span>WhatsAppTrack1</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>fb</span><span>:</span><span>111</span><span> transport</span><span>-</span><span>cc
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>minptime</span><span>=</span><span>20</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>849255537</span><span> cname</span><span>:</span><span>WhatsAppAudioStream1</span>
```

</div><div id="bkmrk-sip-bye-3"><div id="bkmrk-sip-bye-4"><div>##### SIP BYE

</div></div></div><div>```
<span>BYE sip</span><span>:+</span><span>5559800000693@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>137.184</span><span>.</span><span>4.155</span><span>:</span><span>5061</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>c074</span><span>:</span><span>cac</span><span>:</span><span>10ed</span><span>:</span><span>4b05</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>i</span><span>=</span><span>8d2dc2</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>143.198</span><span>.</span><span>136.243</span><span>:</span><span>35181</span><span>;</span><span>rport</span><span>=</span><span>38087</span><span>;</span><span>received</span><span>=</span><span>143.198</span><span>.</span><span>136.243</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>NcKQ6mtDKSDQB</span><span>To</span><span>:</span><span>"5559800000693"</span><span><</span><span>sip</span><span>:+</span><span>5559800000693@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>92a01092</span><span>-</span><span>ee78</span><span>-</span><span>4870</span><span>-</span><span>865f</span><span>-</span><span>bc176203a6bd
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgPMjAwNzU2OTA0ODY5OTY1FRIAEhggMjQ4QzUwOUQ1REQ0NDUwNENEQzRFMTgwRTNGQjAwNjEcGAsxMjE0NTU1MTg2ORUCAAA</span><span>CSeq</span><span>:</span><span>98734935</span><span> BYE
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>SignalWire</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> MESSAGE</span><span>,</span><span> INFO</span><span>,</span><span> UPDATE</span><span>,</span><span> REGISTER</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
</span><span>Supported</span><span>:</span><span> timer</span><span>,</span><span> path</span><span>,</span><span> replaces
</span><span>Reason</span><span>:</span><span> Q</span><span>.</span><span>850</span><span>;</span><span>cause</span><span>=</span><span>16</span><span>;</span><span>text</span><span>=</span><span>"NORMAL_CLEARING"</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span><span>
X</span><span>-</span><span>Relay</span><span>-</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> b72c0c65</span><span>-</span><span>e319</span><span>-</span><span>41b3</span><span>-</span><span>afb7</span><span>-</span><span>19ebcca05d38</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span>
```

</div><div id="bkmrk-sip-invite-%28with-sde-3"><div id="bkmrk-sip-invite-%28with-sde-4"><div>##### SIP INVITE (with SDES)

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>::]:</span><span>57363</span><span>;</span><span>rport</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj3a9f2ad89e4a3df61408aa84f7d9a63e</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>d33c</span><span>:</span><span>e00</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj3a9f2ad89e4a3df61408aa84f7d9a63e
            </span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>1ac5</span><span>:</span><span>cdf8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>]:</span><span>63057</span><span>;</span><span>rport</span><span>=</span><span>63057</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>1ac5</span><span>:</span><span>cdf8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj</span><span>-</span><span>phic0sbns27DiP0OlrxRxgLtNg4mio7</span><span>;</span><span>alias</span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>8a0f7e65</span><span>-</span><span>6e9e</span><span>-</span><span>4801</span><span>-</span><span>bf92</span><span>-</span><span>85c3ef2485d9</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>></span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob</span><span>>;</span><span>isfocus
            </span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA4QkY1MTJCQkNFNTgxMEVFRERFRTUzNTFERkE1MDU0MhwYCzEyMTQ1NTUxODY5FQIAAA</span><span>CSeq</span><span>:</span><span>31159</span><span> INVITE
            X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
            </span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
            </span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>Facebook</span><span>SipGateway</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
            </span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>645</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>1746659966980</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>07092115</span><span>-</span><span>d151</span><span>-</span><span>427e-8722</span><span>-</span><span>26c70936b104</span><span>
m</span><span>=</span><span>audio </span><span>3480</span><span> RTP</span><span>/</span><span>SAVP </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>157.240</span><span>.</span><span>19.130</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>07092115</span><span>-</span><span>d151</span><span>-</span><span>427e-8722</span><span>-</span><span>26c70936b104</span><span>WhatsAppTrack1</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>minptime</span><span>=</span><span>20</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>1615009994</span><span> cname</span><span>:</span><span>WhatsAppAudioStream1</span>
```

</div><div id="bkmrk-sip-ok-%28with-sdes%29-3"><div id="bkmrk-sip-ok-%28with-sdes%29-4"><div>##### SIP OK (with SDES)

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>200</span><span> OK
            </span><span>CSeq</span><span>:</span><span>31159</span><span> INVITE
            </span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA4QkY1MTJCQkNFNTgxMEVFRERFRTUzNTFERkE1MDU0MhwYCzEyMTQ1NTUxODY5FQIAAA</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>8a0f7e65</span><span>-</span><span>6e9e</span><span>-</span><span>4801</span><span>-</span><span>bf92</span><span>-</span><span>85c3ef2485d9</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>66596922</span><span>_c3356d0b_fee164be</span><span>-</span><span>566a</span><span>-</span><span>4679</span><span>-</span><span>a80d</span><span>-</span><span>5bfdf1d0aa9e</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>157.240</span><span>.</span><span>229.209</span><span>:</span><span>5061</span><span>;</span><span>rport</span><span>=</span><span>51830</span><span>;</span><span>received</span><span>=</span><span>69.171</span><span>.</span><span>251.115</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj3a9f2ad89e4a3df61408aa84f7d9a63e</span><span>;</span><span>alias</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>d33c</span><span>:</span><span>e00</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj3a9f2ad89e4a3df61408aa84f7d9a63e
            </span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>1ac5</span><span>:</span><span>cdf8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>]:</span><span>63057</span><span>;</span><span>rport</span><span>=</span><span>63057</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>1ac5</span><span>:</span><span>cdf8</span><span>:</span><span>300</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj</span><span>-</span><span>phic0sbns27DiP0OlrxRxgLtNg4mio7</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5060</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>;</span><span>twnat</span><span>=</span><span>sip</span><span>:</span><span>69.171</span><span>.</span><span>251.115</span><span>:</span><span>51830</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.1</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>;</span><span>twnat</span><span>=</span><span>sip</span><span>:</span><span>69.171</span><span>.</span><span>251.115</span><span>:</span><span>51830</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Server</span><span>:</span><span>Twilio</span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>172.25</span><span>.</span><span>16.223</span><span>:</span><span>5060</span><span>></span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> BYE</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
            </span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
            X</span><span>-</span><span>Twilio</span><span>-</span><span>CallSid</span><span>:</span><span>CAb0d74508fe5fcdf6ec70ea3cf4e9b90b</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>446</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
            </span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>446</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=</span><span>root </span><span>1353670385</span><span>1353670385</span><span> IN IP4 </span><span>172.18</span><span>.</span><span>164.24</span><span>
s</span><span>=</span><span>Twilio</span><span>Media</span><span>Gateway</span><span>
c</span><span>=</span><span>IN IP4 </span><span>168.86</span><span>.</span><span>138.176</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
m</span><span>=</span><span>audio </span><span>15822</span><span> RTP</span><span>/</span><span>SAVP </span><span>111</span><span>126</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>126</span><span>0</span><span>-</span><span>16</span><span>
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>sendrecv</span>
```

</div><div id="bkmrk-user-initiated-calls-6"><div id="bkmrk-user-initiated-calls-7"><div>#### User-initiated calls with digest auth (with SDES media)

</div></div></div><div>Meta SIP server supports digest auth for user initiated calls. Your SIP server should respond with digest auth challenge and Meta will resend the SIP INVITE with challenge response. The username used for digest auth is the (normalized) business phone number and the password is generated by Meta and retrievable using the [get Call settings endpoint](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</div><div id="bkmrk-first-invite-request"><div id="bkmrk-first-invite-request-1"><div>##### First INVITE request from Meta

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>::]:</span><span>47237</span><span>;</span><span>rport</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj1e6c665db16b3ecacf32cadb4497fe77</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>7253</span><span>:</span><span>922a</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj1e6c665db16b3ecacf32cadb4497fe77
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>58279</span><span>;</span><span>rport</span><span>=</span><span>58279</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjr33j97A1mx5J8HWHEy2zIgqZYCCIb4Fb</span><span>;</span><span>alias</span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>ece2da15</span><span>-</span><span>39e7</span><span>-</span><span>4983</span><span>-</span><span>ac65</span><span>-</span><span>e312f325d94a
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>></span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob</span><span>>;</span><span>isfocus
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA2MUI2QUY0MDRCMTUyOTM4QkE5ODEwN0ZGQTAwODkxORwYCzEyMTQ1NTUxODY5FQIAFRoA</span><span>CSeq</span><span>:</span><span>9989</span><span> INVITE
X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>Facebook</span><span>SipGateway</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>643</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>1750716867913</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>4e37b099</span><span>-</span><span>8aef</span><span>-</span><span>45d0</span><span>-</span><span>be4f</span><span>-</span><span>1cde2ca5a37d</span><span>
m</span><span>=</span><span>audio </span><span>3480</span><span> RTP</span><span>/</span><span>SAVP </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>57.144</span><span>.</span><span>219.49</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>4e37b099</span><span>-</span><span>8aef</span><span>-</span><span>45d0</span><span>-</span><span>be4f</span><span>-</span><span>1cde2ca5a37d</span><span>WhatsAppTrack1</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>minptime</span><span>=</span><span>20</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>215879358</span><span> cname</span><span>:</span><span>WhatsAppAudioStream1</span>
```

</div><div id="bkmrk-407-response-from-pa"><div id="bkmrk-407-response-from-pa-1"><div>##### 407 Response from partner SIP server

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>407</span><span>Proxy</span><span>Authentication</span><span> required
</span><span>CSeq</span><span>:</span><span>9989</span><span> INVITE
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA2MUI2QUY0MDRCMTUyOTM4QkE5ODEwN0ZGQTAwODkxORwYCzEyMTQ1NTUxODY5FQIAFRoA</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>ece2da15</span><span>-</span><span>39e7</span><span>-</span><span>4983</span><span>-</span><span>ac65</span><span>-</span><span>e312f325d94a
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>45065608</span><span>_c3356d0b_16001fd8</span><span>-</span><span>76d2</span><span>-</span><span>45f0</span><span>-</span><span>bb35</span><span>-</span><span>e0441d6dc4a2
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>31.13</span><span>.</span><span>66.215</span><span>:</span><span>5061</span><span>;</span><span>rport</span><span>=</span><span>62080</span><span>;</span><span>received</span><span>=</span><span>69.171</span><span>.</span><span>251.112</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj1e6c665db16b3ecacf32cadb4497fe77</span><span>;</span><span>alias</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>7253</span><span>:</span><span>922a</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj1e6c665db16b3ecacf32cadb4497fe77
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>58279</span><span>;</span><span>rport</span><span>=</span><span>58279</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjr33j97A1mx5J8HWHEy2zIgqZYCCIb4Fb</span><span>;</span><span>alias</span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>172.25</span><span>.</span><span>58.54</span><span>:</span><span>5060</span><span>></span><span>Proxy</span><span>-</span><span>Authenticate</span><span>:</span><span>Digest</span><span> realm</span><span>=</span><span>"sip.twilio.com"</span><span>,</span><span>nonce</span><span>=</span><span>"eyOam_8-l5FVugxsyxFRjnlxq9vy1TjQIMB3mBfJuAvB5gV4"</span><span>,</span><span>opaque</span><span>=</span><span>"4a6a068be2ca2032a57912b9a2a6adf7"</span><span>,</span><span>qop</span><span>=</span><span>"auth"</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>0</span>
```

</div><div id="bkmrk-second-invite-with-a"><div id="bkmrk-second-invite-with-a-1"><div>##### Second INVITE with authorization from Meta

</div></div></div><div>```
<span>INVITE sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>;</span><span>transport</span><span>=</span><span>tls SIP</span><span>/</span><span>2.0</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>31.13</span><span>.</span><span>66.215</span><span>:</span><span>5061</span><span>;</span><span>rport</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj16be0694dc6763eb66de5ec5f262db03</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>7253</span><span>:</span><span>922a</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj16be0694dc6763eb66de5ec5f262db03
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>58279</span><span>;</span><span>rport</span><span>=</span><span>58279</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjYp9LqI0D8zJ</span><span>.</span><span>wly5wyMyVaH9fUwIU921</span><span>;</span><span>alias</span><span>Max</span><span>-</span><span>Forwards</span><span>:</span><span>69</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>ece2da15</span><span>-</span><span>39e7</span><span>-</span><span>4983</span><span>-</span><span>ac65</span><span>-</span><span>e312f325d94a
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>></span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>ob</span><span>>;</span><span>isfocus
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA2MUI2QUY0MDRCMTUyOTM4QkE5ODEwN0ZGQTAwODkxORwYCzEyMTQ1NTUxODY5FQIAFRoA</span><span>CSeq</span><span>:</span><span>9990</span><span> INVITE
X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc
</span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> BYE</span><span>,</span><span> CANCEL</span><span>,</span><span> NOTIFY</span><span>,</span><span> OPTIONS
</span><span>User</span><span>-</span><span>Agent</span><span>:</span><span>Facebook</span><span>SipGateway</span><span>Proxy</span><span>-</span><span>Authorization</span><span>:</span><span>Digest</span><span> username</span><span>=</span><span>"12145551869"</span><span>,</span><span> realm</span><span>=</span><span>"sip.twilio.com"</span><span>,</span><span> nonce</span><span>=</span><span>"eyOam_8-l5FVugxsyxFRjnlxq9vy1TjQIMB3mBfJuAvB5gV4"</span><span>,</span><span> uri</span><span>=</span><span>"sip:+12145551869@meta-voip.example.com"</span><span>,</span><span> response</span><span>=</span><span>"b28ed6b8bf1418e3c6eca05ef8c7a0b1"</span><span>,</span><span> cnonce</span><span>=</span><span>"TY2SszvYCKitUCBlVLpGiPKMQfmBbj"</span><span>,</span><span> opaque</span><span>=</span><span>"4a6a068be2ca2032a57912b9a2a6adf7"</span><span>,</span><span> qop</span><span>=</span><span>auth</span><span>,</span><span> nc</span><span>=</span><span>00000001</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>643</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>1750716867913</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>4e37b099</span><span>-</span><span>8aef</span><span>-</span><span>45d0</span><span>-</span><span>be4f</span><span>-</span><span>1cde2ca5a37d</span><span>
m</span><span>=</span><span>audio </span><span>3480</span><span> RTP</span><span>/</span><span>SAVP </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>57.144</span><span>.</span><span>219.49</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>4e37b099</span><span>-</span><span>8aef</span><span>-</span><span>45d0</span><span>-</span><span>be4f</span><span>-</span><span>1cde2ca5a37d</span><span>WhatsAppTrack1</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>minptime</span><span>=</span><span>20</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>215879358</span><span> cname</span><span>:</span><span>WhatsAppAudioStream1</span>
```

</div><div id="bkmrk-sip-ok-from-partner-"><div id="bkmrk-sip-ok-from-partner--1"><div>##### SIP OK from partner SIP server

</div></div></div><div>```
<span>SIP</span><span>/</span><span>2.0</span><span>200</span><span> OK
</span><span>CSeq</span><span>:</span><span>9990</span><span> INVITE
</span><span>Call</span><span>-</span><span>ID</span><span>:</span><span> outgoing</span><span>:</span><span>wacid</span><span>.</span><span>HBgLMTIxOTU1NTA3MTQVAgASGCA2MUI2QUY0MDRCMTUyOTM4QkE5ODEwN0ZGQTAwODkxORwYCzEyMTQ1NTUxODY5FQIAFRoA</span><span>From</span><span>:</span><span>"12195550714"</span><span><</span><span>sip</span><span>:+</span><span>12195550714@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>>;</span><span>tag</span><span>=</span><span>ece2da15</span><span>-</span><span>39e7</span><span>-</span><span>4983</span><span>-</span><span>ac65</span><span>-</span><span>e312f325d94a
</span><span>To</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>12145551869@meta</span><span>-</span><span>voip</span><span>.</span><span>example</span><span>.</span><span>com</span><span>>;</span><span>tag</span><span>=</span><span>29360930</span><span>_c3356d0b_4933dc58</span><span>-</span><span>f035</span><span>-</span><span>4597</span><span>-</span><span>b075</span><span>-</span><span>04b19e552329</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>31.13</span><span>.</span><span>66.215</span><span>:</span><span>5061</span><span>;</span><span>rport</span><span>=</span><span>62080</span><span>;</span><span>received</span><span>=</span><span>69.171</span><span>.</span><span>251.112</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj16be0694dc6763eb66de5ec5f262db03</span><span>;</span><span>alias</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f948</span><span>:</span><span>9597</span><span>:</span><span>7253</span><span>:</span><span>922a</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>5061</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPj16be0694dc6763eb66de5ec5f262db03
</span><span>Via</span><span>:</span><span> SIP</span><span>/</span><span>2.0</span><span>/</span><span>TLS </span><span>[</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>]:</span><span>58279</span><span>;</span><span>rport</span><span>=</span><span>58279</span><span>;</span><span>received</span><span>=</span><span>2803</span><span>:</span><span>6080</span><span>:</span><span>f8bc</span><span>:</span><span>9272</span><span>:</span><span>e488</span><span>:</span><span>9927</span><span>:</span><span>400</span><span>:</span><span>0</span><span>;</span><span>branch</span><span>=</span><span>z9hG4bKPjYp9LqI0D8zJ</span><span>.</span><span>wly5wyMyVaH9fUwIU921</span><span>;</span><span>alias</span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.0</span><span>:</span><span>5060</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>;</span><span>twnat</span><span>=</span><span>sip</span><span>:</span><span>69.171</span><span>.</span><span>251.112</span><span>:</span><span>62080</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>54.172</span><span>.</span><span>60.0</span><span>:</span><span>5061</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>;</span><span>r2</span><span>=</span><span>on</span><span>;</span><span>twnat</span><span>=</span><span>sip</span><span>:</span><span>69.171</span><span>.</span><span>251.112</span><span>:</span><span>62080</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Contact</span><span>:</span><span><</span><span>sip</span><span>:+</span><span>172.25</span><span>.</span><span>43.84</span><span>:</span><span>5060</span><span>></span><span>Allow</span><span>:</span><span> INVITE</span><span>,</span><span> ACK</span><span>,</span><span> CANCEL</span><span>,</span><span> OPTIONS</span><span>,</span><span> BYE</span><span>,</span><span> REFER</span><span>,</span><span> NOTIFY
</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
X</span><span>-</span><span>Twilio</span><span>-</span><span>CallSid</span><span>:</span><span>CAd4d6e59a356c4d1b0ee85323b2d9dab5</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>444</span><span>Content</span><span>-</span><span>Type</span><span>:</span><span> application</span><span>/</span><span>sdp
</span><span>Content</span><span>-</span><span>Length</span><span>:</span><span>444</span><span>

v</span><span>=</span><span>0</span><span>
o</span><span>=</span><span>root </span><span>477560318</span><span>477560318</span><span> IN IP4 </span><span>172.18</span><span>.</span><span>156.61</span><span>
s</span><span>=</span><span>Twilio</span><span>Media</span><span>Gateway</span><span>
c</span><span>=</span><span>IN IP4 </span><span>168.86</span><span>.</span><span>137.174</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
m</span><span>=</span><span>audio </span><span>12710</span><span> RTP</span><span>/</span><span>SAVP </span><span>111</span><span>126</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> maxplaybackrate</span><span>=</span><span>16000</span><span>;</span><span>sprop</span><span>-</span><span>maxcapturerate</span><span>=</span><span>16000</span><span>;</span><span>maxaveragebitrate</span><span>=</span><span>20000</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>126</span><span>0</span><span>-</span><span>16</span><span>
a</span><span>=</span><span>crypto</span><span>:**************************************************************************</span><span>
a</span><span>=</span><span>ptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>maxptime</span><span>:</span><span>20</span><span>
a</span><span>=</span><span>sendrecv</span>
```

</div><div id="bkmrk-configure-sdes-for-s"><div id="bkmrk-configure-sdes-for-s-1"><div>### Configure SDES for SRTP key exchange

</div></div></div><div>The Secure Real-time Transport Protocol (SRTP) key exchange is a cryptographic protocol used to securely exchange encryption keys between two parties over an insecure communication channel.</div><div>You can configure SRTP key exchange to one of two options:</div><span>DTLS (default) — Industry-standard encrypted key exchange. Recommended.</span><span>SDES — Plain text key is included in the SDP which is sent over secure signaling protocol like SIP or Graph API. When SDES is used, there is no need for STUN, ICE and DTLS which could help shorten the call setup time.</span><div id="bkmrk-error-response-6"><div id="bkmrk-error-response-7"><div>#### Error response

</div></div></div><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-get-srtp-key-exchang"><div id="bkmrk-get-srtp-key-exchang-1"><div>#### Get SRTP key exchange protocol

</div></div></div><div id="bkmrk-endpoint-parameters-9"><div id="bkmrk-endpoint-parameters-10"><div>##### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number for which you are updating Calling API settings.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+12784358810`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-response-parameters"><div id="bkmrk-response-parameters-1"><div>##### Response parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`srtp_key_exchange_protocol`</div><div>*String*</div></div></td><td><div><div>The type of SRTP key exchange protocol configured for the business phone number queried</div><div>Possible values are `SDES` and `DTLS`.</div><div>Default is `DTLS`.</div><div>**Note: If this field has not been explicitly set, it will not be returned.**</div></div></td><td><div><div>`“SDES”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-9"><div id="bkmrk-error-response-10"><div>##### Error response

</div></div></div><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-ip-addresses"><div id="bkmrk-ip-addresses-1"><div>### IP addresses

</div></div></div><div>The IP addresses used for SIP configuration are the same as those listed for the Webhooks in the [Cloud API Webhooks IP Addresses section](/books/meta-whatsapp/page/managing-webhooks-developer-documentation).</div><div>This reference is solely to indicate the IP addresses to allow-list for SIP traffic. When SIP is enabled, calling related webhooks are not sent.</div><div id="bkmrk-troubleshooting"><div id="bkmrk-troubleshooting-1"><div>### Troubleshooting

</div></div></div><div>Refer to [SIP FAQ](/books/meta-whatsapp/page/faqs-developer-documentation) for additional SIP specific questions and answers and [SIP Errors](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation) for SIP specific errors and solutions</div></div>

# Send WhatsApp Call Button Messages and Deep Links | Developer Documentation

<div id="bkmrk-send-whatsapp-call-b">## Send WhatsApp Call Button Messages and Deep Links

<div><span>Updated: Feb 25, 2026</span></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>After you adopt Cloud API Calling features, you can raise awareness with your customers in two core ways:</div>
<span>Send them a message with a WhatsApp call button</span><span>Embed a calling deep link into your brand surfaces (website, application, and so on)</span><div id="bkmrk-send-interactive-mes"><div id="bkmrk-send-interactive-mes-1"><div>### Send interactive message with a WhatsApp call button

</div></div></div><div>Use this endpoint to send a free-form interactive message with a WhatsApp call button during a [customer service window](/books/meta-whatsapp/page/sending-messages-developer-documentation) or an [open conversation window](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation).</div><div>When a WhatsApp user clicks the call button, it initiates a WhatsApp call to the business number that sent the message.</div><div>A standard [message status webhook](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation) will be sent in response to this message send.</div><div>![Screenshot showing WhatsApp call button message on mobile device](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-rt4bhfpb.jpeg)</div><div id="bkmrk-body-parameters"><div id="bkmrk-body-parameters-1"><div>##### Body parameters

</div></div></div><div>[Learn more about sending interactive free form messages](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`to`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The phone number of the WhatsApp user you are messaging.</div><div>[Learn more about formatting phone numbers in Cloud API](/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/whatsapp-business-account-phone-number-api)</div></div></td><td><div><div>`"17863476655"`</div></div></td></tr><tr><td><div><div>`type`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The type of interactive message you are sending.</div><div>In this case, you are sending a `voice_call`.</div><div>[Learn more about interactive messages](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div></div></td><td><div><div>`"voice_call"`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The action of your interactive message.</div><div>Must be `voice_call`.</div></div></td><td><div><div>`"voice_call"`</div></div></td></tr><tr><td><div><div>`parameters`</div><div>*JSON Object*</div></div></td><td><div><div>**Optional**</div><div>Optional parameters for the WhatsApp calling button sent to the user.</div><div>Contains three values: `display_text`, `ttl_minutes`, and `payload`</div><div>`display_text` — (*String*) **Optional**</div><div>The display text on the WhatsApp calling button sent to the user.</div><div>Default is “Call Now”</div><div>Max length: 20 characters</div><div>`ttl_minutes` — (*Integer*) **Optional**</div><div>Time to live for the call-to-action (CTA) button in minutes.</div><div>Must be between 1 and 43200 (30 days)</div><div>Default value is 10080 (7 days)</div><div>`payload` — (*String*) **Optional**</div><div>An arbitrary string, useful for tracking.</div><div>Any app subscribed to the `calls` webhook field on the WhatsApp Business Account can get this string, as it is included in the `connect` and `terminate` webhook payloads under the `cta_payload` field.</div><div>Cloud API does not process this field, it just returns it as part of the webhooks.</div><div>Maximum 512 characters.</div><div>Payload is only available to WhatsApp client starting on version 2.25.27.</div></div></td><td><div><div></div></div></td></tr></tbody></table>

</div><div id="bkmrk-success-response"><div id="bkmrk-success-response-1"><div>##### Success response

</div></div></div><div>[Learn more about messaging success responses](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><div>Sending this message to users on older app versions results in an error webhook with error code `131026`.</div><div>[View general Cloud API error codes](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-create-and-send-what"><div id="bkmrk-create-and-send-what-1"><div>### Create and send WhatsApp call button template message

</div></div></div><div>Use these endpoints to create and send a WhatsApp call button template message.</div><div>Once your call button template message is created, you can send a message to a WhatsApp user, inviting them to call your business.</div><div>[Learn more about creating and managing message templates](/books/meta-whatsapp/page/templates-developer-documentation)</div><div id="bkmrk-create-call-button-m"><div id="bkmrk-create-call-button-m-1"><div>#### Create call button message template

</div></div></div><div>Use this endpoint to create a call button message template.</div><div id="bkmrk-body-parameters-3"><div id="bkmrk-body-parameters-4"><div>##### Body parameters

</div></div></div><div>You can create and manage template messages through both Cloud API and the WhatsApp Business Manager interface.</div><div>When creating your call button template, ensure you configure `type` as `voice_call`.</div><div>[Learn more about creating and managing message templates](/books/meta-whatsapp/page/templates-developer-documentation)</div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`type`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The type of template message you are creating.</div><div>In this case, you are creating a `voice_call`.</div></div></td><td><div><div>`"voice_call"`</div></div></td></tr><tr><td><div><div>`text`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The display text on the WhatsApp calling button sent to the user.</div><div>Default is “Call Now”</div><div>Max length: 20 characters</div></div></td><td><div><div>`"Call Now"`</div></div></td></tr><tr><td><div><div>`ttl_minutes`</div><div>*Integer*</div></div></td><td><div><div>**Optional**</div><div>  
Time to live for the CTA button in minutes.</div><div>Must be between 1440 (1 day) and 43200 (30 days).</div><div>You can override this value when sending the message.</div></div></td><td><div><div>`1440`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-success-response-3"><div id="bkmrk-success-response-4"><div>##### Success response

</div></div></div><div></div><div>[*Learn more about messaging success responses*](/books/meta-whatsapp/page/sending-messages-developer-documentation)</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div>
<span>Invalid `whatsapp-business-account-id`</span><span>Permissions/Authorization errors</span><span>Template structure/component validation alerts</span><div>[View general Cloud API error codes](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-calling-deep-links"><div id="bkmrk-calling-deep-links-1"><div>### Calling deep links

</div></div></div><div>Calling deep links are hyperlinks that route WhatsApp users to call your business.</div><div>The process to create a calling deep link is similar to a [chat deep link<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F5913398998672934%2F%3Flocale%3Den_US&h=AT55bCfphq4HFZzZyyeAV8v8FEB_7Aky-XZSSALR56S6zcPUYSREt-BiusaRcW-Eg5-m7AljaLV7O5b5H85UEUR7_qY2-HIN1B2EepBQvxo_RxS3fgTxwWDNzOAs7sJX-JGBLnpu8YgUyGrMRVnG4Q), except the format for the call deep link is `wa.me/call/<BUSINESS_PHONE_NUMBER>`</div><div>Note that deep links are not supported on WhatsApp desktop clients.</div><div id="bkmrk-embed-calling-deep-l"><div id="bkmrk-embed-calling-deep-l-1"><div>#### Embed calling deep links

</div></div></div><div>You can use calling deep links to advertise WhatsApp calling for your business.</div><div>Use these links anywhere where calling can be useful, like your website, primary application, or even as a QR code to be shared.</div><div>![Example of calling deep link embedded on a business website](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-9ridndqq.jpeg)</div><div id="bkmrk-send-calling-deep-li"><div id="bkmrk-send-calling-deep-li-1"><div>#### Send calling deep links

</div></div></div><div>You can also send messages to WhatsApp users with a calling deep link.</div><div>Since deep links can be made per business phone number, you can use calling deep links to prompt WhatsApp users to contact a different phone number with voice enabled.</div><div>The `wa.me/call/<BUSINESS_PHONE_NUMBER>` format is easy to copy, paste, and send, and does not require you to make a template in Business Manager.</div><div>![Screenshot showing WhatsApp message with calling deep link](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-wfxv6tzn.jpeg)</div><div id="bkmrk-send-payload-data-in"><div id="bkmrk-send-payload-data-in-1"><div>#### Send payload data in call deep link

</div></div></div><div>You can also send a payload with the deep link. You can use the `biz_payload` query string when sending the call deep link to any user (`wa.me/call/<BUSINESS_PHONE_NUMBER>?biz_payload=payload`).</div><div>When a user calls using the provided deep link with the `biz_payload` any app subscribed to the `calls` webhook field on the WhatsApp Business Account can get this string, as it is included in the `connect` and `terminate` webhook payloads under the `deeplink_payload` field.</div><div>Payload in call deep link is only available to WhatsApp client starting on version 2.25.27.</div></div>

# Integration Patterns | Developer Documentation

<div id="bkmrk-integration-patterns">## Integration Patterns

<div><span>Updated: Feb 25, 2026</span></div><div id="bkmrk-possible-high-level-"><div id="bkmrk-possible-high-level--1"><div>### Possible high-level approaches

</div></div></div><div><table><thead><tr><th><span>Approach </span></th><th><span>Number setup </span></th><th><span>Business Solution Provider responsibilities </span></th><th><span>Calling Tech Provider responsibilities </span></th><th><span>End business responsibilities </span></th></tr></thead><tbody><tr><td><div><div>**Message BSP capable of Calling**</div></div></td><td><div><div>Existing messaging number extended for calling or new number</div></div></td><td><div><span>Messaging BSP reuses their app and subscribes it to calls webhooks. Creation of new calling specific app also works but [not recommended](/books/meta-whatsapp/page/integration-patterns-developer-documentation)</span><span>Process calls webhooks and coordinate with real-time media infra</span><span>Make calls related Graph API calls similar to messaging Graph API calls</span></div></td><td><div><div>Not applicable because there is only a single partner involved.</div></div></td><td><div><span>Enable and use calling</span><span>Continue paying the bill from BSP which now has calls related usage line items</span></div></td></tr><tr><td><div><div>[**Multi-solution Conversation**](/books/meta-whatsapp/page/how-to-use-multi-solution-conversations-msc-developer-documentation)</div></div></td><td><div><div>Single number independently operated by both messaging BSP and Calling BSP/TP</div></div></td><td><div><span>Messaging BSP does no changes</span></div></td><td><div><span>Calling BSP/TP hosts ES on their own website pointing to their own app</span><span>Gets end-biz to go through their ES</span></div></td><td><div><span>Onboard using calling partner’s ES</span><span>Pay the bills to Messaging BSP like before</span><span>For Calling partner incurred activity, pay the bill to calling partner if they are a BSP or to Meta if they are not a BSP</span></div></td></tr><tr><td><div><div>Exclusive Calling ISV</div></div></td><td><div><div>New number for calling</div></div></td><td><div><div>Not applicable because there is no messaging BSP</div></div></td><td><div><span>Calling ISV hosts Embedded Signup (ES) on their website pointing to their own app</span><span>Gets end-biz to go through their ES</span><span>If ISV is a tech provider or partner, Meta bills end-biz directly. ISV and end-biz figure out their own billing</span><span>If ISV is a BSP, they can extend their credit line to end-biz</span></div></td><td><div><span>Onboard using ES on TP</span><span>If ISV is Tech Provider or Partner, pay Meta directly </span><span>This requires end-biz to have a direct payment relation with Meta. Setting up this relation may take several weeks</span><span>If ISV is BSP, pay the bill from BSP</span></div></td></tr><tr><td><div><div>[Multi-platform solution](/books/meta-whatsapp/page/multi-partner-solutions-developer-documentation) using Calling ISV registered as Tech Provider (TP)</div></div></td><td><div><div>New calling exclusive number serviced (**only**) by Calling TP</div></div></td><td><div><span>BSP and TP work together to create / approve a multi-partner solution. BSP and TP have their own apps</span><span>Work out Messaging BSP &lt;&gt; Calling ISV commercial relation</span><span>Extend credit line to end business</span><span>Can receive messages or calls but cannot send messages or calls because you can select only one of the two partners to send messages/calls in a multi-platform solution</span></div></td><td><div><span>BSP and TP work together to create / approve a multi-partner solution. BSP and TP have their own apps</span><span>Work out Messaging BSP &lt;&gt; Calling ISV commercial relation</span><span>Onboard end clients using ES pointing to created solution</span><span>Send/receive messages or calls</span></div></td><td><div><span>Onboard using ES on TP</span><span>Biz is informed about TP in ES</span><span>Pay the bill from BSP</span></div></td></tr></tbody></table>

</div><div id="bkmrk-multi-solution-conve"><div id="bkmrk-multi-solution-conve-1"><div>### Multi-solution conversations (MSC)

</div></div></div><div>Multi-solution Conversations allow multiple solutions on the same phone number, localizing messaging and calling in a single chat thread.</div><div>[Learn more about Multi-Solution Conversations](/books/meta-whatsapp/page/how-to-use-multi-solution-conversations-msc-developer-documentation)</div><div id="bkmrk-integrating-using-a-"><div id="bkmrk-integrating-using-a--1"><div>### Integrating using a third party calling provider detailed design

</div></div></div><div>The following logical architecture illustrates how to integrate WhatsApp Business Calling using a third party (3p) calling provider.</div><div>In this scenario, you would use the 3p vendor behind the scenes, and that 3p vendor would not be visible to Meta. This pattern is similar to any other SaaS service you may be using.</div><div>The diagram also illustrates how this architecture can be optionally extended to integrate with the SIP infrastructure on your side.</div><div><div>**Our terms disallow use of PSTN on *any* leg of the WhatsApp call in the overall call flow.**</div><div>Even if you bridge WA call into the SIP world, you must ensure it still stays exclusively on VoIP and never touches the PSTN. SIP trunk by itself is not disallowed because technically a SIP trunk can be used without any PSTN at all.</div></div><div>![Architecture diagram showing WhatsApp Business Calling integration with third-party provider](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-qwmafpji.jpeg) (*Right click image and choose “Open in new tab” for enlarged image*)</div><div id="bkmrk-single-app-vs.-multi"><div id="bkmrk-single-app-vs.-multi-1"><div>### Single app vs. multiple apps

</div></div></div><div>This section covers guidelines and considerations for reusing your existing messaging app for calling vs. creating a new app specifically for Calling API features.</div><div>To integrate with the WhatsApp Calling API, you need to call [Graph API endpoints](/books/meta-whatsapp/page/about-the-whatsapp-business-platform-developer-documentation) and process Webhooks from Meta. This [requires you to have an app](https://developers.facebook.com/docs/development/create-an-app), and almost always, you should already have an app that is used for messaging.</div><div>In short, you can reuse an existing app which is used for [Embedded Signup](/books/meta-whatsapp/page/embedded-signup-developer-documentation) and for a messaging use case.</div><div>Reusing the same app offers the following benefits:</div><span>Reduced operational overhead (for example, app review, ongoing maintenance)</span><span>Simplified footprint on Meta</span><span>Equality between the app used for embedded signup and the one used for invoking Graph APIs and receiving webhooks</span><span>There would be no impact to existing functionality by reusing that app for calling. You just need to make sure the Webhook server is able to gracefully handle ‘calls’ related webhooks.</span><div>Having separate apps is still supported, see the [Get Started FAQ](/books/meta-whatsapp/page/faqs-developer-documentation) for details.</div><div id="bkmrk-guidelines-for-media"><div id="bkmrk-guidelines-for-media-1"><div>### Guidelines for Media path integration

</div></div></div><div>The WhatsApp Business Calling VoIP stack is designed to be compatible with WebRTC. However, to ensure smooth integration with the WhatsApp protocol, Meta restricts the supported functionalities. As a result, the following requirements and recommendations apply.</div><div id="bkmrk-mandatory-requiremen"><div id="bkmrk-mandatory-requiremen-1"><div>#### Mandatory requirements

</div></div></div><div>If any mandatory requirement is unmet, the call will fail. This failure can occur either during the call signaling phase, leading to a rejected call, or during the media packet decoding phase.</div><span>Use only the Opus audio codec.</span><span>Set the media clock rate to 48 kHz.</span><span>Set the DTMF clock rate to 8 kHz.</span><span>Use a ptime of 20ms.</span><span>Audio must use a single SSRC. The Meta relay server overwrites the SSRC of all business audio packets to a fixed SSRC before these packets reach the WA client. WA clients handle only one audio source from their peers. Using multiple SSRCs causes undefined behavior. This includes severe media corruption, audio glitches, and likely total media failure.</span><div id="bkmrk-recommendations"><div id="bkmrk-recommendations-1"><div>#### Recommendations

</div></div></div><div>While the following aspects are not mandatory, they are recommended to achieve high call quality and reliability.</div><span>**ICE Process**</span><span>Our VoIP stack is ICE-LITE, so it is recommended that BSPs’ VoIP stack is ICE-FULL. ([RFC 5245 Section 2.7<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc5245%23section-2.7&h=AT55JFlfZ0WttiPyV8ANcbMYKU5Oq_gCFYADeeo43EFABebRR_DCrTJtj0zJG0HtSv2tQombfFYYGpIGZp-vuXLGlT8p5VVhvBBUwlhM4LDH0yDBI6ofzgfVEFmaFJ_gow4XrChErfIz9UJ_pSfPHA))</span><span>BSPs’ VoIP stack should initiate the ICE process by sending STUN connectivity checks.</span><span>BSPs’ VoIP stack should assume the ICE CONTROLLING role, as Meta will only assume the CONTROLLED role.</span><span>Use regular nomination instead of aggressive nomination. ([RFC 5245 Section 8.1.1.2<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc5245%23section-8.1.1.2&h=AT55JFlfZ0WttiPyV8ANcbMYKU5Oq_gCFYADeeo43EFABebRR_DCrTJtj0zJG0HtSv2tQombfFYYGpIGZp-vuXLGlT8p5VVhvBBUwlhM4LDH0yDBI6ofzgfVEFmaFJ_gow4XrChErfIz9UJ_pSfPHA))</span><span>Wait for the ICE process to complete before nominating the candidate and starting DTLS.</span><span>Do not switch the candidate in the middle of the call.</span><span>**DTLS**</span><span>Use ECDH keys for the DTLS certificates to prevent packet fragmentation during transmission.</span><span>BSP should act as a DTLS client. ([RFC 6347 Section 4.2<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc6347%23section-4.2&h=AT55JFlfZ0WttiPyV8ANcbMYKU5Oq_gCFYADeeo43EFABebRR_DCrTJtj0zJG0HtSv2tQombfFYYGpIGZp-vuXLGlT8p5VVhvBBUwlhM4LDH0yDBI6ofzgfVEFmaFJ_gow4XrChErfIz9UJ_pSfPHA))</span><span>**Addressing Audio Clipping**</span><span>Delay the audio from the SIP leg until the media connection with Meta is established.</span><span>Integrate with the [pre-accept API](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation) to help mitigate audio clipping in user-initiated calls.</span></div>

# Integration Examples | Developer Documentation

<div id="bkmrk-integration-examples">## Integration Examples

<div><span>Updated: Feb 25, 2026</span></div><div>This guide explains integration of common VoIP platforms with WhatsApp Business Calling API.</div><div><span></span><div>This guide is for information purposes only with no support or warranties of any kind from Meta or any vendor. There are many ways to integrate and the guide explains just one way exclusively for illustrative purposes.</div></div><div id="bkmrk-asterisk-using-sip"><div id="bkmrk-asterisk-using-sip-1"><div>### Asterisk using SIP

</div></div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>#### Overview

</div></div></div><div>This guide explains how to set up [WhatsApp Business Calling API](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) using SIP signaling with [Asterisk<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.asterisk.org%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), an open-source PBX (Private Branch Exchange). You’ll learn how to configure your Asterisk server, connect SIP phones, and handle both incoming and outgoing WhatsApp calls.</div><div id="bkmrk-user-initiated-calls"><div id="bkmrk-user-initiated-calls-1"><div>##### User-initiated calls

</div></div></div>
<span>The WhatsApp user dials the business number.</span><span>The call is received by Asterisk and routed through an IVR, prompting the user to enter an extension, registered to the same Asterisk server.</span><span>The call is then connected to the specified extension.</span><div id="bkmrk-business-initiated-c"><div id="bkmrk-business-initiated-c-1"><div>##### Business-initiated calls

</div></div></div>
<span>The business agent/user registers with Asterisk using SIP credentials (see “[Configuring a VoIP Phone](#bkmrk-configuring-a-voip-p-1)” section).</span><span>The business user dials the b2c-sip (business to consumer) extension, which is handled by an IVR. The IVR prompts for the WhatsApp number to call.</span><span>The call is then connected to the WhatsApp user.</span><div>The WA to Asterisk leg uses SDES for media encryption key exchange and opus for audio codec</div><div>The Asterisk to SIP UA leg uses SDES for media encryption key exchange and opus or G711 for audio codec</div><div id="bkmrk-prerequisites"><div id="bkmrk-prerequisites-1"><div>#### Prerequisites

</div></div></div>
<span>Asterisk Deployment: Asterisk is deployed (for example, on a public cloud instance)</span><span>Operating System: Any OS compatible for Asterisk. For example, CentOS 9</span><span>Domain: Asterisk server is reachable via a public domain with valid certificate</span><span>WhatsApp Business API: A WhatsApp business phone number is registered and calling is enabled.</span><span>SIP Support: [SIP is enabled](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on the WhatsApp Business Number</span><span>SDES: [SDES is enabled](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on the WhatsApp Business Number</span><div id="bkmrk-building-and-install"><div id="bkmrk-building-and-install-1"><div>#### Building and installing Asterisk

</div></div></div><div>Refer to [https://docs.asterisk.org/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk/<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdocs.asterisk.org%2FGetting-Started%2FInstalling-Asterisk%2FInstalling-Asterisk-From-Source%2FBuilding-and-Installing-Asterisk%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g)</div><div>This guide was tested using Asterisk version 22.5.2</div><div id="bkmrk-asterisk-configurati"><div id="bkmrk-asterisk-configurati-1"><div>#### Asterisk configuration

</div></div></div><div>These configuration files are placed under /etc/asterisk/</div><div id="bkmrk-extensions.conf"><div id="bkmrk-extensions.conf-1"><div>##### extensions.conf

</div></div></div><div>Replace the following placeholders with actual values</div>
<span>{wa-business-phone-number}: WhatsApp Business Phone Number</span><span>{asterisk-sip-server-dns}: DNS name of your Asterisk SIP server</span><span>incoming\_welcome: incoming\_welcome.wav (not provided) place this file under /var/lib/asterisk/sounds</span><span>outgoing\_welcome: outgoing\_welcome.wav (not provided) place this file under /var/lib/asterisk/sounds</span><div>```
<span>[</span><span>c2b</span><span>-</span><span>sub</span><span>-</span><span>dial</span><span>]</span><span>
exten </span><span>=></span><span> s</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Read</span><span>(</span><span>Digits</span><span>,</span><span>incoming_welcome</span><span>,</span><span>0</span><span>,,</span><span>5</span><span>,</span><span>500</span><span>)</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>$</span><span>{</span><span>Digits</span><span>})</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Hangup</span><span>()</span><span>[</span><span>whatsapp</span><span>]</span><span>
exten </span><span>=></span><span> _10XX</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>$</span><span>{</span><span>EXTEN</span><span>})</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Hangup</span><span>()</span><span>;</span><span>Extension</span><span>for</span><span> B2C business call through </span><span>Meta</span><span> SIP gateway
exten </span><span>=></span><span> b2c</span><span>-</span><span>sip</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Read</span><span>(</span><span>Digits</span><span>,</span><span>outgoing_welcome</span><span>,</span><span>0</span><span>,,</span><span>5</span><span>,</span><span>500</span><span>)</span><span>
  same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>whatsapp</span><span>/</span><span>sip</span><span>:</span><span>$</span><span>{</span><span>Digits</span><span>}</span><span>@wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>)</span><span>;</span><span>Extension</span><span> to handle incoming invite requests </span><span>from</span><span>Meta</span><span> SIP gateway to </span><span><</span><span>wa</span><span>-</span><span>business</span><span>-</span><span>phone</span><span>-</span><span>number</span><span>>@<</span><span>asterisk</span><span>-</span><span>sip</span><span>-</span><span>server</span><span>-</span><span>dns</span><span>></span><span>
exten </span><span>=></span><span> _</span><span>+<</span><span>wa</span><span>-</span><span>business</span><span>-</span><span>phone</span><span>-</span><span>number</span><span>>,</span><span>1</span><span>,</span><span>Goto</span><span>(</span><span>c2b</span><span>-</span><span>sub</span><span>-</span><span>dial</span><span>,</span><span>s</span><span>,</span><span>1</span><span>)</span>
```

</div><div id="bkmrk-pjsip.conf"><div id="bkmrk-pjsip.conf-1"><div>##### Pjsip.conf

</div></div></div><div>Replace the following placeholders with actual values</div>
<span>{wa-business-phone-number} : the business phone number</span><span>{local-net}: local network of the Asterisk server</span><span>{external-media-address}: Public IP of the Asterisk server media</span><span>{external-signaling-address}: Public IP of the Asterisk server signaling</span><span>{sip-ua-password}: Chosen SIP User Agent password</span><span>{domain-name}: domain name assigned to the Asterisk server</span><div>Certificate files should be placed under /var/lib/asterisk/certs/fullchain.cer /var/lib/asterisk/certs/cer.key</div><div>```
<span>[</span><span>transport</span><span>-</span><span>tls</span><span>]</span><span>
type</span><span>=</span><span>transport
protocol</span><span>=</span><span>tls
bind</span><span>=</span><span>0.0</span><span>.</span><span>0.0</span><span>:</span><span>5061</span><span>
cert_file</span><span>=</span><span>/var/</span><span>lib</span><span>/</span><span>asterisk</span><span>/</span><span>certs</span><span>/</span><span>fullchain</span><span>.</span><span>cer
priv_key_file</span><span>=</span><span>/var/</span><span>lib</span><span>/</span><span>asterisk</span><span>/</span><span>certs</span><span>/</span><span>cer</span><span>.</span><span>key
method</span><span>=</span><span>sslv23
allow_wildcard_certs</span><span>=</span><span>yes
external_media_address</span><span>={</span><span>external</span><span>-</span><span>media</span><span>-</span><span>address</span><span>}</span><span>;</span><span>External</span><span> address </span><span>for</span><span> SIP signalling
external_signaling_address</span><span>={</span><span>external</span><span>-</span><span>signaling</span><span>-</span><span>address</span><span>}</span><span>;</span><span>Network</span><span> to consider </span><span>local</span><span> used </span><span>for</span><span> NAT purposes
local_net</span><span>={</span><span>local</span><span>-</span><span>net</span><span>}</span><span>[</span><span>sdes_endpointtemplate</span><span>](!)</span><span>
type</span><span>=</span><span>endpoint
context</span><span>=</span><span>whatsapp
disallow</span><span>=</span><span>all
allow</span><span>=</span><span>OPUS
direct_media</span><span>=</span><span>no</span><span>
rtp_symmetric</span><span>=</span><span>yes
force_rport</span><span>=</span><span>yes
rewrite_contact</span><span>=</span><span>no</span><span>
media_use_received_transport</span><span>=</span><span>yes
media_encryption</span><span>=</span><span>sdes

</span><span>[</span><span>authtemplate</span><span>](!)</span><span>
type</span><span>=</span><span>auth
auth_type</span><span>=</span><span>userpass
password</span><span>={</span><span>sip</span><span>-</span><span>ua</span><span>-</span><span>password</span><span>}</span><span>[</span><span>aortemplate</span><span>](!)</span><span>
type</span><span>=</span><span>aor
max_contacts</span><span>=</span><span>1</span><span>
remove_existing</span><span>=</span><span>yes

</span><span>[</span><span>aoridentitytemplate</span><span>](!)</span><span>
type</span><span>=</span><span>identify
match_header</span><span>=</span><span>X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc

</span><span>;</span><span>SDES users
</span><span>[</span><span>1000</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1000</span><span>_auth
aors</span><span>=</span><span>1000</span><span>[</span><span>1000</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1000</span><span>[</span><span>1000</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1000</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1000</span><span>[</span><span>1001</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1001</span><span>_auth
aors</span><span>=</span><span>1001</span><span>[</span><span>1001</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1001</span><span>[</span><span>1001</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1001</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1001</span><span>[</span><span>1002</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1002</span><span>_auth
aors</span><span>=</span><span>1002</span><span>[</span><span>1002</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1002</span><span>[</span><span>1002</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1002</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1002</span><span>[</span><span>1003</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1003</span><span>_auth
aors</span><span>=</span><span>1003</span><span>[</span><span>1003</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1003</span><span>[</span><span>1003</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1003</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1003</span><span>[</span><span>1004</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1004</span><span>_auth
aors</span><span>=</span><span>1004</span><span>[</span><span>1004</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1004</span><span>[</span><span>1004</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1004</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1004</span><span>[</span><span>1005</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1005</span><span>_auth
aors</span><span>=</span><span>1005</span><span>[</span><span>1005</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1005</span><span>[</span><span>1005</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1005</span><span>](</span><span>aoridentitytemplate</span><span>)</span><span>
endpoint</span><span>=</span><span>1005</span><span>;</span><span>This</span><span> endpoint maps to an IVR </span><span>for</span><span> C2B calls
</span><span>[</span><span>c2b</span><span>-</span><span>sip</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>[</span><span>c2b</span><span>-</span><span>sip</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>c2b</span><span>-</span><span>sip</span><span>]</span><span>
type</span><span>=</span><span>identify
endpoint</span><span>=</span><span>c2b</span><span>-</span><span>sip
match_header</span><span>=</span><span>X</span><span>-</span><span>FB</span><span>-</span><span>External</span><span>-</span><span>Domain</span><span>:</span><span> wa</span><span>.</span><span>meta</span><span>.</span><span>vc

</span><span>;</span><span>special endpoint </span><span>for</span><span>Meta</span><span> SIP </span><span>Gateway</span><span> integration
</span><span>;</span><span>This</span><span> endpoint maps to an IVR </span><span>for</span><span> B2C calls
</span><span>[</span><span>b2c</span><span>-</span><span>sip</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>[</span><span>b2c</span><span>-</span><span>sip</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>whatsapp</span><span>](</span><span>sdes_endpointtemplate</span><span>)</span><span>
type</span><span>=</span><span>endpoint
transport</span><span>=</span><span>transport</span><span>-</span><span>tls
disallow</span><span>=</span><span>all
allow</span><span>=</span><span>opus</span><span>,</span><span>ulaw</span><span>,</span><span>alaw
aors</span><span>=</span><span>whatsapp
from_user</span><span>={</span><span>wa</span><span>-</span><span>business</span><span>-</span><span>phone</span><span>-</span><span>number</span><span>}</span><span>
from_domain</span><span>={</span><span>domain</span><span>-</span><span>name</span><span>}</span><span>
outbound_auth</span><span>=</span><span>whatsapp

</span><span>[</span><span>whatsapp</span><span>]</span><span>
type</span><span>=</span><span>aor
contact</span><span>=</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc

</span><span>[</span><span>whatsapp</span><span>]</span><span>
type</span><span>=</span><span>identify
endpoint</span><span>=</span><span>whatsapp

</span><span>[</span><span>whatsapp</span><span>]</span><span>
type</span><span>=</span><span>auth
auth_type</span><span>=</span><span>digest
password</span><span>={</span><span>meta</span><span>-</span><span>sip</span><span>-</span><span>user</span><span>-</span><span>password</span><span>}</span><span>
username</span><span>={</span><span>wa</span><span>-</span><span>business</span><span>-</span><span>phone</span><span>-</span><span>number</span><span>}</span><span>
realm</span><span>=*</span>
```

</div><div id="bkmrk-rtp.conf"><div id="bkmrk-rtp.conf-1"><div>##### rtp.conf

</div></div></div><div>```
<span>[</span><span>general</span><span>]</span><span>;</span><span>Hostname</span><span>or</span><span> address </span><span>for</span><span> the STUN server used </span><span>for</span><span> determining the external
</span><span>;</span><span> IP address </span><span>and</span><span> port an RTP session can be reached at</span><span>.</span><span>The</span><span> port number </span><span>is</span><span>;</span><span> optional</span><span>.</span><span>If</span><span> omitted </span><span>default</span><span> value of </span><span>3478</span><span> will be used</span><span>.</span><span>This</span><span> option </span><span>is</span><span>;</span><span> disabled </span><span>by</span><span>default</span><span>.</span><span>Name</span><span> resolution occurs at load time</span><span>,</span><span>and</span><span>if</span><span> DNS </span><span>is</span><span>;</span><span> used</span><span>,</span><span> name resolution will occur repeatedly after the TTL expires</span><span>.</span><span>;</span><span>;</span><span>for</span><span> example stundaddr</span><span>=</span><span>mystun</span><span>.</span><span>server</span><span>.</span><span>com</span><span>:</span><span>3478</span><span>;</span><span>
stunaddr</span><span>=</span><span>stun</span><span>.</span><span>l</span><span>.</span><span>google</span><span>.</span><span>com</span><span>:</span><span>19302</span><span>

rtpstart</span><span>=</span><span>10000</span><span>
rtpend</span><span>=</span><span>60000</span>
```

</div><div id="bkmrk-configuring-a-voip-p"><div id="bkmrk-configuring-a-voip-p-1"><div>#### Configuring a VoIP phone

</div></div></div><div>Download and install a softphone client (for example, [Linphone<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.linphone.org%2Fen%2Fdownload&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g)) for testing both business-initiated and user-initiated calls.</div><div id="bkmrk-account-setup"><div id="bkmrk-account-setup-1"><div>##### Account setup

</div></div></div>
<span>Select an extension to register as a SIP UA (extensions 1001–1005).</span><span>Open Preferences.</span><span>Under “SIP Accounts,” click “Add account.”</span><span>Enter the following details: </span>
<span>SIP Address: for example, sip:1001@{asterisk-sip-server-dns}</span><span>SIP Server Address: for example, sip:{asterisk-sip-server-dns};transport=tls</span><span>Transport: TLS</span><span>Disable ICE</span><span>Enable AVPF</span><span>Disable “Publish presence information”</span><span>Confirm and save the account.</span><span>Enter the password when prompted (viz. {sip-ua-password})</span><span>Once connected, return to Preferences and select the “Audio” tab. Enable all audio codecs.</span><span>In the “Calls and Chat” tab: </span>
<span>Select “Encryption”</span><span>Choose “SRTP-SDES”</span><span>Enable “Encryption is mandatory”</span><span>Confirm settings</span><div id="bkmrk-final-checklist"><div id="bkmrk-final-checklist-1"><div>#### Final checklist

</div></div></div>
<span>Double-check all configuration files for correct numbers, passwords, and domain names.</span><span>Make sure your firewall allows SIP (5061/TLS) and RTP (10000-20000) ports.</span><span>For more details on SIP password setup, see the [WhatsApp Cloud API documentation](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</span><div id="bkmrk-troubleshooting"><div id="bkmrk-troubleshooting-1"><div>#### Troubleshooting

</div></div></div><div id="bkmrk-cannot-register-sip-"><div id="bkmrk-cannot-register-sip--1"><div>##### Cannot register SIP UA

</div></div></div><div>Confirm that the SIP URL is correct and the domain is pointing to the Asterisk server. Run host {domain-name} to verify that the IP address points to the Asterisk server.</div><div id="bkmrk-not-receiving-ack-fr"><div id="bkmrk-not-receiving-ack-fr-1"><div>##### Not receiving ACK from Meta OR Business audio stops around 30s OR Meta returns 404 response to BYE

</div></div></div><div>For a user initiated call, Meta sends a `SIP INVITE` to your SIP server which then responds with `200 OK`. Meta acks your `200 OK` with an `ACK` but you never receive this ACK. So your SIP server keeps resending the `200 OK` and ultimately the SIP dialog is terminated due to ACK timeout (typically 32s).</div><div>The most likely cause for this problem is incorrect `Record-Route` headers in your `200 OK` to Meta. The `200 OK` response is supposed to not modify the `Record-Route` headers included in the original Meta’s `INVITE`. Your SIP server can add new `Record-Route` headers but cannot modify those present in our `INVITE`</div><div>The solution to this problem is to change `rewrite_contact=yes` to `rewrite_contact=no` on the WhatsApp endpoint configuration in pjsip.conf file. After this make sure your `200 OK` has following headers as the last 2 in the list of `Record-Route` headers</div><div>This problem is hard to detect or diagnose. Even with this bug, the call will get connected and media will flow both sides but around 32s later, your SIP server will terminate the call which won’t be propagated to WhatsApp client because your BYE request has incorrect `Route` headers. So WA user stops hearing business audio around 32s.</div><div>```
<span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>wa</span><span>.</span><span>meta</span><span>.</span><span>vc</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span><span>Record</span><span>-</span><span>Route</span><span>:</span><span><</span><span>sip</span><span>:</span><span>onevc</span><span>-</span><span>sip</span><span>-</span><span>proxy</span><span>.</span><span>fbinfra</span><span>.</span><span>net</span><span>:</span><span>8191</span><span>;</span><span>transport</span><span>=</span><span>tls</span><span>;</span><span>lr</span><span>></span>
```

</div><div id="bkmrk-freeswitch-using-sip"><div id="bkmrk-freeswitch-using-sip-1"><div>### FreeSWITCH using SIP

</div></div></div><div id="bkmrk-overview-3"><div id="bkmrk-overview-4"><div>#### Overview

</div></div></div><div>This guide explains how to set up [WhatsApp Business Calling API](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) using SIP signaling with [FreeSWITCH<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fsignalwire.com%2Ffreeswitch&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), an open-source communication framework. You’ll learn how to configure your FreeSWITCH server, connect SIP phones, and handle both user-initiated and business-initiated WhatsApp calls.</div><div id="bkmrk-user-initiated-calls-3"><div id="bkmrk-user-initiated-calls-4"><div>##### User-initiated calls

</div></div></div>
<span>The WhatsApp user dials the business number.</span><span>The call is received by FreeSWITCH and routed through an IVR, which prompts the user to enter an agent’s extension registered on the same FreeSWITCH server.</span><span>Once the extension is entered, the call is connected to the specified recipient agent.</span><div id="bkmrk-business-initiated-c-3"><div id="bkmrk-business-initiated-c-4"><div>##### Business-initiated calls

</div></div></div>
<span>The business agent or user registers with FreeSWITCH using SIP credentials (see the [Configuring a VoIP Phone](/books/meta-whatsapp/page/integration-examples-developer-documentation) section for details).</span><span>The business user dials the b2c-sip (business-to-consumer) extension, which is managed by an IVR. The IVR then prompts for the WhatsApp number to call.</span><span>After the number is entered, the call is connected to the WhatsApp user via SIP.</span><div>The WA to FreeSWITCH leg uses SDES for media encryption key exchange with Opus as the audio codec. FreeSWITCH - SIP UA leg uses SDES for media encryption key exchange with Opus or G.711 audio codecs</div><div id="bkmrk-prerequisites-3"><div id="bkmrk-prerequisites-4"><div>#### Prerequisites

</div></div></div>
<span>FreeSWITCH Deployment: FreeSWITCH is deployed (for example, on a public cloud instance)</span><span>Operating System: Any OS compatible with FreeSWITCH. For example, CentOS 9</span><span>Domain: FreeSWITCH server is reachable via a public domain with a valid certificate</span><span>WhatsApp Business API: A WhatsApp business phone number is registered and [calling is enabled](https://support2.chatarchitect.com/books/meta-whatsapp/page/configure-call-settings-%7C-developer-documentation).</span><span>SIP Support: [SIP is enabled](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on the WhatsApp Business Number </span>
<span>Note: FreeSWITCH is configured to listen on 5081 for TLS</span><span>SDES: [SDES is enabled](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on the WhatsApp Business Number</span><div id="bkmrk-building-and-install-3"><div id="bkmrk-building-and-install-4"><div>#### Building and installing FreeSWITCH

</div></div></div><div>Refer to [https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdeveloper.signalwire.com%2Ffreeswitch%2FFreeSWITCH-Explained%2FInstallation%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g)</div><div>This guide was tested using FreeSWITCH version 1.10.12. FreeSWITCH uses sofia (an open-source SIP user agent library). Sofia v1.13.17 was used for this guide</div><div id="bkmrk-freeswitch-configura"><div id="bkmrk-freeswitch-configura-1"><div>##### FreeSWITCH configuration

</div></div></div><div>These configuration files are placed under /usr/share/freeswitch/etc/freeswitch</div><div>**wa-biz-api-dialplan.xml**</div><div>Place the dial plan under /usr/share/freeswitch/etc/freeswitch/dialplan/default/wa-biz-api-dialplan.xml</div><div>```
<span><include></span><span><extension</span><span>name</span><span>=</span><span>"c2b_calls_sip_ivr"</span><span>></span><span><!--Dial plan is selected if the SIP request is coming from Meta--></span><span><condition</span><span>field</span><span>=</span><span>"${sip_from_host}"</span><span>expression</span><span>=</span><span>"^wa.meta.vc$"</span><span>></span><span><!--Verify the IP from where the request is coming, compare the IP with the Meta allowlisted IPs--></span><span><action</span><span>application</span><span>=</span><span>"check_acl"</span><span>data</span><span>=</span><span>"${network_addr} whatsapp_allow normal_clearing"</span><span>/></span><span><!--Enable encrypted media using SDES--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"rtp_secure_media=true"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"answer"</span><span>/></span><span><!--Add silence stream for  1 sec so that the media path is established between whatsapp and freeswitch to avoid audio clipping--></span><span><action</span><span>application</span><span>=</span><span>"playback"</span><span>data</span><span>=</span><span>"silence_stream://1000"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"play_and_get_digits"</span><span>data</span><span>=</span><span>"2 5 3 7000 # $${base_dir}/sounds/incoming_welcome.wav  $${base_dir}/sounds/incoming_invalid.wav extension \d+"</span><span>/></span><span><!--While the call is being bridged, play a ringtone for the caller--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"ringback=%(2000, 4000, 440.0, 480.0)"</span><span>/></span><span><!--Offer G711 and Opus for FreeSWITCH-SIP UA leg --></span><span><action</span><span>application</span><span>=</span><span>"export"</span><span>data</span><span>=</span><span>"nolocal:absolute_codec_string=PCMA,PCMU,OPUS@48000h@20i"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"bridge"</span><span>data</span><span>=</span><span>"user/${extension}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"hangup"</span><span>/></span><span></condition></span><span></extension></span><span><extension</span><span>name</span><span>=</span><span>"b2c_calls_ivr"</span><span>></span><span><condition</span><span>field</span><span>=</span><span>"destination_number"</span><span>expression</span><span>=</span><span>"^b2c-sip$"</span><span>></span><span><!--Enable encrypted media using SDES--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"rtp_secure_media=true"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"answer"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"playback"</span><span>data</span><span>=</span><span>"silence_stream://1000"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"caller_id_check=${caller_id_number}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"play_and_get_digits"</span><span>data</span><span>=</span><span>"2 12 3 20000 # $${base_dir}/sounds/outgoing_welcome.wav $${base_dir}/sounds/outgoing_invalid.wav whatsapp_number \d+"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"log"</span><span>data</span><span>=</span><span>"INFO [whatsapp_number] is ${whatsapp_number}"</span><span>/></span><span><!--While the call is being bridged, play a ringtone for the caller--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"ringback=%(2000, 4000, 440.0, 480.0)"</span><span>/></span><span><!--Offer only OPUS--></span><span><action</span><span>application</span><span>=</span><span>"export"</span><span>data</span><span>=</span><span>"nolocal:absolute_codec_string=OPUS@48000h@20i,OPUS@8000h@20i"</span><span>/></span><span><!--Bridge the call by calling META SIP with the WA Number--></span><span><action</span><span>application</span><span>=</span><span>"bridge"</span><span>data</span><span>=</span><span>"sofia/gateway/whatsapp/+${whatsapp_number}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"hangup"</span><span>/></span><span></condition></span><span></extension></span><span></include></span>
```

</div><div>Audio files should be placed under /usr/share/freeswitch/sounds (not provided)</div>
<span>incoming\_welcome.wav</span><span>Incoming\_invalid.wav</span><span>outgoing\_welcome.wav</span><span>outgoing\_invalid.wav</span><div>**whatsapp.xml**</div><div>This file configures the WhatsApp gateway, copy the file to /usr/share/freeswitch/etc/freeswitch/sip_profiles/external/whatsapp.xml</div><div>```
<span><!--Gateway configuration for Meta SIP--></span><span><!--replace {phone-number},{meta-sip-password} and {domain-name} before starting FreeSWITCH--></span><span><include></span><span><gateway</span><span>name</span><span>=</span><span>"whatsapp"</span><span>></span><span><param</span><span>name</span><span>=</span><span>"username"</span><span>value</span><span>=</span><span>"{phone-number}"</span><span>/></span><span><param</span><span>name</span><span>=</span><span>"password"</span><span>value</span><span>=</span><span>"{meta-sip-password}"</span><span>/></span><span><param</span><span>name</span><span>=</span><span>"register"</span><span>value</span><span>=</span><span>"false"</span><span>/></span><span><param</span><span>name</span><span>=</span><span>"realm"</span><span>value</span><span>=</span><span>"wa.meta.vc"</span><span>/></span><span><param</span><span>name</span><span>=</span><span>"from-user"</span><span>value</span><span>=</span><span>"{phone-number}"</span><span>/></span><span><param</span><span>name</span><span>=</span><span>"from-domain"</span><span>value</span><span>=</span><span>"{domain-name}"</span><span>/></span><span></gateway></span><span></include></span>
```

</div><div>Replace the following placeholders with actual values</div>
<span>{phone-number}: WhatsApp Business Phone Number</span><span>{meta-sip-password}: SIP password issued by Meta. For more details on SIP password setup, see the [WhatsApp Cloud API documentation](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</span><span>{domain-name}: DNS name of your FreeSWITCH SIP server</span><div>**acl.conf.xml**</div><div>Open /usr/share/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml</div><div>Add the following list under `network-lists` element</div><div>```
<span><!--IP addresses from Meta that are allowed to send SIP requests via the gateway. Keep this up to date--></span><span><list</span><span>name</span><span>=</span><span>"whatsapp_allow"</span><span>default</span><span>=</span><span>"deny"</span><span>></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"31.13.24.0/21"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"31.13.64.0/18"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"45.64.40.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"57.141.0.0/21"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"57.141.8.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"57.141.12.0/23"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"57.144.0.0/14"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"66.220.144.0/20"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"69.63.176.0/20"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"69.171.224.0/19"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"74.119.76.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"102.132.96.0/20"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"103.4.96.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"129.134.0.0/16"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"147.75.208.0/20"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"157.240.0.0/16"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"163.70.128.0/17"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"163.77.128.0/17"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"173.252.64.0/18"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"179.60.192.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"185.60.216.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"185.89.216.0/22"</span><span>/></span><span><node</span><span>type</span><span>=</span><span>"allow"</span><span>cidr</span><span>=</span><span>"204.15.20.0/22"</span><span>/></span><span></list></span>
```

</div><div>**vars.xml**</div><div>Modify /usr/share/freeswitch/etc/freeswitch/vars.xml</div><div>```
<span>Add</span><span> line </span><span><</span><span>X</span><span>-</span><span>PRE</span><span>-</span><span>PROCESS cmd</span><span>=</span><span>"set"</span><span> data</span><span>=</span><span>"rtp_secure_media=mandatory"</span><span>/></span><span> under </span><span><include></span><span>Replace</span><span><</span><span>X</span><span>-</span><span>PRE</span><span>-</span><span>PROCESS cmd</span><span>=</span><span>"set"</span><span> data</span><span>=</span><span>"default_password=1234"</span><span>/></span><span>with</span><span>(</span><span>substitute </span><span>{</span><span>sip_ua_password</span><span>}</span><span>with</span><span> your password</span><span>)</span><span><</span><span>X</span><span>-</span><span>PRE</span><span>-</span><span>PROCESS cmd</span><span>=</span><span>"set"</span><span> data</span><span>=</span><span>"default_password={sip-ua-password}"</span><span>/></span><span>Replace</span><span><</span><span>X</span><span>-</span><span>PRE</span><span>-</span><span>PROCESS cmd</span><span>=</span><span>"set"</span><span> data</span><span>=</span><span>"domain=$${local_ip_v4}"</span><span>/></span><span>with</span><span>(</span><span>substitute </span><span>{</span><span>domain</span><span>-</span><span>name</span><span>}</span><span>with</span><span> your </span><span>FreeSWITCH</span><span> SIP server DNS</span><span>)</span><span><</span><span>X</span><span>-</span><span>PRE</span><span>-</span><span>PROCESS cmd</span><span>=</span><span>"set"</span><span> data</span><span>=</span><span>"domain={domain-name}”/>

Replace
  <X-PRE-PROCESS cmd="</span><span>stun</span><span>-</span><span>set</span><span>" data="</span><span>external_sip_ip</span><span>=</span><span>stun</span><span>:</span><span>stun</span><span>.</span><span>freeswitch</span><span>.</span><span>org</span><span>"/>
with (substitute {external-ip} with your FreeSWITCH public ip)
  <X-PRE-PROCESS cmd="</span><span>set</span><span>" data="</span><span>external_sip_ip</span><span>={</span><span>external</span><span>-</span><span>ip</span><span>}</span><span>"/>

Replace
  <X-PRE-PROCESS cmd="</span><span>stun</span><span>-</span><span>set</span><span>" data="</span><span>external_rtp_ip</span><span>=</span><span>stun</span><span>:</span><span>stun</span><span>.</span><span>freeswitch</span><span>.</span><span>org</span><span>"/>
with (substitute {external-ip} with your FreeSWITCH public ip)
  <X-PRE-PROCESS cmd="</span><span>stun</span><span>-</span><span>set</span><span>" data="</span><span>external_rtp_ip</span><span>={</span><span>external</span><span>-</span><span>ip</span><span>}</span><span>"/></span>
```

</div><div>**internal.xml**</div><div>Modify /usr/share/freeswitch/etc/freeswitch/sip_profiles/internal.xml Look for:</div><div>```
<span><param</span><span>name</span><span>=</span><span>"sip-trace"</span><span>value</span><span>=</span><span>"no"</span><span>/></span>
```

</div><div>Replace it with</div><div>```
<span><param</span><span>name</span><span>=</span><span>"sip-trace"</span><span>value</span><span>=</span><span>"yes"</span><span>/></span>
```

</div><div>**external.xml**Modify /usr/share/freeswitch/etc/freeswitch/sip_profiles/external.xml</div><div>```
<span>Replace</span><span><</span><span>param name</span><span>=</span><span>"sip-trace"</span><span> value</span><span>=</span><span>"no"</span><span>/></span><span>with</span><span><</span><span>param name</span><span>=</span><span>"sip-trace"</span><span> value</span><span>=</span><span>"yes"</span><span>/></span><span>Replace</span><span><</span><span>param name</span><span>=</span><span>"tls"</span><span> value</span><span>=</span><span>"$${external_ssl_enable}"</span><span>/></span><span>with</span><span><</span><span>param name</span><span>=</span><span>"tls"</span><span> value</span><span>=</span><span>"true"</span><span>/></span><span>Replace</span><span><!--<</span><span>param name</span><span>=</span><span>"tls-cert-dir"</span><span> value</span><span>=</span><span>""</span><span>/>--></span><span>with</span><span><</span><span>param name</span><span>=</span><span>"tls-cert-dir"</span><span> value</span><span>=</span><span>"/usr/share/freeswitch/etc/freeswitch/certs"</span><span>/></span>
```

</div><div>Make sure certificates are placed under /usr/share/freeswitch/etc/freeswitch/certs</div><div id="bkmrk-final-checklist-3"><div id="bkmrk-final-checklist-4"><div>#### Final checklist

</div></div></div>
<span>Double-check all configuration files for correct numbers, passwords, and domain names.</span><span>Make sure your firewall allows SIP (5081/TLS) and RTP (10000-20000) ports.</span><span>For more details on SIP password setup, see the [WhatsApp Cloud API documentation](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</span><div id="bkmrk-troubleshooting-3"><div id="bkmrk-troubleshooting-4"><div>#### Troubleshooting

</div></div></div><div id="bkmrk-cannot-register-sip--3"><div id="bkmrk-cannot-register-sip--4"><div>##### Cannot register SIP UA

</div></div></div><div>Confirm that the SIP URL is correct and the domain is pointing to the FreeSWITCH server. Run host {domain-name} to verify that the IP address points to the FreeSWITCH server.</div><div id="bkmrk-trace-sip-messages"><div id="bkmrk-trace-sip-messages-1"><div>##### Trace SIP messages

</div></div></div><div>Start CLI (/usr/share/freeswitch/bin/fs_cli) to view SIP messages</div><div id="bkmrk-freeswitch-using-gra"><div id="bkmrk-freeswitch-using-gra-1"><div>### FreeSWITCH using Graph API with Janus

</div></div></div><div id="bkmrk-overview-6"><div id="bkmrk-overview-7"><div>#### Overview

</div></div></div><div>This guide explains how to set up [WhatsApp Business Calling API](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) using [WhatsApp Cloud API signaling](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) with [FreeSWITCH<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fsignalwire.com%2Ffreeswitch&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), an open-source communication framework and [Janus<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fjanus.conf.meetecho.com%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), a general purpose WebRTC server. You’ll learn how to configure your FreeSWITCH server, connect SIP phones, and handle both incoming and outgoing WhatsApp calls.</div><div>![Architecture diagram showing FreeSWITCH with Janus integration](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-qxjmgmj5.png)</div><div id="bkmrk-user-initiated-calls-6"><div id="bkmrk-user-initiated-calls-7"><div>##### User-initiated calls

</div></div></div>
<span>The WhatsApp user dials the business number.</span><span>The call is received by Webhook server which forwards it to FreeSWITCH server via Janus SIP plugin.</span><span>The call is received by FreeSWITCH and routed through an IVR, prompting the user to enter an extension, registered to the same FreeSWITCH server.</span><span>The call is then connected to the specified extension.</span><div id="bkmrk-business-initiated-c-6"><div id="bkmrk-business-initiated-c-7"><div>##### Business-initiated calls

</div></div></div>
<span>The business agent/user registers with FreeSWITCH using SIP credentials (see “[Configuring a VoIP Phone](/books/meta-whatsapp/page/integration-examples-developer-documentation)” section).</span><span>The business user dials the b2c-sip (business to consumer) extension, which is handled by an IVR. The IVR prompts for the WhatsApp number to call.</span><span>FreeSWITCH bridges the call to extension registered to Janus SIP plugin which translates it to an API request to Meta</span><span>The call is then connected to the WhatsApp user.</span><div>The Janus server sits between WA and FreeSWITCH and converts media from WA (WebRTC complaint with DTLS key exchange) to FreeSWITCH negotiated media (SDES key exchange).</div><div>FreeSWITCH - Sip UA will be using SDES for media encryption key exchange and opus or G711 for audio codec</div><div id="bkmrk-prerequisites-6"><div id="bkmrk-prerequisites-7"><div>#### Prerequisites

</div></div></div>
<span>FreeSWITCH Deployment: FreeSWITCH is deployed (for example, on a public cloud instance)</span><span>Janus Deployment: Can be deployed on the same machine as FreeSWITCH</span><span>Operating System: Any OS compatible with FreeSWITCH. For example, CentOS 9</span><span>Domain: FreeSWITCH server and Webhook server are reachable via a public domain with valid certificate</span><span>WhatsApp Business API: A WhatsApp business phone number is registered and [calling is enabled](https://support2.chatarchitect.com/books/meta-whatsapp/page/configure-call-settings-%7C-developer-documentation).</span><span>Webhooks: Configure Webhook callback URL pointing to domain name of the Webhook server</span><div id="bkmrk-integration-with-clo"><div id="bkmrk-integration-with-clo-1"><div>#### Integration with Cloud API signaling

</div></div></div><div>You will need to implement an integration module which sits between WA and Janus and translates Cloud API Signalling messages to Janus SIP plugin messages and vice versa.</div><div>You will need</div>
<span>A webhook server to receive calls webhook events from Meta</span><span>A Graph API module to send call messages to Meta</span><span>An implementation of [Janus SIP plugin<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fjanus.conf.meetecho.com%2Fdocs%2Fsip&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g) to connect to Janus. The Janus plugin implementation will connect to FreeSWITCH using extension 1000 which is reserved for bridging</span><div>Business initiated calls</div>
<span>The module will receive a SIP INVITE via Janus SIP plugin on extension 1000. The SIP INVITE is converted to a [Graph API request](https://support2.chatarchitect.com/books/meta-whatsapp/page/business-initiated-calls-%7C-developer-documentation#initiate-call). The SDP received in the SIP INVITE is sent verbatim as the SDP offer to WA via the Graph API call</span><span>When the call is accepted by the WA user, an accepted webhook is received. On receiving the webhook, the Janus SIP Plugin accepts the SIP INVITE passing the answer SDP in the [connect webhook](https://support2.chatarchitect.com/books/meta-whatsapp/page/business-initiated-calls-%7C-developer-documentation#call-connect-webhook)</span><div>User Initiated calls</div>
<span>The webhook server receives an incoming call via a webhook message containing the offer SDP. On receiving the call invite, the Janus SIP plugin sends an invite to FreeSWITCH via extension 1000. The destination extension is **c2b-sip.**</span><span>When the Janus SIP plugin receives the SIP 200 OK, a Graph API accept call request is sent to Meta to accept the incoming call by passing the SDP received as part of SIP answer</span><div id="bkmrk-building-and-install-6"><div id="bkmrk-building-and-install-7"><div>#### Building and installing Janus

</div></div></div><div>Refer to [https://github.com/meetecho/janus-gateway<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeetecho%2Fjanus-gateway&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g)This guide was tested using version 1.2.3</div><div id="bkmrk-janus-configuration"><div id="bkmrk-janus-configuration-1"><div>#### Janus configuration

</div></div></div><div>**janus.jcfg**</div><div>Modify janus.jcfg which can be found at /usr/share/janus/etc/janus/janus.jcfg Set nat_1_1_mapping to the public IP of the Janus Server</div><div>To start Janus</div><div>```
<span>/usr/</span><span>share</span><span>/</span><span>janus</span><span>/</span><span>bin</span><span>/</span><span>janus  </span><span>--</span><span>debug</span><span>-</span><span>level</span><span>=</span><span>6</span><span>--</span><span>libnice</span><span>-</span><span>debug</span><span>=</span><span>on </span><span>-</span><span>S stun</span><span>.</span><span>l</span><span>.</span><span>google</span><span>.</span><span>com</span><span>:</span><span>19302</span><span>--</span><span>log</span><span>-</span><span>file</span><span>=</span><span>/var/</span><span>log</span><span>/</span><span>janus</span><span>.</span><span>log </span><span>--</span><span>config</span><span>=</span><span>/usr/</span><span>share</span><span>/</span><span>janus</span><span>/</span><span>etc</span><span>/</span><span>janus</span><span>/</span><span>janus</span><span>.</span><span>jcfg</span>
```

</div><div id="bkmrk-building-and-install-9"><div id="bkmrk-building-and-install-10"><div>#### Building and installing FreeSWITCH

</div></div></div><div>Refer to [https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdeveloper.signalwire.com%2Ffreeswitch%2FFreeSWITCH-Explained%2FInstallation%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g)</div><div>This guide was tested using FreeSWITCH version 1.10.12. FreeSWITCH uses sofia (an open-source SIP user agent library). Sofia v1.13.17 was used for this guide</div><div>**FreeSWITCH Configuration**These configuration files are placed under /usr/share/freeswitch/etc/freeswitch</div><div>**wa-biz-api-dialplan.xml**</div><div>Place the dial plan under /usr/share/freeswitch/etc/freeswitch/dialplan/default/wa-biz-api-dialplan.xml</div><div>```
<span><include></span><span><extension</span><span>name</span><span>=</span><span>"c2b_calls_ivr"</span><span>></span><span><condition</span><span>field</span><span>=</span><span>"destination_number"</span><span>expression</span><span>=</span><span>"^c2b-sip$"</span><span>></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"rtp_secure_media=true"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"answer"</span><span>/></span><span><!--Add silence stream for  1 sec so that the media path is established between whatsapp and freeswitch to avoid audio clipping. TODO: Investigate if silence can be removed--></span><span><action</span><span>application</span><span>=</span><span>"playback"</span><span>data</span><span>=</span><span>"silence_stream://1000"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"play_and_get_digits"</span><span>data</span><span>=</span><span>"2 5 3 7000 # $${base_dir}/sounds/incoming_welcome.wav  $${base_dir}/sounds/incoming_invalid.wav extension \d+"</span><span>/></span><span><!--While the call is being bridged, play a ringtone for the caller--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"ringback=%(2000, 4000, 440.0, 480.0)"</span><span>/></span><span><!--WA calls bridged via Janus through extension 1000 only support OPUS. However, the callee might be restricted to other codecs for example G722--></span><span><!--Therefore , don't restrict to OPUS for C2B calls and offer more codecs to the caller. Transcoding between OPUS and the negotiated codec by the caller--></span><span><!--will happen in freeswitch--></span><span><action</span><span>application</span><span>=</span><span>"export"</span><span>data</span><span>=</span><span>"nolocal:absolute_codec_string=PCMA,PCMU,OPUS@48000h@20i,G722"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"bridge"</span><span>data</span><span>=</span><span>"user/${extension}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"hangup"</span><span>/></span><span></condition></span><span></extension></span><span><extension</span><span>name</span><span>=</span><span>"b2c_calls_ivr"</span><span>></span><span><condition</span><span>field</span><span>=</span><span>"destination_number"</span><span>expression</span><span>=</span><span>"^b2c-sip$"</span><span>></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"rtp_secure_media=true"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"answer"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"playback"</span><span>data</span><span>=</span><span>"silence_stream://1000"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"caller_id_check=${caller_id_number}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"log"</span><span>data</span><span>=</span><span>"INFO [caller id ] is ${caller_id_check}"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"play_and_get_digits"</span><span>data</span><span>=</span><span>"2 12 3 20000 # $${base_dir}/sounds/outgoing_welcome.wav $${base_dir}/sounds/outgoing_invalid.wav whatsapp_number \d+"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"log"</span><span>data</span><span>=</span><span>"INFO [whatsapp_number] is ${whatsapp_number}"</span><span>/></span><span><!--Add the whatsapp number entered by the user as a custom SIP header, Janus will use this WA user number in API request to Meta--></span><span><action</span><span>application</span><span>=</span><span>"export"</span><span>data</span><span>=</span><span>"sip_h_X-WhatsApp-Number=${whatsapp_number"</span><span>/></span><span><!--While the call is being bridged, play a ringtone for the caller--></span><span><action</span><span>application</span><span>=</span><span>"set"</span><span>data</span><span>=</span><span>"ringback=%(2000, 4000, 440.0, 480.0)"</span><span>/></span><span><!--WA calls bridged via Janus through extension 1000 only support OPUS. However, the caller might be restricted to other codecs for example G722--></span><span><!--Therefore , don't restrict to OPUS for B2C calls and let caller select other codecs--></span><span><!--However, force transcoding to OPUS by only offering OPUS to Janus--></span><span><action</span><span>application</span><span>=</span><span>"export"</span><span>data</span><span>=</span><span>"nolocal:absolute_codec_string=OPUS@48000h@20i,PCMU,PCMA"</span><span>/></span><span><!--Bridge the call to extension 1000 to which capi-calling is registered via Janus to route calls to WhatsApp--></span><span><action</span><span>application</span><span>=</span><span>"bridge"</span><span>data</span><span>=</span><span>"user/1000"</span><span>/></span><span><action</span><span>application</span><span>=</span><span>"hangup"</span><span>/></span><span></condition></span><span></extension></span><span></include></span>
```

</div><div>Audio files should be placed under /usr/share/freeswitch/sounds (not provided)</div>
<span>incoming\_welcome.wav</span><span>Incoming\_invalid.wav</span><span>outgoing\_welcome.wav</span><span>outgoing\_invalid.wav</span><div>**internal.xml**</div><div>Modify /usr/share/freeswitch/etc/freeswitch/sip_profiles/internal.xml Look for:</div><div>```
<span><param</span><span>name</span><span>=</span><span>"sip-trace"</span><span>value</span><span>=</span><span>"no"</span><span>/></span>
```

</div><div>Replace it with</div><div>```
<span><param</span><span>name</span><span>=</span><span>"sip-trace"</span><span>value</span><span>=</span><span>"yes"</span><span>/></span>
```

</div><div id="bkmrk-configuring-a-voip-p-3"><div id="bkmrk-configuring-a-voip-p-4"><div>#### Configuring a VoIP phone

</div></div></div><div>Refer to the [earlier section](/books/meta-whatsapp/page/integration-examples-developer-documentation)</div><div id="bkmrk-final-checklist-6"><div id="bkmrk-final-checklist-7"><div>#### Final checklist

</div></div></div>
<span>Double-check all configuration files for correct numbers, passwords, and domain names.</span><span>Make sure your firewall allows SIP (5061/TLS) and RTP (10000-20000) ports.</span><span>For more details on SIP password setup, see the [WhatsApp Cloud API documentation](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</span><div id="bkmrk-troubleshooting-6"><div id="bkmrk-troubleshooting-7"><div>#### Troubleshooting

</div></div></div><div id="bkmrk-cannot-register-sip--6"><div id="bkmrk-cannot-register-sip--7"><div>##### Cannot register SIP UA

</div></div></div><div>Confirm that the SIP URL is correct and the domain is pointing to the FreeSWITCH server. Run host {domain-name} to verify that the IP address points to the FreeSWITCH server.</div><div id="bkmrk-trace-sip-messages-3"><div id="bkmrk-trace-sip-messages-4"><div>##### Trace SIP messages

</div></div></div><div>Start CLI (/usr/share/freeswitch/bin/fs_cli) to view SIP messages</div><div id="bkmrk-asterisk-using-graph"><div id="bkmrk-asterisk-using-graph-1"><div>### Asterisk using Graph API with RtpEngine

</div></div></div><div id="bkmrk-overview-9"><div id="bkmrk-overview-10"><div>#### Overview

</div></div></div><div>This guide explains how to set up [WhatsApp Business Calling API](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) using [WhatsApp Cloud API signaling](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) with [Asterisk<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.asterisk.org%2F&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), an open-source PBX (Private Branch Exchange) and [RtpEngine<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2Fsipwise%2Frtpengine&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g), an open-source proxy used for relaying, manipulating, and controlling RTP streams. You’ll learn how to configure your Asterisk server, connect SIP phones, and handle both incoming and outgoing WhatsApp calls.</div><div id="bkmrk-user-initiated-calls-9"><div id="bkmrk-user-initiated-calls-10"><div>##### User-initiated calls

</div></div></div>
<span>The WhatsApp user dials the business number.</span><span>The call is received by the Webhook server which after bridging media using RtpEngine, forwards it to Asterisk using SIP.</span><span>The call is received by Asterisk and routed through an IVR, prompting the user to enter an extension, registered to the same Asterisk server.</span><span>The call is then connected to the specified extension.</span><div id="bkmrk-business-initiated-c-9"><div id="bkmrk-business-initiated-c-10"><div>##### Business-initiated calls

</div></div></div>
<span>The business agent/user registers with Asterisk using SIP credentials (see “[Configuring a VoIP Phone](/books/meta-whatsapp/page/integration-examples-developer-documentation)” section).</span><span>The business user dials the b2c-sip (business to consumer) extension, which is handled by an IVR. The IVR prompts for the WhatsApp number to call.</span><span>Asterisk bridges the call to extension registered by the integration module (see “Integration with Cloud API Signalling”)</span><span>On receiving the call, the integration module bridges the media using RtpEngine and then translates it to an API request to Meta</span><span>The call is then connected to the WhatsApp user.</span><div>RtpEngine acts as a media proxy and sits between the media stream of WA (WebRTC complaint with DTLS key exchange) and Asterisk (SDES key exchange)</div><div id="bkmrk-prerequisites-9"><div id="bkmrk-prerequisites-10"><div>#### Prerequisites

</div></div></div>
<span>Asterisk Deployment: Asterisk is deployed (for example, on a public cloud instance)</span><span>RtpEngine Deployment: Can be deployed on the same machine as Asterisk</span><span>Operating System: Any OS compatible with Asterisk and RtpEngine. For example, CentOS 9</span><span>Domain: Asterisk server and Webhook server are reachable via a public domain with valid certificate</span><span>WhatsApp Business API: A WhatsApp business phone number is registered and [calling is enabled](https://support2.chatarchitect.com/books/meta-whatsapp/page/configure-call-settings-%7C-developer-documentation).</span><span>Webhooks: Configure Webhook callback URL pointing to domain name of the Webhook server</span><div id="bkmrk-integration-with-clo-3"><div id="bkmrk-integration-with-clo-4"><div>#### Integration with Cloud API signaling

</div></div></div><div>You will need to implement an integration module that acts as a bridge between WhatsApp and Asterisk. This module will:</div>
<span>Translate Cloud API Signaling messages from WhatsApp to SIP for Asterisk, and vice versa</span><span>Use SIP signaling for communication between the SIP UA inside the module and Asterisk</span><span>Bridge the media between WhatsApp and Asterisk via RtpEngine</span><div>You will need following components, which are part of the integration module for the purpose of this setup</div>
<span>Webhook Server: Receives call webhook events from Meta (WhatsApp Cloud API)</span><span>Graph API client: Sends call-related requests to Meta using the Graph API</span><span>SIP User Agent (UA) such as PJSIP: Connects to Asterisk using extension 1000, which is reserved for bridging calls between WhatsApp and Asterisk.</span><span>RtpEngineClient: To control RtpEngine via [ng control protocol<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Frtpengine.readthedocs.io%2Fen%2Flatest%2Fng_control_protocol.html&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g) for bridging media</span><div>![Architecture diagram showing Asterisk integration with RtpEngine for WhatsApp Business Calling](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-wjmo3m1w.jpeg)</div><div>Business initiated calls</div>
<span>Business agent registered to the same Asterisk server dials b2c-sip extension to initiate a call to WhatsApp user</span><span>The extension prompts the business agent to enter WA user’s phone number</span><span>Asterisk sends a SIP INVITE request to extension 1000 with a custom header containing the dialed WA user phone number</span><span>The SIP UA inside the module would’ve registered at extension 1000 and hence receives the SIP INVITE from Asterisk</span><span>The SDP included in the SIP INVITE is sent to RtpEngine which returns a new SDP</span><span>The new SDP is included in the [Graph API request](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) to initiate a new call</span><span>When the WhatsApp user accepts the call, an “accepted” webhook is received</span><span>Upon receiving this webhook, the answer SDP received in the webhook is sent to RtpEngine which returns a new SDP</span><span>The SIP UA accepts the original SIP INVITE (step 3), passing along the new SDP received from RtpEngine</span><span>The call is now bridged between WA user, RtpEngine, and Asterisk</span><div>User Initiated calls</div>
<span>The webhook server inside the module receives an [incoming call webhook](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) from Meta, which includes the offer SDP</span><span>Upon receiving this call invite, the SDP included in the offer is sent to RtpEngine which returns a new SDP</span><span>The SIP UA inside the module sends a SIP INVITE to Asterisk using extension 1000 passing the new SDP from RtpEngine in the SIP INVITE. The destination extension is c2b-sip.</span><span>The extension prompts WA user to dial the extension of the business agent to connect to</span><span>Asterisk dials the specified extension and waits for an answer</span><span>After the agent answers the call, Asterisk sends SIP 200 OK to the SIP UA extension 1000 inside the module. The SDP in SIP 200 OK is sent to RtpEngine which returns a new SDP</span><span>A Graph API request is sent to Meta to [accept the incoming call](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation), with the new SDP received from RtpEngine</span><div id="bkmrk-building-and-install-12"><div id="bkmrk-building-and-install-13"><div>#### Building and installing Asterisk

</div></div></div><div>Refer to https://docs.asterisk.org/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk/</div><div>This guide was tested using Asterisk version 22.5.2</div><div id="bkmrk-building-and-install-15"><div id="bkmrk-building-and-install-16"><div>#### Building and installing RtpEngine

</div></div></div><div>Refer to [https://github.com/sipwise/rtpengine<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2Fsipwise%2Frtpengine&h=AT4Se4Z9JKJ_RQKHLUeLTw9ppBfyr2A-7HBX-JfTqYdGUa_A--Vzc7GDfjf3KHaiJhDKOXMqHde_aCljQXrPQ8J7e_7QekpvVbzUNRQXtWWXZKWYXf1kYJg95rkVpZMijB5IKPOe_Hk9REOhQX7P2g) to build and install RtpEngine This guide was tested using RtpEngine version 13.3.1.4</div><div>Refer to https://rtpengine.readthedocs.io/en/latest/ng_control_protocol.html for details on ng control protocol</div><div>To start RtpEngine run</div><div>```
<span>/usr/</span><span>bin</span><span>/</span><span>rtpengine </span><span>--</span><span>listen</span><span>-</span><span>ng</span><span>={</span><span>local</span><span>-</span><span>ip</span><span>}:</span><span>22222</span><span>--</span><span>interface</span><span>={</span><span>local</span><span>-</span><span>ip</span><span>}</span><span>\!</span><span>{</span><span>public</span><span>-</span><span>ip</span><span>}</span><span>-</span><span>f </span><span>-</span><span>E</span>
```

</div><div>Replace</div>
<span>{local-ip} with the local IP of the RtpEngine server</span><span>{public-ip} with the public IP of the RtpEngine server</span><div>**Asterisk Configuration**These configuration files are placed under /etc/asterisk/</div><div>**extensions.conf**</div><div>Replace the following placeholders with actual values</div>
<span>incoming\_welcome: incoming\_welcome.wav (not provided) place this file under /var/lib/asterisk/sounds</span><span>outgoing\_welcome: outgoing\_welcome.wav (not provided) place this file under /var/lib/asterisk/sounds</span><div>```
<span>[</span><span>handler</span><span>]</span><span>;</span><span>Set</span><span> headers on callee channel
exten </span><span>=></span><span> addheader</span><span>,</span><span>1</span><span>,</span><span>Set</span><span>(</span><span>PJSIP_HEADER</span><span>(</span><span>add</span><span>,</span><span>X</span><span>-</span><span>WhatsApp</span><span>-</span><span>Number</span><span>)=</span><span>$</span><span>{</span><span>DIGITS</span><span>})</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Return</span><span>()</span><span>[</span><span>default</span><span>]</span><span>
exten </span><span>=></span><span> _10XX</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>$</span><span>{</span><span>EXTEN</span><span>})</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Hangup</span><span>()</span><span>

exten </span><span>=></span><span> b2c</span><span>-</span><span>sip</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Read</span><span>(</span><span>Digits</span><span>,</span><span>outgoing_welcome</span><span>,</span><span>0</span><span>,,</span><span>5</span><span>,</span><span>500</span><span>)</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Set</span><span>(</span><span>GLOBAL</span><span>(</span><span>DIGITS</span><span>)=</span><span>$</span><span>{</span><span>Digits</span><span>})</span><span>;</span><span>Before</span><span> starting a business initiated call</span><span>,</span><span> add customer WA header to store the WA user number captured </span><span>from</span><span> agent entered digits </span><span>(</span><span>DTMF</span><span>)</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>1000</span><span>,,</span><span>b</span><span>(</span><span>handler</span><span>^</span><span>addheader</span><span>^</span><span>1</span><span>))</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Hangup</span><span>()</span><span>

exten </span><span>=></span><span> c2b</span><span>-</span><span>sip</span><span>,</span><span>1</span><span>,</span><span>NoOp</span><span>()</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Read</span><span>(</span><span>Digits</span><span>,</span><span>incoming_welcome</span><span>,</span><span>0</span><span>,,</span><span>5</span><span>,</span><span>500</span><span>)</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Dial</span><span>(</span><span>PJSIP</span><span>/</span><span>$</span><span>{</span><span>Digits</span><span>})</span><span>
same </span><span>=></span><span> n</span><span>,</span><span>Hangup</span><span>()</span>
```

</div><div>**pjsip.conf**</div><div>Replace the following placeholders with actual values</div>
<span>{external-media-address}: Public IP of the Asterisk server for media</span><span>{external-signaling-address}: Public IP of the Asterisk server for signaling</span><span>{local-net}: local network of the Asterisk server</span><span>{sip-ua-password}: Chosen SIP User Agent password</span><div>Note:</div><div>Extension 1000 is used to bridge WA calls with Asterisk see section **Integration with Cloud API Signaling**</div><div>```
<span>[</span><span>global</span><span>]</span><span>
type</span><span>=</span><span>global</span><span>
debug</span><span>=</span><span>yes </span><span>;</span><span>Enable</span><span>/</span><span>Disable</span><span> SIP debug logging</span><span>.</span><span>Valid</span><span> options include yes</span><span>|</span><span>no</span><span>[</span><span>transport</span><span>-</span><span>tcp</span><span>]</span><span>
type</span><span>=</span><span>transport
protocol</span><span>=</span><span>tcp
bind</span><span>=</span><span>0.0</span><span>.</span><span>0.0</span><span>;</span><span>External</span><span> IP address to </span><span>use</span><span>in</span><span> RTP handling
external_media_address</span><span>={</span><span>external</span><span>-</span><span>media</span><span>-</span><span>address</span><span>}</span><span>;</span><span>External</span><span> address </span><span>for</span><span> SIP signalling
external_signaling_address</span><span>={</span><span>external</span><span>-</span><span>signaling</span><span>-</span><span>address</span><span>}</span><span>;</span><span>Network</span><span> to consider </span><span>local</span><span> used </span><span>for</span><span> NAT purposes
local_net</span><span>={</span><span>local</span><span>-</span><span>net</span><span>}</span><span>[</span><span>endpointtemplate</span><span>](!)</span><span>
type</span><span>=</span><span>endpoint
context</span><span>=</span><span>default</span><span>
disallow</span><span>=</span><span>all
allow</span><span>=</span><span>OPUS</span><span>,</span><span>g722</span><span>,</span><span>g729</span><span>,</span><span>ulaw
</span><span>;</span><span>No</span><span> audio </span><span>if</span><span> direct_media </span><span>is</span><span>set</span><span> to yes
direct_media</span><span>=</span><span>no</span><span>
rtp_symmetric</span><span>=</span><span>yes
use_avpf</span><span>=</span><span>yes
media_encryption</span><span>=</span><span>sdes
media_use_received_transport</span><span>=</span><span>yes
rtcp_mux</span><span>=</span><span>yes

</span><span>[</span><span>authtemplate</span><span>](!)</span><span>
type</span><span>=</span><span>auth
auth_type</span><span>=</span><span>userpass
password</span><span>={</span><span>sip</span><span>-</span><span>ua</span><span>-</span><span>password</span><span>}</span><span>[</span><span>aortemplate</span><span>](!)</span><span>
type</span><span>=</span><span>aor
max_contacts</span><span>=</span><span>1</span><span>
remove_existing</span><span>=</span><span>yes

</span><span>[</span><span>1000</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
disallow</span><span>=</span><span>all
</span><span>;</span><span>extension </span><span>1000</span><span>is</span><span> used </span><span>by</span><span>RtpEngine</span><span> to bridge whatsapp calls
</span><span>;</span><span>WhatsApp</span><span> only support OPUS
allow</span><span>=</span><span>OPUS
auth</span><span>=</span><span>1000</span><span>_auth
aors</span><span>=</span><span>1000</span><span>[</span><span>1000</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1000</span><span>[</span><span>1000</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1001</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1001</span><span>_auth
aors</span><span>=</span><span>1001</span><span>[</span><span>1001</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1001</span><span>[</span><span>1001</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1002</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1002</span><span>_auth
aors</span><span>=</span><span>1002</span><span>[</span><span>1002</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1002</span><span>[</span><span>1002</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1003</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1003</span><span>_auth
aors</span><span>=</span><span>1003</span><span>[</span><span>1003</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1003</span><span>[</span><span>1003</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1004</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1004</span><span>_auth
aors</span><span>=</span><span>1004</span><span>[</span><span>1004</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1004</span><span>[</span><span>1004</span><span>](</span><span>aortemplate</span><span>)</span><span>[</span><span>1005</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
auth</span><span>=</span><span>1005</span><span>_auth
aors</span><span>=</span><span>1005</span><span>[</span><span>1005</span><span>_auth</span><span>](</span><span>authtemplate</span><span>)</span><span>
username</span><span>=</span><span>1005</span><span>[</span><span>1005</span><span>](</span><span>aortemplate</span><span>)</span>
```

</div><div id="bkmrk-configuring-a-voip-p-6"><div id="bkmrk-configuring-a-voip-p-7"><div>#### Configuring a VoIP phone

</div></div></div><div>Refer to the [earlier section](/books/meta-whatsapp/page/integration-examples-developer-documentation)</div><div id="bkmrk-final-checklist-9"><div id="bkmrk-final-checklist-10"><div>#### Final checklist

</div></div></div>
<span>Double-check all configuration files for correct numbers, passwords, and domain names.</span><span>Make sure your firewall allows SIP (5060/TCP) and RTP (10000-20000) ports.</span><span>For more details on SIP password setup, see the [WhatsApp Cloud API documentation](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</span><div id="bkmrk-troubleshooting-9"><div id="bkmrk-troubleshooting-10"><div>#### Troubleshooting

</div></div></div><div id="bkmrk-cannot-register-sip--9"><div id="bkmrk-cannot-register-sip--10"><div>##### Cannot register SIP UA

</div></div></div><div>Confirm that the SIP URL is correct and the domain is pointing to the Asterisk server. Run host {domain-name} to verify that the IP address points to the Asterisk server.</div><div id="bkmrk-asterisk-with-built-"><div id="bkmrk-asterisk-with-built--1"><div>### Asterisk with built-in WebRTC using Graph API

</div></div></div><div>This approach is similar to [Asterisk using Graph API with RtpEngine ](/books/meta-whatsapp/page/integration-examples-developer-documentation) except that it uses the built-in WebRTC support in Asterisk and hence does not require RtpEngine.</div><div>The RtpEngineClient component is hence not required in this approach</div><div>In terms of configuration and setup, only difference is the configuration of extension 1000 which is given below</div><div>```
<span>...</span><span>;</span><span>Rest</span><span> of content omitted </span><span>for</span><span> brevity

</span><span>[</span><span>1000</span><span>](</span><span>endpointtemplate</span><span>)</span><span>
disallow</span><span>=</span><span>all
</span><span>;</span><span>extension </span><span>1000</span><span>is</span><span> used </span><span>by</span><span> SIP UA of the integration </span><span>module</span><span> to bridge </span><span>WhatsApp</span><span> calls
</span><span>;</span><span>WhatsApp</span><span> only support OPUS
allow</span><span>=</span><span>OPUS
auth</span><span>=</span><span>1000</span><span>_auth
aors</span><span>=</span><span>1000</span><span>
dtls_auto_generate_cert</span><span>=</span><span>yes
webrtc</span><span>=</span><span>yes
</span><span>;</span><span>Setting</span><span> webrtc</span><span>=</span><span>yes </span><span>is</span><span> a shortcut </span><span>for</span><span> setting the following options</span><span>:</span><span>;</span><span> use_avpf</span><span>=</span><span>yes
</span><span>;</span><span> media_encryption</span><span>=</span><span>dtls
</span><span>;</span><span> dtls_verify</span><span>=</span><span>fingerprint
</span><span>;</span><span> dtls_setup</span><span>=</span><span>actpass
</span><span>;</span><span> ice_support</span><span>=</span><span>yes
</span><span>;</span><span> media_use_received_transport</span><span>=</span><span>yes
</span><span>;</span><span> rtcp_mux</span><span>=</span><span>yes
</span>
```

</div></div>

# API and Webhook Reference | Developer Documentation

<div id="bkmrk-api-and-webhook-refe">## API and Webhook Reference

<div><span>Updated: Nov 25, 2025</span></div><div id="bkmrk-calling-api-endpoint"><div id="bkmrk-calling-api-endpoint-1"><div>### Calling API endpoints

</div></div></div><div id="bkmrk-configure-or-update-"><div id="bkmrk-configure-or-update--1"><div>#### Configure or update calling settings

</div></div></div><div id="bkmrk-endpoint-parameters"><div id="bkmrk-endpoint-parameters-1"><div>##### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>The business phone number for which you are updating Calling API settings.</div></div></td><td><div><div>`+12784358810`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-parameter-details%3A-c"><div id="bkmrk-parameter-details%3A-c-1"><div>##### Parameter details: Calling status

</div></div></div><div>When the `status` parameter is set to `“ENABLED”`, calling features are enabled for the business phone number. WhatsApp client applications will render the call button icon in both the business chat and business chat profile.</div><div>When the `status` parameter is set to `“DISABLED”`, calling features are **disabled**, and both the business chat and business chat profile **do not display the call button icon.**</div><div>Updates to `status` will update the call button icon in existing business chats in near real-time when the business phone number is in the WhatsApp user’s contacts.</div><div>Otherwise, updates are real-time for a limited number of users in conversation with the business, and are eventually updated for the rest of conversations.</div><div id="bkmrk-parameter-details%3A-c-3"><div id="bkmrk-parameter-details%3A-c-4"><div>##### Parameter details: Call button icon visibility

</div></div></div><div>When Calling API features are enabled for a business number, you can still choose whether to show the call button icon or not by using the `call_icon_visibility` parameter. Note: Disabling call button icon visibility **does not** disable a WhatsApp user’s ability to make unsolicited calls to your business.</div><div>The behavior for supported options is as follows:</div><div>`DEFAULT`</div><div>The Call button icon will be displayed in the chat menu bar and the business info page, allowing for unsolicited calls to the business by WhatsApp users.</div><div>![Screenshot showing the call button icon displayed in the WhatsApp chat menu bar and business info page](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-t4ymjl4k.jpeg)</div><div>`DISABLE ALL`</div><div>The call button icon is hidden in the chat menu bar and the business info page, and all other entry points external to the chat are also disabled. Consumers cannot make unsolicited calls to the business.</div><div>Your business can still [send interactive messages](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) or [template messages](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) with a Calling API CTA button.</div><div>![Screenshot showing the WhatsApp chat interface with the call button icon hidden](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-zozdpjkf.jpeg)</div>###### Callback permissions

<div>Calling a WhatsApp user requires explicit permission from the user. One way to obtain calling permissions is to request permission when a WhatsApp user calls your business.</div><div>You can configure the call permission UI to automatically show in the WhatsApp user’s client app when they call your business number. The user may change their permission selection at any time.</div><div>![Screenshot showing the WhatsApp call permission request dialog](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-1w4bcnkg.jpeg)</div><div id="bkmrk-error-response"><div id="bkmrk-error-response-1"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Permissions/Authorization errors</span><span>Invalid status</span><span>Invalid schedule for `call_hours`</span><span>Holiday given in `call_hours` is a past date</span><span>Timezone is invalid in `call_hours`</span><span>`weekly_operating_hours` in `call_hours` cannot be empty</span><span>Date format in `holiday_schedule` for call\_hours is invalid</span><span>More than 2 entries not allowed in `weekly_operating_hours` schedule in `call_hours`</span><span>Overlapping schedule in `call_hours` is not allowed</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-get-phone-number-cal"><div id="bkmrk-get-phone-number-cal-1"><div>#### Get phone number calling settings

</div></div></div><div>This endpoint can return information for other Cloud API feature settings.</div><div id="bkmrk-endpoint-parameters-3"><div id="bkmrk-endpoint-parameters-4"><div>##### Endpoint parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number for which you are getting Calling API settings.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+12784358810`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-app-permission-requi"><div id="bkmrk-app-permission-requi-1"><div>##### App permission required

</div></div></div><div>`whatsapp_business_management`: Advanced access is required to use the API for end business clients</div><div id="bkmrk-response-details"><div id="bkmrk-response-details-1"><div>##### Response details

</div></div></div><div>The endpoint returns Calling API settings, along with other configuration information for your WhatsApp business phone number.</div><div>[Learn more about Calling API settings and their values](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div><div id="bkmrk-error-response-3"><div id="bkmrk-error-response-4"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-pre-accept-call"><div id="bkmrk-pre-accept-call-1"><div>#### Pre-accept call

</div></div></div><div>When you pre-accept an inbound call, you allow the calling media connection to be established before attempting to send call media through the connection.</div><div>When you then call the accept call endpoint, media begins flowing immediately since the connection has already been established.</div><div>Pre-accepting calls is recommended because it facilitates faster connection times and avoids [audio clipping issues](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>There is about 30 to 60 seconds after the [Call Connect webhook](#bkmrk-call-connect-webhook-1) is sent for the business to accept the phone call. If the business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](#bkmrk-call-terminate-webho-1) is delivered back to you.</div><div><div>**Note:** Since the WebRTC connection is established before calling the [Accept Call endpoint](#bkmrk-accept-call-1), make sure to flow the call media only after you receive a 200 OK response back.</div><div>If call media flows too early, the caller will miss the first few words of the call. If call media flows too late, callers will hear silence.</div></div><div id="bkmrk-body-parameters-3"><div id="bkmrk-body-parameters-4"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](#bkmrk-call-connect-webhook-1) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“pre_accept”`</div></div></td></tr><tr><td><div><div>`session`</div><div>*JSON object*</div></div></td><td><div><div>**Optional**</div><div>  
Contains the session description protocol (SDP) type and description language.</div><div>Requires two values:</div><div>`sdp_type` — (*String*) **Required**</div><div>“offer”, to indicate SDP offer</div><div>`sdp` — (*String*) **Required**</div><div>The SDP info of the device on the other end of the call. The SDP must be compliant with [RFC 8866<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8866&h=AT4RSFrfLLXXKF37xVCfqqRGHvlDHJBDgunPA7j50px7xyvJVuCK4INxmOr3DKEByyuz1glDoijkBxZmRGwqeLrcNOCNbWzh7m-7tcLnAcR19kX7idO43EulK0i2M5JWyFr-i5czyraNSsq3zywGQQ).</div><div>[Learn more about Session Description Protocol (SDP)<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.rfc-editor.org%2Frfc%2Frfc8866.html&h=AT4RSFrfLLXXKF37xVCfqqRGHvlDHJBDgunPA7j50px7xyvJVuCK4INxmOr3DKEByyuz1glDoijkBxZmRGwqeLrcNOCNbWzh7m-7tcLnAcR19kX7idO43EulK0i2M5JWyFr-i5czyraNSsq3zywGQQ)</div><div>[View example SDP structures](#bkmrk-sdp-overview-and-sam-1)</div></div></td><td></td></tr></tbody></table>

</div><div id="bkmrk-error-response-6"><div id="bkmrk-error-response-7"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Error related to your payment method</span><span>Invalid Connection info, for example, sdp, ice</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-accept-call"><div id="bkmrk-accept-call-1"><div>#### Accept call

</div></div></div><div>Use this endpoint to connect to a call by providing a call agent’s SDP.</div><div>You have about 30 to 60 seconds after the [Call Connect Webhook](#bkmrk-call-connect-webhook-1) is sent to accept the phone call. If your business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](#bkmrk-call-terminate-webho-1) is delivered back to you.</div><div id="bkmrk-body-parameters-6"><div id="bkmrk-body-parameters-7"><div>##### Body parameters

</div></div></div><div id="bkmrk-error-response-9"><div id="bkmrk-error-response-10"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Error related to your payment method</span><span>Invalid Connection info, for example, sdp, ice, or other connection parameters</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><span>SDP answer provided in accept does not match the SDP answer given in the [Pre-Accept endpoint](#bkmrk-pre-accept-call-1) for the same `call-id`</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-reject-call"><div id="bkmrk-reject-call-1"><div>#### Reject call

</div></div></div><div>Use this endpoint to reject a call.</div><div>You have about 30 to 60 seconds after the [Call Connect webhook](#bkmrk-call-connect-webhook-1) is sent to accept the phone call. If the business does not respond, the call is terminated on the WhatsApp user side with a “Not Answered” notification and a [Terminate Webhook](#bkmrk-call-terminate-webho-1) is delivered back to you.</div><div id="bkmrk-body-parameters-9"><div id="bkmrk-body-parameters-10"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](#bkmrk-call-connect-webhook-1) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Optional**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“reject”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-12"><div id="bkmrk-error-response-13"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call-id`</span><span>Invalid `phone-number-id`</span><span>Accept/Reject an already In Progress/Completed/Failed call</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-initiate-call"><div id="bkmrk-initiate-call-1"><div>#### Initiate call

</div></div></div><div>Use this endpoint to initiate a call to a WhatsApp user by providing a phone number and a WebRTC call offer.</div><div id="bkmrk-body-parameters-12"><div id="bkmrk-body-parameters-13"><div>##### Body parameters

</div></div></div><div id="bkmrk-error-response-15"><div id="bkmrk-error-response-16"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `phone-number-id`</span><span>Permissions/Authorization errors</span><span>Request format validation errors, for example connection info, sdp, ice</span><span>SDP validation errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-terminate-call"><div id="bkmrk-terminate-call-1"><div>#### Terminate call

</div></div></div><div>Use this endpoint to terminate an active call.</div><div>This must be done even if there is an `RTCP BYE` packet in the media path. Ending the call this way also ensures pricing is more accurate.</div><div>When the WhatsApp user terminates the call, you do not have to call this endpoint. Once the call is successfully terminated, a [Call Terminate Webhook](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) will be sent to you.</div><div id="bkmrk-body-parameters-15"><div id="bkmrk-body-parameters-16"><div>##### Body parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`call_id`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The ID of the phone call.</div><div>For inbound calls, you receive a call ID from the [Call Connect webhook](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation) when a WhatsApp user initiates the call.</div></div></td><td><div><div>`“wacid.ABGGFjFVU2AfAgo6V-Hc5eCgK5Gh”`</div></div></td></tr><tr><td><div><div>`action`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The action being taken on the given call ID.</div><div>Values can be `connect` | `pre_accept` | `accept` | `reject` | `terminate`</div></div></td><td><div><div>`“terminate”`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-18"><div id="bkmrk-error-response-19"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `call id`</span><span>Invalid `phone-number-id`</span><span>The WhatsApp user has already terminated the call</span><span>Reject call is already in progress</span><span>Permissions/Authorization errors</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation).</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes).</div><div id="bkmrk-get-current-call-per"><div id="bkmrk-get-current-call-per-1"><div>#### Get current call permission state

</div></div></div><div>Use this endpoint to get the call permission state for a business phone number with a single WhatsApp user phone number.</div><div id="bkmrk-request-parameters"><div id="bkmrk-request-parameters-1"><div>##### Request parameters

</div></div></div><div><table><thead><tr><th><span>Parameter </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER_ID>`</div><div>*String*</div></div></td><td><div><div>**Required**</div><div>  
The business phone number you are fetching permissions against.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+18762639988`</div></div></td></tr><tr><td><div><div>`<CONSUMER_WHATSAPP_ID>`</div><div>*Integer*</div></div></td><td><div><div>**Required**</div><div>  
The phone number of the WhatsApp user who you are requesting call permissions from.</div><div>[Learn more about formatting phone numbers in Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation)</div></div></td><td><div><div>`+13057765456`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-error-response-21"><div id="bkmrk-error-response-22"><div>##### Error response

</div></div></div><div>Possible errors that can occur:</div><span>Invalid `phone-number-id`</span><span>If the consumer phone number is uncallable, the api response will be `no_permission`.</span><span>Permissions/Authorization errors.</span><span>Rate limit reached. A maximum of 5 requests in a 1 second window can be made to the API.</span><span>Calling is not enabled for the business phone number.</span><div>[View Calling API Error Codes and Troubleshooting for more information](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div>[View general Cloud API Error Codes here](/documentation/business-messaging/whatsapp/support/error-codes)</div><div id="bkmrk-sdp-overview-and-sam"><div id="bkmrk-sdp-overview-and-sam-1"><div>### SDP overview and sample SDP structures

</div></div></div><div>Session Description Protocol (SDP) is a text-based format that describes multimedia session characteristics, such as voice and video calls, in real-time communication applications. SDP provides a standardized way to convey information about the session’s media streams, including the type of media, codecs, protocols, and other parameters necessary for establishing and managing the session.</div><div>In the context of WebRTC, SDP is used to negotiate the media parameters between the sender and receiver, enabling them to agree on the specifics of the media exchange.</div><div id="bkmrk-business-initiated-s"><div id="bkmrk-business-initiated-s-1"><div>#### Business-initiated sample SDP structures

</div></div></div><div id="bkmrk-sample-sdp-offer-str"><div id="bkmrk-sample-sdp-offer-str-1"><div>##### Sample SDP offer structure

</div></div></div><div>```
<span>v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>3626166318745852955</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE </span><span>0</span><span>
a</span><span>=</span><span>extmap</span><span>-</span><span>allow</span><span>-</span><span>mixed
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS d8b26053</span><span>-</span><span>4474</span><span>-</span><span>4eb7</span><span>-</span><span>b3c3</span><span>-</span><span>c93d6c8c9b2e
m</span><span>=</span><span>audio </span><span>9</span><span> UDP</span><span>/</span><span>TLS</span><span>/</span><span>RTP</span><span>/</span><span>SAVPF </span><span>111</span><span>63</span><span>9</span><span>0</span><span>8</span><span>110</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>ufrag</span><span>:</span><span>4g1c</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>pwd</span><span>:</span><span>qY</span><span>/</span><span>Bb</span><span>+</span><span>jQzg5ICn6X4fhJQetk
a</span><span>=</span><span>ice</span><span>-</span><span>options</span><span>:</span><span>trickle
a</span><span>=</span><span>fingerprint</span><span>:</span><span>sha</span><span>-</span><span>256</span><span>35</span><span>:</span><span>47</span><span>:</span><span>24</span><span>:</span><span>24</span><span>:</span><span>9F</span><span>:</span><span>93</span><span>:</span><span>C4</span><span>:</span><span>3E</span><span>:</span><span>DB</span><span>:</span><span>37</span><span>:</span><span>7F</span><span>:</span><span>BB</span><span>:</span><span>ED</span><span>:</span><span>F8</span><span>:</span><span>20</span><span>:</span><span>B5</span><span>:</span><span>AD</span><span>:</span><span>AC</span><span>:</span><span>DC</span><span>:</span><span>35</span><span>:</span><span>C2</span><span>:</span><span>7D</span><span>:</span><span>67</span><span>:</span><span>EE</span><span>:</span><span>6C</span><span>:</span><span>35</span><span>:</span><span>54</span><span>:</span><span>DF</span><span>:</span><span>A6</span><span>:</span><span>00</span><span>:</span><span>5C</span><span>:</span><span>4A</span><span>
a</span><span>=</span><span>setup</span><span>:</span><span>actpass
a</span><span>=</span><span>mid</span><span>:</span><span>0</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>1</span><span> urn</span><span>:</span><span>ietf</span><span>:</span><span>params</span><span>:</span><span>rtp</span><span>-</span><span>hdrext</span><span>:</span><span>ssrc</span><span>-</span><span>audio</span><span>-</span><span>level
a</span><span>=</span><span>extmap</span><span>:</span><span>2</span><span> http</span><span>:</span><span>//www.webrtc.org/experiments/rtp-hdrext/abs-send-time</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>3</span><span> http</span><span>:</span><span>//www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>4</span><span> urn</span><span>:</span><span>ietf</span><span>:</span><span>params</span><span>:</span><span>rtp</span><span>-</span><span>hdrext</span><span>:</span><span>sdes</span><span>:</span><span>mid
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>msid</span><span>:</span><span>d8b26053</span><span>-</span><span>4474</span><span>-</span><span>4eb7</span><span>-</span><span>b3c3</span><span>-</span><span>c93d6c8c9b2e </span><span>5b4d3d96</span><span>-</span><span>ea9b</span><span>-</span><span>44a8</span><span>-</span><span>87e6</span><span>-</span><span>11a1ad21a3bc</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>fb</span><span>:</span><span>111</span><span> transport</span><span>-</span><span>cc
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> minptime</span><span>=</span><span>10</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>63</span><span> red</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>fmtp</span><span>:</span><span>63</span><span>111</span><span>/</span><span>111</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>9</span><span> G722</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>0</span><span> PCMU</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>8</span><span> PCMA</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>110</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>48000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>2220762577</span><span> cname</span><span>:</span><span>w</span><span>/</span><span>zwpg3jXNiTFTdZ
a</span><span>=</span><span>ssrc</span><span>:</span><span>2220762577</span><span> msid</span><span>:</span><span>d8b26053</span><span>-</span><span>4474</span><span>-</span><span>4eb7</span><span>-</span><span>b3c3</span><span>-</span><span>c93d6c8c9b2e </span><span>5b4d3d96</span><span>-</span><span>ea9b</span><span>-</span><span>44a8</span><span>-</span><span>87e6</span><span>-</span><span>11a1ad21a3bc</span>
```

</div><div id="bkmrk-sample-sdp-answer-st"><div id="bkmrk-sample-sdp-answer-st-1"><div>##### Sample SDP answer structure

</div></div></div><div>```
<span>v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>741807839102053725</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE </span><span>0</span><span>
a</span><span>=</span><span>extmap</span><span>-</span><span>allow</span><span>-</span><span>mixed
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>798a9670</span><span>-</span><span>c0d6</span><span>-</span><span>47a8</span><span>-</span><span>925e-5f082ef4d8a0</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>lite
m</span><span>=</span><span>audio </span><span>3482</span><span> UDP</span><span>/</span><span>TLS</span><span>/</span><span>RTP</span><span>/</span><span>SAVPF </span><span>111</span><span>9</span><span>0</span><span>8</span><span>110</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>31.13</span><span>.</span><span>65.130</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>2754936280</span><span>1</span><span> udp </span><span>2113937151</span><span>31.13</span><span>.</span><span>65.130</span><span>3482</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span> ufrag </span><span>JHqAXFH4HcAY</span><span>/</span><span>8</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>1581496399</span><span>1</span><span> udp </span><span>2113939711</span><span>2a03</span><span>:</span><span>2880</span><span>:</span><span>f211</span><span>:</span><span>d1</span><span>:</span><span>face</span><span>:</span><span>b00c</span><span>:</span><span>0</span><span>:</span><span>699c</span><span>3482</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span> ufrag </span><span>JHqAXFH4HcAY</span><span>/</span><span>8</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>ufrag</span><span>:</span><span>JHqAXFH4HcAY</span><span>/</span><span>8</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>pwd</span><span>:</span><span>dNNMmR8wUcGezvfBZOO0Qgcwl2m86GP</span><span>/</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>options</span><span>:</span><span>trickle
a</span><span>=</span><span>fingerprint</span><span>:</span><span>sha</span><span>-</span><span>256</span><span>9C</span><span>:</span><span>97</span><span>:</span><span>5C</span><span>:</span><span>4C</span><span>:</span><span>A9</span><span>:</span><span>BE</span><span>:</span><span>9E</span><span>:</span><span>2F</span><span>:</span><span>06</span><span>:</span><span>94</span><span>:</span><span>F5</span><span>:</span><span>BB</span><span>:</span><span>38</span><span>:</span><span>2C</span><span>:</span><span>A1</span><span>:</span><span>29</span><span>:</span><span>B5</span><span>:</span><span>69</span><span>:</span><span>B8</span><span>:</span><span>FA</span><span>:</span><span>94</span><span>:</span><span>10</span><span>:</span><span>56</span><span>:</span><span>1D</span><span>:</span><span>0B</span><span>:</span><span>5D</span><span>:</span><span>80</span><span>:</span><span>28</span><span>:</span><span>C1</span><span>:</span><span>FD</span><span>:</span><span>F0</span><span>:</span><span>F6
a</span><span>=</span><span>setup</span><span>:</span><span>active
a</span><span>=</span><span>mid</span><span>:</span><span>0</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>1</span><span> urn</span><span>:</span><span>ietf</span><span>:</span><span>params</span><span>:</span><span>rtp</span><span>-</span><span>hdrext</span><span>:</span><span>ssrc</span><span>-</span><span>audio</span><span>-</span><span>level
a</span><span>=</span><span>extmap</span><span>:</span><span>2</span><span> http</span><span>:</span><span>//www.webrtc.org/experiments/rtp-hdrext/abs-send-time</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>3</span><span> http</span><span>:</span><span>//www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01</span><span>
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>fb</span><span>:</span><span>111</span><span> transport</span><span>-</span><span>cc
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> minptime</span><span>=</span><span>10</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>9</span><span> G722</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>0</span><span> PCMU</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>8</span><span> PCMA</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>110</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>48000</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>3407645770</span><span> cname</span><span>:</span><span>bg8KQDoIk2UJa6sf
a</span><span>=</span><span>ssrc</span><span>:</span><span>3407645770</span><span> msid</span><span>:</span><span>798a9670</span><span>-</span><span>c0d6</span><span>-</span><span>47a8</span><span>-</span><span>925e-5f082ef4d8a0</span><span> audio</span><span>#nuxVMf9EAJX</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>3407645770</span><span> mslabel</span><span>:</span><span>798a9670</span><span>-</span><span>c0d6</span><span>-</span><span>47a8</span><span>-</span><span>925e-5f082ef4d8a0</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>3407645770</span><span> label</span><span>:</span><span>audio</span><span>#nuxVMf9EAJX</span>
```

</div><div id="bkmrk-user-initiated-sampl"><div id="bkmrk-user-initiated-sampl-1"><div>#### User-initiated sample SDP structures

</div></div></div><div id="bkmrk-sample-sdp-offer-str-3"><div id="bkmrk-sample-sdp-offer-str-4"><div>##### Sample SDP offer structure

</div></div></div><div>```
<span>v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>7602563789789945080</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS </span><span>6932bc1c</span><span>-</span><span>db1a</span><span>-</span><span>4abe</span><span>-</span><span>b437</span><span>-</span><span>0c4168be8a13</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>lite
m</span><span>=</span><span>audio </span><span>40012</span><span> UDP</span><span>/</span><span>TLS</span><span>/</span><span>RTP</span><span>/</span><span>SAVPF </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>31.13</span><span>.</span><span>65.60</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>1972637320</span><span>1</span><span> udp </span><span>2113937151</span><span>31.13</span><span>.</span><span>65.60</span><span>40012</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span> ufrag </span><span>6k2qP1R6kBfI</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>candidate</span><span>:</span><span>1652262791</span><span>1</span><span> udp </span><span>2113939711</span><span>2a03</span><span>:</span><span>2880</span><span>:</span><span>f211</span><span>:</span><span>cf</span><span>:</span><span>face</span><span>:</span><span>b00c</span><span>:</span><span>0</span><span>:</span><span>6443</span><span>40012</span><span> typ host generation </span><span>0</span><span> network</span><span>-</span><span>cost </span><span>50</span><span> ufrag </span><span>6k2qP1R6kBfI</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>ufrag</span><span>:</span><span>6k2qP1R6kBfI</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>pwd</span><span>:</span><span>UApvJw3NcwFRDvIMKdM0vWCdlXah25E9</span><span>
a</span><span>=</span><span>fingerprint</span><span>:</span><span>sha</span><span>-</span><span>256</span><span>1B</span><span>:</span><span>B6</span><span>:</span><span>6B</span><span>:</span><span>40</span><span>:</span><span>A5</span><span>:</span><span>0B</span><span>:</span><span>8C</span><span>:</span><span>75</span><span>:</span><span>0D</span><span>:</span><span>8C</span><span>:</span><span>CB</span><span>:</span><span>90</span><span>:</span><span>2F</span><span>:</span><span>99</span><span>:</span><span>74</span><span>:</span><span>1E</span><span>:</span><span>26</span><span>:</span><span>45</span><span>:</span><span>AE</span><span>:</span><span>AF</span><span>:</span><span>45</span><span>:</span><span>C1</span><span>:</span><span>51</span><span>:</span><span>60</span><span>:</span><span>8F</span><span>:</span><span>73</span><span>:</span><span>C9</span><span>:</span><span>2D</span><span>:</span><span>10</span><span>:</span><span>6D</span><span>:</span><span>8A</span><span>:</span><span>88</span><span>
a</span><span>=</span><span>setup</span><span>:</span><span>actpass
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>extmap</span><span>:</span><span>1</span><span> urn</span><span>:</span><span>ietf</span><span>:</span><span>params</span><span>:</span><span>rtp</span><span>-</span><span>hdrext</span><span>:</span><span>ssrc</span><span>-</span><span>audio</span><span>-</span><span>level
a</span><span>=</span><span>extmap</span><span>:</span><span>2</span><span> http</span><span>:</span><span>//www.webrtc.org/experiments/rtp-hdrext/abs-send-time</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>3</span><span> http</span><span>:</span><span>//www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01</span><span>
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>fb</span><span>:</span><span>111</span><span> transport</span><span>-</span><span>cc
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> minptime</span><span>=</span><span>10</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>4208138518</span><span> cname</span><span>:</span><span>gAXq2V9TKltrnapv
a</span><span>=</span><span>ssrc</span><span>:</span><span>4208138518</span><span> msid</span><span>:</span><span>6932bc1c</span><span>-</span><span>db1a</span><span>-</span><span>4abe</span><span>-</span><span>b437</span><span>-</span><span>0c4168be8a13</span><span> audio</span><span>#R5wfXFcdmT6</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>4208138518</span><span> mslabel</span><span>:</span><span>6932bc1c</span><span>-</span><span>db1a</span><span>-</span><span>4abe</span><span>-</span><span>b437</span><span>-</span><span>0c4168be8a13</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>4208138518</span><span> label</span><span>:</span><span>audio</span><span>#R5wfXFcdmT6</span>
```

</div><div id="bkmrk-sample-sdp-answer-st-3"><div id="bkmrk-sample-sdp-answer-st-4"><div>##### Sample SDP answer structure

</div></div></div><div>```
<span>v</span><span>=</span><span>0</span><span>
o</span><span>=-</span><span>2822644248144643933</span><span>2</span><span> IN IP4 </span><span>127.0</span><span>.</span><span>0.1</span><span>
s</span><span>=-</span><span>
t</span><span>=</span><span>0</span><span>0</span><span>
a</span><span>=</span><span>group</span><span>:</span><span>BUNDLE audio
a</span><span>=</span><span>msid</span><span>-</span><span>semantic</span><span>:</span><span> WMS eb909cf0</span><span>-</span><span>87f0</span><span>-</span><span>4358</span><span>-</span><span>a4c9</span><span>-</span><span>7861680d9431</span><span>
m</span><span>=</span><span>audio </span><span>9</span><span> UDP</span><span>/</span><span>TLS</span><span>/</span><span>RTP</span><span>/</span><span>SAVPF </span><span>111</span><span>126</span><span>
c</span><span>=</span><span>IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>rtcp</span><span>:</span><span>9</span><span> IN IP4 </span><span>0.0</span><span>.</span><span>0.0</span><span>
a</span><span>=</span><span>ice</span><span>-</span><span>ufrag</span><span>:</span><span>X1ho
a</span><span>=</span><span>ice</span><span>-</span><span>pwd</span><span>:</span><span>7fJSbV2N5qWiA5QiDKwK3vuh</span><span>
a</span><span>=</span><span>fingerprint</span><span>:</span><span>sha</span><span>-</span><span>256</span><span>2E</span><span>:</span><span>35</span><span>:</span><span>9F</span><span>:</span><span>21</span><span>:</span><span>9E</span><span>:</span><span>63</span><span>:</span><span>72</span><span>:</span><span>E5</span><span>:</span><span>42</span><span>:</span><span>74</span><span>:</span><span>76</span><span>:</span><span>2D</span><span>:</span><span>B3</span><span>:</span><span>70</span><span>:</span><span>F7</span><span>:</span><span>CB</span><span>:</span><span>24</span><span>:</span><span>14</span><span>:</span><span>9B</span><span>:</span><span>14</span><span>:</span><span>52</span><span>:</span><span>71</span><span>:</span><span>05</span><span>:</span><span>48</span><span>:</span><span>DA</span><span>:</span><span>4D</span><span>:</span><span>67</span><span>:</span><span>31</span><span>:</span><span>09</span><span>:</span><span>58</span><span>:</span><span>2A</span><span>:</span><span>ED
a</span><span>=</span><span>setup</span><span>:</span><span>active
a</span><span>=</span><span>mid</span><span>:</span><span>audio
a</span><span>=</span><span>extmap</span><span>:</span><span>1</span><span> urn</span><span>:</span><span>ietf</span><span>:</span><span>params</span><span>:</span><span>rtp</span><span>-</span><span>hdrext</span><span>:</span><span>ssrc</span><span>-</span><span>audio</span><span>-</span><span>level
a</span><span>=</span><span>extmap</span><span>:</span><span>2</span><span> http</span><span>:</span><span>//www.webrtc.org/experiments/rtp-hdrext/abs-send-time</span><span>
a</span><span>=</span><span>extmap</span><span>:</span><span>3</span><span> http</span><span>:</span><span>//www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01</span><span>
a</span><span>=</span><span>sendrecv
a</span><span>=</span><span>rtcp</span><span>-</span><span>mux
a</span><span>=</span><span>rtpmap</span><span>:</span><span>111</span><span> opus</span><span>/</span><span>48000</span><span>/</span><span>2</span><span>
a</span><span>=</span><span>rtcp</span><span>-</span><span>fb</span><span>:</span><span>111</span><span> transport</span><span>-</span><span>cc
a</span><span>=</span><span>fmtp</span><span>:</span><span>111</span><span> minptime</span><span>=</span><span>10</span><span>;</span><span>useinbandfec</span><span>=</span><span>1</span><span>
a</span><span>=</span><span>rtpmap</span><span>:</span><span>126</span><span> telephone</span><span>-</span><span>event</span><span>/</span><span>8000</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>330833028</span><span> cname</span><span>:</span><span>EDc1JutBl8rwHQc2</span><span>
a</span><span>=</span><span>ssrc</span><span>:</span><span>330833028</span><span> msid</span><span>:</span><span>eb909cf0</span><span>-</span><span>87f0</span><span>-</span><span>4358</span><span>-</span><span>a4c9</span><span>-</span><span>7861680d9431</span><span> ea478c16</span><span>-</span><span>d9f7</span><span>-</span><span>493c</span><span>-</span><span>8cec</span><span>-</span><span>19bfac750a36</span>
```

</div><div id="bkmrk-sample-call-connect-"><div id="bkmrk-sample-call-connect--1"><div>### Sample call connect webhook

</div></div></div><div id="bkmrk-call-connect-webhook-3"><div id="bkmrk-call-connect-webhook-4"><div>##### Call connect webhook

</div></div></div></div>

# Troubleshoot WhatsApp Calling Errors - Reference Guide | Developer Documentation

<div id="bkmrk-troubleshoot-whatsap">## Troubleshoot WhatsApp Calling Errors - Reference Guide

<div><span>Updated: Dec 3, 2025</span></div><div id="bkmrk-standard-error-respo"><div id="bkmrk-standard-error-respo-1"><div>### Standard error response

</div></div></div><div>When you receive an error, in the majority of cases the error shape will look like this:</div><div></div><div>Use the Calling API error codes list below to identify and resolve calling errors.</div><div id="bkmrk-calling-logs"><div id="bkmrk-calling-logs-1"><div>### Calling logs

</div></div></div><div>The **Call Logs** tab in [WhatsApp Manager<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/phone_numbers) provides businesses and partners with a detailed, self-service view of call events to aid in call troubleshooting.</div><div>The tab displays a table of recent call logs for your business phone numbers. Each call has a log. Each log can have multiple events representing a Graph API request made by the business or a webhook sent by Meta. Each row represents a call, with different columns highlighted to provide information about each call log.</div><div id="bkmrk-how-to-view-call-log"><div id="bkmrk-how-to-view-call-log-1"><div>#### How to view call logs

</div></div></div>
<span>Navigate to [WhatsApp Manager &gt; Account tools &gt; Phone numbers<span>⁠</span>](https://business.facebook.com/latest/whatsapp_manager/phone_numbers)</span><span>Select the desired phone number to view the call logs</span><div id="bkmrk-call-logs-and-events"><div id="bkmrk-call-logs-and-events-1"><div>#### Call logs and events

</div></div></div><div><table><thead><tr><th><span>Field </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>Timestamp</div></div></td><td><div><div>Timestamp of when the call occurred.</div></div></td></tr><tr><td><div><div>Call Direction</div></div></td><td><div><div>Outbound (Business-initiated) or Inbound (User-initiated).</div></div></td></tr><tr><td><div><div>Signaling</div></div></td><td><div><div>Signaling Protocol used to establish the call (SIP, GRAPH_API).</div></div></td></tr><tr><td><div><div>Call ID</div></div></td><td><div><div>WhatsApp call identifier.   
**Note: Please provide this ID when requesting support.**</div></div></td></tr><tr><td><div><div>Request ID</div></div></td><td><div><div>Identifier for the request that initiated the call.</div></div></td></tr><tr><td><div><div>Call Details</div></div></td><td><div><div>Additional information containing a log of events during the lifecycle of the call.</div></div></td></tr></tbody></table>

</div><div id="bkmrk-calling-error-codes"><div id="bkmrk-calling-error-codes-1"><div>### Calling error codes

</div></div></div><div><table><thead><tr><th><span>Code </span></th><th><span>Description </span></th><th><span>Possible Solutions </span></th><th><span>HTTP Status Code </span></th></tr></thead><tbody><tr><td><div><div>`100`</div><div>Invalid Parameter</div></div></td><td><div><div>The Graph API call you are making has an invalid parameter.</div></div></td><td><div><div>Exact error details will be listed in the `error_data` section of the response payload.</div><div>If it’s an SDP validation related error then the exact issue will be included in the details.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`613`</div><div>Fetch Call Permission For Consumer Phone Number API Limit Hit</div></div></td><td><div><div>Limit reached for requests to the fetch call permission status API.</div></div></td><td><div><div>Try again later or reduce the frequency or amount of requests to the API the app is making.</div></div></td><td><div><div>`429`</div><div>Too many requests</div></div></td></tr><tr><td><div><div>`131009`</div></div></td><td><div><div>Interactive Message type, `voice_call` not supported. Supported types [`button`, `list`]</div></div></td><td><div><div>Ensure the sender is in one of the [supported countries](/books/meta-whatsapp/page/faqs-developer-documentation).</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`131030`</div></div></td><td><div><div>Recipient phone number is not in allowed list.</div><div>The error is thrown for both attempted calls and call permission requests.</div><div>Only occurs when using public test numbers (PTNs).</div></div></td><td><div><div>Add a recipient phone number to recipient list and try again.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138000`</div><div>Calling not enabled</div></div></td><td><div><div>Calling APIs are not enabled for this phone number</div></div></td><td><div><div>Calling is not enabled on the business phone number.</div><div>[Configure call settings to enable Calling API features](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div></div></td><td><div><div>`401`</div><div>Unauthorized</div></div></td></tr><tr><td><div><div>`138001`</div><div>Receiver Uncallable</div></div></td><td><div><div>Receiver is unable to receive calls</div><div>Reasons can include:</div>
<span>The recipient phone number is not a WhatsApp phone number.</span><span>The recipient has not accepted our new Terms of Service and Privacy Policy.</span><span>Recipient using an unsupported client. The currently supported clients are Android, iOS, SMB Android and SMB iOS</span></div></td><td><div><div>Confirm with the recipient that they agree to be contacted by you over WhatsApp and are using the latest version of WhatsApp.</div></div></td><td><div><div>`400`</div><div>Bad Request</div></div></td></tr><tr><td><div><div>`138002`</div><div>Concurrent Calls limit</div></div></td><td><div><div>Limit reached for maximum concurrent calls (1000) for the given number</div></div></td><td><div><div>Try again later or reduce the frequency or amount of API calls the app is making.</div></div></td><td><div><div>`429`</div><div>Too many requests</div></div></td></tr><tr><td><div><div>`138003`</div><div>Duplicate call</div></div></td><td><div><div>A call is already ongoing with the receiver</div></div></td><td><div><div>Try again later when the current call ends.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138004`</div><div>Connection error</div></div></td><td><div><div>Error while connecting the call</div></div></td><td><div><div>Try again later or investigate the connection params provided to the API.</div></div></td><td><div><div>`500`</div><div>Server error</div></div></td></tr><tr><td><div><div>`138005`</div><div>Call rate limit exceeded</div></div></td><td><div><div>Limit reached for maximum calls that can be initiated by the business phone number</div></div></td><td><div><div>Try again later or reduce the frequency or amount of API calls the app is making.</div></div></td><td><div><div>`429`</div><div>Too many requests</div></div></td></tr><tr><td><div><div>`138006`</div><div>No approved call permission found</div></div></td><td><div><div>No approved [call permission](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation) from the recipient</div></div></td><td><div><div>Ensure a call permission has been accepted by the consumer</div></div></td><td><div><div>`401`</div><div>Unauthorized</div></div></td></tr><tr><td><div><div>`138007`</div><div>Connect Timeout error</div></div></td><td><div><div>Call was unable to connect due to a timeout</div></div></td><td><div><div>Business did not apply the offer/answer SDP from Cloud API in time. Connect API was not invoked with the answer SDP in time</div></div></td><td><div><div>`500`</div><div>Server error</div></div></td></tr><tr><td><div><div>`138009`</div><div>Call Permission Request Limit Hit</div></div></td><td><div><div>Limit reached for call permission request sends for the given business and consumer pair</div></div></td><td><div><div>When a business sends more than the limit of call permission requests per time period, Call Permission Requests are rate limited. A connected call with a consumer will reset the limits.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138012`</div><div>Business Initiated Calls Limit Hit</div></div></td><td><div><div>Limit reached for maximum business initiated calls allowed in 24 hours. Currently 100 connected business initiated calls are allowed within 24 hours.</div></div></td><td><div><div>Exact error details will be listed in the `error_data` section of the response payload.</div><div>Details will include a timestamp when the next call is allowed.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138013`</div><div>Business-initiated calling is not available</div></div></td><td><div><div>Business-initiated calling is not available for this business account phone number.</div></div></td><td><div><div>Confirm that Business Initiated calling is available for this business account phone number in the [availability section here](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation).</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138014`</div><div>Calling is temporarily disabled</div></div></td><td><div><div>Calling APIs for this WhatsApp Business Number have been temporarily disabled for having low quality.</div></div></td><td><div><div>Ensure that your outreach to users is valuable and not spam.</div><div>Retry the action after the account restrictions are lifted.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138015`</div><div>Calling cannot be enabled</div></div></td><td><div><div>Calling APIs cannot be enabled for this phone number.</div></div></td><td><div><div>Check and make sure [messaging limit](/books/meta-whatsapp/page/messaging-limits-developer-documentation) on your phone number is 2000 or more</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138017`</div><div>Call permission request can’t be sent because a permanent permission already exists.</div></div></td><td><div><div>Call permission request cannot be sent because a permanent permission has already been approved by the user for this business account phone number.</div></div></td><td><div><div>No need to send call permission requests.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138018`</div><div>WhatsApp Business calling cannot be enabled because technical pre-requisites are not met.</div></div></td><td><div><div>See [prerequisites](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) for more details</div></div></td><td><div><div>[Configure SIP](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) or ensure there is at-least one app subscribed to the WhatsApp Business Account that also has subscription to the `calls` webhook field.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138019`</div><div>Call setup failed</div></div></td><td><div><div>The WhatsApp client failed to set up the call.</div><div>This error is sent in the call terminate webhook.</div></div></td><td><div><div>Try again later.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138020`</div><div>Relay connection failed</div></div></td><td><div><div>The WhatsApp client failed to establish a connection with the relay server.</div><div>This error is sent in the call terminate webhook.</div></div></td><td><div><div>Try again later.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138021`</div><div>Media receive timeout</div></div></td><td><div><div>The WhatsApp client terminated the call due to not receiving any media for a long time.</div><div>This error is sent in the call terminate webhook.</div></div></td><td><div><div>Confirm that call media is being sent to the relay and try again.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138022`</div><div>Media transmit timeout</div></div></td><td><div><div>The WhatsApp client terminated the call due to not transmitting any media for a long time.</div><div>This error is sent in the call terminate webhook.</div></div></td><td><div><div>Try again later.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`138023`</div><div>Call accepted but terminated with no media signals</div></div></td><td><div><div>The call was accepted but terminated with no media connection signals.</div><div>Cloud API could not determine if the call was connected.</div><div>This error is sent in the call terminate webhook.</div></div></td><td><div><div>Try again later.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`131044`</div></div></td><td><div><div>An error webhook is sent on user initiated calls when there is no valid payment method attached</div></div></td><td><div><div>This is similar to the [“Business eligibility payment issue”](/documentation/business-messaging/whatsapp/support/error-codes) error in messaging.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr><tr><td><div><div>`131055`</div></div></td><td><div><div>Method not allowed. Graph API calls are not allowed for SIP enabled numbers</div></div></td><td><div><div>Use [SIP](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) for SIP enabled business numbers.</div></div></td><td><div><div>`400`</div><div>Bad request</div></div></td></tr></tbody></table>

</div><div id="bkmrk-sip-errors"><div id="bkmrk-sip-errors-1"><div>### SIP errors

</div></div></div><div>Also refer to [SIP specific FAQ](/books/meta-whatsapp/page/faqs-developer-documentation) for additional troubleshooting info</div><div id="bkmrk-business-initiated-c"><div id="bkmrk-business-initiated-c-1"><div>#### Business initiated calls

</div></div></div><div><table><thead><tr><th><span>SIP status and message </span></th><th><span>Description </span></th><th><span>Possible Solutions </span></th></tr></thead><tbody><tr><td><div><div>`400`</div><div>Asset not found, invalid business phone number</div></div></td><td><div><div>The phone number in the `From` header of the INVITE is invalid and does not correspond to a registered account on WhatsApp Business Platform</div></div></td><td><div><div>Check the phone number and resend the INVITE with the correct `From` header value. See [examples](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div></div></td></tr><tr><td><div><div>`403`</div><div>SIP server `foo.com` from INVITE does not match any SIP server configured for phone number id [ID]</div></div></td><td><div><div>Your SIP INVITE to Meta has ‘foo.com’ in the `From` header (for example, `15555551234@foo.com`). But there is no SIP server with that hostname [configured](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on the business phone number.</div></div></td><td><div><div>Check your [SIP configuration](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) and ensure it matches the domain used in the `From` header. The `hostname` in the [SIP configuration](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) should match the domain in the `From` header of your SIP INVITE. It is also valid for the SIP configuration `hostname` to be a sub-domain of the domain in `From` header. For example, SIP server configured is `bar.foo.com` and the From header is `15555551234@foo.com`</div></div></td></tr><tr><td><div><div>`403`</div><div>No Approved Call Permission Found: No approved call permission from the recipient</div></div></td><td><div><div>There is no WhatsApp user with specified number or user has not accepted our new Terms of Service or there is no permission from user to call the business. Meta can’t reveal if a phone number is on WhatsApp with certainty, due to privacy reasons. So this is the same error you’ll receive for multiple reasons.</div></div></td><td><div><div>Double check the user phone number and make sure you obtain the user permission. See [Obtain User Call Permissions ](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)for more information</div></div></td></tr><tr><td><div><div>`403`</div><div>The app [APP_ID] configured for SIP server `example.com` is not authorized for phone number id [ID]</div></div></td><td><div><div>When you configure SIP server on a business phone, Meta extracts the app id from the access token and stores a mapping from the SIP server to that app id. When you send a SIP INVITE, Meta consults that mapping to know which app is making the SIP request. This error means that app does not have `whatsapp_business_messaging` permission on the business phone.</div></div></td><td><div><div>Check that you are using the right app and make sure it has permissions on the business phone. If you’re able to [send message](/books/meta-whatsapp/page/sending-messages-developer-documentation) using the app’s access token, that means the app has the right permission. Otherwise you may need to delete and add your SIP server with the correct app and retry your SIP INVITE. See [Configuring SIP settings](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</div></div></td></tr><tr><td><div><div>`403`</div><div>Business Initiated Connected Call Per Day Limit Hit</div></div></td><td><div><div>Limit reached for maximum business initiated calls allowed in 24 hours. Currently 5 connected business initiated calls are allowed within 24 hours.</div></div></td><td><div><div>See more info about the [limits](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation) and adjust your calling rate accordingly</div></div></td></tr><tr><td><div><div>`403`</div><div>Additional reasons for 403 include</div>
<span>Duplicate call because there can be only one active between a given business and user account</span><span>Invalid digest auth response</span><span>Business eligibility payment issue</span><span>SDP Validation Error</span></div></td><td><div><div>Read each error for details</div></div></td><td><div><div>Consult earlier sections in this page like [Calling error codes](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div></div></td></tr><tr><td><div><div>`404`</div><div>Not found</div></div></td><td><div><div>SIP INVITEs using IP in request URI are not allowed</div></div></td><td><div><div>Use the correct request URI. See [examples](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div></div></td></tr><tr><td><div><div>`407`</div><div>Proxy Authentication Required</div></div></td><td><div><div>Meta mandates digest authentication for your SIP INVITEs and this is the standard challenge response from Meta</div></div></td><td><div><div>Resend the SIP INVITE with digest response. See [examples](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div></div></td></tr><tr><td><div><div>`408`</div><div>RTP Timeout</div></div></td><td><div><div>The WhatsApp client terminated the call due to not receiving any media for a long time.</div></div></td><td><div><div>See [Media related issues](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div></div></td></tr><tr><td><div><div>`480`</div><div>Temporarily Unavailable</div></div></td><td><div><div>WhatsApp user is not reachable or did not answer the call</div></div></td><td><div><div>Try messaging or calling later. Unanswered calls impact call permissions. [Learn more](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div></div></td></tr><tr><td><div><div>`486`</div><div>User declined the call</div></div></td><td><div><div>WhatsApp user declined your call</div></div></td><td><div><div>Try messaging or calling later. Rejected calls impact call permissions. [Learn more](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation)</div></div></td></tr><tr><td><div><div>`487`</div><div>Request Terminated</div></div></td><td><div><div>Business canceled their SIP INVITE using SIP CANCEL</div></div></td><td><div><div>Expected return for your SIP INVITE when you CANCEL the INVITE before Meta response to your INVITE</div></div></td></tr><tr><td><div><div>`503`</div><div>Service Unavailable</div></div></td><td><div><div>Generic internal error.</div></div></td><td><div><div>Retry your request after some time or consult Meta support</div></div></td></tr></tbody></table>

</div><div id="bkmrk-media-related-issues"><div id="bkmrk-media-related-issues-1"><div>### Media related issues

</div></div></div><div><table><thead><tr><th><span>Issue </span></th><th><span>Description </span></th><th><span>Possible Solutions </span></th></tr></thead><tbody><tr><td><div><div>Call disconnects after 20 seconds into the call</div></div></td><td><div><div>At the start of the call, if there is no media flowing from business to WhatsApp user for 20 seconds, WhatsApp client will disconnect the call due to no media</div></div></td><td><div>
<span>Check your media server to make sure it’s initiating the media session and sending media packets</span><span>Check your firewall to rule out any packet drops at your edge</span><span>Capture network traffic using pcap or a similar tool and attach it to the support ticket for further troubleshooting by Meta</span></div></td></tr><tr><td><div><div>Can’t hear audio and call disconnects after 30 seconds</div></div></td><td><div><div>After the call is connected and established, if there is no media packet from business to WhatsApp user for 30 seconds, WhatsApp client will disconnect the call due to no media reception</div></div></td><td><div>
<span>Make sure you’re at-least sending RTCP packets even when there is silence or when you are waiting for user input (for example, IVR)</span><span>Check your media server to understand why it stops sending media packets to Meta</span><span>Capture network traffic using pcap or a similar tool and attach it to the support ticket for further troubleshooting by Meta</span></div></td></tr></tbody></table>

</div><div id="bkmrk-audio-clipping-issue"><div id="bkmrk-audio-clipping-issue-1"><div>### Audio clipping issue and solution

</div></div></div><div>When bridging the WhatsApp Consumer media leg via WebRTC to another media leg, such as [SIP<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc3261&h=AT6wIT1U0B7nAgDvd_5gYYUZ8P1NriwWNsk_ok5tZgTWrw2PNmQOCj4_wQCjjnV0xWqbZ_hpd4G832tYZgUXg8MM9npHB77fj6nkXDdDjn70mYgFFeGSMCBZyAJJVCSAmSjbYKWbj59o-MHhRukGuw), it’s important to be aware of potential audio clipping issues and how to prevent them. A common symptom of this issue is that the WhatsApp consumer may miss approximately one second of audio from the business. For instance, if an IVR system is playing a sequence like “1-2-3,” the consumer might only hear “2” or “3.” The extent of audio loss varies based on the specific integration and the severity of the issue.</div><div>The sequence diagram below illustrates this problem using an example where the WebRTC leg from the Cloud API is bridged with a SIP media leg. Depending on the SIP vendor and implementation, the media from the SIP User Agent might start playing at step 11, but it won’t reach the WhatsApp consumer until step 18.</div><div id="bkmrk-sequence-diagram"><div id="bkmrk-sequence-diagram-1"><div>#### Sequence diagram

</div></div></div><div>![Sequence diagram showing WebRTC to SIP call bridging flow](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-xl7vwq0c.jpeg) (*Right click image and choose “Open in new tab” for enlarged image*)</div><div id="bkmrk-components-of-the-se"><div id="bkmrk-components-of-the-se-1"><div>##### Components of the sequence diagram

</div></div></div>
<span>*WAConsumer* is a WhatsApp user calling the business phone number using WhatsApp mobile app</span><span>*Meta* is the Cloud API product</span><span>*MetaWebrtcEndpoint* is the WebRTC agent on the Meta infrastructure</span><span>*BizIntegration* is the webhook server receiving calls related webhooks and the app server with business logic to invoke Cloud API Graph APIs</span><span>*BizWebrtcEndpoint* is the WebRTC termination point as well as the SIP UAC typically in a media server on your side.</span><span>*BizSipEndpoint* is the SIP User Agent (UA) often representing IVR or Business Agent.</span><div id="bkmrk-key-points-to-note"><div id="bkmrk-key-points-to-note-1"><div>##### Key points to note

</div></div></div>
<span>Upon receiving the connect webhook (step 5 above), initialize your WebRTC agent, prepare the SDP answer, and make the Pre-accept Graph API call with the SDP answer. This pre-establishes the WebRTC connection in anticipation of an ‘accept/ok’ response from the SIP User Agent (UA). In most cases, the consumer’s call is answered, such as by an automated recording or IVR system.</span><span>At step 11 above, wait for the ICE process to complete the creation of valid lists, indicating the near completion of ICE connection establishment (RFC reference).</span><span>If the SIP UA rejects the call instead of returning a 200 OK, use the terminate Graph API to end the call.</span><span>If the consumer connection is ready before the SIP connection, the consumer may experience a few milliseconds of silence, which is preferable to losing some initial audio from the business.</span><div id="bkmrk-root-cause"><div id="bkmrk-root-cause-1"><div>#### Root cause

</div></div></div><div>When bridging two media legs, it’s crucial for the media server to synchronize their readiness to prevent audio clipping. In this scenario, the BizWebrtcEndpoint is allowing the SIP User Agent (UA) to transmit media significantly earlier than the WebRTC leg is prepared to receive it. As a result, packets are being dropped at the media server, leading to audio clipping issues.</div><div id="bkmrk-suggested-solutions"><div id="bkmrk-suggested-solutions-1"><div>#### Suggested solutions

</div></div></div><div>Below is a high-level summary of alternative approaches to address audio clipping, intended to stimulate discussion and consideration. While each option has its drawbacks, you can assess their feasibility in the context of your specific requirements.</div>
<span>**Use SDES**: [Configure SDES](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) on your business number instead of DTLS. A common reason for delayed setup of the media leg between your infrastructure and Meta is DTLS handshake completion. Meta cannot complete DTLS handshake until it receives your SDP. You may not be able share your SDP with Meta until your internal endpoint responds to your with their SDP. Common DTLS implementations have a retry interval of 1s, 2s, 4s, and so on. After you send Meta the SDP, there is often a ~3 second delay before we receive your DTLS client hello packet and this is when your internal endpoint is sending media but it is dropped. When you switch to SDES you can directly send SRTP after you send us your SDP.</span><span>**Delayed Audio Playback:** Instruct the SIP User Agent (UA) to wait for an ACK from BizWebrtcEndpoint before playing audio. The ACK would be sent only after receiving a successful response from the Accept API, followed by an artificial delay. This approach ensures that the WebRTC connection is established before audio playback begins.</span><span>**Connection State-Based Delay:** Direct the SIP UA to wait until the WebRTC connection state is ‘connected’ before playing audio. This method relies on the WebRTC connection being fully established before audio playback starts.</span><span>**Buffered Media Packets:** Buffer SIP media packets and send them only after the WebRTC connection is established. This approach ensures that no audio packets are lost due to premature playback.</span><span>**Silence Insertion:** Insert a brief period of silence into the IVR audio before the actual audio content. This method allows the WebRTC connection to establish itself while the IVR is playing silence, reducing the likelihood of audio clipping.</span><span>**Pre-accept**: According to the [RFC recommendation<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8839%23name-offer-in-invite&h=AT6wIT1U0B7nAgDvd_5gYYUZ8P1NriwWNsk_ok5tZgTWrw2PNmQOCj4_wQCjjnV0xWqbZ_hpd4G832tYZgUXg8MM9npHB77fj6nkXDdDjn70mYgFFeGSMCBZyAJJVCSAmSjbYKWbj59o-MHhRukGuw), a WebRTC agent, such as BizWebrtcEndpoint, should not transmit media until the ICE process is nearly complete. In our context, this means adopting an ‘optimistic accept’ strategy by invoking the [pre-accept API call](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation) even before sending the SIP INVITE. According to SIP RFCs, a User Agent Client (UAC) should be prepared to receive media immediately after sending the INVITE. Therefore, it’s advisable to initiate the WebRTC connection setup process prior to sending the SIP INVITE.</span><div>These solutions may have varying degrees of complexity and impact on your system. It’s essential to evaluate their feasibility and potential trade-offs in the context of your specific use case.</div><div id="bkmrk-support"><div id="bkmrk-support-1"><div>### Support

</div></div></div><div>For support concerning WhatsApp Business Calling API, choose the **WaBiz: Calling API** topic when opening a [Direct Support<span>⁠</span>](https://business.facebook.com/direct-support/) ticket.</div></div>

# Set Up a Sandbox Account for Calling | Developer Documentation

<div id="bkmrk-set-up-a-sandbox-acc">## Set Up a Sandbox Account for Calling

<div><span>Updated: Oct 31, 2025</span></div><div><div>Sandbox accounts are only available to you if you are a Tech Partner.</div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>A WhatsApp sandbox account is a mock WhatsApp Business Account that you can use to test your Calling API integration. Use a calling sandbox account to test the following features:</div><span>Initiate and receive calls using the Calling API</span><span>Validate calling webhook events</span><span>Simulate onboarding flows without creating real business assets</span><div id="bkmrk-sandbox-account-call"><div id="bkmrk-sandbox-account-call-1"><div>### Sandbox account calling limits

</div></div></div><div>The following table outlines the calling limits for sandbox accounts. These limits are subject to change.</div><div><table><thead><tr><th><span>Limit </span></th><th><span>Description </span></th><th><span>Production number limit </span></th><th><span>Public test number limit </span></th></tr></thead><tbody><tr><td><div><div>Connected call limit</div></div></td><td><div><div>Number of calls a business is allowed to make on approved permissions.</div></div></td><td><div><div>100 connected calls per 24 hrs</div></div></td><td><div><div>No change</div></div></td></tr><tr><td><div><div>Call Permission Request message limits</div></div></td><td><div><div>Limits the number of call permission request messages that can be sent to the same consumer</div></div></td><td><div><div>1 request per day  
2 requests per week</div></div></td><td><div><div>25 requests per day  
100 requests per week</div></div></td></tr><tr><td><div><div>Unanswered call limits</div></div></td><td><div><div>When a business initiated call goes unanswered (In essence, is rejected by the user or missed by the user).</div></div></td><td><div><div>Nudge on 2 consecutive unanswered calls  
Revoke permission on 4 consecutive unanswered calls</div></div></td><td><div><div>Nudge on 5 consecutive unanswered calls  
Revoke on 10 consecutive unanswered calls</div></div></td></tr><tr><td><div><div>Temporary call duration</div></div></td><td><div><div>Duration a business can call the user after permission is approved.</div></div></td><td><div><div>7 days</div></div></td><td><div><div>No change</div></div></td></tr></tbody></table>

</div><div id="bkmrk-set-up-a-sandbox-acc-2"><div id="bkmrk-set-up-a-sandbox-acc-3"><div>### Set up a sandbox account

</div></div></div><div id="bkmrk-step-1.-access-the-w"><div id="bkmrk-step-1.-access-the-w-1"><div>#### Step 1. Access the WhatsApp developer sandbox

</div></div></div><span>Navigate to the [App Dashboard](https://developers.facebook.com/apps).</span><span>Click the app you are using with WhatsApp.</span><span>Select **Use cases** (pencil icon) from the sidebar.</span><span>Under **Connect with customers through WhatsApp**, click **Customize**.</span><span>In the left menu, select **Partner tools**.</span><span>In the **Claim a sandbox account** section, under **Features**, click the dropdown. Select **Cloud API and Calling**.</span><span>Click **Claim sandbox account**.</span><span>Under **Enable calling functionality** click the dropdown, then click **Manage phone number list**.</span><span>Add your phone number as a recipient.</span><div id="bkmrk-step-2.-obtain-crede"><div id="bkmrk-step-2.-obtain-crede-1"><div>#### Step 2. Obtain credentials and identifiers for your sandbox account

</div></div></div><span>On the same page, under **Customize a new onboarding flow**, click **Get started** to open the Embedded Signup experience. </span><span>**Note: Keep this tab open and available as you will use it multiple times throughout this process.**</span><span>In the **Embedded Signup Launch** section, ensure that the **Features** dropdown is empty, then click **Login with Facebook**.</span><span>A popup with the embedded signup experience will show. Under **Business portfolio** select **Sandbox Business**.</span><span>Fill in the rest of the required information, then click **Next**.</span><span>On the next screen, in the **Create or Select a WhatsApp Business Profile** dropdown, select **Test Number**.</span><span>Once the login flow is complete, in the **Exchange Token** section, click **Get Token**. </span><span>**Note: Retain this token for future sandbox account API use.**</span><span>In the **Fetch Shared WhatsApp Business Account** section, click **Fetch WABA details**.</span><span>Under **WhatsApp business account field**, copy the **Value** for the `id` row. </span><span>**Note: Retain this ID since it is the WhatsApp Business Account ID for the sandbox WABA.**</span><span>In the **Fetch phone numbers** section, click **Fetch phone numbers**.</span><span>Under **ID**, copy the value. </span><span>**Note: Retain this ID since it is the phone number ID for your sandbox account test phone number.**</span><div id="bkmrk-step-3.-register-you"><div id="bkmrk-step-3.-register-you-1"><div>#### Step 3. Register your test phone number and subscribe to your WABA

</div></div></div><div>*Prerequisites*</div><div>*Ensure that you have the following information from the previous steps:*</div><span>*Your sandbox account token string*</span><span>*Your sandbox account WABA ID*</span><span>*Your test phone number ID*</span><div>To complete these next steps, you will use the [Graph API Explorer tool](https://developers.facebook.com/tools/explorer/).</div><span>**Note: Keep this window open as you will use the configuration you created again in later steps in this guide.**</span> <span>Navigate to the [Graph API Explorer tool](https://developers.facebook.com/tools/explorer/).</span><span>Ensure you are on the latest version of the API.</span><span>Click **Generate Access Token** and follow the prompts.</span><span>Under **Permissions**, add the `whatsapp_business_management` and `whatsapp_business_messaging` permissions</span><span>In the endpoint builder, enter `/<YOUR_SANDBOX_WABA_ID>/subscribed_apps`, then click **Submit**.</span> <span>Next, register your test phone number by entering `/<YOUR_SANDBOX_TEST_PHONE_NUMBER_ID>/register` in the endpoint builder.</span><span>In the left sidebar, click JSON, then enter the following JSON body, then click Submit:</span> <span>You should receive a standard `success` response:</span><div id="bkmrk-step-5.-configure-we"><div id="bkmrk-step-5.-configure-we-1"><div>#### Step 5. Configure webhooks and permissions

</div></div></div><span>Navigate to the [App Dashboard](https://developers.facebook.com/apps).</span><span>Click the app you are using with WhatsApp.</span><span>Select **Use cases** (pencil icon) from the sidebar.</span><span>Under **Connect with customers through WhatsApp**, click **Customize**.</span><span>In the left sidebar, click **Configuration**.</span><span>Under **Callback URL**, add the callback URL for your webhook server. </span><span>If you do not have a webhook server, you can follow our [instructions to create a test webhook server](/books/meta-whatsapp/page/create-a-test-webhook-endpoint-developer-documentation).</span><span>Under **Verify token**, add an arbitrary verification string.</span><span>Click **Verify and save**.</span><span>On the next page, in the **Select product** dropdown, click **WhatsApp Business Account**.</span><span>Under **Webhook fields**, in the **calls** row, click the toggle button to subscribe to the `calls` webhook field.</span><div id="bkmrk-test-business-initia"><div id="bkmrk-test-business-initia-1"><div>### Test business-initiated calling

</div></div></div><div>Before you can test business-initiated calls (BIC), you must provide user calling permissions to your sandbox account.</div><div>You can do this on the client device you are using for testing:</div><span>On your client device, open WhatsApp.</span><span>Navigate to the message thread you have with your sandbox business phone number.</span><span>At the top of the screen, tap the sandbox business phone number.</span><span>Scroll down and tap **Business Calling Permission**.</span><span>Tap **Allow calls**.</span><div>You can now use your Calling API integration to call the client device and test your integration.</div><div>[Learn more about how to make business-initiated calls.](/books/meta-whatsapp/page/business-initiated-calls-developer-documentation)</div><div id="bkmrk-test-user-initiated-"><div id="bkmrk-test-user-initiated--1"><div>### Test user-initiated calling

</div></div></div><div>You can test user-initiated calls (UIC) on the client device you are using for testing:</div><span>On your client device, open WhatsApp.</span><span>Navigate to the message thread you have with your sandbox business phone number.</span><span>Tap the phone icon at the top of the screen to call the sandbox business phone number.</span><span>Confirm a successful call connection.</span><div>[Learn more about how to handle user-initiated calls.](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation)</div></div>

# Calling API App Review Guidelines | Developer Documentation

<div id="bkmrk-calling-api-app-revi">## Calling API App Review Guidelines

<div><span>Updated: Nov 21, 2025</span></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>The official page referenced by reviewers is [/docs/permissions#w](https://developers.facebook.com/docs/permissions#w). Use this guide as complementary to that page but treat that page as the official source when in doubt.</div><div>This page provides details to improve your chances of a successful App Review specifically for WhatsApp Business Calling API features.</div><div id="bkmrk-guidelines"><div id="bkmrk-guidelines-1"><div>### Guidelines

</div></div></div><div id="bkmrk-for-the-whatsapp-bus"><div id="bkmrk-for-the-whatsapp-bus-1"><div>#### For the WhatsApp business management permission

</div></div></div><div>You should clearly show that your application can enable and disable calling features by displaying whether the Call Button icon is visible.</div><div>Do this by enabling and disabling calling features, not simply toggling Call Button icon visibility.</div><span>[Learn how to enable and disable Calling API features via API](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</span><span>[Learn how to enable and disable Calling API features in WhatsApp Manager](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</span><div id="bkmrk-for-the-whatsapp-bus-3"><div id="bkmrk-for-the-whatsapp-bus-4"><div>#### For the WhatsApp business messaging permission

</div></div></div><div>You should clearly demonstrate your application can support **either of the following use cases:**</div><div id="bkmrk-use-case-1%3A-place-a-"><div id="bkmrk-use-case-1%3A-place-a--1"><div>##### Use case 1: Place a business-initiated call

</div></div></div><div>Share a video of you using your application to place a business-initiated call. Then display a user accepting the call on a WhatsApp mobile client.</div><div id="bkmrk-use-case-2%3A-receive-"><div id="bkmrk-use-case-2%3A-receive--1"><div>##### Use case 2: Receive a user-initiated call

</div></div></div><div>Share a video of a user placing a call to your business phone number. Then show your application receiving the incoming call.</div><div>Show either:</div><span>The incoming call in the WhatsApp client application UI.</span><span>The calling webhook as delivered to your application.</span></div>

# Calling API Pricing | Developer Documentation

<div id="bkmrk-calling-api-pricingu">## Calling API Pricing

<div><span>Updated: Mar 30, 2026</span></div><div><div>**All user-initiated calls are free.**</div></div><div id="bkmrk-overview"><div id="bkmrk-overview-1"><div>### Overview

</div></div></div><div>Businesses are charged for calls based on:</div><span>Duration of the call (calculated in six-second pulses)</span><span>Country code of the phone number being called</span><span>Volume tier (based on minutes called within the calendar month) using same [tiering accrual](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation) as messaging</span><div>Note: Our systems count fractional pulses as one pulse. For example, a 56-second call (9.33 pulses) would be counted as 10 pulses.</div><div>For calls that cross pricing tiers (for example from the 0 - 50,000 tier to the 50,001 - 250,000 tier), the entire call is priced at the lower rate (that is, the rate of the higher volume tier).</div><div>A valid payment method is required to place calls.</div><div>**Note:** Call permission request messages are subject to [per-messaging pricing](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation).</div><div id="bkmrk-rate-cards-and-volum"><div id="bkmrk-rate-cards-and-volum-1"><div>### Rate cards and volume tiers

</div></div></div><div>These rate cards represent the current rates and volume tiers for the WhatsApp Business Calling API, effective April 1, 2026, based on WhatsApp Business Account timezone.</div><div><table><thead><tr><th><span>Currency </span></th><th><span>Rates </span></th></tr></thead><tbody><tr><td><div>USD </div></td><td><div>[USD rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F520671944_623223040377923_7736077446508180620_n.csv%3F_nc_cat%3D102%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3D5CstYY9T2PYQ7kNvwF9gtBw%26_nc_oc%3DAdrE2OvxRtgOP1CKokXCZC2Wfi5mcvneDr0mF5Qm3C-0xIyd5QqBbge1wdjHBLwkSr0%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af2Cdlb8tWPfJvjabF4_8U_TJRcOnklUootXtA_yeL8psA%26oe%3D69D2ADD1&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>AED </div></td><td><div>[AED rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F648846205_898495256290027_4967937082771215246_n.csv%3F_nc_cat%3D106%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3D5fO05gV4LXMQ7kNvwF7AF-r%26_nc_oc%3DAdrBCNX30cGEcrhIYBux-R21bnxHV3HXaJ2fYCc2Gm8-zlrd-qVOEPA0HLIjecE6P5c%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af1g2gP0cK1s931IhqkqrtdIbECR5hPUsVwuKc4ybiPJcg%26oe%3D69D29AD4&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>ARS </div></td><td><div>[ARS rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F649505242_913216918145781_2438364102488426678_n.csv%3F_nc_cat%3D108%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3D1JbI0ATfpmkQ7kNvwE0kRDf%26_nc_oc%3DAdr7rsFWzc_F-WSFDe-swZULljxf6OW1B-htyHm_vRe39aolRpZkdSyp9H2lDtqSIek%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af3ZbzKS1yukEJ6VukVM0wiM7V82MbtC8JopU2vOjz3cXw%26oe%3D69D2AAE3&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>AUD </div></td><td><div>[AUD rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F518358957_1395180011780140_6900177198446866717_n.csv%3F_nc_cat%3D106%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DJ0tHxQc8xqcQ7kNvwGNp6Ub%26_nc_oc%3DAdqiod1r2ARAmzGzYVph4O3P1f7DOwS9Qrv-3cF10VktrUwaxbLKM1i_EIT77NtSE8g%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af0sEgkKw7ZdPtMBpF-2tmOU0Sy3TIBRMZUFaWWYZWofaA%26oe%3D69D2C906&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>CLP </div></td><td><div>[CLP rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F648911379_918236350947527_5918794926127327842_n.csv%3F_nc_cat%3D102%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DJAXkg_J7yPEQ7kNvwG3PQGF%26_nc_oc%3DAdocKqtX5bsb1Kw-O6HdoZjLNC5QyxW8SqVnpwQdot6pmQqS2t0YdtmvMZqBCSy49iE%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af2zeQcMpcTNkojnunhtlf4HfS3anFva13N0U4Bcsk7Jyg%26oe%3D69D2B38E&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>COP </div></td><td><div>[COP rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F648880301_809165798244063_6053014224710167457_n.csv%3F_nc_cat%3D105%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3D0Ap0wQwYONsQ7kNvwHv0_9c%26_nc_oc%3DAdprAN3xGjKme6iDItNk9YkzB4-mqaE_WUI5R2N9zDFmBMsxa2cO7YpJSziC-La4-n4%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af21e0byGV5lkuxF3OgIAewp3KX-k8Ra_NAJEwzQoVZwfA%26oe%3D69D2C5D5&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>EUR </div></td><td><div>[EUR rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F521916945_1437343154178501_4307701949709939168_n.csv%3F_nc_cat%3D105%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3Dqwf5ZwvsjWoQ7kNvwHG57pg%26_nc_oc%3DAdqyJsLCKRigdmcKmgDVKlqsW4iXCh2W3JbxAZv-tv5XilreH3Y-ggyjhknirNkBqvo%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af3N86kgM28EzIs_Okw-8arMnZGGXxRr8BKgOfZwZrDzgw%26oe%3D69D2AAE5&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>GBP </div></td><td><div>[GBP rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F523820415_1707220083238148_129381165576389329_n.csv%3F_nc_cat%3D111%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DYvD8GDS-gkkQ7kNvwF_H9uJ%26_nc_oc%3DAdpdZulmp4xHZj8-MowRcPDGKz_Gnzd7Ri0ug37d9Jgg_xHxT4BP72FEnFd2M2lkC-Y%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af0pqIcdrGNUcflh1dMyQMNcPmTmI2M9PAO2j3ZRLRvc8w%26oe%3D69D2A6F6&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>IDR </div></td><td><div>[IDR rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F522403360_1317814323248646_3679642822059879321_n.csv%3F_nc_cat%3D105%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3Des00rvtf96sQ7kNvwHZITyd%26_nc_oc%3DAdqujodFNDn-krMHkYAkmVdMxoYNcxwyC00vcfcXMRD8-DofaCfrPP_lw7CyZme18Mw%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af0JWJfJtHydEJBpwuXINvNJSSIfciou71CdhLJLWwgNrQ%26oe%3D69D2976E&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>INR </div></td><td><div>[INR rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F520297017_2631484657208999_4027192314064932495_n.csv%3F_nc_cat%3D105%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DkZ6bas_OuecQ7kNvwGdw7XR%26_nc_oc%3DAdqPyv9B0ELf332FJPkAEocdN9dl_ggPnNAQeNN21y6ZhNgMOJGa1cLR5n-50MfF6yQ%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af3eWxhcWdIEj5x41Os0bquzn_bG-Zo5qXri53sYG1-6sw%26oe%3D69D2BF67&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>MXN </div></td><td><div>[MXN rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F597620135_866494415956770_7234843917023384648_n.csv%3F_nc_cat%3D108%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DP89mAFZnt0kQ7kNvwEmQPcC%26_nc_oc%3DAdrhBns1bCxcRlSchi1rJZUt_90TgVS5Ao9J-PeIVMnTWewOSKhNTZgr3mMu5Q0KGOc%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af2BLipx8LNdlk-VzVDnaTjbBDJOW7Nw6lNG-167H5PMMA%26oe%3D69D2C65D&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>MYR </div></td><td><div>[MYR rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F648897388_1395371015723062_5055864925759962380_n.csv%3F_nc_cat%3D101%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DH31epNpeqq8Q7kNvwGgVzEH%26_nc_oc%3DAdrtQYSf-AVIybNypmF9tAoBWfYCSq-n7Oe3I88E4M0-YxM-5QOG_OimFBXEvA2H5ZQ%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af2EUuqNmPTHaANIe9b6Fh67iGpsu0WuDq0o4tQYiKaycQ%26oe%3D69D29B70&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>PEN </div></td><td><div>[PEN rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F649417534_814906300941251_8328799228627883398_n.csv%3F_nc_cat%3D104%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DoHhYg1X5pWoQ7kNvwFdDyG0%26_nc_oc%3DAdrC6GCBMfo4AzbElmCzFm_elbIJvb_R5ES47k4tKP49iwslvBOsszGMoXsy7MM4vAA%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af34s9lb1uNNxUVGbJ_wfNg_JlO3fmAbdkuk61ovjwew2g%26oe%3D69D2A7A3&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>SAR </div></td><td><div>[SAR rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F648849378_1555017505601272_7220357940691092022_n.csv%3F_nc_cat%3D102%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3Dc2U4O7oCuIkQ7kNvwFA_tV_%26_nc_oc%3DAdrwOv3icQXKNXowwtwRZ6CipiK20DM112WSODtbGHlHbLdCzL-S-TP3utZtL-VYQo4%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af18seoJCLBZRt2YqEF4x7g6cwBTnqCRWjAYfgPxRZcI6A%26oe%3D69D2C8B7&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr><tr><td><div>SGD </div></td><td><div>[SGD rates](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F649177467_4237098813170442_302583219955884691_n.csv%3F_nc_cat%3D101%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3Diq-zckVGudAQ7kNvwEsKLHO%26_nc_oc%3DAdp7YENeXL7win8Bcqw1vyWebjEK79z3JF3hI7GcA95JbkCb_tpm0bRVh3K0WZNOat8%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DacPTWQLYjr5IfuIQgooF6w%26_nc_ss%3D7a389%26oh%3D00_Af3-QIIncLV86jvYHqUdDujY34jtcAkoEagxEpQepXaKVg%26oe%3D69D296B9&h=AT41H1WOuytwAYdhjYRleJCIukW9qr6eXSiOn1ypVKrgiG1iHvSYlfvN7R0QCsTIuyyBAUY4Xt9Y-btfI-0CCctdfDg22JXisdColYUC4mivu5OgbqrjqaKCZkgdzuV1eXQz2ixwN5XejjGVqchtTA)</div></td></tr></tbody></table>

</div><div id="bkmrk-updates-to-rate-card"><div id="bkmrk-updates-to-rate-card-1"><div>#### Updates to rate cards

</div></div></div><div>**Previous updates**</div><span>Effective April 1, 2026 – 8 new billing currencies introduced: AED (United Arab Emirates), ARS (Argentina), CLP (Chile), COP (Colombia), MYR (Malaysia), PEN (Peru), SAR (Saudi Arabia), SGD (Singapore).</span><span>Effective January 1, 2026 – MXN (Mexico) rates introduced.</span><div id="bkmrk-how-calling-changes-"><div id="bkmrk-how-calling-changes--1"><div>### How calling changes the 24 hour customer service window

</div></div></div><div>Currently, when a WhatsApp user messages you, a [24-hour timer called a customer service window](/books/meta-whatsapp/page/sending-messages-developer-documentation) begins, or refreshes.</div><div>When you are within the window, your business can send any type of message to the WhatsApp user, which is otherwise not allowed.</div><div>With the introduction of the Calling API, the customer service window now also starts or refreshes for calls:</div><span>When a WhatsApp user calls you, regardless of if you accept the call or not</span><span>When a WhatsApp user accepts your call.</span><div id="bkmrk-get-cost-and-call-an"><div id="bkmrk-get-cost-and-call-an-1"><div>### Get cost and call analytics

</div></div></div><div>You can call the endpoint with a `?fields=call_analytics` query parameter to obtain call analytics for your WhatsApp Business Account (WABA).</div><div>The endpoints can provide useful information like cost, counts of completed calls, and average call duration. Learn more about [call analytics](/books/meta-whatsapp/page/analytics-developer-documentation).</div></div>

# FAQs | Developer Documentation

<div id="bkmrk-faqsupdated%3A-nov-13%2C">## FAQs

<div><span>Updated: Nov 13, 2025</span></div><div id="bkmrk-product-faq"><div id="bkmrk-product-faq-1"><div>### Product FAQ

</div></div></div><div id="bkmrk-will-calls-show-up-i"><div id="bkmrk-will-calls-show-up-i-1"><div>##### Will calls show up in the insights page on Meta WhatsApp Manager UI?

</div></div></div><div>Call insights will be available in both WhatsApp Manager and the [analytics API](/books/meta-whatsapp/page/analytics-developer-documentation).</div><div id="bkmrk-are-international-ca"><div id="bkmrk-are-international-ca-1"><div>##### Are International calls supported like WhatsApp consumer to consumer calls?

</div></div></div><div>Yes.</div><div id="bkmrk-what-are-the-countri"><div id="bkmrk-what-are-the-countri-1"><div>##### What are the countries supported for calling?

</div></div></div><div>See [Calling Availability](/books/meta-whatsapp/page/cloud-api-calling-developer-documentation) for more info.</div><div id="bkmrk-can-i-use-toll-free-"><div id="bkmrk-can-i-use-toll-free--1"><div>##### Can I use toll-free numbers for calling?

</div></div></div><div>Yes, as long as the country code for the toll-free number is in the list of supported countries. See [1-800 and toll free numbers](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation) for details on how to register toll-free numbers on Cloud API.</div><div id="bkmrk-what-is-the-max-numb"><div id="bkmrk-what-is-the-max-numb-1"><div>##### What is the max number of concurrent calls that a single Cloud API account phone number can receive?

</div></div></div><div>Max concurrent calls is 1000. When the rate limit is exceeded, the caller (the WhatsApp user) will get a generic message saying call cannot be placed. No message is played and there is no webhook. This limit is expected to increase and hence chances of this happening are low. Note that the rate limits for messaging API and template creation/update API are separate and unrelated to calling limits.</div><div id="bkmrk-what-is-the-role-of-"><div id="bkmrk-what-is-the-role-of--1"><div>##### What is the role of BSP vs. end business in overall call flow?

</div></div></div><span>The BSP offers value-added services (for example contact center, voice recording, transcription, and so on) on top of the raw audio stream provided by Cloud API Calling.</span><span>The webhook is sent to apps subscribed for the new `calls` subscription field. In typical cases, a BSP uses their own app and receives the call webhook followed by call establishment.</span><span>How the end-business participates in the call is determined by the BSP.</span><div id="bkmrk-is-the-voice-infrast"><div id="bkmrk-is-the-voice-infrast-1"><div>##### Is the voice infrastructure/API for WhatsApp the same for Facebook Messenger?

</div></div></div><div>WhatsApp Calling API is the first public voice API by Meta. Meta may reuse the same API and integration model for other Meta products when and if they offer voice solutions.</div><div id="bkmrk-what-is-the-maximum-"><div id="bkmrk-what-is-the-maximum--1"><div>##### What is the maximum call duration supported?

</div></div></div><div>There is no call duration limit.</div><div id="bkmrk-is-sip-supported%3F"><div id="bkmrk-is-sip-supported%3F-1"><div>##### Is SIP supported?

</div></div></div><div>Yes, see [“Configure and use call signalling via session initiation protocol (SIP)”](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div><div id="bkmrk-can-i-send%2Freceive-t"><div id="bkmrk-can-i-send%2Freceive-t-1"><div>##### Can I send/receive text/media messages while a call is in progress?

</div></div></div><div>Yes. The regular [send-message API](/books/meta-whatsapp/page/sending-messages-developer-documentation) can be used while a call is in progress.</div><div id="bkmrk-does-meta-offer-serv"><div id="bkmrk-does-meta-offer-serv-1"><div>##### Does Meta offer services such as voice recording, transcript, voice-mail?

</div></div></div><div>No.</div><div id="bkmrk-can-i-add-metadata-%28"><div id="bkmrk-can-i-add-metadata-%28-1"><div>##### Can I add metadata (for example context) as part of accepting the call?

</div></div></div><div>Yes. See [biz\_opaque\_callback\_data field in the main API spec](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation). Also the existing conversation state provides important context to the business human agent. The call routing subsystem should directly connect the call from WhatsApp consumer to the right agent on the business side. This gives the best customer experience and avoids going through standard IVR</div><div id="bkmrk-how-can-i-raise-awar"><div id="bkmrk-how-can-i-raise-awar-1"><div>##### How can I raise awareness of the calling feature to WhatsApp users?

</div></div></div><span>Send messages with voice call buttons. See [send interactive message](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) and [send template message](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) sections for details</span><span>Send a message with a voice call button automatically when a WhatsApp consumer opens a chat with the business account for the first time. See [welcome message](/books/meta-whatsapp/page/conversational-components-developer-documentation) for more details.</span><span>[Link to a WhatsApp call from a website using deeplinks.](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation)</span><div id="bkmrk-is-it-possible-for-a"><div id="bkmrk-is-it-possible-for-a-1"><div>##### Is it possible for an AI (for example voicebot) to have a conversation with a customer directly via a WhatsApp call?

</div></div></div><div>Yes. Meta only provides the raw media stream and how it is processed is entirely flexible. Many businesses use automated voicebots including AI bots to answer calls from WhatsApp users. Many AI products in the market offer RTC / Speech APIs and some even have native WebRTC support. The integration approach is similar to integrating WhatsApp Business Calling with call centers for IVR or human agents.</div><div>See [WhatsApp Business Solution Terms<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-solution-terms&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) for restrictions in AI use cases.</div><div id="bkmrk-why-is-pre-accepting"><div id="bkmrk-why-is-pre-accepting-1"><div>##### Why is [pre-accepting](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) user initiated call starting the timer on WhatsApp user side?

</div></div></div><div>Likely because media is being sent before the call is [accepted](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation). WhatsApp clients treat a call as accepted by peer if they receive a media packet or an accept signal whichever comes first.</div><div>If the timing of media start cannot be controlled, directly [accept](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation) the call and do not use [pre-accept](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation). The pre-accept is meant to frontload media connection establishment but it does require controlling the timing of media transmission.</div><div id="bkmrk-is-there-a-status-pa"><div id="bkmrk-is-there-a-status-pa-1"><div>##### Is there a status page to track overall health of Calling APIs and view any outages or service incidents?

</div></div></div><div>Yes. See ‘Cloud API Calling’ section at https://metastatus.com/whatsapp-business-api and https://metastatus.com/whatsapp-business-api/history</div><div id="bkmrk-getting-started-faq"><div id="bkmrk-getting-started-faq-1"><div>### Getting Started FAQ

</div></div></div><div id="bkmrk-what-is-the-minimum-"><div id="bkmrk-what-is-the-minimum--1"><div>##### What is the minimum Graph API version for the Calling APIs?

</div></div></div><div>It is v17.0. [See here for general version history](https://developers.facebook.com/docs/graph-api/changelog)</div><div id="bkmrk-can-i-use-the-same-u"><div id="bkmrk-can-i-use-the-same-u-1"><div>##### Can I use the same user access token for messaging, for calling?

</div></div></div><div>Yes. Whatever works for messaging should work for calling in general.</div><div id="bkmrk-does-the-waba-need-t"><div id="bkmrk-does-the-waba-need-t-1"><div>##### Does the WABA need to have an attached credit line for using Calling APIs?

</div></div></div><div>Yes, a credit line attached to the WABA is required in order to use the Calling API.</div><div id="bkmrk-does-the-waba-need-t-3"><div id="bkmrk-does-the-waba-need-t-4"><div>##### Does the WABA need to be a verified business for calling?

</div></div></div><div>No. [Business verification<span>⁠</span>](https://www.facebook.com/business/help/2058515294227817?**id=180505742745347) is not a requirement for calling, nor is it required for messaging</div><div id="bkmrk-how-does-usage-of-ca"><div id="bkmrk-how-does-usage-of-ca-1"><div>##### How does usage of Calling APIs affect my rate limits?

</div></div></div><div>Calling API usage does not count towards messaging rate limits at the moment. The only limit enforced for calling right now is the 1000 concurrent calls limit, but this may change in near future.</div><div id="bkmrk-is-it-possible-for-a-3"><div id="bkmrk-is-it-possible-for-a-4"><div>##### Is it possible for a WhatsApp Business account be connected to Provider A for Chat and to Provider B for Voice (i.e., two different apps subscribed to the same WhatsApp business Webhook account/phone)?

</div></div></div><div>Yes, it is possible for two partners to operate a single WhatsApp Business API phone number with two separate solutions, like chat and calling.</div><div>[See Multi-Solution Conversations for more details](/books/meta-whatsapp/page/how-to-use-multi-solution-conversations-msc-developer-documentation).</div><div>Another option is for the voice provider used by another BSP. In this case a Meta app or being a tech provider on Meta is not needed. This architecture is depicted in detail in the section [“Integrating using a third party voice provider”](/books/meta-whatsapp/page/integration-patterns-developer-documentation).</div><div id="bkmrk-graph-api-call-signa"><div id="bkmrk-graph-api-call-signa-1"><div>### Graph API Call Signaling FAQ

</div></div></div><div id="bkmrk-does-meta-provide-an"><div id="bkmrk-does-meta-provide-an-1"><div>##### Does Meta provide any stun/turn servers or WebRTC infra for use by BSP?

</div></div></div><div>No.</div><div>Meta uses [ICE-lite<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8445%23autoid-21&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) and the Meta SDP offer always has a single ipv4 and ipv6 address per data stream component. The SDP answer should follow the same format.</div><div>As such it is not mandatory to use STUN/TURN to determine the ICE candidates</div><div id="bkmrk-does-meta-recommend-"><div id="bkmrk-does-meta-recommend--1"><div>##### Does Meta recommend any stun/turn servers or WebRTC infra for use by BSP?

</div></div></div><div>Meta doesn’t have recommendations. Here are a few ideas just as food for thought in case they are helpful.</div><span>Check for any existing VoIP related technology and if so, consult that team. WebRTC relies on SRTP/SRTCP for actual media which is the VoIP media standard.</span><span>Using STUN/TURN works well in an end user setup with a browser from a personal device. If the integration with the Meta voice APIs involves terminating the media directly on an end user device, the STUN/TURN, and so on, happen directly on that user device. But often, the media does terminate in a partner’s own infra so services like IVR can be offered. In such cases, the BSP infra may have its own ways to allocate an IP and port for VoIP connections, for example using VIP behind a load-balancer, and so on.</span><div id="bkmrk-what-ice-role-should"><div id="bkmrk-what-ice-role-should-1"><div>##### What ICE role should the ICE agent on the business side take?

</div></div></div><div>Always take the CONTROLLING role as the Meta side ICE agent uses ICE-lite ([RFC 8445<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8445%23autoid-21&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA)). Starting with the CONTROLLED role may cause the ICE process to stall and timeout. Even if it does work, it will take more time due to multiple round-trips needed to resolve role conflicts.</div><div id="bkmrk-can-more-ice-candida"><div id="bkmrk-can-more-ice-candida-1"><div>##### Can more ICE candidates be added as part of signaling in offer + answer (for example using ICE Trickle)?

</div></div></div><div>Short answer is yes. Cloud API uses [ICE-lite (RFC 8445)<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8445%23autoid-21&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) and always assumes the controlled [role<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8445%23autoid-26&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) in ICE. Hence there is no need to send updated candidates to Meta. The ICE Agent can initiate connectivity checks from addresses not included in the SDP and the Meta ICE agent will consider unknown address as a valid candidate, as long as STUN message integrity passes.</div><div id="bkmrk-what-is-the-recommen"><div id="bkmrk-what-is-the-recommen-1"><div>##### What is the recommendation on how to determine the ICE candidate?

</div></div></div><div>Meta has global infra presence and Meta will choose the media relay on Meta infra that is closest to the WhatsApp user involved in the call.</div><div>On the BSP side, the media server/host (aka targeting) can be chosen based on many parameters including the IP Meta chooses, the country of consumer phone number, and the business phone number. The selection of media server location is an important factor in optimizing the media latency between BSP IP and Meta IP which in turn contributes to higher call quality. At the minimum, the BSP call/media hosting location should be close to the country of the WhatsApp user as determined from the country code of the user’s phone number.</div><div>Any targeting implementation on the BSP side should optimize for the candidates IPs on the Meta SDPs and not on the source of signaling endpoints.</div><div id="bkmrk-is-there-an-api-to-s"><div id="bkmrk-is-there-an-api-to-s-1"><div>##### Is there an API to send a provisional response equivalent to SIP 180 Ringing?

</div></div></div><div>If not, when does the caller’s device start ringing?</div><div>Caller (the WhatsApp Consumer app) would already be ringing by the time the webhook is received. There is no need for provisional responses</div><div id="bkmrk-how-are-the-calls-se"><div id="bkmrk-how-are-the-calls-se-1"><div>##### How are the calls secured?

</div></div></div><div>Cloud API uses SRTP for the encryption of media streams [(RTP/SAVPF)<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc5124&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) and the actual SRTP key exchange is initially performed end-to-end with [DTLS-SRTP<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc5764&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA).</div><div id="bkmrk-can-meta-send-the-ca"><div id="bkmrk-can-meta-send-the-ca-1"><div>##### Can Meta send the call webhooks to a different endpoint based on the caller’s geographical location or other factors such as network latency?

</div></div></div><div>The webhook URL is configurable. HTTPS is used, so standard load balancing and targeting techniques can be applied to reroute accordingly. A different (aka override or alternate) webhook URL can also be configured per [WhatsApp Business Account](/books/meta-whatsapp/page/managing-webhooks-developer-documentation) and per [business phone number](https://developers.facebook.com/docs/whatsapp/embedded-signup/webhooks/override#set-phone-number-alternate-callback). The webhook is only used for signaling and Meta servers calling the webhook server are located in US. Select the location of the media endpoint based on the country code of the WhatsApp consumer (available on the webhooks) or the ice candidate IPs on SDP sent by Meta. See the above FAQ questions **“What is the recommendation on how to determine the ICE candidate?**” and **“How to reduce media latency of the calls?”** .</div><div id="bkmrk-what-are-the-meta-ip"><div id="bkmrk-what-are-the-meta-ip-1"><div>##### What are the Meta IP addresses that will call the Webhook or SIP or Media servers in order to allowlist them in a firewall?

</div></div></div><div>Refer to [the WhatsApp Webhooks documentation](/books/meta-whatsapp/page/managing-webhooks-developer-documentation) on this topic. When collapsing the list of IPv4 addresses the result is around 23 prefixes. See below for an example command and output that was run as of December 11, 2024.</div><div>```
$ src % whois -h whois.radb.net — '-i origin AS32934' | grep ^route | awk '{print $2}' | grep -iv ':' | cidrmerge
31.13.24.0/21
31.13.64.0/18
45.64.40.0/22
57.141.0.0/21
57.141.8.0/22
57.141.12.0/23
57.144.0.0/14
66.220.144.0/20
69.63.176.0/20
69.171.224.0/19
74.119.76.0/22
102.132.96.0/20
103.4.96.0/22
129.134.0.0/16
147.75.208.0/20
157.240.0.0/16
163.70.128.0/17
163.77.128.0/17
173.252.64.0/18
179.60.192.0/22
185.60.216.0/22
185.89.216.0/22
204.15.20.0/22

```

</div><div id="bkmrk-is-it-possible-to-re"><div id="bkmrk-is-it-possible-to-re-1"><div>##### Is it possible to reduce the Meta IP addresses that will call webhook servers at-least for dev-test purposes?

</div></div></div><div>No. But see the above FAQ which deduced about 23 IPv4 prefixes to completely cover all Meta address space for v4.</div><div id="bkmrk-what-is-the-retry-po"><div id="bkmrk-what-is-the-retry-po-1"><div>##### What is the retry policy for calling related webhooks?

</div></div></div><div>Do not assume anything in this regard. The webhook server should determine stale webhooks based on timestamp value and avoid calling Graph APIs to further process them. Existing messaging related [webhooks are retried for up to 7 days](/books/meta-whatsapp/page/managing-webhooks-developer-documentation).</div><div>Calling related webhooks will likely have a shorter retry policy but stale webhooks may still be delivered as that may be useful information to a business to know that some consumers tried to reach them.</div><div id="bkmrk-does-meta-guarantee-"><div id="bkmrk-does-meta-guarantee--1"><div>##### Does Meta guarantee exactly one delivery for webhooks?

</div></div></div><div>No. Be prepared to handle duplicate webhooks.</div><div>Due to the distributed nature of Meta’s architecture, exactly-once delivery cannot be guaranteed for any webhooks including even messaging related webhooks. Following are some known scenarios where duplicates can occur today.</div><span>The Meta HTTPS request to the webhook server timed out after ~20s. In this case, the server thinks it successfully handled a webhook request but from Meta’s side, it failed due to timeout. Meta retries sending this webhook, which then appears as a duplicate.</span><span>If the phone number has more than 1 app subscribed to the calls field and Meta dispatches webhooks to app1 and app2 in that order. If app2 fails, Meta will retry the whole dispatch so app1 will receive a duplicate webhook. Meta is in the process of fixing this.</span><span>Failure recovery on Meta queueing infrastructure may result in duplicate webhook sends.</span><span>There could be other reasons that are currently unknown.</span><div id="bkmrk-do-you-guarantee-ord"><div id="bkmrk-do-you-guarantee-ord-1"><div>##### Do you guarantee ordering of webhooks for a given call?

</div></div></div><div>No. Ordering is not guaranteed due to the distributed nature of Meta’s architecture and retries.</div><div>For example the terminate webhook can arrive before the connect webhook if the WhatsApp user hangs up the call immediately after initiating it. Following are other known examples.</div><div>The connect webhook is attempted which fails with timeout after ~20s. The ‘terminate webhook’ is sent next. The retry of connect webhook happens after the ‘terminate webhook’. In case of timeout, the webhook server thinks there is no failure but this is seen as failure that warrants a retry.</div><div id="bkmrk-can-i-configure-mult"><div id="bkmrk-can-i-configure-mult-1"><div>##### Can I configure multiple webhook servers for calling and have a notion of primary and secondary for high availability?

</div></div></div><div>Similar to messaging, multiple subscriptions with distinct apps associated with distinct callback URLs can be configured. Meta will dispatch all calling webhooks to all configured callback URLs. All URLs are treated as equal and there is no notion of primary/secondary</div><div id="bkmrk-can-i-configure-diff"><div id="bkmrk-can-i-configure-diff-1"><div>##### Can I configure different URLs for messaging and calling related webhooks?

</div></div></div><div>Yes, this can be done by having 2 different Meta apps - one for messaging and one for calling.</div><div>Subscribe the messaging app only to message related webhook subscription fields and the calling app to the calling related subscription fields. The callback URL can be overridden for each of these apps at WABA or phone number level to have different URL override for messages and calls.</div><div>In general, using a single app is recommended.</div><div id="bkmrk-can-you-share-sample"><div id="bkmrk-can-you-share-sample-1"><div>##### Can you share sample curl request for interacting with APIs?

</div></div></div><div id="bkmrk-how-should-the-sdp-p"><div id="bkmrk-how-should-the-sdp-p-1"><div>##### How should the SDP params be serialized with carriage returns and a new line?

</div></div></div><div>The session param requires the SDP to be set as a string per the [RFC-8866<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8866&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) specification which requires CRLF to be used to end a record. Sdp param itself is a string so it should not be further serialized. The legacy connection param however required the [RFC-8866<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc8866&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) compliant SDP string to be within a JSON structure and hence required further serialization.</div><div>In short, use “\r\n” for session-&gt;SDP param. **Do not use the legacy connection-&gt;WebRTC-&gt;SDP param.**</div><div id="bkmrk-how-do-i-fix-error-%E2%80%98"><div id="bkmrk-how-do-i-fix-error-%E2%80%98-1"><div>##### How do I fix error ‘No fingerprint found in SDP’?

</div></div></div><div>The SDP should have an `a=fingerprint` line when using [DTLS<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc6347&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) as the [SRTP<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc3711&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA) key exchange protocol. Make sure to add that line or [configure the business phone number to use SDES](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) instead. See all the possible [Signaling and media possible configurations](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</div><div id="bkmrk-webrtc-and-media-faq"><div id="bkmrk-webrtc-and-media-faq-1"><div>### WebRTC and media FAQ

</div></div></div><div id="bkmrk-is-the-peer-to-peer-"><div id="bkmrk-is-the-peer-to-peer--1"><div>##### Is the peer to peer connection from Meta to BSP or end business?

</div></div></div><div>Typically it is the BSP but depending on the product offering and architecture it could be end business.</div><div>If it is the end business, the BSP would need to programmatically interact with them to obtain the ICE candidates included in the Graph API call to accept the incoming call.</div><div id="bkmrk-what-happens-if-the-"><div id="bkmrk-what-happens-if-the--1"><div>##### What happens if the media stops flowing from one end due to connection issues?

</div></div></div><div>A simple example would be if the [terminate call endpoint fails](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation) but the business side stops sending media.</div><div>This will lead to lack of RTCP packets which helps detect inactive WebRTC agent and the call will disconnect followed by a [terminate webhook](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation).</div><div id="bkmrk-is-the-codec-always-"><div id="bkmrk-is-the-codec-always--1"><div>##### Is the codec always opus/48000?

</div></div></div><div>We also support G.711 (PCMA and PCMU). For opus, the RTP clock rate is set at 48000 in SDP as per [RFC 7587<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc7587%23autoid-17&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA). WhatsApp mobile apps only support opus natively, so Meta media infra transcodes opus to other codecs if needed.</div><div id="bkmrk-what-else-is-support"><div id="bkmrk-what-else-is-support-1"><div>##### What else is supported in terms of codecs?

</div></div></div><div>Audio codecs supported: OPUS, PCMA, PCMU (aka G.711)</div><div id="bkmrk-is-dtmf-supported%3F"><div id="bkmrk-is-dtmf-supported%3F-1"><div>##### Is DTMF supported?

</div></div></div><div>Yes. See the [DTMF section for details](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation). Most SIP implementations should support processing DTMF coming through the RTP data stream ([reference<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fvoipnuggets.com%2F2023%2F06%2F12%2Fdifferent-types-of-dtmf-in-sip-and-why-dtmf-via-rfc2833-is-more-reliable%2F&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA)).</div><div id="bkmrk-how-many-streams-are"><div id="bkmrk-how-many-streams-are-1"><div>##### How many streams are supported in the SDP?

</div></div></div><div>Only one stream is supported in the Offer/Answer SDP.</div><div id="bkmrk-how-many-tracks-are-"><div id="bkmrk-how-many-tracks-are--1"><div>##### How many tracks are supported in each SDP stream?

</div></div></div><div>Only one audio track is supported in the SDP stream.</div><div id="bkmrk-for-a-consumer-to-bu"><div id="bkmrk-for-a-consumer-to-bu-1"><div>##### For a consumer to business call, can WhatsApp consumer apps work with an SDP offer generated by a business agent’s browser?

</div></div></div><div>In this case, the WebRTC agent within the browser should generate an SDP answer, not an offer.</div><div>This SDP answer should be supplied back to Meta using the [accept call endpoint](/books/meta-whatsapp/page/api-and-webhook-reference-developer-documentation). Meta cannot work with any other SDP offer than the one it generated and supplied on the webhook.</div><div id="bkmrk-what-certificate-alg"><div id="bkmrk-what-certificate-alg-1"><div>##### What certificate algorithm is recommended for DTLS?

</div></div></div><div>ECDSA certificates are recommended as they lead to faster cert generation and shorter DTLS handshakes due to [lack of fragmentation<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc6347%23autoid-26&h=AT43EPhM6gwCn-qhTtFbW4UOm_sTCfF1BCkPNifOXwsdaulQaEdcFQw1zp7O_08XPQQBVr8OBmrJ6-03jKaT7XjSyIIqtPmUMt4MNKnQvYTYMMPsuAFaWWmzdM1QiVL5ASLvintnGGD8oUAJWN5UVA).</div><div id="bkmrk-who-would-initiate-t"><div id="bkmrk-who-would-initiate-t-1"><div>##### Who would initiate the calls after accepting the user-initiated call - The BSP or Meta?

</div></div></div><div>The BSP should initiate the ICE connectivity checks as soon as the BSP decides to accept the call.</div><div>This can be done even before calling the accept API but the ICE process will only converge after Meta processes the SDP answer, due to the need for DTLS certificate fingerprint.</div><div id="bkmrk-what-are-the-port-nu"><div id="bkmrk-what-are-the-port-nu-1"><div>##### What are the port numbers used by ICE candidates on Meta’s SDP for allowlisting on firewalls?

</div></div></div><div>Port numbers can be any one from `40012`, `3482`, `3484`, `3478`, `3480`. These are subject to change.</div><div id="bkmrk-how-can-i-generate-t"><div id="bkmrk-how-can-i-generate-t-1"><div>##### How can I generate the WebRTC Accept SDP?

</div></div></div><div>Consult the documentation of the WebRTC library or tool planned for use.</div><div>Processing an SDP offer to generate an SDP answer is the primary functionality of any VoIP technology stack.</div><div id="bkmrk-how-to-reduce-media-"><div id="bkmrk-how-to-reduce-media--1"><div>##### How to reduce media latency of the calls?

</div></div></div><div>Meta’s targeting algorithms will choose the Meta relay that receives media from BSP close to the WhatsApp consumer’s location. This media relay is the ice candidate Meta will share in the SDP. Any BSP side targeting should place the BSP media servers in the same region as the consumer. This obviously minimizes latency for calls within the same region, but it will minimize the media packet routes on public internet for international calls.</div><div id="bkmrk-is-there-a-process-o"><div id="bkmrk-is-there-a-process-o-1"><div>##### Is there a process of reconnection if there is a temporary network drop on either end of the media leg?

</div></div></div><div>WhatsApp consumer apps will attempt a reconnect and automatically recover that leg of the call once network connectivity is restored.</div><div>For the business leg, relatively more stable network conditions are expected. At this time there is no support to re-handshake or re-negotiate SDPs. In any case, the call can terminate after a certain duration of inactivity, after which a terminate webhook is sent.</div><div id="bkmrk-how-much-bandwidth-w"><div id="bkmrk-how-much-bandwidth-w-1"><div>##### How much bandwidth would be required for the call center to support a given number of concurrent calls?

</div></div></div><div>Per call, roughly 40kbps is needed for codec + 20 kbps overhead</div><div>The Opus codec has the ability to dynamically change bandwidth consumed based on network conditions. In general it can offer better audio quality with lower bandwidth consumption, compared to G711 codec.</div><div>G711 codec in comparison needs 64 kbps for codec + 20 kbps overhead = 84 kbps per call.</div><div>Multiply the above numbers with the expected number of concurrent calls to calculate the cumulative bandwidth required. Example: A 1mbps bandwidth can roughly handle 15 concurrent calls on opus (1000/64) vs. 12 concurrent calls on G711 (1000/84).</div><div>To calculate the total data usage, multiply the bandwidth with call duration in seconds. For Opus, it’s a bit more tricky because it has variable bandwidth depending on many factors including available bandwidth estimated using bandwidth estimation, whether local party is talking or silent, and so on. But roughly, a 1 min call on Opus consumes 3.75MB of data vs. the same on G711 takes 4.9MB of data</div><div id="bkmrk-is-it-possible-to-ha"><div id="bkmrk-is-it-possible-to-ha-1"><div>##### Is it possible to handover / transfer a call from one agent to another during an active call session? In essence, a customer is speaking with Agent A and needs to be transferred to Agent B?

</div></div></div><div>Meta doesn’t have any native support.</div><div>Meta is unaware of different agents on the business / partner side, so this is an operation that is doable solely on the partner side. For example, the media flow can be Meta media server to Partner media server to Agent A. When transfer happens, the flow becomes Meta media server to Partner media server to Agent B. So in the both cases, the leg from Meta media server to Partner media server remains constant.</div><div id="bkmrk-whatsapp-consumer-cl"><div id="bkmrk-whatsapp-consumer-cl-1"><div>### WhatsApp Consumer Client FAQ

</div></div></div><div id="bkmrk-when-is-the-call-ico"><div id="bkmrk-when-is-the-call-ico-1"><div>##### When is the call icon in the chat title bar visible on WhatsApp Consumer apps?

</div></div></div><div>It is visible when **all the following conditions are met:**</div><span>The business phone number has the calling status set to `ENABLED` in the [call settings API](/books/meta-whatsapp/page/configure-call-settings-developer-documentation).</span><span>Business phone number `call_icon_visibility` is not `HIDE_IN_CHAT` and not `DISABLE_ALL`</span><span>The call icon visibility feature is supported in WhatsApp mobile versions 2.24.10.8 and above on Android and iOS.</span><span>Consumer’s WhatsApp version 2.23.14 or above. All consumers are expected to be on this version or above.</span><div>[View the call settings API to learn more](/books/meta-whatsapp/page/configure-call-settings-developer-documentation)</div><div id="bkmrk-why-is-the-call-icon"><div id="bkmrk-why-is-the-call-icon-1"><div>##### Why is the call icon in the WhatsApp Consumer app not reflecting the current call settings?

</div></div></div><div>After call configuration is updated, WhatsApp users may take up to 7 days to reflect that configuration although most users refresh much sooner. An immediate refresh in WhatsApp can be forced by entering the chat window with the business and opening the chat info page. Regardless of WhatsApp client behavior, the semantics of settings are still honored on the server side.</div><div>Troubleshoot the call icon not showing using the following steps:</div><span>Navigate to the chat window for the business and click on the business name or number in the chat title bar. This opens the Business Info screen and forces the app to refresh calling state for the business.</span><span>Navigate out of the chat window for the business and re-enter.</span><span>If the expected state is still not visible, kill the WhatsApp app and restart it.</span><span>Make sure to [get call settings](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) to double confirm expected call settings.</span><div id="bkmrk-how-long-does-it-tak"><div id="bkmrk-how-long-does-it-tak-1"><div>##### How long does it take for WhatsApp clients to reflect changes to calling configuration?

</div></div></div><div>It can take up to 7 days although most WhatsApp users should reflect the changes much sooner.</div><div>One WhatsApp Business can have chats with any number of 3B+ WhatsApp users. Updates to calling settings sends change notifications to all users that have a chat with this business visible in their WhatsApp Inbox. However notification delivery is best effort so not all users may receive it.</div><div>All WhatsApp clients refresh the business information (including calling configuration) every 7 days regardless of getting any change notifications.</div><div>In either case (notification driven or 7d refresh), once the local state in WhatsApp client is refreshed, it is reflected in UI only on next enter of the chat screen or chat info screen.</div><div id="bkmrk-must-i-create-an-all"><div id="bkmrk-must-i-create-an-all-1"><div>##### Must I create an allowlist of consumer numbers for calling to work?

</div></div></div><div>No.</div><div id="bkmrk-is-it-possible-to-li"><div id="bkmrk-is-it-possible-to-li-1"><div>##### Is it possible to limit calling access to specific or individual WhatsApp users instead of all WhatsApp users?

</div></div></div><div>Example: a lead that’s qualified or a customer who is in premium tier</div><div>No. There is no way to control visibility or access of calling on an individual WhatsApp user basis. However the [Call Settings API](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) can be used to set `call_icon_visibility` to `DISABLE_ALL` which will hide call icons to all WhatsApp users. For qualified WhatsApp users, a message with the call CTA button can be sent so only they can call the business by tapping on the button in the message</div><div>Providing this type of feature would require Meta to store configuration per WhatsApp user which has higher privacy risk. It will also incur higher operational overhead to maintain large lists of allowlisted WhatsApp users on an ongoing basis.</div><div id="bkmrk-when-the-call-icon-i"><div id="bkmrk-when-the-call-icon-i-1"><div>##### When the call icon is hidden using Call Settings API, is it still possible for consumers to call the business?

</div></div></div><div>Yes.</div><div>A user can still call the business from other entry points which are unaffected by the [Call Settings API](/books/meta-whatsapp/page/configure-call-settings-developer-documentation) such as:</div><span>Save the business number as a contact and use new call</span><span>Call logs from Calls tab &gt; Recent</span><span>Call CTA in messages sent from the business</span><span>Call bubble in the chat window that appears following any call between user and business</span><div>Hence the recommendation is to treat `DISABLE_ALL` only as a broad first level filter and ensure webhooks do any additional filtering based on specific business logic.</div><div id="bkmrk-how-will-whatsapp-co"><div id="bkmrk-how-will-whatsapp-co-1"><div>##### How will WhatsApp consumers type digits for DTMF?

</div></div></div><div>WhatsApp consumer apps are extended to support a new keypad for business calls.</div><div>[Learn more about DTMF support in Calling API](/books/meta-whatsapp/page/user-initiated-calls-developer-documentation)</div><div id="bkmrk-what-is-the-min-vers"><div id="bkmrk-what-is-the-min-vers-1"><div>##### What is the min version of WhatsApp mobile apps that support the voice call button?

</div></div></div><span>Min app version for Android is 2.24.1</span><div id="bkmrk-what-is-the-experien"><div id="bkmrk-what-is-the-experien-1"><div>##### What is the experience on the WhatsApp consumer side at various points in the call setup flow?

</div></div></div><div>When a WhatsApp consumer calls a business, the local ringback tone starts immediately if the WhatsApp consumer device has internet connectivity.</div><div>The call UI shows ‘Calling BUSINESS_NAME’. When Cloud API receives the consumer call request and pre-accepts the call, the call UI changes to ‘Ringing BUSINESS_NAME’. After the accept Graph API call is made, the call UI changes to an active call window showing live timer for the call duration.</div><div id="bkmrk-is-calling-supported"><div id="bkmrk-is-calling-supported-1"><div>##### Is calling supported for end users from WhatsApp Web or WhatsApp Desktop apps?

</div></div></div><div>No. WhatsApp Web does not support consumer-v-consumer or business calls. Desktop apps support only consumer-v-consumer calls at this point.</div><div id="bkmrk-business-initiated-c"><div id="bkmrk-business-initiated-c-1"><div>### Business Initiated Calling FAQ

</div></div></div><div id="bkmrk-what-whatsapp-versio"><div id="bkmrk-what-whatsapp-versio-1"><div>##### What WhatsApp versions and client platforms support the business initiated calling feature?

</div></div></div><div>WhatsApp Client versions 2.24.14.x and later support the call permission requests and business initiated calling feature.</div><div>Both WhatsApp Android and iOS platforms support the feature.</div><div id="bkmrk-how-to-avoid-138011-"><div id="bkmrk-how-to-avoid-138011--1"><div>##### How to avoid 138011 in Business Initiated and user initiated conversation while dev/integration/testing?

</div></div></div><div>User Initiated conversation:</div><span>Send a message to the Cloud API number from the WhatsApp consumer account</span><span>Send any message apart from the call permission message to the user</span><span>Send a call permission request to the user</span><span>Accept the call permission requests on the user’s device</span><div>Business Initiated conversation:</div><span>Send a template message to the user from the business</span><span>Send the call permission request to the user</span><span>Accept the call permission requests on the user’s device</span><div id="bkmrk-is-there-a-way-to-re"><div id="bkmrk-is-there-a-way-to-re-1"><div>##### Is there a way to reset the call permission request limits?

</div></div></div><div>A connected call will reset the call permission limits.</div><div id="bkmrk-what-happens-if-the--3"><div id="bkmrk-what-happens-if-the--4"><div>##### What happens if the WhatsApp user has set up Silence Unknown Callers settings?

</div></div></div><div>Business initiated calls bypass ‘Silence Unknown Callers’ settings since the call can only happen after explicit permission provided by the user.</div><div id="bkmrk-why-is-my-call-permi"><div id="bkmrk-why-is-my-call-permi-1"><div>##### Why is my Call Permission Request message rendered differently?

</div></div></div><div>WhatsApp’s renders messages on unsupported client app versions differently than supported ones.</div><div>After the WhatsApp user updates their client app, it will be rendered correctly.</div><div id="bkmrk-i-received-error-138"><div id="bkmrk-i-received-error-138-1"><div>##### I received error 138001 after sending a Call Permission Request, what do I do?

</div></div></div><div>[Please view error codes in the troubleshooting page](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation)</div><div id="bkmrk-does-the-permission-"><div id="bkmrk-does-the-permission--1"><div>##### Does the permission expire after 24 hour connected calls limit is reached? I am seeing error `138012`.

</div></div></div><div>Limit on connected calls in 24 hours is a time window based running limit. Reaching that limit does not revoke the permission, permission remains open until the full 7 days for temporary allowed permissions or permanently for always allowed permissions. [Call permission rate limit API](/books/meta-whatsapp/page/obtain-user-call-permissions-developer-documentation) provides the exact timestamp when this limit is expires and next call can be made.</div><div>Think of this as a rate limit for business initiated calls.</div><div id="bkmrk-session-initiation-p"><div id="bkmrk-session-initiation-p-1"><div>### Session Initiation Protocol (SIP) FAQ

</div></div></div><div>See [SIP Errors](/books/meta-whatsapp/page/troubleshoot-whatsapp-calling-errors-reference-guide-developer-documentation) for SIP specific errors and possible solutions.</div><div id="bkmrk-why-is-user-initiate"><div id="bkmrk-why-is-user-initiate-1"><div>##### Why is user initiated call getting disconnected immediately after enabling SIP?

</div></div></div><div>Most likely reason for this is certificate validation error: See [How to test if you have a valid TLS certificate](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</div><div id="bkmrk-why-am-i-not-getting"><div id="bkmrk-why-am-i-not-getting-1"><div>##### Why am I not getting SIP INVITE when WhatsApp users calls?

</div></div></div><div>Possible reasons include</div><span>TLS certificate validation error: See [How to test if you have a valid TLS certificate](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)</span><span>SIP is not configured. [Fetch calling configuration](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) to make sure SIP is enabled</span><span>The app that configured the SIP server does not have `whatsapp_business_messaging` permission on the business phone number. Try to [send a message](/books/meta-whatsapp/page/sending-messages-developer-documentation) using the same business phone number as a way to verify the right permissions are in place.</span><div id="bkmrk-why-is-our-sip-termi"><div id="bkmrk-why-is-our-sip-termi-1"><div>##### Why is our SIP TERMINATE to Meta is not hanging up on WhatsApp user side?

</div></div></div><div>Common reason is TLS handshake failure when the SIP server is trying to establish a TLS session with Meta SIP server. Do a network packet capture of SIP traffic or check the SIP server logs to confirm successful TLS handshake</div><div id="bkmrk-why-is-my-sip-server"><div id="bkmrk-why-is-my-sip-server-1"><div>##### Why is my SIP server continuously responding with 401 Unauthorized for user initiated calls?

</div></div></div><div>Meta supports SIP digest auth for [user initiated calls](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation). When the SIP server responds with 401 Unauthorized (see [example flow](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation)), Meta SIP server will resend the INVITE with proper Authorization header. Make sure the SIP server is configured with username as the business phone number and password as the Meta generated password for the business phone number.</div><div>Alternatively, digest auth can be disabled on the SIP server, although this is NOT recommended from a security best practices point of view.</div><div id="bkmrk-why-is-my-sip-server-3"><div id="bkmrk-why-is-my-sip-server-4"><div>##### Why is my SIP server responding with 488 Not Acceptable Here?

</div></div></div><div>Consult the SIP server documentation or vendor. The likely reason is the SIP server does not support WebRTC ICE (Interactive Connectivity Establishment) protocol. To fix this, [configure the business phone number to use SDES](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation) instead.</div><div id="bkmrk-is-it-required-to-si"><div id="bkmrk-is-it-required-to-si-1"><div>##### Is it required to SIP REGISTER business phone number to Meta SIP server?

</div></div></div><div>No. Do not send REGISTER requests to Meta’s SIP server. Doing so is unnecessary resource consumption on both sides. REGISTER requests will fail with 403 Forbidden error. As such Meta’s SIP server owns only meta.vc domain and the only SIP users in that domain are regular WhatsApp consumer users. The WhatsApp Business Numbers belong to the SIP domain configured using the [settings API](/books/meta-whatsapp/page/sip-configuration-guide-whatsapp-business-calling-developer-documentation).</div><div id="bkmrk-does-meta-support-si"><div id="bkmrk-does-meta-support-si-1"><div>##### Does Meta support SIP re-INVITEs?

</div></div></div><div>No. Re-INVITES are not supported today. A 500 Internal Server Error is returned from Meta SIP server.</div><div id="bkmrk-is-sip-calling-as-go"><div id="bkmrk-is-sip-calling-as-go-1"><div>##### Is SIP calling as good as the Cloud Graph API/webhook option? Any reason to pick one over the other?

</div></div></div><div>Yes, there is functional parity between the two options. The best way to identify the best option is to complete a thorough assessment and select based on needs.</div><div id="bkmrk-if-sip-is-used-for-c"><div id="bkmrk-if-sip-is-used-for-c-1"><div>##### If SIP is used for calling, are webhooks still needed?

</div></div></div><div>SIP for calling only covers call specific events. For messaging or any non-call specific events, webhooks still need to be used.</div><div id="bkmrk-does-meta-have-a-spe"><div id="bkmrk-does-meta-have-a-spe-1"><div>##### Does Meta have a specific, approved list of vendors or SBCs for SIP?

</div></div></div><div>No. Any compatible SIP server.</div></div>