The double-entry ledger you call, not the one you maintain.
Accounts, transactions, and balances that reconcile by construction, not by a nightly job. Fiat, stablecoins, and crypto from the first call, idempotent by design, append-only by default. The primitives you'd otherwise spend a quarter getting right, live behind an API key today.
already on the waitlist
# Post a balanced, multi-currency transaction POST /api/v1/transactions Authorization: Bearer $SOUTHPAY_TOKEN Idempotency-Key: idem_9f1c2a44 { "postings": [ { "account": "cash:acme", "direction": "debit", "amount": 42000, "currency": "USD" }, { "account": "revenue:acme", "direction": "credit", "amount": 42000, "currency": "USD" } ], "metadata": { "invoice": "inv_8c21f9" } }
// 201 Created · debits == credits, per currency { "data": { "object": "transaction", "id": "b1f0c2e4-9a77-4e2a-9d51-7c0e2a1b8f44", "status": "posted", "idempotency_key": "idem_9f1c2a44", "postings": [ // 2 balanced postings, debit + credit ], "created_at": "2026-06-08T09:12:04Z" }, "livemode": true, "request_id": "req_8a3f2c" }
GET /api/v1/accounts/cash:acme/balance // 200 OK { "data": { "object": "balance", "account": "cash:acme", "currency": "USD", "posted": 42000, "pending": 0, "available": 42000 }, "livemode": true, "request_id": "req_5f3c1b" }
In production today. Southpay runs this double-entry ledger in crypto payments, reconciling real customer balances every day. We pulled the invariant-keeping core into its own service, so you build on it instead of rebuilding it. southpay.io
A double-entry ledger API with the hard parts handled.
You could build this on Postgres. Most teams do, then spend a quarter chasing balance races, double-posts, and reconciliation drift. Start one layer up.
Every transaction balances per currency, checked server-side before it commits. Corrections are reversals, never edits, so history stays append-only. The books reconcile after every write, not on a nightly job.
Fiat, stablecoins, and crypto in one balanced ledger. USD, EUR, USDC, BTC, any token symbol, in integer minor units. No floats, no silent single-currency assumptions.
Durable idempotency keys, separate pending and posted balances, and webhooks on every posted transaction. Your integration replays cleanly because ours does.
Four primitives. Nothing more to learn.
You write the business logic. We keep the books.
A balance in one currency, in a chart of accounts you define. Asset, liability, revenue, expense, or equity.
A balanced set of postings, made idempotent by a key you supply. Written once, immutable after.
A single debit or credit in integer minor units. Append-only, never updated in place.
Available, pending, and posted views, derived from postings and always reconciled.
Everything around the ledger, too.
Fire on every posted transaction, delivered replay-safe.
Match postings against the outside world and flag what is off-book.
Correct with a reversing transaction. History is never edited.
Lock a period so closed books cannot change.
Stream the full journal out, append-only and ordered, for audit or BI.
Define your own chart of accounts, enforced per template.
Separate keys and data. Every response says which mode it is.
Pull money movement from external systems into the ledger, no glue code.
TypeScript, Python, Ruby, Go.
Common questions from teams evaluating ledgers.
What is a double-entry ledger API?
A double-entry ledger API is a service that keeps financial records over HTTP. Every transaction is a set of postings where debits equal credits per currency, so account balances always reconcile. You integrate accounts, transactions, and balances through REST endpoints instead of building ledger tables, invariants, and reconciliation jobs yourself.
Why use a ledger API instead of building on Postgres?
You can build a ledger on Postgres, and most teams start there. The hard part comes after: balance races under concurrent writes, double-posting on retries, drift between your ledger and the outside world. A ledger API gives you those guarantees from the first call, so the quarter goes into your product instead.
How does multi-currency work?
Every posting carries an explicit currency and an integer amount in minor units. Transactions balance per currency, and an account holds a balance per currency. Fiat, stablecoins, and crypto follow the same rules, so USD, EUR, USDC, and BTC live in one ledger without floats or conversion surprises.
Is the ledger append-only?
Yes. Postings are never updated or deleted. Corrections are reversing transactions that leave the original record intact, and period close locks finished books so they cannot change. That gives you an audit trail you can export and trust.
How are retries and idempotency handled?
Every write accepts an idempotency key. Replaying the same request returns the original result instead of double-posting, so crashed jobs and webhook retries are safe by default.
How do I get access?
Southpay Ledger is in private preview. Join the waitlist with your work email and we send API keys as access opens in waves. The preview is self-serve, no sales call.
Get your keys before general availability.
Fintechs, marketplaces, platforms, anyone building on a ledger. We're opening the private preview in waves. Join the list and we'll send your keys as access opens.
Request access