Skip to main content
A campaign describes one messaging program: who receives the messages, how they opted in, what the messages say and which numbers send them. Campaigns belong to a brand. The US 10DLC registry and the carriers review each campaign before the numbers attached to it can carry A2P traffic.
Building with code? The full request and response for every call here are in the campaign endpoints of the Messaging API.
In the console, campaigns live under SMS & RCS → Registration → Campaigns. This page covers the same flow through the API.
The brand must be registered first. Campaigns submitted under a brand whose registrationStatus is not ACTIVE are rejected with a reason that asks you to fix the brand.

Campaign fields

Send these on POST /10dlc/campaigns and PUT /10dlc/campaigns/{id}.

Registry values

The US 10DLC registry accepts these useCases. Vobiz passes them through as you send them. TWO_FACTOR_AUTH, ALERTS, FRAUD_ALERTS, CHAT, PROMOTIONAL_MARKETING, EDUCATION, DONATION, PUBLIC_SERVICE_ANNOUNCEMENT, VOTING_POLLING, POLITICAL, M2M, SWEEPSTAKE campaignType on this endpoint is TEN_DIGIT_LONG_CODE.

Supporting documents

Upload files before you reference them from a campaign.
  • POST /10dlc/documents is multipart/form-data with the file in the field named document. Files up to 10 MB are accepted; larger files return 413 {"error": "document exceeds 10MB"}. The response is 201 with id, documentId, documentName, contentType, contentLength and createdAt.
  • Put the id values in supportingDocuments or mmsSampleFiles. Referencing a document that is not on your account returns 400 {"error": "invalid request: supportingDocuments/mmsSampleFiles reference unknown documents; upload them via POST /v1/10dlc/documents first"}.
  • GET /10dlc/documents/{documentId} streams the file back. The path takes the documentId value, not id.
cURL

Register a campaign

1

Create the campaign

POST /10dlc/campaigns stores a draft on your account. Nothing is submitted yet.
The response is 201 with the campaign object.
2

Submit it for review

POST /10dlc/campaigns/{id}/register submits the campaign. The body is optional: {"priorityId": "<uuid>"} selects one of the registration priority options listed by GET /10dlc/campaigns/priorities. A non-UUID value returns 400 {"error": "invalid request: priorityId must be a UUID"}. The response is 200 with the refreshed campaign.
3

Poll the network statuses

GET /10dlc/campaigns/{id}/network-statuses returns one entry per US carrier network with network (for example T_MOBILE, ATT, VERIZON), state (ACTIVE once approved), and, where the network assigns them, messageClass, throughput and brandTier. GET /10dlc/campaigns/{id} refreshes stage and rejectionReasons from the registry before returning. Subscribe to 10dlc.campaign.updated on the WebSocket to be told when the stage changes.
4

Add numbers

Once stage is REGISTERED, attach the numbers that will send under this campaign with POST /10dlc/campaigns/{id}/numbers:
Pass at least one of numbers (digits, country code first, no +) or numberKeys (the numberKey from GET /numbers/available). Sending neither returns 400 {"error": "invalid request: numbers or numberKeys is required"}. The response is 200 {"status": "ok"}. GET /10dlc/campaigns/{id}/numbers lists what is attached according to the registry.
5

Send

GET /numbers now shows the number with registration.status: approved. Send with POST /messages using that number as from.

Manage a campaign

Deregistering or deleting a registered campaign stops A2P delivery from every number attached to it. Do this only with your own credentials and when you intend to stop sending.

The campaign object

Stage values

stage is a string set by the registry. Treat it as an open list; these are the values you will see most often: When a campaign is rejected, rejectionReasons carries the registry’s feedback: a rejectionDate, a rejectionReasons array of plain-text reasons, and rejectionDetails entries with errorCode, description, rejectionCategory and, when present, recommendedAction.

What to expect

  • Review involves the registry and each carrier separately, so network-statuses can show some carriers approved while others are still pending. The campaign stage reflects the overall outcome.
  • Review time varies with the use case, the brand’s vetting tier and the reviewers’ queue. Register before you need to send.
  • A campaign under a brand that is not ACTIVE is rejected with a reason pointing at the brand. Fix the brand and register the campaign again.
  • Errors from the registry return 422 with providerError, an opaque diagnostic string you can quote to support. See the error reference.

Next steps

Toll-free verification

The equivalent flow for 8XX numbers.

Campaign endpoints

Full request and response schemas.

Build it with the Messaging API

Campaign endpoints

Create, register and attach numbers by API.

WebSocket events

Get 10dlc.campaign.updated as review progresses.

Sending SMS

Send from your registered numbers.

Messaging webhooks

Track delivery once traffic flows.