Skip to main content

Approval policies

An approval policy defines a tiered, multi-step chain of approvers for a request that needs human sign-off — tiers by dollar amount, each with one or more sequential steps, each step with its own approver set and quorum.
Two things share the name require_approval, and only one of them is unavailable.Chains open today from two directions. A person requests one through POST /api/approvals, which accepts budget_increase and key_unpause. An automation rule opens one through its require_approval effect, setting the kind itself — that effect works and is exercised end to end.What is not available is the guardrail effect of the same name, which would open a chain when a policy matches a live request. Authoring that policy returns 422; see Guardrails for why.
  • kind must match the kind of the request the policy should cover — budget_increase or key_unpause today. An approval request is matched to a policy by kind (plus scope), so a policy whose kind doesn’t match one of those two never fires.
  • Tiers are matched by amount — the request’s dollar value picks which tier’s steps apply. A tier can set auto_approve: true to skip human approval entirely below its own threshold.
  • Steps run in order. Each step’s approvers is a set of roles and/or specific user IDs; quorum is "all", "any", or a specific integer count of that set who must approve before the step is satisfied and the chain moves on.
  • A step can be notify_only: true — informational, doesn’t block advancement.

Deciding an approval

A few rules the server enforces regardless of what the chain says:
  • The requester can’t approve their own request (self_approval_not_allowed).
  • A vote from someone outside the current step’s frozen approver set is rejected (not_an_approver) — the approver set is fixed when the step opens, not re-evaluated live against role changes.
  • A decision on an approval that’s no longer pending is a 409 (not_pending), not a silent no-op.
  • One-click approve/deny links are signed (HMAC) action tokens — see Errors for invalid_action_token.

Delegation

/api/delegations lets one user stand in for another’s approvals over a fixed window:

Automation rules

An automation rule reacts to an event and runs an effect — the mechanism alerts, webhooks, and other reactive behavior are built on.
Rules are evaluated in priority order, same as routing rules and guardrails. Reorder them with POST /api/automation-rules/reorder rather than editing every rule’s priority by hand.

Opening an approval from a rule

require_approval is one of the registered effect handlers a rule’s action can run, and it works today — set action.type to require_approval and give it the same kind/scope fields a direct approval request takes:
This opens a chain against a matching approval policy exactly like a direct POST /api/approvals call does, just automation-triggered instead of human-initiated. It’s unrelated to a guardrail policy’s require_approval effect, which is not available yet — see the note above and Guardrails.

Where next

Guardrails

Deny and flag rules on live requests — and why the approval effect isn’t available yet.

API reference

Full field-by-field schemas for every endpoint on this page.