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