Configura Webhooks en OpenClaw: Guía de integración rápida
¿Alguna vez has sentido que integrar disparadores externos con tu flujo de trabajo es más complicado de lo que debería? Configurar sistemas que reaccionen a eventos en tiempo real suele implicar lidiar con configuraciones pesadas o procesos de polling que consumen recursos innecesarios.
Los Webhooks en Gateway te permiten conectar eventos externos de forma directa y sin complicaciones. Con esta funcionalidad, puedes exponer un endpoint HTTP pequeño para que herramientas de terceros activen acciones específicas en tu sistema de manera inmediata.
Webhooks
Sección titulada «Webhooks»Gateway puede exponer un endpoint de webhook HTTP pequeño para disparadores externos.
Habilitar
Sección titulada «Habilitar»{ 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"], },}Notas:
hooks.tokenes obligatorio cuandohooks.enabled=true.hooks.pathtiene el valor por defecto/hooks.
Autenticación
Sección titulada «Autenticación»Cada solicitud debe incluir el token del hook. Es mejor usar headers:
Authorization: Bearer <token>(recomendado)x-openclaw-token: <token>- Los tokens en query-string se rechazan (
?token=...devuelve400). - Trata a quienes tengan el
hooks.tokencomo llamadores de total confianza para la superficie de entrada del hook en ese Gateway. El contenido del payload del hook sigue considerándose no confiable, pero esto no es un límite de autenticación separado para no propietarios.
Endpoints
Sección titulada «Endpoints»POST /hooks/wake
Sección titulada «POST /hooks/wake»Payload:
{ "text": "System line", "mode": "now" }textobligatorio (string): La descripción del evento (por ejemplo, “Nuevo correo recibido”).modeopcional (now|next-heartbeat): Indica si se debe activar un heartbeat inmediato (por defectonow) o esperar a la siguiente revisión periódica.
Efecto:
- Encola un evento de sistema para la sesión main.
- Si
mode=now, activa un heartbeat inmediato.
POST /hooks/agent
Sección titulada «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}messageobligatorio (string): El prompt o mensaje que el agente debe procesar.nameopcional (string): Nombre legible para el hook (por ejemplo, “GitHub”), usado como prefijo en los resúmenes de sesión.agentIdopcional (string): Dirige este hook a un agente específico. Los IDs desconocidos usan al agente por defecto. Cuando se configura, el hook se ejecuta usando el workspace y la configuración del agente resuelto.sessionKeyopcional (string): La clave usada para identificar la sesión del agente. Por defecto, este campo se rechaza a menos quehooks.allowRequestSessionKey=true.wakeModeopcional (now|next-heartbeat): Indica si se debe activar un heartbeat inmediato (por defectonow) o esperar a la siguiente revisión periódica.deliveropcional (boolean): Si estrue, la respuesta del agente se enviará al canal de mensajería. Por defecto estrue. Las respuestas que son solo confirmaciones de heartbeat se omiten automáticamente.channelopcional (string): El canal de mensajería para la entrega. Usalasto cualquier canal configurado o ID de plugin, por ejemplodiscord,matrix,telegramowhatsapp. Por defecto eslast.toopcional (string): El identificador del destinatario para el canal (por ejemplo, número de teléfono para WhatsApp/Signal, ID de chat para Telegram, ID de canal para Discord/Slack/Mattermost (plugin), ID de conversación para Microsoft Teams). Por defecto es el último destinatario en la sesión principal.modelopcional (string): Sobrescribe el modelo (por ejemplo,anthropic/claude-sonnet-4-6o un alias). Debe estar en la lista de modelos permitidos si existen restricciones.thinkingopcional (string): Sobrescribe el nivel de pensamiento (por ejemplo,low,medium,high).timeoutSecondsopcional (number): Duración máxima para la ejecución del agente en segundos.
Efecto:
- Ejecuta un turno de agente aislado (con su propia clave de sesión).
- Siempre publica un resumen en la sesión main.
- Si
wakeMode=now, activa un heartbeat inmediato.
Política de clave de sesión (cambio importante)
Sección titulada «Política de clave de sesión (cambio importante)»Las sobrescrituras de sessionKey en el payload de /hooks/agent están desactivadas por defecto.
- Recomendado: configura un
hooks.defaultSessionKeyfijo y mantén desactivadas las sobrescrituras en las solicitudes. - Opcional: permite sobrescrituras en las solicitudes solo cuando sea necesario y restringe los prefijos.
Configuración recomendada:
{ hooks: { enabled: true, token: "${OPENCLAW_HOOKS_TOKEN}", defaultSessionKey: "hook:ingress", allowRequestSessionKey: false, allowedSessionKeyPrefixes: ["hook:"], },}Configuración de compatibilidad (comportamiento heredado):
{ hooks: { enabled: true, token: "${OPENCLAW_HOOKS_TOKEN}", allowRequestSessionKey: true, allowedSessionKeyPrefixes: ["hook:"], // strongly recommended },}POST /hooks/<name> (mapeado)
Sección titulada «POST /hooks/<name> (mapeado)»Los nombres de hooks personalizados se resuelven mediante hooks.mappings (ver configuración). Un mapeo puede convertir payloads arbitrarios en acciones wake o agent, con plantillas opcionales o transformaciones de código.
Opciones de mapeo (resumen):
hooks.presets: ["gmail"]habilita el mapeo integrado de Gmail.hooks.mappingste permite definirmatch,actiony plantillas en la configuración.hooks.transformsDir+transform.modulecarga un módulo JS/TS para lógica personalizada.hooks.transformsDir(si se configura) debe permanecer dentro de la raíz de transformaciones bajo tu directorio de configuración de OpenClaw (normalmente~/.openclaw/hooks/transforms).transform.moduledebe resolverse dentro del directorio de transformaciones efectivo (se rechazan rutas de escape o salto de directorios).
- Usa
match.sourcepara mantener un endpoint de entrada genérico (enrutamiento basado en el payload). - Las transformaciones en TS requieren un cargador de TS (como
bunotsx) o archivos.jsprecompilados en tiempo de ejecución. - Configura
deliver: true+channel/toen los mapeos para dirigir las respuestas a una interfaz de chat (channelpor defecto eslasty recurre a WhatsApp). agentIddirige el hook a un agente específico; los IDs desconocidos usan al agente por defecto.hooks.allowedAgentIdsrestringe el enrutamiento explícito deagentId. Omítelo (o incluye*) para permitir cualquier agente. Usa[]para denegar el enrutamiento explícito deagentId.hooks.defaultSessionKeyestablece la sesión por defecto para las ejecuciones de agentes vía hook cuando no se proporciona una clave explícita.hooks.allowRequestSessionKeycontrola si los payloads de/hooks/agentpueden configurarsessionKey(por defecto:false).hooks.allowedSessionKeyPrefixesrestringe opcionalmente los valores explícitos desessionKeyde los payloads de solicitud y mapeos.allowUnsafeExternalContent: truedesactiva el envoltorio de seguridad de contenido externo para ese hook (peligroso; solo para fuentes internas de confianza).openclaw webhooks gmail setupescribe la configuraciónhooks.gmailparaopenclaw webhooks gmail run. Consulta Gmail Pub/Sub para ver el flujo completo de monitoreo de Gmail.
Respuestas
Sección titulada «Respuestas»200para/hooks/wake200para/hooks/agent(ejecución asíncrona aceptada)401en caso de fallo de autenticación429tras fallos repetidos de autenticación desde el mismo cliente (revisaRetry-After)400si el payload no es válido413si el payload excede el tamaño permitido
Ejemplos
Sección titulada «Ejemplos»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"}'Usar un modelo diferente
Sección titulada «Usar un modelo diferente»Añade model al payload del agente (o al mapeo) para sobrescribir el modelo en esa ejecución:
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 obligas a usar agents.defaults.models, asegúrate de que el modelo de sobrescritura esté incluido en esa lista.
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"}]}'Seguridad
Sección titulada «Seguridad»- Mantén los endpoints de los hooks detrás de loopback, tailnet o un reverse proxy de confianza.
- Usa un token dedicado para los hooks; no reutilices los tokens de autenticación del Gateway.
- Es preferible usar un agente dedicado para hooks con un
tools.profileestricto y sandboxing para que la entrada de hooks tenga un radio de impacto limitado. - Los fallos repetidos de autenticación tienen un límite de tasa por dirección de cliente para frenar intentos de fuerza bruta.
- Si usas enrutamiento multi-agente, configura
hooks.allowedAgentIdspara limitar la selección explícita deagentId. - Mantén
hooks.allowRequestSessionKey=falsea menos que necesites sesiones seleccionadas por el llamador. - Si habilitas
sessionKeyen las solicitudes, restringehooks.allowedSessionKeyPrefixes(por ejemplo,["hook:"]). - Evita incluir payloads crudos sensibles en los logs de los webhooks.
- Los payloads de los hooks se tratan como no confiables y se envuelven con límites de seguridad por defecto.
- Si debes desactivar esto para un hook específico, configura
allowUnsafeExternalContent: trueen el mapeo de ese hook (esto es peligroso).
Pasos siguientes
Sección titulada «Pasos siguientes»OpenClaw Expert
Sigues atascado?
Si esta pagina no resolvio tu caso, pregunta a OpenClaw Expert para pasos concretos.