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:draft → submitted → carrier_vetting → provisioned (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
leaseType—dedicated(your brand only) orshared(lower cost, sender identity pooled).selection—random(aggregator assigns) orvanity. Avanityselection requiresrequestedCode, a 3–6 digit string.leaseTermMonths— one of3,6, or12.programBrief.sampleMessages— 1–5 messages, each up to 1600 characters. Provide 2–5; a single sample measurably lowers the first-pass approval rate.programBrief.descriptionandprogramBrief.optInDescriptionmust each be at least 10 characters; carriers reject briefs too short to vet (target 150–300 characters for the description).
201 Created):
draft, revise the brief any time:
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:Worked example: a failing brief
The ad-hoc call above returns ablock verdict — the brief would be rejected at vetting:
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.
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.
Submit
With a passing brief, submit the application:submitted and the brief locks.
Carrier vetting: the multi-week wait
After submission the application enterscarrier_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 currentstatusplus a per-carrier vetting snapshot (each carrierpending,approved, orrejected).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.
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 thefrom 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 theshort_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:- 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.
- 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.
- 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.