Webhooks
Subscribe to events emitted by Callina — call.started, call.completed, transcript.ready, and more.
Webhooks are the recommended way to react to events in Callina — they're real-time, signed, and retried with exponential backoff.
Configuration
In Settings → Webhooks → New:
- Endpoint URL (must be HTTPS).
- Events to subscribe to (see list below).
- Signing secret — copy this and verify the
X-Callina-Signatureheader on your server.
Event types
| Event | When |
|---|---|
call.started | A call has been picked up by Anna |
call.completed | Call ended (any reason) |
transcript.ready | Full transcript + summary available |
tool.invoked | Anna called a custom tool during a conversation |
outbound.scheduled | Outbound call queued |
outbound.failed | Outbound call failed (no answer / busy / error) |
campaign.completed | An outbound campaign finished all attempts |
Payload example
{
"event": "call.completed",
"call_id": "call_x1y2z3",
"occurred_at": "2026-05-09T14:32:55Z",
"data": {
"from": "+43660123456789",
"to": "+43662275123",
"duration_seconds": 174,
"outcome": "completed",
"summary": "Caller booked an appointment for Thursday 9:30 ...",
"structured_fields": {
"caller_name": "Maria Steinhauser",
"intent": "appointment_booking",
"next_step": "Anna booked the slot in tomedo"
}
}
}Signature verification (Node example)
import crypto from "node:crypto";
function verify(rawBody: string, signature: string, secret: string): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(signature, "hex")
);
}Always verify on the raw request body — not on a parsed JSON object.
Mid-call webhook
Anna can call a tenant-configured external URL during a live call to fetch dynamic data (e.g. order status, account balance). Set the URL under Callina → Assistant Configuration → Webhooks → Mid-call.
Budget + waiting message
The webhook has a 5-second budget. If the response arrives within that window, Anna uses the data immediately. If not, Anna emits the configured waitingMessage (e.g. "Einen Moment bitte, ich prüfe das für Sie.") and injects the result when it lands.
Request
POST <your-mid-call-url>
X-Callina-Signature: v1,t=<unix>,sig=<hex> // when secret configured
Content-Type: application/json
{
"sessionId": "...",
"fromNumber": "+43...",
"toNumber": "+43...",
"args": { "purpose": "order-status", "payload": { "orderId": "12345" } },
"$now": "2026-05-10T14:00:00.000Z"
}Response
Return any JSON payload. Anna will read it back to the caller through the prompt context. Status codes 4xx are treated as misconfiguration and not retried; 5xx and timeouts are retried with exponential backoff.
Tools that the assistant can call
When midCallWebhook.enabled=true, Anna gets a callExternalWebhook tool. The LLM decides when to call it, with what purpose label and what payload shape.