call.failed
Fires when a call terminates abnormally due to a network error, rejection, or timeout.
Status: This event will start emitting once gateway-go upstream signals land. The contract documented here is stable.
call.failed fires when a call ends abnormally: network error, busy, rejected, or timeout. Unlike call.completed, no billing CDR is written for failed calls that never reached answered state. It is routed per-number via voice_callback_url / events_url and is not subscribable as a workspace webhook.
{
"kind": "call.failed",
"event_id": "01900000-0000-7000-8000-000000000001",
"workspace_id": "01900000-0000-7000-8000-000000000002",
"occurred_at": "2026-06-27T10:00:30.000Z",
"data": {
"call_id": "01900000-0000-7000-8000-000000000003",
"direction": "outbound",
"from": "+254700000002",
"to": "+254700000001",
"number_id": "01900000-0000-7000-8000-000000000004",
"status": "failed",
"failure_reason": "no_answer",
"ended_at": "2026-06-27T10:00:30.000Z"
}
}Every webhook delivery includes the following request headers:
| Header | Description |
|---|---|
X-Sautikit-Signature | HMAC-SHA256 of the raw body, hex-encoded. Verify with your subscription secret. |
X-Sautikit-Idempotency-Key | Unique delivery ID for deduplication. |
X-Sautikit-Event | Literal event kind: call.failed. |
event_id or the X-Sautikit-Idempotency-Key header.dead_letter.import { createHmac } from "node:crypto";
export async function POST(req) {
const sig = req.headers["x-sautikit-signature"];
const body = await req.text();
const expected = createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(body)
.digest("hex");
if (sig !== expected) return new Response("Forbidden", { status: 403 });
const event = JSON.parse(body);
if (event.kind === "call.failed") {
const { call_id, failure_reason } = event.data;
console.warn(`Call ${call_id} failed: ${failure_reason}`);
// trigger alert, log to incident tracker...
}
return new Response("OK", { status: 200 });
}voice_callback_url / events_url on the Numbers Routing tab.call.started to correlate with when the call was initiated.