Skip to main content
Side-effecting integration actions and destructive actions pause the run until someone approves them. Read-only actions do not pause. The rules are in the workspace under Integrations, on Approval settings.

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 includes status, 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 and thread_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, unless TOOL_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 send tool_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.

Approve from Telegram, Slack, or Teams

When your workspace turns these on, the approval message in Telegram can include Allow once and Deny. Slack can use the Fetch Hive app in a channel or in direct messages. Teams can use the Fetch Hive Approvals app in a channel or a personal chat. Anyone who can see the Telegram chat can press the buttons, as long as their Telegram is linked to a member of the workspace. A Slack or Teams user who is not linked is asked to link their account first. Teams connects when someone sends the one-time code from Approval notifications. Always allow is not offered in chat. A destructive action has no Allow button. Open Fetch Hive to review it. A decision in the app, in Telegram, in Slack, or in Teams updates that message and removes the buttons. Allowing one item once leaves the other items in a batch on their own card. Allowing or denying the rest of the run updates the whole batch.

Change the message before you allow it

When editing is on, Allow once can send a replacement for the action’s arguments. The original arguments stay on the approval. Always allow, deny, and a decision for the rest of the run cannot include a replacement. An invalid replacement stays on the card with the errors, and the action does not run.

The same action more than once

A loop that asks for the same action can be allowed or denied for the rest of that run. Later matching items follow that choice. The next run asks again. A destructive action, and a step set to always ask, still asks one by one.

Just me and everyone

A member’s Always allow can apply only to that member’s runs. An owner or admin can apply it to the whole workspace, and can lock a workspace rule so a personal allow does not override it. API-key and webhook runs use workspace rules only.

Files, knowledge bases, and sub-agents

Create a file, save an artifact, write to a knowledge base, and run a sub-agent can use the same Ask or Block rules. With no rule, they run. Owners and admins set those rules on the Approvals page.

MCP Gateway

A published gateway tool can ask the person using the AI app, or ask your team, before it runs. See MCP Gateway.