Webhooks
Das Gateway kann einen kleinen HTTP-Webhook-Endpunkt für externe Trigger bereitstellen.
Aktivieren
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
// Optional: explizites `agentId`-Routing auf diese Allowlist beschränken.
// Weglassen oder "*" einfügen, um jeden Agent zu erlauben.
// Auf [] setzen, um jedes explizite `agentId`-Routing zu verweigern.
allowedAgentIds: ["hooks", "main"],
},
}
Hinweise:
hooks.tokenist erforderlich, wennhooks.enabled=true.hooks.pathhat den Standard/hooks.
Authentifizierung
Jede Anfrage muss das Hook-Token enthalten. Bevorzuge Header:
Authorization: Bearer <token>(empfohlen)x-openclaw-token: <token>- Query-String-Tokens werden abgelehnt (
?token=...gibt400zurück).
Endpunkte
POST /hooks/wake
Payload:
{ "text": "System line", "mode": "now" }
texterforderlich (string): Die Beschreibung des Events (z.B. “Neue E-Mail eingegangen”).modeoptional (now|next-heartbeat): Ob ein sofortiger Heartbeat ausgelöst (Standardnow) oder auf die nächste periodische Prüfung gewartet werden soll.
Wirkung:
- Reiht ein System-Event für die Main-Session ein
- Bei
mode=nowwird ein sofortiger Heartbeat ausgelöst
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): Menschenlesbarer Name für den Hook (z.B. “GitHub”), wird als Präfix in Session-Zusammenfassungen verwendet.agentIdoptional (string): Diesen Hook an einen bestimmten Agent routen. Unbekannte IDs fallen auf den Standard-Agent zurück. Wenn gesetzt, nutzt der Hook den Workspace und die Konfiguration des aufgelösten Agents.sessionKeyoptional (string): Der Schlüssel zur Identifizierung der Agent-Session. Standardmäßig wird dieses Feld abgelehnt, es sei dennhooks.allowRequestSessionKey=true.wakeModeoptional (now|next-heartbeat): Ob ein sofortiger Heartbeat ausgelöst (Standardnow) oder auf die nächste periodische Prüfung gewartet werden soll.deliveroptional (boolean): Wenntrue, wird die Antwort des Agents 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. Einer von:last,whatsapp,telegram,discord,slack,mattermost(Plugin),signal,imessage,msteams. Standard istlast.tooptional (string): Die Empfänger-Kennung für den Channel (z.B. Telefonnummer für WhatsApp/Signal, Chat-ID für Telegram, Channel-ID für Discord/Slack/Mattermost (Plugin), Konversations-ID für MS Teams). Standard ist der letzte Empfänger in der Main-Session.modeloptional (string): Modell-Override (z.B.anthropic/claude-3-5-sonnetoder ein Alias). Muss in der erlaubten Modellliste stehen, falls eingeschränkt.thinkingoptional (string): Thinking-Level-Override (z.B.low,medium,high).timeoutSecondsoptional (number): Maximale Dauer für den Agent-Run in Sekunden.
Wirkung:
- Führt einen isolierten Agent-Turn aus (eigener Session-Key)
- Postet immer eine Zusammenfassung in die Main-Session
- Bei
wakeMode=nowwird ein sofortiger Heartbeat ausgelöst
Session-Key-Policy (Breaking Change)
/hooks/agent Payload-sessionKey-Overrides sind standardmäßig deaktiviert.
- Empfohlen: Einen festen
hooks.defaultSessionKeysetzen und Request-Overrides ausgeschaltet lassen. - Optional: Request-Overrides nur bei Bedarf erlauben und Präfixe einschränken.
Empfohlene Konfiguration:
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: false,
allowedSessionKeyPrefixes: ["hook:"],
},
}
Kompatibilitätskonfiguration (Legacy-Verhalten):
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
allowRequestSessionKey: true,
allowedSessionKeyPrefixes: ["hook:"], // dringend empfohlen
},
}
POST /hooks/<name> (gemappt)
Benutzerdefinierte Hook-Namen werden über hooks.mappings aufgelöst (siehe Konfiguration). Ein Mapping kann
beliebige Payloads in wake- oder agent-Aktionen umwandeln, mit optionalen Templates oder
Code-Transforms.
Mapping-Optionen (Zusammenfassung):
hooks.presets: ["gmail"]aktiviert das eingebaute Gmail-Mapping.hooks.mappingserlaubt dir,match,actionund Templates in der Konfiguration zu definieren.hooks.transformsDir+transform.modulelädt ein JS/TS-Modul für benutzerdefinierte Logik.hooks.transformsDir(falls gesetzt) muss innerhalb des Transforms-Root unter deinem OpenClaw-Konfigurationsverzeichnis bleiben (typischerweise~/.openclaw/hooks/transforms).transform.modulemuss innerhalb des effektiven Transform-Verzeichnisses aufgelöst werden (Traversal/Escape-Pfade werden abgelehnt).
- Nutze
match.source, um einen generischen Ingest-Endpunkt beizubehalten (Payload-gesteuertes Routing). - TS-Transforms erfordern einen TS-Loader (z.B.
bunodertsx) oder vorkompiliertes.jszur Laufzeit. - Setze
deliver: true+channel/toauf Mappings, um Antworten an eine Chat-Oberfläche zu routen (channelhat den Standardlastund fällt auf WhatsApp zurück). agentIdroutet den Hook an einen bestimmten Agent; unbekannte IDs fallen auf den Standard-Agent zurück.hooks.allowedAgentIdsbeschränkt explizitesagentId-Routing. Weglassen (oder*einfügen) erlaubt jeden Agent. Auf[]setzen verweigert explizitesagentId-Routing.hooks.defaultSessionKeysetzt die Standard-Session für Hook-Agent-Runs, wenn kein expliziter Key angegeben wird.hooks.allowRequestSessionKeysteuert, ob/hooks/agent-PayloadssessionKeysetzen dürfen (Standard:false).hooks.allowedSessionKeyPrefixesbeschränkt optional explizitesessionKey-Werte aus Request-Payloads und Mappings.allowUnsafeExternalContent: truedeaktiviert den Sicherheits-Wrapper für externen Content bei diesem Hook (gefährlich; nur für vertrauenswürdige interne Quellen).openclaw webhooks gmail setupschreibthooks.gmail-Konfiguration füropenclaw webhooks gmail run. Siehe Gmail Pub/Sub für den vollständigen Gmail-Watch-Flow.
Antworten
200für/hooks/wake200für/hooks/agent(Asynchroner Run akzeptiert)401bei Auth-Fehler429nach wiederholten Auth-Fehlern von der gleichen Client-Adresse (prüfeRetry-After)400bei ungültigem Payload413bei übergroßen Payloads
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"}'
Anderes Modell verwenden
Füge model zum Agent-Payload (oder Mapping) hinzu, um das Modell für diesen Lauf 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"}'
Wenn du agents.defaults.models erzwingst, stelle sicher, dass das Override-Modell dort enthalten 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
- Halte Hook-Endpunkte hinter Loopback, Tailnet oder einem vertrauenswürdigen Reverse-Proxy.
- Verwende ein eigenes Hook-Token; verwende keine Gateway-Auth-Tokens wieder.
- Wiederholte Auth-Fehler werden pro Client-Adresse rate-limitiert, um Brute-Force-Versuche zu verlangsamen.
- Wenn du Multi-Agent-Routing nutzt, setze
hooks.allowedAgentIds, um expliziteagentId-Auswahl einzuschränken. - Lasse
hooks.allowRequestSessionKey=false, es sei denn du brauchst Aufrufer-gewählte Sessions. - Wenn du Request-
sessionKeyaktivierst, beschränkehooks.allowedSessionKeyPrefixes(zum Beispiel["hook:"]). - Vermeide es, sensible Roh-Payloads in Webhook-Logs aufzunehmen.
- Hook-Payloads werden als nicht vertrauenswürdig behandelt und standardmäßig mit Sicherheitsgrenzen umschlossen.
Wenn du das für einen bestimmten Hook deaktivieren musst, setze
allowUnsafeExternalContent: truein dessen Mapping (gefährlich).