Skip to main content
A voice agent can start a call, not just answer one. Attach an agent to an outbound call and it dials the number, opens with your greeting, and holds the whole conversation on its own — no human on the line. This guide covers the outbound-specific pieces. If you haven’t placed a call or created an agent yet, start with the Voice Quickstart. For the state machine every outbound call follows (queued → initiated → ringing → answered → completed or a failure outcome), see Voice call lifecycle.

Prerequisites

  • A voice agent. Create one in the dashboard or over the API and note its agent_id (looks like agt_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:
With the Node SDK:

Response

A successful initiation returns 201 Created with the new call id and its initial status:
You get the id immediately — the dial itself is placed in the background. Follow the call by polling 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 orgTimezone on 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.
Emergency numbers can never be dialed. An outbound request to an emergency short code is rejected with EMERGENCY_CALLING_NOT_SUPPORTED — Devotel Orbit does not provide emergency calling.

Options for unattended calls

For reminder or campaign calls where no human is on the originating side:
  • Answering-machine detection — set amd: true so 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: true to 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: true never adds a usable signal on every carrier. Expect AMD to resolve to human / machine / machine_beep_detected / no_answer on 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 on call.hit_voicemail rather than waiting for the call to finish.
  • Archived agent detection is exact at dispatch time. An agent_id archived 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 a call.* 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