Qualify a brand before registering its campaign
A 10DLC campaign describes the messages a registered business intends to send, how recipients consent, and how they can get help or stop messages. This API creates the registry record; completing production carrier activation is a separate account setup step. Use an owned brand from brand registration, then load its available use cases and the selected use case’s current requirements.
Use the current qualification result to choose sub-use cases, eligible network IDs, message samples and opt-in/out/help declarations. Requirements can differ by brand and network. Do not submit the example’s identifiers or copy its consent description for a business with a different process.
Keep sandbox and production separate
For a sandbox exercise, use your own mock brand and a current use case that it qualifies for. Use TRIAL only when it is offered by that qualification. The portal checks that the selected brand and campaign environment agree. A direct API request does not run the portal’s complete wizard validation for you, so preserve that separation in your integration.
Production campaign creation is billable and does not automatically make a number ready to send. Keep the campaign environment consistent with its brand, and review the fee and applicable terms before creating a live campaign.
Submit the campaign JSON
Prepare campaign.json with your qualified values. R000000 means no reseller; use it only when that is the intended configuration. For the normal MultiTEL reseller configuration, obtain the allowed MultiTEL LLC reseller identifier from your account’s reseller collection or the portal preparation flow rather than hardcoding somebody else’s identifier.
curl --silent --show-error --user "$API_USER:$API_PASSWORD" \
'https://api.multitel.net/tcr/v2/reseller?companyName=MultiTEL%20LLC&recordsPerPage=500'The following JSON illustrates a trial campaign for an owned mock brand. Replace the brand, use case, reseller and consent text with the values that actually qualify for your test.
{
"brandId": "B123ABC",
"channelId": "10DLC",
"usecase": "TRIAL",
"subUsecases": [],
"resellerId": "R000000",
"description": "Trial account notices requested by users of the example application.",
"messageFlow": "Test users explicitly select an unchecked consent box before requesting these trial notices.",
"sample1": "Example application: your requested account notice is available. Reply STOP to stop notices.",
"subscriberOptin": true,
"optinKeywords": "START",
"optinMessage": "You are subscribed to the example application's requested account notices.",
"subscriberOptout": true,
"optoutKeywords": "STOP",
"optoutMessage": "You will no longer receive the example application's account notices.",
"subscriberHelp": true,
"helpKeywords": "HELP",
"helpMessage": "For help with example account notices, contact support@example.invalid.",
"embeddedLink": false,
"embeddedPhone": false,
"numberPool": false,
"ageGated": false,
"directLending": false,
"termsAndConditions": true,
"autoRenewal": false,
"mnoIds": [],
"referenceId": "your-trial-reference"
}Set termsAndConditions to true only after the authorized person has reviewed and accepted the applicable terms. The example is not consent on your behalf. Use JSON booleans for the flags, not quoted strings.
curl --silent --show-error --user "$API_USER:$API_PASSWORD" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--data-binary @campaign.json \
'https://api.multitel.net/tcr/v2/campaignBuilder'Campaign fields and conditional requirements
| Fields | What to provide |
|---|---|
| brandId, channelId, usecase | Your owned brand, channel 10DLC, and an eligible current use-case code. Use codes from qualification, not translated labels. |
| subUsecases | An array of eligible sub-use-case codes. Respect the selected qualification’s minimum and maximum count. |
| resellerId | An allowed reseller identifier. The account-owned route accepts owned resellers, its configured shared reseller, or the intentional no-reseller value. An unrelated reseller is rejected. |
| description, messageFlow | Describe the actual purpose and how consent is collected. Each should contain 40–4096 characters. Include the real user action, form or process; do not invent consent that your application does not collect. |
| sample1 … sample5 | Representative messages, normally 20–1024 characters each. The portal requires at least one; eligible networks can require more. Supply the number required by the current qualification. |
| subscriberOptin, subscriberOptout, subscriberHelp | Declare supported recipient flows using these exact field names. When a flow is enabled, supply its keyword and message fields. Network requirements can make particular flows mandatory. |
| optinKeywords, optoutKeywords, helpKeywords | The actual recognized keywords, up to 255 characters. They must match the receiving application’s behavior. |
| optinMessage, optoutMessage, helpMessage | The corresponding messages. The current published field rules specify 20–1024 characters. Include real support and opt-out behavior. |
| embeddedLink, embeddedPhone, embeddedLinkSample | Declare embedded links or phone numbers truthfully. An otherwise qualified network can disallow them. A link sample allows up to 255 characters. |
| mnoIds | An optional array of eligible numeric network IDs from qualification. Do not assume every network supports the selected use case. |
| numberPool, ageGated, directLending | Applicable campaign characteristics as JSON booleans. Choose them according to the actual service. |
| privacyPolicyLink, termsAndConditionsLink | Your relevant public policy and terms URLs when applicable, up to 2048 characters each. They must describe the actual messaging service. |
| termsAndConditions | Explicit acceptance of the applicable campaign terms. The portal requires true and its wizard also collects the current individual confirmations. |
| autoRenewal | Whether the campaign renews. The default is true. Disabling renewal does not remove a minimum commitment already associated with a production campaign. |
| referenceId, tag | Your campaign reference, up to 50 characters, and optional tags. referenceId is not the Idempotency-Key header. |
The published schema contains some inconsistent capitalization in descriptive tables. The current portal request uses subscriberOptin and subscriberOptout as shown above. Keep that exact casing. This guide covers the tenant-facing 10DLC workflow; do not infer that a different channel’s required fields or activation steps are the same.
Retry the same intended request safely
Use one Idempotency-Key for this intended creation. The key is 1–128 printable ASCII characters without spaces and is scoped to the owner account. Keep the HTTP method, path, query string and exact body bytes unchanged on a retry. A reformatted JSON file conflicts even if its values are equivalent.
An in-progress duplicate can return HTTP 409 with Retry-After; completed requests can replay their stored response. A cached error does not prove that the registry created nothing. Save campaignId, requestId and any correlation headers, inspect the existing campaign and reconcile a partial failure before considering a new key.
A campaign ID is not the final sending setup
The response uses HTTP status and direct JSON. On successful creation, keep campaignId and read its current state:
curl --silent --show-error --user "$API_USER:$API_PASSWORD" \
"https://api.multitel.net/tcr/v2/campaign/$CAMPAIGN_ID"The current portal’s production workflow also shares the campaign with the messaging carrier and loads the brand/campaign into the sending account. Those are separate operations from this public creation call. A registry campaign can exist even if a later sharing or carrier-loading step fails.
Use the portal’s integrated production creation workflow when you need the combined registration, sharing and carrier-loading sequence. For a production campaign already created directly by this API, retain its campaign ID and have the account’s carrier setup reconciled through support. The current customer UI does not expose a general resume button for every directly created production campaign. Do not create another registration to retry its activation. Confirm the campaign is active and the carrier setup has completed before assigning a sending number. The number must also be owned, active and SMS-enabled. Campaign creation does not send messages.
Production campaign fees
| Use case | Monthly fee |
|---|---|
| LOW_VOLUME, UCAAS_LOW | $1.67 |
| SOLE_PROPRIETOR | $2.23 |
| CHARITY | $3.34 |
| EMERGENCY | $5.56 |
| AGENTS_FRANCHISES | $33.34 |
| Other configured fallback use cases | $11.12 |
These retail amounts were checked against the current portal configuration on 24 October 2026. Confirm the current qualified use case and displayed price before a production submission. A monthlyFee in a registry qualification response is not automatically your MultiTEL retail price.
The current portal states a three-month minimum commitment for non-political production campaigns. Review the applicable terms and renewal choice before confirming. Registration, number rental, additional vetting and message usage are separate charges. A successful creation response does not independently prove that every billing or carrier-activation step has completed.
Handle validation and partial failures
Read HTTP status and the returned JSON. Validation failures can be arrays of code/description objects; local failures can instead be objects with message, status and, for some processing errors, requestId.
| HTTP result | Next action |
|---|---|
| 400 | Correct the specific fields or idempotency key. Re-read current qualification, required sample count and recipient-flow requirements. |
| 401, 403 or 404 | Check API credentials and allowed source IP, then brand/reseller ownership and permissions. Do not use identifiers from another account. |
| 402 | Review production funding and purchase permission before retrying the same intended creation. |
| 409 | Distinguish in-progress replay from a changed request using the same key. Keep the existing campaign and request details when reconciling. |
| 429 or limiter unavailable | Honor Retry-After when present and retain the original key and exact request. |
| 500 or 502 | Creation may already have occurred. Save any campaignId and requestId, check the existing campaign, and resume or reconcile its activation rather than creating a duplicate. |