Skip to main content
This guide shows you how to complete 10DLC (10-Digit Long Code) registration using the Telnyx CLI, from brand creation through campaign approval.

Why 10DLC?

US carriers require 10DLC registration for Application-to-Person (A2P) messaging from local phone numbers. Without it, your messages may be blocked or throttled. Registration establishes your business identity with carriers and unlocks higher throughput based on your trust score.
For a deeper explanation of 10DLC, trust scores, and carrier requirements, see Understanding 10DLC.

Prerequisites

  • Telnyx account with verified status
  • Telnyx CLI installed
  • TELNYX_API_KEY environment variable set
  • Business information ready (EIN, address, website)
  • At least one US phone number

Registration Steps

Step 1: Create a Brand

A brand represents your business identity for 10DLC registration.

Standard Business

telnyx messaging-10dlc:brand create \
  --entity-type PRIVATE_PROFIT \
  --display-name "Acme Corp" \
  --company-name "Acme Corporation Inc" \
  --ein 12-3456789 \
  --phone +15551234567 \
  --street "123 Main Street" \
  --city "San Francisco" \
  --state CA \
  --postal-code 94102 \
  --country US \
  --vertical TECHNOLOGY \
  --website https://acme.com

Sole Proprietor

For sole proprietors, additional SMS OTP verification is required:
# Create sole proprietor brand
telnyx messaging-10dlc:brand create \
  --entity-type SOLE_PROPRIETOR \
  --display-name "John's Plumbing" \
  --phone +15551234567 \
  --email john@example.com

# Trigger SMS OTP
telnyx messaging-10dlc:brand trigger-sms-otp --brand-id <brand-id>

# Verify with OTP code received via SMS
telnyx messaging-10dlc:brand verify-sms-otp --brand-id <brand-id> --otp 123456
Entity Types:
  • PRIVATE_PROFIT - Private company
  • PUBLIC_PROFIT - Publicly traded company
  • NON_PROFIT - Non-profit organization
  • GOVERNMENT - Government entity
  • SOLE_PROPRIETOR - Individual / sole proprietor

Step 2: Check Brand Status

# List all brands
telnyx messaging-10dlc:brand list

# Get specific brand details
telnyx messaging-10dlc:brand retrieve --brand-id <brand-id>

# Get feedback if brand was rejected
telnyx messaging-10dlc:brand get-feedback --brand-id <brand-id>

Step 3: Create a Campaign

Once your brand is approved, create a campaign to define your messaging use case:
# First, list available use cases
telnyx messaging-10dlc:campaign:usecase list

# Create the campaign (via Portal or API - see note below)
Campaign creation is done via the Telnyx Portal or the API. The CLI supports retrieving and managing existing campaigns.

Step 4: Manage Campaigns

# List campaigns for a brand
telnyx messaging-10dlc:campaign list --brand-id <brand-id>

# Get campaign details
telnyx messaging-10dlc:campaign retrieve --campaign-id <campaign-id>

# Check MNO (Mobile Network Operator) status
telnyx messaging-10dlc:campaign get-mno-metadata --campaign-id <campaign-id>

# Check operation status at carrier level
telnyx messaging-10dlc:campaign get-operation-status --campaign-id <campaign-id>

Step 5: Phone Number Assignment

Check phone number campaign assignments:
# List phone number campaign assignments
telnyx messaging-10dlc:phone-number-campaigns list

# Get assignment for specific number
telnyx messaging-10dlc:phone-number-campaigns retrieve --phone-number +15551234567

Step 6: Verify Setup

# Check brand status
telnyx messaging-10dlc:brand list --format json | jq '.data[] | {id, display_name, status}'

# Check campaign status
telnyx messaging-10dlc:campaign list --brand-id <brand-id> --format json | jq '.data[] | {id, usecase, status}'

# Verify number is assigned
telnyx messaging-10dlc:phone-number-campaigns retrieve --phone-number +15551234567

Campaign Approval

After submission, campaigns go through carrier approval:
StatusMeaning
PENDINGAwaiting review
APPROVEDReady to send messages
REJECTEDReview feedback and resubmit
Campaign approval can take 1-7 business days. Do not send A2P messages until approved.

Appeal Rejected Campaigns

If your campaign was rejected, you can submit an appeal:
telnyx messaging-10dlc:campaign submit-appeal --campaign-id <campaign-id>

Deactivate a Campaign

telnyx messaging-10dlc:campaign deactivate --campaign-id <campaign-id>
Once deactivated, a campaign cannot be restored.

Best Practices

Sample Messages

Your sample messages should:
  • Represent actual messages you’ll send
  • Include opt-out language (“Reply STOP to unsubscribe”)
  • Match your stated use case
  • Not contain placeholder text

Throughput

10DLC throughput depends on your trust score:
Trust ScoreMessages/Second
Low0.2
Medium1
High10+
Higher trust scores come from:
  • Verified business information
  • Good messaging practices
  • Low spam/complaint rates

Troubleshooting

”Brand verification failed”

  • Double-check EIN matches IRS records exactly
  • Verify business address is current
  • Ensure phone number is associated with business
Check feedback:
telnyx messaging-10dlc:brand get-feedback --brand-id <brand-id>

“Campaign rejected”

Common reasons:
  • Sample messages don’t match use case
  • Missing opt-out language
  • Vague or generic description
Solution: Review feedback, update campaign via Portal, and resubmit.

Revet a Brand

If your brand information has changed or was rejected, you can revet (resubmit):
telnyx messaging-10dlc:brand revet --brand-id <brand-id>
Revetting is allowed once after successful registration, then limited to once every 3 months.

Complete Script Example

#!/bin/bash
# 10dlc-check.sh - Check 10DLC registration status

set -e

echo "=== Brands ==="
telnyx messaging-10dlc:brand list --format json | \
  jq -r '.data[] | "\(.display_name): \(.status)"'

echo ""
echo "=== Campaigns ==="
# Get first brand ID
BRAND_ID=$(telnyx messaging-10dlc:brand list --format json | jq -r '.data[0].id')

if [ "$BRAND_ID" != "null" ]; then
  telnyx messaging-10dlc:campaign list --brand-id "$BRAND_ID" --format json | \
    jq -r '.data[] | "\(.usecase): \(.status)"'
else
  echo "No brands found"
fi

echo ""
echo "=== Phone Number Assignments ==="
telnyx messaging-10dlc:phone-number-campaigns list --format json | \
  jq -r '.data[] | "\(.phone_number): \(.campaign_id)"' | head -10

Next Steps