Menu

Expand
Rate this page:

New Sole Proprietor A2P 10DLC Registration for ISVs: API Walkthrough

This API walkthrough is for ISVs who are registering their customers for new A2P 10DLC Sole Proprietor Brands and Campaigns. If you are not an ISV but rather a direct customer looking to register your own Sole Proprietor Brand for A2P use, please see this guide which will direct you to register your brand via our Console tool.

Sole Proprietor Brands and Campaigns are only intended for customers in the US and Canada who do not have a tax ID (i.e. an EIN in the U.S. or a Canadian Business Number). If your customers have a Tax ID, you must register them for a Standard or Low-Volume Standard Brand. This includes U.S. customers registered as LLCs, even if they have a "Sole Proprietorship" LLC for IRS purposes (all US LLCs have an EIN and are therefore ineligible for Sole Proprietor Brand registration as this is defined by The Campaign Registry). If your customers are located outside of the US or Canada, you must register them for a Standard or Low-Volume Standard Brand to enable them to send messages to the US using 10DLC numbers.

Note for ISVs: we understand that you may be relying on your secondary customers to self-report whether or not they have an EIN or equivalent Tax ID. Please make sure they understand that, if they declare they are eligible for Sole Proprietor Brand registration but are subsequently found to have an EIN or equivalent Tax ID, their Campaign registration will error, and you or they will need to pay all associated fees and re-do their registration as a Standard or Low-Volume Standard Brand. This will also directly impact their traffic, since until they are registered correctly and completely they will not be able to send SMS 10DLC messages in the US.

Note: For all information entered as part of this registration process, please note that The Campaign Registry (TCR) supports all “utf8mb4” supported characters. Please see the list for all Unicode 15.0 supported scripts and characters here: https://www.unicode.org/charts/

When registering your customers for Sole Proprietor Brands, you need to provide the following information for each customer. You must use your customer's information for registration. Do not use your own (i.e., the ISV's) information:

Field Description
First and last name The customer's first and last name.
Email

This must be a well formatted address with a valid domain and cannot be a disposable address.

This email address can only be used a maximum of 10 times across all A2P Brand registrations with TCR. If your customer is registered for A2P 10DLC with another vendor, that counts towards this limit.

Phone number The customer's business/contact phone number. It must be a well-formatted number and can be a landline, mobile, or other number.
Mobile number

This mobile number is critical in the registration process and is used for sending a One Time Password (OTP) verification request to the customer, which they must respond to. This must be a valid US or Canadian mobile number only where the customer can be reached. This cannot be a number which you've acquired from a CPaaS provider such as Twilio.

This mobile number can only be used a maximum of three times across all A2P Brand registrations with TCR. If your customer is registered for A2P 10DLC with another vendor, that counts towards this limit.

You may use the same number for both the Phone Number field and the Mobile Number field, provided that this number satisfies all of the requirements here

Address

Must be a valid US or Canadian address. It can be a PO Box.

This address can only be used a maximum of 10 times across all A2P Brand registrations with TCR. If your customer is registered for A2P 10DLC with another vendor, that counts towards this limit.

Brand name

If your customer is a Sole Proprietor business, this must be the customer's real business name. For Sole Proprietor businesses, their business name is usually their first name and last name, but you can also provide a DBA name if there is one.

If your customer is not a business entity but instead is a hobbyist / college student, etc., please provide their first name and last name.

This field cannot be a unique identifier such as an account ID or email address.

Vertical (optional field)

You can select from a set of predefined values, which are the same as the vertical field in Primary Customer Profiles and Secondary Customer Profiles. See the list of available values here.

Your customer's mobile phone number, which will be used for One Time Password (OTP) verification of their Brand, can only be used a maximum of three times for registering A2P 10DLC Brands. This is a limit at The Campaign Registry (TCR) level, and not within Twilio. If your customer registers for A2P 10DLC Sole Proprietor Brand with another vendor and uses this mobile number for verification, that will count towards their lifetime three-use limit.

Once you have this information for your customers, you can complete their Sole Proprietor registration via the API. API registration consists of the following steps:

  1. Create a Starter Profile (a Starter Profile is used for later creating a Sole Proprietor Brand and Campaign, and can also be used for registering other products within TrustHub)
  2. Create a Sole Proprietor A2P Trust Bundle
  3. Create a Sole Proprietor Brand and complete OTP verification (you should only register 1 Sole Proprietor Brand for each unique customer)
  4. Create a Sole Proprietor Campaign (each Sole Proprietor Brand can only have one Campaign)
  5. Add a Phone Number to the Campaign (each Sole Proprietor Campaign can only use one Phone Number to send messages)

It is programmatically possible to call each of the steps enumerated above, and detailed below in Parts 1, 2, 3 and 4, in a single uninterrupted sequence of API calls. However, Twilio applies various layers of validation and review to the various steps -- some validations are synchronous or near-synchronous, others involve manual review and can take one or more full business days. We do NOT suggest that you wait for your Starter Profile to be manually approved before moving on, or for your Brand to be manually approved before creating a Campaign associated with it. However, we DO advise that, after submitting the complete Business Profile bundle in Step 1.8, you wait 30 seconds to see if any programmatic validation error surfaces before proceeding to the Trust Bundle creation in Step 2; that after the Trust Bundle is submitted in Step 2.6 you wait another 30 seconds before proceeding to Brand submission in Step 3; and that after Brand submission in Step 3 you wait 30 seconds before proceeding with Campaign creation in Step 4. Catching synchronous or near-synchronous upstream errors this way can dramatically reduce the amount of cleanup you have to do downstream, for examples deleting Campaigns whose Brands have failed, or deleting Brands (and Campaigns) whose Profiles have failed.

For troubleshooting and remediation of such failures during this registration process, please see our separate Troubleshooting documentation.

Prerequisite: Create a Trust Hub Profile for your Company (ISV)

What does this do? Creates a Trust Hub profile for your business (the ISV).

Which API? This can only be done via the Trust Hub UI in the Twilio Console.

Before proceeding with the onboarding process for your clients, all ISVs must have a primary customer profile in an APPROVED state. You can do this in the Trust Hub, located in the Twilio Console. In order to register secondary profiles, the primary customer profile needs to have “ISV Reseller or Partner” selected as your Business Identity.

To get the highest possible messaging limits, please create your profile with details that exactly match those in your US EIN listing (or that of your relevant national Tax ID if your ISV business is located outside the U.S.). If there are any differences – for example, in the business name or address – your messaging limits will be lower. Please verify these details via your W2 form or equivalent national tax record.

Tip: Copy the Primary Customer Profile's bundle SID (BUxxx) from Customer Profile Details page to be used in a later step; see https://console.twilio.com/us1/account/trust-hub/customer-profiles > View profile details button

1. Create Starter Customer Profile(s) and attach required information

Which API? Trust Hub API

This step creates Starter Customer Profiles for your customers using a Trust Hub policy with the identifier RN806dd6cd175f314e1f96a9727ee271f4. Trust Hub supports many types of compliance collections, but this specific policy is for Starter Profiles, which can be used for Sole Proprietor Brands.

1.1 Fetch the Starter Customer Profile Policy

The Starter Customer Profile Policy contains all of the fields you need to complete when creating a Starter Customer Profile. You can refer back to this throughout the registration process to ensure you are completing the necessary fields. When you have completed the Starter Customer Profile for this customer, you will submit it to be evaluated against this Customer Profile Policy (in step 1.7 of this walkthrough) to ensure that it meets all requirements.

The SID for the Starter Customer Profile Policy is RN806dd6cd175f314e1f96a9727ee271f4.

Loading Code Sample...
        
        

        1.1 Fetch the Starter Customer Profile Policy

        1.2 Create a Starter Customer Profile Bundle

        This Starter Customer Profile Bundle contains information about your customer. You will fill out some of the fields now, and will attach more information to this Bundle in later steps. You will submit this Bundle for review in the last step of Section 1 of this walkthrough.

        Parameter Valid Values
        friendly_name A string representing your customer's business name. This is an internal name meant for you to identify this particular customer profile Bundle for your customer.
        email A string representing your customer's email address
        policy_sid

        The static TrustHub policy identifier for Starter profiles. The hard-coded value is RN806dd6cd175f314e1f96a9727ee271f4 and you use this value for every Starter Customer Profile Bundle you create.

        status_callback (optional)

        The URL at which you would like to receive webhook requests about status updates to this Profile Bundle. See the Bundles Resource documentation for details on Twilio's request to your webhook. NOTE: while the use of a status_callback webhook is optional, it is highly recommended if you would like a detailed failure_reason for a Customer Profile, in the case of a Profile rejection, such as the email and address validation failure reasons discussed below and in Section 1.4. Only this kind of failure detail will allow self-service remediation as discussed in Section 1.9 below. A failed Customer Profile submission (Step 1.8) will also generate an email to the email address of the ISV's profile, indicating failure, but this email will NOT give a detailed failure reason and will instead direct you to contact Twilio support for details.

        Beginning in early December, Twilio will perform a data validation check on the email field in the above API call. The validations and rejection reasons are as follows:

        Description

        Rejection reason

        Email domain should have correct syntax

        Email domain has an invalid address syntax.

        Email domain is unknown

        Unknown email domain.

        Temporary email which can be disposable

        Email is a suspected disposable address.

        If email check have passed all above validations and still is invalid from sendgrid API

        Email is invalid.

        Please note again that these detailed failure reasons are provided only in the status_callback message sent to the status_callback webhook url, if one has been provided in the Starter Customer Profile Bundle creation call. If you are not using a status_callback webhook, you will still be notified of the Profile submission's general failure status via email to the ISV email contact, but this email will not include any detail as to failure_reason, so for this you would need to contact support before you could remediate the issue(s) in Step 1.9 below.

        Loading Code Sample...
              
              

              1.2 Create an Empty Starter Customer Profile Bundle

              You will use the SID from this new Customer Profile Bundle you created (the SID begins with BU) in a later step.

              1.3 Create an end-user object with the type starter_customer_profile_information

              Parameter Valid Values
              attributes An object containing your customer's first name, last name, email address, and phone number
              friendly_name A string representing the end-user object you create in this step. This is for your internal purposes for identifying the end customer.
              type The end user object type. This will always be starter_customer_profile_information for Starter Profiles.

              The attributes object should contain the following fields:

              {
                 "email": "starter-profile-enduser@example.com",
                 "first_name": "John",
                 "last_name": "Doe",
                 "phone_number": "+11234567890"
              }
              
              Loading Code Sample...
                    
                    

                    1.3 Create an end-user object with the type: starter_customer_profile_information

                    You will use the SID of the new end-user object you created (the SID begins with IT) in a later step.

                    1.4 Create a supporting document: customer_profile_address

                    Here, you create an Address object for the customer, which you then attach to their customer profile. Note that you can only use a valid US or Canadian address if you are creating a Sole Proprietor registration.

                    Provide the following parameters to the API request:

                    Parameter Valid Values
                    Customer Name (optional) String representing your customer's name
                    Street Address 1 Example: 1234 Your Street Name
                    Street Address 2 (optional) Example: Apt B
                    City Example: San Francisco
                    Region Can be a State or Province. For example, California (US State) and British Columbia (Canadian Province).
                    Postal Code Example: 94016
                    IsoCountry See this list of valid IsoCountry codes

                    Beginning in early December 2023, Twilio will perform a data validation check on the address fields submitted in the above API call. The validations and rejection reasons are as follows:

                    If given address is not present

                    Address not found with sid ADXXXXXXXXXXXXXXXXXXXXXXXX

                    If given address is not a valid US/CA address

                    The provided address is not a valid US or Canada address

                    If given address has invalid postal code

                    [address_sids] - Invalid Postal Code. Address suggestion -> Street: 1 Jersey St. Secondary Street: Boston, MA 02215-4147. Locality: Boston. Region: MA. Postal Code: 02215-4147. Country: US;

                    If given address has invalid street name("street": "1 Jersey Str")

                    [address_sids] - Invalid Street. Address suggestion -> Street: 1 Jersey St. Secondary Street: Boston, MA 02215-4147. Locality: Boston. Region: MA. Postal Code: 02215-4147. Country: US

                    If given address has invalid locality("locality": "Bostun")

                    [address_sids] - Invalid Locality. Address suggestion -> Street: 1 Jersey St. Secondary Street: Boston, MA 02215-4147. Locality: Boston. Region: MA. Postal Code: 02215-4147. Country: US;

                    If given address has invalid region("region": "MAA")

                    [address_sids] - Invalid Region. Address suggestion -> Street: 1 Jersey St. Secondary Street: Boston, MA 02215-4147. Locality: Boston. Region: MA. Postal Code: 02215-4147. Country: US;

                    If given address has Invalid house number("street": "10000 Jersey St")

                    [address_sids] - Invalid House Number

                    NOTE that this data validation check, like the one performed on the email address submitted in Step 1.2 above, is not actually performed until the submission of the complete Profile bundle in Step 1.8 below. These validations are also asynchronous. As with the email validation, to receive the kind of detailed failure_reason for an address validation that is enumerated in the above table, you will need to have provided a status_callback webhook upon your initial creation of the Customer Profile in Step 1.2. This failure_reason detail would then be provided in the status callback to that webhook. An email indicating more generic status for the Profile will also be sent to the email address indicated in your ISV Primary Customer Profile, but this will simply direct you to contact Twilio Support for actionable detail before you can proceed with remediation of the secondary profile as covered in Section 1.9 below.

                    Loading Code Sample...
                          
                          

                          1.4 Create a supporting document: customer_profile_address

                          1.5 Create a Supporting Document with the Address from Step 1.4

                          Once you have a valid address SID from this Address object you just created (the SID beings with AD), you can create a Supporting Document object. This Supporting Document will later be assigned to the Starter Customer Profile Bundle that you created in step 1.2.

                          The Supporting Document will need the following values:

                          Parameter Valid Values
                          attributes An object containing the Address SID from the previous step.
                          friendly_name A string you use to identify this Supporting Document
                          type The string customer_profile_address

                          The attributes object should look like this:

                          {
                             "address_sids": "ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
                          }
                          
                          Loading Code Sample...
                                
                                

                                1.5 Create a Supporting Document with the Address from Step 1.4

                                You will use the SID from this new Supporting Document (the SID begins with RD) in the next step.

                                1.6 Assign End-User, Supporting Document, and Primary Customer Profile to the Starter Customer Profile that you created

                                Attach the SIDs from all the steps above to the Starter Customer Profile:

                                • End-User Object SID (step 1.3): Begins with IT
                                • Starter Customer Profile SID (step 1.2): Begins with BU
                                • Supporting Document SID (step 1.5): Begins with RD
                                • Primary Customer Profile Bundle SID (from parent account, mentioned in the Prerequisites section): Begins with BU

                                1.6.1 Attach the end-user (from Step 1.3) to the Starter Customer Profile

                                The Starter Customer Profile SID from step 1.2 is the path parameter for this request. The body of the request should contain one parameter, called object_sid, which is the End-User Object SID from step 1.3. See the code sample below as an example.

                                Loading Code Sample...
                                      
                                      

                                      1.6.1 Attach the end-user (from Step 1.3) to the Starter Customer Profile

                                      1.6.2 Attach the Supporting Document (from Step 1.4) to the Starter Customer Profile

                                      The Starter Customer Profile SID from step 1.2 is the path parameter for this request. The body of the request should contain one parameter, called object_sid, which is the Supporting Document SID from step 1.5. See the code sample below as an example.

                                      Loading Code Sample...
                                            
                                            

                                            1.6.2 Attach the Supporting Document (from Step 1.4) to the Starter Customer Profile

                                            1.6.3 Attach the Primary Customer Profile Bundle to the Starter Customer Profile Bundle

                                            This step is applicable only for ISV customers of Twilio. ISV customers should already have Primary Customer Profile setup in their parent/main account from where they can fetch its Bundle SID (the SID starts with BU). See the Prerequisites for more information.

                                            The Starter Customer Profile SID from step 1.2 is the path parameter for this request. The body of the request should contain one parameter, called object_sid, which is the Primary Customer Bundle SID. See the code sample below as an example.

                                            Loading Code Sample...
                                                  
                                                  

                                                  1.6.3 Attach the Primary Customer Profile Bundle to the Starter Customer Profile Bundle

                                                  1.7 Evaluate the Starter Customer Profile

                                                  This step evaluates the Starter Customer Profile against the Starter Customer Profile Policy (which you fetched in step 1.1; the Starter Customer Profile Policy has the SID RN806dd6cd175f314e1f96a9727ee271f4).

                                                  The Starter Customer Profile SID from step 1.2 is the path parameter for this request. The body of the request should contain one parameter, called policy_sid, which is the hardcoded Policy SID RN806dd6cd175f314e1f96a9727ee271f4.

                                                  If your Starter Customer Profile is missing any required information, the response to the API request will indicate that those fields are not complete. You should go back and complete the missing fields from the previous steps.

                                                  If your Starter Customer Profile matches the expected Starter Customer Profile Policy, the response will indicate that the profile is compliant and that you can move on to the next step.

                                                  Loading Code Sample...
                                                        
                                                        

                                                        1.7 Evaluate the Starter Customer Profile

                                                        1.8 Submit the Starter Customer Profile for review

                                                        Once you have evaluated the Starter Customer Profile against the Starter Customer Profile Policy and the response says that the profile is compliant, you are ready to submit the profile.

                                                        The Starter Customer Profile status field has the following possible values:

                                                        • draft
                                                        • pending-review
                                                        • in-review
                                                        • twilio-rejected
                                                        • twilio-approved

                                                        When you first create the profile, it will be in the draft state. To submit the profile for review, you update the profile's status to pending-review via API request (the example of this request is below). The result of this API request will update the profile's status to in-review (which you should see in the response to your API request), at which point you should move on to the next step in this walkthrough.

                                                        Proceed to the next step as soon as the Starter Customer Profile is in the in-review state. Do not wait for it to be twilio-approved. The Starter Customer Profile will only reach the twilio-approved status when a Brand is successfully created and OTP-verified in the following section, so you must proceed in order for the Starter Customer Profile to be approved.

                                                        Loading Code Sample...
                                                              
                                                              

                                                              1.8 Submit the Starter Customer Profile for review

                                                              2. Create a new Sole Proprietor A2P Trust Bundle and attach required information

                                                              Which API? Trust Hub API

                                                              Once your Starter Customer Profile from the previous step is in_review, you can create a new Sole Proprietor Trust Bundle for your customer, which you will then use to complete a Sole Proprietor Brand. The steps in this section are very similar to the ones you completed in Section 1, but you will provide different information about your customer here.

                                                              2.1 Fetch the Sole Proprietor A2P Trust Policy

                                                              Similar to Step 1.1, fetch the Sole Proprietor A2P Trust Policy to help you determine if you are meeting all the requirements for your Trust Bundle before you submit it.

                                                              The Sole Proprietor A2P Trust Policy contains all of the fields you need to complete when creating a Sole Proprietor Trust Bundle. You can refer back to this throughout the registration process to ensure you are completing the necessary fields. When you have completed the Sole Proprietor Trust Bundle for this customer, you will submit it to be evaluated against this Trust Policy to ensure that it meets all requirements.

                                                              The SID for the Starter Customer Profile Policy is RN670d5d2e282a6130ae063b234b6019c8.

                                                              Loading Code Sample...
                                                                    
                                                                    

                                                                    2.1 Fetch the Sole Proprietor A2P Trust Policy

                                                                    2.2 Create a Sole Proprietor A2P Trust Bundle

                                                                    This Sole Proprietor A2P Trust Bundle contains information about your customer (from the profile you created above) and their Brand. You fill out some of the fields now, and attach more information to this Bundle in later steps. You will submit this Bundle for review in the last step of Section 2 of this walkthrough.

                                                                    These are the parameters for the API request to create a Sole Proprietor A2P Trust Bundle:

                                                                    Parameter Valid Values
                                                                    friendly_name A string representing your customer's business name. This is an internal name for you to identify this Bundle for your customer.
                                                                    email A string representing your customer's email address
                                                                    policy_sid The static A2P Messaging TrustHub Policy identifier. The hard-coded value is RN670d5d2e282a6130ae063b234b6019c8.
                                                                    status_callback The URL at which you would like to receive webhook requests about status updates to this Trust Bundle. See the Bundles Resource documentation for details on Twilio's request to your webhook.
                                                                    Loading Code Sample...
                                                                          
                                                                          

                                                                          2.2 Create a Sole Proprietor A2P Trust Bundle

                                                                          You will use the SID from this new Sole Proprietor Trust Bundle you created (the SID begins with BU) in a later step.

                                                                          2.3 Create end-user object with the type sole_proprietor_information

                                                                          In this step, you provide information about your customer's brand name, their mobile number for their Sole Proprietor Brand verification, and optionally their business vertical.

                                                                          In this step, you provide your customer's mobile number, which TCR will use to send a One Time Password (OTP) verification request. This must be a valid US or Canadian mobile number where the customer can be reached. This cannot be a number you've acquired from a CPaaS provider such as Twilio.

                                                                          The customer will receive the OTP message when you submit the Brand for review in step 3. They must respond to the request within 24 hours, or else you will need to retrigger the OTP message using the optional step 3.2. Additionally, the OTP verification must be completed within 30 days of Brand registration. Please see step 3.1 for more details.

                                                                          This mobile number can only be used a maximum of three times for Sole Proprietor A2P Brands. This includes if the customer has registered for a Sole Proprietor Brand with another vendor and has used the same mobile phone number. This limit is managed through TCR and not through Twilio.

                                                                          Include the following parameters in your API request:

                                                                          Parameter Valid Values
                                                                          attributes An object containing your customer's business name (which is usually their first and last name, if they do not have a business name / DBA name), their mobile phone number, and optionally, their business vertical. Please see the note above about the importance of the customer's mobile phone number for verification.
                                                                          friendly_name A string to indentify this end user object for your customer
                                                                          type The string sole_proprietor_information

                                                                          The attributes object should look like this:

                                                                          {
                                                                             "brand_name": "John Doe",
                                                                             "vertical": "COMMUNICATION",
                                                                             "mobile_phone_number": "+11234567890"
                                                                          }
                                                                          

                                                                          The optional vertical field describes the customer's business. It can be one of the following values:

                                                                          • AGRICULTURE

                                                                          • COMMUNICATION

                                                                          • CONSTRUCTION

                                                                          • EDUCATION

                                                                          • ENERGY

                                                                          • ENTERTAINMENT

                                                                          • FINANCIAL

                                                                          • GAMBLING

                                                                          • GOVERNMENT

                                                                          • HEALTHCARE

                                                                          • HOSPITALITY

                                                                          • HUMAN_RESOURCES

                                                                          • INSURANCE

                                                                          • LEGAL

                                                                          • MANUFACTURING

                                                                          • NGO

                                                                          • POLITICAL

                                                                          • POSTAL

                                                                          • PROFESSIONAL

                                                                          • REAL_ESTATE

                                                                          • RETAIL

                                                                          • TECHNOLOGY

                                                                          • TRANSPORTATION

                                                                          Loading Code Sample...
                                                                                
                                                                                

                                                                                2.3 Create an end-user object with the type sole_proprietor_information

                                                                                You will use the SID from this new end-user you created (the SID begins with IT) in the next step.

                                                                                2.4 Assign the end-user and starter customer profile to the Sole Proprietor A2P Trust Bundle

                                                                                Attach the SIDs from the end-user object you created in step 2.3 and the Starter Customer Profile you created in step 1.2 to the Sole Proprietor Trust Bundle you created in step 2.2 (the SID for the Sole Proprietor Trust Bundle begins with BU).

                                                                                • End-User Object SID (step 2.3): SID begins with IT.
                                                                                • Starter Customer Profile SID (step 1.2): SID begins with BU.

                                                                                2.4.1 Attach the end-user (from Step 2.3) to the Sole Proprietor A2P Bundle

                                                                                The Sole Proprietor A2P Bundle SID from step 2.2 is the path parameter for this request. The body of the request should contain one parameter, called object_sid, which is the End-User Object SID from step 2.3. See the code sample below as an example.

                                                                                Loading Code Sample...
                                                                                      
                                                                                      

                                                                                      2.4.1 Attach the end-user (from Step 2.3) to the Sole Proprietor A2P Bundle

                                                                                      2.4.2 Assign the Starter Customer Profile Bundle to the Sole Proprietor A2P Trust Bundle

                                                                                      The Sole Proprietor A2P Bundle SID from step 2.2 is the path parameter for this request. The body of the request should contain one parameter, called object_sid, which is the Starter Customer Profile Bundle SID from step 1.3. See the code sample below as an example.

                                                                                      Loading Code Sample...
                                                                                            
                                                                                            

                                                                                            2.4.2 Assign the Starter Customer Profile Bundle to the Sole Proprietor A2P Trust Bundle

                                                                                            2.5 Evaluate the Sole Proprietor A2P Trust Bundle

                                                                                            This step evaluates the Sole Proprietor A2P Trust Bundle against the Sole Proprietor A2P Trust Policy (which you fetched in step 2.1; the Sole Proprietor A2P Trust Policy has the SID RN670d5d2e282a6130ae063b234b6019c8).

                                                                                            The Sole Proprietor Trust Bundle SID from step 2.2 is the path parameter for this request. The body of the request should contain one parameter, called policy_sid, which is the hardcoded Policy SID RN670d5d2e282a6130ae063b234b6019c8.

                                                                                            If your Sole Proprietor Trust Bundle is missing any required information, the response to the API request will indicate that those fields are not complete. You should go back and complete the missing fields from the previous steps.

                                                                                            If your Sole Proprietor Trust Bundle matches the expected Sole Proprietor Trust Policy, the response will indicate that the profile is compliant and that you can move on to the next step.

                                                                                            Loading Code Sample...
                                                                                                  
                                                                                                  

                                                                                                  2.5 Evaluate the Sole Proprietor A2P Trust Bundle

                                                                                                  2.6 Submit the Sole Proprietor A2P Trust Bundle for review

                                                                                                  Once you have evaluated the Sole Proprietor Trust Bundle against the Sole Proprietor Trust Policy and the response says that the profile is compliant, you are ready to submit the profile.

                                                                                                  The Sole Proprietor Trust Bundle status field has the following possible values:

                                                                                                  • draft
                                                                                                  • pending-review
                                                                                                  • in-review
                                                                                                  • twilio-rejected
                                                                                                  • twilio-approved

                                                                                                  When you first create the Trust Bundle, it will be in the draft state. To submit the Trust Bundle for review, update the Bundle's status to pending-review via API request (the example of this request is below). The result of this API request will update the profile's status to in-review (which you should see in the response to your API request), at which point you should move on to the next step in this walkthrough.

                                                                                                  You should proceed to the next step as soon as the Sole Proprietor A2P Trust Bundle is in the in-review state. Do not wait for it to be twilio-approved. The Starter Customer Profile and Sole Proprietor A2P Trust Bundle will only reach the twilio-approved status when a Brand is successfully created and OTP-verified, and you should never wait for this status change.

                                                                                                  Loading Code Sample...
                                                                                                        
                                                                                                        

                                                                                                        2.6 Submit the Sole Proprietor A2P Trust Bundle for review

                                                                                                        3. Create a new Sole Proprietor A2P Brand

                                                                                                        Which API? Messaging API

                                                                                                        In this step, you will create a Sole Proprietor A2P Brand using the Customer Profile SID from step 1.2 and the Trust Bundle SID from step 2.2. You should have already submitted both of these objects for review in the previous steps, but you shouldn't wait for them to be approved before continuing.

                                                                                                        Loading Code Sample...
                                                                                                              
                                                                                                              

                                                                                                              3. Create a new Sole Proprietor A2P Brand

                                                                                                              3.1 GET the Sole Proprietor Brand registration status

                                                                                                              NOTE: it is now possible to set up and subscribe to Brand status Event Streams, so that an event message will be sent to a specified webhook url when the new Brand has been successfully registered or has failed registration. Please see this guide for setting up the necessary Event Streams sinks and event subscriptions, and for information on reading each event message payload.

                                                                                                              You can check the status of your customer's Sole Proprietor Brand registration with a GET request. This should update within a few minutes after submitting the Sole Proprietor Brand API request from the step above.

                                                                                                              The API will return the following information about the registration:

                                                                                                              Property Possible Values
                                                                                                              status PENDING, APPROVED, FAILED or SUSPENDED
                                                                                                              identity_status

                                                                                                              UNVERIFIED or VERIFIED

                                                                                                              UNVERIFIED means that the customer has not verified the OTP request sent to their mobile number.

                                                                                                              This value will change from UNVERIFIED to VERIFIED after your customer successfully verifies the mobile number provided in Step 2.3

                                                                                                              failure_reason

                                                                                                              Only present if the status is FAILED. This describes the reason for the Brand registration failure. Possible reasons for failure and the resolutions are:

                                                                                                              —"Unable to fetch A2P Bundle Details, please check if the correct bundle sid was provided for registration and the bundle is compliant." -> Check Bundle Details and retry

                                                                                                              —"Unable to fetch Customer Profile Bundle details, please check if the correct bundle sid was provided for registration and the bundle is compliant." -> Check Bundle Details and retry

                                                                                                              —"Unable to register Brand with The Campaign Registry" -> review the registration requirements defined at the beginning of this document and ensure that your registration information is complete and meets the requirements (for additional information please see https://support.twilio.com/hc/en-us/articles/14488596590491-Why-did-my-Sole-Proprietor-Brand-Registration-Fail-.) Please verify that the supplied information is accurate and well-formed before contacting Twilio Support

                                                                                                              When the Sole Proprietor Brand first enters the APPROVED state, the identity_status will still be UNVERIFIED. The change to the APPROVED state triggers a new SMS OTP, which is sent to the mobile number registered with the Brand (from step 2.3). The OTP is valid for 24 hours. If your customer does not complete the OTP verification request after 24 hours, you can use this API to trigger a fresh OTP for verification.

                                                                                                              The owner of the mobile number will receive a text message sent from +1(915)-278-2000 with the following text: "Please confirm your registration for US A2P Messaging by replying YES. Msg & data rates may apply."

                                                                                                              The owner of the mobile number must reply "YES" back to the OTP message to complete Brand verification. Once they do that, they should receive another confirmation message on their mobile number that says "Thank you. Your registration has been confirmed." The Brand state will remain as APPROVED, and their identity_status will now change to VERIFIED

                                                                                                              Note that only the first OTP is sent automatically; if your customer does not complete the OTP verification request within 24 hours, you need to send an API request to trigger a new OTP (see step 3.2 for the API request to retrigger this OTP). Additionally, please make every effort to ensure that your customer completes OTP verification within 30 days of Brand registration. At some point going forward, The Campaign Registry (TCR) may begin to enforce a 30-day limit for this OTP completion, after which the Brand registration would be marked as EXPIRED, and would need to be deleted and resubmitted (this documentation will be updated if and when TCR begins to enforce this).

                                                                                                              You will need to wait until the Sole Proprietor Brand is approved and verified before moving on to Step 4.

                                                                                                              If your Brand registration has FAILED, or if it is APPROVED but with a lower Trust Score than you feel your Brand merits, please see this Guide to Troubleshooting A2P Brands to understand and rectify specific Brand feedback.

                                                                                                              The status of SUSPENDED is rare. This status indicates that your Brand is deemed to have potentially violated one or more rules for Brand registration established by the A2P ecosystem partners. This status will require Twilio Support assistance to address. Please see the relevant section of our Troubleshooting guide for details.

                                                                                                              Loading Code Sample...
                                                                                                                    
                                                                                                                    

                                                                                                                    3.1 GET the Sole Proprietor Brand registration status

                                                                                                                    3.2 [Optional] Retry OTP Verification for the submitted mobile number

                                                                                                                    The change from a Sole Proprietor's Brand to the APPROVED state automatically triggers an SMS OTP, which is sent to the mobile number registered with the Brand. The OTP is valid for 24 hours. If your customer does not accept the OTP request after 24 hours, you can use this API to trigger a fresh OTP for verification.

                                                                                                                    This endpoint has a rate limit of 10 requests per second per account.

                                                                                                                    Loading Code Sample...
                                                                                                                          
                                                                                                                          

                                                                                                                          3.2 [Optional] Retry OTP Verification for the submitted mobile number

                                                                                                                          You can use the GET API request from 3.1 to check the OTP verification status.

                                                                                                                          4. Create a new Messaging Service

                                                                                                                          Which API? Messaging API

                                                                                                                          You do not need to complete this step if you have already created a Messaging Service for your customer.

                                                                                                                          Please note that for Sole Proprietor A2P 10DLC registrations, you should only have one 10DLC number in the Messaging Service. Sole Proprietor Campaigns can only have one 10DLC phone number attached to them.

                                                                                                                          In this step, you create a new Messaging Service for your customer. You can later add 10DLC numbers to this Messaging Service and attach the Service to a registered A2P Campaign.

                                                                                                                          See the documentation here about how to create a new Messaging Service via the API.

                                                                                                                          5. Create a new Sole Proprietor A2P SMS Campaign

                                                                                                                          Which API? Messaging API

                                                                                                                          In this final step, you will create a new Sole Proprietor A2P SMS Campaign. Here, you describe what type of messages the customer is sending to end-users and how those end-users can opt in and out of these messages.

                                                                                                                          This Campaign can then be attached to a Messaging Service, and the A2P 10DLC numbers in that Messaging Service will be able to send verified A2P 10DLC traffic.

                                                                                                                          When you create a Campaign, you will need to indicate how end users opt-in and give consent to receive messages from this Campaign. You will also need to provide details about how end users can opt-out and receive help.

                                                                                                                          Top reasons for Campaign rejection, and how to avoid them:

                                                                                                                          • missing or unclear message flow (Call to Action) information: the Message Flow describes the process by which end users opt-in to receiving your Campaign's SMS messages. This process must be clearly described and verifiable. If users opt-in through a business website, either provide a direct url to the opt-in form or, if this is not publicly accessible, provide a url to a hosted screenshot of the relevant page (as well as pages showing privacy policies and other information specified below). The url must clearly align with the Brand name provided in the Business Profile in Step 1 above. If Opt-in is done via a paper form, provide a url to a hosted image of this form. If Opt-in is done verbally, provide a script for the solicitation of this opt-in.
                                                                                                                          • TCR cannot verify business website: in the Business Profile creation step, you are asked to provide a public url to the website of the Brand being registered. This url must be functional, it must match in some obvious way the Business Name provided, and the url provided in Step 5 below for opt-in (if applicable) and any links included in sample messages. If you are an ISV registering secondary customers, the website provided in this registration must be that of the secondary customer's brand, NOT the ISV as.a business entity.
                                                                                                                          • misalignment between Campaign description, Message flow, sample messages and/or Brand name: it must be clear and obvious why a particular set of sample messages serves the purposes of a particular Campaign, and why that Campaign serves the purposes of the Brand for which it is registered.

                                                                                                                          Please see A2P 10DLC Campaign Approval Best Practices to ensure your Campaigns meet all requirements.

                                                                                                                          Most Twilio customers use Twilio's default or advanced opt-out features. If you use default or advanced opt-out, Twilio will automatically complete your Campaign's opt-out and help parameters with Twilio's default values or your customized advanced opt-out and help values.

                                                                                                                          For more information about all of the parameters within the Create Campaign API, see the full API documentation.

                                                                                                                          The API request takes the following parameters:

                                                                                                                          Parameter Description
                                                                                                                          brand_registration_sid The A2P Brand Registration SID from Step 3
                                                                                                                          description

                                                                                                                          This should be a fairly detailed description (one or several sentences) of what purpose this campaign serves. The description should provide an explanation of the campaign’s objective or purpose: who the sender is, who the recipient is, and why messages are being sent to the intended recipient. Min length: 40 characters. Max length: 4096 characters.

                                                                                                                          Example: "This Campaign will send weekly marketing messages about sales and offers from Acme Sandwich Company to end customers who have opted in"

                                                                                                                          message_samples

                                                                                                                          An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars.

                                                                                                                          Give concrete examples of messages you would send in this Campaign. In the message, be sure to identify your Brand by name and/or website. Also, indicate with brackets [] any content that will be conditionalized. Example: "This is a message from the Acme Sandwich Company. Your order for [sandwich type, other item] will be delivered by [time] on [date]. If you have questions or would like to change your order schedule, please call 333-444-1212. If you would like to opt out of future notifications like this, text STOP in reply to this message."

                                                                                                                          message_flow

                                                                                                                          Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum.

                                                                                                                          If a website is used for opting in, provide a link to the website. The website needs to have a privacy policy and terms of service. Privacy policies also need to include a statement of non-sharing for mobile numbers, message frequency, and "message and data rates may apply" disclosure. You need to provide a link to the policy.

                                                                                                                          If this opt-in mechanism and other required information is not publicly accessible at the business website url you have provided, please provide a url with hosted screenshots of the relevant pages. Understanding the opt-in mechanism is critical to the acceptance of the Campaign by TCR.

                                                                                                                          Example: "End users opt-in by visiting www.acmesandwich.com and adding their phone number. They then check a box agreeing to receive text messages from Acme Sandwiches. Additionally, end users can also opt-in by texting START to (111) 222-3333 to opt in. Term and Conditions at www.acmesandwich.com/tc. Privacy Policy at www.acmesandwich.com/privacy"

                                                                                                                          • As part of our compliance review, we conduct automated checks on the URLs provided during campaign and brand registration. Our system captures a public-facing screenshot, and evaluates it against compliance rules, which can be found here. This compliance check is a mandatory step in our registration process. If you have any questions or concerns about the process, please contact our support team.
                                                                                                                          us_app_to_person_usecase SOLE_PROPRIETOR (there is only one valid use case for a Sole Proprietor Brand)
                                                                                                                          has_embedded_links

                                                                                                                          Boolean. Indicates that this SMS campaign will send messages that contain url links.

                                                                                                                          has_embedded_phone Boolean. Indicates that this SMS campaign will send messages that contain phone numbers.
                                                                                                                          opt_in_message (optional)

                                                                                                                          String. If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out.

                                                                                                                          This field is required if end users can text in a keyword to start receiving messages from this campaign. Min length: 20 characters. Max length: 320 characters.

                                                                                                                          opt_in_keywords (optional)

                                                                                                                          An array of strings. If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided.

                                                                                                                          This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. Max length: 255 characters.

                                                                                                                          opt_out_message (optional in certain cases, see description)

                                                                                                                          String. The message that an end-user receives when opting out of messages. Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name.

                                                                                                                          This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Min length: 20 characters. Max length: 320 characters.

                                                                                                                          opt_out_keywords (optional in certain cases, see description)

                                                                                                                          An array of strings. The keywords that an end user can text to opt out of messaging. End users should be able to text in a keyword to stop receiving messages from this campaign.

                                                                                                                          This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. Max length: 255 characters.

                                                                                                                          help_message (optional in certain cases, see description)

                                                                                                                          String. The message that end users receive in response to a help keyword. When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information.

                                                                                                                          This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum.

                                                                                                                          help_keywords (optional in certain cases, see description)

                                                                                                                          An array of strings. The keywords that an end user can text to receive help. End users should be able to text in a keyword to receive help.

                                                                                                                          This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. Max length: 255 characters.

                                                                                                                          Please note that the path used in this Campaign creation call is the Messaging Service SID, e.g. in Python,

                                                                                                                          client.messaging.v1.services('MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')

                                                                                                                          prior to any of the actual input parameters. This is a reminder that Campaigns are built around a pre-existing Messaging Service, which is why you either created one or selected a pre-existing one in Step 4 above. Campaigns cannot be created except in association with a Messaging Service.

                                                                                                                          By the same token, once a Campaign has been created, deleting its associated Messaging Service (either via API call or via the Console) will necessarily mean deleting the Campaign itself. This would be especially undesirable, in most cases, once a Campaign has been VERIFIED (approved), as the Campaign approval process would need to be re-initiated from scratch.

                                                                                                                          Note finally that the Campaign itself can be deleted, if necessary, without deleting the Messaging Service; this is addressed in Section 5.2 below.

                                                                                                                          Loading Code Sample...
                                                                                                                                
                                                                                                                                

                                                                                                                                5. Create a new Sole Proprietor A2P SMS Campaign for default or advanced opt-out users

                                                                                                                                Customers managing their own opt-out will need to provide additional opt-out and help information when registering a Campaign.

                                                                                                                                Loading Code Sample...
                                                                                                                                      
                                                                                                                                      

                                                                                                                                      5. Create a new Sole Proprietor A2P SMS Campaign for customers managing their own opt-out

                                                                                                                                      5.1 GET the Status of an A2P Messaging Campaign

                                                                                                                                      NOTE: it is now possible to set up and subscribe to Campaign status Event Streams, so that an event message will be sent to a specified webhook url when the new Campaign has been approved or has been rejected. Please see this guide for setting up the necessary Event Streams sinks and event subscriptions, and for information on reading each event message payload. In the event of a Campaign rejection, you will then need to perform the fetch call described below in order to learn details about the failure reason(s).

                                                                                                                                      You can GET your messaging Campaign associated with a Messaging Service and monitor its approval status with the following API request.

                                                                                                                                      In this call's json response, the attribute campaign_id is a seven-character string that will have been added to the new Campaign record by the Campaign Registry (TCR). But in this response you would be looking in particular at the campaign_status attribute. The possible statuses for campaigns will vary depending on what stage the Campaign is at in the review process. A newly-created Campaign that has yet to be considered by TCR will be PENDING, assuming that the Twilio API itself has accepted it (i.e., all the data is basically conforming); otherwise it will be FAILED. Once TCR has begun its own review process on a successfully-submitted Campaign, the Campaign will be IN_PROGRESS until that review has finished. At that point the campaign_status will be either VERIFIED (approved) or FAILED (rejected). In certain rare cases the status will instead be SUSPENDED.

                                                                                                                                      If campaign_status is FAILED, the response will contain an “errors” attribute with the information on why the registration failed (but please note that this is only the case for Campaigns submitted since May 31, when this feature was implemented; for previous Campaigns the errors[] attribute will be empty). This populated errors[] attribute is particularly helpful if the campaign registration failed during Twilio’s internal review or External campaign review by our partners.

                                                                                                                                      For for details on troubleshooting FAILED A2P Campaigns, please see this section of the Troubleshooting Guide.

                                                                                                                                      If your Campaign registration has been rejected (FAILED), please see this Guide to Troubleshooting A2P Brands and Campaigns to understand error details and rectification.

                                                                                                                                      Loading Code Sample...
                                                                                                                                            
                                                                                                                                            

                                                                                                                                            5.1 GET A2P Messaging Campaign Status

                                                                                                                                            5.2 [Optional] DELETE A2P Messaging Campaign

                                                                                                                                            If you need to unregister or "delete" a Campaign, you can make the following request to the Messaging Service. Again, here you will specify the compliance type QE2c6890da8086d771620e9b13fadeba0b in your request.

                                                                                                                                            After your API request is accepted, please allow a few seconds for deletion to be finalized. If you are programmatically deleting a Campaign and then creating a new Campaign on the same Messaging Service, you should implement at least a 5-second delay between removing the existing Campaign and creating a new one on the same Messaging Service.

                                                                                                                                            Loading Code Sample...
                                                                                                                                                  
                                                                                                                                                  

                                                                                                                                                  5.2 [Optional] DELETE A2P Messaging campaign use case

                                                                                                                                                  6. Ensure that a Twilio 10DLC phone number is associated with your new Campaign

                                                                                                                                                  Once your Sole-Proprietor Business Profile, Brand, and Campaign have been registered and verified, the final step before you can begin using the new Messaging Campaign is to ensure that the Twilio 10DLC phone number you use to send messages to the US is associated with the new Campaign’s Messaging Service as the Sender. Here you’ll need to keep several things in mind:

                                                                                                                                                  1. For Sole Proprietor Campaigns, only a single 10DLC phone number can be used in the Messaging Service associated with your new Campaign. If you associate more than one phone number with this Messaging Service (or reuse a Messaging Service with more than one number attached), Twilio will randomly pick from among these to register one for A2P use.
                                                                                                                                                  2. See this part of the PhoneNumberResource guide for the API call to associate a given phone number (by phone_number_sid) with the new Messaging Service (by messaging_service_sid) you’ve created for the new Sole Proprietor A2P Campaign.
                                                                                                                                                  3. You can subsequently use a GET call on that same phone_numbers endpoint as in (2) above to confirm that the phone number is associated with this Messaging Service (see this part of the same PhoneNumberResource guide).

                                                                                                                                                  If you do not currently have a Twilio 10DLC phone number you’d like to use with the new Messaging Service, you can select and buy one either via the Twilio Console or via API – see this guide for details on both.

                                                                                                                                                  NOTE: Whether or not you choose to reuse existing Twilio phone numbers in the context of these new Sole Proprietor Campaign registrations, please be aware that any Twilio 10DLC numbers you currently have, and that you wish to continue using for SMS messaging within the U.S., must be registered as senders for A2P Messaging Services (ie officially associated with some officially registered A2P Campaign) by the Summer of 2023.

                                                                                                                                                  Congratulations! 🎉 You now have a registered A2P Sole Proprietor Campaign!

                                                                                                                                                  Rate this page:

                                                                                                                                                  Need some help?

                                                                                                                                                  We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd by visiting Twilio's Stack Overflow Collective or browsing the Twilio tag on Stack Overflow.

                                                                                                                                                  Loading Code Sample...
                                                                                                                                                        
                                                                                                                                                        
                                                                                                                                                        

                                                                                                                                                        Thank you for your feedback!

                                                                                                                                                        Please select the reason(s) for your feedback. The additional information you provide helps us improve our documentation:

                                                                                                                                                        Sending your feedback...
                                                                                                                                                        🎉 Thank you for your feedback!
                                                                                                                                                        Something went wrong. Please try again.

                                                                                                                                                        Thanks for your feedback!

                                                                                                                                                        thanks-feedback-gif