# How can an AI agent make phone calls on its own?

*2026-10-21 · By Naol Ketema, founder of Agent Identity*

**Short answer:** The agent places the call through an API from its own number and says who runs the conversation. With Agent Identity, placeCall with mode hosted_agent and a reason sends Aid Voice to do the task with no server, or you stream the call to your own agent over a WebSocket. When it ends, a call.ended event carries the outcome, the transcript and any follow-ups.

## What an outbound agent call involves

An agent placing a call is an errand: call this number, get this done, report back. The agent needs a number to call from, something to hold the conversation, a plan for voicemail, and a way to learn the result without watching the line.

On Agent Identity, POST /v1/identities/{id}/calls dials from the agent's own number. You choose who runs the call with mode.

## Send Aid Voice with a task

Give Aid Voice a task in reason, up to 2,000 characters. It introduces itself, works the task, records follow-ups and ends the call politely. If the task conflicts with the agent's standing instructions, the task wins.

```ts
import { AgentClient } from "@agentidentity/sdk";

const org = new AgentClient({ baseUrl: "https://api.agent-identity.dev", apiKey: process.env.AID_ORG_KEY! });
const agentId = process.env.AID_AGENT!;

const since = new Date();
const call = await org.phone.placeCall({
  identityId: agentId,
  to: "+14155550123",
  mode: "hosted_agent",
  reason: "Confirm tomorrow's 9:30am appointment and ask if they need parking.",
  onVoicemail: "leave_message",
});
```

Over HTTP, send an Idempotency-Key header and repeating the request places one call, not two. That matters when a retry follows a timeout.

```bash
curl -sS -X POST "https://api.agent-identity.dev/v1/identities/$AID_AGENT/calls" \
  -H "authorization: Bearer $AID_KEY" -H 'content-type: application/json' \
  -H "idempotency-key: dentist-booking-0412" \
  -d '{"to":"+14155550100","mode":"hosted_agent","reason":"Book a cleaning next week, mornings preferred."}'
```

## Or let your own agent talk

Leave mode out and pass clientWebsocketUrl (or rely on the one saved on the agent), and the call streams to your agent exactly like an incoming call: caller speech as text in, text to speak out. Use this when the agent must call your own tools while the call is live.

## Write the task like a brief

Aid Voice knows who it is (the agent's name, handle, email and number), who it is calling (and their name, company and notes if the number is one of your contacts) and the time in UTC. The reason should supply everything else.

- Who the call is on behalf of, so it can introduce itself honestly.
- The goal in one sentence, and what counts as done.
- Constraints: times that work, things it must not agree to, information it must not share.
- Known phone menu paths or extensions, so it can press keys instead of guessing.
- What to do when the goal cannot be met, such as taking a message or asking for a callback time.

Anything it learns that needs action later becomes a follow-up, with an action and details. Your agent reads them from the call.ended event and does the work: send a confirmation email, update a booking, or place another call.

## When voicemail answers

Every call rings for up to 60 seconds. Unless you turn it off, the platform listens for an answering machine and its beep.

- leave_message: Aid Voice waits for the beep, says voicemail_message (up to 1,000 characters), then ends the call. The default for Aid Voice. Leave the message out and a short one is written from the reason.
- hang_up: the call ends at the beep. The default for your own agent.
- ignore: no detection; whatever answers is treated as a person.

## Get the result without polling

Calls write to the same event log as mail. When an Aid Voice call ends, call.ended carries outcome (completed, no_answer, declined or failed), the transcript (first 200 lines, with a URL for the rest) and followUps. Aid Voice sends call.ended even when nobody answered, so a task never fails silently.

```ts
let cursor = since;
for (;;) {
  const { event, timedOut } = await org.events.wait({
    type: "call.ended",
    since: cursor,
    timeoutMs: 55_000,
  });
  if (timedOut) continue;
  cursor = new Date(event.createdAt);
  if (event.payload.callId !== call.id) continue;

  console.log(event.payload.outcome, event.payload.followUps);
  break;
}
```

Capture since before placing the call, so an event that lands quickly is not missed. You can also read the call later with getCall, the transcript with listTranscript, and what Aid Voice did (keys pressed, follow-ups added) with listToolInvocations. POST /v1/calls/{id}/hangup ends a live call from outside.

Read outcome carefully. completed means the call connected and ended normally, which includes leaving a voicemail. no_answer means it rang out, declined means busy or rejected, and failed means it never got through. Calls run by your own agent report completed when the call connected; calls that never connect send call.failed instead.

## Checks and limits

- The organization's owner must be verified, or the call fails with 403 org.not_verified.
- The destination country must be allowed. On the hosted service that is +1, the US and Canada.
- A number with a block rule cannot be called (403).
- Outgoing calls per rolling 24 hours: 100 on Free, 500 on Builder, 5,000 on Team. Minutes: 300, 1,000 and 10,000. Calls live at once: 3, 5 and 30.
- Over a limit you get 429 phone.limit_exceeded with Retry-After. Every placed call returns rate_limit with the day's use.

Automated calls are regulated in many places, including consent rules for calls to consumers. Know which apply to your use before you put an agent on outbound calling at volume.

## FAQ

### Do I need to run a server for my agent to make calls?

No. With mode hosted_agent and a reason, Aid Voice runs the whole call. You only need a server if your own agent does the talking over a WebSocket.

### How does my code find out what happened on the call?

Wait on the call.ended event or receive it by webhook. It carries the outcome, the transcript and the follow-ups Aid Voice recorded.

### Can the agent get through a phone menu?

Yes. Aid Voice can press 0-9, * and #. Put known menu paths in the task or the standing instructions.

### Which numbers can an agent call?

On the hosted service, +1 numbers in the US and Canada, excluding the agent's own number and any number with a block rule.

---
Docs: https://www.agent-identity.dev/docs · All guides: https://www.agent-identity.dev/guides · llms.txt: https://www.agent-identity.dev/llms.txt