The control layer ยท Versus card limits

The card said yes. Nineteen times.

A virtual card limit stops one transaction that is too big. It does not stop the same reasonable-looking charge nineteen times, and it never sees the paid API call that is not a card transaction at all. Kordio runs before the rail and applies caps, windows and allowlists across payments and tool calls together.

Where it holds

A card limit is a real control.

Enforcement at the rail, and it works.

Spend controls on a card or a virtual account are real enforcement, not advice. The issuer declines the charge whether or not your code is healthy, whether or not the agent cooperates, and for a single ceiling that is genuinely enough.

It is also the thing standing between you and an agent that bypasses everything else. Kordio holds no funds and declines nothing at the rail, so if something skips the check entirely, the card is what is left. That is a reason to keep it, not to replace it.

Every decision is recorded in an append-only audit trail, linked by trace id, on every tier. See what comes back

Keep the card when
You need a hard floor that holds even if your own systems are compromised, and a ceiling on any single transaction that no software of yours can raise.
It stops being enough when
Spend arrives as many small compliant charges, or leaves through an API bill that never touches a card, or you need to know which agent did it and under what rule.

Blind spots

Nothing on the card can see intent.

The rail evaluates one transaction against one ceiling. That is the right job for a rail, and it leaves four things unanswered on an agent operation.

In front of the rail

Kordio answers before the charge exists.

POST /v1/agent/actionsbefore the charge
{
  "action_type": "payment.create",
  "resource": "supplier.example.com",
  "cost_cents": 42000,
  "currency": "USD",
  "session_id": "ses_01HXKJZM2"
}
Kordio answers
{
  "decision": "denied",
  "rule": "rate_limit.supplier_repeat",
  "remaining_cents": 0,
  "trace_id": "trc_01HXKJZM2Q"
}
The nineteenth attempt is denied by a rule the card never had: how many times this agent already did this.

One budget, across both kinds of spend.

An action type is a dotted string like payment.create or tool.invoke, and an agent's caps, windows, rate limits and allowlists apply across all of them together. Spend on the model bill consumes headroom for the supplier payment, because it is one budget rather than two systems that never speak.

Anything over a threshold is held for a person instead of declined outright, and every allowed decision comes back signed, so whoever executes verifies the authority rather than trusting the agent.

See a full decision

Running both

Keep the card. Put a gate in front of it.

These are not alternatives. One is a floor that holds no matter what your software does, the other knows what the agent was doing. Most teams that get this right run both.
What the card stops
A single charge over the ceiling, declined at the rail whether or not your code is healthy.
What it never sees
The same charge repeated, the paid tool call, the shared budget, and the rule that decided.

What comes up next

Questions from teams already issuing cards.

Do we have to move off our card program?+

No. Kordio holds no funds and issues nothing. Your cards keep working exactly as they do now, and the check runs before the charge is made.

Our card already has a per-transaction limit.+

Good, keep it. It is the floor under everything. What it cannot see is the same charge repeated, or the paid API call that is not a card transaction at all.

What about virtual cards issued per agent?+

Closer, and still per rail. One card per agent does not know what that agent spent on model calls, and a new card per task is its own operational problem.

If an agent charges the card without asking Kordio, what happens?+

The card limit is what stops it, which is why you keep both. Kordio governs the paths you route through it, so the executor should require a signature.

Gate a real charge in test mode.

Sandbox keys in five minutes, no card, running the same policy engine as live mode. Live tiers from $49/mo.