Voice
Build programmable voice experiences with Orbit’s voice infrastructure powered by Orbit Media (Devotel’s hosted SFU media plane). Make and receive calls, connect SIP trunks, deploy AI voice agents with real-time speech-to-text and text-to-speech, and record calls — all through a unified API.Make an Outbound Call
POST /voice/calls accepts to, from, agent_id, record, amd
(carrier-side answering-machine detection), and a free-form metadata
object. The greeting, voice, and language are properties of the agent,
not per-call parameters — see Connect to an AI Voice Agent
below. Lifecycle events (call.initiated, call.answered, …) are delivered
to your registered webhook subscriptions, not a per-call URL — see
Webhooks.
call.completed webhook payload →
the pre-flight error gate table — is in the Voice recipe
of the thin-channel pack.
Connect to an AI Voice Agent
A voice agent carries its own greeting, voice, and language. Configure them once on the agent (viaPOST /agents), then bind the agent to a call by
passing its agent_id to POST /voice/calls. The same agent answers inbound
calls routed to its number.
voice_settings (TTS provider, voice id,
barge-in, silence thresholds) and language coverage.
Get call details and hang up
GET /voice/calls/:id returns the same call record POST /voice/calls
created — read status off it as the call moves
(initiated → ringing → answered → completed). POST /voice/calls/:id/hangup ends a live call. Both are typed in the Node and Go
SDKs:
List and paginate calls
GET /voice/calls lists past calls with direction/status filters. List
endpoints are cursor-paginated — read meta.pagination.cursor and
meta.pagination.has_more off each response and pass the cursor back as a
query param until has_more is false. Processing order-safe pages beats
offset math here: cursors stay correct when new calls land mid-scan.
Features
- Outbound calls — initiate calls programmatically to any phone number
- Inbound routing — route incoming calls to webhooks, agents, or SIP endpoints
- SIP trunking — connect your existing PBX infrastructure via SIP
- AI voice agents — deploy conversational AI agents powered by LangGraph
- Speech-to-text — real-time transcription via Deepgram Nova-3
- Text-to-speech — natural voice synthesis via Cartesia Sonic Turbo (~40ms TTFA)
- Call recording — automatic or on-demand recording with secure storage
- DTMF input — collect keypad input for IVR menus
- Call transfer — warm and cold transfers to other numbers or agents
- Conferencing — multi-party calls with up to 32 participants per room (default room cap is 8; raise it up to 32 with the
maxParticipantsfield on conference create)
Recordings, voicemail, and live call media are pinned to your chosen
region (EU or US), and recordings and voicemail are deleted after a
configurable retention window. See Voice data residency &
retention.
Carrier of record
Every outbound leg — calls placed withPOST /voice/calls, dialer campaigns,
transfers, and conference dial-out — terminates on Devotel’s own wholesale
softswitch, which interconnects directly with the downstream carriers and
mobile operators that deliver the call. Termination, per-destination routing,
and STIR/SHAKEN signing all happen on the network Devotel operates.
For your traffic this means:
- Outbound calls are STIR/SHAKEN-attested at the carrier level, so they arrive authenticated on carriers that display caller identity instead of defaulting to a “Spam Likely” label. Combine this with branded calling and CNAM to improve answer rates.
- A single provider owns the call from your API request to the called handset.
Common errors
POST /voice/calls rejects before the call ever reaches the carrier when one
of the pre-flight gates fails. The response body carries error.code plus a
human-readable error.message; the table maps each code to its cause and fix.
Compliance gates beyond the US TCPA federal window (quiet hours, DNC,
opt-out) are tenant-owned controls — configure them under Settings and in
compliance profiles; they default open. The US TCPA dialing window itself is
a platform-wide hard guard and cannot be disabled per tenant.
Limits
Beyond one outbound call
The origination example above is one path on a much larger surface. The typed entry points, one link each:- SIP trunk setup and SIP trunk connection — register your PBX/credential, accept inbound, and place outbound over your trunk.
- IVR intents — declare caller-intent routing (
POST /voice/ivr-intents) so inbound callers reach the right queue or agent. - Conferences and the conference guide — multi-party rooms, dial-out legs, moderation, and participant caps (see Limits).
- Call park lobby and paging / ring groups / call park — park a call, page a group, and pick up from any extension.
- Emergency calling — E911 dialing, routing posture, and on-site notification for emergency calls.
- Dial plans (
GET/PUT /voice/dial-plan) — per-tenant digit-translation rules applied before outbound guards, e.g. PBX-style “9 for an outside line” or short-code expansion.
AI voice agent language coverage
Voice agents combine Cartesia Sonic Turbo (TTS) and Deepgram Nova-3 (STT). The voice path is GA in English, French, Spanish, and German — setlanguage: "en-US", fr-FR, es-ES, or de-DE on the agent config and expect production-grade prosody, barge-in, and turn detection.
Turkish (tr-TR) and Arabic (ar-SA) are in beta: STT recognition is solid, but TTS prosody and disfluency handling are still being tuned — expect occasional unnatural cadence on long-form replies and lower confidence on heavy code-switching. Voice agents will accept these locales today; please open a ticket if you hit a specific phrasing that sounds off so we can route it back into the tuning set.
Other locales are on the roadmap — the upstream providers cover ~30 languages between them, but we only GA a locale after we’ve validated phone-PSTN audio quality end-to-end against our latency budget (<500 ms round trip). Contact us for early access to a locale not listed.
Inbound transcription (call recordings, voicemail) uses the same Deepgram Nova-3 model and supports its full language matrix — locale beta status only affects the real-time AI voice agent path.
TTS Providers
Pick the fleet-wide default withDEVOTEL_VOICE_TTS_PROVIDER. Accepted values
are cartesia, elevenlabs, deepgram, and openai. A per-agent or per-call
override flows through the realtime-session tts_provider field.
Example: conference with a bound voice agent
A seeded conference (created with one PSTN participant) and an AI agent bound to it, greeted and answered in-call. The full agent section lives atPOST /voice/conferences/:id/ai-agent.
201 success + Common Errors envelope shape applies when you bind
an agent directly to a single outbound call with
POST /voice/calls — the agent_id field
on that create attaches the same agent to a one-to-one call instead of a
room (the call row returns call_id + status: "initiated").
UNVERIFIED_CALLER_ID is the rejection to handle first on any create that
dials out — the same envelope and error.code covers every row in the
Common errors table below.
Per-turn latency + AI cost on a call
GET /voice/calls/:id/latency returns the per-turn breakdown the voice-agent
pipeline captured for one call: timing per turn (LLM TTFT, TTS TTFB, round-trip),
barge-in responsiveness, and the AI cost of each turn — tokens and dollars
joined onto the same turn row.
200
turns array carries a cost object when the turn reached
the model:
cost is null on turns that never reached the model — and on calls placed
before this telemetry existed — so treat missing cost as “not recorded”, not
“/call), plus P50/P95/P99
round-trip and barge-in median/P95. Calls with no captured breakdown return
turns: [] rather than a 404.
Call Status Flow
initiated → ringing → answered → completed (or failed / busy / no-answer)
Webhook Events
Orbit sends real-time events during call lifecycle:
Verify the
X-Orbit-Signature HMAC before you trust any payload — the full
verifier (replay window, dual-key rotation, timed comparison) is in
Your first webhook receiver. Route on
event.type: