Skip to main content
An Approval node parks a run until a human answers. It is the workflow way to put a person in the loop — distinct from the runtime autonomy gate that governs an agent’s tool calls.

How it behaves

  1. The run reaches the node and suspends.
  2. Someone answers it through the Management API: POST /v1/workflows/{workflow_id}/runs/{run_id}/approval with {"approved": true} or {"approved": false}. An optional comment and data ride along.
  3. The run resumes.
There is no timeout. The node waits indefinitely. Nothing auto-approves, nothing auto-rejects, and no reminder is sent.
Design for that. A workflow with an Approval node that nobody watches will sit suspended forever, holding whatever it was doing.

Two different things can park a run

Do not confuse the authored Approval node with an autonomy gate raised by a capability call inside the run. They are separate mechanisms and are answered in different places. GET /v1/workflow-runs/{run_id}/gates/pending lists the second kind. Workflow gates have no thread, so they are addressed by run rather than by thread.

Who can answer an autonomy gate on a run

An agent cannot approve its own run’s gate. That is enforced in the resolve transaction, not just in the UI.

Only two answers

Approve and deny. The broadening answers available in agent chat — “allow for this thread”, “allow always” — are rejected on a workflow run, because there is no thread and no user to broaden over.

Why a workflow step does not raise its own approval

Workflow steps are allowed inside the autonomy policy stage without consulting level or allowlists, precisely because a workflow is an authored plan — human review belongs in the graph. The hardline floor and the account denylist still apply.

Designing with it

  • Put the Approval node before the irreversible step, not after.
  • Label the node for the decision it asks for. “Approve?” tells whoever inherits the graph nothing.
  • A denial ends the run as failed; there is no deny branch to route down. If a rejection needs its own handling, model it before the Approval node.
  • If the decision needs to time out, model it explicitly with a parallel path, since the node itself will not.

Next