Financial control plane

Decide before the money moves. Prove it after.

Kordio holds the rules and the record for money your software moves. Every action asks permission before it happens, and lands as a balanced posting after. Your rails move the money. Kordio holds none of it.

  • Free sandbox, no card
  • Ledger live, Control in early access
app.kordio.io/overview
The Kordio console: two actions awaiting approval, four denied of the last nineteen, 8,263.50 dollars committed against open budgets, and a list of recent decisions naming the rule that allowed or denied each one.

Non-custodial

No funds, no accounts, none of your credentials. Kordio cannot move money on its own.

Before the fact

Policy answers in the same request. No queue to poll, no callback to wait on.

After the fact

Balanced double-entry postings on an append-only journal. Corrections are reversals.

Verifiable

Allowed decisions come back signed. Your executor checks the signature offline.

How it works

Control decides. Ledger records.

Money moves without anyone deciding: a refund service issues credits, a payout run releases funds, a job retries. Kordio holds the rules in front and the record behind. It moves nothing and holds nothing.

Where a workspace has the ledger enabled, decisions are mirrored as balanced postings, so what was permitted and what posted sit in one history.

Kordio Control

Nothing spends until a rule says yes.

One call, before the money moves, answered in the same request. Your rules run in order and the first one that decided is the one named in the response.
The Kordio limits screen: 3,836.50 dollars available to commit, 8,263.50 committed against open budgets and 5,480.00 held waiting on a person, shown as one meter.
Headroom is a number your team can read, not a guess.
201Allowed

Budget reserved, decision cosigned, trace id written.

202Held

Reservation kept, an approver notified. Nothing spent.

403Denied

Nothing reserved, nothing signed, and the rule is named.

Two endpoints. That is the integration.

const decision = await kordio.authorize({
  action:   "refund.issue",
  resource: "order_88213",
  amount:   240_00,
  currency: "EUR",
}, { idempotencyKey: "refund_88213" });

if (decision.outcome === "allowed") {
  await rail.refund(order, decision.cosignature);
}

Caps, rolling windows, allowlists, approval thresholds and session budgets, applied across every action type together, so a paid tool call and a payment draw down the same headroom.

Cosigning

An agent that skipped the check has nothing to present.

Make your executor demand a signature and routing around Kordio stops being possible, because only Kordio can produce one. A required signer, holding no funds and none of your credentials.

Every allowed decision returns a compact signature over the agent, the session, the action, the resource, the amount and the currency, and it expires in minutes. Whoever executes verifies it against a public key set at /.well-known/jwks.json.

No call back to us. No shared secret. No SDK. It is ES256, so any standard JWT library checks it in any language: a payment provider, a tool call, an internal service, a third-party rail. The artifact does not care which.

ES256
Widely supported
Public JWKS
No callback
Single use
Expires in minutes
Verify anywhereES256 · public JWKS
import { jwtVerify, createRemoteJWKSet } from 'jose'

const jwks = createRemoteJWKSet(
  new URL('/.well-known/jwks.json', KORDIO_API_URL)
)

const { payload } = await jwtVerify(cosignature, jwks)

if (payload.cost_cents !== invoice.amountCents) {
  throw new Error('Authorization does not match the invoice')
}

Cryptography proves we authorized the action. It cannot prove the action has not already happened, soPOST /v1/cosign/verify resolves the intent and refuses one that already settled. An authorization is good for a single execution.

Kordio Ledger

Reconciliation is a query, not a project.

Balances are derived from an append-only journal, so matching against a processor statement is a question you ask the books rather than a job somebody maintains. Period close, trial balance and statements come from the same postings.
The Kordio ledger console: trial balance balanced, every currency ties out, with posted debits of 2,830.80 USD against credits of 2,830.80 USD and a net of zero.
The trial balance is a page, not a month-end project.

Post the same idempotency key twice and the second write returns the first result rather than paying anyone again. Multi-asset, so fiat, stablecoins and crypto sit in the same books. Live today, and plenty of the teams using it never touch an agent.

Reconciliation
Match against processor statements and see the breaks that did not match, rather than a number that quietly absorbed them.
Period close
Close a period and the books stop moving underneath you. Reopening is deliberate, never accidental.
Trial balance and statements
Generated from the postings themselves rather than a parallel pipeline that drifts away from them.
Balance at any moment
Balances are derived from an append-only journal instead of stored in a column, so any point in time is answerable.

See what the ledger does, or the honest version of the decision in build versus buy.

For finance and operations

Finance sets the ceiling. Nobody waits for finance.

The ceiling lives outside the code that spends, so raising it is a decision rather than a deploy. Anything above the line waits for a person, and the person can see exactly what they are deciding.
The Kordio console approvals queue: two actions held, 5,480 dollars in total. A 4,200 dollar payout to wise.com is expanded, showing that nothing has moved yet, how much the session and the rolling 24 hour window have left, and who asked for it, with approve and deny buttons.
The approvals queue, showing exactly what a person is being asked to decide.
Held, not refused
Set a threshold and anything above it waits for a person. The caller gets a 202 and keeps its reservation, so nothing is lost and nothing is spent while somebody decides.
The approver hears about it immediately
Everyone who can approve is emailed the moment an action is held. A webhook carries it into Slack or your own tools instead.
Writing policy and approving spend are separate
Someone who can widen a cap and then approve the payment it blocked can bypass any control. Those are deliberately different permissions.
Every change is on the record
An append-only audit trail linked by trace id: decisions, approvals, policy edits, membership changes and who made them. Nothing is edited after the fact.

Intent dashboards list every action and payment intent, show what is waiting on a human, and let someone resolve it without opening a terminal.

The boundary

What Kordio never does.

The non-custodial boundary is the architecture, not a disclaimer. A control plane does not forward packets, and this one cannot.
Never holds your funds
No accounts, no balances of yours, no custody. Your rails keep the money.
Never moves money
There is no execution path here. Your systems act on the cosignature.
Never holds your credentials
No rail keys, no processor logins, no secret that could spend for you.
Never fails open
If Kordio cannot answer, nothing is authorized and nothing is signed.
The Kordio activity log: every decision the control layer made, append-only, each row naming the status, the rule that decided, and a trace id.
Every decision, append-only, with the rule that decided and a trace id to replay it.

Pricing

Start free. Pay for authorized volume.

Kordio Control is metered on the live dollars your software is authorized to move, never on a count of API calls or decisions, and a denial is never billed. No annual commitment and no call to read the numbers.
Sandbox$0

The real policy engine against test-mode agents, with no time limit and no card. 10 agents, 25k action authorizations, 1k payment authorizations, 5 teammates. There is deliberately no free live allowance: live money needs a card.

Start in test mode →
BuildFirst live tier
$49/ month

The first live tier. One fleet of agents moving real money under policy you wrote.

  • $100,000 authorized volume / month
  • Unlimited agents
  • 25k payment authorizations / month
  • 250k action authorizations / month
  • Unlimited teammates & approvers
Choose Build →
Growth
$149/ month

Where an agent operation lands once the fleet is doing work you would miss if it stopped.

  • $500,000 authorized volume / month
  • Unlimited agents
  • 125k payment authorizations / month
  • 1.25M action authorizations / month
  • Unlimited teammates & approvers
Choose Growth →
Scale
$499/ month

Seven figures of authorized spend a month, priced at the thinnest rate on the ladder.

  • $2,000,000 authorized volume / month
  • Unlimited agents
  • 1M payment authorizations / month
  • 12.5M action authorizations / month
  • Unlimited teammates & approvers
Choose Scale →
Enterprise
Custom

Custom volume, custom limits, and a contract. Talk to us about what your agents need to be allowed to do.

  • Custom authorized volume
  • Custom limits, set with you
  • Unlimited agents
  • Unlimited teammates & approvers
  • Security review and DPA
  • Named support contact
Contact sales →

Every number here comes from the same catalogue the product bills against. The full picture is on thepricing page.

FAQ

The questions we get asked.

Anything else is in the docs at docs.kordio.io, or email tech@southpay.io and a person answers.
What is Kordio, in one sentence?+

Kordio holds the rules and the record for money your software moves. Kordio Control decides whether an action is allowed before it happens, and Kordio Ledger keeps balanced double-entry books for what did happen. The rails move the money.

Does Kordio hold my money?+

No. Kordio is a required signer, never a custodian. It holds no funds, no accounts and none of your credentials. Your rails keep the money, which is why we price on authorized volume rather than taking a cut of a payment we never touch.

Is this only useful if I run AI agents?+

No, 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. Agents make it louder and faster, they did not invent it.

What stops software from just skipping the check?+

An allowed decision comes back signed, expiring in minutes. Your executor verifies it offline against a public key set. Once the executor requires a signature, 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.

Do control decisions show up in the ledger?+

Where a workspace has the ledger enabled, decisions are mirrored as balanced postings, so what was permitted and what posted sit in one history. The projection never sits in the authorization path, so the books can never slow a decision down.

What happens if Kordio is down?+

Kordio Control fails closed: if we cannot answer, nothing is authorized and nothing is signed. A control layer that fails open is not a control layer. Decide that failure mode deliberately rather than discovering it during an incident.

How is it priced?+

Kordio Control is metered on live authorized dollars a month, never on a count of API calls or decisions, and a denial is not billed. The sandbox is test mode with no card and no time limit, running the same engine as live, and there is deliberately no free live allowance. Kordio Ledger has its own plans. Every number is published on the pricing page and there is no call to read them.

How do I get access?+

Sign up at app.kordio.io and get sandbox keys in under five minutes, no card. Test and live share the same API surface with separate keys.

Sandbox keys in five minutes.

No card, and the same engine as live mode. Post a transaction that does not balance and watch it get refused. Write a ceiling and watch an action get denied by name. Ten minutes is enough to know whether this fits.