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.
Transcript
ringing…
Call object
Webhooks
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.
The sender's number is answered by the agent, and outbound calls are accepted.
Spoken when the call connects. Leave it empty and the agent waits for the caller to speak first. Max 1000 characters.
auto detects the caller's language and follows it. The voice you picked is kept — only the language moves.
Two ids from the published spec. Fetch the full catalog for your team with GET /v1/agents/voices.
0.5 to 1.5, 1.0 is natural. Only honoured by voices that support rate control.
On by default. The agent stops speaking as soon as the caller starts.
1 to 120 minutes, 15 by default. The call ends automatically when it is reached.
5 to 300 seconds, 30 by default. How long the agent waits in silence before ending the call.
Stores the call audio. Off unless you turn it on.
What the agent does when voicemail is detected on an outbound call. Hangs up unless told otherwise.
Set an E.164 number and the agent is given a transfer tool it can use to hand the call over.
{
"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.
- 01
Give the sender a number
Buy a number with voice capability and attach it to the sender, then turn the voice channel on.
- 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.
- 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.