Balanced or rejected
Debits must equal credits at the API boundary. There is no code path that lets an unbalanced journal through.
Balanced double-entry journals over REST, an append-only ledger underneath, and a programmable chart of accounts — the same ledger core proven in production today.
Start with curl or any HTTP client. One OpenAPI 3.1 spec — generate typed SDKs in the languages your team already uses.
Not limited to a few hand-picked SDKs. Use the OpenAPI spec with openapi-generator, Speakeasy, Stainless, or your own pipeline.
Explore API speccurl https://api-sandbox.paprel.com/v1/accounting/journals \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"currency": "USD",
"date": "2026-06-11",
"description": "Initial journal",
"exchange_rate": "1",
"is_manual": true,
"lines": [
{
"account_code": "1010",
"debit": "100.00",
"credit": null,
"description": "Cash movement",
"is_tax": false,
"is_taxable": false
},
{
"account_code": "4000",
"debit": null,
"credit": "100.00",
"description": "Revenue entry",
"is_tax": false,
"is_taxable": false
}
],
"meta_data": {
"root_entity_type": "journal",
"root_entity_id": "external-journal-001",
"description": "Initial journal import"
},
"override": false,
"override_reason": null,
"posted": true,
"reference": "INIT-001",
"reversal_of": null
}'Debits must equal credits at the API boundary. There is no code path that lets an unbalanced journal through.
Posted entries are never mutated. Corrections are new entries that reference what they correct; reversals preserve the original.
Retries are deduplicated — resubmitting the same request returns the original result instead of a duplicate entry.
Every mutation carries actor, action, and a content hash into a signed audit history with 7-year retention.
/v1/accounting/journalsPost a balanced journal — the write primitive everything else compiles down to./v1/accounting/journalsRead entries back, filtered by account, reference, or date range./v1/accounting/accountsProvision and extend the chart of accounts — hierarchies, subtypes, currencies./v1/accounting/journals/for-entityEvery journal tied to one of your product's entities, by your own ids.

Invoices, payments, expenses, and reconciliation all generate balanced journals against the same chart of accounts — which is why reports always tie out. Use the workflow APIs where they fit and drop to raw journals where your domain is unusual.
Then connect the ledger to payments, banks, and your product on the integrations page, or see how it compares to QuickBooks, Xero, and Modern Treasury. For the design decisions behind the API, read the double-entry ledger architecture guide.
Journal API
Create, query, connect, and safely correct the debit and credit entries behind product events.
Explore the Journal APIAccounting engine
Place the ledger inside a wider system of workflows, reports, controls, events, and tenant isolation.
Explore the accounting engineEmbedded accounting API
Connect the ledger to workflows, reporting, permissions, webhooks, and MCP-native agent tools.
Explore embedded accountingAPI alternatives
See how Paprel differs from QuickBooks, Xero, accounting aggregators, and money-movement ledgers.
Compare API alternativesUse sandbox for developer testing with no billing. When you are ready for real workflows, start production on a monthly plan with a 14-day free trial.