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.kindmust match the kind of the request the policy should cover —budget_increaseorkey_unpausetoday. An approval request is matched to a policy bykind(plus scope), so a policy whosekinddoesn’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: trueto skip human approval entirely below its own threshold. - Steps run in order. Each step’s
approversis a set of roles and/or specific user IDs;quorumis"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
- 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:
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.