10DLC Brands
On this page
Register and manage 10DLC brands through TNID: API keys, draft and submit flows, statuses, listing and sharing brands with partner companies.
10DLC is the US carrier registration system for application-to-person messaging on local numbers. A brand is the registered business that sends messages; campaigns (next page) describe what it sends. TNID submits brands and campaigns to The Campaign Registry (TCR) for you and tracks their status.
All 10DLC operations are on the /company GraphQL server with a company token. Every operation is documented with request, variables and response in the API Reference.
1. Register a 10DLC API key
Brands and campaigns are submitted under a 10DLC (TCR) API key. Register the key with TNID once; it must be a key provisioned for this purpose only, not shared with another integration.
mutation ($name: String!, $apiKey: String!, $apiKeySecret: String!) {
addTenDlcApiKey(name: $name, apiKey: $apiKey, apiKeySecret: $apiKeySecret) {
apiKeyId
companyId
name
}
}
Related: tenDlcApiKeys lists your keys, updateTenDlcApiKey renames one, deleteTenDlcApiKey removes one.
Sharing a key with a partner. A company that owns a key can let another company register brands and campaigns under it with authorizeTenDlcApiKey(apiKeyId, authorizedCompanyId), see the authorizations with tenDlcApiKeyAuthorizations, and withdraw with revokeTenDlcApiKeyAuthorization. The authorized company then sees those brands and campaigns with ownershipType other than DIRECT.
2. Brand lifecycle
| Status | Meaning |
|---|---|
DRAFT |
Saved in TNID, not sent to TCR. Edit freely. |
PENDING_REVIEW |
Submitted to TCR, awaiting verification. |
ACTIVE |
Verified. Campaigns can be submitted against it. |
REJECTED |
TCR rejected the brand. Fix the data and resubmit with updateAndSubmitTenDlcBrand. |
EXPIRED |
Registration lapsed. |
Two ways in:
- Draft first (recommended when data arrives in pieces):
registerTenDlcBrandAsDraft(input)creates aDRAFT;updateTenDlcBrandAsDraft(id, input)edits it;updateAndSubmitTenDlcBrand(id, input)submits it. - One shot:
registerAndSubmitTenDlcBrand(input)creates and submits in a single call.
mutation ($input: TenDlcRegisterBrandInput!) {
registerAndSubmitTenDlcBrand(input: $input) {
id
brandId
displayName
entityType
status
}
}
{
"input": {
"companyId": "<your company id>",
"tenDlcApiKeyId": "<id returned by addTenDlcApiKey>",
"displayName": "Acme Metals",
"companyName": "Acme Metals LLC",
"entityType": "PRIVATE_PROFIT",
"brandRelationship": "BASIC_ACCOUNT",
"ein": "12-3456789",
"einIssuingCountry": "US",
"vertical": "PROFESSIONAL",
"website": "https://acme-metals.example",
"email": "compliance@acme-metals.example",
"phone": "+14155551234",
"street": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94105",
"country": "US"
}
}
The response status is PENDING_REVIEW; brandId is the TCR identifier (for example BAXKPHB). Poll tenDlcBrand(id) or list with tenDlcBrands until status is ACTIVE, then submit campaigns. workflowStatus (for example VERIFIED) reflects TCR's own verification workflow.
Allowed values for entityType, brandRelationship, vertical and the status enums are listed under Enums in the API Reference.
3. Find and inspect brands
query ($status: TenDlcBrandStatus, $ownershipType: TenDlcOwnershipType, $page: Int, $pageSize: Int) {
tenDlcBrands(status: $status, ownershipType: $ownershipType, page: $page, pageSize: $pageSize) {
page
totalRecords
records {
id
brandId
displayName
status
workflowStatus
ownershipType
}
}
}
10DLC lists use page-number pagination (page, pageSize, totalRecords) rather than the cursor style used elsewhere; see Pagination. tenDlcBrand(id) returns one brand with its full address and contact fields. deleteTenDlcBrand(id) removes a brand from TNID.
What to read next
- 10DLC Campaigns: describe the messaging use case and attach numbers.
- Webhooks: get notified instead of polling.
- API Reference: all 23 10DLC operations.