Official Sinch API skills for AI coding agents — SMS, Voice, Verification, Numbers, Mailgun email, and more.
71
89%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Complete reference for the 6-step 10DLC registration workflow. See the main SKILL.md for overview and summary.
Gather from the user: company name, brand name, organization type (brandEntityType), EIN (taxIdCorporate), tax ID country, address (street, city, state, postal code, country), website (webAddress), company email, business contact email, contact person (first name, last name, phone, email), vertical, display name, and whether this is a public company (stock exchange/symbol).
The request body uses nested objects: companyDetails, financialDetails, and contactDetails. See the curl example in SKILL.md Getting Started for the full structure.
Required enums (inside financialDetails):
brandEntityType (default: PUBLIC): PUBLIC (publicly traded), PRIVATE (privately held), CHARITY_NON_PROFIT (registered nonprofit/charity)
brandVerticalType — pick the one that best matches the company's primary industry:
TECHNOLOGY, COMMUNICATIONFINANCIAL, INSURANCEHEALTHCARERETAIL, HOSPITALITYPROFESSIONALREAL_ESTATE, CONSTRUCTIONGOVERNMENT, POLITICAL, NGOEDUCATIONENERGY, AGRICULTURE, MANUFACTURINGTRANSPORTATION, POSTALHUMAN_RESOURCESENTERTAINMENT, GAMBLINGLEGALWhen unclear, ask the user. The vertical does not affect approval but must be accurate.
exchange: A free-form string field (not an enum). Use an empty string "" for private/nonprofit companies. For public companies, pass the exchange name (e.g., "NYSE", "NASDAQ", "AMEX", "TSX", "LSE").
See Register a Brand for request/response details.
Success: Response includes brandRegistrationId. Save it for all subsequent steps.
Registration is asynchronous — it takes minutes to days. There are no webhooks; you must poll.
curl -X GET \
"https://us10dlc.numbers.api.sinch.com/v1/projects/$SINCH_PROJECT_ID/brandRegistrations/$BRAND_REGISTRATION_ID" \
-H "Authorization: Bearer $SINCH_ACCESS_TOKEN"Example response:
{
"brandRegistrationId": "01JGR7TNKQ7Y3GHMAXAMPLEID",
"brandId": "BEXAMPLE",
"brandRegistrationStatus": "APPROVED",
"brandRegistrationType": "FULL",
"identityStatus": "VERIFIED",
"displayName": "Acme Corp 10DLC",
"companyDetails": {
"companyName": "Acme Corp",
"brandName": "Acme",
"country": "US",
"webAddress": "https://acme.com"
},
"financialDetails": {
"brandEntityType": "PRIVATE",
"brandVerticalType": "TECHNOLOGY",
"taxIdCorporate": "12-3456789"
},
"contactDetails": {
"firstName": "Jane",
"lastName": "Doe",
"phoneNumber": "+14155550100"
}
}See Check Brand Registration Status for full response details.
Decision tree:
APPROVED → proceed to Step 3IN_PROGRESS → poll again (see polling strategy below)DRAFT → brand was created via dashboard but not yet submitted; submit it to proceedUPGRADE → brand is being upgraded from SIMPLIFIED to FULL; poll again until it resolvesREJECTED → check brand feedback for rejection reason, then fix and re-registerCommon rejection categories: TAX_ID (EIN mismatch), STOCK_SYMBOL (stock info mismatch), GOVERNMENT_ENTITY, NONPROFIT.
Polling strategy:
SIMPLIFIED brands typically resolve in minutes to a few hours.FULL brands typically resolve in 1–5 business days; some verticals (GOVERNMENT, POLITICAL) may take longer.Before creating a campaign, verify requirements and estimated fees:
curl -X GET \
"https://us10dlc.numbers.api.sinch.com/v1/projects/$SINCH_PROJECT_ID/campaignRegistrations:qualify?brandId=$BRAND_ID&useCase=MARKETING" \
-H "Authorization: Bearer $SINCH_ACCESS_TOKEN"useCase is optional — omit it to get qualification data for all use cases at once (useful when the user hasn't decided yet).
Check the response for monthlyFee, setupFee, mnoMetadata (per-carrier restrictions and throughput), and minSubUseCases/maxSubUseCases (required sub-use-case count for MIXED campaigns). If any carrier shows the campaign as unsupported, reconsider the use case before proceeding.
See Qualify a Campaign for full response details.
Gather from the user: use case (useCase — one of the enums in Key Concepts), campaign name, description of who sends and receives, sample messages (realistic, matching use case), opt-in flow description (messageFlow), HELP/STOP/opt-in messages and keywords, and boolean flags. You also need the brandId from Step 2's response.
CRITICAL — campaigns are rejected for vague descriptions.
Bad: "We send texts to customers about their orders." Good: "Acme Corp sends order delivery notifications to customers who opted in during checkout at acme.com. Messages include tracking links and estimated delivery times."
Key points:
description and messageFlow each have a 40-character minimum — be specific and detailedsample1–sample3 are required (separate string fields, not an array); sample4 is optionalaffiliateMarketing has no default — must be explicitly set to true or falseoptinKeywords, optoutKeywords, helpKeywords) are comma-separated with no spacesFor the full field reference, constraints, and a complete curl example, see Campaign Registration Fields. For the raw API schema, see Create a Campaign (API reference).
Success: Response includes campaignRegistrationId (Sinch ULID format — not the TCR campaign ID, which is assigned after TCR approval).
Set attachments: true when creating the campaign (Step 4) to delay submission until documents are uploaded.
POST /v1/projects/{projectId}/uploadCampaignFiles:submitcampaignInternalId (the campaignRegistrationId from Step 4), submitCampaign (boolean)fileName, fileContent (base64-encoded), fileCategory (integer enum: 1=PRIVACY_POLICY, 2=TERMS_AND_CONDITIONS, 3=CALL_TO_ACTION, 4=OPT_IN, 5=MMS)submitCampaign: false for all but the last file, then submitCampaign: true on the final upload to submit the campaignSee Upload Supporting Documents for request/response details.
Same async pattern as brand: poll and wait. No webhooks.
See Check Campaign Status for request/response details.
Campaign status flow: SINCH_REVIEW → SINCH_APPROVED → SUBMITTED → APPROVED / ACTIVE (or SINCH_REJECTED / REJECTED / SUBMISSION_FAILED at various stages).
Polling strategy:
Once approved, you can send A2P SMS on US 10-digit long codes through Sinch. To send messages, see the sinch-conversation-api skill.
skills
sinch-10dlc
references
sinch-authentication
sinch-conversation-api
sinch-elastic-sip-trunking
references
sinch-fax-api
sinch-imported-numbers-hosting-orders
references
sinch-in-app-calling
sinch-mailgun
references
sinch-mailgun-inspect
references
sinch-mailgun-optimize
references
sinch-mailgun-validate
sinch-number-lookup-api
sinch-number-order-api
sinch-numbers-api
references
sinch-porting-api
sinch-provisioning-api
sinch-sdks
sinch-verification-api