Spend and customer-contact actions can be gated so an agent proposes the action and a human confirms it before anything happens.

How it works

  1. Create a key with requires_approval: true.
  2. When that key triggers a spend action (e.g. send a campaign), the Gateway does not dispatch. It returns a job in pending_approval:
  3. An approval.requested webhook fires (if subscribed). A human reviews and resolves it:
  4. On approve, the deferred action is released (the real pipeline dispatches) and the job moves to queuedsucceeded. On deny, the job becomes cancelled with APPROVAL_DENIED.
The agent simply keeps polling the job — it transparently transitions once a human acts.
Resolving an approval requires the agent:admin scope. Build dashboards or chat ops around the approval.requested event so approvals are one click.