sms-10dlc-registration — Claude Code skill: US A2P 10DLC setup
Prepares and validates a Sent US A2P 10DLC brand and campaign registration: consent evidence, use cases, sample messages.
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a claude-codeWhat sms-10dlc-registration does
This skill walks you through US A2P SMS registration on 10-digit long codes in Sent. It keeps two things apart on purpose: the compliance evidence packet and the exact API request. They use different schemas and different validators.
Two scripts do the checking. python scripts/validate_10dlc_packet.py evidence.json validates the evidence packet, which uses snake_case fields and the internal version sent-10dlc-evidence/v1. python scripts/validate_campaign_payload.py campaign.json validates the campaign request, written in camelCase with a campaign wrapper. Reference files cover use-case classification and rejection remediation.
There is no standalone brand path in the current v3 API. You create the brand inside POST /v3/profiles with the brand field and inherit_tcr_brand: false. Inherited campaigns are read-only, and a profile cannot supply brand while brand inheritance is on. Before preparing evidence here, the skill points you to sent-compliance for current field requirements and the exact SMS setup call. Never put real consumer data in fixtures or samples.
What it helps with
- build a consent evidence packet for 10DLC registration
- validate a campaign request before sending it to Sent
- decide between brand inheritance and a dedicated campaign
- work out why TCR rejected a campaign and fix it
- pick the right use case and sample messages for your traffic
Example prompts for the agent
- Help me prepare the 10DLC registration for our brand in Sent
- Validate my evidence packet:
python scripts/validate_10dlc_packet.py evidence.json - Build the campaign request for ACCOUNT_NOTIFICATION and run it in sandbox
How to install sms-10dlc-registration
1Skills CLI (Vercel)
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a claude-code2Manually: put the files in place
~/.claude/skills/sms-10dlc-registration/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/sms-10dlc-registration/
1Skills CLI (Vercel)
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a codex2Manually: put the files in place
.agents/skills/sms-10dlc-registration/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a cursor2Manually: put the files in place
.cursor/skills/sms-10dlc-registration/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install sentdm/sent-plugin sms-10dlc-registration2Manually: put the files in place
.github/skills/sms-10dlc-registration/SKILL.md1Skills CLI (Vercel)
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a gemini-cli2Platform CLI
gemini skills install https://github.com/sentdm/sent-plugin --path skills/sms-10dlc-registrationManually: put the files in place
.devin/skills/sms-10dlc-registration/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about sms-10dlc-registration
How do I install sms-10dlc-registration in Claude?
Run npx skills add sentdm/sent-plugin --skill sms-10dlc-registration -a claude-code. The skill file then sits at ~/.claude/skills/sms-10dlc-registration/SKILL.md.
What does sms-10dlc-registration do?
It helps you prepare and validate a Sent US A2P 10DLC brand and campaign registration. It validates the evidence packet and the campaign request separately, suggests use cases, and walks through rejections.
Can I register a brand with its own request?
No. In the current v3 API the brand is created inside POST /v3/profiles through the brand field with inherit_tcr_brand: false. Campaigns live under /v3/profiles/{profileId}/campaigns.
Source text
SKILL.md · MIT
---
name: sms-10dlc-registration
description: Prepares and validates Sent US A2P 10DLC brand and campaign registration through Sender Profiles, including inheritance, all campaign use cases, opt-in evidence, sample-message policy, autoresponses, sandbox validation, TCR status, and rejection remediation.
---
# SMS 10DLC Registration
Use this skill for US A2P SMS over 10-digit long codes. Separate the compliance evidence packet from the exact Sent API request; they have different schemas and validators.
For current field and document requirements or an exact SMS setup call, use `sent-compliance` before preparing the registration evidence here. Its plan creates a new Sender Profile and does not manage campaigns on an existing profile.
## Current Sent resource model
There is no standalone brand CRUD path in the current v3 API.
- Create a dedicated brand inside `POST /v3/profiles` using `brand` and `inherit_tcr_brand: false`.
- List/create campaigns with `GET|POST /v3/profiles/{profileId}/campaigns`.
- Update/delete with `PUT|DELETE /v3/profiles/{profileId}/campaigns/{campaignId}`.
Reject guidance that reintroduces a free-standing brand path.
## Choose inheritance deliberately
| Brand | Campaign | Settings |
| --- | --- | --- |
| Inherit both | Organization brand and campaign | `inherit_tcr_brand: true`, `inherit_tcr_campaign: true` |
| Inherit brand, own campaign | Shared legal brand with tenant-specific traffic | brand true, campaign false |
| Own both | Dedicated tenant/business | both false and supply `brand` during profile creation |
Inherited campaigns are read-only. A profile cannot supply `brand` while brand inheritance is true.
## Two validation layers
### Evidence readiness packet
The private packet uses the explicit internal version `sent-10dlc-evidence/v1` and snake_case evidence fields. It is not an API payload.
```bash
python scripts/validate_10dlc_packet.py evidence.json
```
Collect legal identity, public website/policy links, consent proof, message flow, opt-in/opt-out/help responses and keywords, use cases, and realistic samples. See [references/10dlc-evidence-checklist.md](references/10dlc-evidence-checklist.md).
### Sent campaign request
The API request uses exact camelCase and a `campaign` wrapper:
<!-- sent-campaign-request -->
```json
{
"campaign": {
"name": "Acme account notifications",
"description": "Account and delivery notifications for opted-in customers.",
"type": "App",
"useCases": [
{
"messagingUseCaseUs": "ACCOUNT_NOTIFICATION",
"sampleMessages": [
"Acme Example: Your account preference was updated. Reply STOP to opt out."
]
}
],
"volume": "2000",
"messageFlow": "Customers opt in in account settings before notifications begin.",
"privacyPolicyLink": "https://example.com/privacy",
"termsAndConditionsLink": "https://example.com/terms",
"optinMessage": "Acme Example: You are subscribed. Reply STOP to opt out.",
"optoutMessage": "Acme Example: You are unsubscribed and will receive no more messages.",
"helpMessage": "Acme Example: Visit https://example.com/support for help.",
"optinKeywords": "START,YES",
"optoutKeywords": "STOP,UNSUBSCRIBE",
"helpKeywords": "HELP,INFO"
},
"sandbox": true
}
```
Validate it with:
```bash
python scripts/validate_campaign_payload.py campaign.json
```
## API use cases
Support all 13 current values:
`MARKETING`, `ACCOUNT_NOTIFICATION`, `CUSTOMER_CARE`, `FRAUD_ALERT`, `TWO_FA`, `DELIVERY_NOTIFICATION`, `SECURITY_ALERT`, `M2M`, `MIXED`, `HIGHER_EDUCATION`, `POLLING_VOTING`, `PUBLIC_SERVICE_ANNOUNCEMENT`, and `LOW_VOLUME`.
Each use case structurally accepts 1–5 samples, each no longer than 1,024 characters. The compliance layer requires at least two samples for marketing and mixed traffic, including low-volume mixed. Keep that policy distinction visible instead of pretending OpenAPI requires two for all traffic.
## Volume and status
`volume` is optional and, when supplied, is a numeric string. Values below `"2000"` use the documented low-volume tier; `"2000"` is the boundary to the next tier.
Campaign responses currently expose statuses `SENT_CREATED`, `ACTIVE`, and `EXPIRED`, plus `submittedToTCR`. Preserve unknown future status strings. Do not confuse a successful Sent record creation with TCR submission or carrier activation.
## Safe workflow
1. Confirm this is US A2P 10DLC traffic and the actual sending business is identified.
2. Select brand/campaign inheritance.
3. Validate the versioned evidence packet.
4. Create or confirm the profile brand.
5. Translate evidence into the exact camelCase campaign request.
6. Validate locally and use `sandbox: true`.
7. Show the payload and obtain confirmation before a real create/update/delete.
8. Store profile ID, campaign ID, `submittedToTCR`, raw status, and review evidence.
9. Complete the profile with required `webHookUrl` only after prerequisites are ready.
Never use real consumer data in fixtures or samples. Use [references/tcr-use-cases.md](references/tcr-use-cases.md) for classification and [references/10dlc-rejection-remediation.md](references/10dlc-rejection-remediation.md) for failures.
© sentdm · MIT · sentdm/sent-plugin