Numbers API
Search available phone numbers in 60+ countries, purchase instantly, configure routing for SMS and voice, and release numbers you no longer need. Base path:/api/v1/numbers
Search Available Numbers
GET /api/v1/numbers/available
Search the Orbit inventory for phone numbers matching your criteria.
string
default:"US"
ISO 3166-1 alpha-2 country code (e.g.,
US, GB, TR). Optional — defaults to US when omitted.string
Number type:
local, toll_free, mobilestring
Comma-separated capabilities filter:
sms, voice, mms, faxstring
Filter by area code (e.g.,
415 for San Francisco)string
Pattern match — search for numbers containing specific digits (e.g.,
555)integer
default:"100"
Number of results to return (max 500)
Pre-purchase discovery
A buyer integration calls these three read endpoints before Purchase a Number — check what’s in stock for a country, then check what documents a regulated country needs — so the buy flow never hits a surprise at order time. All three are read-only and scoped onnumbers:read.
Country Capabilities
GET /api/v1/numbers/country-capabilities
Per-(line type × capability) inventory summary for a single country, so you can see the stock reality (for example, GB has plenty of local-voice numbers but zero SMS-capable mobiles) before running a search. Counts are bucketed and clamped at 100 — a value of 100 means “plenty in stock”, not exactly one hundred — aggregated across carriers, and cached server-side for 5 minutes.
string
required
ISO 3166-1 alpha-2 country code to summarise (e.g.,
GB, US). A missing or invalid value returns 422.two_way_sms is the authoritative “can this country do two-way SMS” signal (send and receive) — it excludes send-only toll-free. local_sms is 0 in countries where landlines don’t carry SMS (UK, DE, FR, …). For the US, us_uses_10dlc is true and a local_sms_via_10dlc count is added, since A2P SMS there rides 10DLC-registered local numbers.Regulatory Preview
GET /api/v1/numbers/regulatory-preview
A live, single-country preview of what a purchase will require: the identity/address documents and data fields, the expected activation window for regulated countries, and — scoped to your organization — whether an existing compliance profile already satisfies the requirements. Use it to render an at-a-glance “documents needed” disclosure on a specific country and line type before the buy click.
string
required
ISO 3166-1 alpha-2 country code. A missing or invalid value returns
422.string
default:"local"
Line type the requirements vary by — one of
local, mobile, toll_free.string
Optional carrier to narrow the schema to — one of
telnyx, didww. When omitted, the requirement sets from every provider that could serve the country are unioned.compliance_profile_satisfies is always a boolean: false means “complete a compliance profile before buying”, and true (also returned whenever unregulated is true) means you can purchase right away. When the country/type activates instantly, activation_eta is null.Regulatory Requirements
GET /api/v1/numbers/regulatory-requirements
Enumerate the identity/address documents and data fields a purchase will require, so you can gather them up front instead of discovering them via a carrier-side bundle decline after the order. With ?country= it returns that single country’s record; without it, the catalog across every regulated country for the line type. This is a pure catalog read off the compliance registry — no carrier call.
string
Optional ISO 3166-1 alpha-2 country code. When omitted, returns the catalog across all regulated countries.
string
default:"local"
Line type the requirements vary by — one of
local, mobile, toll_free.Without
?country=, data is the catalog instead — { phone_number_type, count, requirements: [ … ] }, one record per regulated country. Countries that need nothing come back with regulated: false.Purchase a Number
POST /api/v1/numbers/purchase
Purchase an available number and add it to your account. The number is billed monthly starting immediately.
string
required
The phone number to purchase in E.164 format (from the search results)
string
default:"US"
ISO 3166-1 alpha-2 country code for the number (2 letters)
string[]
Capabilities to provision on the number — any of
sms, voice, whatsapp, rcsstring
ID of an approved compliance profile to attach before the carrier order. For regulated countries, attaching a profile that covers the target country lets the number activate immediately instead of entering a regulatory hold.
string
Provider-issued inventory row id returned by
GET /api/v1/numbers/available. Forward it for placeholder (carrier-allocated) numbers; omit it to purchase by phone_number alone.Purchase only acquires the number. Set its label and inbound webhook routing afterward with the Configure a Number endpoint.
List Your Numbers
GET /api/v1/numbers
Retrieve all phone numbers on your account with cursor-based pagination.
string
Cursor for pagination (returned in previous response)
integer
default:"25"
Number of results per page (max 200)
string
default:"active"
Filter by lifecycle status. Pass a single value, a comma-separated subset, or
all to return every status. Recognised values: active,
pending_compliance, inactive, released, parked, suspended. When
omitted, only active numbers are returned.string
Case-insensitive partial match against the phone number or its label.
string
Comma-separated tag labels (e.g.
sales,vip). Returns numbers carrying at
least one of the supplied tags.Get Number Details
GET /api/v1/numbers/{id}
Retrieve the full configuration and status of a specific number.
string
required
Number ID (e.g.,
num_abc123)Get Number Health Score
GET /api/v1/numbers/{id}/health
Read the per-DID deliverability health score for one of your numbers. The score is produced by a daily background tick over a rolling window of message outcomes — the route returns the most recent persisted snapshot and never re-computes inline. Returns null until the scheduler has scored the number.
This is internal deliverability health, distinct from
GET /api/v1/numbers/{id}/reputation, which reports the carrier-displayed caller-ID label (Hiya, TNS, First Orion, …) for outbound voice.string
required
Number ID
Get Number Warming State
GET /api/v1/numbers/{id}/warming
Read the current 10DLC warming-tier state for a number. The current_day_count is the live counter the pre-send gate enforces against, so today’s progress is reflected immediately rather than at the next reset. Returns null for numbers that are not being warmed (non-10DLC, alphanumeric, or voice-only DIDs).
string
required
Number ID
Get Number Warming Progression
GET /api/v1/numbers/{id}/warming/progression
Read the warming progression for a number: its warming_state, the mirrored daily ceiling, the live day count, and a 15-day forecast (day 0 through day 14) of the growth-curve ceiling so a client can render the projection without a per-day round-trip. The row is returned even when warming is off, so the UI can show an enable-warming state.
string
required
Number ID
Configure a Number
PUT /api/v1/numbers/{id}
Update the configuration for a number — change its label, status, capabilities, forwarding, webhook delivery, compliance profile, or tags. All body fields are optional; only the keys you send are updated. The request body is validated strictly, so unknown keys are rejected with 422.
To configure inbound AI-agent routing (which agent answers calls/messages on this number), use
PUT /api/v1/numbers/{phoneNumber}/routing instead — agent assignment is not part of this endpoint.string
required
Number ID
string
Human-friendly label for the number (max 100 characters)
string
Number status — one of
active or inactivestring[]
Enabled capabilities, any of
sms, mms, voice, fax. Toggling depends on carrier support (for example fax/T.38 is fixed at provisioning time); unsupported toggles return 422.string
E.164 number to forward inbound voice calls to. Send
"" to clear.string | null
Single webhook URL for inbound event delivery (SMS and voice). Send
"" or null to detach.string
E.164 number to forward inbound SMS to. Send
"" to clear.string | null
Per-number compliance profile to attach. Send
"" or null to detach.string[]
Up to 10 lowercase-slug tags (
^[a-z0-9][a-z0-9_-]{0,63}$). Sent as the full resolved tag set; an empty array clears all tags.object
Provider-specific channel configuration overrides.
integer | null
Hard ceiling on this number’s outbound SMS throughput, in messages per second (
1–1000). Sends that would exceed this rate are rejected with 429 and the NUMBER_MPS_EXCEEDED error code; retry after one second. Send null to remove the cap (uncapped by default).integer | null
Hard ceiling on this number’s outbound SMS spend for the current UTC calendar month, in US cents (
1–100000000, up to $1,000,000). Sends that would exceed the remaining budget are rejected with 402 and the NUMBER_MONTHLY_SPEND_CAP_EXCEEDED error code. Send null to remove the cap (uncapped by default).Release a Number
DELETE /api/v1/numbers/{id}
Release a number from your account. The number is immediately removed from your inventory and billing stops at the end of the current billing cycle.
string
required
Number ID to release
204 No Content
Port a Number
POST /api/v1/numbers/porting
Submit a request to port existing numbers from another carrier to Orbit.
string[] | string
required
One or more phone numbers in E.164 format to port. Accepts a single string or an array.
string
required
Name of the current carrier the numbers are leaving. You may send
carrier as an alias; if both are present, currentCarrier wins.string
Name of the person authorized to sign the Letter of Authorization on the current carrier account.
string
Account number with the current carrier.
string
Account PIN or passcode, if the current carrier requires one to release the numbers.
string
Signed URL to the uploaded Letter of Authorization PDF. Omit to submit in manual mode, where our operations team processes the LoA by hand.
string
ISO 3166-1 alpha-2 country code of the numbers being ported (for example,
US). Drives carrier selection. Omit to store the request without dispatching to a carrier.string
Name of the contact for this porting request.
string
Email address for porting status updates.
object
Service address on file with the current carrier. Some carriers reject ports when this does not match their records.
A new request starts at
status: "submitted". From there it moves through
reviewing, then approved, and finally completed once the numbers are
live on Orbit; a port the carrier declines lands in rejected. Branch on
these values — there is no pending state.Porting typically takes 7–14 business days depending on the country and carrier.
You will receive a number.ported webhook event when the port is complete.SMS Short Codes
Short codes are 3–6 digit numbers leased for high-volume application-to-person SMS programs (2FA, alerts, marketing). Acquiring one is a multi-week, carrier-vetted lifecycle: you open an application, attach a program brief that carriers review, submit it to the Common Short Code Administration (CSCA) / aggregator, track per-carrier vetting, and — once approved — provision the lease. Base path:/api/v1/numbers/short-codes
An application moves through these statuses:
Short codes are leased, not owned (3, 6, or 12-month terms with a CSCA quarterly minimum), so a provisioned application carries a
leaseEndsAt renew-by date. This surface governs short-code provisioning only — outbound message sending is unchanged and continues through the Messaging API.list, get, timeline) and the non-mutating preflight lints are available to any role on the organization. Tenant-initiated writes (create, update brief, submit, cancel) require the numbers:write scope and an owner, admin, or developer role. The carrier-confirmed transitions (vetting, provision, reject) relay an upstream decision and are restricted to owner / admin.
List Short-Code Applications
GET /api/v1/numbers/short-codes
Return every short-code application for your organization.
Create a Short-Code Application
POST /api/v1/numbers/short-codes
Open a new application in draft. Requires the numbers:write scope.
string
required
ISO 3166-1 alpha-2 country code for the code (e.g.,
US).string
required
dedicated (exclusive) or shared (multi-tenant).string
required
random (the CSCA assigns any free code) or vanity (a specific requested code at the higher vanity rate).string
The desired 3–6 digit code. Required when
selection is vanity; omit for random.integer
required
Lease term — one of
3, 6, or 12 months.string
required
The brand / registrant name on the program (CSCA registrant).
object
required
The CTIA-style program brief carriers vet:
useCase(string) — e.g.2FA,Marketing,Alerts.description(string) — plain-English description of the program / call-to-action.sampleMessages(string[]) — 1–5 production sample messages.messageFrequency(string) — how often subscribers receive messages (e.g.5 msgs/week).optInDescription(string) — the consent flow carriers verify.supportContact(string) — contact surfaced in the HELP response.privacyPolicyUrl(string, optional) — public privacy-policy URL.termsUrl(string, optional) — public terms-and-conditions URL.
Get a Short-Code Application
GET /api/v1/numbers/short-codes/{id}
Fetch a single application by id.
string
required
Short-code application id (e.g.,
scapp_abc123).Get the Carrier-Vetting Timeline
GET /api/v1/numbers/short-codes/{id}/timeline
Return a structured, stage-by-stage view of the multi-week review (submitted → CSCA reservation → program-brief review → carrier vetting → provisioned), including a per-carrier snapshot and the calendar days elapsed since submission.
string
required
Short-code application id.
Update the Program Brief
PATCH /api/v1/numbers/short-codes/{id}/brief
Replace the program brief while the application is still in draft. Once submitted the brief is locked (carriers vet the snapshot) and this returns 409 — open a new application to change it. Requires numbers:write.
string
required
Short-code application id.
object
required
The full replacement program brief (same shape as on create).
Preflight a Program Brief
POST /api/v1/numbers/short-codes/preflight
Lint a program brief against the carrier rejection-pattern catalog before you open an application. Carriers reject roughly a third of first-round briefs on deterministic, well-documented grounds — SHAFT-C content, ambiguous calls-to-action, public URL shorteners, a missing STOP opt-out in the samples, and a call-to-action that omits the message-frequency, “Message and data rates may apply”, STOP, or HELP disclosures — and each rejection restarts the multi-week vetting queue. This endpoint scores those patterns in milliseconds and returns per-field findings, each with the offending text fragment and a concrete rewrite.
Preflight runs entirely against the brief you send: nothing is stored, no application is created, and no message is sent. It is available to any role and does not require the numbers:write scope.
A
pass verdict means “no known rejection patterns matched” — not “carriers will approve”. Preflight catches the deterministic majority of rejections; the application still goes through the normal submit → carrier-vetting flow. Run it, fix the findings, then open (or update) the application.object
required
The program brief to lint (same shape as on create). Each field is checked defensively, so you can preflight a partial brief while you are still assembling it.
string
The brand / registrant name. When present, the linter also checks that at least one sample message identifies the sender — brand ambiguity is a top carrier rejection reason.
data object contains:
score(integer) —0–100;100means no known rejection patterns matched. Each finding deducts by severity (error−25,warn−8,info−2, floored at0).verdict(string) — the aggregate gate:blockwhen anyerrorfinding is present,warnwhen the score is below75, otherwisepass.findings(array) — one entry per issue, each with a stableruleId(e.g.R-SC-SAMPLE-OPTOUT), aseverity(error|warn|info), the dot-pathfieldit applies to, a human-readablemessage, an optionalmatch(the exact offending text, for inline highlighting), and an optionalsuggestion(a rewrite that resolves it).engine(string) — the rule-engine version (e.g.shortcode-preflight/v1), so you can correlate scores over time.
Preflight a Stored Application
POST /api/v1/numbers/short-codes/{id}/preflight
Run the same lint against an application you have already created, using its persisted program brief and registrant businessName. This is the convenient check to run on a draft right before you submit — no request body is needed. Available to any role; it does not mutate the application.
string
required
Short-code application id.
score, a verdict, the per-field findings, and the engine version.
Submit for Vetting
POST /api/v1/numbers/short-codes/{id}/submit
Submit a draft application to the CSCA / aggregator, transitioning it to submitted. Requires numbers:write.
string
required
Short-code application id.
Record Carrier Vetting
POST /api/v1/numbers/short-codes/{id}/vetting
Record a per-carrier vetting decision relayed from the aggregator. The first call moves the application from submitted to carrier_vetting and seeds the per-carrier tracker. Restricted to owner / admin.
string
required
Short-code application id.
string
required
Carrier name (e.g.,
AT&T).string
required
pending, approved, or rejected.string
Optional carrier-supplied note (e.g., conditional-approval or rejection detail).
Provision the Lease
POST /api/v1/numbers/short-codes/{id}/provision
Open the lease once carrier vetting is complete, transitioning carrier_vetting → provisioned. Stamps the assigned code and computes the renew-by date from the lease term. Restricted to owner / admin.
string
required
Short-code application id.
string
required
The assigned 3–6 digit short code.
Reject an Application
POST /api/v1/numbers/short-codes/{id}/reject
Record an aggregator / carrier rejection (submitted | carrier_vetting → rejected). Restricted to owner / admin.
string
required
Short-code application id.
string
required
The reason supplied by the aggregator or carrier.
Cancel an Application
DELETE /api/v1/numbers/short-codes/{id}
Cancel / relinquish an application or an active lease (any non-terminal state → cancelled). Requires numbers:write.
string
required
Short-code application id.
Hosted Messaging
Hosted messaging (also called “Hosted SMS” or “text-enabling”) turns an existing landline, toll-free, or mobile number into an SMS-capable number while its voice service stays with another carrier — no porting required. This is the equivalent of the Twilio “Hosted Messaging” / Bandwidth “Hosted SMS” flow. You open an order, sign a Letter of Authorization (LOA) proving you control the number, submit it to the hosting carrier, and — once active — inbound SMS to the number is delivered to the route you configure. Base path:/api/v1/numbers/hosted-messaging
Hosted messaging governs inbound SMS only. The number’s voice service is untouched and stays with your current carrier, and outbound (MT) sending is unchanged — it continues through the Messaging API.
Read operations (
list, get) are available to any role on the organization. Writes (create, sign LOA, submit, update route, cancel) require the numbers:write scope and an owner, admin, or developer role.
Inbound route
Several endpoints take aninboundRoute object describing where inbound SMS on the hosted number is delivered once the order is active:
string
required
Delivery target type — one of
webhook, inbox, or messaging_service.string
required
The destination. For
webhook this must be an https URL the platform POSTs each inbound message to; for inbox / messaging_service it is the id of the destination resource.List Hosted-Messaging Orders
GET /api/v1/numbers/hosted-messaging
Return every hosted-messaging order for your organization.
Create a Hosted-Messaging Order
POST /api/v1/numbers/hosted-messaging
Open a new order in draft. A second non-terminal order for the same number is refused with 409. Requires the numbers:write scope.
string
required
The number to text-enable, in E.164 format. Its voice service stays with your current carrier.
string
required
Name of the carrier of record that keeps voice service for the number (informational, aids LOA matching).
string
required
Number class — one of
landline, tollfree, or mobile. Drives carrier eligibility on the hosting side.object
required
Where inbound SMS is delivered once the order is active. See Inbound route.
string
The brand / business name on the carrier-of-record account, used for LOA matching.
Get a Hosted-Messaging Order
GET /api/v1/numbers/hosted-messaging/{id}
Fetch a single order by id.
string
required
Hosted-messaging order id (e.g.,
hostedMessagingOrder_abc123).Sign the LOA
POST /api/v1/numbers/hosted-messaging/{id}/loa/sign
Capture an in-platform Letter of Authorization signature, transitioning the order draft → loa_signed. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
string
required
Full legal name of the party authorized on the carrier-of-record account.
string
required
Signer email address.
string
required
The verbatim acknowledgement text the signer accepted (20–4000 characters), retained for the audit trail.
string
Optional signed URL of the signed LOA artefact. Must be an Orbit-issued Google Cloud Storage signed URL (
https://storage.googleapis.com/...); other origins are rejected. Omit to have operations attach the LOA out-of-band.Submit to the Carrier
POST /api/v1/numbers/hosted-messaging/{id}/submit
Forward the signed order to the hosting carrier, transitioning loa_signed → submitted. The LOA must be signed first. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Update the Inbound Route
PATCH /api/v1/numbers/hosted-messaging/{id}/route
Change where inbound SMS is delivered, before the order is active. Once active the route is locked — open a new order to change live routing. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
object
required
The replacement inbound route. See Inbound route.
Cancel an Order
DELETE /api/v1/numbers/hosted-messaging/{id}
Cancel an order that has not reached a terminal state (any non-terminal status → cancelled). Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Number Types
Number Capabilities
Examples
Node.js
A first-party Python SDK is on the roadmap but not yet shipped. Call the REST endpoints above with
requests / httpx / any HTTP client.