Docs
How Finansial thinks about money, and how to reach it from code or from Claude.
API reference
Every endpoint, generated from the code.
Claude and MCP
Connect claude.ai, Claude Desktop or Claude Code.
The money model
Finansial is a double-entry ledger. A transaction is a set of lines, one per account it touches, and the lines always sum to zero in the workspace's base currency. Spending 50.000 cash on lunch is two lines: Cash −50.000 and Food +50.000. The database refuses any transaction that doesn't balance.
Money accounts (cash, bank, e-wallet, investment, receivable, property, credit card, loan, payable) have a balance in their own currency. Cards, loans and payables show what you owe as a positive number. Categories are accounts too, with class expense or income.
Authentication
Create a key in Settings → API keys. Send it as a bearer token. A key belongs to one workspace and can never do more than its creator's current role.
Authorization: Bearer fin_live_...
Amounts
Send money as decimal strings in the account's currency, without separators: "50000" for rupiah, "12.50" for dollars. Responses carry both the decimal string and an integer in minor units (fields ending in Minor). IDR, JPY, KRW and VND have no decimals.
Errors
Errors are RFC 9457 problem+json with a stable code: unauthorized, forbidden, not_found, invalid_input, feature_disabled, conflict, version_conflict, unbalanced_transaction, fx_rate_missing, rate_limited.
{ "title": "No SGD to IDR rate on or before 2026-11-03. Enter the rate the bank used.",
"status": 422, "code": "fx_rate_missing" }Safe writes
Send an Idempotency-Key header on POST, and retries can't double-book. Updates and deletes take the version you read; a stale version returns 409 version_conflict. Most writes accept dryRun: true and return the balance effect without saving.
Paging
List endpoints return nextCursor. Pass it back as cursor until it's null.
GET /api/v1/workspaces/rumah/transactions?limit=100&cursor=2026-10-30|txn_01J...