# Eingehender Webhook

Der Block nimmt eine Anfrage von einem fremden Dienst entgegen und führt Ihren JavaScript-Code aus. So lässt sich das Szenario durch ein Ereignis von außen fortsetzen: Eine Zahlung ist eingegangen, der Status einer Bestellung hat sich geändert, ein Sensor hat ausgelöst.

![Einstellungspanel des Blocks „Eingehender Webhook“](https://support.watbot.org/_media/de/01-chatbots/03-blocks/06-developer/_images/incoming-webhook.webp?v=1791781229)

In diesen Block führen keine Verbindungen aus anderen Blöcken: Er wird nur durch eine Anfrage gestartet.

## Einstellungen

- **„URL für Anfragen“** — die Adresse, die aufgerufen werden muss. Der Block erhält sie beim Erstellen, sie sieht so aus: `https://api.<Domain der Plattform>/hook/<ID des Blocks>:<geheimer Schlüssel>`. Jede Methode ist geeignet — `GET`, `POST` und andere.
- **„JavaScript-Code zur Verarbeitung der Anfrage“** — der Code, der bei jeder Anfrage ausgeführt wird, bis zu 16 384 Zeichen.

> [!WARNING]
> Die Adresse enthält einen geheimen Schlüssel. Jeder, der die Adresse kennt, kann Ihren Code starten — veröffentlichen Sie sie nicht.

## Was im Code ankommt

Die Anfrage liegt im Objekt `request`:

| Feld | Was darin steht |
|---|---|
| `request.query` | Parameter aus der Abfragezeichenfolge |
| `request.headers` | Header der Anfrage, die Namen in Kleinbuchstaben |
| `request.body` | Körper der Anfrage als Zeichenfolge, so wie er angekommen ist |
| `request.data` | Alle Parameter der Anfrage zusammen: aus der Abfragezeichenfolge, dem Formular und dem Körper im JSON-Format |

Mehr zu den Feldern und dazu, wie Sie die Signatur einer Anfrage prüfen, unter [Eingebaute Variablen](https://support.watbot.org/de/api/javascript/builtins#eingehende-anfrage).

Die Anfrage kommt nicht von einer Person, deshalb muss der Code selbst angeben, für welchen Kontakt er ausgeführt wird. Dafür gibt es Funktionen:

| Funktion | Wie sie den Kontakt sucht |
|---|---|
| `setContactById(id)` | Nach der ID des Kontakts auf der Plattform |
| `setContactByTelegramId(id)` | Nach der ID der Person in Telegram |
| `setContactByMaxId(id)` | Nach der ID der Person in MAX |
| `setContactByVkId(id)` | Nach der ID der Person in VK |
| `setContactByViberId(id)` | Nach der ID der Person in Viber |

Jede Funktion ist auf der Seite [Kontakt auswählen](https://support.watbot.org/de/api/javascript/contact) ausführlich beschrieben.

Die Funktion gibt `true` zurück, wenn der Kontakt unter den Kontakten dieses Bots gefunden wurde, und `false`, wenn nicht. Eine solche Funktion lässt sich nur einmal pro Anfrage aufrufen. Mindestens eine davon muss im Code stehen — sonst antwortet der Block mit einem Fehler, und der Code startet nicht.

Sobald der Kontakt gefunden ist, stehen dem Code seine Daten (`id`, `name`, `phone` und die übrigen) und alle Funktionen des Blocks „JavaScript-Interpreter“ zur Verfügung: Variablen, Tags, `sendMessage`, `goToBlock`, `disableContinue`.

```js
var contactId = request.query.contact_id;

if (setContactById(contactId)) {
    setContactVariable('bestellstatus', request.data.status);
    sendMessage('Der Status Ihrer Bestellung hat sich geändert.');
}
```

Damit der externe Dienst die ID des Kontakts kennt, übergeben Sie sie vorab — zum Beispiel mit dem Block „HTTP-Anfrage“ und dem [Platzhalter](https://support.watbot.org/de/chatbots/templates) `{{ id }}`.

> [!IMPORTANT]
> Wird der Kontakt nicht gefunden, läuft der Code zwar durch, speichert aber nichts: Variablen, Tags und globale Variablen werden nicht geschrieben, Nachrichten nicht gesendet, die Verbindung „Fortsetzen“ wird nicht ausgelöst.

## Ausgänge

- „Fortsetzen“ — wird nach der Ausführung des Codes ausgelöst, wenn der Kontakt gefunden wurde und der Code `disableContinue()` nicht aufgerufen hat.

## Was der Block antwortet

Die Antwort ist JSON mit den Feldern `status` (`ok` oder `error`), `message` und `return_value` — dem Wert des letzten Ausdrucks im Code.

| Antwortcode | Wann |
|---|---|
| `200` | Der Code wurde ausgeführt. Wurde der Kontakt nicht gefunden, steht in `message` der Text `Code executed without setting contact` |
| `404` | Falsche Adresse: Es gibt keinen solchen Block oder der Schlüssel passt nicht |
| `422` | Fehler im Code, das Code-Feld ist leer, im Code fehlt eine Funktion zur Kontaktsuche oder der Eigentümer des Bots hat kein Pro |
| `429` | Zu viele Anfragen |

Jede Anfrage und die Antwort darauf werden im „Ausführungsprotokoll“ des Blocks festgehalten.

![„Ausführungsprotokoll“ des eingehenden Webhooks: Methode, Parameter und Body der Anfrage, Rückgabewert und Antwort des Blocks](https://support.watbot.org/_media/de/01-chatbots/03-blocks/06-developer/_images/incoming-webhook-log.webp?v=1791781229)

## Grenzen

- Der Block arbeitet nur, solange der Eigentümer des Bots ein aktives Pro hat. Mehr dazu — [was ohne Pro verfügbar ist](https://support.watbot.org/de/billing/without-pro).
- Höchstens 30 Anfragen in 10 Sekunden für einen Bot — für alle seine Blöcke „Eingehender Webhook“ zusammen — und höchstens 180 Anfragen pro Minute von einer IP-Adresse.
- Für den Code gelten dieselben Grenzen wie im Block „JavaScript-Interpreter“: ES5 und 5 Sekunden für die Ausführung.

## Anfragen von Telegram und MAX

Der Block kann alles empfangen, was der Messenger an Ihren Bot sendet. Schalten Sie im Verbindungsfenster von [Telegram](https://support.watbot.org/de/chatbots/channels/telegram) oder [MAX](https://support.watbot.org/de/chatbots/channels/max) den Schalter „Anfragen an den Block ‚Eingehender Webhook‘ weiterleiten“ ein und wählen Sie im Feld „Block“ den Block nach ID oder Name.

Danach verarbeitet zuerst der Bot jedes Ereignis des Messengers — wie gewohnt, nach dem Szenario —, und anschließend wird es an den Code des Blocks übergeben. Das Ereignis liegt in der Form, in der der Messenger es gesendet hat, in `request.data`.

So können Sie auf das reagieren, was das Szenario selbst nicht verarbeitet: Nachrichten in Gruppen und Kanälen, das Hinzufügen des Bots zu einem Chat. Anfragen des Inline-Modus von Telegram werden nicht an den Block übergeben.

```js
var message = request.data.message;

if (message && message.from && setContactByTelegramId(message.from.id)) {
    setContactTag('schrieb_in_gruppe');
    disableContinue();
}
```

Solche Ereignisse zählen zur selben Grenze für die Zahl der Anfragen pro Minute.
