Skip to main content

Apply for an SMS short code

A short code is a 3–6 digit number (e.g. 25735) your subscribers can text and receive texts from. Short codes carry the highest SMS throughput of any sender type and are the most memorable sender you can put in a CTA. The trade-off: a longer, explicitly-vetted acquisition process than 10DLC or toll-free. This guide covers the full lifecycle on Orbit: opening the application, writing the program brief, linting it with the pre-flight checker, tracking carrier vetting, and sending once the lease is provisioned.

Short code vs 10DLC vs toll-free

Pick the sender type that matches the program: Choose a short code when throughput and sender memorability justify the lease cost and the vetting lead time. If a 10DLC campaign at your current vetting tier meets the volume, 10DLC is faster to live.

Application lifecycle

A short-code application moves through five statuses: draftsubmittedcarrier_vettingprovisioned (or rejected / cancelled)
  • draft — the application exists on Orbit but nothing has gone to a carrier. The program brief is still editable.
  • submitted — handed to the aggregator/CSCA path. The brief is locked from this point.
  • carrier_vetting — each carrier (AT&T, T-Mobile, Verizon, US Cellular) reviews the program independently. This runs for multiple weeks.
  • provisioned — approved and live; the lease window is open and the code can send.
  • rejected / cancelled — terminal states. A rejection carries the aggregator or carrier reason; fix the brief and open a new application.

Step 1: Open the application

Field rules:
  • leaseTypededicated (your brand only) or shared (lower cost, sender identity pooled).
  • selectionrandom (aggregator assigns) or vanity. A vanity selection requires requestedCode, a 3–6 digit string.
  • leaseTermMonths — one of 3, 6, or 12.
  • programBrief.sampleMessages — 1–5 messages, each up to 1600 characters. Provide 2–5; a single sample measurably lowers the first-pass approval rate.
  • programBrief.description and programBrief.optInDescription must each be at least 10 characters; carriers reject briefs too short to vet (target 150–300 characters for the description).
Response (201 Created):
While the application is a draft, revise the brief any time:
List every application on the tenant with GET /api/v1/numbers/short-codes, or fetch one with GET /api/v1/numbers/short-codes/:id. Cancel a draft or relinquish a lease with DELETE /api/v1/numbers/short-codes/:id.

Lint the program brief before you submit

Carriers reject roughly a third of first-round program briefs on deterministic grounds — SHAFT-C content, ambiguous CTAs, missing opt-out or HELP wording — and every rejection restarts the multi-week queue. Run the pre-flight linter before submitting so the deterministic failures surface in seconds, not weeks. Score a brief ad-hoc, before any application exists:
Or lint the brief already stored on a draft application:

Worked example: a failing brief

The ad-hoc call above returns a block verdict — the brief would be rejected at vetting:
Each finding names the field, quotes the offending fragment in match, and gives the rewrite that resolves it. Fix the brief:
  • Replace the shortener with a link on your own domain.
  • Add Reply STOP to opt out. to at least one sample.
  • Expand the description to explain who opts in and what the program sends.
  • Write out the opt-in moment — where the subscriber enters their number and agrees.
  • Name the destination instead of “click here”.
  • Put the brand name in a sample so recipients recognise the sender.
  • Declare the frequency.
Re-run the pre-flight. A clean brief returns:

What the linter checks

The pre-flight scores against the carrier rejection-pattern catalog drawn from the CTIA Short Code Monitoring Handbook: The score runs 0–100 (each error deducts 25, each warn 8, each info 2). The verdict is block when any error-severity finding is present, warn below a score of 75, otherwise pass.
A pass verdict means “no known rejection pattern matched” — it is not a carrier approval guarantee. The program still goes through the normal submission and per-carrier vetting.

Submit

With a passing brief, submit the application:
The status moves to submitted and the brief locks.

Carrier vetting: the multi-week wait

After submission the application enters carrier_vetting. Each carrier reviews the program independently — Verizon and AT&T are typically the long poles — and the end-to-end review runs multiple weeks. There is nothing to action during the wait unless a rejection comes back. Track progress two ways:
  • GET /api/v1/numbers/short-codes/:id — the current status plus a per-carrier vetting snapshot (each carrier pending, approved, or rejected).
  • GET /api/v1/numbers/short-codes/:id/timeline — a structured per-stage timeline (draft, submitted, carrier vetting, provisioned) with the reached stages, per-carrier progress, and the lease renew-by date once provisioned. This is the feed the dashboard detail panel renders.
If a carrier rejects the program, the application lands in rejected with the aggregator/carrier rejectionReason. Read the reason, open a new application, fix the brief against the pre-flight linter, and resubmit. Once the carriers approve, an operator records the vetting outcome and provisions the lease; the application moves to provisioned with the final assignedCode, a provisionedAt timestamp, and a leaseEndsAt renew-by date (provisioned date plus the lease term).

Sending on a short code

No extra configuration is needed after provisioning. Orbit’s sender resolution already recognises short codes as a sender type — pass the assigned code as the from on a send and it routes down the numeric path, same as a long code. See Sender resolution for how from values are validated and routed, and SMS for the send endpoints themselves. Inbound keywords still apply: Orbit processes STOP, CANCEL, and UNSUBSCRIBE replies automatically, so opt-out handling from your approved brief holds with no further setup.

Audit events

Every lifecycle transition writes to the tenant audit log against the short_code_application resource: Query them in the dashboard audit log or over the audit API — see the audit log guide.

How this differs from 10DLC

If you have run the 10DLC registration flow, the shape is familiar — both are “register the program, wait for review, then send” — with three practical differences:
  1. Per-carrier, multi-week vetting. 10DLC maps to a single registry decision plus per-carrier statuses; a short code goes through independent carrier reviews that take weeks, tracked per carrier.
  2. A lease, not a registration. Approval opens a time-boxed lease (3, 6, or 12 months) with a renew-by date; 10DLC registration has no lease window.
  3. Rejection restarts the queue. A rejected 10DLC campaign resubmits in days; a rejected short-code program returns to the back of a multi-week queue. The pre-flight linter exists to keep that loop from starting.