Quién recibe el aviso
El propietario del workspace y quien pidió la acción reciben un correo. Telegram se usa cuando ese canal está conectado. La misma solicitud aparece en la página Aprobaciones del panel.Qué ve la llamada de API
La invocación con y sin streaming se detiene en la primera ronda de aprobación. Una respuesta sin streaming incluyestatus, run_id y thread_id. status es completed o awaiting_approval. pending_tool_approvals solo está presente mientras la ejecución espera. denied_tool_calls solo está presente cuando una política denegó una llamada, con reason policy_deny. El texto de la respuesta incluye [Waiting for approval: …].
Una llamada con streaming envía un evento tool_approval y luego los mismos campos en el evento usage final.
review_url abre https://app.fetchhive.com/{workspace_id}/approvals?approval={approval_id} después de iniciar sesión. El token del correo no está en la respuesta de la API. Los valores de argumentos que parecen secretos se sustituyen por [redacted].
Si la respuesta también incluye pending_delegations, responde primero la aprobación de la herramienta.
Con las aprobaciones desactivadas, status es completed y se omiten los arrays de aprobación.
Cómo responder
Abre el enlace del panel, usa el enlace del correo, o decide con una clave de API:POST /v1/public/workspaces/{workspace_id}/tool_action_approvals/{id}/decide
decision es allow_once o deny. always_allow devuelve 422 always_allow_requires_dashboard. Una segunda decisión devuelve 409. Una aprobación caducada devuelve 410.
Cómo continuar
Una llamada con clave de API se reanuda en el servidor después de la decisión. Consulta la ejecución o usa el webhook. No vuelvas a invocar ese hilo. Volver a invocar es para un cliente de streaming de primera parte. Envía el mismo agente ythread_id con decided_tool_approvals: [{ "approval_id": "…" }]. Envía message vacío o un mensaje nuevo. Solo se lee approval_id.
Un disparador webhook o una llamada con async.callback_url se reanuda sola después de la decisión. El callback recibe agent.awaiting_approval y luego agent.completed con resumed_from_run_id.
Caducidad y límite de rondas
Una aprobación caduca 24 horas después de crearse, salvo queTOOL_APPROVAL_TTL_HOURS esté definido. Una cadena de ejecución se detiene tras cinco rondas de aprobación y añade [Approval limit reached].
Permitir siempre
Permitir siempre se configura en el panel. Una clave de API no puede crear esa política.Omitir aprobaciones para un servidor de confianza
Un propietario o administrador del workspace puede permitir que una clave de API apruebe acciones automáticamente. En Configuración → Claves de API, marca “Permitir que esta clave apruebe acciones automáticamente”. Los miembros no pueden cambiar esa casilla. Una solicitud hecha con esa clave puede enviartool_approval: "auto_approve" en POST /v1/agent/invoke. Se aplica solo a esa llamada. No cambia el ajuste guardado del agente ni escribe una política. Omitir el campo, o enviar policy, sigue las reglas del workspace y cualquier interruptor de aprobación automática ya guardado en el agente, la programación o el despliegue.
Las acciones destructivas siguen pidiendo aprobación. Las reglas de denegación siguen bloqueando la acción. Cualquier otro valor devuelve 400 invalid_tool_approval antes de que empiece la ejecución.
Una clave sin el permiso, un token del editor con sesión iniciada o un webhook devuelven 403 tool_approval_override_not_permitted antes de cualquier llamada al modelo. Cuando la aprobación automática está desactivada para el workspace, se devuelve el mismo código con el mensaje “Auto-approve is not available for this workspace.”
Un subagente llamado durante esa ejecución recibe el mismo valor de tool_approval y la misma clave de API. Un flujo de trabajo que inicia el agente no lo recibe. El flujo sigue el interruptor de su propio despliegue.
La respuesta repite tool_approval como auto_approve o policy. Cuando una acción se ejecutó por una excepción, la respuesta también incluye auto_approved_tool_calls, cada uno con summary y tool_name. Una llamada con streaming pone ambos campos en el evento usage final.

