Who is notified
The workspace owner and the person who requested the action get an email. Telegram is used when that channel is connected. The same request appears on the dashboard Approvals page.What the API call sees
Streaming and non-streaming both stop at the first approval round. A non-streaming response includesstatus, run_id, and thread_id. status is completed or awaiting_approval. pending_tool_approvals is present only while the run is waiting. denied_tool_calls is present only when a policy denied a call, with reason policy_deny. The response text includes [Waiting for approval: …].
A streaming call sends a tool_approval event, then the same fields on the final usage event.
review_url opens https://app.fetchhive.com/{workspace_id}/approvals?approval={approval_id} after sign-in. The email token is not in the API response. Secret-like argument values are replaced with [redacted].
If a response also includes pending_delegations, answer the tool approval first.
With tool approvals turned off, status is completed and the approval arrays are omitted.
How to answer
Open the dashboard link, use the email link, or decide with an API key:POST /v1/public/workspaces/{workspace_id}/tool_action_approvals/{id}/decide
decision is allow_once or deny. always_allow returns 422 always_allow_requires_dashboard. A second decision returns 409. An expired approval returns 410.
How to continue
An API key call resumes on the server after the decision. Poll the run or use the webhook. Do not re-invoke that thread. Re-invoke is for a first-party streaming client. Send the same agent andthread_id with decided_tool_approvals: [{ "approval_id": "…" }]. Send an empty message or a new one. Only approval_id is read.
A webhook trigger or a call with async.callback_url also resumes on its own after the decision. The callback receives agent.awaiting_approval, then agent.completed with resumed_from_run_id.
Expiry and the round limit
An approval expires 24 hours after it is created, unlessTOOL_APPROVAL_TTL_HOURS is set. A run chain stops after five approval rounds and appends [Approval limit reached].
Always allow
Always allow is set in the dashboard. An API key cannot create that policy.Skip approvals for a trusted server
A workspace owner or admin can allow an API key to auto-approve actions. In Settings → API keys, check “Allow this key to auto-approve actions”. Members cannot change that checkbox. A request made with that key can sendtool_approval: "auto_approve" on POST /v1/agent/invoke. That applies to this call only. It does not change the agent’s saved setting and it does not write a policy. Omitting the field, or sending policy, follows the workspace rules and any auto-approve switch already saved on the agent, schedule, or deployment.
Destructive actions still ask. Deny rules still block the action. Any other value returns 400 invalid_tool_approval before the run starts.
A key without the permission, a signed-in editor token, or a webhook returns 403 tool_approval_override_not_permitted before any model call. When auto-approve is turned off for the workspace, the same code is returned with the message “Auto-approve is not available for this workspace.”
A sub-agent called during that run receives the same tool_approval value and the same API key. A workflow the agent starts does not. The workflow follows its own deployment switch.
The response echoes tool_approval as auto_approve or policy. When an action ran because of an override, the response also includes auto_approved_tool_calls, each with summary and tool_name. A streaming call puts both fields on the final usage event.

