> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Outbound calls with an AI voice agent

> Have a voice agent dial a number, greet the person, and run the conversation — for reminders, renewals, and follow-ups.

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](/voice/quickstart).

## 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.

## Place the call

Send the agent's id as `agent_id` on the outbound call:

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/voice/calls \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "from": "+14155551234",
    "agent_id": "agt_abc123"
  }'
```

With the Node SDK:

```ts theme={null}
import { Orbit } from "@devotel/orbit-sdk";

const orbit = new Orbit({ apiKey: process.env.ORBIT_API_KEY! });

const call = await orbit.voice.calls.create({
  to: "+14155552671",
  from: "+14155551234",
  agent_id: "agt_abc123",
});

console.log(call.id);
```

You get back the call id immediately. The dial is placed in the
background; subscribe to [call events](/webhooks/events) to follow
`call.initiated`, `call.answered`, and `call.completed`.

## 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** — calls outside the permitted local calling window for
  the destination are blocked. Set an org timezone override with
  `orgTimezone` if your account's default doesn't match.
* **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.

<Warning>
  Emergency numbers can never be dialed. An outbound request to an
  emergency short code is rejected — Orbit does not provide emergency
  calling.
</Warning>

## 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.
* **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.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/voice/calls \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "from": "+14155551234",
    "agent_id": "agt_abc123",
    "amd": true,
    "record": true
  }'
```

## Call a whole list

To reach many contacts, point a **dialer campaign** at a voice agent
instead of placing calls one at a time. The campaign paces the outbound
calls, runs the same compliance checks per number, and attaches the agent
to each answered call. See [Dialer dispositions](/voice/dialer-dispositions)
for how call outcomes are recorded.

## Troubleshooting

* **422 with an agent error** — the `agent_id` doesn't exist or is
  archived. Confirm the id and that the agent is active.
* **422 compliance violation** — the number failed quiet-hours,
  do-not-call, or AI-consent. The response `details` name which check
  blocked it.
* **The callee hears silence at pickup** — the agent has no greeting
  configured. Set the agent's opening message.
* **503 while dialing** — the outbound voice path is momentarily
  unavailable. Retry shortly; the call was not placed.
