---
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 — 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
- `422` — Carrier registry rejected a field; `param` names it when known.

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/51932b099b2f/schema)
