Developers
curl https://api.kordio.io/control/v1/agent/actions \
-H "Authorization: Bearer $KORDIO_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d action_type=payment.create \
-d resource=api.openai.com \
-d cost_cents=12000 \
-d currency=USDcurl https://api.kordio.io/ledger/v1/transactions \
-H "Authorization: Bearer $KORDIO_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d 'postings=[
{"account_id":"acc_ops","amount":-12000,"currency":"USD"},
{"account_id":"acc_vendor","amount":12000,"currency":"USD"}
]'Quickstart
Email and password. No card, no call, no waiting list. Test-mode keys are issued immediately.
Policy is data, not deployed code. It validates when you write it rather than when an agent is waiting on it.
Get allowed, requires approval, or denied, with the rule that decided and the headroom left on every limit.
Check the JWS against the public JWKS in whatever executes. No callback, no shared secret.
Policy as data
{
"mode": "allowlist",
"imports": ["vendor-allowlist"],
"rules": [
{ "kind": "cost_cap", "max_cents": 50000,
"action_types": ["payment.create"] },
{ "kind": "spend_window", "max_cents": 200000,
"window_seconds": 86400 },
{ "kind": "rate_limit", "max_actions": 100,
"window_seconds": 60, "action_types": ["tool.invoke"] },
{ "kind": "condition", "effect": "require_approval",
"rule_name": "new_counterparty",
"when": { "all_of": [
{ "field": "action_type", "operator": "starts_with",
"value": "payment." },
{ "not": { "field": "resource", "operator": "in",
"value": ["stripe.com", "api.openai.com"] } }
] } }
]
}It always terminates, it never depends on a deploy, and a change to it shows up in a pull request like anything else.
What you can rely on
Where to go next