Everything a policy can constrain.

A policy is a fixed set of rules attached to a wallet. Every request is checked against all of them — there's no rule an agent can be exempted from by asking nicely.

perTransactionCap
Refuse any single payment over a fixed amount, per token.
rollingWindowCaps
Cap total spend within a trailing window — hour, day, month. A true sliding window, not a fixed calendar bucket, so it can’t be gamed by timing a burst across a reset boundary.
lifetimeCap
A hard ceiling the wallet can never cross, for as long as the policy applies.
payeeAllowlist
Only these addresses or domains can receive funds. A domain rule also covers its subdomains.
payeeDenylist
Never pay these addresses or domains, even if they’d otherwise qualify under an allowlist.
tokenAllowlist
Restrict which tokens the wallet is permitted to move at all.
rateLimit
Cap how many payments go out within a window, independent of amount.
timeWindows
Restrict payments to specific hours and days of the week.
escalationThreshold
Above this amount, hold for the principal’s approval instead of paying automatically.
killSwitch
Refuse everything, immediately, ahead of every other rule.

Deny always comes with a reason. Never free text.

The three decisions

Every evaluation returns exactly one of these, and all three are recorded.

ALLOW

Signs and submits. Nothing further required.

REQUIRES APPROVAL

Held for the principal. Nothing moves until it's explicitly approved.

DENY

Refused outright, with one of a fixed set of reason codes below — never free text.

Deny reason codes

  • kill_switch
  • token_not_allowlisted
  • per_transaction_cap_exceeded
  • rolling_window_cap_exceeded
  • lifetime_cap_exceeded
  • payee_not_allowlisted
  • payee_denylisted
  • rate_limit_exceeded
  • outside_time_window