Developers
The House Ledger API
Every figure on the House Ledger is open, read-only, over plain REST and a small GraphQL endpoint. No key. CORS is open to every origin.
01Conventions
- Base URL:
https://accounting.scarletbeast.com - Amounts are USD decimals (
12.5= $12.50). Most carry a ready-made*_formattedstring beside them. - Every response carries an
as_ofISO-8601 timestamp. Figures are cached for up to a minute. - The source is the bookkeeping itself. Transfers between our own accounts are excluded from income and expenses.
02REST
Every endpoint returns { "data": …, "as_of": … }.
/api the whole dataset/api/summary cash on hand, income, expenses, net, entry counts/api/accounts every account with its opening and current balance/api/categories income and expense categories with totals/api/monthly income, expenses and net for the last twelve months/api/entries every entry, newest firstExample
# the headline figures
curl https://accounting.scarletbeast.com/api/summary
{
"data": {
"cash_on_hand": 0,
"cash_on_hand_formatted": "$0.00",
"income": 0,
"income_formatted": "$0.00",
"expenses": 0,
"expenses_formatted": "$0.00",
"net": 0,
"net_formatted": "$0.00",
"entries": 0,
"income_entries": 0,
"expense_entries": 0,
"accounts": 1
},
"as_of": "2026-10-25T22:35:37+00:00"
}
03GraphQL
One endpoint: POST https://accounting.scarletbeast.com/graphql with { "query": "…" }, or GET /graphql?query=…. Read-only field selection over one root field, ledger. Arguments, aliases and fragments are not supported.
Schema
type Query { ledger: Ledger } type Ledger { as_of currency source connected summary: Summary accounts: [Account] categories: Categories monthly: [Month] entries: [Entry] } type Summary { cash_on_hand income expenses net entries income_entries expense_entries accounts } type Account { id name type currency opening_balance current_balance current_balance_formatted } type Categories { income: [Category] expense: [Category] } type Category { id name total total_formatted count } type Month { month income expenses net } type Entry { id date type category description contact account amount amount_formatted }
Try it
Edit the query and run it against the live endpoint.
{
ledger {
as_of
summary { cash_on_hand income expenses net entries }
accounts { name current_balance }
categories { income { name total } expense { name total } }
}
}