API
Webhooks
Receive signed call lifecycle events with safe retry handling.
Events
| Event | When sent |
|---|---|
| call.started | A call has started. |
| call.ended | A call reached a completed terminal state. |
| call.failed | A call reached a failed terminal state. |
| transcript.ready | The finalized transcript is available. |
Delivery handling
1
Verify
Validate X-AI-Voice-Signature using the endpoint secret and the unmodified request body before processing the payload.
2
Acknowledge
Return a successful 2xx status promptly and perform slower work asynchronously.
3
Deduplicate
Persist X-AI-Voice-Delivery or the payload event id and ignore a previously processed id.
4
Retry safely
Make downstream work idempotent because failed deliveries can be retried.
javascript
import { createHmac, timingSafeEqual } from "node:crypto";
function validVozonSignature(rawBody, signatureHeader, endpointSecret) {
const expected = createHmac("sha256", endpointSecret)
.update(rawBody)
.digest("hex");
const received = signatureHeader.replace(/^v1=/, "");
return expected.length === received.length &&
timingSafeEqual(Buffer.from(expected), Buffer.from(received));
}json
{
"id": "call.ended:call_id",
"event": "call.ended",
"createdAt": "2026-07-30T12:00:00.000Z",
"data": {
"id": "call_id",
"call_status": "completed",
"direction": "outbound",
"duration": 92,
"billing": { "chargedCredits": 0.0842 }
}
}