requireIntent is one of the sacred invariants — never silently dropped, never bypassed.
The intent model
| Field | Description |
|---|---|
id | int_* |
agentId | Owning agent |
cardId / cardName | Which card to charge — exactly one of these |
purpose | Free text — surfaces in audit and dashboard |
expectedAmountEuros | Optional but strongly recommended |
expectedMerchant | Optional but strongly recommended |
recurring | Optional — cadence (daily/weekly/monthly/yearly) + tolerance windows |
clientIntentId | Optional client-side dedupe key |
ttlMinutes | Default 24h, max 30 days (43200) |
status | FSM (below) |
Lifecycle (FSM)
| Status | Meaning |
|---|---|
pending_approval | Policy or risk requires a human |
approved | Auto-approved or human-approved; ready to pay |
completed | Successfully settled |
denied | Rejected by policy or risk |
failed | Settlement failed downstream |
expired | TTL passed |
cancelled | Owner cancelled before settlement |
Create an intent
pending_approval, approve via dashboard or API.
Approve / deny
Recurring intents
A single intent can authorize a series of charges, with tolerance windows on amount and time:Verification (post-settlement)
After a charge completes you can record the actual amount and merchant for reconciliation:actualAmountEuros deviates from expectedAmountEuros beyond the policy’s amountTolerancePercent, the intent is flagged.
Webhooks
| Event | When |
|---|---|
intent.created | Intent insert |
intent.approved | Status flip to approved |
intent.denied | Policy or risk rejected |
intent.expired | TTL hit |
intent.cancelled | Owner cancelled |
Surfaces
| Surface | Capability |
|---|---|
| REST | /intents, /intents/:id/{approve,deny,verify,cancel} |
| SDK | ovra.intents.* |
| MCP | ovra_intent (action: declare · get · cancel · verify) |
| Dashboard | /dashboard/intents (list, drawer, approve/deny inline) |
Next
Policies
The rules that drive
approved vs pending_approval vs denied.Pay
What happens after
approved.Transactions
The record a settled intent produces.
Webhooks
React to FSM transitions in real time.
