Number status map
Every phone number in Orbit carries astatus value. The vocabulary is
a closed set of six states, and every Numbers page and list endpoint you
touch reads one of them. This page defines what each state means, who
moves a number into it, and which transitions are reversible. The
lifecycle operations (auto-renew, release, reassign, reclaim) that move a
number through these states are documented step by step in Number
lifecycle — this page is the anchor for the status
vocabulary those operations depend on.
The six states
The lifecycle is a closed enum. A number is always in exactly one of:active— held and fully usable. Works for sending, receiving, and billing.pending_compliance— purchased into a regulated country and the carrier-approved compliance bundle is still being verified. Not yet a usable number.inactive— never provisioned or deliberately disabled. Shows in listings but is not usable.released— let go. The carrierDELETEcompleted, and this is a terminal state — the only path back in is a fresh purchase.parked— mid-release grace window. Holding the number against upstream release so you can reclaim it during a bounded window.suspended— soft pause on a NaaS DID (for an overdue balance or a manual suspend). It stops sending and receiving until reactivated.
One more status exists mid-transition
The six values above are the states a number can settle into. One further, synthetic member joins the closed enum while a port-out is in flight:port_out_pending — the DID is claimed by an outbound port
order and sits between active (its only entry edge, returning there on
cancel/failure) and gone (on completion). It is not a seventh lifecycle
path; it exists so the list endpoint, dashboard badge, and every
ownership guard can treat a mid-port number uniformly. The two-direction
model that defines it lives in Number portability
model, and its guards live in
Port-out lifecycle and ownership model.
Wire vs. terminal
The six states split by the same distinction the delivery lifecycle draws for messages: one terminal outcome, and five states a number can visibly leave again.
There are six paths a number traverses from purchase. Annotating them,
only one arrow is irreversible:
parked is the last reversible stop on the release path — cross it, and
the row is gone.
Every regulated-country purchase routes through
pending_compliance before it is active, because the carrier only
approves the compliance bundle after Orbit attaches it.
What each state means, and who sets it
active— set at purchase when the country has no regulatory bundle, and set frompending_complianceonce the carrier accepts the attached compliance profile. The dashboard and list endpoints default toactivewhen no status filter is supplied.pending_compliance— set at purchase into a regulated country. Orbit auto-releases it after its grace window unless you attach a compliance profile first (Attach a compliance profile).inactive— never provisioned or deliberately unhooked. Either way, the number is still yours; it only stops being usable. Set it yourself by sendingPUT /numbers/:idwithstatus: "inactive"(the same update acceptsstatus: "active"to bring it back — the configuration stays intact, so re-enabling is free). Provisioning arrives at it the other way: when a purchase left the messaging-profile or voice-connection attachment incomplete, the row waits for repair provisioning instead of ever reachingactive. Both directions route through the update endpoint, not the lifecycle schedulers, soPUTandrepair- provisioningare the only two doors intoinactive. You can still see the row with astatus=inactivefilter on the list endpoint.released— set after the graceful-release parking window closes and the carrierDELETEcompletes. Terminal; recover by purchasing again.parked— set when you schedule a release. The parking-expiry scheduler is the only actor that moves the row fromparkedtoreleased. During the window,POST /:id/reclaimmoves it back toactivewithout re-purchasing.suspended— set for an overdue balance or a manual suspend on a NaaS DID. It is an explicit soft pause; reactivation flips it back toactivewith the configuration intact. Only anactivenumber can be suspended, sopending_compliance,parked, andreleasedrows are rejected with409.
Filtering by status on the list endpoint
GET /numbers accepts a status query. Omit it and the list returns
active rows only. Pass one value (suspended, released, …) and you
get that subset. Pass status=all to see every state at once, and pass
a comma-separated list to union several states in one call.
The dashboard Active tab deliberately queries the union
active,pending_compliance so a newly-purchased regulated-country DID
shows up alongside your usable numbers instead of disappearing from the
list until its compliance clears.
Suspended is not released
Usesuspended when you want the number to come back under you (an
overdue balance, a manual pause). Use released only for a verified
teardown. parked sits between them: the number was handed to a release
schedule but the grace window is still open, so it is reclaimable until
the scheduler closes it.
Timeline examples
- Fresh purchase, unregulated country — purchase completes and the
number lands at
activeimmediately. - Fresh purchase, regulated country — purchase lands at
pending_compliance. Attach the approved compliance profile (POST /:id/attach-compliance-profile); the carrier webhook flips the row toactive. If the grace window lapses first, Orbit auto-releases it toreleased. - Trial-pool number — claimed from the shared pool as
active. Purchasing flips your claim to permanent ownership, releasing returns it to the pool. - Scheduled release — you schedule it; the number moves to
parked. The parking-expiry scheduler moves it toreleasedwhen the window ends, unless you reclaim it first. - Reclaim during the grace window — a
parkednumber moves back toactiveviaPOST /:id/reclaimwithout another purchase.
States and the operations that move them
The mechanics live in Number lifecycle — this table maps every state to the operations that can move it into or out of the state you hold. Use it as the index; the linked section is where the operation itself runs step by step.
Operations that update a number without touching its state — auto-renew
toggle, reassign to a
subaccount, capability and
label updates — ride on the same rows but never move a state.
Cross-links
- Number portability model — where
the synthetic
port_out_pendingstatus comes from, and the unified port-in/port-out model it anchors. - Number lifecycle — the step-by-step operations.
- Number rental and your
wallet — the money arc that
moves a number into
suspended(unpaid renewal → 7-day grace → suspend → reactivate) and the controls that keep it from happening. - Numbers overview — the Numbers pillar surface.