---
title: "Start a carrier registration"
method: POST
path: "/v1/sms/registrations"
tags: ["SMS"]
---

# Start a carrier registration

`POST /v1/sms/registrations`

Starts the US carrier registration that a number needs before SMS
delivers: 10DLC (standard company or sole-proprietor) or toll-free
verification. 10DLC needs `brand` + `campaign`; toll-free needs
`tollFree`. Approval is asynchronous; poll
`GET /v1/sms/registrations/{id}` (sole-prop registrations first need
the OTP step: a code is texted to the brand's mobile number, submit it
via `/verify-otp`).

Already have an approved registration? Add another number to it with
`POST /v1/phone-numbers/{id}/sms/reuse-registration` instead
of registering (and paying the carrier brand fee) again.

Rather have your client fill in the legal business details? Create a
share link with `POST /v1/sms/registrations/share`.

## Request body

- object
  - `registrationType` 'standard_10dlc' | 'sole_prop_10dlc' | 'toll_free', required
  - `phoneNumbers` string[] — Your numbers this registration covers. When omitted or empty on a 10DLC registration, defaults to your active SMS-enabled US local numbers not already covered by another registration.
  - `brand` object — Required for 10DLC. The legal entity behind the traffic (TCR brand).
    - `entityType` 'PRIVATE_PROFIT' | 'PUBLIC_PROFIT' | 'NON_PROFIT' | 'GOVERNMENT' | 'SOLE_PROPRIETOR', required
    - `displayName` string, required
    - `companyName` string — Legal company name. Required for every entityType except SOLE_PROPRIETOR.
    - `ein` string — Required for every entityType except SOLE_PROPRIETOR.
    - `phone` string — Business contact phone. Required for every entityType except SOLE_PROPRIETOR.
    - `mobilePhone` string — Required for SOLE_PROPRIETOR; the verification OTP is texted there (US/CA mobile).
    - `street` string, required
    - `city` string, required
    - `state` string, required
    - `postalCode` string, required
    - `country` string, required — ISO 3166-1 alpha-2 country where the company is registered. Companies worldwide can register standard 10DLC (non-US companies use their local tax ID in `ein`; carrier vetting may take longer). SOLE_PROPRIETOR is US/CA only.
    - `email` string, email — Brand contact email; defaults to your account email when omitted.
    - `website` string, required — The brand's website (sole proprietors may use a social profile such as LinkedIn or a business Facebook page). Carriers verify the brand against it; a bare domain is normalized to https://.
    - `vertical` 'AGRICULTURE' | 'COMMUNICATION' | 'CONSTRUCTION' | 'EDUCATION' | 'ENERGY' | 'ENTERTAINMENT' | 'FINANCIAL' | 'GAMBLING' | 'GOVERNMENT' | 'HEALTHCARE' | 'HOSPITALITY' | 'HUMAN_RESOURCES' | 'INSURANCE' | 'LEGAL' | 'MANUFACTURING' | 'NGO' | 'POLITICAL' | 'POSTAL' | 'PROFESSIONAL' | 'REAL_ESTATE' | 'RETAIL' | 'TECHNOLOGY' | 'TRANSPORTATION', required
    - `stockSymbol` string
  - `campaign` object — Required for 10DLC. What you'll send and how recipients opt in/out. The opt-in/opt-out/help auto-responses (`optinMessage`, `optoutMessage`, `helpMessage`) are optional: when omitted, a compliant, brand-named template with the carrier-required disclosures is generated for you. If you do send them, they must name the registered brand and carry the disclosures. Submissions that don't are rewritten to the compliant template before the campaign is filed.
    - `usecase` string, required
    - `subUsecases` string[] — The concrete kinds of messages a MIXED campaign sends (the carrier registry requires 2-5, and reviewers match them against the sample messages). Omitted: a default pair is applied for MIXED.
    - `description` string, required
    - `messageFlow` string, required — How a recipient ends up receiving your messages (the opt-in flow). Include a link to the page or form where they opt in, because carrier reviewers reject campaigns whose consent they can't verify.
    - `sample1` string, required
    - `sample2` string, required — Second example message; carriers require two distinct samples, so it must differ from sample1.
    - `helpMessage` string
    - `optinKeywords` string, required
    - `optinMessage` string
    - `optoutKeywords` string, required
    - `optoutMessage` string
    - `helpKeywords` string, required
    - `embeddedLink` boolean — Whether messages carry links. Auto-derived from the samples when omitted, so the declaration matches what the reviewer reads.
    - `embeddedPhone` boolean — Whether messages carry phone numbers. Auto-derived from the samples when omitted.
    - `numberPool` boolean
    - `ageGated` boolean
    - `directLending` boolean
    - `privacyPolicyLink` string — Link to your privacy policy. Recommended: reviewers check that it says mobile information is not sold or shared with third parties for promotional purposes. A bare domain is normalized to https://.
    - `termsAndConditionsLink` string — Link to your terms & conditions. A bare domain is normalized to https://.
  - `messagingBrandName` string — DBA / trade name used to brand message content (samples and auto-replies) when it differs from the legal name, e.g. a sole proprietor texting under a business name. The legal `brand.displayName` is still what the carrier vets.
  - `wizardValues` object — Raw dashboard-wizard answers, stored only to prefill edit-and-resubmit. API integrators can omit.
  - `resubmitRequestId` string — Resubmit a registration that was returned for changes. Updates it in place instead of creating a new one.
  - `tollFree` object — Required for toll_free.
    - `businessName` string, required
    - `corporateWebsite` string, uri, required
    - `phoneNumbers` string[], required
    - `useCase` string, required
    - `useCaseSummary` string, required
    - `productionMessageContent` string, required
    - `optInWorkflow` string, required — How recipients opt in to your messages.
    - `optInWorkflowImageUrls` string[], required — Screenshot URL(s) showing the opt-in flow (at least one).
    - `messageVolume` '10' | '100' | '1,000' | '10,000' | '100,000' | '250,000' | '500,000' | '750,000' | '1,000,000' | '5,000,000' | '10,000,000+', required — Expected monthly message volume tier.
    - `additionalInformation` string, required
    - `businessAddr1` string, required
    - `businessAddr2` string
    - `businessCity` string, required
    - `businessState` string, required
    - `businessZip` string, required
    - `businessContactFirstName` string, required
    - `businessContactLastName` string, required
    - `businessContactEmail` string, email, required
    - `businessContactPhone` string, required
    - `businessRegistrationNumber` string, required
    - `businessRegistrationType` string, required — e.g. EIN (US), Companies House (UK), ABN (AU).
    - `businessRegistrationCountry` string, required — ISO 3166-1 alpha-2.

## Response `200`

Registration submitted.

- object
  - `registrationId` string
  - `status` 'pending'
  - `awaitingOtp` boolean — True for sole-prop 10DLC: an OTP was texted to the brand's mobile; submit it via /verify-otp.

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `409` — The brand already exists at the carrier and failed identity verification (a rejected registration of yours with the same EIN or legal name); the fix is applied to that brand on reply, a new registration would file and bill a second one.
- `422` — Carrier registry rejected a field; `param` names it when known.

## Changes

- **2026-09-17** `be448f13ecdc` — 1 info
  - added the non-success response with the status `409`
- **2026-09-16** `3e6ddf2a99ea` — 1 info
  - added the optional property `details/budgetScope` to the response with the `400` status
- **2026-09-15** `0dba7d004d75` — 2 info
  - added the optional property `details/quotaExhausted` to the response with the `400` status
  - added the optional property `details/quotaScope` to the response with the `400` status

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/sms/registrations/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/eded32b62823?raw)
