Skip to contentSkip to navigationSkip to topbar
Rate this page:
On 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 guidewhich will direct you to register your brand via our Console tool.

(warning)

Warning

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.

(information)

Info

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/(link takes you to an external page)

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:

FieldDescription
First and last nameThe customer's first and last name.
EmailThis 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 numberThe customer's business/contact phone number. It must be a well-formatted number and can be a landline, mobile, or other number.
Mobile numberThis 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
AddressMust 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 nameIf 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.
(error)

Danger

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)(link takes you to an external page) 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)
(warning)

Warning

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)

prerequisite-create-a-trust-hub-profile-for-your-company-isv page anchor

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.

(information)

Info

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 Consol(link takes you to an external page)e. 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(link takes you to an external page) > View profile details button


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

1-create-starter-customer-profiles-and-attach-required-information page anchor

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

11-fetch-the-starter-customer-profile-policy page anchor

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.

1.1 Fetch the Starter Customer Profile Policy

11-fetch-the-starter-customer-profile-policy-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.trusthub.v1.policies('RN806dd6cd175f314e1f96a9727ee271f4')
_10
.fetch()
_10
.then(policies => console.log(policies.friendlyName));

Output

_57
{
_57
"url": "https://trusthub.twilio.com/v1/Policies/RN806dd6cd175f314e1f96a9727ee271f4",
_57
"requirements": {
_57
"end_user": [
_57
{
_57
"url": "/EndUserTypes/starter_customer_profile_information",
_57
"fields": [
_57
"first_name",
_57
"last_name",
_57
"email",
_57
"phone_number"
_57
],
_57
"type": "starter_customer_profile_information",
_57
"name": "Information",
_57
"requirement_name": "starter_customer_profile_information"
_57
}
_57
],
_57
"supporting_trust_products": [],
_57
"supporting_document": [
_57
[
_57
{
_57
"description": "Customer Profile Address",
_57
"type": "document",
_57
"name": "Customer Profile Address",
_57
"accepted_documents": [
_57
{
_57
"url": "/SupportingDocumentTypes/customer_profile_address",
_57
"fields": [
_57
"address_sids"
_57
],
_57
"type": "customer_profile_address",
_57
"name": "Legal Company Address"
_57
},
_57
{
_57
"url": "/SupportingDocumentTypes/starter_customer_profile_address",
_57
"fields": [
_57
"address_sids"
_57
],
_57
"type": "starter_customer_profile_address",
_57
"name": "Legal Company Address"
_57
}
_57
],
_57
"requirement_name": "customer_profile_address"
_57
}
_57
]
_57
],
_57
"supporting_customer_profiles": [
_57
{
_57
"type": "primary_customer_profile_type_business",
_57
"name": "Primary Customer Profile Bundle",
_57
"requirement_name": "primary_customer_profile"
_57
}
_57
]
_57
},
_57
"friendly_name": "Starter Customer Profile of type Business",
_57
"sid": "RN806dd6cd175f314e1f96a9727ee271f4"
_57
}

1.2 Create a Starter Customer Profile Bundle

12-create-a-starter-customer-profile-bundle page anchor

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.

ParameterValid Values
friendly_nameA 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.
emailA string representing your customer's email address
policy_sidThe 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.
(warning)

Warning

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:

DescriptionRejection reason
Email domain should have correct syntaxEmail domain has an invalid address syntax.
Email domain is unknownUnknown email domain.
Temporary email which can be disposableEmail is a suspected disposable address.
If email check have passed all above validations and still is invalid from sendgrid APIEmail 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.

1.2 Create an Empty Starter Customer Profile Bundle

12-create-an-empty-starter-customer-profile-bundle page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_14
// Download the helper library from https://www.twilio.com/docs/node/install
_14
// Find your Account SID and Auth Token at twilio.com/console
_14
// and set the environment variables. See http://twil.io/secure
_14
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_14
const authToken = process.env.TWILIO_AUTH_TOKEN;
_14
const client = require('twilio')(accountSid, authToken);
_14
_14
client.trusthub.v1.customerProfiles
_14
.create({
_14
friendlyName: 'John Doe Starter Customer Profile Bundle',
_14
email: 'johndoe@example.com',
_14
policySid: 'RN806dd6cd175f314e1f96a9727ee271f4'
_14
})
_14
.then(customer_profiles => console.log(customer_profiles.sid));

Output

_18
{
_18
"sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"policy_sid": "RN806dd6cd175f314e1f96a9727ee271f4",
_18
"friendly_name": "John Doe Starter Customer Profile Bundle",
_18
"status": "draft",
_18
"email": "johndoe@example.com",
_18
"status_callback": "http://www.example.com",
_18
"valid_until": null,
_18
"date_created": "2019-07-30T22:29:24Z",
_18
"date_updated": "2019-07-31T01:09:00Z",
_18
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"links": {
_18
"customer_profiles_entity_assignments": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments",
_18
"customer_profiles_evaluations": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations",
_18
"customer_profiles_channel_endpoint_assignment": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/ChannelEndpointAssignments"
_18
}
_18
}

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

13-create-an-end-user-object-with-the-type-starter_customer_profile_information page anchor
ParameterValid Values
attributesAn object containing your customer's first name, last name, email address, and phone number
friendly_nameA string representing the end-user object you create in this step. This is for your internal purposes for identifying the end customer.
typeThe end user object type. This will always be starter_customer_profile_information for Starter Profiles.

The attributes object should contain the following fields:


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

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

13-create-an-end-user-object-with-the-type-starter_customer_profile_information-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_19
// Download the helper library from https://www.twilio.com/docs/node/install
_19
// Find your Account SID and Auth Token at twilio.com/console
_19
// and set the environment variables. See http://twil.io/secure
_19
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_19
const authToken = process.env.TWILIO_AUTH_TOKEN;
_19
const client = require('twilio')(accountSid, authToken);
_19
_19
client.trusthub.v1.endUsers
_19
.create({
_19
attributes: {
_19
email: 'starter-profile-enduser@example.com',
_19
first_name: 'John',
_19
last_name: 'Doe',
_19
phone_number: '+11234567890'
_19
},
_19
friendlyName: 'Starter Profile End User',
_19
type: 'starter_customer_profile_information'
_19
})
_19
.then(end_user => console.log(end_user.sid));

Output

_15
{
_15
"date_updated": "2021-02-16T20:40:57Z",
_15
"sid": "ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_15
"friendly_name": "Starter Profile End User",
_15
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_15
"url": "https://trusthub.twilio.com/v1/EndUsers/ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_15
"date_created": "2021-02-16T20:40:57Z",
_15
"attributes": {
_15
"email": "starter-profile-enduser@example.com",
_15
"first_name": "John",
_15
"last_name": "Doe",
_15
"phone_number": "+11234567890"
_15
},
_15
"type": "starter_customer_profile_information"
_15
}

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

14-create-a-supporting-document-customer_profile_address page anchor

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:

ParameterValid Values
Customer Name (optional)String representing your customer's name
Street Address 1Example: 1234 Your Street Name
Street Address 2 (optional)Example: Apt B
CityExample: San Francisco
RegionCan be a State or Province. For example, California (US State) and British Columbia (Canadian Province).
Postal CodeExample: 94016
IsoCountrySee this list of valid IsoCountry codes(link takes you to an external page)
(warning)

Warning

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 presentAddress not found with sid ADXXXXXXXXXXXXXXXXXXXXXXXX
If given address is not a valid US/CA addressThe 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.

1.4 Create a supporting document: customer_profile_address

14-create-a-supporting-document-customer_profile_address-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_18
// Download the helper library from https://www.twilio.com/docs/node/install
_18
// Find your Account SID and Auth Token at twilio.com/console
_18
// and set the environment variables. See http://twil.io/secure
_18
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_18
const authToken = process.env.TWILIO_AUTH_TOKEN;
_18
const client = require('twilio')(accountSid, authToken);
_18
_18
client.addresses
_18
.create({
_18
streetSecondary: 'Apt B',
_18
customerName: 'John Doe',
_18
street: '123 Example Street',
_18
city: 'Example City',
_18
region: 'CA',
_18
postalCode: '12345',
_18
isoCountry: 'US'
_18
})
_18
.then(address => console.log(address.sid));

Output

_18
{
_18
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"city": "Example City",
_18
"customer_name": "John Doe",
_18
"date_created": "Tue, 18 Aug 2015 17:07:30 +0000",
_18
"date_updated": "Tue, 18 Aug 2015 17:07:30 +0000",
_18
"emergency_enabled": false,
_18
"friendly_name": null,
_18
"iso_country": "US",
_18
"postal_code": "12345",
_18
"region": "CA",
_18
"sid": "ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"street": "123 Example Street",
_18
"street_secondary": "Apt B",
_18
"validated": false,
_18
"verified": false,
_18
"uri": "/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Addresses/ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.json"
_18
}

1.5 Create a Supporting Document with the Address from Step 1.4

15-create-a-supporting-document-with-the-address-from-step-14 page anchor

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:

ParameterValid Values
attributesAn object containing the Address SID from the previous step.
friendly_nameA string you use to identify this Supporting Document
typeThe string customer_profile_address

The attributes object should look like this:


_10
{
_10
"address_sids": "ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

1.5 Create a Supporting Document with the Address from Step 1.4

15-create-a-supporting-document-with-the-address-from-step-14-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_16
// Download the helper library from https://www.twilio.com/docs/node/install
_16
// Find your Account SID and Auth Token at twilio.com/console
_16
// and set the environment variables. See http://twil.io/secure
_16
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_16
const authToken = process.env.TWILIO_AUTH_TOKEN;
_16
const client = require('twilio')(accountSid, authToken);
_16
_16
client.trusthub.v1.supportingDocuments
_16
.create({
_16
attributes: {
_16
address_sids: 'ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
_16
},
_16
friendlyName: 'SP Document Address',
_16
type: 'customer_profile_address'
_16
})
_16
.then(supporting_document => console.log(supporting_document.sid));

Output

_14
{
_14
"status": "draft",
_14
"date_updated": "2021-02-11T17:23:00Z",
_14
"friendly_name": "SP Document Address",
_14
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"url": "https://trusthub.twilio.com/v1/SupportingDocuments/RDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"date_created": "2021-02-11T17:23:00Z",
_14
"sid": "RDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"attributes": {
_14
"address_sids": "ADXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_14
},
_14
"type": "customer_profile_address",
_14
"mime_type": null
_14
}

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

16-assign-end-user-supporting-document-and-primary-customer-profile-to-the-starter-customer-profile-that-you-created page anchor

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

161-attach-the-end-user-from-step-13-to-the-starter-customer-profile page anchor

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.

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

161-attach-the-end-user-from-step-13-to-the-starter-customer-profile-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.customerProfiles('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.customerProfilesEntityAssignments
_11
.create({objectSid: 'ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'})
_11
.then(customer_profiles_entity_assignments => console.log(customer_profiles_entity_assignments.sid));

Output

_10
{
_10
"sid": "BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"customer_profile_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"object_sid": "ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"date_created": "2019-07-31T02:34:41Z",
_10
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments/BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

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

162-attach-the-supporting-document-from-step-14-to-the-starter-customer-profile page anchor

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.

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

162-attach-the-supporting-document-from-step-14-to-the-starter-customer-profile-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.customerProfiles('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.customerProfilesEntityAssignments
_11
.create({objectSid: 'RDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'})
_11
.then(customer_profiles_entity_assignments => console.log(customer_profiles_entity_assignments.sid));

Output

_10
{
_10
"sid": "BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"customer_profile_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"object_sid": "RDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"date_created": "2019-07-31T02:34:41Z",
_10
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments/BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

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

163-attach-the-primary-customer-profile-bundle-to-the-starter-customer-profile-bundle page anchor

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.

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

163-attach-the-primary-customer-profile-bundle-to-the-starter-customer-profile-bundle-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.customerProfiles('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.customerProfilesEntityAssignments
_11
.create({objectSid: 'BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'})
_11
.then(customer_profiles_entity_assignments => console.log(customer_profiles_entity_assignments.sid));

Output

_10
{
_10
"sid": "BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"customer_profile_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"object_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"date_created": "2019-07-31T02:34:41Z",
_10
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments/BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

1.7 Evaluate the Starter Customer Profile

17-evaluate-the-starter-customer-profile page anchor

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.

1.7 Evaluate the Starter Customer Profile

17-evaluate-the-starter-customer-profile-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.customerProfiles('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.customerProfilesEvaluations
_11
.create({policySid: 'RN806dd6cd175f314e1f96a9727ee271f4'})
_11
.then(customer_profiles_evaluations => console.log(customer_profiles_evaluations.sid));

Output

_89
{
_89
"sid": "ELXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_89
"status": "compliant",
_89
"date_created": "2023-03-15T13:51:57Z",
_89
"policy_sid": "RN806dd6cd175f314e1f96a9727ee271f4",
_89
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_89
"customer_profile_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_89
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations/ELXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_89
"results": [
_89
{
_89
"valid": [
_89
{
_89
"object_field": "first_name",
_89
"error_code": null,
_89
"friendly_name": "First Name",
_89
"passed": true,
_89
"failure_reason": null
_89
},
_89
{
_89
"object_field": "last_name",
_89
"error_code": null,
_89
"friendly_name": "Last Name",
_89
"passed": true,
_89
"failure_reason": null
_89
},
_89
{
_89
"object_field": "email",
_89
"error_code": null,
_89
"friendly_name": "Email Address",
_89
"passed": true,
_89
"failure_reason": null
_89
},
_89
{
_89
"object_field": "phone_number",
_89
"error_code": null,
_89
"friendly_name": "Phone Number",
_89
"passed": true,
_89
"failure_reason": null
_89
}
_89
],
_89
"invalid": [],
_89
"object_type": "starter_customer_profile_information",
_89
"friendly_name": "Information",
_89
"failure_reason": null,
_89
"passed": true,
_89
"requirement_friendly_name": "Starter Customer Profile Information",
_89
"error_code": null,
_89
"requirement_name": "starter_customer_profile_information"
_89
},
_89
{
_89
"valid": [
_89
{
_89
"object_field": "address_sids",
_89
"error_code": null,
_89
"friendly_name": "address sids",
_89
"passed": true,
_89
"failure_reason": null
_89
}
_89
],
_89
"invalid": [],
_89
"object_type": "customer_profile_address",
_89
"friendly_name": "Legal Company Address",
_89
"failure_reason": null,
_89
"passed": true,
_89
"requirement_friendly_name": "Customer Profile Address",
_89
"error_code": null,
_89
"requirement_name": "customer_profile_address"
_89
},
_89
{
_89
"valid": [
_89
{
_89
"object_field": "bundle_sid",
_89
"error_code": null,
_89
"friendly_name": "Supporting Bundle Status",
_89
"passed": true,
_89
"failure_reason": null
_89
}
_89
],
_89
"invalid": [],
_89
"object_type": "primary_customer_profile_type_business",
_89
"friendly_name": "Primary Customer Profile Bundle",
_89
"failure_reason": null,
_89
"passed": true,
_89
"requirement_friendly_name": "Primary Customer Profile",
_89
"error_code": null,
_89
"requirement_name": "primary_customer_profile"
_89
}
_89
]
_89
}

1.8 Submit the Starter Customer Profile for review

18-submit-the-starter-customer-profile-for-review page anchor

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.

(information)

Info

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.

1.8 Submit the Starter Customer Profile for review

18-submit-the-starter-customer-profile-for-review-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.trusthub.v1.customerProfiles('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_10
.update({status: 'pending-review'})
_10
.then(customer_profiles => console.log(customer_profiles.friendlyName));

Output

_18
{
_18
"sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"policy_sid": "RNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"friendly_name": "friendly_name",
_18
"status": "pending-review",
_18
"email": "email",
_18
"status_callback": "http://www.example.com",
_18
"valid_until": null,
_18
"date_created": "2019-07-30T22:29:24Z",
_18
"date_updated": "2019-07-31T01:09:00Z",
_18
"url": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"links": {
_18
"customer_profiles_entity_assignments": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments",
_18
"customer_profiles_evaluations": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations",
_18
"customer_profiles_channel_endpoint_assignment": "https://trusthub.twilio.com/v1/CustomerProfiles/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/ChannelEndpointAssignments"
_18
}
_18
}


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

2-create-a-new-sole-proprietor-a2p-trust-bundle-and-attach-required-information page anchor

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

21-fetch-the-sole-proprietor-a2p-trust-policy page anchor

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.

2.1 Fetch the Sole Proprietor A2P Trust Policy

21-fetch-the-sole-proprietor-a2p-trust-policy-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.trusthub.v1.policies('RN670d5d2e282a6130ae063b234b6019c8')
_10
.fetch()
_10
.then(policies => console.log(policies.friendlyName));

Output

_36
{
_36
"url": "https://trusthub.twilio.com/v1/Policies/RN670d5d2e282a6130ae063b234b6019c8",
_36
"requirements": {
_36
"end_user": [
_36
{
_36
"url": "/EndUserTypes/sole_proprietor_information",
_36
"fields": [
_36
"brand_name",
_36
"mobile_phone_number",
_36
"vertical"
_36
],
_36
"type": "sole_proprietor_information",
_36
"name": "Sole Proprietor Information",
_36
"requirement_name": "sole_proprietor_information"
_36
}
_36
],
_36
"supporting_trust_products": [],
_36
"supporting_document": [
_36
[]
_36
],
_36
"supporting_customer_profiles": [
_36
{
_36
"type": "starter_customer_profile_type_business",
_36
"name": "Starter Customer Profile(isv customers) Proof",
_36
"requirement_name": "customer_profile"
_36
},
_36
{
_36
"type": "starter_customer_profile_type_direct_long_tail",
_36
"name": "Starter Customer Profile(direct customers) Proof",
_36
"requirement_name": "customer_profile"
_36
}
_36
]
_36
},
_36
"friendly_name": "Sole Proprietor TrustProduct",
_36
"sid": "RN670d5d2e282a6130ae063b234b6019c8"
_36
}

2.2 Create a Sole Proprietor A2P Trust Bundle

22-create-a-sole-proprietor-a2p-trust-bundle page anchor

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:

ParameterValid Values
friendly_nameA string representing your customer's business name. This is an internal name for you to identify this Bundle for your customer.
emailA string representing your customer's email address
policy_sidThe static A2P Messaging TrustHub Policy identifier. The hard-coded value is RN670d5d2e282a6130ae063b234b6019c8.
status_callbackThe 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.

2.2 Create a Sole Proprietor A2P Trust Bundle

22-create-a-sole-proprietor-a2p-trust-bundle-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_14
// Download the helper library from https://www.twilio.com/docs/node/install
_14
// Find your Account SID and Auth Token at twilio.com/console
_14
// and set the environment variables. See http://twil.io/secure
_14
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_14
const authToken = process.env.TWILIO_AUTH_TOKEN;
_14
const client = require('twilio')(accountSid, authToken);
_14
_14
client.trusthub.v1.trustProducts
_14
.create({
_14
friendlyName: 'John Doe Sole Proprietor A2P Trust Bundle',
_14
email: 'johndoe@example.com',
_14
policySid: 'RN670d5d2e282a6130ae063b234b6019c8'
_14
})
_14
.then(trust_products => console.log(trust_products.sid));

Output

_18
{
_18
"sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"policy_sid": "RN670d5d2e282a6130ae063b234b6019c8",
_18
"friendly_name": "John Doe Sole Proprietor A2P Trust Bundle",
_18
"status": "draft",
_18
"email": "johndoe@example.com",
_18
"status_callback": "http://www.example.com",
_18
"valid_until": null,
_18
"date_created": "2019-07-30T22:29:24Z",
_18
"date_updated": "2019-07-31T01:09:00Z",
_18
"url": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"links": {
_18
"trust_products_entity_assignments": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments",
_18
"trust_products_evaluations": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations",
_18
"trust_products_channel_endpoint_assignment": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/ChannelEndpointAssignments"
_18
}
_18
}

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

23-create-end-user-object-with-the-type-sole_proprietor_information page anchor

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.

(error)

Danger

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:

ParameterValid Values
attributesAn 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_nameA string to indentify this end user object for your customer
typeThe string sole_proprietor_information

The attributes object should look like this:


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

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

2.3 Create an end-user object with the type sole_proprietor_information

23-create-an-end-user-object-with-the-type-sole_proprietor_information page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_18
// Download the helper library from https://www.twilio.com/docs/node/install
_18
// Find your Account SID and Auth Token at twilio.com/console
_18
// and set the environment variables. See http://twil.io/secure
_18
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_18
const authToken = process.env.TWILIO_AUTH_TOKEN;
_18
const client = require('twilio')(accountSid, authToken);
_18
_18
client.trusthub.v1.endUsers
_18
.create({
_18
attributes: {
_18
brand_name: 'John Doe',
_18
vertical: 'COMMUNICATION',
_18
mobile_phone_number: '+11234567890'
_18
},
_18
friendlyName: 'Sole Proprietor A2P Trust Bundle End User',
_18
type: 'sole_proprietor_information'
_18
})
_18
.then(end_user => console.log(end_user.sid));

Output

_14
{
_14
"date_updated": "2021-02-16T20:40:57Z",
_14
"sid": "ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"friendly_name": "Sole Proprietor A2P Trust Bundle End User",
_14
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"url": "https://trusthub.twilio.com/v1/EndUsers/ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_14
"date_created": "2021-02-16T20:40:57Z",
_14
"attributes": {
_14
"brand_name": "John Doe",
_14
"vertical": "COMMUNICATION",
_14
"mobile_phone_number": "+11234567890"
_14
},
_14
"type": "sole_proprietor_information"
_14
}

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

24-assign-the-end-user-and-starter-customer-profile-to-the-sole-proprietor-a2p-trust-bundle page anchor

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

241-attach-the-end-user-from-step-23-to-the-sole-proprietor-a2p-bundle page anchor

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.

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

241-attach-the-end-user-from-step-23-to-the-sole-proprietor-a2p-bundle-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.trustProducts('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.trustProductsEntityAssignments
_11
.create({objectSid: 'ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'})
_11
.then(trust_products_entity_assignments => console.log(trust_products_entity_assignments.sid));

Output

_10
{
_10
"sid": "BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"trust_product_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"object_sid": "ITXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"date_created": "2019-07-31T02:34:41Z",
_10
"url": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments/BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

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

242-assign-the-starter-customer-profile-bundle-to-the-sole-proprietor-a2p-trust-bundle page anchor

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.

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

242-assign-the-starter-customer-profile-bundle-to-the-sole-proprietor-a2p-trust-bundle-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.trustProducts('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.trustProductsEntityAssignments
_11
.create({objectSid: 'BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'})
_11
.then(trust_products_entity_assignments => console.log(trust_products_entity_assignments.sid));

Output

_10
{
_10
"sid": "BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"trust_product_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"object_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_10
"date_created": "2019-07-31T02:34:41Z",
_10
"url": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments/BVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

2.5 Evaluate the Sole Proprietor A2P Trust Bundle

25-evaluate-the-sole-proprietor-a2p-trust-bundle page anchor

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.

2.5 Evaluate the Sole Proprietor A2P Trust Bundle

25-evaluate-the-sole-proprietor-a2p-trust-bundle-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.trusthub.v1.trustProducts('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.trustProductsEvaluations
_11
.create({policySid: 'RN670d5d2e282a6130ae063b234b6019c8'})
_11
.then(trust_products_evaluations => console.log(trust_products_evaluations.sid));

Output

_63
{
_63
"sid": "ELXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_63
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_63
"policy_sid": "RN670d5d2e282a6130ae063b234b6019c8",
_63
"trust_product_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_63
"status": "compliant",
_63
"date_created": "2020-04-28T18:14:01Z",
_63
"url": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations/ELXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_63
"results": [
_63
{
_63
"valid": [
_63
{
_63
"object_field": "brand_name",
_63
"error_code": null,
_63
"friendly_name": "Brand Name",
_63
"passed": true,
_63
"failure_reason": null
_63
},
_63
{
_63
"object_field": "mobile_phone_number",
_63
"error_code": null,
_63
"friendly_name": "Mobile Phone Number",
_63
"passed": true,
_63
"failure_reason": null
_63
},
_63
{
_63
"object_field": "vertical",
_63
"error_code": null,
_63
"friendly_name": "Vertical",
_63
"passed": true,
_63
"failure_reason": null
_63
}
_63
],
_63
"invalid": [],
_63
"object_type": "sole_proprietor_information",
_63
"friendly_name": "Sole Proprietor Information",
_63
"failure_reason": null,
_63
"passed": true,
_63
"requirement_friendly_name": "Sole Proprietor Information",
_63
"error_code": null,
_63
"requirement_name": "sole_proprietor_information"
_63
},
_63
{
_63
"valid": [
_63
{
_63
"object_field": "bundle_status",
_63
"error_code": null,
_63
"friendly_name": "Supporting Bundle Status",
_63
"passed": true,
_63
"failure_reason": null
_63
}
_63
],
_63
"invalid": [],
_63
"object_type": "starter_customer_profile_type_business",
_63
"friendly_name": "Starter Customer Profile(isv customers) Proof",
_63
"failure_reason": null,
_63
"passed": true,
_63
"requirement_friendly_name": "Customer Profile",
_63
"error_code": null,
_63
"requirement_name": "customer_profile"
_63
}
_63
]
_63
}

2.6 Submit the Sole Proprietor A2P Trust Bundle for review

26-submit-the-sole-proprietor-a2p-trust-bundle-for-review page anchor

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.

(warning)

Warning

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.

2.6 Submit the Sole Proprietor A2P Trust Bundle for review

26-submit-the-sole-proprietor-a2p-trust-bundle-for-review-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.trusthub.v1.trustProducts('BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_10
.update({status: 'pending-review'})
_10
.then(trust_products => console.log(trust_products.friendlyName));

Output

_18
{
_18
"sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"policy_sid": "RNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"friendly_name": "friendly_name",
_18
"status": "pending-review",
_18
"email": "email",
_18
"status_callback": "http://www.example.com",
_18
"valid_until": null,
_18
"date_created": "2019-07-30T22:29:24Z",
_18
"date_updated": "2019-07-31T01:09:00Z",
_18
"url": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_18
"links": {
_18
"trust_products_entity_assignments": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/EntityAssignments",
_18
"trust_products_evaluations": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Evaluations",
_18
"trust_products_channel_endpoint_assignment": "https://trusthub.twilio.com/v1/TrustProducts/BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/ChannelEndpointAssignments"
_18
}
_18
}


3. Create a new Sole Proprietor A2P Brand

3-create-a-new-sole-proprietor-a2p-brand page anchor

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.

3. Create a new Sole Proprietor A2P Brand

3-create-a-new-sole-proprietor-a2p-brand-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_14
// Download the helper library from https://www.twilio.com/docs/node/install
_14
// Find your Account SID and Auth Token at twilio.com/console
_14
// and set the environment variables. See http://twil.io/secure
_14
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_14
const authToken = process.env.TWILIO_AUTH_TOKEN;
_14
const client = require('twilio')(accountSid, authToken);
_14
_14
client.messaging.v1.brandRegistrations
_14
.create({
_14
brandType: 'SOLE_PROPRIETOR',
_14
customerProfileBundleSid: 'BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
_14
a2PProfileBundleSid: 'BUYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'
_14
})
_14
.then(brand_registration => console.log(brand_registration.sid));

Output

_29
{
_29
"sid": "BN0044409f7e067e279523808d267e2d85",
_29
"account_sid": "AC78e8e67fc0246521490fb9907fd0c165",
_29
"customer_profile_bundle_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_29
"a2p_profile_bundle_sid": "BUYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
_29
"date_created": "2021-01-28T10:45:51Z",
_29
"date_updated": "2021-01-28T10:45:51Z",
_29
"brand_type": "SOLE_PROPRIETOR",
_29
"status": "PENDING",
_29
"tcr_id": "BXXXXXX",
_29
"failure_reason": "Registration error",
_29
"url": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BN0044409f7e067e279523808d267e2d85",
_29
"brand_score": 42,
_29
"brand_feedback": [
_29
"TAX_ID",
_29
"NONPROFIT"
_29
],
_29
"identity_status": "VERIFIED",
_29
"russell_3000": true,
_29
"government_entity": false,
_29
"tax_exempt_status": "501c3",
_29
"skip_automatic_sec_vet": false,
_29
"errors": [],
_29
"mock": false,
_29
"links": {
_29
"brand_vettings": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BN0044409f7e067e279523808d267e2d85/Vettings",
_29
"brand_registration_otps": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BN0044409f7e067e279523808d267e2d85/SmsOtp"
_29
}
_29
}

3.1 GET the Sole Proprietor Brand registration status

31-get-the-sole-proprietor-brand-registration-status page anchor
(information)

Info

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:

PropertyPossible Values
statusPENDING, APPROVED, FAILED or SUSPENDED
identity_statusUNVERIFIED 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(link takes you to an external page)
failure_reasonOnly 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-(link takes you to an external page).) Please verify that the supplied information is accurate and well-formed before contacting Twilio Support(link takes you to an external page)

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.

3.1 GET the Sole Proprietor Brand registration status

31-get-the-sole-proprietor-brand-registration-status-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.messaging.v1.brandRegistrations('BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_10
.fetch()
_10
.then(brand_registration => console.log(brand_registration.sid));

Output

_26
{
_26
"sid": "BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_26
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_26
"a2p_profile_bundle_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_26
"customer_profile_bundle_sid": "BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_26
"status": "APPROVED",
_26
"identity_status": "VERIFIED",
_26
"brand_type": "SOLE_PROPRIETOR",
_26
"mock": false,
_26
"tcr_id": null,
_26
"brand_score": null,
_26
"russell_3000": null,
_26
"brand_feedback": null,
_26
"failure_reason": null,
_26
"government_entity": null,
_26
"tax_exempt_status": null,
_26
"skip_automatic_sec_vet": false,
_26
"errors": [],
_26
"date_updated": "2023-03-15T14:21:42Z",
_26
"date_created": "2023-03-15T14:21:42Z",
_26
"url": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_26
"links": {
_26
"brand_vettings": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Vettings",
_26
"brand_registration_otps": "https://messaging.twilio.com/v1/a2p/BrandRegistrations/BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/SmsOtp"
_26
}
_26
}


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

32-optional-retry-otp-verification-for-the-submitted-mobile-number page anchor

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.

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

32-optional-retry-otp-verification-for-the-submitted-mobile-number-1 page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.messaging.v1.brandRegistrations('BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.brandRegistrationOtps
_11
.create()
_11
.then(brand_registration_otp => console.log(brand_registration_otp.brandRegistrationSid));

Output

_10
{
_10
"account_sid": "AC78e8e67fc0246521490fb9907fd0c165",
_10
"brand_registration_sid": "BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
_10
}

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


4. Create a new Messaging Service

4-create-a-new-messaging-service page anchor

Which API? Messaging API

(warning)

Warning

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

5-create-a-new-sole-proprietor-a2p-sms-campaign page anchor

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(link takes you to an external page) to ensure your Campaigns meet all requirements.

Most Twilio customers use Twilio's default or advanced opt-out features(link takes you to an external page). 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: brand_registration_sid

Description:

The A2P Brand Registration SID from Step 3

Parameter: description

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"

Parameter: message_samples

Description:

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."

Parameter: message_flow

Description:

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(link takes you to an external page) 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(link takes you to an external page). Privacy Policy at www.acmesandwich.com/privacy(link takes you to an external page)"

  • 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(link takes you to an external page) . 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.

Parameter: us_app_to_person_usecase

Description:

SOLE_PROPRIETOR (there is only one valid use case for a Sole Proprietor Brand)

Parameter: has_embedded_links

Description:

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

Parameter: has_embedded_phone

Description:

Boolean. Indicates that this SMS campaign will send messages that contain phone numbers.

Parameter: opt_in_message (optional)

Description:

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.

Parameter: opt_in_keywords (optional)

Description:

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.

Parameter: opt_out_message (optional in certain cases, see description)

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.

Parameter: opt_out_keywords (optional in certain cases, see description)

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.

Parameter: help_message (optional in certain cases, see description)

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.

Parameter: help_keywords (optional in certain cases, see description)

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.

(warning)

Warning

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


_10
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.

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

5-create-a-new-sole-proprietor-a2p-sms-campaign-for-default-or-advanced-opt-out-users page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_19
// Download the helper library from https://www.twilio.com/docs/node/install
_19
// Find your Account SID and Auth Token at twilio.com/console
_19
// and set the environment variables. See http://twil.io/secure
_19
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_19
const authToken = process.env.TWILIO_AUTH_TOKEN;
_19
const client = require('twilio')(accountSid, authToken);
_19
_19
client.messaging.v1.services('MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_19
.usAppToPerson
_19
.create({
_19
description: 'Send marketing messages about sales and offers',
_19
messageFlow: 'End users opt-in by visiting www.example.com and adding their phone number. They then check a box agreeing to receive text messages from Example Brand. Term and Conditions at www.example.com/tc. Privacy Policy at www.example.com/privacy',
_19
messageSamples: ['Book your next OWL FLIGHT for just 1 EUR', 'Twilio draw the OWL event is ON'],
_19
usAppToPersonUsecase: 'SOLE_PROPRIETOR',
_19
hasEmbeddedLinks: true,
_19
hasEmbeddedPhone: true,
_19
brandRegistrationSid: 'BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
_19
})
_19
.then(us_app_to_person => console.log(us_app_to_person.sid));

Output

_53
{
_53
"sid": "QE2c6890da8086d771620e9b13fadeba0b",
_53
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_53
"brand_registration_sid": "BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_53
"messaging_service_sid": "MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_53
"description": "Send marketing messages about sales and offers",
_53
"message_samples": [
_53
"Book your next OWL FLIGHT for just 1 EUR",
_53
"Twilio draw the OWL event is ON"
_53
],
_53
"us_app_to_person_usecase": "SOLE_PROPRIETOR",
_53
"has_embedded_links": true,
_53
"has_embedded_phone": true,
_53
"subscriber_opt_in": true,
_53
"age_gated": false,
_53
"direct_lending": false,
_53
"campaign_status": "PENDING",
_53
"campaign_id": "CFOOBAR",
_53
"is_externally_registered": false,
_53
"rate_limits": {
_53
"att": {
_53
"mps": 0.25,
_53
"msg_class": "A"
_53
},
_53
"tmobile": {
_53
"brand_tier": "LOW"
_53
}
_53
},
_53
"message_flow": "End users opt-in by visiting www.example.com and adding their phone number. They then check a box agreeing to receive text messages from Example Brand. Term and Conditions at www.example.com/tc. Privacy Policy at www.example.com/privacy",
_53
"opt_in_message": "Acme Corporation: You are now opted-in. For help, reply HELP. To opt-out, reply STOP",
_53
"opt_out_message": "You have successfully been unsubscribed. You will not receive any more messages from this number. Reply START to resubscribe.",
_53
"help_message": "Reply STOP to unsubscribe. Msg&Data Rates May Apply.",
_53
"opt_in_keywords": [
_53
"START"
_53
],
_53
"opt_out_keywords": [
_53
"STOP",
_53
"STOPALL",
_53
"UNSUBSCRIBE",
_53
"CANCEL",
_53
"END",
_53
"QUIT"
_53
],
_53
"help_keywords": [
_53
"HELP",
_53
"INFO"
_53
],
_53
"date_created": "2021-02-18T14:48:52Z",
_53
"date_updated": "2021-02-18T14:48:52Z",
_53
"url": "https://messaging.twilio.com/v1/Services/MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Compliance/Usa2p/QE2c6890da8086d771620e9b13fadeba0b",
_53
"mock": false,
_53
"errors": []
_53
}

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

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

5-create-a-new-sole-proprietor-a2p-sms-campaign-for-customers-managing-their-own-opt-out page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_23
// Download the helper library from https://www.twilio.com/docs/node/install
_23
// Find your Account SID and Auth Token at twilio.com/console
_23
// and set the environment variables. See http://twil.io/secure
_23
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_23
const authToken = process.env.TWILIO_AUTH_TOKEN;
_23
const client = require('twilio')(accountSid, authToken);
_23
_23
client.messaging.v1.services('MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_23
.usAppToPerson
_23
.create({
_23
optOutKeywords: ['STOP', 'END'],
_23
optOutMessage: 'You have successfully been unsubscribed from Acme Corporation. You will not receive any more messages from this number.',
_23
helpKeywords: ['HELP', 'SUPPORT'],
_23
helpMessage: 'Acme Corporation: Please visit www.example.com to get support. To opt-out, reply STOP.',
_23
description: 'Send marketing messages about sales and offers',
_23
messageFlow: 'End users opt-in by visiting www.example.com and adding their phone number. They then check a box agreeing to receive text messages from Example Brand. Term and Conditions at www.example.com/tc. Privacy Policy at www.example.com/privacy',
_23
messageSamples: ['Book your next OWL FLIGHT for just 1 EUR', 'Twilio draw the OWL event is ON'],
_23
usAppToPersonUsecase: 'SOLE_PROPRIETOR',
_23
hasEmbeddedLinks: true,
_23
hasEmbeddedPhone: true,
_23
brandRegistrationSid: 'BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
_23
})
_23
.then(us_app_to_person => console.log(us_app_to_person.sid));

Output

_49
{
_49
"sid": "QE2c6890da8086d771620e9b13fadeba0b",
_49
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_49
"brand_registration_sid": "BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_49
"messaging_service_sid": "MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_49
"description": "Send marketing messages about sales and offers",
_49
"message_samples": [
_49
"Book your next OWL FLIGHT for just 1 EUR",
_49
"Twilio draw the OWL event is ON"
_49
],
_49
"us_app_to_person_usecase": "SOLE_PROPRIETOR",
_49
"has_embedded_links": true,
_49
"has_embedded_phone": true,
_49
"subscriber_opt_in": true,
_49
"age_gated": false,
_49
"direct_lending": false,
_49
"campaign_status": "PENDING",
_49
"campaign_id": "CFOOBAR",
_49
"is_externally_registered": false,
_49
"rate_limits": {
_49
"att": {
_49
"mps": 0.25,
_49
"msg_class": "A"
_49
},
_49
"tmobile": {
_49
"brand_tier": "LOW"
_49
}
_49
},
_49
"message_flow": "End users opt-in by visiting www.example.com and adding their phone number. They then check a box agreeing to receive text messages from Example Brand. Term and Conditions at www.example.com/tc. Privacy Policy at www.example.com/privacy",
_49
"opt_in_message": "Acme Corporation: You are now opted-in. For help, reply HELP. To opt-out, reply STOP",
_49
"opt_out_message": "You have successfully been unsubscribed from Acme Corporation. You will not receive any more messages from this number.",
_49
"help_message": "Acme Corporation: Please visit www.example.com to get support. To opt-out, reply STOP.",
_49
"opt_in_keywords": [
_49
"START"
_49
],
_49
"opt_out_keywords": [
_49
"STOP",
_49
"END"
_49
],
_49
"help_keywords": [
_49
"HELP",
_49
"SUPPORT"
_49
],
_49
"date_created": "2021-02-18T14:48:52Z",
_49
"date_updated": "2021-02-18T14:48:52Z",
_49
"url": "https://messaging.twilio.com/v1/Services/MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Compliance/Usa2p/QE2c6890da8086d771620e9b13fadeba0b",
_49
"mock": false,
_49
"errors": []
_49
}

5.1 GET the Status of an A2P Messaging Campaign

51-get-the-status-of-an-a2p-messaging-campaign page anchor
(information)

Info

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.

5.1 GET A2P Messaging Campaign Status

51-get-a2p-messaging-campaign-status page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_11
// Download the helper library from https://www.twilio.com/docs/node/install
_11
// Find your Account SID and Auth Token at twilio.com/console
_11
// and set the environment variables. See http://twil.io/secure
_11
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_11
const authToken = process.env.TWILIO_AUTH_TOKEN;
_11
const client = require('twilio')(accountSid, authToken);
_11
_11
client.messaging.v1.services('MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_11
.usAppToPerson('QE2c6890da8086d771620e9b13fadeba0b')
_11
.fetch()
_11
.then(us_app_to_person => console.log(us_app_to_person.sid));

Output

_47
{
_47
"sid": "QE2c6890da8086d771620e9b13fadeba0b",
_47
"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_47
"brand_registration_sid": "BNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_47
"messaging_service_sid": "MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
_47
"description": "Send confirmation messages about scheduled home repair services",
_47
"message_samples": [
_47
"EXPRESS: Denim Days Event is ON",
_47
"LAST CHANCE: Book your next flight for just 1 (ONE) EUR"
_47
],
_47
"us_app_to_person_usecase": "SOLE_PROPRIETOR",
_47
"has_embedded_links": true,
_47
"has_embedded_phone": false,
_47
"subscriber_opt_in": true,
_47
"age_gated": false,
_47
"direct_lending": false,
_47
"campaign_status": "PENDING",
_47
"campaign_id": "CFOOBAR",
_47
"is_externally_registered": false,
_47
"rate_limits": {
_47
"att": {
_47
"mps": 600,
_47
"msg_class": "A"
_47
},
_47
"tmobile": {
_47
"brand_tier": "TOP"
_47
}
_47
},
_47
"message_flow": "End users call (111)-222-3333 to schedule appointments, where they're also asked whether they would like to provide their phone numbers to receive appointment reminders ",
_47
"opt_in_message": "John Doe's Home Repair: You are now opted-in. For help, reply HELP. To opt-out, reply STOP",
_47
"opt_out_message": "You have successfully been unsubscribed from John Doe's Home Repair. You will not receive any more messages from this number.",
_47
"help_message": "John Doe's Home Repair: Please call (111)-222-3333 to get help. To opt-out, please reply STOP",
_47
"opt_in_keywords": [
_47
"START"
_47
],
_47
"opt_out_keywords": [
_47
"STOP"
_47
],
_47
"help_keywords": [
_47
"HELP"
_47
],
_47
"date_created": "2021-02-18T14:48:52Z",
_47
"date_updated": "2021-02-18T14:48:52Z",
_47
"url": "https://messaging.twilio.com/v1/Services/MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Compliance/Usa2p/QE2c6890da8086d771620e9b13fadeba0b",
_47
"mock": false,
_47
"errors": []
_47
}

5.2 [Optional] DELETE A2P Messaging Campaign

52-optional-delete-a2p-messaging-campaign page anchor

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.

5.2 [Optional] DELETE A2P Messaging campaign use case

52-optional-delete-a2p-messaging-campaign-use-case page anchor
Node.js
Python
C#
Java
Go
PHP
Ruby
twilio-cli
curl

_10
// Download the helper library from https://www.twilio.com/docs/node/install
_10
// Find your Account SID and Auth Token at twilio.com/console
_10
// and set the environment variables. See http://twil.io/secure
_10
const accountSid = process.env.TWILIO_ACCOUNT_SID;
_10
const authToken = process.env.TWILIO_AUTH_TOKEN;
_10
const client = require('twilio')(accountSid, authToken);
_10
_10
client.messaging.v1.services('MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
_10
.usAppToPerson('QE2c6890da8086d771620e9b13fadeba0b')
_10
.remove();


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

6-ensure-that-a-twilio-10dlc-phone-number-is-associated-with-your-new-campaign page anchor

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(link takes you to an external page) for details on both.

(warning)

Warning

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: