Quickstart

You're building a product — let's call it AcmeCallAI — and you want voice-AI calling underneath. ZazaVoice provides the calling infrastructure; your customers see your brand. This page gets your first programmatic call out the door in about 5 minutes.

The flow:

1. Sign up + buy a number      (one-time, in the dashboard)
2. Create a voice agent        (one-time, in the dashboard)
3. Generate an API key
4. Dispatch a call via curl
5. Receive the result via webhook

1. Sign up + buy a number

Sign up at https://zazavoice.com, add a payment method, buy a phone number. Numbers are typically active within a minute. See Phone numbers for the buying flow.

For development you can stay on the Trial (27 free minutes) or top up a PAYG wallet with $10 — same API behaviour, no monthly commitment.

2. Create a voice agent

Dashboard → Voice Agents → Create Agent. Pick a personality, a voice, write a short system prompt describing the agent's job. See Voice agents for the configuration fields. Note the agent's ID from the URL bar (/dashboard/agents/<ID>) or the API in step 4.

3. Generate an API key

Dashboard → Settings → API Keys → Create key.

Give it a descriptive name (e.g. acmecallai-prod). The plaintext key is shown exactly once — copy it into your secret store immediately. Keys are prefixed zaza_ so they're easy to spot in logs.

Keys are scoped to your organization. They authenticate every /v1/* call.

4. Dispatch your first call

curl -X POST https://zazavoice-api-569199843054.us-central1.run.app/api/v1/calls/outbound \
  -H "Authorization: Bearer zaza_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "fromNumber": "+14155550100",
    "toNumber":   "+14155550199",
    "agentId":    12
  }'

Response:

{
  "callId":  3401,
  "callSid": "CA7d23f…",
  "status":  "queued",
  "from":    "+14155550100",
  "to":      "+14155550199"
}

The call rings within a few seconds. The AI handles the conversation using the agent's prompt + voice. When the call ends, you'll receive a call.completed webhook (next step).

Same call from Node:

await fetch(`${ZAZAVOICE_API}/v1/calls/outbound`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.ZAZAVOICE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ fromNumber, toNumber, agentId: 12 }),
});

5. Receive the result via webhook

Dashboard → Settings → Webhooks → New endpoint. Provide:

  • URL — your HTTPS endpoint (e.g. https://api.acmecallai.com/zazavoice-webhooks).
  • Eventscall.completed, call.failed. (Also available: call.started, campaign.lead.updated, sms.received, appointment.created.)

On save you'll get a signing secret (whsec_…). Store it server-side.

Your endpoint receives POSTs like:

{
  "event": "call.completed",
  "data": {
    "callId": 3401,
    "duration": 42,
    "disposition": "INTERESTED",
    "transcript": "…"
  },
  "timestamp": "2026-05-21T15:30:00Z"
}

Always verify the X-ZazaVoice-Signature header before trusting the payload — see Webhooks for the HMAC-SHA256 code in Node and Python.

You're integrated

That's the whole loop: configure agents + numbers once in the dashboard, dispatch calls programmatically, react to outcomes via webhooks. Your customers see whatever brand you put around it; ZazaVoice runs the calling under the hood.

  • API reference — every endpoint, params, error shape.
  • Webhooks — event types, signature verification, retry behaviour.
  • Capabilities & limits — honest list of what the API supports today and what's not yet in scope.