Control is the rules layer. Two engines — Policy and Risk — co-evaluate every intent, grant, issue, redeem, and checkout. Decisions are server-side; agents cannot bypass their own rules.Documentation Index
Fetch the complete documentation index at: https://docs.getovra.com/llms.txt
Use this file to discover all available pages before exploring further.
The two engines
Policy Engine
Pure function
evaluatePolicy(policy, input) → { allowed, requiresApproval, reason }. Deterministic, declarative, plan-tier-agnostic.Risk Engine
Stateful. 5 signals (velocity, amount-anomaly, geo, session, time-anomaly). Score 0–100 with tunable thresholds for review/deny/freeze.
Policy: what can be expressed
Policies are JSON-serializable objects attached to an agent (one policy per agent at a time). The full schema lives in/concepts/policies — here’s the surface:
| Group | Fields |
|---|---|
| Limits | maxTransactionEuros, dailyLimitEuros, weeklyLimitEuros, monthlyLimitEuros |
| Approval | autoApproveLimitEuros, enforcementLevel (enforce / approve / warn) |
| Merchant | merchantAllowlist, merchantBlocklist, allowedMccs, blockedMccs, lockToFirstMerchant |
| Geo | allowedCountries, blockedCountries (ISO 3166-1 alpha-2) |
| Time | activeHoursStart, activeHoursEnd, timezone, allowedDays, cooldownMinutes |
| Lifecycle | expiresAfterMinutes, expirationAction (freeze / close / notify), maxUsageCount |
| Required behavior | requireIntent (sacred — never silently dropped), requireAttestation |
Risk: signals and thresholds
| Signal | What it checks | Default weight |
|---|---|---|
velocity | N transactions in M minutes vs baseline | High |
amount-anomaly | Z-score against historical spend mean/stddev | High |
geo | New country vs policy + history; “impossible travel” | Medium |
session | User-Agent / IP cluster anomalies | Medium |
time-anomaly | Outside business hours or stated active windows | Low |
| Threshold | Default | Action |
|---|---|---|
thresholdReview | 70 | Hold for human approval |
thresholdDeny | 85 | Reject the intent |
thresholdFreeze | 95 | Freeze the agent (opt-in, default off) |
Where Control runs
decision_logs with the full signal payload, the score, the reason, and the action taken. Queryable via /audit and /risk/violations.
Card-controls sync
When you change a policy, the system translates the relevant fields into card-issuer-native controls (MCC rules, country rules, per-tx limits) and pushes them to the underlying card. Policy is the source of truth; the card mirror is best-effort and is reconciled on every update.Approval workflow
WhenenforcementLevel: "approve" or risk action is review, the intent enters pending_approval. Approve via:
POST /intents/:id/deny with an optional reason.
Quick example — read an agent’s policy
Pre-built presets
policy-presets.ts ships templates for common patterns: travel-only, subscriptions, dev-tools, etc. Use them as starting points in the dashboard create flow.
Surfaces
| Surface | Capability |
|---|---|
| REST | GET/POST/PATCH /policies, GET /risk/violations, PATCH /risk/config |
| SDK | policies.* |
| MCP | ovra_policy (read-only by design) |
| Dashboard | /dashboard/policies, /dashboard/risk, /dashboard/agents/:id |
Next
Policies
Full field reference with examples for each rule.
Intents
The approval-bearing primitive Control gates.
Intelligence
What Control writes — decision logs, audit, anomaly detection.
Disputes
What happens when something Control allowed turns out to be wrong.
