Transport architecture
Orbit’s real-time media rides two planes, split by where the media originates, not by a per-call flag you set:- Orbit Media (SFU) carries WebRTC media — video rooms and the browser softphone.
- Jambonz SBC + RTPengine carries PSTN/SIP carrier media — inbound DIDs and outbound calls.
transport request field and
no per-call SFU-vs-bridge decision the API makes on your behalf —
the plane follows directly from the endpoint and the leg type.
TL;DR
Orbit Media (the SFU)
Orbit Media is Orbit’s Selective Forwarding Unit. It is forked from LiveKit OSS under Apache-2 — see Attribution. It handles everything that needs server-side fan-out or mixing of WebRTC media: simulcast, per-subscriber bitrate adaptation, codec negotiation, DTLS/SRTP, and server-side recording via egress. Clients never talk to the SFU with a long-lived key. The API mints a short-lived join token scoped to a single room:- Video —
POST /api/v1/video/roomsand/api/v1/video/rooms-scheduledcreate a room and mint a participant token against Orbit Media. There is no non-SFU mode for video. - Voice (browser softphone) —
POST /api/v1/voice/softphone/tokenmints an Orbit Media token for a deterministic per-user room (softphone:<tenant>:<user>), so reconnects are idempotent. See Softphone token.
Jambonz SBC + RTPengine (carrier legs)
PSTN and SIP carrier media never touches the SFU. It terminates on the Jambonz session border controller, with RTPengine bridging RTP/SRTP between the carrier and Orbit:- Inbound — Telnyx and DIDWW DIDs route through Jambonz, which applies the tenant’s number-handler routing.
- Outbound (MT) —
POST /api/v1/voice/callsinitiates a call through Jambonz, which terminates it on the Devotel wholesale softswitch. Outbound voice exits only via Devotel — Orbit never wires a carrier’s call-control API for outbound termination.
POST /api/v1/voice/calls/:id/recording/start), not SFU egress.
Browser softphone
The browser softphone has two client transports, chosen by the SDK in use — not by a request flag:- Orbit Media (WebRTC) — the dashboard softphone calls
POST /api/v1/voice/softphone/tokenand joins an Orbit Media room. - SIP over WSS — the
@devotel/orbit-web-sdkSoftphonecallsPOST /api/v1/voice/softphone/registerto obtain a short-lived SIP credential andREGISTERs against Orbit’s WebRTC-to-SIP gateway over a secure WebSocket. The SIP password itself is HMAC-derived and never stored, but issuance and revocation metadata (issue/expiry times, the owning org, and a revoked flag) is persisted server-side so a tenant can revoke a credential before it expires. CallDELETE /api/v1/voice/softphone/credentials/:usernameto revoke one — the gateway rejects the HMAC on its next validation even while it’s still within its lifetime.
What the API does not expose
To keep this page honest against the code, a few things that earlier drafts implied but the API does not do:- There is no
transportfield on thePOST /api/v1/voice/callsbody and noINVALID_TRANSPORTerror code. The plane is implied by the endpoint and leg type. - There is no client-facing “decision tree” service that ranks SFU vs. WebSocket bridge per call, and no per-call latency-budget selection.
Cross-references
- Voice API → Softphone token — how a softphone token is minted for browser clients.
- Video API — every endpoint mints Orbit Media (SFU) tokens.
- Voice quickstart — end-to-end walk-through of a voice call.
- Attribution — Orbit Media is forked from LiveKit OSS under Apache-2.