General ledger API

A general ledger your product can write to

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.

OpenAPI 3.1

Embed accounting with one API call

Start with curl or any HTTP client. One OpenAPI 3.1 spec — generate typed SDKs in the languages your team already uses.

curlOpenAPI 3.1

Not limited to a few hand-picked SDKs. Use the OpenAPI spec with openapi-generator, Speakeasy, Stainless, or your own pipeline.

Explore API spec
curl 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
}'
What the ledger guarantees
01

Balanced or rejected

Debits must equal credits at the API boundary. There is no code path that lets an unbalanced journal through.

02

Append-only

Posted entries are never mutated. Corrections are new entries that reference what they correct; reversals preserve the original.

03

Idempotent writes

Retries are deduplicated — resubmitting the same request returns the original result instead of a duplicate entry.

04

Attributable

Every mutation carries actor, action, and a content hash into a signed audit history with 7-year retention.

The surface

Four primitives cover most ledger work

POST/v1/accounting/journalsPost a balanced journal — the write primitive everything else compiles down to.
GET/v1/accounting/journalsRead entries back, filtered by account, reference, or date range.
POST/v1/accounting/accountsProvision and extend the chart of accounts — hierarchies, subtypes, currencies.
GET/v1/accounting/journals/for-entityEvery journal tied to one of your product's entities, by your own ids.
See it in the books

From document to ledger, rendered

Journal entries generated behind an invoice in the Paprel workspace
The journal behind an invoice — generated by the document, balanced by the ledger.
General ledger detail report grouped by account with journal identifiers and entity links
The general ledger by account: every entry carries an identifier and links back to its source document.
Built on the ledger

Higher-level workflows compile down to journals

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.

Evaluate Paprel

Build in sandbox, launch with a production trial

Use 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.

API-First Delivery
Audit-Ready Controls
Sandbox And Guided Rollout