Package Information
Documentation
n8n-nodes-ledgerlou
Official n8n community node for LedgerLou — the AI-native
accounting infrastructure for German GmbHs. Automate bookkeeping, bank
reconciliation, incoming invoices, period locking, reports and more — directly
from your n8n self-hosted workflows.
Why
LedgerLou is designed as an API + MCP general ledger. n8n is the de-facto
EU-friendly workflow automation platform (self-hosted, GDPR, Hetzner-ready).
With this node you get:
- 1:1 parity with all API-key-capable REST endpoints of LedgerLou.
- Built-in authentication — no hand-rolled
Authorizationheaders. - Polling trigger for new bank transactions, journal entries and invoices.
- Multipart upload support for document inbox and bank-statement imports.
- Idempotency via
external_reference(e.g.{{$execution.id}}). - Deterministic codegen — when the LedgerLou API grows, this node follows
automatically; no hand-sync drift.
Use cases
- Stripe / PayPal → LedgerLou — auto-post revenue from payment webhooks.
- Banking → LedgerLou — CAMT/CSV feeds in, banktransactions + optional
reconciliation out. - Inbox workflows — PDFs from mail / cloud drive → document upload →
creditor + incoming-invoice creation.
Installation
n8n self-hosted (recommended)
- Open Settings → Community Nodes.
- Click Install a community node.
- Enter package name:
n8n-nodes-ledgerlou. - Tick the risk acknowledgement and click Install.
- Restart n8n if prompted.
Manual (CLI)
cd ~/.n8n/custom
npm install n8n-nodes-ledgerlou
n8n Cloud
Currently only the Verified Community Nodes channel is supported on n8n Cloud.
A Verified application for this node is planned post-MVP. For now, use
self-hosted.
Credentials
Create a LedgerLou API credential:
| Field | Value |
|---|---|
| Base URL | https://api.ledgerlou.de (default) or your self-hosted host |
| API Key | ll_… (64 hex). Generate in LedgerLou Dashboard → API-Keys. |
The credential is sent as Authorization: Bearer ll_…. Use the Test
button to verify — it calls GET /v1/accounts?limit=1.
Required scopes
Grant the API key the scopes matching the operations you'll call. Scope labels
follow <module>:<read|write|review>, e.g. journal:write, bank:read.
The per-operation scope is shown in each operation's description.
Nodes
Two nodes are shipped:
- LedgerLou — action node. One operation per REST endpoint.
- LedgerLou Trigger — polling trigger for new bank transactions, journal
entries and invoices.
Journal
| Operation | Method | Path | Scope |
|---|---|---|---|
listAccounts |
GET | /v1/accounts |
config:read |
listAccountsSearch |
GET | /v1/accounts/search |
config:read |
createAccounts |
POST | /v1/accounts |
config:write |
getAccountsEntries |
GET | /v1/accounts/:number/entries |
config:read |
createDocuments |
POST | /v1/documents |
journal:write |
getDocumentsFile |
GET | /v1/documents/:id/file |
journal:read |
createBookings |
POST | /v1/bookings |
journal:write |
openingBalancesBookings |
POST | /v1/bookings/opening-balances |
journal:write |
listJournal |
GET | /v1/journal |
journal:read |
getJournal |
GET | /v1/journal/:intent_id |
journal:read |
reverseJournal |
POST | /v1/journal/reverse |
journal:write |
Bank
| Operation | Method | Path | Scope |
|---|---|---|---|
listBankAccounts |
GET | /v1/bank-accounts |
bank:read |
getBankAccounts |
GET | /v1/bank-accounts/:id |
bank:read |
getBankAccountsBalanceHistory |
GET | /v1/bank-accounts/balance-history |
bank:read |
createBankAccounts |
POST | /v1/bank-accounts |
bank:write |
replaceBankAccounts |
PUT | /v1/bank-accounts/:id |
bank:write |
listBankTransactions |
GET | /v1/bank-transactions |
bank:read |
getBankTransactions |
GET | /v1/bank-transactions/:id |
bank:read |
createBankTransactions |
POST | /v1/bank-transactions |
bank:write |
importFileBankTransactions |
POST | /v1/bank-transactions/import-file |
bank:write |
uploadBankAccounts |
POST | /v1/bank-accounts/:id/upload |
bank:write |
getBankAccountsReconciliation |
GET | /v1/bank-accounts/:id/reconciliation |
bank:read |
listBankTransactionsUnreconciledCount |
GET | /v1/bank-transactions/unreconciled-count |
bank:read |
getBankTransactionsSuggestions |
GET | /v1/bank-transactions/suggestions |
bank:read |
reconcileBankTransactions |
POST | /v1/bank-transactions/:id/reconcile |
bank:write |
unmatchBankTransactions |
POST | /v1/bank-transactions/:id/unmatch |
bank:write |
createBankTransactionsDismiss |
POST | /v1/bank-transactions/:id/dismiss |
bank:write |
createBankTransactionsBatchReconcile |
POST | /v1/bank-transactions/batch-reconcile |
bank:write |
createBankMatchGroups |
POST | /v1/bank-match-groups |
bank:write |
unmatchBankMatchGroups |
POST | /v1/bank-match-groups/:id/unmatch |
bank:write |
getBankTransactionsEvidence |
GET | /v1/bank-transactions/:id/evidence |
bank:read |
replaceBankTransactionsEvidence |
PUT | /v1/bank-transactions/:id/evidence |
bank:write |
Kreditoren (AP)
| Operation | Method | Path | Scope |
|---|---|---|---|
listInbox |
GET | /v1/inbox |
kreditoren:read |
getInbox |
GET | /v1/inbox/:id |
kreditoren:read |
confirmInbox |
POST | /v1/inbox/:id/confirm |
kreditoren:write |
createInboxReject |
POST | /v1/inbox/:id/reject |
kreditoren:write |
listInboxAddress |
GET | /v1/inbox/address |
kreditoren:read |
listVendors |
GET | /v1/vendors |
kreditoren:read |
createVendors |
POST | /v1/vendors |
kreditoren:write |
getVendors |
GET | /v1/vendors/:id |
kreditoren:read |
replaceVendors |
PUT | /v1/vendors/:id |
kreditoren:write |
deleteVendors |
DELETE | /v1/vendors/:id |
kreditoren:write |
listInvoices |
GET | /v1/invoices |
kreditoren:read |
createInvoices |
POST | /v1/invoices |
kreditoren:write |
getInvoices |
GET | /v1/invoices/:id |
kreditoren:read |
updateInvoices |
PATCH | /v1/invoices/:id |
kreditoren:write |
listInvoicesOpenItems |
GET | /v1/invoices/open-items |
kreditoren:read |
createOcrExtract |
POST | /v1/ocr/extract |
kreditoren:read + journal:write |
Debitoren (AR)
| Operation | Method | Path | Scope |
|---|---|---|---|
listCustomers |
GET | /v1/customers |
debitoren:read |
createCustomers |
POST | /v1/customers |
debitoren:write |
getCustomers |
GET | /v1/customers/:id |
debitoren:read |
replaceCustomers |
PUT | /v1/customers/:id |
debitoren:write |
deleteCustomers |
DELETE | /v1/customers/:id |
debitoren:write |
listOutgoingInvoices |
GET | /v1/outgoing-invoices |
debitoren:read |
createOutgoingInvoices |
POST | /v1/outgoing-invoices |
debitoren:write |
getOutgoingInvoices |
GET | /v1/outgoing-invoices/:id |
debitoren:read |
updateOutgoingInvoices |
PATCH | /v1/outgoing-invoices/:id |
debitoren:write |
listOutgoingInvoicesOpenItems |
GET | /v1/outgoing-invoices/open-items |
debitoren:read |
Perioden
| Operation | Method | Path | Scope |
|---|---|---|---|
listPeriods |
GET | /v1/periods |
perioden:read |
softLockPeriods |
POST | /v1/periods/:period/soft-lock |
perioden:write |
lockPeriods |
POST | /v1/periods/:period/lock |
perioden:write |
approvePeriodsLock |
POST | /v1/periods/:period/lock/:requestId/approve |
perioden:write |
createPeriodsLockCancel |
POST | /v1/periods/:period/lock/:requestId/cancel |
perioden:write |
getPeriodsLockStatus |
GET | /v1/periods/:period/lock/status |
perioden:read |
reopenPeriods |
POST | /v1/periods/:period/reopen |
perioden:write |
Auswertungen
| Operation | Method | Path | Scope |
|---|---|---|---|
listReports |
GET | /v1/reports |
auswertungen:read |
getReportsMonthlyRevenueExpenses |
GET | /v1/reports/monthly-revenue-expenses |
auswertungen:read |
getReportsDatevExport |
GET | /v1/reports/datev-export |
auswertungen:read |
Config
| Operation | Method | Path | Scope |
|---|---|---|---|
listTenant |
GET | /v1/tenant |
config:read |
listTaxCodes |
GET | /v1/tax-codes |
config:read |
createTaxCodes |
POST | /v1/tax-codes |
config:write |
updateTaxCodes |
PATCH | /v1/tax-codes/:code |
config:write |
deleteTaxCodes |
DELETE | /v1/tax-codes/:code |
config:write |
Idempotency tip
For every create-style operation, set external_reference to{{$execution.id}} (or a stable per-workflow key). LedgerLou uses this to
dedupe reruns and to link LedgerLou activity back to the originating n8n
execution.
Troubleshooting
| Symptom | Likely cause |
|---|---|
401 UNAUTHORIZED |
API key missing/invalid. Re-issue in LedgerLou Dashboard. |
403 FORBIDDEN |
Key lacks the required scope. Grant the scope shown in description. |
409 DUPLICATE_SUSPECTED |
Content-hash collision; use skip_duplicate_check only if intended. |
400 PERIOD_LOCKED |
Target period is hard-locked. Unlock in LedgerLou or change date. |
| Polling finds nothing | Trigger interval too short or API key lacks :read scope. |
Development
This package lives inside the LedgerLou monorepo.
Contributions via PR against main. Releases are tagged n8n-nodes-v<semver>.
pnpm --filter n8n-nodes-ledgerlou build
pnpm --filter n8n-nodes-ledgerlou lint
pnpm docs:generate # regenerates descriptions + node catalog
Codegen input: packages/docs/src/data/endpoints/*.json.
License
MIT — see LICENSE.