Senders API - WhatsApp
The Senders API allows you to create, retrieve, update, and delete WhatsApp senders programmatically. A WhatsApp sender represents a phone number registered with WhatsApp Business through Twilio.
Warning
Senders API v1 will be deprecated on September 1, 2026. After that date, the service accepts only Senders API v2 requests. Update your integration to use v2 following the snippets in this guide before the deprecation occurs.
https://messaging.twilio.com/v2/Channels/Senders
The SID of the sender.
^XE[0-9a-fA-F]{32}$Min length: 34Max length: 34The status of the sender.
CREATINGONLINEOFFLINEPENDING_VERIFICATIONVERIFYINGONLINE:UPDATINGTWILIO_REVIEWDRAFTSTUBBEDThe ID of the sender in whatsapp:<E.164_PHONE_NUMBER> format.
whatsapp:+15017122661The configuration settings for creating a sender.
WhatsApp only. The display name the most recent change applies to — awaiting Meta review, approved by Meta and awaiting re-registration, or, once pending_display_name_status is COMPLETED, the name now in effect (identical to name). Absent when no display name change has been made, and once a completed change stops being reported.
WhatsApp only. The status of the most recent display name change. PENDING_REVIEW, APPROVED and DECLINED are reported by Meta. PIN_MISMATCH and REGISTRATION_FAILED mean Meta approved the name but it could not be applied; EXPIRED means Meta's 14-day window to apply an approved name elapsed. In all three cases, re-submit the same profile.name to retry. COMPLETED means the name was approved and applied — name now returns it. A COMPLETED change is reported for 14 days after it completes and is absent afterwards, so treat its presence as "recently completed" rather than a permanent flag; use pending_display_name_status_date to tell how recent. Absent when no display name change has been made.
PENDING_REVIEWAPPROVEDDECLINEDPIN_MISMATCHREGISTRATION_FAILEDEXPIREDCOMPLETEDWhatsApp only. The date and time in UTC when pending_display_name_status last changed, specified in ISO 8601 format. Absent whenever pending_display_name_status is absent, so the three pending_display_name* fields are always present or absent together.
The reasons why the sender is offline.
The KYC compliance information. This section consists of response to the request launch.
The URL of the resource.
Compliance not applicable
For WhatsApp senders, the Compliance property is set to null.
POST https://messaging.twilio.com/v2/Channels/Senders
application/jsonThe ID of the sender in whatsapp:<E.164_PHONE_NUMBER> format.
whatsapp:+15017122661The configuration settings for creating a sender.
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function createChannelsSender() {14const channelsSender = await client.messaging.v2.channelsSenders.create({15sender_id: "whatsapp:+15551234",16});1718console.log(channelsSender.sid);19}2021createChannelsSender();
Response
1{2"sid": "XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",3"status": "CREATING",4"sender_id": "whatsapp:+15551234",5"configuration": {6"waba_id": "1234567XXX",7"verification_method": "sms",8"verification_code": null,9"voice_application_sid": "APXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",10"account_type": null11},12"webhook": {13"callback_url": "https://callback.example.com",14"callback_method": "POST",15"fallback_url": "https://fallback.example.com",16"fallback_method": "POST",17"status_callback_url": "https://statuscallback.example.com",18"status_callback_method": "POST"19},20"profile": {21"name": "Example Profile Name",22"about": "This is an example about text.",23"address": "123 Example St, Example City, EX 12345",24"description": "This is an example description.",25"emails": [26{27"email": "example@example.com",28"label": "Email"29},30{31"email": "example2@example.com",32"label": "Email"33}34],35"logo_url": "https://logo_url.example.com",36"vertical": "Automotive",37"websites": [38{39"website": "https://website1.example.com",40"label": "Website1"41},42{43"website": "http://website2.example.com",44"label": "Website2"45}46]47}48}
The POST /v2/Channels/Senders request creates and registers a WhatsApp sender asynchronously. If the request successfully creates a sender but fails to complete the registration, you can find more information in the Error Log in the Twilio Console (Console | Legacy Console).
An error log includes the following details:
- Error description
- Recommended actions to resolve it
- Resource SID, which matches the Sender SID in your initial request
To monitor error logs, use Alarms or Event Streams.
Set up an alarm to receive instant notifications by email, Twilio Console, or webhook when error thresholds are met within a specific timeframe.
For example, you can set alarms for the following common errors:
- 63104: Maximum number of phone numbers reached for your WhatsApp Business Account (WABA)
- 63110: The phone number is already registered on WhatsApp
- 63111: Sender's phone number or WABA returned "not found"
- 63100: Validation Error
- 63113: Sender Cannot Be Verified
- 63114: Too Many Verification Codes
- 63116: WhatsApp Sender failed to be automatically registered as OTP was not received
Set up an Event Stream to subscribe to Error Log events to receive notifications for every logged error. Each event payload includes the error code and a correlation_sid, which matches the Sender SID in the response of your initial request. This helps you track and resolve errors.
GET https://messaging.twilio.com/v2/Channels/Senders/{Sid}
The SID of the sender.
^XE[0-9a-fA-F]{32}$Min length: 34Max length: 341// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function fetchChannelsSender() {14const channelsSender = await client.messaging.v215.channelsSenders("XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")16.fetch();1718console.log(channelsSender.sid);19}2021fetchChannelsSender();
Response
1{2"sid": "XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",3"status": "ONLINE",4"sender_id": "whatsapp:+999999999XX",5"configuration": {6"waba_id": "1234567XXX",7"verification_method": null,8"verification_code": null,9"voice_application_sid": "APXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",10"account_type": null11},12"webhook": {13"callback_url": "https://callback.example.com",14"callback_method": "POST",15"fallback_url": "https://fallback.example.com",16"fallback_method": "POST",17"status_callback_url": "https://statuscallback.example.com",18"status_callback_method": "POST"19},20"profile": {21"name": "Example Profile Name",22"about": "This is an example about text.",23"address": "123 Example St, Example City, EX 12345",24"description": "This is an example description.",25"emails": [26{27"email": "email@email.com",28"label": "Email"29}30],31"logo_url": "https://logo_url.example.com",32"vertical": "Automotive",33"websites": [34{35"website": "https://website1.example.com",36"label": "Website"37},38{39"website": "http://website2.example.com",40"label": "Website"41}42],43"banner_url": null,44"privacy_url": null,45"terms_of_service_url": null,46"accent_color": null,47"use_case": null,48"phone_numbers": null49},50"compliance": null,51"properties": {52"quality_rating": "HIGH",53"messaging_limit": "10K Customers/24hr"54},55"offline_reasons": null,56"url": "https://messaging.twilio.com/v2/Channels/Senders/XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"57}
GET https://messaging.twilio.com/v2/Channels/Senders
The number of items to return per page. For WhatsApp, the default is 20.
50Minimum: 1Maximum: 1000The page token provided by the API.
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function listChannelsSender() {14const channelsSenders = await client.messaging.v2.channelsSenders.list({15channel: "whatsapp",16limit: 20,17});1819channelsSenders.forEach((c) => console.log(c.sid));20}2122listChannelsSender();
Response
1{2"senders": [],3"meta": {4"page": 0,5"page_size": 10,6"first_page_url": "https://messaging.twilio.com/v2/Channels/Senders?PageSize=10&Page=0&Channel=whatsapp",7"previous_page_url": null,8"url": "https://messaging.twilio.com/v2/Channels/Senders?PageSize=10&Page=0&Channel=whatsapp",9"next_page_url": null,10"key": "senders"11}12}
POST https://messaging.twilio.com/v2/Channels/Senders/{Sid}
The SID of the sender.
^XE[0-9a-fA-F]{32}$Min length: 34Max length: 34application/jsonThe configuration settings for creating a sender.
To update a WhatsApp sender's information, make a POST request to the Sender resource. To verify a WhatsApp sender, include the verification_code parameter in your request.
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function updateChannelsSender() {14const channelsSender = await client.messaging.v215.channelsSenders("XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")16.update({17friendly_name: "friendly_name",18});1920console.log(channelsSender.sid);21}2223updateChannelsSender();
Response
1{2"sid": "XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",3"status": "VERIFYING",4"sender_id": "whatsapp:+999999999XX",5"friendly_name": "friendly_name",6"compliance": null,7"configuration": {8"waba_id": "1234567XXX",9"verification_method": "sms",10"verification_code": null,11"voice_application_sid": "APaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",12"account_type": null13},14"webhook": {15"callback_url": "https://callback.example.com",16"callback_method": "POST",17"fallback_url": "https://fallback.example.com",18"fallback_method": "POST",19"status_callback_url": "https://statuscallback.example.com",20"status_callback_method": "POST"21},22"profile": {23"about": "Example about text",24"address": "123 Example St, Example City, EX 12345",25"description": "Example description",26"emails": [27{28"email": "email@email.com",29"label": "Email"30}31],32"name": "Example Business",33"logo_url": "https://logo_url.example.com",34"vertical": "Automotive",35"websites": [36{37"website": "https://website1.example.com",38"label": "Website"39},40{41"website": "http://website2.example.com",42"label": "Website"43}44],45"banner_url": null,46"privacy_url": null,47"terms_of_service_url": null,48"accent_color": null,49"phone_numbers": null50},51"display_name_status": "updating"52}
DELETE https://messaging.twilio.com/v2/Channels/Senders/{Sid}
The SID of the sender.
^XE[0-9a-fA-F]{32}$Min length: 34Max length: 34Turn off 2FA before re-registering a number
If you want to re-register the same number after deleting a sender, you must turn off Two-Factor Authentication (2FA) for the number in the WhatsApp Manager.
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function deleteChannelsSender() {14await client.messaging.v215.channelsSenders("XEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")16.remove();17}1819deleteChannelsSender();
You can update the display name of an existing WhatsApp Cloud API sender by using the Senders API. Twilio submits the change to Meta for review and, after approval, automatically applies the new name.
- Scope: Supported for WhatsApp Cloud API senders only.
- Length: Display names must be 1–255 characters.
- Rate limits: Meta allows a limited number of display-name changes per 30-day period.
- Meta Approval window: Meta display name approvals remain valid for 14 days. After Meta approves the new name, Twilio asynchronously re-registers it within this window. No action is required on your part.
Send a POST request to the Senders endpoint that includes the new name in the profile object. You can submit profile.name by itself or with other profile properties.
1POST https://messaging.twilio.com/v2/Channels/Senders/{Sid}23Content-Type: application/json45{6"profile": {7"name": "New Business Name"8}9}
A valid request returns HTTP 202 Accepted. The response includes the submission status in profile.display_name_status.
1{2"sid": "XE0123456789abcdef0123456789abcdef",3"profile": {4"display_name_status": "updating"5}6}
| Status | Description |
|---|---|
updating | Request accepted and submitted to Meta for review, or routed to automatic re-registration. |
no_change | Submitted name matches the sender's current, verified display name. No update sent to Meta. |
pending_review | Submitted name matches a name already pending Meta review. |
error | The display-name update failed, but other profile fields (if any) succeeded. |
Because Meta must review display-name updates, the operation is asynchronous. To check the current status, fetch the sender.
GET https://messaging.twilio.com/v2/Channels/Senders/{Sid}
Example response while an update is in progress:
1{2"sid": "XE0123456789abcdef0123456789abcdef",3"status": "ONLINE",4"profile": {5"name": "Current Business Name",6"pending_display_name": "New Business Name",7"pending_display_name_status": "PENDING_REVIEW",8"pending_display_name_status_date": "2026-08-03T10:15:00Z"9}10}
After Meta approves and Twilio applies the name, profile.name returns the new name and pending_display_name_status becomes COMPLETED. The pending_display_name* fields are still reported for 14 days after completion, then removed together.
| Parameter | Type | Description |
|---|---|---|
profile.pending_display_name | string | The requested display name that is awaiting review or application. |
profile.pending_display_name_status | string | The status of the pending display-name update. See the table below. |
profile.pending_display_name_status_date | string (ISO 8601) | Timestamp of the last pending-status update. |
| Status | Description |
|---|---|
| PENDING_REVIEW | Display name submitted and awaiting Meta review. |
| APPROVED | Meta approved the display name; Twilio is applying the change. |
| DECLINED | Meta rejected the display name. |
| PIN_MISMATCH | Automatic re-registration failed because the 2FA PIN is invalid. |
| REGISTRATION_FAILED | Automatic re-registration failed because of a system error. |
| EXPIRED | Meta approved the display name, but the 14-day re-registration window elapsed before application. |
| COMPLETED | Meta approved the display name and Twilio applied it; profile.name now returns it. Reported for 14 days after completion. |
If a request ends with PIN_MISMATCH or REGISTRATION_FAILED:
- Resolve the underlying issue (for example, reset the 2FA PIN in Meta's WhatsApp Business Manager).
- Re-submit the same
profile.namewithPOST /v2/Channels/Senders/{Sid}.
Twilio detects an existing approval and immediately attempts to re-register the sender without consuming additional Meta quota or initiating a new review. If you submit the sender's current name together with other profile fields, the API returns no_change for the name but updates the other fields.
Resubmitting the current name does not cancel a pending name change. The review continues, and the name is updated if Meta approves the change. The API does not provide a cancel operation.```
| HTTP status | Twilio error code | Description | Action required |
|---|---|---|---|
| 400 Bad Request | 63124 | Display name rejected by Meta. | Modify the name to meet Meta Display-Name Guidelines and retry. |
| 409 Conflict | 63121 | A display-name change is already in progress for this sender. | Wait for the existing review process to finish before submitting a new request. |
| 400 Bad Request | 63100 | Validation error, such as an empty name, a name over 255 characters, or an empty request body. | Correct the request and resubmit. |
| 404 Not Found | 20404 | The sender was not found, or is not a registered WhatsApp Cloud API sender. | Verify the Sender SID and that the sender is a registered Cloud API sender. |
| 503 Service Unavailable | 63117 | Twilio could not reach Meta to submit the change. | Retry after a short delay. |
- Review the Meta WhatsApp Display Name Guidelines
- Read the Meta Display Name developer documentation