Decision codes
Reference table of every verdict Saifuro returns and what happens next.
Every spend request ends in one of these codes. A code always carries a reason and a record.
| Code | When it occurs | What happens next |
|---|---|---|
allow | Request is within the mandate and policies | Settlement proceeds through the provider |
review | Policy requires confirmation: soft limit, new category, unusual recipient | Operation waits for the mandate owner |
deny_limit | Amount limit exceeded | Denied, agent receives the reason |
deny_velocity | A frequency rule triggered | Denied, the spike is recorded |
deny_category | Category outside the mandate | Denied before the provider is contacted |
deny_expired | Mandate has expired | Denied, a new mandate is required |
deny_revoked | Mandate was revoked | Denied, effective on the next request |
deny_no_mandate | No applicable mandate found | Denied, spending without authority is not possible |
Five denial codes instead of one generic failure exist for triage. deny_limit is a finance conversation, deny_category usually means the allowed list is out of date, and deny_no_mandate is almost always a misconfigured agent.
Both the agent and the mandate owner can see which rule fired and under which policy version, without opening a support ticket.
What a decision looks like
A 720 dollar purchase against the procurement mandate from core concepts, which caps single transactions at 500:
{
"decision": "dec_91c4",
"request": {
"agent": "agt_procurement_01",
"amount": 720.00,
"recipient": "vendor:acme_saas",
"category": "saas"
},
"verdict": "deny_limit",
"reason": "amount 720.00 exceeds per_transaction limit 500.00",
"mandate": "mnd_7f3a",
"policy_version": "pol_2026-08-12.3",
"nonce": "n_4c81ba97",
"issued_at": "2026-08-20T14:02:11Z",
"signature": "..."
}The policy version is what makes the verdict reconstructable later. The same request under a different rule set may resolve differently, and the log says which one applied.
Every verdict is signed over the fields above. An allow also carries a short expiry, after which it can no longer be presented for settlement. An approval therefore cannot be replayed for a second purchase or reused at a larger amount, and a counterparty can verify one without access to Saifuro. See the threat model.
Field names above are illustrative. The canonical schema ships with the integration tooling at onboarding.

