Webhooks
La passerelle peut exposer un petit point de terminaison HTTP webhook pour des déclencheurs externes.
Activer
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
// Optionnel : restreindre le routage explicite `agentId` à cette liste d'autorisation.
// Omettre ou inclure "*" pour autoriser n'importe quel agent.
// Définir [] pour refuser tout routage explicite `agentId`.
allowedAgentIds: ["hooks", "main"],
},
}
Notes :
hooks.tokenest requis lorsquehooks.enabled=true.hooks.pathest par défaut/hooks.
Authentification
Chaque requête doit inclure le jeton du webhook. Préférez les en-têtes :
Authorization: Bearer <token>(recommandé)x-openclaw-token: <token>- Les jetons dans la chaîne de requête sont rejetés (
?token=...retourne400).
Points de terminaison
POST /hooks/wake
Charge utile :
{ "text": "System line", "mode": "now" }
textrequis (string) : La description de l'événement (par exemple, "Nouvel e-mail reçu").modeoptionnel (now|next-heartbeat) : Déclenche un battement de cœur immédiat (par défautnow) ou attend la prochaine vérification périodique.
Effet :
- Met en file d'attente un événement système pour la session principale
- Si
mode=now, déclenche un battement de cœur immédiat
POST /hooks/agent
Charge utile :
{
"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
}
messagerequis (string) : L'invite ou le message que l'agent doit traiter.nameoptionnel (string) : Nom lisible par un humain pour le webhook (par exemple, "GitHub"), utilisé comme préfixe dans les résumés de session.agentIdoptionnel (string) : Achemine ce webhook vers un agent spécifique. Les ID inconnus reviennent à l'agent par défaut. Lorsqu'il est défini, le webhook s'exécute en utilisant l'espace de travail et la configuration de l'agent résolu.sessionKeyoptionnel (string) : La clé utilisée pour identifier la session de l'agent. Par défaut, ce champ est rejeté sauf sihooks.allowRequestSessionKey=true.wakeModeoptionnel (now|next-heartbeat) : Déclenche un battement de cœur immédiat (par défautnow) ou attend la prochaine vérification périodique.deliveroptionnel (boolean) : Sitrue, la réponse de l'agent sera envoyée au canal de messagerie. Par défauttrue. Les réponses qui ne sont que des accusés de réception de battement de cœur sont automatiquement ignorées.channeloptionnel (string) : Le canal de messagerie pour la livraison. Un parmi :last,whatsapp,telegram,discord,slack,mattermost(plugin),signal,imessage,msteams. Par défautlast.tooptionnel (string) : L'identifiant du destinataire pour le canal (par exemple, numéro de téléphone pour WhatsApp/Signal, ID de chat pour Telegram, ID de canal pour Discord/Slack/Mattermost (plugin), ID de conversation pour MS Teams). Par défaut le dernier destinataire dans la session principale.modeloptionnel (string) : Surcharge du modèle (par exemple,anthropic/claude-3-5-sonnetou un alias). Doit être dans la liste des modèles autorisés si restreint.thinkingoptionnel (string) : Surcharge du niveau de réflexion (par exemple,low,medium,high).timeoutSecondsoptionnel (number) : Durée maximale de l'exécution de l'agent en secondes.
Effet :
- Exécute un tour d'agent isolé (sa propre clé de session)
- Poste toujours un résumé dans la session principale
- Si
wakeMode=now, déclenche un battement de cœur immédiat
Politique de clé de session (changement cassant)
Les surcharges sessionKey dans la charge utile /hooks/agent sont désactivées par défaut.
- Recommandé : définir une
hooks.defaultSessionKeyfixe et garder les surcharges par requête désactivées. - Optionnel : autoriser les surcharges par requête uniquement lorsque nécessaire, et restreindre les préfixes.
Configuration recommandée :
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: false,
allowedSessionKeyPrefixes: ["hook:"],
},
}
Configuration de compatibilité (comportement hérité) :
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
allowRequestSessionKey: true,
allowedSessionKeyPrefixes: ["hook:"], // fortement recommandé
},
}
POST /hooks/<name> (mappé)
Les noms de webhooks personnalisés sont résolus via hooks.mappings (voir configuration). Un mappage peut transformer des charges utiles arbitraires en actions wake ou agent, avec des modèles ou des transformations de code optionnels. Options de mappage (résumé) :
hooks.presets: ["gmail"]active le mappage Gmail intégré.hooks.mappingspermet de définirmatch,actionet des modèles dans la configuration.hooks.transformsDir+transform.modulecharge un module JS/TS pour une logique personnalisée.hooks.transformsDir(si défini) doit rester dans la racine des transformations sous votre répertoire de configuration OpenClaw (typiquement~/.openclaw/hooks/transforms).transform.moduledoit se résoudre dans le répertoire effectif des transformations (les chemins de traversée/échappement sont rejetés).
- Utilisez
match.sourcepour garder un point de terminaison d'ingestion générique (routage piloté par la charge utile). - Les transformations TS nécessitent un chargeur TS (par exemple
bunoutsx) ou un.jsprécompilé au moment de l'exécution. - Définissez
deliver: true+channel/tosur les mappages pour acheminer les réponses vers une surface de chat (channelpar défautlastet revient à WhatsApp). agentIdachemine le webhook vers un agent spécifique ; les ID inconnus reviennent à l'agent par défaut.hooks.allowedAgentIdsrestreint le routage expliciteagentId. Omettez-le (ou incluez*) pour autoriser n'importe quel agent. Définissez[]pour refuser le routage expliciteagentId.hooks.defaultSessionKeydéfinit la session par défaut pour les exécutions d'agent webhook lorsqu'aucune clé explicite n'est fournie.hooks.allowRequestSessionKeycontrôle si les charges utiles/hooks/agentpeuvent définirsessionKey(par défaut :false).hooks.allowedSessionKeyPrefixesrestreint optionnellement les valeurssessionKeyexplicites provenant des charges utiles de requête et des mappages.allowUnsafeExternalContent: truedésactive l'enveloppe de sécurité du contenu externe pour ce webhook (dangereux ; uniquement pour des sources internes de confiance).openclaw webhooks gmail setupécrit la configurationhooks.gmailpouropenclaw webhooks gmail run. Voir Gmail Pub/Sub pour le flux complet de surveillance Gmail.
Réponses
200pour/hooks/wake200pour/hooks/agent(exécution asynchrone acceptée)401en cas d'échec d'authentification429après des échecs d'authentification répétés du même client (vérifiezRetry-After)400en cas de charge utile invalide413en cas de charge utile trop volumineuse
Exemples
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"}'
Utiliser un modèle différent
Ajoutez model à la charge utile de l'agent (ou au mappage) pour surcharger le modèle pour cette exécution :
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"}'
Si vous appliquez agents.defaults.models, assurez-vous que le modèle de surcharge y est inclus.
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"}]}'
Sécurité
- Gardez les points de terminaison webhook derrière loopback, tailnet ou un proxy inverse de confiance.
- Utilisez un jeton webhook dédié ; ne réutilisez pas les jetons d'authentification de la passerelle.
- Les échecs d'authentification répétés sont limités en débit par adresse client pour ralentir les tentatives de force brute.
- Si vous utilisez le routage multi-agent, définissez
hooks.allowedAgentIdspour limiter la sélection expliciteagentId. - Gardez
hooks.allowRequestSessionKey=falsesauf si vous avez besoin de sessions sélectionnées par l'appelant. - Si vous activez
sessionKeypar requête, restreignezhooks.allowedSessionKeyPrefixes(par exemple,["hook:"]). - Évitez d'inclure des charges utiles brutes sensibles dans les journaux des webhooks.
- Les charges utiles des webhooks sont traitées comme non fiables et enveloppées avec des limites de sécurité par défaut. Si vous devez désactiver cela pour un webhook spécifique, définissez
allowUnsafeExternalContent: truedans le mappage de ce webhook (dangereux).