# Webhooks

Empfangen Sie Chat- und Anrufereignisse eines Kunden an Ihrem eigenen Endpunkt, signiert und überprüfbar

> Full REST + WebSocket API reference: https://api.happ.tools/reference

Empfangen Sie Chat- und Anrufereignisse in Echtzeit auf Ihrem eigenen Server — Happ sendet bei jedem Ereignis JSON per POST, sodass Sie damit Slack-Benachrichtigungen, CRM-Abfragen, Analysen oder eigene Workflows auslösen können.

<WebhooksPageDemo />

## Verbinden [#connect]

1. Öffnen Sie den Katalog **Integrationen** und klicken Sie bei **Chat Webhook** oder **Call Webhook** auf **Verbinden**.
2. Geben Sie im Dialog Ihre **Webhook-URL** ein — den HTTPS-Endpunkt, der die Ereignisse empfängt.
3. Legen Sie optional ein **Webhook Secret** zur Überprüfung der Anfragen fest.
4. Klicken Sie auf **Verbinden**.

Es gibt keine separate Webhook-Seite, keine Schalter für Ereignisabonnements und kein Zustellprotokoll in der App — der Dialog besteht nur aus URL und optionalem Secret.

## Gesendete Ereignisse [#events-sent]

| Webhook | Wird ausgelöst bei                                                                                                         |
| ------- | -------------------------------------------------------------------------------------------------------------------------- |
| Chat    | Jeder Nachricht in einem beobachteten Chat — vom Kunden, vom Agenten und von einem Mitarbeiter                             |
| Anruf   | Ende eines Anrufs — eine einzige Zustellung nach dem Anruf mit Dauer, Metadaten und der Aufzeichnungs-URL, falls vorhanden |

## Anruf-Ereignis [#call-event]

Der Anruf-Webhook sendet pro beendetem Anruf ein flaches JSON-Objekt (kein verschachteltes `result_json`). Die wichtigsten Felder:

| Feld                        | Bedeutung                                                                                                                                                                                                  |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `event_type`                | Immer `post_call`                                                                                                                                                                                          |
| `call_uuid`                 | Eindeutige Anruf-ID — danach deduplizieren, derselbe Anruf kann mehrfach ankommen                                                                                                                          |
| `externalNumber`            | Telefonnummer des Kunden, dieselbe wie im Anrufverlauf; `null`, wenn es keine gab (z. B. Web-Anruf)                                                                                                        |
| `direction`                 | `inbound`, `outbound` oder `null`                                                                                                                                                                          |
| `summary`, `callSuccessful` | KI-Zusammenfassung und Urteil: `success`, `failure` oder `unknown`                                                                                                                                         |
| `dynamicVariables`          | Die Variablen, mit denen der Anruf gestartet wurde, kommen zurück — übergeben Sie beim Start Ihre CRM-Kontakt- oder Bestell-ID und lesen Sie sie hier. VA-Systemvariablen (`system__*`) werden weggelassen |

Vollständiges Schema und Beispiel: [api.happ.tools/reference](https://api.happ.tools/reference).

## Anfragen überprüfen [#verifying-requests]

Wenn Sie ein Webhook Secret festlegen, enthält jede Zustellung zwei Header:

| Header          | Wert                                                                             |
| --------------- | -------------------------------------------------------------------------------- |
| `Authorization` | `Basic <secret>` — Ihr Secret unverändert, nicht base64 von `user:password`      |
| `X-Signature`   | `sha256=<hex>` — HMAC-SHA256 des rohen Anfrage-Bodys, berechnet mit Ihrem Secret |

Zur Überprüfung berechnen Sie HMAC-SHA256 über den rohen Body (vor dem Parsen des JSON) neu und vergleichen das Ergebnis in konstanter Zeit. Gibt Ihre Plattform keinen Zugriff auf den rohen Body, prüfen Sie stattdessen den Header `Authorization`. Ohne Secret wird keiner der beiden Header gesendet. Es ist derselbe Mechanismus wie bei den [Tools](/docs/agents/tools) eines Agenten.

Verwenden Sie nur HTTPS, antworten Sie schnell mit `200` (Verarbeitung asynchron) und behandeln Sie doppelte Zustellungen idempotent.

## Webhooks vs. Tool-Webhooks [#webhooks-vs-tool-webhooks]

|              | Integrations-Webhooks                           | Tool-Webhooks                               |
| ------------ | ----------------------------------------------- | ------------------------------------------- |
| Auslöser     | Automatisch bei Ereignissen                     | Von der KI während des Gesprächs aufgerufen |
| Richtung     | Happ → Ihr Server                               | Happ → Ihr Server → Antwort → KI            |
| Antwort      | HTTP-200-Bestätigung                            | JSON, das der Agent nutzt                   |
| Einsatzzweck | Monitoring, Protokollierung, Benachrichtigungen | Dynamische Abfragen, Aktionen               |

Für Webhooks, die die KI mitten im Gespräch aufruft, siehe [Tools](/docs/agents/tools).

**API:** [api.happ.tools/reference](https://api.happ.tools/reference)

## Weiter [#next]

* [Tools](/docs/agents/tools) — von der KI aufgerufene Webhooks
* [Benachrichtigungen](/docs/integrations/notifications) — integrierte Benachrichtigungen
* [Integrationen](/docs/integrations) — der vollständige Katalog
