Skip to main content
Five calls take you from nothing to a posted transaction and a balance you can read back. Every one of them matches the API reference.
Wrong page? This is the ledger: accounts, postings, balances, reconciliation. If you are here to decide whether your software may spend before it does, start with Kordio Control: authorize an agent action.
The base URL is https://api.kordio.io. OAuth lives at /oauth/token; ledger resources live under /ledger/v1.

1. Get your client credentials

Create an OAuth client from the dashboard, or use one seeded for you in development. A client has a client_id, a client_secret (shown once), a mode (test or live), and a set of granted scopes. Read operations need ledger:read; writes need ledger:write, and neither implies the other.

2. Mint an access token

Exchange your credentials for a short-lived token using the client_credentials grant. Send the credentials as HTTP Basic auth.
200 OK
The token carries your tenant, mode, and scopes, and is valid for one hour. There is no ?test= flag: the client’s mode decides whether you touch test or live data. See Authentication for the full flow.

3. Create two accounts

An account is a named bucket of value in one currency. You choose the id. Create one asset account and one revenue account, both in USD.
Each call returns the created account inside the standard envelope:

4. Post a balanced transaction

A transaction is a set of postings that balance per currency. Move 10.00 USD (1000 minor units) from cash into revenue. Writes require an Idempotency-Key so retries never double-post.
Amounts are JSON strings of integer minor units. Parse them with a big-integer type, never a JS number. The response includes the transaction and its postings:
Replaying the same Idempotency-Key returns this same transaction with a 200 and an Idempotent-Replayed: true header, instead of creating a new one. It returns the original whatever you sent the second time, so give a different transaction a different key. To validate a transaction without writing it, add ?dry_run=true and omit the idempotency key.

5. Read the balance

Balances are derived from the postings rather than stored, so this number is recomputed from what you just wrote:
200 OK
You can read a historical balance by passing ?at=<ISO 8601 timestamp>, which computes the balance from each posting’s value_date. See value-date semantics.

Next steps

Core concepts

Double-entry, corrections, idempotency, multi-currency, and value dates.

Webhooks

Subscribe to events, verify signatures, and replay from the events tail.

Pagination and expand

Walk list endpoints with cursors and inline related objects.

API reference

Every endpoint, generated from the OpenAPI spec.