Get a call recording (any channel)
Channel-agnostic recording fetch: resolves a fresh, playable MP3 URL
for any call regardless of channel (provider-signed URLs expire ~10
minutes after signing, so this re-signs on demand). Default responds
302 Found redirecting to the fresh URL; pass as=json to receive
{ url } instead.
API key authentication - use your Zernio API key as a Bearer token
In: header
Path Parameters
Query Parameters
json returns { url } instead of a 302 redirect.
"json"Response Body
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.calls.getCallRecording({ path: { id: 'abc123', },});console.log(data);{
"url": "string"
}{
"error": "Unauthorized"
}List all calls (unified history) GET
Unified call history across ALL of your numbers: both channels (WhatsApp Business Calling + regular phone/PSTN), inbound and outbound, newest first. Unlike `GET /v1/voice/calls` (PSTN-only) and `GET /v1/whatsapp/calls` (one account at a time), this endpoint needs no `accountId` and never requires fanning out one request per number. Any row can be opened channel-agnostically via `GET /v1/calls/{id}` and `GET /v1/calls/{id}/recording`; no branching on `channel` needed. When the counterparty number matches a CRM contact, `contactId` and `contactName` are set. Cursor pagination: pass the returned `nextCursor` as `before` to fetch the next page. `nextCursor` is null on the last page.
Get a call (any channel) GET
Channel-agnostic call detail: works for both WhatsApp and regular phone (PSTN) calls, so any row from `GET /v1/calls` can be opened without branching on `channel`. Returns the full call including transcript segments, with `contactId`/`contactName` set when the counterparty matches a CRM contact.