> ## 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.

# Conversation Ended Webhook

> Webhook, der nach dem Ende einer Chat-Konversation gesendet wird und Transkript, extrahierte Variablen und Kundendaten enthält

> Webhook, der nach dem Ende einer Chat-Konversation gesendet wird und Transkript, extrahierte Variablen und Kundendaten enthält

Der Conversation Ended Webhook wird automatisch an deine angegebene Webhook-URL gesendet, nachdem eine Chat-Konversation (WhatsApp oder Web Widget) beendet wurde. Dieser Webhook enthält das vollständige Transkript, extrahierte Variablen, Kundeninformationen und Senderdetails.

## Webhook-Konfiguration

Um Conversation Ended Webhooks zu aktivieren:

1. Verwende den API-Endpunkt [Enable Conversation Ended Webhook](/de/api-reference/assistants/enable-conversation-ended-webhook)
2. Hinterlege deine Webhook-URL, an die Benachrichtigungen gesendet werden
3. Konfiguriere optional Post-Call-Variablen in deinem Assistenten, um strukturierte Daten aus Konversationen zu extrahieren

## Request-Format

Der Webhook wird als POST-Request an deine konfigurierte URL mit dem folgenden JSON-Payload gesendet:

### Payload-Struktur

<ResponseField name="id" type="integer">
  Numerische Kennung der Konversation (dieselbe `id` wie in der Dashboard-Konversations-URL). Verwende `conversation_id` (UUID), wenn du die API aufrufst.
</ResponseField>

<ResponseField name="conversation_id" type="string">
  Eindeutige Kennung (UUID) der Konversation
</ResponseField>

<ResponseField name="assistant_id" type="string">
  Eindeutige Kennung (UUID) des Assistenten, der die Konversation geführt hat
</ResponseField>

<ResponseField name="type" type="string">
  Typ der Konversation. Mögliche Werte: `widget`, `whatsapp`
</ResponseField>

<ResponseField name="message_count" type="integer">
  Gesamtanzahl der in der Konversation ausgetauschten Nachrichten
</ResponseField>

<ResponseField name="status" type="string">
  Status der Konversation. Wert: `ended`
</ResponseField>

<ResponseField name="extracted_variables" type="object">
  Von der KI extrahierte Variablen basierend auf der Post-Call-Schema-Konfiguration deines Assistenten

  <Expandable title="Beispiel für extrahierte Variablen">
    <ResponseField name="status" type="boolean">
      Ob das Konversationsziel erreicht wurde
    </ResponseField>

    <ResponseField name="summary" type="string">
      Zusammenfassung der Konversation
    </ResponseField>

    <ResponseField name="custom_variable" type="string|number|boolean">
      Beliebige benutzerdefinierte Variablen, die du in der Assistenten-Konfiguration definiert hast
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="input_variables" type="object">
  Variablen, die dem Assistenten zu Beginn der Konversation übergeben wurden (z. B. aus Pre-Chat-Formularfeldern oder Automatisierungs-Flows)
</ResponseField>

<ResponseField name="transcript" type="array">
  Array von Nachrichtenobjekten, das die vollständige Konversation abbildet, sortiert von ältest nach neuest

  <Expandable title="Nachrichten-Eigenschaften">
    <ResponseField name="role" type="string">
      Senderrolle: `user`, `assistant` oder `system` (`system`-Nachrichten markieren Ereignisse wie die Übernahme durch einen menschlichen Agenten)
    </ResponseField>

    <ResponseField name="content" type="string">
      Nachrichtentext. Bei Medien-Nachrichten ist dies die Bildunterschrift oder ein kurzer Platzhalter (z. B. `[Image]`); Sprachnotizen enthalten den transkribierten Text
    </ResponseField>

    <ResponseField name="timestamp" type="string">
      ISO-8601-Zeitstempel der einzelnen Nachricht in der konfigurierten Zeitzone des Nutzers. Ermöglicht die Sortierung und zeigt, wie lange eine Konversation gedauert hat (nützlich bei Chats über mehrere Tage)
    </ResponseField>

    <ResponseField name="timestamp_unix" type="integer">
      Unix-Zeitstempel (Sekunden seit Epoch) der einzelnen Nachricht. Praktisch für Berechnungen — z. B. die Zeitspanne zwischen zwei Nachrichten ohne Parsen des ISO-Strings
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="formatted_transcript" type="string">
  Lesbares, formatiertes Transkript mit den Präfixen `AI:` und `Customer:`
</ResponseField>

<ResponseField name="attachments" type="array">
  Medien-Dateien (Bilder, Videos, Dokumente), die während der Konversation geteilt wurden. Jeder Eintrag enthält eine direkte URL, die du an externe Dienste weitergeben kannst (z. B. Bild- oder Videoanalyse). Ein leeres Array, wenn keine Medien geteilt wurden — Medien sind typischerweise bei WhatsApp-Konversationen vorhanden.

  <Expandable title="Anhang-Eigenschaften">
    <ResponseField name="type" type="string">
      Medienkategorie. Mögliche Werte: `image`, `video`, `audio`, `document`
    </ResponseField>

    <ResponseField name="url" type="string">
      Direkte URL zum Herunterladen der Mediendatei
    </ResponseField>

    <ResponseField name="filename" type="string">
      Originaldateiname der Mediendatei
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="customer_phone" type="string">
  Telefonnummer des Kunden (bei WhatsApp-Konversationen verfügbar, bei Widget-Konversationen `null`)
</ResponseField>

<ResponseField name="customer_name" type="string">
  Kundenname, falls vorhanden (z. B. aus dem Pre-Chat-Formular), sonst `null`
</ResponseField>

<ResponseField name="sender" type="object">
  WhatsApp-Senderinformationen (nur bei WhatsApp-Konversationen vorhanden, bei Widget `null`)

  <Expandable title="Sender-Eigenschaften">
    <ResponseField name="phone_number" type="string">
      WhatsApp-Sender-Telefonnummer
    </ResponseField>

    <ResponseField name="display_name" type="string">
      Anzeigename des WhatsApp-Senders
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="created_at" type="string">
  ISO-8601-Zeitstempel, wann die Konversation gestartet wurde (in der konfigurierten Zeitzone des Nutzers)
</ResponseField>

<ResponseField name="ended_at" type="string">
  ISO-8601-Zeitstempel, wann die Konversation beendet wurde (in der konfigurierten Zeitzone des Nutzers)
</ResponseField>

<ResponseExample>
  ```json Conversation Ended Webhook Payload theme={null} theme={null}
  {
    "id": 1042,
    "conversation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "assistant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "type": "widget",
    "message_count": 8,
    "status": "ended",
    "extracted_variables": {
      "status": true,
      "summary": "Customer asked about pricing plans and was interested in the Pro plan"
    },
    "input_variables": {
      "name": "John Doe",
      "email": "john@example.com"
    },
    "transcript": [
      {
        "role": "assistant",
        "content": "Hi! How can I help you today?",
        "timestamp": "2026-02-23T09:30:00+01:00",
        "timestamp_unix": 1740299400
      },
      {
        "role": "user",
        "content": "I have a question about your service.",
        "timestamp": "2026-02-23T09:31:12+01:00",
        "timestamp_unix": 1740299472
      },
      {
        "role": "assistant",
        "content": "Of course! I'd be happy to help. What would you like to know?",
        "timestamp": "2026-02-23T09:31:18+01:00",
        "timestamp_unix": 1740299478
      },
      {
        "role": "user",
        "content": "What are your pricing plans?",
        "timestamp": "2026-02-23T09:32:05+01:00",
        "timestamp_unix": 1740299525
      }
    ],
    "formatted_transcript": "AI: Hi! How can I help you today?\nCustomer: I have a question about your service.\nAI: Of course! I'd be happy to help. What would you like to know?\nCustomer: What are your pricing plans?",
    "attachments": [],
    "customer_phone": null,
    "customer_name": "John Doe",
    "sender": null,
    "created_at": "2026-02-23T09:30:00+01:00",
    "ended_at": "2026-02-23T10:00:00+01:00"
  }
  ```

  ```json WhatsApp Conversation Ended Webhook theme={null} theme={null}
  {
    "id": 1043,
    "conversation_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "assistant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "type": "whatsapp",
    "message_count": 12,
    "status": "ended",
    "extracted_variables": {
      "status": true,
      "summary": "Customer scheduled an appointment for next week"
    },
    "input_variables": {},
    "transcript": [
      {
        "role": "user",
        "content": "Hello, I'd like to book an appointment",
        "timestamp": "2026-02-23T14:00:00+01:00",
        "timestamp_unix": 1740315600
      },
      {
        "role": "assistant",
        "content": "Hi! I'd be happy to help you book an appointment. What date works best for you?",
        "timestamp": "2026-02-23T14:00:08+01:00",
        "timestamp_unix": 1740315608
      },
      {
        "role": "user",
        "content": "[Image]",
        "timestamp": "2026-02-23T14:05:30+01:00",
        "timestamp_unix": 1740315930
      }
    ],
    "formatted_transcript": "Customer: Hello, I'd like to book an appointment\nAI: Hi! I'd be happy to help you book an appointment. What date works best for you?\nCustomer: [Image]",
    "attachments": [
      {
        "type": "image",
        "url": "https://storage.famulor.de/conversations/attachments/abc123.jpg",
        "filename": "appointment-form.jpg"
      }
    ],
    "customer_phone": "+1234567890",
    "customer_name": null,
    "sender": {
      "phone_number": "+19876543210",
      "display_name": "My Business"
    },
    "created_at": "2026-02-23T14:00:00+01:00",
    "ended_at": "2026-02-23T14:25:00+01:00"
  }
  ```
</ResponseExample>

## Retry-Verhalten

Wenn dein Webhook-Endpunkt einen Nicht-2xx-Statuscode zurückgibt oder die Anfrage fehlschlägt, wiederholt das System den Versand:

| Versuch  | Verzögerung  |
| -------- | ------------ |
| 1. Retry | 30 Sekunden  |
| 2. Retry | 60 Sekunden  |
| 3. Retry | 120 Sekunden |

Nach 3 fehlgeschlagenen Versuchen wird die Webhook-Zustellung als fehlgeschlagen markiert und es erfolgen keine weiteren Retries.

## Wichtige Hinweise

* `conversation_id` und `assistant_id` sind UUIDs, keine Integer-IDs
* Das Feld `sender` ist nur bei WhatsApp-Konversationen befüllt; bei Web-Widget-Konversationen ist es `null`
* `customer_phone` ist nur bei WhatsApp-Konversationen verfügbar
* `customer_name` stammt aus Pre-Chat-Formulardaten oder dem Konversationskontext
* Zeitstempel verwenden die konfigurierte Zeitzone des Nutzers (ISO-8601-Format)
* `extracted_variables` werden aus der Post-Call-Schema-Auswertung deines Assistenten befüllt
* `input_variables` enthalten Daten aus Pre-Chat-Formularen (Web Widget) oder Automatisierungs-Flows
* Das `attachments`-Array listet Medien (Bilder, Videos, Dokumente) auf, die während der Konversation geteilt wurden — jeweils mit einer herunterladbaren `url`, nützlich zur Weiterleitung an externe Analyse-Tools. Es ist ein leeres Array, wenn keine Medien geteilt wurden (am häufigsten bei Web-Widget-Konversationen)
