Text-enable a number with hosted messaging
Hosted messaging (also called “Hosted SMS” or “text-enable”) lets a number receive SMS on Orbit while its voice service stays with the current carrier. Instead of porting the number, you open a hosted-messaging order, sign a Letter of Authorization (LOA) authorizing the hosting carrier to overlay SMS routing, and pick where inbound messages land — a webhook URL, an inbox, or a messaging service. This guide walks one number end-to-end: order → LOA → submit → route → activation. Use the API when the steps belong in a pipeline; the dashboard surface at Numbers → Hosted Messaging mirrors the same order lifecycle.1. Hosted messaging vs. a full port
A hosted-messaging order changes only how SMS on the number is routed — the voice carrier, the existing voice routing, and the carrier-of-record relationship are untouched. A full port moves voice and messaging together (see Port a number end-to-end §9 for where this choice fits in a migration). Two hard boundaries to know up front:- Inbound only. Hosted messaging delivers messages the carrier receives on the number. Outbound (MT) SMS on Orbit exits exclusively via the Devotel softswitch — this flow never creates an outbound path.
- Voice never moves. If you later want voice + SMS on Orbit, port the number instead; a hosted order is not a step toward a port.
2. When to choose it
Choose hosted messaging over a port when:- Voice must stay with the losing carrier — a PBX contract, a bundled plan, or a carrier you are contractually locked to.
- The number is not voice-portable — some rate centers and country rules block ports while still allowing SMS hosting.
- The number is a landline or toll-free you only need for messaging — common for support lines and hotlines.
3. Prerequisites
Before opening an order:- API key with the
numbers:writescope for create/sign/submit/route/cancel; reads (list,get) neednumbers:read. - The number in E.164 format —
+14155550123, not a national format. - Number class:
landline,tollfree, ormobile. - An inbound route target — an
https://webhook URL, an inbox id, or a messaging-service id. The route can be changed until the order activates. - LOA signer details — the full legal name and email of the party authorized on the carrier-of-record account.
4. Open the order
POST /api/v1/numbers/hosted-messaging creates the order in draft. Provide the number, the carrier of record, the number class, and the initial inbound route. businessName is optional but recommended — carriers match the LOA against the account holder name.
409 — resolve the existing order (complete, reject, or cancel it) before opening a new one. Cancel any order before a terminal state with DELETE /api/v1/numbers/hosted-messaging/{id}.
5. LOA lifecycle — sign, then submit
The LOA authorizes the hosting carrier to add SMS routing to the number. Sign it in-platform (draft → loa_signed), then submit it to the carrier (loa_signed → submitted). Submitting before signing is rejected.
loaFileUrl is optional — omit it if ops attaches the LOA artefact out-of-band. The acknowledgement text and signer identity are your organization’s authorization record; capture the exact wording the signer accepted so it holds up in a dispute. Signing does not notify the carrier — that buffer lets you revoke (cancel) before submission, the same deliberate break as the porting LOA flow.
6. Set the inbound route
Inbound SMS on the hosted number delivers to the route stored on the order. Change it while the order isdraft, loa_signed, or submitted:
Once the order is
active, the route locks — open a new order to change live routing. A rejected or cancelled order cannot be edited. This lock is deliberate: it keeps the carrier-side hosting config and your delivery target in lock-step.
7. Track the order to active
PollGET /api/v1/numbers/hosted-messaging/{id} (or GET .../hosted-messaging for the full list) and read status:
active, rejected, and cancelled are terminal — every other status has a next action for you.
8. Wire inbound webhooks
If the route type iswebhook, treat it like any other inbound-message sink: receive the POST, verify the signature, dedupe on the message id, and return 2xx fast. Follow Webhook consumer for the receiver pattern and Webhook security for signature verification. If the route is an inbox or messaging service, inbound messages surface there directly.
9. Troubleshooting
- Carrier rejects the LOA (
status: rejected). ReadrejectionReasonon the order and fix the LOA content — mismatched account-holder name, abusinessNamethat does not match the billing record, or a signer who is not authorized on the account. Cancel the dead order if needed and open a fresh one with corrected data. - Inbound SMS not arriving after
active. Check the route: webhook targets must be reachablehttpsendpoints returning2xx; inbox/messaging-service targets must be valid ids. Until the order isactivethe carrier is not yet hosting, so no inbound traffic is expected. - Second order refused with
409. An in-flight order already exists for that number — the hosting carrier only accepts one order per number. Find it viaGET .../hosted-messagingand either wait it out or cancel it, then recreate. - Port conflict. If you decide to port the number after all, cancel the hosted order first — a full port supersedes the hosting arrangement, and running both in flight confuses the carrier.
- Route locked. You are seeing
409onrouteafteractive— that is by design. Open a new order to change live routing.
active → verify inbound → done.
See Also
- Port a number end-to-end — full voice + SMS migration when hosting is the wrong tool.
- Number Porting — endpoint-by-endpoint porting page.
- Numbers API Reference — full request/response schemas for hosted messaging and porting.
- Webhook consumer — receiver pattern for
webhookinbound routes. - Webhook events — inbound message event catalog.