Callina.aiDocs

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:

  1. Endpoint URL (must be HTTPS).
  2. Events to subscribe to (see list below).
  3. Signing secret — copy this and verify the X-Callina-Signature header on your server.

Event types

EventWhen
call.startedA call has been picked up by Anna
call.completedCall ended (any reason)
transcript.readyFull transcript + summary available
tool.invokedAnna called a custom tool during a conversation
outbound.scheduledOutbound call queued
outbound.failedOutbound call failed (no answer / busy / error)
campaign.completedAn 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.