FF Ledger
Part of FastFlowTech

Double-Entry Accounting
for Platform Services

Multi-tenant journals, hold-capture, and real-time balances. The financial primitive that powers FF Banking and FF Commerce.

Post a journal entry
$ curl -X POST /v1/entries \
-H "X-Org-Slug: acme-corp" \
-H "X-Api-Key: $API_KEY" \
-d '{
"idempotency_key": "deposit-123",
"description": "Customer deposit",
"lines": [
{ "account_id": 1, "amount": 50000, "direction": "debit" },
{ "account_id": 2, "amount": 50000, "direction": "credit" }
]
}'
// Response
{
"id": 1,
"idempotency_key": "deposit-123",
"description": "Customer deposit",
"lines": [
{ "account_id": 1, "amount": 50000, "direction": "debit" },
{ "account_id": 2, "amount": 50000, "direction": "credit" }
],
"posted_at": "2026-03-18T05:30:00Z"
}

The accounting primitives you need

Six building blocks. Every financial operation in your platform reduces to these.

Double-Entry Journals

Every transaction records balanced debits and credits. No silent balance discrepancies.

Hold-Capture

Reserve funds with a hold, then capture or release. Two-phase commit for payments.

Real-time Balances

Total, available, and held amounts computed from the journal. Always consistent.

Multi-Tenant Isolation

Each org gets its own SQLite database. Zero data leakage between tenants.

Idempotent Operations

Every entry and hold accepts an idempotency key. Safe retries, no duplicates.

Five Account Types

Asset, liability, equity, revenue, expense. Full chart of accounts per tenant.

The foundation of the financial stack

Every financial service builds on FF Ledger. One journal, many products.

FF Banking wallets, deposits, withdrawals
FF Ledger journals
FF Commerce payments, settlements
FF Ledger journals
Your App any financial operation
FF Ledger journals

API Reference

Nine endpoints. Accounts, entries, and holds - the complete surface area.

Method Endpoint
POST /v1/accounts
GET /v1/accounts
GET /v1/accounts/{id}/balance
POST /v1/entries
GET /v1/entries
POST /v1/holds
POST /v1/holds/{id}/capture
POST /v1/holds/{id}/release
GET /v1/holds

Integrate in minutes

Call FF Ledger over HTTP with an org slug and API key. That's it.

HTTP request
POST /v1/entries
X-Org-Slug: acme-corp
X-Api-Key: your-api-key
{
"idempotency_key": "deposit-123",
"description": "Customer deposit",
"lines": [
{
"account_id": 1,
"amount": 50000,
"direction": "debit"
},
{
"account_id": 2,
"amount": 50000,
"direction": "credit"
}
]
}