04 / /dev/accounting

devacc

/dev/accounting · Accounting API

Add bookkeeping to your software: record balanced journal entries, keep their source documents and validate e-invoices. Each customer has a separate accounting tenant.

API example · sample data

POST /journal-entries

SideAccountAmount
DebitAccount A€125.00
CreditAccount B€125.00

201 CreatedDraft · not posted

Request and response

Replace the fictitious period and account IDs with IDs from your setup.

{
  "periodId": "per_01ARZ3NDEKTSV4RRFFQ69G5FAV",
  "bookingDate": "2026-10-05",
  "currency": "EUR",
  "bookingText": "Example purchase",
  "lines": [
    {
      "accountId": "acct_01ARZ3NDEKTSV4RRFFQ69G5FAW",
      "side": "debit",
      "amount": { "amount": "12500", "currency": "EUR" }
    },
    {
      "accountId": "acct_01ARZ3NDEKTSV4RRFFQ69G5FAX",
      "side": "credit",
      "amount": { "amount": "12500", "currency": "EUR" }
    }
  ]
}

Response excerpt · amounts are integer cents (12500 = €125.00).

{
  "status": "draft",
  "seq": null
}
Authentication and posting

Canonical base: https://api.d0.eu/accounting/v1.

Send Authorization: DPoP <access-token>, a fresh ES256 DPoP proof binding the token, method, exact public URI, and nonce, plus X-Accounting-Tenant: ten_…. Each mutation needs an Idempotency-Key; reuse the same key when retrying that operation, and use a fresh key for a new operation. Draft creation also needs Content-Type: application/json. On a nonce challenge, use the server's DPoP-Nonce value as the nonce claim in a newly signed proof and retry.

Create accounts and an open period first. Writes need accounting.write scope, identity grant, and tenant permission; reads need accounting.read and its grants.

A draft has no booking sequence or hash-chain entry. Posting needs an archived source document linked to the draft. Link it with bodyless POST /journal-entries/{entryId}/documents/{documentId}, then post with bodyless POST /journal-entries/{entryId}/post. Linking returns 204; posting returns 200 and assigns the sequence. Read posted entries with GET /journal-entries?status=posted. Use the IDs returned by your tenant setup and document workflow.

Bookkeeping inside your application

Your application provides the user interface and accounting rules. devacc records entries, preserves linked documents and exposes the results through an API.

  1. 01

    Post and query a ledger

    Create draft entries, post and reverse them, inspect account statements and balances, and finalize periods.

  2. 02

    Keep source documents linked

    Upload and retrieve source documents, link them to postings, and export a consistent tenant record.

  3. 03

    Validate e-invoices

    Validate archived XRechnung XML against the configured policy, then review its syntax, profile, issues, and the validator and ruleset used.

  4. 04

    Create hybrid PDFs

    Combine validated CII invoice XML with an archived visual PDF into a ZUGFeRD/Factur-X PDF derivative.

  5. 05

    Integrate by API and events

    Provision isolated tenants and access, then receive signed notifications when journal entries are posted.

Requirements & service limits

Use devacc as the ledger and document layer inside your own bookkeeping product. Your integration supplies the chart of accounts and its accounting and tax rules. Hybrid PDF creation takes a validated CII XML invoice together with its original archived PDF visual.

Common questions

Who is the Accounting API for?

It is designed for SaaS teams that want to build bookkeeping workflows around an API and their own customer experience. Integration model

Which accounting workflows are available?

The API supports draft and posted double-entry journal entries, reversals, account statements and balances, and period finalization. Ledger workflows

How are e-invoice PDFs created?

Validate an archived CII XML invoice, then provide its original archived PDF visual to create a ZUGFeRD/Factur-X hybrid PDF derivative. Hybrid PDF workflow