Zernio's voice calling API lets your app make and receive real phone calls, then hand each one to an AI voice agent, a SIP endpoint or a regular phone.
It's built for developers and builders shipping AI voice agents and apps that talk to customers by phone. Your agent, like Vapi, Retell, or ElevenLabs answers inbound calls, dials out with answering-machine detection, and every conversation lands in one history with recordings and transcripts.
Voice has been live on Zernio since August 2026. It runs on numbers in 57 countries, the same ones you use for SMS and WhatsApp.
What is Zernio's voice calling API?
Zernio's voice calling API is a REST API for placing and receiving standard phone (PSTN) calls on numbers you own through Zernio. Calling switches on the moment a number is provisioned, so there's no separate activation step.
| What you get | How it works |
|---|---|
| Directions | Inbound and outbound |
| Inbound destinations | A phone (tel:), a SIP endpoint or hosted agent (sip:), or your own media server (wss:) |
| Outbound | POST /v1/voice/calls, or an in-browser softphone (WebRTC) |
| AI agents | Vapi, Retell and ElevenLabs over SIP, or your own agent over WebSocket |
| Recording | Optional, activate for +$0.004 per minute |
| Transcription | Optional, activate for +$0.03 per minute |
| Branded calling | Optional, activate for $100 per month. Shows your business name and logo on a destination's phone |
| Coverage | Currently Zernio provisions numbers in 57 countries |
| SDKs | Node, Python, Go, Ruby, Java, PHP, .NET, Rust |
This is standalone phone calling. It's a separate feature from WhatsApp Business Calling, which places voice calls inside a WhatsApp chat.
The practical difference: WhatsApp Calling can't place outbound calls in the US, Canada, Egypt, Vietnam or Nigeria because Meta blocks them there. Phone calls have no such block. Both channels share one call history and one webhook format.
What can you build with a voice calling API?
A voice calling API turns a phone number into something your code controls. These are the builds we see mentioned by our users often.
An AI receptionist on a local number
Buy a local number where your customers are, point it at a Vapi, Retell or custom agent, and set business hours. After hours, calls fall to voicemail with a transcript. Add an IVR option so callers can still reach a human.
Appointment reminders that handle voicemail
Dial each customer with amd: true. A human who answers gets bridged to your agent to confirm or reschedule. A machine gets a short voicemailDropMessage.
Click-to-call inside your SaaS or CRM
Add a call button to your product with the browser softphone. Calls show up in history matched to CRM contacts, with recordings and transcripts attached.
Call first, then follow up in text
One number can handle calls, SMS and WhatsApp. When a call ends, your call.ended handler sends a follow-up text to the same person from the same number. Missed calls get a text back.
How does a phone call flow through the API?
A call on Zernio moves through four stages: a number, a routing rule, the live call, and a record afterwards. You configure the first two once.
Get a number. Buy one from inventory or port in one you already own through the phone numbers API. Numbers cost $3 to $30 per month depending on country and type. Regulated countries need a one-time KYC form first.
Set where calls go. Call
POST /v1/phone-numbers/{id}/voicewith aforwardTodestination.
Note: Send an emptyforwardToand the number stays voice-enabled for outbound only. That's useful for a dialer that never takes inbound calls.Take or place calls. Inbound calls follow your routing. Outbound calls dial from the number.
Read it back. Pull the call from
GET /v1/calls, or get it pushed to you by webhook.
Can an AI agent set up and run calls through MCP?
Yes. An AI agent can do every step we showed above, from buying a phone number to placing the call and reading the transcript afterwards. Zernio's hosted MCP server exposes each API endpoint, phone numbers and voice included, as a tool that Claude, Claude Code, ChatGPT, Codex, Cursor or any MCP client can call.
MCP is your chat interface, while the work happens in the Zernio API behind it: provisioning the number, holding the routing rules, dialing through the carrier and storing the call.
This is a different agent from the one on the call. Your voice agent (Vapi, Retell or your own) talks to the caller. The assistant using MCP is the operator that sets everything up and runs it.
| Step | What you ask the assistant | What happens in the API |
|---|---|---|
| Get a number | "Find me a local number in Austin and buy it" | Searches inventory and provisions the number |
| Route calls | "Send calls on that number to my Vapi agent, voicemail after 6pm" | Sets forwardTo, business hours and voicemail |
| Place a call | "Call +1 310 555 1234 and connect them to the agent" | Places the outbound call with POST /v1/voice/calls |
| Review | "Show me today's missed calls with transcripts" | Reads call history, recordings and transcripts |
Stop building social integrations from scratch.
One API call to publish, schedule, and manage posts across 17 platforms.
How do you connect an AI voice agent to a phone number?
You connect an AI voice agent to a Zernio number by setting the number's forwardTo to the agent's address. The agent keeps its prompt, voice and tools. Zernio handles the carrier side and bridges the audio.
| Agent | How it connects | What you set |
|---|---|---|
| Vapi | SIP | sip:{username}@sip.vapi.ai, authenticated with SIP digest |
| Retell | SIP forwarding, or number import over a SIP trunk | The agent's SIP address, or a trunk if Retell should also dial out |
| ElevenLabs | SIP forwarding, or number import over a SIP trunk | Same two options as Retell |
| Your own agent | WebSocket media stream | A wss:// URL on your server |
With the SIP trunk option for Retell and ElevenLabs, the number, its KYC, SMS and WhatsApp all stay on Zernio. The voice platform only handles the calls.
If you run your own speech-to-text, LLM and text-to-speech pipeline, point forwardTo at a wss:// endpoint. Audio streams both ways over that socket as G.711 u-law (PCMU) at 8 kHz, so build your agent against that codec. The AI voice agents guide lists the exact stream events.
The same WebSocket bridge powers WhatsApp Calling. An agent you build once answers both phone calls and WhatsApp calls, if your use case supposes this flow.
How do you place outbound calls from your app or browser?
You place an outbound call with POST /v1/voice/calls and a to number. When the person answers, Zernio bridges them to the number's forward destination, or to a forwardTo you pass for that one call.
const { data: call } = await zernio.voice.createVoiceCall({
body: {
fromNumber: '+14155550100',
to: '+13105551234',
greeting: 'Connecting you now.',
}
});
The outbound API also covers the parts that usually get built by hand:
amd: trueturns on answering-machine detection and holds the bridge until a human picks up.voicemailDropMessagespeaks a message to a detected machine, then hangs up.GET /v1/voice/calls/estimateestimates the cost before you dial, using the same formula as the invoice.POST /v1/voice/calls/{id}/transferblind-transfers a live call to another number or SIP address.POST /v1/voice/calls/{id}/endhangs up, and it's safe to call twice.- An
Idempotency-Keyheader stops a retry from dialing (and billing) a second call.
Outbound calls are capped at 60 per rolling hour across every number on your API key.
If your agent speaks to people in the US, get consent first. The FCC ruled in 2024 that AI-generated voices count as "artificial" voices under the TCPA, so these calls need prior express consent.
Browser calling
Browser calling lets your users dial a real phone number from your web app with no phone. It uses WebRTC and a two-part handshake so your API key never touches the browser.
- Your server mints a session with
POST /v1/voice/calls/weband passes the token to the client. - The browser registers that token with the WebRTC SDK and waits for the call to ring.
- Your server dials with
POST /v1/voice/calls/web/dial, and the answered call bridges to the browser.
The token lasts about an hour, long enough to cover the call itself. Browser calls follow the number's recording settings and land in history as normal outbound calls.
What inbound call features come built in?
Every Zernio phone number ships with voicemail, business hours, an IVR menu, a caller blocklist and caller ID control. You switch them on in the same POST /v1/phone-numbers/{id}/voice request that sets the forward.
| Feature | What it does | Limits |
|---|---|---|
| Voicemail | Takes a message when nobody answers. On by default | Records up to 2 minutes, emails you |
| Business hours | Forwards only inside your windows, in your timezone | Up to 21 windows |
| IVR menu | Plays a prompt and routes by keypress | Up to 12 options (0 to 9, *, #) |
| Caller blocklist | Rejects listed numbers with a busy signal | No charge for blocked calls |
| Caller ID | Shows your number or the original caller on forwarded calls | business or caller |
The rules above run in a fixed order. The blocklist checks first, then business hours, then the IVR menu or plain forward. Voicemail catches anything left over: calls outside hours, forwards that ring for about 25 seconds, and failed agent connections. Outside business hours, callers skip the IVR and go straight to voicemail.
How do call recording, transcription and history work?
Recording and transcription are off by default on every phone number and cost extra per minute: $0.004 for recording and $0.03 for transcription. You turn them on per number, or override them per call.
Recording never starts silently. A consent notice plays before the bridged call begins.
Call history lives at one endpoint. GET /v1/calls returns every call across all your numbers, inbound and outbound, phone and WhatsApp, newest first. You can filter by channel, direction, status or number, and search by digits.
When a caller matches a contact in your Zernio CRM, the record carries contactId and contactName. Each call also links to its conversationId, so a call and the messages around it sit in the same thread.
How much does the voice calling API cost?
You pay per connected minute, with no setup fees and no monthly minimums. Outbound calls to US and Canadian mobiles start at $0.010 per minute, and fractional minutes bill as fractions.
| Destination (mobile) | Per minute |
|---|---|
| United States | $0.010 |
| Canada | $0.010 |
| United Kingdom | $0.035 |
| Brazil | $0.040 |
| Spain | $0.046 |
| Mexico | $0.058 |
| India | $0.070 |
| Germany | $0.080 |
| Recording (optional) | +$0.004 |
| Transcription (optional) | +$0.030 |
At those rates, a five-minute call to a US mobile with recording on costs $0.07. For anything you show your own users, quote live with the estimate endpoint, since carriers reprice routes.
Inbound calls are metered per minute too, but they're billed by the carrier, and the exact amount appears on each call as billing.billableCostUSD.
Where you forward matters:
- Forward to an AI agent (SIP or WebSocket) or a browser, and you pay the inbound leg only.
- Forward to a phone number, and a second leg is added at that destination's rate.
On top of minutes, each number costs $3 to $30 a month. Voice needs usage-based billing with a payment method on file. Full numbers are on the pricing page.

