OpenClaw Webhooks einrichten: HTTP-Trigger in 5 Minuten
Kennst du das? Du hast einen externen Service oder ein Skript, das ein Ereignis registriert, aber dein Agent bekommt davon nichts mit. Ständiges Polling ist ineffizient und verbraucht unnötig Ressourcen. Webhooks lösen dieses Problem, indem sie dein Gateway für externe Trigger öffnen und so eine sofortige Reaktion ermöglichen.
Webhooks
Abschnitt betitelt „Webhooks“Gateway kann einen kleinen HTTP-Webhook-Endpunkt für externe Trigger bereitstellen.
Aktivieren
Abschnitt betitelt „Aktivieren“{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", // Optional: restrict explicit `agentId` routing to this allowlist. // Omit or include "*" to allow any agent. // Set [] to deny all explicit `agentId` routing. allowedAgentIds: ["hooks", "main"], },}Hinweise:
hooks.tokenist erforderlich, wennhooks.enabled=truegesetzt ist.hooks.pathhat den Standardwert/hooks.
Authentifizierung
Abschnitt betitelt „Authentifizierung“Jeder Request muss den Hook-Token enthalten. Nutze am besten Header:
Authorization: Bearer <token>(empfohlen)x-openclaw-token: <token>- Token in der Query-String werden abgelehnt (
?token=...gibt einen400Fehler zurück). - Behandle Inhaber von
hooks.tokenals vertrauenswürdige Aufrufer für die Hook-Ingress-Oberfläche dieses Gateways. Der Inhalt des Hook-Payloads gilt weiterhin als nicht vertrauenswürdig, aber dies ist keine separate Authentifizierungsgrenze für Nicht-Besitzer.
Endpunkte
Abschnitt betitelt „Endpunkte“POST /hooks/wake
Abschnitt betitelt „POST /hooks/wake“Payload:
{ "text": "System line", "mode": "now" }texterforderlich (String): Die Beschreibung des Ereignisses (z. B. “Neue E-Mail empfangen”).modeoptional (now|next-heartbeat): Legt fest, ob sofort ein Heartbeat ausgelöst wird (Standardnow) oder ob bis zum nächsten periodischen Check gewartet wird.
Effekt:
- Reiht ein System-Ereignis für die Main-Session ein.
- Löst einen sofortigen Heartbeat aus, falls
mode=nowkonfiguriert ist.
POST /hooks/agent
Abschnitt betitelt „POST /hooks/agent“Payload:
{ "message": "Run this", "name": "Email", "agentId": "hooks", "sessionKey": "hook:email:msg-123", "wakeMode": "now", "deliver": true, "channel": "last", "to": "+15551234567", "model": "openai/gpt-5.2-mini", "thinking": "low", "timeoutSeconds": 120}messageerforderlich (String): Der Prompt oder die Nachricht, die der Agent verarbeiten soll.nameoptional (String): Lesbarer Name für den Hook (z. B. “GitHub”), der als Präfix in Session-Zusammenfassungen erscheint.agentIdoptional (String): Routet diesen Hook an einen spezifischen Agenten. Unbekannte IDs nutzen den Standard-Agenten. Wenn gesetzt, läuft der Hook im Workspace und mit der Konfiguration des jeweiligen Agenten.sessionKeyoptional (String): Der Key zur Identifizierung der Agent-Session. Dieses Feld wird standardmäßig abgelehnt, außerhooks.allowRequestSessionKey=trueist aktiv.wakeModeoptional (now|next-heartbeat): Bestimmt, ob sofort ein Heartbeat ausgelöst wird (Standardnow) oder erst beim nächsten Check.deliveroptional (Boolean): Beitruewird die Antwort des Agenten an den Messaging-Channel gesendet. Standard isttrue. Antworten, die nur Heartbeat-Bestätigungen sind, werden automatisch übersprungen.channeloptional (String): Der Messaging-Channel für die Zustellung. Nutzelastoder eine konfigurierte Channel- oder Plugin-ID wiediscord,matrix,telegramoderwhatsapp. Standard istlast.tooptional (String): Die Empfänger-ID für den Channel (z. B. Telefonnummer für WhatsApp/Signal, Chat-ID für Telegram, Channel-ID für Discord/Slack/Mattermost, Conversation-ID für Microsoft Teams). Standardmäßig wird der letzte Empfänger der Main-Session genutzt.modeloptional (String): Überschreibt das Modell (z. B.anthropic/claude-sonnet-4-6oder ein Alias). Muss bei Einschränkungen in der Liste der erlaubten Modelle stehen.thinkingoptional (String): Überschreibt das Thinking-Level (z. B.low,medium,high).timeoutSecondsoptional (Number): Maximale Dauer für den Agent-Run in Sekunden.
Effekt:
- Führt einen isolierten Agent-Turn aus (eigener Session-Key) und postet immer eine Zusammenfassung in die Main-Session.
- Löst einen sofortigen Heartbeat aus, wenn
wakeMode=nowgesetzt ist.
Session-Key-Richtlinie (Breaking Change)
Abschnitt betitelt „Session-Key-Richtlinie (Breaking Change)“Überschreibungen des sessionKey im /hooks/agent Payload sind standardmäßig deaktiviert.
- Empfehlung: Setze einen festen
hooks.defaultSessionKeyund erlaube keine Überschreibungen per Request. - Optional: Erlaube Überschreibungen nur bei Bedarf und schränke die Präfixe ein.
Empfohlene Konfiguration:
{ hooks: { enabled: true, token: "${OPENCLAW_HOOKS_TOKEN}", defaultSessionKey: "hook:ingress", allowRequestSessionKey: false, allowedSessionKeyPrefixes: ["hook:"], },}Kompatibilitäts-Konfiguration (Legacy-Verhalten):
{ hooks: { enabled: true, token: "${OPENCLAW_HOOKS_TOKEN}", allowRequestSessionKey: true, allowedSessionKeyPrefixes: ["hook:"], // strongly recommended },}POST /hooks/<name> (Mapped)
Abschnitt betitelt „POST /hooks/<name> (Mapped)“Eigene Hook-Namen werden über hooks.mappings aufgelöst. Ein Mapping kann beliebige Payloads in wake oder agent Aktionen umwandeln, optional mit Templates oder Code-Transformationen.
Mapping-Optionen (Zusammenfassung):
hooks.presets: ["gmail"]aktiviert das integrierte Gmail-Mapping.hooks.mappingserlaubt die Definition vonmatch,actionund Templates in der Config.hooks.transformsDir+transform.modulelädt ein JS/TS-Modul für eigene Logik.hooks.transformsDirmuss (falls gesetzt) innerhalb des Transforms-Ordners unter deinem OpenClaw-Konfigurationsverzeichnis liegen (meist~/.openclaw/hooks/transforms).transform.modulemuss innerhalb des effektiven Transforms-Verzeichnisses aufgelöst werden (Traversal-Pfade werden abgelehnt).- Nutze
match.sourcefür einen generischen Ingest-Endpunkt (Payload-basiertes Routing). - TS-Transforms benötigen einen TS-Loader (z. B.
bunodertsx) oder vorkompilierte.js-Dateien zur Laufzeit. - Setze
deliver: true+channel/toin Mappings, um Antworten an eine Chat-Oberfläche zu routen (channelnutzt standardmäßiglastmit Fallback auf WhatsApp). agentIdroutet den Hook an einen spezifischen Agenten; unbekannte IDs fallen auf den Standard-Agenten zurück.hooks.allowedAgentIdsschränkt das expliziteagentIdRouting ein. Lass es weg (oder nutze*), um jeden Agenten zu erlauben. Nutze[], um explizites Routing zu verbieten.hooks.defaultSessionKeylegt die Standard-Session für Hook-Agent-Runs fest, wenn kein Key angegeben wurde.hooks.allowRequestSessionKeysteuert, ob/hooks/agentPayloads densessionKeysetzen dürfen (Standard:false).hooks.allowedSessionKeyPrefixesschränkt optional explizitesessionKey-Werte aus Requests und Mappings ein.allowUnsafeExternalContent: truedeaktiviert den Sicherheits-Wrapper für externen Content bei diesem Hook (gefährlich; nur für vertrauenswürdige interne Quellen).openclaw webhooks gmail setupschreibt diehooks.gmailKonfiguration füropenclaw webhooks gmail run. Details findest du unter Gmail Pub/Sub.
Antworten
Abschnitt betitelt „Antworten“200für/hooks/wake200für/hooks/agent(Async-Run akzeptiert)401bei Authentifizierungsfehlern429nach wiederholten Fehlversuchen vom selben Client (prüfeRetry-After)400bei ungültigem Payload413bei zu großen Payloads
Beispiele
Abschnitt betitelt „Beispiele“curl -X POST http://127.0.0.1:18789/hooks/wake \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"text":"New email received","mode":"now"}'curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'x-openclaw-token: SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"Summarize inbox","name":"Email","wakeMode":"next-heartbeat"}'Ein anderes Modell nutzen
Abschnitt betitelt „Ein anderes Modell nutzen“Füge model zum Agent-Payload (oder Mapping) hinzu, um das Modell für diesen Run zu überschreiben:
curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'x-openclaw-token: SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.2-mini"}'Falls du agents.defaults.models erzwingst, stelle sicher, dass das Modell dort gelistet ist.
curl -X POST http://127.0.0.1:18789/hooks/gmail \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"source":"gmail","messages":[{"from":"Ada","subject":"Hello","snippet":"Hi"}]}'Sicherheit
Abschnitt betitelt „Sicherheit“- Betreibe Hook-Endpunkte hinter Loopback, Tailnet oder einem vertrauenswürdigen Reverse Proxy.
- Nutze einen dedizierten Hook-Token; verwende keine Gateway-Auth-Token wieder.
- Ich empfehle einen dedizierten Hook-Agenten mit striktem
tools.profileund Sandboxing, um den Radius bei Problemen klein zu halten. - Wiederholte Authentifizierungsfehler werden pro Client-Adresse limitiert, um Brute-Force-Angriffe zu bremsen.
- Nutze
hooks.allowedAgentIdsbei Multi-Agent-Routing, um die Auswahl deragentIdzu begrenzen. - Belasse
hooks.allowRequestSessionKey=false, außer du benötigst vom Aufrufer gewählte Sessions. - Falls du
sessionKeyin Requests erlaubst, schränke dies überhooks.allowedSessionKeyPrefixesein (z. B.["hook:"]). - Vermeide es, sensible Rohdaten in Webhook-Logs zu schreiben.
- Hook-Payloads werden als nicht vertrauenswürdig behandelt und standardmäßig durch Sicherheitsgrenzen isoliert.
- Deaktiviere dies nur im Ausnahmefall für spezifische Hooks mit
allowUnsafeExternalContent: trueim Mapping (gefährlich).
Nächste Schritte
Abschnitt betitelt „Nächste Schritte“OpenClaw Expert
Noch festgefahren?
Wenn diese Seite nicht hilft, frage OpenClaw Expert nach Schritt-fuer-Schritt-Loesungen.