Skip to main content

Buy and provision numbers

Buying a number on Orbit is a four-step loop: search → buy → audit the order → wire the number up. This guide walks the whole loop — single purchases, bulk orders of up to 50 DIDs, the pollable order record, and the provisioning steps that turn an owned DID into one that actually answers calls and messages. Reads (available, country-capabilities, orders) need the numbers:read scope; purchases and post-purchase wiring need numbers:write. The full endpoint surface is at Phone Numbers; the API reference is at Numbers. Outbound termination never touches a third-party carrier — buying a DID provisions inbound routing only, and outbound voice and SMS exit through Orbit’s own network.

1. Number basics

A phone number on Orbit is a DID identified in E.164 format — a leading +, country code, then digits, with no spaces or punctuation (+14155550100). Every endpoint in this guide accepts and returns E.164. Three number types cover different use cases: Capabilities are per-number flags for the channels the DID supports. The search filter accepts sms, mms, voice, fax; the purchase-time request accepts sms, voice, whatsapp, rcs. The two enums are deliberately different — a purchase-time OTT registration (whatsapp, rcs) is an add-on requested at provisioning, not something inventory search filters on. Passing a value from the wrong enum returns 422.

2. Search inventory first

Never buy blind. Query live inventory before you construct an order:
Each returned row carries an id you should forward into the purchase call (see below), plus monthly_cost and setup_cost as decimal strings, requires_registration, and expected_activation. A row flagged requires_registration: true lands in a regulatory hold unless you attach an approved compliance profile at purchase time. Two discovery helpers narrow the search before you run it:
After purchase, audit what you own with the Inventory & Export endpoints — page your inventory, export it to CSV/JSON for finance reconciliation, and subscribe to low-stock alerts. If the country you want is empty, see the Troubleshooting section — and for new inventory programs, the retro order of operations is: preview requirements, then search, then buy.

3. Buy a single DID

In the dashboard, go to Numbers → Buy, search, and check out — the wizard runs the same endpoints below. By API:
Pricing is resolved server-side against live inventory — a client-supplied price field is never honoured. The wallet is checked up front; insufficient balance returns 402 with the required and available amounts.

4. Bulk-provision up to 50 numbers

When you already have the exact E.164 list — from GET /numbers/available or your own selection — submit it in one call instead of fifty:
Read the response with partial success in mind:
  • 200 even when every row fails. The status code tells you the request was processed, not the outcome — inspect succeeded.length to decide your UI state.
  • Failed rows are never charged. total_cost_cents sums every requested item; debited_cents is what was actually charged — only for succeeded. There is no partial-batch debit.
  • compliance_profile_id applies to every item in the batch — pick one profile per order. The wallet is checked up front against the summed per-number cost, and each item can carry the same provider hint enum as the single purchase.
  • Rate-limited to 2 requests/minute per tenant, because one call fans out to up to 50 upstream carrier calls.
Need more than 50, or want the platform to pick the block for you instead of posting a pre-built list? Use the bulk-reservation lifecycle — hold up to 1000 DIDs matching a country / area-code / capability filter for 15 minutes, then finalize (purchase, bill, and route) or cancel. It’s documented under Bulk Reserve.

5. Poll and audit the order

Every buy-bulk response carries an order_id — a stable, pollable record of the batch, persisted so partial fulfillment can be audited long after the request returned.
The order status is the aggregate across its lines: delivered (all succeeded), partial (some succeeded), or failed (none succeeded). Per line you get the E.164, country, capabilities, monthly cost, and the carrier error for failures — enough to reconcile a bulk provisioning run against finance records without replaying the batch. Orders are org-scoped: an unknown or not-owned id returns 404, not an exists-but-not-yours leak.

6. Wire the number up after purchase

A purchased DID with no route answers with silence. Do these immediately after the buy:

Set the voice route

Pick where inbound calls terminate — an AI agent, IVR, queue, ring group, voicemail, SIP forward, or your own webhook — via the inbound-routing surface, keyed by the number in E.164 form:
Voice type and SMS routing (webhook, agent, auto_reply, disabled) are configured independently — set both if the number carries both capabilities. The full route-type catalog is in Phone Numbers.

Register the emergency address

If the number’s users can place calls to emergency services, register a validated dispatchable address per number:
The address records and validates the dispatchable location for compliance — treat E911 as record-keeping, not a live emergency-calling guarantee. Full surface: Emergency Address.

Set the caller name

Outbound callers see what the carrier CNAM database says. Register your brand per number:
Registrations are captured and dispatched on Orbit’s network; propagation to carrier CNAM databases is carrier-paced. Details and spam-label remediation: CNAM & Caller ID. Finally, enable auto-renew so the number never lapses: PATCH /api/v1/numbers/{id}/auto-renew with { "auto_renew": true }.

7. Trial numbers — and when to upgrade

A new organization can claim one free trial number from the shared pool, leased for 24 hours as a one-time lifetime claim — enough to test inbound calls and SMS before committing:
Claim returns 409 if your org already holds an active trial or already owns purchased numbers. Upgrade the moment you need the number to survive past 24 hours, want a specific area code, or need capabilities the shared pool doesn’t guarantee — convert with purchase-trial to keep the exact number, or release it and buy a DID that matches your requirements. The full trial lifecycle is in Number Lifecycle.

8. Troubleshooting

Most post-purchase oddities trace to one of: capability mismatch (bought without the channel you need), a missing inbound route, or a regulatory hold still pending a compliance profile.

See Also