Webhooks
Webhooks
Sección titulada «Webhooks»La puerta de enlace (Gateway) puede exponer un pequeño endpoint HTTP de webhook para activadores 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.pathes/hooksde forma predeterminada.
Autenticación
Sección titulada «Autenticación»Cada solicitud debe incluir el token del enlace (hook). Se prefieren los encabezados:
Authorization: Bearer <token>(recomendado)x-openclaw-token: <token>- Los tokens en la cadena de consulta (query-string) se rechazan (
?token=...devuelve400). - Trate a los titulares de
hooks.tokencomo llamadores de plena confianza para la superficie de entrada del enlace en esa puerta de enlace. El contenido del payload del enlace sigue sin ser de confianza, pero este no es un límite de autenticación independiente para no propietarios.
Endpoints
Sección titulada «Endpoints»POST /hooks/wake
Sección titulada «POST /hooks/wake»Payload:
{ "text": "System line", "mode": "now" }textobligatorio (cadena): La descripción del evento (por ejemplo, “Nuevo correo recibido”).modeopcional (now|next-heartbeat): Si se debe activar un latido inmediato (predeterminadonow) o esperar hasta la siguiente verificación periódica.
Efecto:
- Pone en cola un evento del sistema para la sesión principal
- Si
mode=now, activa un latido 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 (cadena): El aviso o mensaje para que el agente lo procese.nameopcional (cadena): Nombre legible por humanos para el enlace (por ejemplo, “GitHub”), que se usa como prefijo en los resúmenes de sesión.agentIdopcional (cadena): Enruta este enlace a un agente específico. Los IDs desconocidos vuelven al agente predeterminado. Cuando se establece, el enlace se ejecuta utilizando el espacio de trabajo y la configuración del agente resuelto.sessionKeyopcional (cadena): La clave utilizada para identificar la sesión del agente. De forma predeterminada, este campo se rechaza a menos quehooks.allowRequestSessionKey=true.wakeModeopcional (now|next-heartbeat): Si se debe activar un latido inmediato (predeterminadonow) o esperar hasta la siguiente verificación periódica.deliveropcional (booleano): Sitrue, la respuesta del agente se enviará al canal de mensajería. El valor predeterminado estrue. Las respuestas que son solo confirmaciones de latido se omiten automáticamente.channelopcional (cadena): El canal de mensajería para la entrega. Uselasto cualquier canal o id de plugin configurado, por ejemplodiscord,matrix,telegramowhatsapp. El valor predeterminado eslast.toopcional (cadena): 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). El valor predeterminado es el último destinatario en la sesión principal.modelopcional (cadena): Anulación del modelo (por ejemplo,anthropic/claude-sonnet-4-6o un alias). Debe estar en la lista de modelos permitidos si está restringido.thinkingopcional (cadena): Anulación del nivel de pensamiento (por ejemplo,low,medium,high).timeoutSecondsopcional (número): Duración máxima para la ejecución del agente en segundos.
Efecto:
- Ejecuta un turno de agente aislado (clave de sesión propia)
- Siempre publica un resumen en la sesión principal
- Si
wakeMode=now, activa un latido inmediato
Política de clave de sesión (cambio importante)
Sección titulada «Política de clave de sesión (cambio importante)»Las anulaciones de carga útil sessionKey de /hooks/agent están deshabilitadas de forma predeterminada.
- Recomendado: establezca una
hooks.defaultSessionKeyfija y mantenga las anulaciones de solicitud desactivadas. - Opcional: permitir anulaciones de solicitud solo cuando sea necesario y restringir 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 enlace personalizados se resuelven a través de hooks.mappings (ver configuración). Un mapeo puede
convertir cargas útiles arbitrarias en acciones wake o agent, con plantillas opcionales o
transformaciones de código.
Opciones de mapeo (resumen):
hooks.presets: ["gmail"]habilita el mapeo incorporado de Gmail.hooks.mappingsle permite definirmatch,actiony plantillas en la configuración.hooks.transformsDir+transform.modulecarga un módulo JS/TS para lógica personalizada.hooks.transformsDir(si está configurado) debe permanecer dentro de la raíz de transformaciones en su directorio de configuración de OpenClaw (típicamente~/.openclaw/hooks/transforms).transform.moduledebe resolverse dentro del directorio de transformaciones efectivo (se rechazan las rutas de cruce/escape).
- Use
match.sourcepara mantener un punto final de ingestión genérico (enrutamiento basado en payload). - Las transformaciones TS requieren un cargador TS (ej.
bunotsx) o.jsprecompilado en tiempo de ejecución. - Configure
deliver: true+channel/toen las asignaciones para enrutar las respuestas a una superficie de chat (channelpor defecto eslasty se respalda a WhatsApp). agentIdenruta el enlace a un agente específico; los IDs desconocidos vuelven al agente predeterminado.hooks.allowedAgentIdsrestringe el enrutamiento explícito deagentId. Omita esto (o incluya*) para permitir cualquier agente. Establezca[]para denegar el enrutamiento explícito deagentId.hooks.defaultSessionKeyestablece la sesión predeterminada para las ejecuciones del agente de enlace cuando no se proporciona una clave explícita.hooks.allowRequestSessionKeycontrola si los payloads/hooks/agentpueden establecersessionKey(predeterminado:false).hooks.allowedSessionKeyPrefixesopcionalmente restringe los valores explícitos desessionKeyde los payloads de solicitud y las asignaciones.allowUnsafeExternalContent: truedesactiva el contenedor de seguridad de contenido externo para ese enlace (peligroso; solo para fuentes internas confiables).openclaw webhooks gmail setupescribe la configuraciónhooks.gmailparaopenclaw webhooks gmail run. Consulte Gmail Pub/Sub para ver el flujo completo de Gmail watch.
Respuestas
Sección titulada «Respuestas»200para/hooks/wake200para/hooks/agent(ejecución asíncrona aceptada)401en caso de fallo de autenticación429después de fallos de autenticación repetidos del mismo cliente (verificarRetry-After)400en caso de payload no válido413en payloads sobredimensionados
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ñada model al payload del agente (o mapeo) para anular el modelo para 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 aplica agents.defaults.models, asegúrese de que el modelo de anulación esté incluido allí.
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»- Mantenga los endpoints de enlace detrás de loopback, tailnet o un proxy inverso de confianza.
- Utilice un token de enlace dedicado; no reutilice tokens de autenticación de gateway.
- Prefiera un agente de enlace dedicado con
tools.profileestrictas y sandboxing para que el ingreso del enlace tenga un radio de explosión más estrecho. - Los fallos de autenticación repetidos están limitados por velocidad por dirección de cliente para frenar los intentos de fuerza bruta.
- Si utiliza el enrutamiento multiagente, establezca
hooks.allowedAgentIdspara limitar la selección explícita deagentId. - Mantenga
hooks.allowRequestSessionKey=falsea menos que requiera sesiones seleccionadas por el llamador. - Si habilita la solicitud de
sessionKey, restrinjahooks.allowedSessionKeyPrefixes(por ejemplo,["hook:"]). - Evite incluir cargas útiles sin procesar sensibles en los registros de webhooks.
- Los payloads de enlace se tratan como no confiables y se envuelven con límites de seguridad de forma predeterminada.
Si debe deshabilitar esto para un enlace específico, establezca
allowUnsafeExternalContent: trueen el mapeo de ese enlace (peligroso).