Skip to main content

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.
An end-to-end recipe — place → poll → 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 (via POST /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.
See Creating Agents for the full agent configuration reference, including 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 (initiatedringingansweredcompleted). 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 maxParticipants field 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 with POST /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.
Inbound numbers may be provisioned from more than one upstream network, but outbound voice always exits through the Devotel softswitch.

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 — set language: "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 with DEVOTEL_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 at POST /voice/conferences/:id/ai-agent.
The same 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
Each entry in the 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 “0.00".Theaggregateblockrollsthewholecallup:totaltokens(input+output+cache),totalbilledcostusd(your0.00". The `aggregate` block rolls the whole call up: `total_tokens` (input + output + cache), `total_billed_cost_usd` (your /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

initiatedringingansweredcompleted (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:

Call quality trouble

When calls connect but the audio is wrong — one-way audio, dead air, choppy or jittery speech, echo, or a long wait before ringback — work the per-symptom decision paths in Troubleshooting: voice call quality; for a trunk that will not register or fail over, see Troubleshooting: SIP trunk registration, health, and failover.