# Register WhatsApp senders - ISVs

Learn how Independent Software Vendors (ISVs) can register WhatsApp senders for their customers using Meta's Embedded Signup or the Senders API.

## Phone number requirements

You can use either a Twilio phone number or a non-Twilio phone number to register a WhatsApp sender.

* The phone number must meet the [WhatsApp compatibility requirements](https://help.twilio.com/articles/360026678054).
* The phone number must not already be registered with WhatsApp. Learn how to [check if a phone number is registered with WhatsApp](#i-want-to-check-if-a-phone-number-is-registered-with-whatsapp) and how to [use an already registered phone number](#i-want-to-use-an-already-registered-phone-number).
* If the phone number is non-Twilio, it must be able to receive SMS or voice calls.
  * If the phone number is registered with an Interactive Voice Response (IVR) system or a computer-operated phone system, you can't receive One-Time Passwords (OTPs).
  * If the phone number is only available for outbound messages or calls, you can't use it to register a WhatsApp sender because Meta can't deliver OTPs.

## Display name requirements

The WhatsApp sender display name (`profile.name`) must comply with [Meta's display name guidelines](https://www.facebook.com/business/help/757569725593362). Meta reviews the name after registration. Before bulk registration, register a single sender first to confirm that the name is accepted. If Meta rejects the name, the phone number is limited to 250 business-initiated messages per 24-hour period, and Meta might disconnect the sender.

## Register the first WhatsApp sender

Your customer must register their first WhatsApp sender using Meta's Embedded Signup. The process involves the following steps:

1. You join the [Tech Provider Program](/docs/whatsapp/isv/tech-provider-program) and [integrate Meta's Embedded Signup](/docs/whatsapp/isv/tech-provider-program/integration-guide#part-3-complete-the-technical-integration) into your application.
2. Your customer registers the first WhatsApp sender using the Embedded Signup.\
   As part of the registration process, your customer will create a WhatsApp Business Account (WABA).
3. You [create a Twilio subaccount for your customer](/docs/whatsapp/isv/tech-provider-program/integration-guide#create-a-subaccount-for-each-customer), then [use the Senders API to connect their WABA to the subaccount](/docs/whatsapp/isv/tech-provider-program/integration-guide#register-the-whatsapp-sender).

## Register additional WhatsApp senders

After registering the first WhatsApp sender, there are two ways to register additional WhatsApp senders:

* **Embedded Signup**: Your customers register additional senders using the Embedded Signup in your application. If you have access to your customer's WABA, you can register WhatsApp senders on their behalf.
* **Senders API**: You register additional WhatsApp senders on behalf of your customers using the Senders API.

> \[!NOTE]
>
> Twilio recommends using the API only when you need to onboard a large number of senders across many accounts (bulk registration). Use the Embedded Signup for a small number of senders.

### Using the Embedded Signup in your application

You or your customers can register additional WhatsApp senders using the Embedded Signup flow they used to register their first WhatsApp sender.

> \[!WARNING]
>
> The Embedded Signup flow times out after 60 minutes of inactivity. Progress isn't saved and you must restart the registration process.

1. Click the **Login with Facebook** button in your application's UI.
2. Log in to Meta Business Manager.
3. Review the permissions Meta requests for your WABA and business assets, then continue.
4. Choose your Meta Business Portfolio and WABA.\
   For each sender, you must select the same Meta Business Portfolio and WABA that you used for the first WhatsApp sender. Selecting a different Meta Business Portfolio or WABA will result in an error.
   > \[!NOTE]
   >
   > You can't use multiple WABAs in one Twilio account.
5. Enter the phone number you want to register and complete the OTP verification via SMS or voice call.
6. Review and accept the access/permissions required by the embedded flow.
7. Complete the flow and close the window once Meta confirms successful sender registration.
8. [Use the Senders API to connect the WABA to the Twilio subaccount](/docs/whatsapp/isv/tech-provider-program/integration-guide#register-the-whatsapp-sender).

### Using the Senders API

The [Senders API](/docs/whatsapp/api/senders) allows you to register additional WhatsApp senders on behalf of your customers. This is useful when you have many customers and each customer needs multiple senders created across many Twilio subaccounts.

Meta requires ownership verification for every phone number registered with WhatsApp before that number can send or receive messages. Meta verifies ownership through SMS or voice call OTPs.

The registration process depends on the phone number type (Twilio or non-Twilio) and capabilities (SMS or voice) to receive the OTP for verification.

| Phone number type | Capabilities | Verification | OTP verification code delivery                                                                                                                   |
| ----------------- | ------------ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Twilio            | SMS          | Automatic    | Twilio handles the verification automatically during the registration process.                                                                   |
|                   | Voice        | Manual       | Configure the phone number to receive the OTP verification code via email. You must manually complete the verification by making an API request. |
| Non-Twilio        | SMS          | Manual       | Receive the OTP verification code via SMS. You must manually complete the verification by making an API request.                                 |
|                   | Voice        | Manual       | Receive the OTP verification code via voice call. You must manually complete the verification by making an API request.                          |

## SMS: Twilio phone numbers

1. Buy a Twilio phone number that has SMS capabilities.

   Purchase a phone number

   ```js
   // Download the helper library from https://www.twilio.com/docs/node/install
   const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";

   // Find your Account SID and Auth Token at twilio.com/console
   // and set the environment variables. See http://twil.io/secure
   const accountSid = process.env.TWILIO_ACCOUNT_SID;
   const authToken = process.env.TWILIO_AUTH_TOKEN;
   const client = twilio(accountSid, authToken);

   async function createIncomingPhoneNumber() {
     const incomingPhoneNumber = await client.incomingPhoneNumbers.create({
       phoneNumber: "+14155552344",
     });

     console.log(incomingPhoneNumber.accountSid);
   }

   createIncomingPhoneNumber();
   ```

   ```python
   # Download the helper library from https://www.twilio.com/docs/python/install
   import os
   from twilio.rest import Client

   # Find your Account SID and Auth Token at twilio.com/console
   # and set the environment variables. See http://twil.io/secure
   account_sid = os.environ["TWILIO_ACCOUNT_SID"]
   auth_token = os.environ["TWILIO_AUTH_TOKEN"]
   client = Client(account_sid, auth_token)

   incoming_phone_number = client.incoming_phone_numbers.create(
       phone_number="+14155552344"
   )

   print(incoming_phone_number.account_sid)
   ```

   ```csharp
   // Install the C# / .NET helper library from twilio.com/docs/csharp/install

   using System;
   using Twilio;
   using Twilio.Rest.Api.V2010.Account;
   using System.Threading.Tasks;

   class Program {
       public static async Task Main(string[] args) {
           // Find your Account SID and Auth Token at twilio.com/console
           // and set the environment variables. See http://twil.io/secure
           string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
           string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");

           TwilioClient.Init(accountSid, authToken);

           var incomingPhoneNumber = await IncomingPhoneNumberResource.CreateAsync(
               phoneNumber: new Twilio.Types.PhoneNumber("+14155552344"));

           Console.WriteLine(incomingPhoneNumber.AccountSid);
       }
   }
   ```

   ```java
   // Install the Java helper library from twilio.com/docs/java/install

   import com.twilio.type.PhoneNumber;
   import com.twilio.Twilio;
   import com.twilio.rest.api.v2010.account.IncomingPhoneNumber;

   public class Example {
       // Find your Account SID and Auth Token at twilio.com/console
       // and set the environment variables. See http://twil.io/secure
       public static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID");
       public static final String AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN");

       public static void main(String[] args) {
           Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
           IncomingPhoneNumber incomingPhoneNumber =
               IncomingPhoneNumber.creator(new com.twilio.type.PhoneNumber("+14155552344")).create();

           System.out.println(incomingPhoneNumber.getAccountSid());
       }
   }
   ```

   ```go
   // Download the helper library from https://www.twilio.com/docs/go/install
   package main

   import (
   	"fmt"
   	"github.com/twilio/twilio-go"
   	api "github.com/twilio/twilio-go/rest/api/v2010"
   	"os"
   )

   func main() {
   	// Find your Account SID and Auth Token at twilio.com/console
   	// and set the environment variables. See http://twil.io/secure
   	// Make sure TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN exists in your environment
   	client := twilio.NewRestClient()

   	params := &api.CreateIncomingPhoneNumberParams{}
   	params.SetPhoneNumber("+14155552344")

   	resp, err := client.Api.CreateIncomingPhoneNumber(params)
   	if err != nil {
   		fmt.Println(err.Error())
   		os.Exit(1)
   	} else {
   		if resp.AccountSid != nil {
   			fmt.Println(*resp.AccountSid)
   		} else {
   			fmt.Println(resp.AccountSid)
   		}
   	}
   }
   ```

   ```php
   <?php

   // Update the path below to your autoload.php,
   // see https://getcomposer.org/doc/01-basic-usage.md
   require_once "/path/to/vendor/autoload.php";

   use Twilio\Rest\Client;

   // Find your Account SID and Auth Token at twilio.com/console
   // and set the environment variables. See http://twil.io/secure
   $sid = getenv("TWILIO_ACCOUNT_SID");
   $token = getenv("TWILIO_AUTH_TOKEN");
   $twilio = new Client($sid, $token);

   $incoming_phone_number = $twilio->incomingPhoneNumbers->create([
       "phoneNumber" => "+14155552344",
   ]);

   print $incoming_phone_number->accountSid;
   ```

   ```ruby
   # Download the helper library from https://www.twilio.com/docs/ruby/install
   require 'twilio-ruby'

   # Find your Account SID and Auth Token at twilio.com/console
   # and set the environment variables. See http://twil.io/secure
   account_sid = ENV['TWILIO_ACCOUNT_SID']
   auth_token = ENV['TWILIO_AUTH_TOKEN']
   @client = Twilio::REST::Client.new(account_sid, auth_token)

   incoming_phone_number = @client
                           .api
                           .v2010
                           .incoming_phone_numbers
                           .create(phone_number: '+14155552344')

   puts incoming_phone_number.account_sid
   ```

   ```bash
   # Install the twilio-cli from https://twil.io/cli

   twilio api:core:incoming-phone-numbers:create \
      --phone-number +14155552344
   ```

   ```bash
   curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/IncomingPhoneNumbers.json" \
   --data-urlencode "PhoneNumber=+14155552344" \
   -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN
   ```

   * The phone number must belong to the Twilio account or subaccount where you want to register the WhatsApp sender.
   * You can find available Twilio phone numbers by using the [AvailablePhoneNumbers Local](/docs/phone-numbers/api/availablephonenumberlocal-resource), [AvailablePhoneNumbers Mobile](/docs/phone-numbers/api/availablephonenumber-mobile-resource), and [AvailablePhoneNumbers TollFree](/docs/phone-numbers/api/availablephonenumber-tollfree-resource) resources.
   * Alternatively, you can [buy a Twilio phone number in the Twilio Console](https://console.twilio.com/us1/develop/phone-numbers/manage/search).
2. To register a WhatsApp sender, make a `POST /v2/Channels/Senders` request. The following properties are required in the request body:

   * `sender_id`: The phone number to register as a WhatsApp sender in [E.164 format](/docs/glossary/what-e164)
   * `profile.name`: The [WhatsApp sender display name](#display-name-requirements)

   For additional properties, see the [Senders API documentation](/docs/whatsapp/api/senders).

   > \[!WARNING]
   >
   > Allow several minutes between Senders API requests. Too many requests in a short period might result in errors.

   Register a WhatsApp sender (SMS: Twilio phone numbers)

   ```bash
   ## Create Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders" \
     -H "Content-Type: application/json; charset=utf-8" \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d $'{
     "sender_id": "whatsapp:+15017122661",
     "profile": {
       "address": "101 Spear Street, San Francisco, CA",
       "emails": [
         "support@twilio.com"
       ],
       "vertical": "Other",
       "logo_url": "https://www.twilio.com/logo.png",
       "description": "We\'re excited to see what you build!",
       "about": "Hello! We are Twilio.",
       "name": "Twilio",
       "websites": [
         "https://twilio.com",
         "https://help.twilio.com"
       ]
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     }
   }'
   ```

   ```json
   {
       "status": "CREATING",
       "sender_id": "whatsapp:+15017122661",
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "12345678912345"
       },
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "properties": null
     }
   ```

   This request creates a WhatsApp sender in Twilio's system, adds it to the WABA connected to your Twilio account, and completes the phone number verification.
3. To confirm that the WhatsApp sender is registered, make a `GET v2/Channels/Senders/{Sid}` request and check if `status` is `ONLINE`.\
   **Note**: Immediately after registration, the `status` value will be `OFFLINE`. Wait a few minutes, then make the request again.

   Confirm WhatsApp sender registration

   ```bash
   ## Fetch Sender
   curl -X "GET" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
        -H "Content-Type: application/json; charset=utf-8" \
        -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
   ```

   ```json
   {
     "status": "ONLINE",
     "sender_id": "whatsapp:+15017122661",
     "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "configuration": {
       "waba_id": "12345678912345"
     },
     "profile": {
       "about": "Hello! This is Twilio's official account.",
       "name": "Twilio",
       "vertical": "Other",
       "websites": [
         {
           "website": "https://twilio.com",
           "label": "Website"
         },
         {
           "website": "https://help.twilio.com",
           "label": "Website"
         }
       ],
       "address": "101 Spear Street, San Francisco, CA",
       "logo_url": "https://www.twilio.com/logo.png",
       "emails": [
         {
           "email": "support@twilio.com",
           "label": "Email"
         }
       ],
       "description": "We're excited to see what you build!"
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     },
     "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "properties": {
       "messaging_limit": "1K Customers/24hr",
       "quality_rating": "HIGH"
     }
   }
   ```

## Voice: Twilio phone numbers

1. Buy a Twilio phone number that has voice capabilities.

   Purchase a phone number

   ```js
   // Download the helper library from https://www.twilio.com/docs/node/install
   const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";

   // Find your Account SID and Auth Token at twilio.com/console
   // and set the environment variables. See http://twil.io/secure
   const accountSid = process.env.TWILIO_ACCOUNT_SID;
   const authToken = process.env.TWILIO_AUTH_TOKEN;
   const client = twilio(accountSid, authToken);

   async function createIncomingPhoneNumber() {
     const incomingPhoneNumber = await client.incomingPhoneNumbers.create({
       phoneNumber: "+14155552344",
     });

     console.log(incomingPhoneNumber.accountSid);
   }

   createIncomingPhoneNumber();
   ```

   ```python
   # Download the helper library from https://www.twilio.com/docs/python/install
   import os
   from twilio.rest import Client

   # Find your Account SID and Auth Token at twilio.com/console
   # and set the environment variables. See http://twil.io/secure
   account_sid = os.environ["TWILIO_ACCOUNT_SID"]
   auth_token = os.environ["TWILIO_AUTH_TOKEN"]
   client = Client(account_sid, auth_token)

   incoming_phone_number = client.incoming_phone_numbers.create(
       phone_number="+14155552344"
   )

   print(incoming_phone_number.account_sid)
   ```

   ```csharp
   // Install the C# / .NET helper library from twilio.com/docs/csharp/install

   using System;
   using Twilio;
   using Twilio.Rest.Api.V2010.Account;
   using System.Threading.Tasks;

   class Program {
       public static async Task Main(string[] args) {
           // Find your Account SID and Auth Token at twilio.com/console
           // and set the environment variables. See http://twil.io/secure
           string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
           string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");

           TwilioClient.Init(accountSid, authToken);

           var incomingPhoneNumber = await IncomingPhoneNumberResource.CreateAsync(
               phoneNumber: new Twilio.Types.PhoneNumber("+14155552344"));

           Console.WriteLine(incomingPhoneNumber.AccountSid);
       }
   }
   ```

   ```java
   // Install the Java helper library from twilio.com/docs/java/install

   import com.twilio.type.PhoneNumber;
   import com.twilio.Twilio;
   import com.twilio.rest.api.v2010.account.IncomingPhoneNumber;

   public class Example {
       // Find your Account SID and Auth Token at twilio.com/console
       // and set the environment variables. See http://twil.io/secure
       public static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID");
       public static final String AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN");

       public static void main(String[] args) {
           Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
           IncomingPhoneNumber incomingPhoneNumber =
               IncomingPhoneNumber.creator(new com.twilio.type.PhoneNumber("+14155552344")).create();

           System.out.println(incomingPhoneNumber.getAccountSid());
       }
   }
   ```

   ```go
   // Download the helper library from https://www.twilio.com/docs/go/install
   package main

   import (
   	"fmt"
   	"github.com/twilio/twilio-go"
   	api "github.com/twilio/twilio-go/rest/api/v2010"
   	"os"
   )

   func main() {
   	// Find your Account SID and Auth Token at twilio.com/console
   	// and set the environment variables. See http://twil.io/secure
   	// Make sure TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN exists in your environment
   	client := twilio.NewRestClient()

   	params := &api.CreateIncomingPhoneNumberParams{}
   	params.SetPhoneNumber("+14155552344")

   	resp, err := client.Api.CreateIncomingPhoneNumber(params)
   	if err != nil {
   		fmt.Println(err.Error())
   		os.Exit(1)
   	} else {
   		if resp.AccountSid != nil {
   			fmt.Println(*resp.AccountSid)
   		} else {
   			fmt.Println(resp.AccountSid)
   		}
   	}
   }
   ```

   ```php
   <?php

   // Update the path below to your autoload.php,
   // see https://getcomposer.org/doc/01-basic-usage.md
   require_once "/path/to/vendor/autoload.php";

   use Twilio\Rest\Client;

   // Find your Account SID and Auth Token at twilio.com/console
   // and set the environment variables. See http://twil.io/secure
   $sid = getenv("TWILIO_ACCOUNT_SID");
   $token = getenv("TWILIO_AUTH_TOKEN");
   $twilio = new Client($sid, $token);

   $incoming_phone_number = $twilio->incomingPhoneNumbers->create([
       "phoneNumber" => "+14155552344",
   ]);

   print $incoming_phone_number->accountSid;
   ```

   ```ruby
   # Download the helper library from https://www.twilio.com/docs/ruby/install
   require 'twilio-ruby'

   # Find your Account SID and Auth Token at twilio.com/console
   # and set the environment variables. See http://twil.io/secure
   account_sid = ENV['TWILIO_ACCOUNT_SID']
   auth_token = ENV['TWILIO_AUTH_TOKEN']
   @client = Twilio::REST::Client.new(account_sid, auth_token)

   incoming_phone_number = @client
                           .api
                           .v2010
                           .incoming_phone_numbers
                           .create(phone_number: '+14155552344')

   puts incoming_phone_number.account_sid
   ```

   ```bash
   # Install the twilio-cli from https://twil.io/cli

   twilio api:core:incoming-phone-numbers:create \
      --phone-number +14155552344
   ```

   ```bash
   curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/IncomingPhoneNumbers.json" \
   --data-urlencode "PhoneNumber=+14155552344" \
   -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN
   ```

   * You can find available Twilio phone numbers by using the [AvailablePhoneNumbers Local](/docs/phone-numbers/api/availablephonenumberlocal-resource), [AvailablePhoneNumbers Mobile](/docs/phone-numbers/api/availablephonenumber-mobile-resource), and [AvailablePhoneNumbers TollFree](/docs/phone-numbers/api/availablephonenumber-tollfree-resource) resources.
   * Alternatively, you can [buy a Twilio phone number in the Twilio Console](https://console.twilio.com/us1/develop/phone-numbers/manage/search).
2. Configure the phone number so it can receive OTP verification codes via voice call.
   1. Open the [Active Numbers page](https://www.twilio.com/console/phone-numbers/incoming).
   2. Click your Twilio phone number.
   3. In the **Voice Configuration** section, in the **Configure with** row, select **Webhook, TwiML Bin, Function, Studio Flow, Proxy Service**.
   4. In the **A call comes in** row, select **Webhook** and set the **URL** to `https://twimlets.com/voicemail?Email=<YOUR_EMAIL_ADDRESS>`. For example, `https://twimlets.com/voicemail?Email=support@example.com`.\
      **Note**: The [Voicemail Twimlet](https://console.twilio.com/us1/develop/twimlets/create?twimlet=voicemail) transcribes incoming calls and sends the transcription to your email address. This allows you to receive OTPs via email.
3. To register a WhatsApp sender, make a `POST /v2/Channels/Senders` request. The following properties are required in the request body:

   * `sender_id`: The phone number to register as a WhatsApp sender in [E.164 format](/docs/glossary/what-e164)
   * `profile.name`: The [WhatsApp sender display name](#display-name-requirements)

   For additional properties, see the [Senders API documentation](/docs/whatsapp/api/senders).

   > \[!WARNING]
   >
   > Allow several minutes between Senders API requests. Too many requests in a short period might result in errors.

   Register a WhatsApp sender (Voice: Twilio phone numbers)

   ```bash
   ## Create Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders" \
     -H "Content-Type: application/json; charset=utf-8" \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d $'{
     "sender_id": "whatsapp:+15017122661",
     "configuration": {
       "verification_method": "voice"
     },
     "profile": {
       "address": "101 Spear Street, San Francisco, CA",
       "emails": [
         "support@twilio.com"
       ],
       "vertical": "Other",
       "logo_url": "https://www.twilio.com/logo.png",
       "description": "We\'re excited to see what you build!",
       "about": "Hello! We are Twilio.",
       "name": "Twilio",
       "websites": [
         "https://twilio.com",
         "https://help.twilio.com"
       ]
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     }
   }'
   ```

   ```json
   {
       "status": "CREATING",
       "sender_id": "whatsapp:+15017122661",
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "12345678912345"
       },
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "properties": null
     }
   ```

   This request creates a WhatsApp sender in Twilio's system, adds it to the WABA connected to your Twilio account, and triggers the OTP from Meta.
4. To verify the phone number, make a `POST /v2/Channels/Senders/{Sid}` request with the OTP received via email.

   Verify the phone number

   ```bash
   ## Verify Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d '{
           "configuration": {
             "verification_code": "123456"
           }
         }'
   ```

   ```json
   {
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "sender_id": "whatsapp:+15558675310",
       "status": "VERIFYING",
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/",  
         "fallback_method": "POST",
         "fallback_url": "",
         "status_callback_url": "",
         "status_callback_method": "POST"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "123456789"
       },
       "properties": {
         "messaging_limit": "1K Customers/24hr",
         "quality_rating": "HIGH"
       }
     }
   ```
5. To confirm the WhatsApp sender is registered, make a `GET v2/Channels/Senders/{Sid}` request and check if `status` is `ONLINE`.\
   **Note**: Immediately after registration, the `status` value will be `OFFLINE`. Wait a few minutes, then make the request again.

   Confirm WhatsApp sender registration

   ```bash
   ## Fetch Sender
   curl -X "GET" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
        -H "Content-Type: application/json; charset=utf-8" \
        -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
   ```

   ```json
   {
     "status": "ONLINE",
     "sender_id": "whatsapp:+15017122661",
     "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "configuration": {
       "waba_id": "12345678912345"
     },
     "profile": {
       "about": "Hello! This is Twilio's official account.",
       "name": "Twilio",
       "vertical": "Other",
       "websites": [
         {
           "website": "https://twilio.com",
           "label": "Website"
         },
         {
           "website": "https://help.twilio.com",
           "label": "Website"
         }
       ],
       "address": "101 Spear Street, San Francisco, CA",
       "logo_url": "https://www.twilio.com/logo.png",
       "emails": [
         {
           "email": "support@twilio.com",
           "label": "Email"
         }
       ],
       "description": "We're excited to see what you build!"
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     },
     "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "properties": {
       "messaging_limit": "1K Customers/24hr",
       "quality_rating": "HIGH"
     }
   }
   ```

## SMS: Non-Twilio phone number

1. Make sure your phone number meets all [requirements](#phone-number-requirements) and can receive SMS messages.
2. To register a WhatsApp sender, make a `POST /v2/Channels/Senders` request. The following properties are required in the request body:

   * `sender_id`: The phone number to register as a WhatsApp sender in [E.164 format](/docs/glossary/what-e164)
   * `profile.name`: The [WhatsApp sender display name](#display-name-requirements)

   For additional properties, see the [Senders API documentation](/docs/whatsapp/api/senders).

   > \[!WARNING]
   >
   > Allow several minutes between Senders API requests. Too many requests in a short period might result in errors.

   Register a WhatsApp sender (SMS: Non-Twilio phone number)

   ```bash
   ## Create Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders" \
     -H "Content-Type: application/json; charset=utf-8" \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d $'{
     "sender_id": "whatsapp:+15017122661",
     "profile": {
       "address": "101 Spear Street, San Francisco, CA",
       "emails": [
         "support@twilio.com"
       ],
       "vertical": "Other",
       "logo_url": "https://www.twilio.com/logo.png",
       "description": "We\'re excited to see what you build!",
       "about": "Hello! We are Twilio.",
       "name": "Twilio",
       "websites": [
         "https://twilio.com",
         "https://help.twilio.com"
       ]
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     }
   }'
   ```

   ```json
   {
       "status": "CREATING",
       "sender_id": "whatsapp:+15017122661",
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "12345678912345"
       },
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "properties": null
     }
   ```

   This request creates a WhatsApp sender in Twilio's system, adds it to the WABA connected to your Twilio account, and triggers the OTP from Meta.
3. To verify the phone number, make a `POST /v2/Channels/Senders/{Sid}` request with the OTP received via SMS.

   Verify the phone number

   ```bash
   ## Verify Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d '{
           "configuration": {
             "verification_code": "123456"
           }
         }'
   ```

   ```json
   {
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "sender_id": "whatsapp:+15558675310",
       "status": "VERIFYING",
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/",  
         "fallback_method": "POST",
         "fallback_url": "",
         "status_callback_url": "",
         "status_callback_method": "POST"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "123456789"
       },
       "properties": {
         "messaging_limit": "1K Customers/24hr",
         "quality_rating": "HIGH"
       }
     }
   ```
4. To confirm the WhatsApp sender is registered, make a `GET v2/Channels/Senders/{Sid}` request and check if `status` is `ONLINE`.\
   **Note**: Immediately after registration, the `status` value will be `OFFLINE`. Wait a few minutes, then make the request again.

   Confirm WhatsApp sender registration

   ```bash
   ## Fetch Sender
   curl -X "GET" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
        -H "Content-Type: application/json; charset=utf-8" \
        -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
   ```

   ```json
   {
     "status": "ONLINE",
     "sender_id": "whatsapp:+15017122661",
     "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "configuration": {
       "waba_id": "12345678912345"
     },
     "profile": {
       "about": "Hello! This is Twilio's official account.",
       "name": "Twilio",
       "vertical": "Other",
       "websites": [
         {
           "website": "https://twilio.com",
           "label": "Website"
         },
         {
           "website": "https://help.twilio.com",
           "label": "Website"
         }
       ],
       "address": "101 Spear Street, San Francisco, CA",
       "logo_url": "https://www.twilio.com/logo.png",
       "emails": [
         {
           "email": "support@twilio.com",
           "label": "Email"
         }
       ],
       "description": "We're excited to see what you build!"
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     },
     "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "properties": {
       "messaging_limit": "1K Customers/24hr",
       "quality_rating": "HIGH"
     }
   }
   ```

## Voice: Non-Twilio phone number

1. Make sure your phone number meets all [requirements](#phone-number-requirements) and is able to receive voice calls.
2. To register a WhatsApp sender, make a `POST /v2/Channels/Senders` request. The following properties are required in the request body:

   * `sender_id`: The phone number to register as a WhatsApp sender in [E.164 format](/docs/glossary/what-e164)
   * `profile.name`: The [WhatsApp sender display name](#display-name-requirements)

   For additional properties, see the [Senders API documentation](/docs/whatsapp/api/senders).

   > \[!WARNING]
   >
   > Allow several minutes between Senders API requests. Too many requests in a short period might result in errors.

   Register a WhatsApp sender (Voice: Non-Twilio phone number)

   ```bash
   ## Create Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders" \
     -H "Content-Type: application/json; charset=utf-8" \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d $'{
     "sender_id": "whatsapp:+15017122661",
     "configuration": {
       "verification_method": "voice"
     },
     "profile": {
       "address": "101 Spear Street, San Francisco, CA",
       "emails": [
         "support@twilio.com"
       ],
       "vertical": "Other",
       "logo_url": "https://www.twilio.com/logo.png",
       "description": "We\'re excited to see what you build!",
       "about": "Hello! We are Twilio.",
       "name": "Twilio",
       "websites": [
         "https://twilio.com",
         "https://help.twilio.com"
       ]
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     }
   }'
   ```

   ```json
   {
       "status": "CREATING",
       "sender_id": "whatsapp:+15017122661",
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "12345678912345"
       },
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "properties": null
     }
   ```

   This request creates a WhatsApp sender in Twilio's system, adds it to the WABA connected to your Twilio account, and triggers the OTP from Meta.
3. To verify the phone number, make a `POST /v2/Channels/Senders/{Sid}` request with the OTP received via a voice call.

   Verify the phone number

   ```bash
   ## Verify Sender
   curl -X "POST" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
     -d '{
           "configuration": {
             "verification_code": "123456"
           }
         }'
   ```

   ```json
   {
       "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "sender_id": "whatsapp:+15558675310",
       "status": "VERIFYING",
       "profile": {
         "about": "Hello! This is Twilio's official account.",
         "name": "Twilio",
         "vertical": "Other",
         "websites": [
           {
             "website": "https://twilio.com",
             "label": "Website"
           },
           {
             "website": "https://help.twilio.com",
             "label": "Website"
           }
         ],
         "address": "101 Spear Street, San Francisco, CA",
         "logo_url": "https://www.twilio.com/logo.png",
         "emails": [
           {
             "email": "support@twilio.com",
             "label": "Email"
           }
         ],
         "description": "We're excited to see what you build!"
       },
       "webhook": {
         "callback_method": "POST",
         "callback_url": "https://demo.twilio.com/welcome/sms/reply/",  
         "fallback_method": "POST",
         "fallback_url": "",
         "status_callback_url": "",
         "status_callback_method": "POST"
       },
       "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
       "configuration": {
         "waba_id": "123456789"
       },
       "properties": {
         "messaging_limit": "1K Customers/24hr",
         "quality_rating": "HIGH"
       }
     }
   ```
4. To confirm the WhatsApp sender is registered, make a `GET v2/Channels/Senders/{Sid}` request and check if `status` is `ONLINE`.\
   **Note**: Immediately after registration, the `status` value will be `OFFLINE`. Wait a few minutes, then make the request again.

   Confirm WhatsApp sender registration

   ```bash
   ## Fetch Sender
   curl -X "GET" "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
        -H "Content-Type: application/json; charset=utf-8" \
        -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
   ```

   ```json
   {
     "status": "ONLINE",
     "sender_id": "whatsapp:+15017122661",
     "sid": "XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "configuration": {
       "waba_id": "12345678912345"
     },
     "profile": {
       "about": "Hello! This is Twilio's official account.",
       "name": "Twilio",
       "vertical": "Other",
       "websites": [
         {
           "website": "https://twilio.com",
           "label": "Website"
         },
         {
           "website": "https://help.twilio.com",
           "label": "Website"
         }
       ],
       "address": "101 Spear Street, San Francisco, CA",
       "logo_url": "https://www.twilio.com/logo.png",
       "emails": [
         {
           "email": "support@twilio.com",
           "label": "Email"
         }
       ],
       "description": "We're excited to see what you build!"
     },
     "webhook": {
       "callback_method": "POST",
       "callback_url": "https://demo.twilio.com/welcome/sms/reply/"
     },
     "url": "https://messaging.twilio.com/v2/Channels/Senders/XEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "properties": {
       "messaging_limit": "1K Customers/24hr",
       "quality_rating": "HIGH"
     }
   }
   ```

## Troubleshooting

The following troubleshooting steps can help you resolve common issues when you register a WhatsApp sender.

### I want to check if a phone number is registered with WhatsApp

To check if a phone number is registered with WhatsApp, use one of the following methods:

* **Send a test message**: Open `https://wa.me/<PHONE_NUMBER>?text=hi` in a browser (include the country code without `+`, for example, `15551234`). If the number is registered, you'll receive "hi" in WhatsApp.
* **Search contacts**: In WhatsApp, tap **New Chat > New Contact** and enter the phone number. If the number is registered, you'll see "This phone number is on WhatsApp".
* **Check error logs**: Open the [Error Logs page in the Twilio Console](https://console.twilio.com/us1/monitor/logs/debugger/errors). If the number is registered, you'll see [Error 63110](/docs/api/errors/63110).

### I want to use an already registered phone number

To use a phone number that's already registered with WhatsApp:

* **If registered with WhatsApp or WhatsApp Business app**: [Delete the WhatsApp account](https://faq.whatsapp.com/2138577903196467) to make the phone number available for the WhatsApp Business Platform with Twilio.
* **If registered with another WhatsApp Business Platform**: In the [WhatsApp Manager](https://business.facebook.com/latest/whatsapp_manager/), turn off Two-Factor Authentication (2FA) for the number on the WhatsApp Business Platform and register a WhatsApp sender with the number. Contact your Solution Partner if you can't turn off 2FA by yourself.

Learn more about [migrating phone numbers and WhatsApp senders](/docs/whatsapp/migrate-numbers-and-senders). If you need further assistance, [contact Twilio Support](https://help.twilio.com/).

### I can't use Argentina or Mexico phone numbers

* **For Argentina phone numbers** (+54): Add a `9` after the country code and remove the prefix `15` (for example, `+549 XXX XXX XXXX`).
* **For Mexico phone numbers** (+52): Add a `1` after the country code (for example, `+521 XX XXXX XXXX`).

Learn more about [WhatsApp's international phone number format](https://faq.whatsapp.com/1294841057948784).

### I'm not receiving an OTP via SMS

You might not receive an OTP via SMS for the following reasons:

* The OTP delivery is delayed.
* You've reached Meta's maximum number of OTP verification attempts.

To resolve this issue:

1. Wait a few minutes.
2. Check the [Error logs](https://console.twilio.com/us1/monitor/logs/debugger/errors) for any errors and follow the recommended actions.
3. Resend an OTP by making another `POST /v2/Channels/Senders` request.
4. If you don't receive the OTP after several attempts, contact [Twilio Support](https://help.twilio.com/).

Alternatively, you can try the voice method for verification.

### The `status` field remains `OFFLINE`

The `status` field briefly shows as `OFFLINE` after registration. The `status` field changes to `ONLINE` when registration is complete, which typically takes a few minutes. If the `status` field remains `OFFLINE` after that, follow these steps:

1. Confirm the phone number meets all [requirements](#phone-number-requirements).
2. Confirm the display name follows [Meta's display name guidelines](https://www.facebook.com/business/help/757569725593362).
3. Check the [Error logs](https://console.twilio.com/us1/monitor/logs/debugger/errors) for any errors and follow the recommended actions.
4. Check your WABA status on [WhatsApp Manager](https://business.facebook.com/latest/whatsapp_manager/).
5. If you still see `OFFLINE`, [contact Twilio Support](https://help.twilio.com/).
