Use case · Refunds and payouts
Your refund service has no spending limit.
- No rail needed
- Works with no AI at all
- We never hold your funds
{
"action_type": "refund.issue",
"resource": "order_88213",
"cost_cents": 48000,
"currency": "USD",
"metadata": { "queue": "support-tier-1" }
}Kordio answers
{
"decision": {
"outcome": "requires_approval",
"rule": "tier1_daily_refund_ceiling",
"headroom": { "window_remaining_cents": 12000 }
}
}The reservation is held while a person decides. Nothing moved, and the reason has a name.
Inside Kordio
Review the exceptions. Keep work moving.

The shape of the leak
Four things that are standing in for a policy.
- The threshold everyone knows
- Refunds under a number go through automatically. Everyone learns the number, including the automation, and the number stops meaning anything the day volumes double.
- The approval channel
- A Slack message nobody reads at 4pm on a Friday. It records that somebody clicked, not what they were approving or what the policy was.
- The service account with no ceiling
- The refund service holds the same credential it held two years ago, and nothing in the stack has an opinion about how much it may release this week.
- Nobody can answer afterwards
- When Legal or Finance asks who authorized a release, the honest answer is a log line saying the API call succeeded.
How it runs
One call, in the path you already have.
- Name the action
- An action type is a dotted string.
refund.issueandpayout.releaseare just strings, so nothing here needs a card or a rail. - Write the ceiling once
- Per action, per day, per queue, per counterparty. Held outside the service, so changing it is not a deploy and every caller inherits it.
- Route the exceptions
- Above the threshold becomes an approval over a webhook, with the reservation held meanwhile so the budget cannot be spent twice while somebody thinks.
- Require the signature
- Make your executor verify the cosignature before it releases anything. Now a caller that skipped the check cannot act, and the audit trail names the rule months later.
01
02
03
04
Why this one first
It is the only place the number already exists.
The other place teams start iscapping what an agent may spend on paid tools. If you want the record underneath all of it, that isthe ledger.
We do not use AI agents. Is this still for us?
Yes, and this is the most common misunderstanding. Anything non-human that starts a money movement has the same problem: a refund service, a payout run, a batch job, an ops tool, a support macro. Agents make it louder, not different.
Does Kordio issue the refund?
No. Kordio never executes anything and holds no funds. Your existing refund path still does the work. Kordio decides whether it may, and signs the yes so the executor can verify the authority rather than trusting the caller.
What stops someone calling the refund API directly and skipping Kordio?
Nothing, unless your executor requires a signature. That is the design: make the cosignature a precondition of executing, and a caller that skipped the check has nothing to present. A control layer only binds the paths you route through it, and we say so plainly.
How is this different from our approval workflow tool?
Those are built for humans holding cards. There is no card here and often no human. This runs in the API path, holds budget state across runs, and returns something verifiable.
What does this cost to try?
Nothing. Test mode is the full engine with no card. Model last quarter policy against test-mode agents and see what it would have stopped before you decide.