Prerequisites
- A voice agent. Create one in the dashboard or over the API and note its
agent_id(looks likeagt_abc123). The agent must not be archived. - A caller-ID number you own or have claimed as a trial number, passed as
from. - An API key with voice scope.
Request schema
POST /voice/calls accepts these fields. agent_id is what turns a
plain dial into an agent call:
Response
A successful initiation returns201 Created with the new call id and
its initial status:
GET /voice/calls/{id} or, far
better, subscribe to the call events and let
webhooks drive your state machine.
The agent speaks first
An inbound agent waits for the caller to speak. An outbound agent is the one who called, so it greets the person first with the agent’s opening message, then listens. Set that opening message on the agent’s configuration (the “first message” / greeting field). If none is set, the agent still connects and simply waits for the first turn — set a greeting so the callee isn’t met with silence.Compliance runs before anything dials
Outbound calls to real people are regulated, so Orbit runs these checks up front and rejects the call before it is placed if any fail — you are never charged for a rejected call:- Quiet hours — tenant-configured recipient-local dialing windows
are enforced when you opt your org in. Set
orgTimezoneon the request when your org’s default timezone doesn’t match. See the Compliance API for the tenant-owned quiet-hours configuration. - Do-not-call and STOP — numbers on your do-not-call list, or that have opted out across any channel, are blocked.
- AI-voice consent — a synthesized or agent voice requires prior written consent on file for the destination. The consent-management surface records that consent.
Options for unattended calls
For reminder or campaign calls where no human is on the originating side:- Answering-machine detection — set
amd: trueso the agent only engages a live person and skips machines and voicemail. AMD resolves on the destination’s own carrier; see Limits and edge cases for what to expect on timeouts. - Recording — set
record: trueto record the call. When your account requires a spoken recording announcement, it plays before recording starts; if the announcement can’t play, the call proceeds without being recorded rather than recording silently.
Error matrix
The errors below are pre-flight rejections: the call never dials and you are not billed. Fix and retry.
Treat
422 codes as deterministic: the same request fails the same way
until the underlying data changes. Treat 503 codes as retryable.
Limits and edge cases
- AMD is downstream-dependent. The carrier on the destination’s
network drives answering-machine detection, so
amd: truenever adds a usable signal on every carrier. Expect AMD to resolve tohuman/machine/machine_beep_detected/no_answeron the carrier’s own cadence; treat it as a branch signal and let the call timeout still decide the outcome. Campaigns use the AMD result to abandon or branch oncall.hit_voicemailrather than waiting for the call to finish. - Archived agent detection is exact at dispatch time. An
agent_idarchived between “create call” and “dial” still fails cleanly — the dispatch gate re-checks the status and rejects before any ring starts. That is what protects recall campaigns from dead endpoints. - Call-list pacing. For any list larger than a handful of numbers, run a dialer campaign instead of placing calls one at a time. The campaign paces the dials against your configured calling window, throttles to your settings, and applies the same compliance gates per number. Per-call API dialing is for ad-hoc one-off outreach.
- Dispositions, not raw statuses, close a campaign loop. When you use a campaign, record each attempt’s outcome against Dialer dispositions so abandoned-by-AMD, no-answer, and completed calls are all countable on the same report. The Voice call lifecycle page explains how individual status vs. event data fits together.
Events that fire on outbound
Every lifecycle step and mid-call signal emits acall.* webhook keyed
on call_id. Outbound calls emit the same family as inbound, plus the
AMD branch signal:
Apply every webhook idempotently keyed on
call_id — mid-call events
can arrive after you ingest call.completed and must not close your
record before the terminal event. The webhook events
reference pins the per-event payloads; the
Voice call lifecycle page explains
which events advance the state machine and which are branch signals.
Cross-references
- The state machine and the complete failure taxonomy: Voice call lifecycle
- Every
call.*event’s payload schema: Webhook events reference - Reporting outcomes for a dialer campaign: Dialer dispositions
- Tenant-owned quiet-hours and consent configuration: Compliance → Consent Management