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

# Webhooks

> Empfange Anrufergebnisse, Transkripte und Analysen in Echtzeit in deinen eigenen Systemen

Webhooks senden Daten von telli in Echtzeit an deine Systeme. Sobald während eines Anrufs etwas passiert, schickt telli eine POST-Anfrage an den Endpoint, den du konfiguriert hast. So aktualisierst du CRM-Einträge, qualifizierst Leads und stößt Follow-ups an, ohne die API abfragen zu müssen.

Ein Endpoint kann alle Event-Typen empfangen. Für die meisten Integrationen genügt deshalb eine einzige URL.

## Events

| Event                                                                          | Wird gesendet, wenn                                                            |
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| [`call_ended`](/de/webhooks/events/call-ended)                                 | Ein Anruf einen Endzustand erreicht hat und die Analyse gelaufen ist           |
| [`auto_dialer_status_changed`](/de/webhooks/events/auto-dialer-status-changed) | Ein Kontakt den Auto-Dialer betritt oder verlässt                              |
| [`contact_status_changed`](/de/webhooks/events/contact-status-changed)         | Sich der Status eines Kontakts ändert. Veraltet, wird am 1. Juli 2027 entfernt |

Jede Event-Seite dokumentiert die vollständige Payload Feld für Feld.

## Voraussetzungen

* Ein telli-Konto mit API-Zugriff
* Eine Endpoint-URL, die POST-Anfragen annimmt, entweder von deinem eigenen Dienst oder von einer Automatisierungsplattform wie [Zapier](/de/integrations/zapier), [Make](/de/integrations/make) oder [n8n](/de/integrations/n8n)

## Endpoint hinzufügen

<Steps>
  <Step title="Endpoint anlegen">
    Lege in deinem eigenen Dienst oder deiner Automatisierungsplattform eine URL an, die POST-Anfragen annimmt, und kopiere sie.
  </Step>

  <Step title="Webhook-Portal öffnen">
    Gehe in telli zu **Einstellungen > Entwickler** und klicke unter **Webhook-Konfiguration** auf **Konfigurieren**.

    <img className="block dark:hidden" src="https://mintcdn.com/telli/ChKLaNvNIdyJ0pnq/images/webhook-configure-light.png?fit=max&auto=format&n=ChKLaNvNIdyJ0pnq&q=85&s=494d62b663664b5e0a23c773a0a5b53a" alt="Das Webhook-Konfigurationsfenster in den telli-Entwicklereinstellungen" width="2880" height="1440" data-path="images/webhook-configure-light.png" />

    <img className="hidden dark:block" src="https://mintcdn.com/telli/ChKLaNvNIdyJ0pnq/images/webhook-configure-dark.png?fit=max&auto=format&n=ChKLaNvNIdyJ0pnq&q=85&s=7aebddee42f73eaa6d10c1e09c28fb68" alt="Das Webhook-Konfigurationsfenster in den telli-Entwicklereinstellungen" width="2880" height="1440" data-path="images/webhook-configure-dark.png" />
  </Step>

  <Step title="URL hinzufügen">
    Klicke auf **Add Endpoint**, füge deine URL ein und klicke auf **Add**.

    <img className="block dark:hidden" src="https://mintcdn.com/telli/04zvWx53Iz0ReCTi/images/add-endpoint-light.png?fit=max&auto=format&n=04zvWx53Iz0ReCTi&q=85&s=28a6fe7e270dde5c989a592fed1384a2" alt="Das Formular für einen neuen Endpoint mit URL-Feld und Event-Auswahl" width="2880" height="1440" data-path="images/add-endpoint-light.png" />

    <img className="hidden dark:block" src="https://mintcdn.com/telli/04zvWx53Iz0ReCTi/images/add-endpoint-dark.png?fit=max&auto=format&n=04zvWx53Iz0ReCTi&q=85&s=eaa08afed27275e3a7e755c0ff7999e2" alt="Das Formular für einen neuen Endpoint mit URL-Feld und Event-Auswahl" width="2880" height="1440" data-path="images/add-endpoint-dark.png" />
  </Step>

  <Step title="Events auswählen">
    Aktiviere die Events, die dieser Endpoint empfangen soll. Du kannst alle aktiviert lassen — dein Handler kann anhand des Felds `event` verzweigen.
  </Step>

  <Step title="Testen">
    Starte einen Testanruf aus deinem telli-Konto. Prüfe anschließend im Webhook-Portal, ob die Nachricht zugestellt wurde und dein System wie erwartet reagiert hat.
  </Step>
</Steps>

<iframe width="560" height="315" src="https://www.loom.com/embed/d7efb65d2fe44b5fa0bf9bfbf27162ef?sid=6cf819e5-9a43-473c-93a9-3b0aff850520" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen />

<br />

## Nachrichten bestätigen

Gib innerhalb von 15 Sekunden einen 2xx-Statuscode (200–299) zurück, damit eine Nachricht als verarbeitet gilt. Alles andere — ein Fehlerstatus, ein Timeout, eine abgebrochene Verbindung — zählt als Fehlschlag, und die Nachricht wird erneut zugestellt.

Wenn deine Verarbeitung länger als 15 Sekunden dauert, bestätige die Nachricht zuerst und erledige die Arbeit anschließend asynchron.

<Tip>
  Deaktiviere den CSRF-Schutz für deinen Endpoint, sonst werden Webhook-POST-Anfragen abgewiesen, bevor dein Handler überhaupt läuft.
</Tip>

## Signaturen verifizieren

Jede Nachricht ist signiert, damit du prüfen kannst, dass sie von telli stammt und nicht von jemandem, der an deine URL sendet. Die Verifizierung ist optional, wird in der Produktion aber empfohlen. Svix erklärt, [warum du Webhooks verifizieren solltest](https://docs.svix.com/receiving/verifying-payloads/why).

Dein Signatur-Secret findest du im Webhook-Portal unter **Webhook-Konfiguration** im telli-Dashboard.

<Accordion title="Node.js-Beispiel">
  ```javascript theme={null}
  import { Webhook } from "svix";

  // Kopiere dies aus der Webhook-Konfiguration im telli-Dashboard
  const secret = "whsec_GET_THIS_FROM_THE_DASHBOARD";

  // Diese Header kommen mit jeder Webhook-Nachricht
  const headers = {
    "svix-id": "msg_p5jXN8AQM9LWM0D4loKWxJek",
    "svix-timestamp": "1614265330",
    "svix-signature": "v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=",
  };

  // Der rohe, nicht geparste Request-Body
  const body = '{"test": 2432232314}';

  const wh = new Webhook(secret);

  // Wirft bei einem Fehler, gibt bei Erfolg die verifizierte Payload zurück
  const payload = wh.verify(body, headers);
  ```
</Accordion>

Die [Verifizierungsdokumentation von Svix](https://docs.svix.com/receiving/verifying-payloads/how) enthält entsprechende Beispiele für Python, Go, Java, PHP und weitere Sprachen.

## Erneute Zustellversuche

Fehlgeschlagene Zustellungen werden automatisch mit exponentiellem Backoff wiederholt. Jede Wartezeit beginnt, nachdem der vorherige Versuch fehlgeschlagen ist:

| Versuch | Wartezeit nach dem vorherigen Fehlschlag |
| ------- | ---------------------------------------- |
| 1       | Sofort                                   |
| 2       | 5 Sekunden                               |
| 3       | 5 Minuten                                |
| 4       | 30 Minuten                               |
| 5       | 2 Stunden                                |
| 6       | 5 Stunden                                |
| 7       | 10 Stunden                               |
| 8       | 10 Stunden                               |

Eine Nachricht, die dreimal fehlschlägt und dann ankommt, wird rund 35 Minuten und 5 Sekunden nach dem ersten Versuch zugestellt. Wenn ein Endpoint entfernt oder deaktiviert wird, werden auch seine ausstehenden Zustellversuche eingestellt.

Du kannst jede Nachricht außerdem jederzeit manuell über das Webhook-Portal erneut senden oder mit **Recover** alle fehlgeschlagenen Nachrichten ab einem bestimmten Datum wiederholen.
