# BuchhaltungsButler (oci · ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2)

BuchhaltungsButler API v1: alle 54 Endpunkte als 46 sicherheitskategorisierte MCP-Tools

- Trust score: 39/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- oci · `ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2`: 39/100 (this document), [markdown](https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2.md), [page](https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 0/100
  - Malware scan not yet available for this package.
  - Known CVEs could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 5 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 14874 tokens (~323/item across 46 items; 46 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 2 categories.** Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the BuchhaltungsButler MCP server?

BuchhaltungsButler runs locally as a container image, launched with docker run --rm -i ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add ohneben-buchhaltungsbutler-mcp -- docker run --rm -i ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2
```

### Cursor

```json
{
  "mcpServers": {
    "ohneben-buchhaltungsbutler-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ohneben-buchhaltungsbutler-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add ohneben-buchhaltungsbutler-mcp -- docker run --rm -i ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ohneben-buchhaltungsbutler-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  ohneben-buchhaltungsbutler-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"]
```

### Netclaw

```json
{
  "McpServers": {
    "ohneben-buchhaltungsbutler-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "ohneben-buchhaltungsbutler-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-14 (score 39)

First indexed and scored.

## MCP tools (46)

### `accounts_list` (~125 tokens)

Accounts: get all the accounts

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get all the accounts**

Use to list the bank, cash and credit-card accounts that transactions can be booked against, e.g. to resolve an account name to the numeric `account` id the transaction tools expect.

Not the chart of accounts. For posting account numbers such as 1200 or 4400, use `postingaccounts_list`.

v1 offers no update or delete endpoint for accounts. An account created here can only be listed afterwards.

Endpoint: POST /accounts/get

Output parameters:

- `data` (array): An array of accounts data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `cost_locations_list` (~164 tokens)

Cost Locations: get cost locations

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get cost locations**

Get cost locations for a specified customer account. The response includes the number of returned rows and an array of cost locations data. NOTE: Each request is limited to 1000 cost locations!

Use to list the cost centres available for the `cost_location` fields on the posting tools.

Endpoint: POST /cost-locations/get

Input parameters:

- `code` (string): The code of one specific cost location. If provided, only the cost location with this code will be returned.
- `limit` (integer): Set a limit of returned postings. NOTE: the maximum limit is 1000!
- `offset` (integer): Set an offset for the returned postings.

Output parameters:

- `data` (array): An array of cost locations data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `creditors_list` (~163 tokens)

Settings: get creditors

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get creditors**

Get all creditors

Use to list suppliers, for example to resolve a supplier name to the `creditor` id the receipt and posting tools expect.

For customers you invoice, use `debtors_list`.

Supports `limit` and `offset`; the response reports the total in `rows`, so page until you have seen that many rows. v1 offers no delete endpoint for creditors, so they can only be created, listed and updated.

Endpoint: POST /settings/get/creditors

Input parameters:

- `limit` (integer): limit of the results, default is 25 results
- `offset` (integer): offset of the results, default is 0

Output parameters:

- `data` (array): An array of creditors
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `debtors_list` (~148 tokens)

Settings: get debitors

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get debitors**

Get all debitors

Use to list customers, for example to resolve a customer name to the `debtor` id the receipt and posting tools expect.

For suppliers you buy from, use `creditors_list`.

Supports `limit` and `offset`. v1 offers no delete endpoint for debtors, so they can only be created, listed and updated.

Endpoint: POST /settings/get/debtors

Input parameters:

- `limit` (integer): limit of the results, default is 25 results
- `offset` (integer): offset of the results, default is 0

Output parameters:

- `data` (array): An array of debitors
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `postingaccounts_list` (~339 tokens)

Settings: get postingaccounts

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get postingaccounts**

Get all postingaccounts

Use to list the chart of accounts, for example to find the posting account number for office supplies before booking.

Not bank accounts. For the bank, cash and credit-card accounts transactions belong to, use `accounts_list`.

Supports `limit` and `offset`; a full SKR chart runs to several hundred rows, so page until `rows` is covered or filter instead. v1 offers no delete endpoint for posting accounts.

Endpoint: POST /settings/get/postingaccounts

Input parameters:

- `exclude_accounts` (boolean): exclude all base accounts (e.g. bank accounts) from result.  If specified, the field will be validated.
- `exclude_creditors` (boolean): exclude all creditor postingaccounts from result.  If specified, the field will be validated.
- `exclude_debtors` (boolean): exclude all debtor postingaccounts from result.  If specified, the field will be validated.
- `exclude_postingaccounts` (boolean): exclude all postingaccounts from result.  If specified, the field will be validated.
- `limit` (integer): limit of the results, default is 1000 results.  If specified, the field will be validated.
- `offset` (integer): offset of the results, default is 0.  If specified, the field will be validated.
- `order` (string): the order of the results.The following options are valid:postingaccount_number ASC | DESCname ASC | DESCtype ASC | DESC.  If specified, the field will be validated.

Output parameters:

- `data` (array): An array of postingaccounts data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `postings_list` (~620 tokens)

Postings: get postings

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get postings**

Get postings for a specified customer account. The response includes the number of returned rows and an array of postings data. NOTE: Each request is limited to 1000 postings!

Use to read the booking journal, filtered by date range or posting account.

Supports `limit` and `offset`. Ask for a bounded date range rather than paging through a whole financial year.

Endpoint: POST /postings/get

Input parameters:

- `account` (string): A comma separated list of accounts. Use the following options: all, all financial accounts, free booking and any of your available accounts as numeric value. The default is "all"
- `cost_location` (string): Set a specific cost location code. If specified, only postings to this cost location are returned
- `date_from` (string, required): The postings issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All postings with issuing date including and after given value will be returned. If specified, the field will be validated. An e…
- `date_last_action_from` (string): A date in format 'YYYY-MM-DD'. All postings that were created or modified in status (confirmed, fixed) on or after this date will be returned. If specified, the field will be validated. An empty str…
- `date_last_action_to` (string): A date in format 'YYYY-MM-DD'. All postings that were created or modified in status (confirmed, fixed) on or before this date will be returned. If specified, the field will be validated. An empty st…
- `date_to` (string, required): The postings issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All postings with issuing date including and before given value will be returned. If specified, the field will be validated. An…
- `limit` (integer): Set a limit of returned postings. NOTE: the maximum limit is 1000!
- `offset` (integer): Set an offset for the returned postings.
- `order` (string): Possible values are  "default",  "date ASC",  "date DESC",  "date_last_action ASC",  "date_last_action DESC",  "id_by_customer ASC",  "id_by_customer DESC". The default order is ascending by date as…
- `posting_status` (string): Set the status of the posting. You have the following options: all, fixed, unfixed The default is "all"
- `postingaccount` (string): A comma separated list of postingaccounts. Use the following options: all, all postingaccounts, all debtors, all creditors and any of your available postingaccounts as numeric value. The default is…

Output parameters:

- `data` (array): An array of postings data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `receipts_get_by_id` (~212 tokens)

Receipts: get receipt by id_by_customer

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get receipt by id_by_customer**

Get a single receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first. The response includes an array of receipt data.

Use to fetch a single receipt whose id you already have.

To search or page through receipts, use `receipts_list`.

\`id_by_customer` is the per-customer counter shown in the BuchhaltungsButler UI, not a global database id.

Endpoint: POST /receipts/get/id_by_customer

Input parameters:

- `get_file` (boolean): If true, the file will be included as a base64 encoded string (e_invoice_type = 0 -> standard pdf file, e_invoice_type = 1 -> ZUGFeRD pdf file, e_invoice_type = 2 -> xRechnung xml file). If specified…

Output parameters:

- `data` (object): An array of receipt data
- `message` (string): blank
- `success` (boolean): Success boolean

### `receipts_list` (~753 tokens)

Receipts: get receipts

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get receipts**

Get receipts for a specified customer account. The response includes the number of returned rows and an array of receipts data.

Use to search receipts by direction, date range or payment status.

To fetch one known receipt, use `receipts_get_by_id`.

\`list_direction` is required and selects inbound or outbound receipts. Supports `limit` and `offset`; the response reports the total in `rows`.

Endpoint: POST /receipts/get

Input parameters:

- `counterparty` (string): The counterparty of the receipt, i.e. the invoicing party for type 'inbound' or the recipient for type 'outbound' (e.g. 'Peter Maier'). If specified, the field will be validated.
- `date_from` (string): The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with issuing date including and after given value will be returned. If specified, the field will be validated. An…
- `date_since_last_modified` (string): A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All receipts whose date_updated value is later than t…
- `date_to` (string): The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with issuing date including and before given value will be returned. If specified, the field will be validated. An…
- `deleted` (boolean): If true, only deleted receipts will be returned. If specified, the field will be validated.
- `due_date` (string): The receipt's issuing due date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with the same due date given value will be returned. If specified, the field will be validated. An empty strin…
- `include_offers` (boolean): If true, offers will be included. If specified, the field will be validated.
- `invoicenumber` (string): The invoicenumber for the invoice. If specified, the receipts with the same invoicenumber will be retrieved.
- `limit` (integer): A limit of returned data. If no limit is given, the default will be 500. Also the maximum limit is 500. If specified, the field will be validated.
- `list_direction` (string, required): Can be either 'inbound' ("Eingangsbelege") or 'outbound' ("Ausgangsbelege").
- `offset` (integer): The offset for paging returned data. If no offset is given, the default will be 0. If specified, the field will be validated.
- `order` (object): Possible fields are: date amount invoicenumber (invoice_number) invoicingparty (counterparty) Allowed values are 'ASC' and 'DESC' Example: {"date": "ASC"} {"date": "ASC", "amount": "DESC"}
- `payment_status` (string): Can be either 'paid' ("bezahlt") or 'unpaid' ("unbezahlt"). If specified, the field will be validated.

Output parameters:

- `data` (array): An array of receipts data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `receipts_list_assigned_transactions` (~174 tokens)

Receipts: get all transactions assigned to a specific receipt

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get all transactions assigned to a specific receipt**

Get all transactions assigned to a specific receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.

Use to see which bank transactions are linked to a given receipt, for example to check whether an invoice has been matched to a payment.

For the opposite direction, use `transactions_list_assigned_receipts`.

Endpoint: POST /receipts/assigned-transactions/get

Input parameters:

- `confirmed_only` (boolean): If true, only confirmed assignments will be returned. If specified, the field will be validated.
- `receipt_id_by_customer` (integer, required): The id_by_customer of the receipt.

Output parameters:

- `data` (array): An array of transactions data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `reports_get_bwa` (~206 tokens)

Reports: get bwa report

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get bwa report**

Returns a previously created BWA report ("Betriebswirtschaftliche Auswertung").

Reports are generated asynchronously, so a report is only available once its generation has been finished. Note that creating a new report of the same type replaces the previously created one.

Use to read a BWA that `reports_create_bwa` has finished generating. Step two of two.

Returns nothing useful until generation has finished. If the report is not ready, wait and retry rather than requesting a new one, since a new request replaces the pending one.

Endpoint: POST /reports/get/bwa

Input parameters:

- `get_files` (boolean): If true, the report's files will be included as base64 encoded strings. If specified, the field will be validated.
- `report_id_by_customer` (integer, required): The id_by_customer of the report, as returned when the report was created

Output parameters:

- `files` (object): Only contained if get_files has been specified. Provides the keys 'csv' and 'pdf', each holding the base64 encoded content of the report's file, or null if the file is not available &ndash; because i…
- `message` (string): blank
- `report` (object): The report's data, containing the keys 'integrityError', 'standardChart', 'usedCostLocations', 'usedPostingaccountsNumbers', 'postingsRecordsCount', 'uncompletedPostingsCount', 'groups' and 'totals'.…
- `success` (boolean): Success boolean

### `reports_get_sums` (~191 tokens)

Reports: get sums report

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get sums report**

Returns a previously created sums report ("Summen- und Saldenliste").

Reports are generated asynchronously, so a report is only available once its generation has been finished. Note that creating a new report of the same type replaces the previously created one.

Use to read a sums and balances report that `reports_create_sums` has finished generating. Step two of two.

For the individual bookings behind one posting account, use `reports_get_sums_ledger`.

Endpoint: POST /reports/get/sums

Input parameters:

- `get_files` (boolean): If true, the report's files will be included as base64 encoded strings. If specified, the field will be validated.
- `report_id_by_customer` (integer, required): The id_by_customer of the report, as returned when the report was created

Output parameters:

- `files` (object): Only contained if get_files has been specified. Provides the keys 'csv', 'pdf' and 'csv_archive', each holding the base64 encoded content of the report's file, or null if the file is not available &n…
- `message` (string): blank
- `report` (object): The report's data, containing the keys 'integrityError', 'countPostingsWithDateVatEffectiveNotConsideredInReport' and 'sums'. The sums are keyed by postingaccount number, and every entry provides th…
- `success` (boolean): Success boolean

### `reports_get_sums_ledger` (~354 tokens)

Reports: get sums report postingaccount ledger

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get sums report postingaccount ledger**

Returns the postingaccount ledger ("Kontenblatt") of one postingaccount, holding its postings of the requested period.

The postingaccount numbers available for a sums report are provided by reports/get/sums, both as the keys of the 'sums' object and as its entries' 'postingaccount_number'.

In contrast to the report itself the ledger is created on the fly, so no report has to be created beforehand. Note that retrieving the ledger of a postingaccount holding a lot of postings may take a while.

Use to drill into one posting account of a finished sums report and see the individual entries behind its balance.

For the totals across all posting accounts, use `reports_get_sums`.

Requires a sums report created by `reports_create_sums` to have finished.

Endpoint: POST /reports/get/sums/ledger

Input parameters:

- `base` (string): The date the postings are taken into account by. Can be either 'date' ("Buchungsdatum") or 'date_delivery_else_date' ("Buchungs- und Leistungsdatum"). If specified, the field will be validated.
- `date_from` (string, required): The first day of the period the ledger is returned for, in format 'YYYY-MM-DD' (e.g. '2026-01-01').
- `date_to` (string, required): The last day of the period the ledger is returned for, in format 'YYYY-MM-DD' (e.g. '2026-03-31').
- `postingaccount_number` (integer, required): The number of the postingaccount to return the ledger for

Output parameters:

- `message` (string): blank
- `report_sums_postingaccount_ledger` (object): The ledger's data, containing the keys 'integrityError', 'postingaccount_number' and 'postingaccountLedger'. The 'postingaccount_number' is the number of the postingaccount the ledger has been retur…
- `success` (boolean): Success boolean

### `transactions_get_by_id` (~141 tokens)

Transactions: get transaction by id_by_customer

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get transaction by id_by_customer**

Get a single transaction for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/transactions/get method" first. The response includes an array of transaction data.

Use to fetch a single bank transaction whose id you already have.

To search or page through transactions, use `transactions_list`.

\`id_by_customer` is the per-customer counter shown in the BuchhaltungsButler UI, not a global database id.

Endpoint: POST /transactions/get/id_by_customer

Output parameters:

- `data` (object): An array of transaction data
- `message` (string): blank
- `success` (boolean): Success boolean

### `transactions_list` (~595 tokens)

Transactions: get transactions

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get transactions**

Get transactions for a specified customer account. The response includes the number of returned rows and an array of transaction datas.

Use to search bank transactions by account and date range.

To fetch one known transaction, use `transactions_get_by_id`.

Supports `limit` and `offset`; the response reports the total in `rows`. Ask for a bounded date range rather than the full history.

Endpoint: POST /transactions/get

Input parameters:

- `account` (integer): The account number of the account the transaction is stored to. If specified, the field will be validated.
- `date_from` (string): The transaction's booking date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All transactions with booking date including and after given value will be returned. An empty string is not considered a va…
- `date_since_last_modified` (string): A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All transactions whose date_updated value is later th…
- `date_to` (string): The transaction's booking date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All transaction with booking date including and before given value will be returned. An empty string is not considered a va…
- `id_by_customer_from` (integer): The id_by_customer as an integer. All transactions after given value will be returned. The transaction with the given value will NOT be returned! NOTE: By specifying this, the sort changes to id_by_…
- `id_by_customer_to` (integer): The id_by_customer as an integer. All transactions to given value will be returned. The transaction with the given value will NOT be returned! NOTE: By specifying this, the sort changes to id_by_cus…
- `limit` (integer): A limit of returned data. If no limit is given, the default will be 500. Also the maximum limit is 500. If specified, the field will be validated.
- `offset` (integer): The offset for paging returned data. If no offset is given, the default will be 0. If specified, the field will be validated.
- `to_from` (string): The payer/payee of the transaction. If specified, the field will be validated.

Output parameters:

- `data` (array): An array of transactions data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `transactions_list_assigned_receipts` (~172 tokens)

Transactions: get all receipts assigned to a specific transaction

🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records.

\**get all receipts assigned to a specific transaction**

Get all receipts assigned to a specific transaction for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/transactions/get method" first.

Use to see which receipts are linked to a given bank transaction, for example to check whether a payment has its invoice attached.

For the opposite direction, use `receipts_list_assigned_transactions`.

Endpoint: POST /transactions/assigned-receipts/get

Input parameters:

- `confirmed_only` (boolean): If true, only confirmed assignments will be returned. If specified, the field will be validated.
- `transaction_id_by_customer` (integer, required): The id_by_customer of the transaction.

Output parameters:

- `data` (array): An array of receipts data
- `message` (string): blank
- `rows` (integer): Number of returned rows
- `success` (boolean): Success boolean

### `accounts_create` (~286 tokens)

Accounts: add a basic account

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add a basic account**

Use to register a new bank, cash or credit-card account before importing transactions for it.

Not for chart-of-accounts entries. To add a posting account number, use `postingaccounts_create`.

Not idempotent: calling twice with the same name creates two accounts. Check `accounts_list` first. v1 offers no way to update or delete an account afterwards.

Endpoint: POST /accounts/add

Input parameters:

- `is_revision_safe` (boolean): If you create a basic account of type cash, you can make this revision_safe. That means, you cannot remove already saved transactions without creating a cancellation transaction. NOTE: This will only…
- `name` (string, required): The name of the basic account.
- `postingaccount_number` (integer, required): The postingaccount_number of the basic account.
- `receipt_creates_transaction` (boolean): If a receipt assigned to this basic account should automatically create a transaction, this parameter should be true.  If specified, the field will be validated.
- `type` (string, required): The type of the basic account. Accepted values: "cash", "bank/institution", "other".

Output parameters:

- `message` (string): blank
- `postingaccount_number` (string): blank
- `success` (boolean): Success boolean

### `comments_create` (~238 tokens)

Comments: add comment to transaction or receipt

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add comment to transaction or receipt**

Add comment to transaction or receipt.
NOTE: You have to submit either a transaction_id_by_customer or a receipt_id_by_customer.

Use to attach a free-text note to one receipt or one transaction, for example to record why a booking was categorised the way it was.

Exactly one of `transaction_id_by_customer` or `receipt_id_by_customer` must be set. v1 offers no endpoint to read, edit or delete comments, so a comment written here can only be seen in the BuchhaltungsButler web app.

Endpoint: POST /comments/add

Input parameters:

- `comment_text` (string, required): The comment text as a string between 2 and 210 characters.
- `receipt_id_by_customer` (integer): The id_by_customer of the receipt. If specified, the field will be validated.
- `transaction_id_by_customer` (integer): The id_by_customer of the transaction. If specified, the field will be validated.

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `cost_locations_create` (~129 tokens)

Cost Locations: add cost location

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add cost location**

Add a new cost location.

Use to create a cost centre before referencing it from a posting.

Not idempotent. Check `cost_locations_list` first to avoid a duplicate.

Endpoint: POST /cost-locations/add

Input parameters:

- `code` (string, required): An alphanumeric identifier for the cost location (max 10 chars)
- `name` (string, required): The name/description of the cost location

Output parameters:

- `code` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

### `creditors_create` (~179 tokens)

Settings: create creditor

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create creditor**

Create a creditor account.

Use to create one or more suppliers.

For customers you invoice, use `debtors_create`.

Takes one or many: pass an array of creditors in `creditors`. A single record is an array of one.

Not idempotent: check `creditors_list` first, since a repeated call creates duplicate suppliers. v1 offers no delete endpoint, so a creditor created here can only be updated afterwards, never removed.

Endpoint: POST /settings/add-batch/creditors

Input parameters:

- `creditors` (array, required): an array of creditors, each creditor has the field declaration and validation from the single add/creditor endpoint

Output parameters:

- `creditors` (array)
- `errors` (array)
- `success` (boolean): Success boolean

### `debtors_create` (~177 tokens)

Settings: create debtor

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create debtor**

Create a debtor account.

Use to create one or more customers.

For suppliers you buy from, use `creditors_create`.

Takes one or many: pass an array of debtors in `debtors`. A single record is an array of one.

Not idempotent: check `debtors_list` first. v1 offers no delete endpoint, so a debtor created here can only be updated afterwards, never removed.

Endpoint: POST /settings/add-batch/debtors

Input parameters:

- `debtors` (array, required): an array of debtors, each debtor has the field declaration and validation from the single add/debtor endpoint

Output parameters:

- `debtors` (array)
- `errors` (array)
- `success` (boolean): Success boolean

### `invoices_create` (~1184 tokens)

Invoices: create invoice

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create invoice**

Add an invoice for the specified customer.

Use to issue a final outgoing invoice that is booked immediately.

For an invoice that should stay editable, use `invoices_create_draft`. For a structured XML invoice in XRechnung or ZUGFeRD format, use `invoices_create_e_invoice`.

Not idempotent: a second call issues a second invoice with a new number. v1 offers no endpoint to list, change or cancel an invoice once created.

Endpoint: POST /invoices/create

Input parameters:

- `additional_addressline` (string): The additional address information of the recipient company. If specified, the field will be validated.
- `city` (string): The city of the recipient company. If specified, the field will be validated.
- `company_name` (string, required): The company name of the recipient.
- `contact_person_name` (string): The name of the contact person of the recipient company. If specified, the field will be validated.
- `correspondence` (string): The optional correspondence to the invoice recipient. If specified, the field will be validated.
- `country` (string): The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [Dänemark] OR the two digit ISO code of the country [DK].
- `customer_number` (string): The customer number of the recipient. If specified, the field will be validated.
- `date` (string, required): The date of the invoice.
- `date_of_supply` (string): Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will a…
- `discount_type` (string): The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated.
- `discount_value` (string): The value of granted discount. If specified, the field will be validated.
- `due_days` (string): The number of days between the invoice date and the due date. If specified, the field will be validated.
- `email` (string): The email for sending the invoice. If specified, the field will be validated.
- `final_provisions` (string): The final comment of the invoice. If specified, the field will be validated.
- `invoicenumber` (string): The invoicenumber for the invoice. If not specified, the default BHB number will be created. If specified, the field will be validated.
- `item_amount` (array, required): An array of invoice item amounts. Usage: "item_amount" : ['10', '20']
- `item_description` (array): An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated.
- `item_name` (array, required): An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2']
- `item_single_price` (array, required): An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99']
- `item_unit` (array, required): An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.']
- `item_vat` (array, required): An array of invoice item vats. Usage: "item_vat" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100.
- `language` (string): The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used.
- `payment_conditions` (string): The payment conditions of the invoice. If specified, the field will be validated.
- `payment_reference` (string): The payment reference id. If specified correctly, the resulting receipt of the created invoice will match with the corresponding transaction. NOTE: Currently we support Amazon order id, PayPal tran…
- `recurring_date_next` (string): The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated.
- `recurring_interval` (string): An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated.
- `show_bankdata` (boolean): Show the the bank data on the invoice. If specified, the field will be validated.
- `show_contactdata` (boolean): Show the contact data on the invoice. If specified, the field will be validated.
- `show_prices_type` (string, required): Can be either 'net' ("Netto") or 'gross' ("Brutto").
- `street` (string): The street of the recipient company. If specified, the field will be validated.
- `type` (string, required): Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot").
- `zip` (string): The zip of the recipient company. If specified, the field will be validated.

Output parameters:

- `file_name` (string): Filename of the created invoice
- `id_by_customer` (string): blank
- `invoicenumber` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

### `invoices_create_draft` (~1057 tokens)

Invoices: create invoice draft

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create invoice draft**

Add an invoice draft for the specified customer.

Use to prepare an invoice that a human should review and release in the BuchhaltungsButler web app.

A draft is not booked and carries no invoice number. To issue a final invoice directly, use `invoices_create`.

v1 offers no endpoint to list, edit or release drafts. Releasing happens in the web app.

Endpoint: POST /invoices/create/draft

Input parameters:

- `additional_addressline` (string): The additional address information of the recipient company. If specified, the field will be validated.
- `city` (string): The city of the recipient company. If specified, the field will be validated.
- `company_name` (string, required): The company name of the recipient.
- `contact_person_name` (string): The name of the contact person of the recipient company. If specified, the field will be validated.
- `correspondence` (string): The optional correspondence to the invoice recipient. If specified, the field will be validated.
- `country` (string): The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [Dänemark] OR the two digit ISO code of the country [DK].
- `customer_number` (string): The customer number of the recipient. If specified, the field will be validated.
- `date` (string, required): The date of the invoice.
- `date_of_supply` (string): Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will a…
- `discount_type` (string): The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated.
- `discount_value` (string): The value of granted discount. If specified, the field will be validated.
- `email` (string): The email for sending the invoice. If specified, the field will be validated.
- `final_provisions` (string): The final comment of the invoice. If specified, the field will be validated.
- `item_amount` (array, required): An array of invoice item amounts. Usage: "item_amount" : ['10', '20']
- `item_description` (array): An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated.
- `item_name` (array, required): An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2']
- `item_single_price` (array, required): An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99']
- `item_unit` (array, required): An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.']
- `item_vat` (array, required): An array of invoice item vats. Usage: "item_vat" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100.
- `language` (string): The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used.
- `payment_conditions` (string): The payment conditions of the invoice. If specified, the field will be validated.
- `recurring_date_next` (string): The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated.
- `recurring_interval` (string): An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated.
- `show_bankdata` (boolean): Show the the bank data on the invoice. If specified, the field will be validated.
- `show_contactdata` (boolean): Show the contact data on the invoice. If specified, the field will be validated.
- `show_prices_type` (string, required): Can be either 'net' ("Netto") or 'gross' ("Brutto").
- `street` (string): The street of the recipient company. If specified, the field will be validated.
- `type` (string, required): Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot").
- `zip` (string): The zip of the recipient company. If specified, the field will be validated.

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `invoices_create_e_invoice` (~1320 tokens)

Invoices: create e-invoice

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create e-invoice**

Add an e-invoice for the specified customer.

Use when the recipient requires a structured electronic invoice, for example a German public-sector customer expecting XRechnung.

For an ordinary PDF invoice, use `invoices_create`.

Not idempotent. v1 offers no endpoint to list or cancel an e-invoice once created.

Endpoint: POST /invoices/create/e-invoice

Input parameters:

- `additional_addressline` (string): The additional address information of the recipient company. If specified, the field will be validated.
- `city` (string, required): The city of the recipient company. If specified, the field will be validated.
- `company_name` (string, required): The company name of the recipient.
- `contact_person_name` (string): The name of the contact person of the recipient company. If specified, the field will be validated.
- `correspondence` (string): The optional correspondence to the invoice recipient. If specified, the field will be validated.
- `country` (string, required): The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [Dänemark] OR the two digit ISO code of the country [DK].
- `customer_number` (string): The customer number of the recipient. If specified, the field will be validated.
- `date` (string, required): The date of the invoice.
- `date_of_supply` (string): Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will a…
- `discount_type` (string): The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated.
- `discount_value` (string): The value of granted discount. If specified, the field will be validated.
- `due_days` (string): The number of days between the invoice date and the due date. If not specified due date will be set to invoice date (due_days = 0).
- `e_invoice_id` (string, required): Buyer reference (default: 0). If you do not have a reference, please enter "0". A valid is mandatory for e-invoices to public contracting authorities and is provided by the recipient.
- `email` (string, required): The email for sending the invoice. If specified, the field will be validated.
- `final_provisions` (string): The final comment of the invoice. If specified, the field will be validated.
- `invoicenumber` (string): The invoicenumber for the invoice. If not specified, the default BHB number will be created. If specified, the field will be validated.
- `item_amount` (array, required): An array of invoice item amounts. Usage: "item_amount" : ['10', '20']
- `item_description` (array): An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated.
- `item_name` (array, required): An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2']
- `item_single_price` (array, required): An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99']
- `item_tax_amount` (array, required): Only required if corresponding item_tax_type = 'S' (VAT). An array of invoice item vats. Usage: "item_tax_amount" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100.
- `item_tax_type` (array, required): An array of invoice item tax types. Usage: "item_vat" : ['S', 'E'] Valid tax types are the following: S - VAT (standard rate) Z - 0% VAT AE - Reverse Charge (§13b) K - EU Supply (Intra-community su…
- `item_unit` (array, required): An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.']
- `language` (string): The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used.
- `payment_conditions` (string): The payment conditions of the invoice. If specified, the field will be validated.
- `payment_reference` (string): The payment reference id. If specified correctly, the resulting receipt of the created invoice will match with the corresponding transaction. NOTE: Currently we support Amazon order id, PayPal tran…
- `recurring_date_next` (string): The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated.
- `recurring_interval` (string): An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated.
- `show_bankdata` (boolean): Show the the bank data on the invoice. If specified, the field will be validated.
- `show_contactdata` (boolean): Show the contact data on the invoice. If specified, the field will be validated.
- `show_prices_type` (string, required): Can be either 'net' ("Netto") or 'gross' ("Brutto").
- `street` (string, required): The street of the recipient company. If specified, the field will be validated.
- `type` (string, required): Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot").
- `zip` (string, required): The zip of the recipient company. If specified, the field will be validated.

Output parameters:

- `file_name` (string): Filename of the created invoice
- `id_by_customer` (string): blank
- `invoicenumber` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

### `postingaccounts_create` (~188 tokens)

Settings: add postingaccount

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add postingaccount**

Create a postingaccount.

Use to add an account number to the chart of accounts that the standard chart does not cover.

To register a bank or cash account, use `accounts_create`.

Not idempotent. v1 offers no delete endpoint, so a posting account created here can only be updated afterwards.

Endpoint: POST /settings/add/postingaccount

Input parameters:

- `name` (string, required): The name of your new postingaccount.
- `parent_postingaccount_number` (integer, required): The parent postingaccount number of your new postingaccount.This is the postingaccount from which your individually created postingaccount inherits their properties.
- `postingaccount_number` (integer, required): The postingaccount number of your new postingaccount.

Output parameters:

- `message` (string): blank
- `parent_postingaccount_number` (string): blank
- `postingaccount_number` (string): blank
- `success` (boolean): Success boolean

### `postings_create_for_receipt` (~293 tokens)

Postings: add receipt posting

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add receipt posting**

Add postings for a specified receipt. Important: Receipt postings are only available if creditor or debtor posting is activated!

IMPORTANT:
If you add postings to a receipt with foreign currency, you have to get that receipt (/receipts/get/id_by_customer) and find the calculated amount before performing this request.

Use to book one or more receipts that already exist in BuchhaltungsButler, splitting each across posting accounts, VAT rates and cost centres.

For a journal entry with no receipt behind it, use `postings_create_free`.

Takes one or many: pass an array of receipts in `receipts`. A single record is an array of one.

The per-receipt arrays (`postingaccounts`, `amounts`, `vats`, `postingtexts`) are positional: index 0 of each describes the same split line, so they must all have the same length. Not idempotent. Reversible with `postings_unconfirm_for_receipt` while the posting is not fixed.

Endpoint: POST /postings/add-batch/receipts

Input parameters:

- `receipts` (array, required): an array of receipt postings, each receipt posting has the same field declaration and validation as the postings/add/receipt endpoint

Output parameters:

- `errors` (array)
- `receipts` (array)
- `success` (boolean): Success boolean

### `postings_create_for_transaction` (~200 tokens)

Postings: add transaction posting

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add transaction posting**

Add postings for a specified transaction.

Use to book one or more bank transactions, splitting each across posting accounts, VAT rates and cost centres.

For a journal entry with no bank transaction behind it, use `postings_create_free`.

Takes one or many: pass an array of transactions in `transactions`. A single record is an array of one.

The per-transaction arrays are positional and must all have the same length. Not idempotent. Reversible with `postings_unconfirm_for_transaction` while the posting is not fixed.

Endpoint: POST /postings/add-batch/transactions

Input parameters:

- `transactions` (array, required): an array of transaction postings, each transaction posting has the same field declaration and validation as the postings/add/transaction endpoint

Output parameters:

- `errors` (array)
- `success` (boolean): Success boolean
- `transactions` (array)

### `postings_create_free` (~251 tokens)

Postings: add free posting

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add free posting**

Add a free posting.

Use to book a debit/credit pair that is not tied to an existing receipt or bank transaction, such as a manual accrual or a correction.

If the booking documents a receipt, use `postings_create_for_receipt`. If it settles a bank transaction, use `postings_create_for_transaction`.

Takes one or many: pass an array of free postings in `free_postings`. A single record is an array of one.

A "free" posting is BuchhaltungsButler's term for a standalone journal entry: you name both sides yourself via `postingaccount_debit` and `postingaccount_credit`. Not idempotent, so a repeated call books the amount twice. A receipt can be attached afterwards with `postings_assign_receipt_to_free`.

Endpoint: POST /postings/add-batch/free

Input parameters:

- `free_postings` (array, required): an array of free postings, each free posting has the same field declaration and validation as the postings/add/free endpoint

Output parameters:

- `errors` (array)
- `free_postings` (array)
- `success` (boolean): Success boolean

### `receipts_create` (~226 tokens)

Receipts: add a receipt

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add a receipt**

Add a receipt into the specified customer account. NOTE: Use this endpoint, to add a receipt without a file!

Use to record receipts that have no file attached, for example when the document lives in another system.

If you have the actual PDF or image, use `receipts_upload` instead so BuchhaltungsButler can read the document and pre-fill its data.

Takes one or many: pass an array of receipts in `receipts`. A single record is an array of one.

Not idempotent: a repeated call creates duplicate receipts. The response reports per-item success, so a partial failure leaves the successful entries in place.

Endpoint: POST /receipts/addBatch

Input parameters:

- `receipts` (array, required): list of receipts maximum of 50 receipts are allowed A receipt has the same fields like the /receipts/add endpoint has, same applies for error messages

Output parameters:

- `errors` (array)
- `receipts` (array)
- `success` (boolean): is the request successful or faulty

### `receipts_upload` (~1069 tokens)

Receipts: upload receipt

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**upload receipt**

Upload a receipt into the specified customer account. The receipt will be processed by the BuchhaltungsButler technology. The response includes the filename (without extension) of the receipt as it is stored.

Note: max 10 requests per minute

Use to send the actual receipt file. BuchhaltungsButler runs document recognition on it and returns the stored filename.

To record a receipt without a file, use `receipts_create`.

Rate limited to 10 requests per minute. Not idempotent, so uploading the same file twice creates two receipts.

Endpoint: POST /receipts/upload

Input parameters:

- `account` (integer): If the receipt shall directly be assigned to a payment account, you can specify its posting account number (e.g. '1200'). If specified, the account must exist as a payment account for the customer.…
- `amount` (number): The total amount of the receipt, can be negative to indicate a reversed payment (e.g. -12.30). If specified, the field will be validated. '0.00' is not considered a valid receipt amount.  NOTE: Thi…
- `counterparty` (string): The counterparty of the receipt, i.e. the invoicing party for type 'invoice inbound' or the recipient for type 'invoice outbound' (e.g. 'Peter Maier'). If specified, the field will be validated. An…
- `creditor_debtor` (integer): If the receipt shall directly be assigned to a creditor (for type 'invoice inbound') or debtor (for type 'invoice outbound') account, you can specify its posting account number (e.g. '70001'). If sp…
- `currency` (string): Has to be 'EUR' if specified. If specified, the field will be validated. An empty string is not considered a valid currency.  NOTE: This parameter will be ignored when you upload an e-invoice!
- `date` (string): The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). If specified, the field will be validated. An empty string is not considered a valid date.  NOTE: This parameter will be ignor…
- `date_delivery` (string): The delivery date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). NOTE: Due to the DATEV compatibility, we cannot accept a delivery date that is after the receipt date! If specified, it will be validat…
- `date_payment_due` (string): The payment due date in format 'YYYY-MM-DD' (e.g. '2017-04-26').  NOTE: This parameter will be ignored when you upload an e-invoice!
- `file` (string, required): The receipt file as real file upload or as base64 encoded string. Accepted file types are: application/pdf, text/xml, application/xml, image/jpeg, image/png, image/bmp, image/tiff
- `file_name` (string): The name of the file.  NOTE: This is required for files sent as base64 encoded string and will be ignored for files sent as real upload.
- `invoice_number` (string): The invoice number (e.g. '1231XU23') with a maximum length of 60 characters - may also be an empty string.  NOTE: This parameter will be ignored when you upload an e-invoice!
- `link_to_receipt_id_by_customer` (integer): Has to be a valid id_by_customer of another receipt. If specified, both receipts will be assigned to a transaction if one of them is assigned manually.
- `payment_reference` (string): The payment reference id. If specified correctly, the uploaded receipt will match with the corresponding transaction. Currently we support Amazon order id, PayPal transaction id and Stripe transact…
- `type` (string, required): Can be 'invoice inbound' ("Eingangsrechnung"), 'invoice outbound' ("Ausgangsrechnung"), 'credit inbound' ("Eingangsgutschrift § 14 UStG"), 'credit outbound' ("Ausgangsgutschrift § 14 UStG").
- `vat_rate` (number): The receipt's vat rate (e.g. 19.00 or 0) - may also be an empty string to indicate a non-available or multiple vat rates.  NOTE: This parameter will be ignored when you upload an e-invoice!

Output parameters:

- `filename` (string): Internal filename after upload without extension
- `id_by_customer` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

### `reports_create_bwa` (~288 tokens)

Reports: create bwa report

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create bwa report**

Triggers the creation of a BWA report ("Betriebswirtschaftliche Auswertung").

The report is generated asynchronously in the background. The response contains the id_by_customer of the created report, which may be used to retrieve it once the generation has been finished.

A new report may only be requested once the generation of a previously requested report of the same type has been finished.

Use to request a BWA (Betriebswirtschaftliche Auswertung, the German management report). Step one of two.

This only triggers generation. To read the finished report, call `reports_get_bwa` afterwards.

Runs asynchronously and returns an id, not the report. A new BWA can only be requested once the previous one has finished, and it replaces the previous one.

Endpoint: POST /reports/create/bwa

Input parameters:

- `date_from` (string, required): The first day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-01-01').
- `date_to` (string, required): The last day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-03-31').

Output parameters:

- `id_by_customer` (string): The id_by_customer of the created report
- `message` (string): blank
- `success` (boolean): Success boolean

### `reports_create_sums` (~448 tokens)

Reports: create sums report

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**create sums report**

Triggers the creation of a sums report ("Summen- und Saldenliste"). The report is always created for all of the customer's postingaccounts.

The report is generated asynchronously in the background. The response contains the id_by_customer of the created report, which may be used to retrieve it once the generation has been finished.

A new report may only be requested once the generation of a previously requested report of the same type has been finished.

Use to request a sums and balances report (Summen- und Saldenliste). Step one of two.

To read the finished report, call `reports_get_sums` afterwards.

Runs asynchronously and returns an id. A new report may only be requested once the previous one has finished, and it replaces the previous one.

Endpoint: POST /reports/create/sums

Input parameters:

- `archive_export` (boolean): If true, a zip archive containing the csv file and the postingaccount ledgers ("Kontenbl&auml;tter") will be created for the report additionally. If specified, the field will be validated.
- `base` (string): The date the postings are taken into account by. Can be either 'date' ("Buchungsdatum") or 'date_delivery_else_date' ("Buchungs- und Leistungsdatum"). If specified, the field will be validated.
- `date_from` (string, required): The first day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-01-01').
- `date_to` (string, required): The last day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-03-31').
- `file_csv` (boolean): If true, a csv file will be created for the report additionally. If specified, the field will be validated.
- `file_pdf` (boolean): If true, a pdf file will be created for the report additionally. If specified, the field will be validated.

Output parameters:

- `id_by_customer` (string): The id_by_customer of the created report
- `message` (string): blank
- `success` (boolean): Success boolean

### `transactions_create` (~200 tokens)

Transactions: add transaction

🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates.

\**add transaction**

Add a transaction to a payment account of the specified customer.

Use to import bank transactions that no bank connection delivers automatically, for example from a CSV export or a cash book.

Takes one or many: pass an array of transactions in `transactions`. A single record is an array of one.

Not idempotent and there is no duplicate detection: re-importing the same statement books every line a second time. Check `transactions_list` for the date range first. v1 offers no endpoint to update or delete an imported transaction.

Endpoint: POST /transactions/addBatch

Input parameters:

- `transactions` (array, required): list of transactions maximum of 50 transactions are allowed A transaction has the same fields like the /transactions/add endpoint has, same applies for error messages

Output parameters:

- `errors` (array)
- `success` (boolean): is the request successful or faulty
- `transactions` (array)

### `cost_locations_update` (~112 tokens)

Cost Locations: update cost location

🟡 WRITE · updates data: Modifies existing master data in place.

\**update cost location**

Update a cost location's name/description.

Use to rename an existing cost centre or change its number.

Overwrites the fields you send. Read the current record with `cost_locations_list` first if you intend a partial change.

Endpoint: POST /cost-locations/update

Input parameters:

- `code` (string, required): The cost location code
- `name` (string, required): The updated name/description of the cost location

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `creditors_update` (~409 tokens)

Settings: update creditor

🟡 WRITE · updates data: Modifies existing master data in place.

\**update creditor**

Update a creditor account.

Use to change a supplier's address, bank details or payment terms.

Overwrites the fields you send. Read the current record with `creditors_list` first if you intend a partial change.

Endpoint: POST /settings/update/creditor

Input parameters:

- `additional_address_line` (string): The new additional address line of the creditor account. If specified, the field will be validated.
- `bic` (string): The new bic of the creditor account. If specified, the field will be validated.
- `city` (string): The new city of the creditor account. If specified, the field will be validated.
- `contact_person_name` (string): The new contact person name of the creditor account. If specified, the field will be validated.
- `country` (string): The new country of the creditor account. If specified, the field will be validated. Valid cases are only the German version of the country name [Dänemark] OR the two digit ISO code of the country […
- `due_in_days` (integer): The due in days of your new debtor account. If specified, the field will be validated.
- `email` (string): The email of the creditor account. If specified, the field will be validated.
- `iban` (string): The new iban of the creditor account. If specified, the field will be validated.
- `name` (string): The new name of the creditor account
- `postingaccount_number` (integer, required): The postingaccount_number of the creditor account
- `sales_tax_id` (string): The new sales tax id of the creditor account. If specified, the field will be validated.
- `street` (string): The new street of the creditor account. If specified, the field will be validated.
- `zip` (string): The new zip of the creditor account. If specified, the field will be validated.

Output parameters:

- `data` (object): the updated Debitor
- `message` (string): blank
- `success` (boolean): Success boolean

### `debtors_update` (~409 tokens)

Settings: update debtor

🟡 WRITE · updates data: Modifies existing master data in place.

\**update debtor**

Update a debtor account.

Use to change a customer's address, bank details or customer number.

Overwrites the fields you send. Read the current record with `debtors_list` first if you intend a partial change.

Endpoint: POST /settings/update/debtor

Input parameters:

- `additional_address_line` (string): The new additional address line of the debtor account. If specified, the field will be validated.
- `bic` (string): The new bic of the debtor account. If specified, the field will be validated.
- `city` (string): The new city of the debtor account. If specified, the field will be validated.
- `contact_person_name` (string): The new contact person name of the debtor account. If specified, the field will be validated.
- `country` (string): The new country of the debtor account. If specified, the field will be validated. Valid cases are only the German version of the country name [Dänemark] OR the two digit ISO code of the country [DK…
- `customer_number` (string): The new customer_number of the debtor account. If specified, the field will be validated.
- `email` (string): The email of the debtor account. If specified, the field will be validated.
- `iban` (string): The new iban of the debtor account. If specified, the field will be validated.
- `name` (string): The new name of the new debtor account
- `postingaccount_number` (integer, required): The postingaccount_number of the debtor account
- `sales_tax_id` (string): The new sales tax id of the debtor account. If specified, the field will be validated.
- `street` (string): The new street of the debtor account. If specified, the field will be validated.
- `zip` (string): The new zip of the debtor account. If specified, the field will be validated.

Output parameters:

- `data` (object): the updated Debitor
- `message` (string): blank
- `success` (boolean): Success boolean

### `postingaccounts_update` (~116 tokens)

Settings: update postingaccount

🟡 WRITE · updates data: Modifies existing master data in place.

\**update postingaccount**

Update a postingaccount.

Use to rename a posting account or change its properties.

Overwrites the fields you send. Read the current record with `postingaccounts_list` first if you intend a partial change.

Endpoint: POST /settings/update/postingaccount

Input parameters:

- `name` (string, required): The new name of the postingaccount to update.
- `postingaccount_number` (integer, required): The postingaccount number of the postingaccount to update.

Output parameters:

- `data` (object): the updated postingaccount
- `message` (string): blank
- `success` (boolean): Success boolean

### `postings_assign_receipt_to_free` (~148 tokens)

Postings: assign receipt to free posting

🟡 WRITE · links/unlinks records: Creates or removes an assignment between records (e.g. receipt ↔ transaction). Reversible.

\**assign receipt to free posting**

Assign a receipt to a free posting.

Use to attach a receipt to a free posting that was booked without one, so the entry has its supporting document.

To link a receipt to a bank transaction rather than a posting, use `transactions_assign_receipts`.

Endpoint: POST /postings/assign/receipt-to-free-posting

Input parameters:

- `posting_id_by_customer` (integer, required): The id_by_customer of the posting.
- `receipt_id_by_customer` (integer, required): The id_by_customer of the receipt.

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `transactions_assign_receipts` (~189 tokens)

Transactions: assign receipt to transaction

🟡 WRITE · links/unlinks records: Creates or removes an assignment between records (e.g. receipt ↔ transaction). Reversible.

\**assign receipt to transaction**

Assign a receipt to a transaction.

Use to match receipts to the bank transactions that paid them, one pair or many at once.

To attach a receipt to a posting rather than a bank transaction, use `postings_assign_receipt_to_free`.

Takes one or many: pass an array of transactions to receipts in `transactions_to_receipts`. A single record is an array of one.

Reversible with `transactions_unassign_receipt`. Creating the link does not book anything: use `postings_create_for_transaction` to post the transaction.

Endpoint: POST /transactions/assign-batch/receipt

Input parameters:

- `transactions_to_receipts` (array, required): list of receipts to transactions maximum of 50 element are allowed

Output parameters:

- `errors` (array)
- `success` (boolean): is the request successful or faulty
- `transactions_to_receipts` (array)

### `transactions_unassign_receipt` (~136 tokens)

Transactions: unassign a specific receipt from a transaction

🟡 WRITE · links/unlinks records: Creates or removes an assignment between records (e.g. receipt ↔ transaction). Reversible.

\**unassign a specific receipt from a transaction**

Unassign a specific receipt from a transaction.

Use to undo a receipt-to-transaction match that was made in error.

Removes only the link. Neither the receipt nor the transaction is deleted.

Endpoint: POST /transactions/unassign/receipt

Input parameters:

- `receipt_id_by_customer` (integer, required): The id_by_customer of the receipt to unassign.
- `transaction_id_by_customer` (integer, required): The id_by_customer of the transaction.

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `postings_unconfirm_for_receipt` (~147 tokens)

Postings: unconfirm receipt posting

🟡 WRITE · reverts state: Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible.

\**unconfirm receipt posting**

Remove postings for a specified receipt by unconfirming them. This will only work if the postings are not fixed.

Use to send a receipt posting back to the unconfirmed state so it can be corrected.

This keeps the posting and only clears its confirmation. To remove the posting itself, use `postings_cancel`.

Only works while the posting is not fixed.

Endpoint: POST /postings/unconfirm/receipt

Input parameters:

- `receipt_id_by_customer` (integer, required): The id_by_customer of the receipt.

Output parameters:

- `message` (string): Success message
- `success` (boolean): Success boolean

### `postings_unconfirm_for_transaction` (~146 tokens)

Postings: unconfirm transaction posting

🟡 WRITE · reverts state: Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible.

\**unconfirm transaction posting**

Remove postings for a specified transaction by unconfirming them. This will only work if the postings are not fixed.

Use to send a transaction posting back to the unconfirmed state so it can be corrected.

This keeps the posting and only clears its confirmation. To remove the posting itself, use `postings_cancel`.

Only works while the posting is not fixed.

Endpoint: POST /postings/unconfirm/transaction

Input parameters:

- `transaction_id_by_customer` (integer, required): The id_by_customer of the transaction.

Output parameters:

- `message` (string): Success message
- `success` (boolean): Success boolean

### `postings_unconfirm_free` (~153 tokens)

Postings: unconfirm free posting

🟡 WRITE · reverts state: Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible.

\**unconfirm free posting**

Remove a specified free posting by unconfirming it. This will only work if the posting is not fixed.

Use to send a free posting back to the unconfirmed state so it can be corrected.

This keeps the posting and only clears its confirmation. To remove the posting itself, use `postings_cancel`.

Only works while the posting is not fixed. Fixed postings can no longer be unconfirmed.

Endpoint: POST /postings/unconfirm/free

Input parameters:

- `posting_id_by_customer` (integer, required): The id_by_customer of the free posting.

Output parameters:

- `message` (string): Success message
- `success` (boolean): Success boolean

### `receipts_restore` (~109 tokens)

Receipts: restore deleted receipt by id_by_customer

🟡 WRITE · reverts state: Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible.

\**restore deleted receipt by id_by_customer**

Restore a marked as deleted receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.

Use to bring back a receipt that was deleted with `receipts_delete`.

Endpoint: POST /receipts/restore/id_by_customer

Output parameters:

- `id_by_customer` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

### `cost_locations_delete` (~126 tokens)

Cost Locations: delete cost location

🔴 DESTRUCTIVE · deletes data: Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting.

\**delete cost location**

Delete a cost location.

Use to remove a cost centre that is no longer needed.

Permanent. Unlike a deleted receipt there is no restore endpoint, so confirm with the user before calling.

Endpoint: POST /cost-locations/delete

Input parameters:

- `code` (string, required): The cost location code

Output parameters:

- `message` (string): blank
- `success` (boolean): Success boolean

### `postings_cancel` (~219 tokens)

Postings: cancel posting

🔴 DESTRUCTIVE · deletes data: Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting.

\**cancel posting**

Cancel a specified posting. Postings that are not fixed are deleted, fixed postings are cancelled by creating a reversal posting.

Use to take a booking out of the books entirely.

This is stronger than the `postings_unconfirm_*` tools: those keep the posting and only clear its confirmation, this one removes or reverses it. Prefer unconfirming when the goal is to edit and rebook.

The effect depends on the posting: one that is not yet fixed is deleted outright, a fixed one stays and is offset by a reversal posting, which leaves two visible entries in the journal. Confirm with the user before calling.

Endpoint: POST /postings/cancel

Input parameters:

- `posting_id_by_customer` (integer, required): The id_by_customer of the posting.

Output parameters:

- `message` (string): Success message
- `success` (boolean): Success boolean

### `receipts_delete` (~148 tokens)

Receipts: delete receipt by id_by_customer

🔴 DESTRUCTIVE · deletes data: Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting.

\**delete receipt by id_by_customer**

Mark a receipt as deleted for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.

Use to remove a receipt that was filed by mistake.

Recoverable: `receipts_restore` brings the receipt back. Confirm with the user before calling.

Endpoint: POST /receipts/delete/id_by_customer

Output parameters:

- `id_by_customer` (string): blank
- `message` (string): blank
- `success` (boolean): Success boolean

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2#diagnostics

## Score history

- 2026-09-20: 39
- 2026-09-19: 39
- 2026-09-18: 39
- 2026-09-17: 39
- 2026-09-16: 39
- 2026-09-15: 39
- 2026-09-14: 39

## Common questions

### What is the BuchhaltungsButler MCP server?

BuchhaltungsButler is an MCP server listed in the public MCP registry as io.github.ohneben/buchhaltungsbutler-mcp. BuchhaltungsButler API v1: alle 54 Endpunkte als 46 sicherheitskategorisierte MCP-Tools. This page covers its container image (ghcr.io/ohneben/buchhaltungsbutler-mcp:1.1.2).

### Is the BuchhaltungsButler MCP server safe to use?

BuchhaltungsButler scores 39 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the BuchhaltungsButler MCP server expose?

BuchhaltungsButler exposes 46 tools: accounts_list, cost_locations_list, creditors_list, debtors_list, postingaccounts_list, and 41 more. Their descriptions and schemas cost roughly 14,657 tokens of context every time the server is loaded.

### Is the BuchhaltungsButler MCP server still maintained?

BuchhaltungsButler is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the BuchhaltungsButler MCP server under?

BuchhaltungsButler declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/ohneben/Buchhaltungsbutler-MCP
- Changelog RSS feed: https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2.json
- HTML version of this page: https://verifymcp.io/servers/ohneben-buchhaltungsbutler-mcp/ghcr-io-ohneben-buchhaltungsbutler-mcp-1-1-2
