Skip to main content

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, mobile
string
Comma-separated capabilities filter: sms, voice, mms, fax
string
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 on numbers: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, rcs
string
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.
Most EU/EEA numbers (for example DE, FR, NL, DK, AT, BE, IT, ES, PL, IE, and GB) require a verified end-user address on the order. Purchase with a compliance_profile_id that covers the destination country — without one, the order returns 422 or enters a regulatory hold until the required identity documents are provided.

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.
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 inactive
string[]
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 (11000). 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 (1100000000, 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.
This action is irreversible. The number may be reassigned to another customer and cannot be guaranteed for repurchase.
string
required
Number ID to release
Response: 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.
Read operations (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.
The response data object contains:
  • score (integer) — 0100; 100 means no known rejection patterns matched. Each finding deducts by severity (error −25, warn −8, info −2, floored at 0).
  • verdict (string) — the aggregate gate: block when any error finding is present, warn when the score is below 75, otherwise pass.
  • findings (array) — one entry per issue, each with a stable ruleId (e.g. R-SC-SAMPLE-OPTOUT), a severity (error | warn | info), the dot-path field it applies to, a human-readable message, an optional match (the exact offending text, for inline highlighting), and an optional suggestion (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.
The response is identical to Preflight a Program Brief — a 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_vettingprovisioned. 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_vettingrejected). 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.
Cancelling a provisioned lease relinquishes the short code. Re-acquiring it later means a fresh application and the full carrier-vetting cycle.
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.
An order moves through these statuses: 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 an inboundRoute 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 draftloa_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_signedsubmitted. 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.