Southpay Ledger Ledger Request access
Preview Private preview, early access for developers

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.

We email a confirmation now and your keys when a slot opens. Nothing else.

Free tier for development Pricing at GA Self-serve, no sales call

We store your email only to manage preview access. Ask us to delete it anytime: daniel@southpay.io.

# 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" }
}

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

What you get

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.

Balances that can't drift

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.

Multi-currency is a primitive

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.

Built for retries

Durable idempotency keys, separate pending and posted balances, and webhooks on every posted transaction. Your integration replays cleanly because ours does.

The model

Four primitives. Nothing more to learn.

You write the business logic. We keep the books.

Account

A balance in one currency, in a chart of accounts you define. Asset, liability, revenue, expense, or equity.

Transaction

A balanced set of postings, made idempotent by a key you supply. Written once, immutable after.

Posting

A single debit or credit in integer minor units. Append-only, never updated in place.

Balance

Available, pending, and posted views, derived from postings and always reconciled.

Also included

Everything around the ledger, too.

Webhooks

Fire on every posted transaction, delivered replay-safe.

Reconciliation

Match postings against the outside world and flag what is off-book.

Reversals

Correct with a reversing transaction. History is never edited.

Period close

Lock a period so closed books cannot change.

Export

Stream the full journal out, append-only and ordered, for audit or BI.

Account templates

Define your own chart of accounts, enforced per template.

Test + live mode

Separate keys and data. Every response says which mode it is.

Connectors Soon

Pull money movement from external systems into the ledger, no glue code.

SDKs Soon

TypeScript, Python, Ruby, Go.

FAQ

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.

Early access

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