APIs for AI voice agents
One key, one balance, every voice engine, no subscriptions.
- API endpoints
- 55
- Resource types
- 12
- Voice engines
- 4
From nothing to a ringing phone in four requests
This is the whole quickstart. Telephony stays with your carrier; everything else is one key against one balance.
- 1
Connect your SIP trunk
Your carrier’s credentials. The password is stored encrypted and is never returned by the API again, including to you.
POST /v1/sip-trunks$ curl https://api.voice.wixzel.com/v1/sip-trunks \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -d '{ "name": "My carrier", "host": "sip.carrier.example", "username": "acct123", "password": "…" }' - 2
Register a number on it
Give the number an inbound_agent_id later and calls to it are answered automatically.
POST /v1/phone-numbers$ curl https://api.voice.wixzel.com/v1/phone-numbers \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -d '{ "phone_number": "+14155550100", "sip_trunk_id": "st_01HXYZ" }' - 3
Create an agent
Name the models you want and we wire them together, or hand the whole turn to one realtime model. All three stages are required: defaulting a missing one would bill you for a model you never chose.
POST /v1/agents$ curl https://api.voice.wixzel.com/v1/agents \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -d '{ "name": "Support", "system_prompt": "You are a concise support agent.", "opening_message": "Hi, how can I help?", "voice": { "stt": { "model": "deepgram/nova-3" }, "llm": { "model": "openrouter/gpt-4o-mini" }, "tts": { "model": "elevenlabs/eleven_turbo_v2_5" } } }'// or hand the whole turn to one model "voice": { "realtime": { "model": "google/gemini-live", "voice": "Charon" } } - 4
Place a call
Idempotency-Key is required here. A timeout tells you nothing about whether the call was placed; the key makes retrying safe instead of dialling twice.
POST /v1/calls$ curl https://api.voice.wixzel.com/v1/calls \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "to": "+14155551234", "agent_id": "ag_01HXYZ" }'
Then GET /v1/usage/events?session_id=… explains every micro of what it cost. Read the quickstart
Everything a voice agent needs, not just the models
55 endpoints across the whole product surface. You are not assembling a voice agent out of a speech API and a to-do list. The contacts, the campaigns, the trunks and the accounting are already here.
Agents
Prompt, opening line, voice pipeline, and a knowledge base stuffed into every turn.
"voice": {
"stt": { "model": "deepgram/nova-3" },
"llm": { "model": "openrouter/gpt-4o-mini" },
"tts": { "model": "elevenlabs/eleven_turbo_v2_5" }
}Calling
Place and receive calls, hang up, and pull the transcript and recording afterwards.
Telephony
Your own SIP trunks and numbers, with inbound routed to the agent you choose.
Leads and campaigns
Contacts with merge fields, bulk import, and outbound campaigns that pace themselves.
Appointments
Bookings made by the agent during a call, against real availability.
Billing and usage
Balance, ledger, top-ups, and every charge itemised down to the second it came from.
stt deepgram/nova-3 187 s $0.0336
llm openrouter/gpt-4o-mini 8.2k $0.0031
tts elevenlabs/turbo_v2_5 1.4k $0.0980
platform orchestration 4 min $0.0480Every one of them is cursor-paginated, scoped to an API key, idempotent where it spends money, and described by the same OpenAPI document that validates the requests, so the reference cannot drift from the server.
More than a gateway in front of the model vendors
Unifying the model providers is the easy half. The rest of a voice agent is the part that takes months and never appears in a demo: the media server, RTP pacing, barge-in, endpointing, trunk registration, campaign pacing, per-second metering.
Without Wixzel Voice
- Accounts with Deepgram, OpenRouter and ElevenLabs
- Three sets of keys to rotate and leak
- Three invoices, none of them per-call
- Your own media server, RTP pacing and barge-in logic
With Wixzel Voice
- One key, scoped and rotatable
- One prepaid balance, spent per second
- Every charge itemised by component and call
- Barge-in, endpointing and pacing already solved
Pick an engine, or compose one
Prices are per connected minute at typical speech rates, including the flat $0.012 orchestration fee. The table is generated from the same price book the meter bills against, so it cannot drift from what you are charged.
| Engine | Pipeline | Per minute |
|---|---|---|
classic | Deepgram + GPT-4o-mini + ElevenLabs | $0.0867 |
sarvam | Sarvam, Indian languages end to end | $0.0623 |
gemini-live | Gemini Live, native audio | $0.0466 |
deepgram-agent | Deepgram Voice Agent | $0.1851 |
Telephony is not included and not marked up. Calls run over your own SIP trunk, so you keep your carrier rates and your carrier relationship.
Every charge is traceable to a second of audio
Credit is reserved before a call is placed and debited as it runs. Every micro that leaves the balance is explained by a usage row, so a bill is answerable without asking support.
Reserved at admission
Credit for the first stretch of the call is held before a port is opened or a provider socket is created. An account that cannot fund it is refused with 402, so a call that never happens costs nothing.
Debited as it runs
Speech seconds, tokens and characters are metered against the balance every few seconds while the call is live. Run low and the agent warns your caller; run out and it says goodbye rather than dropping the line.
Settled at hangup
The hold is released and only what was used stays debited, one row per component, reconciled against the call’s real duration.
$ curl .../v1/billing/balance
{
"object": "balance",
"balance_display": "$24.75",
"held_micros": 250000, # held by live calls
"available_micros": 24500000
}Amounts are integer micro-USD, so a charge of $0.000021 has a representation that agrees with the ledger. Every response carries a display string beside it.
No surprise invoices
Prepaid. You cannot be billed for more than you added.
Prices frozen per call
A call is priced at admission and finishes on those rates, so a price change never moves a meter mid-conversation.
Under-billed on our failures
If we crash mid-call you are charged for the seconds we can prove, not the amount we reserved.
Refused before it costs you
A call that cannot fund its first 15 seconds is refused before anything is allocated. At about a minute of runway the agent warns your caller and then hangs up cleanly.
Questions the docs answer
The short versions. Each one links to the page with the long one.
Start with a curl
Sign up, create a key, point a SIP trunk at us. From there the quickstart is four requests long.


