Place an outbound phone call
Dials to FROM one of your voice-enabled numbers and, on answer,
bridges the callee to the number's stored forward destination, or to
the per-call forwardTo override. Destinations can be your own AI
voice agent (Vapi/Retell), a phone, or a SIP endpoint. An optional
greeting is spoken to the callee before the bridge.
The 200 response means the call is dialing; the lifecycle continues
asynchronously (track it via GET /v1/voice/calls/{id} or the call.*
webhooks). Outbound calls are capped per rolling hour (429 when hit).
Idempotency: send an Idempotency-Key header to make retries safe;
same key + same body replays the original response instead of dialing
(and billing) a second call.
API key authentication - use your Zernio API key as a Bearer token
In: header
Header Parameters
Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
length <= 255Destination to dial, E.164 with leading +.
^\+\d{6,15}$Which of your voice-enabled numbers to dial from. Optional when you have exactly one.
^\+\d{6,15}$Per-call agent override (tel:+E164, sip:..., or wss://...); defaults to the number's stored forward destination.
Spoken to the callee when they answer, before the bridge.
length <= 1000Per-call recording toggle; defaults to the number's setting.
Per-call transcription toggle; defaults to the number's setting.
'auto' derives from the callee's country; 'en'/'es' force it.
"auto" | "en" | "es"Answering-machine detection; defers the bridge until human vs machine is known.
Spoken to a detected machine, then hang up (implies amd). For outbound voicemail drops.
length <= 1000Response Body
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.voice.createVoiceCall({ body: { to: 'string', },});console.log(data);{
"success": true,
"callId": "string",
"telnyxCallControlId": "string",
"status": "dialing",
"direction": "outbound",
"from": "string",
"to": "string",
"forwardTo": "string",
"greeting": "string",
"recordingEnabled": true,
"transcriptionEnabled": true,
"transcriptionLanguage": "auto"
}{
"error": "Unauthorized"
}List phone calls GET
Your PSTN voice calls (inbound + outbound), newest first. Cursor pagination: pass the returned `nextCursor` as `before` for the next page. For a history that also includes WhatsApp calls, use `GET /v1/calls`.
Mint a browser softphone session POST
Step 1 of the two-step browser softphone handshake. Mints a WebRTC session (token + credential) the browser registers with the `@telnyx/webrtc` SDK. Once registered, call `POST /v1/voice/calls/web/dial` with the returned `credentialId` to place the call. The split avoids bridging to a browser that has not finished registering. The token lives ~1 hour (it must outlive the whole call, not just the handshake).