LedgerLou Docs is optimized for desktop.

Please open this page on a device with a wider screen.

Journal

Create booking intent directly

Creates a new booking intent directly in the ledger. The intent may consist of a simple booking or a multi-line split booking. The debit and credit amounts across all booking lines must balance. For VAT bookings, two equivalent paths are available: either raw lines with explicit SKR04 tax accounts, or an optional tax_code per line that references a tax code available via GET /v1/tax-codes. When tax_code is used, the API books the gross amount and deterministically splits the line into net plus tax to the configured vat_account (default case) or additionally generates a self-assessment counter-booking to self_assess_account (reverse charge / §13b / intra-Community acquisition). Manual tax-account lines and tax_code must not be mixed within a single booking.

POST /v1/bookings
Authorization
Authorization string header required API key in the format ll_.... Pass as a Bearer token.
Request Body
booking_date string required Booking date (YYYY-MM-DD)
description string required Booking description
lines array required One or more booking lines; debit must equal credit in total
skip_duplicate_check boolean optional Skip duplicate check
adjustment_period number optional 13 or 14 for closing periods
fx object | null optional Foreign-currency block for bookings in non-EUR currencies. All five fields are required when fx is provided. EUR bookings omit fx or set it to null.
external_reference string | null optional Free-text reference to an external system (invoice number, Stripe ID, ERP reference). Max. 500 characters. Immutable after creation.
custom_metadata object | null optional Flat key-value object for arbitrary caller context (cost center, project, tags). Max. 20 keys, keys max. 64 characters, string values max. 256 characters, total max. 4 KB. Values may be string, number, boolean or null. Immutable after creation.
document_id string (uuid) | null optional Optional reference to a previously uploaded document. The UUID comes from POST /v1/documents.
Booking line (`lines`)
account_number string required SKR04 account number
account_name string required Account label
debit number required Debit amount. When using tax_code, this is the gross amount which the API automatically splits into net + tax.
credit number required Credit amount. When using tax_code, this is the gross amount which the API automatically splits into net + tax.
tax_code string | null optional Optional tax code (e.g. VST19, UST19, VST-IGE19, VST-13B19) from GET /v1/tax-codes. When set, the API automatically splits the line into net and tax portions. Must not be combined with manual tax-account lines. The line must occupy exactly one of debit or credit. FX bookings with self-assessment tax codes are currently not supported.
Foreign-currency block (`fx`)
currency string required ISO 4217 currency code (3 uppercase letters, not EUR)
foreign_amount number required Gross amount in foreign currency (max. 4 decimal places)
rate number required Conversion rate foreign currency → EUR (max. 8 decimal places). Example: 1 USD × 0.92 = 0.92 EUR
rate_date string required Rate reference date (YYYY-MM-DD)
rate_source string required Rate source (1–64 characters), e.g. ECB, manual, bank
Responses
200
Success
409
DUPLICATE_SUSPECTED A similar booking has already been posted. Use skip_duplicate_check: true to create another one.
400
PERIOD_LOCKED The affected period is locked and will not accept new bookings.
400
INVALID_INPUT Required fields are missing or values do not match the expected format.
400
FX_AMOUNT_MISMATCH
400
FX_INVALID_RATE
400
FX_INVALID_RATE_DATE
400
FX_CURRENCY_EUR_NOT_ALLOWED
400
INVALID_TAX_CODE
400
MANUAL_TAX_LINES_NOT_ALLOWED_WITH_TAX_CODE
400
TAX_ACCOUNT_AS_SOURCE_NOT_ALLOWED
400
FX_SELF_ASSESS_NOT_SUPPORTED
400
TAX_CODE_PAIRING_UNSUPPORTED
POST /v1/bookings
cURL
-cmd">curl --request -method">POST -punct">\
  --url 'https://api.ledgerlou.de/v1/bookings' -punct">\
  --header 'Authorization: Bearer ll_your_key' -punct">\
  --header 'Content-Type: application/json' -punct">\
  --data '{
  "booking_date": "2025-06-01",
  "description": "Büromaterial Einkauf",
  "lines": [
    {
      "account_number": "6815",
      "account_name": "Bürobedarf",
      "debit": 119,
      "credit": 0,
      "tax_code": "VST19"
    },
    {
      "account_number": "1200",
      "account_name": "Bank",
      "debit": 0,
      "credit": 119
    }
  ]
}'
200 Response
JSON
{
  "intent_id": "<string>",
  "event_count": 1
}