Voice agents

Your agentanswers the phone.

The same agent that replies on WhatsApp can take a call. Zavu runs the whole pipeline — speech recognition, the model, speech synthesis — close enough together that the conversation does not feel like a queue.

  • POST /v1/calls · inbound and outbound
  • transcript roles · user · assistant · tool
  • call.initiated → answered → completed

One call

A call is a transcript, a status and a cost.

Step through what GET /v1/calls/{callId} returns while a call runs: the turns in order, the call object filling in field by field, and the webhooks firing at the moments they actually fire.

GET/v1/calls/call_abc123·inbound
ringing·00:00

Transcript

ringing…

Call object

statusringing
durationSeconds
turnCount0
endReason
cost

Webhooks

call.initiated00:00

cost lands with the terminal event: the call is charged first, call.completed is dispatched second.

A worked example, not a recording. The fields, the roles and the events are the ones the API documents; the cost shown is illustrative and depends on destination and duration.

What it does

Six things it does on every call.

Answers inbound calls

Point a number at a sender whose agent has voice enabled. The agent picks up, greets, and handles the conversation.

Places outbound calls

One POST to /v1/calls dials the recipient and connects the agent. Override the greeting, the language or the duration for that call only.

Interruptible

The caller can talk over the agent and it stops. Barge-in is on by default; silence and total duration both have their own limits.

Follows the caller's language

Pin a BCP-47 language, or pass auto and the agent follows whoever is speaking. A custom voice you chose is kept — only the language moves.

Transfers to a human

Give the agent a number and it gets a transfer tool. When the conversation needs a person, it hands the call over instead of improvising.

Transcript and cost per call

Every turn is recorded in order, including the tools the agent called. Each finished call carries its duration, why it ended, and what it cost.

Configure

Everything the agent does on a call is one object.

Change a control and watch the request body change with it. Anything still at its default is left out, the way a PATCH body should be.

voice
Voice enabled

The sender's number is answered by the agent, and outbound calls are accepted.

Greeting

Spoken when the call connects. Leave it empty and the agent waits for the caller to speak first. Max 1000 characters.

Add per-language greetings
Languageauto

auto detects the caller's language and follows it. The voice you picked is kept — only the language moves.

Voicedefault

Two ids from the published spec. Fetch the full catalog for your team with GET /v1/agents/voices.

voiceSpeed1.00

0.5 to 1.5, 1.0 is natural. Only honoured by voices that support rate control.

Barge-in

On by default. The agent stops speaking as soon as the caller starts.

maxCallDurationMinutes15 min

1 to 120 minutes, 15 by default. The call ends automatically when it is reached.

maxIdleSeconds30 s

5 to 300 seconds, 30 by default. How long the agent waits in silence before ending the call.

Record calls

Stores the call audio. Off unless you turn it on.

On an answering machine

What the agent does when voicemail is detected on an outbound call. Hangs up unless told otherwise.

Transfer to a human

Set an E.164 number and the agent is given a transfer tool it can use to hand the call over.

agent.voice
{
  "voice": {
    "enabled": true,
    "greeting": "Hi, thanks for calling Acme. How can I help you today?",
    "language": "auto"
  }
}

The API

Five requests cover the whole surface.

Voice is not generated in the SDKs yet, so these are curl and raw payloads — the exact shapes the API accepts and returns.

curl -X POST https://api.zavu.dev/v1/calls \
  -H "Authorization: Bearer $ZAVU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+56912345678",
    "senderId": "sender_12345",
    "language": "es-ES",
    "greeting": "Hola, le llamamos de Acme por su cita de mañana.",
    "maxDurationMinutes": 10,
    "metadata": { "campaign": "appointment_reminders" }
  }'

Getting there

Three steps from nothing to a ringing phone.

  1. 01

    Give the sender a number

    Buy a number with voice capability and attach it to the sender, then turn the voice channel on.

  2. 02

    Configure the agent's voice

    Greeting, language, the voice that speaks, how long it waits in silence, what to do with an answering machine.

  3. 03

    Call, or be called

    Inbound works the moment the number is attached. Outbound is one request whenever your product needs it.

Before you build on it

What gates voice, said plainly.

  • Voice Agents is enabled per team. Until it is on, every call endpoint returns 403 — ask us to enable it.
  • The sender's agent needs voice turned on, and the sender needs a phone number provisioned for calls. Enabling voice without one is refused rather than stored.
  • Calls cannot be placed with a test-mode API key.
  • Billing is per connected minute plus telephony, from your prepaid balance. A short estimate is reserved at dial time and the real duration is charged when the call ends.
  • Calls do not appear in the agent's messaging stats or executions — a call is a conversation, not one inbound message. Read them from /v1/calls.

Give it a number and it starts talking.

Start free, no credit card. Voice is enabled per team — tell us and we turn it on.

Voice Agents | Answer and place phone calls with AI — Zavu | Zavu