> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Post-call webhooks

> Receive the transcript, duration, input variables, and post-call analysis via webhook after every call.

Configure an **assistant-level webhook URL** on each assistant (**Settings → Automations → Call completed**). After every call, Famulor sends a `call.completed` POST with:

* Transcript
* Duration
* Resolved input variables
* Post-call analysis (and [AI QA scorecard](/assistants/analysis#ai-qa-scorecards) when enabled)
* Failure guidance when an outbound call did not connect

The optional `failure` object explains what happened, whether retrying may help, and what action to take. The same customer-facing guidance is available through REST and MCP call reads.

## Webhook settings

| Setting     | Range     | Default | Meaning                                |
| ----------- | --------- | ------- | -------------------------------------- |
| Webhook URL | HTTPS URL | —       | Delivery target for this assistant     |
| Timeout     | 1–30 s    | 5 s     | Max wait for a response                |
| Retry count | 0–5       | 2       | Extra attempts after the first failure |

Use **Test** in the editor to send an example payload to an unsaved or saved URL (respects the timeout slider).

This URL is unsigned and specific to this assistant. Famulor has no workspace-wide webhook subscription — call results are always delivered per assistant.

## Example webhook payload

A `call.completed` delivery looks like this:

```json theme={null}
{
  "event": "call.completed",
  "timestamp": "2026-08-26T14:32:07.000Z",
  "data": {
    "call_id": "c1b2c3d4-0000-4000-8000-000000000010",
    "tenant_id": "9f86d081-0000-4000-8000-000000000020",
    "assistant_id": "1b2c3d4e-0000-4000-8000-000000000030",
    "direction": "outbound",
    "status": "completed",
    "duration_sec": 132,
    "transcript": {
      "items": [
        { "type": "message", "role": "assistant", "content": ["Hi, this is Alex from Riverside Dental."] },
        { "type": "message", "role": "user", "content": ["Hi, yes, I have a moment."] }
      ]
    },
    "collected": { "appointment_time": "2026-09-02T10:00:00Z" },
    "variables": { "lead_quality": "high" },
    "input_variables": { "customer_name": "Max Mustermann" },
    "analysis": {
      "summary": "Customer confirmed interest and booked a demo.",
      "sentiment": "positive",
      "success": true,
      "success_reason": "Appointment booked"
    },
    "qa_scorecard": null
  }
}
```

`variables` and `input_variables` follow the same [call variables](/assistants/variables) used elsewhere on the assistant. `analysis` and [`qa_scorecard`](/assistants/analysis#ai-qa-scorecards) are only populated once post-call processing finishes. When an outbound call didn't connect, a `failure` object is added alongside the result — see above.

## API & MCP

Use `PATCH /api/v1/assistants/{id}` or the MCP `update_assistant` tool. Delivery can be off, the assistant webhook URL, or a [bound automation](/automations/overview). See the API schema for the current field contract.
