# Kassenbuch-Eintrag stornieren (https://developer.bimetrics.de/reference/cash-book/reverse-cash-book-entry)

`POST https://app.bimetrics.de/api/cash-book-entries/{id}/reverse`

operationId: `reverseCashBookEntry` · Berechtigung (Scope): `matching:write` · Bereich: Kassenbuch

Storniert einen Eintrag mit Grund: Ein neuer Eintrag mit eigener Nummer am selben Tag gleicht ihn aus, seine Buchungen werden gespiegelt. Bei einem Eintrag mit Beleg nimmt das Storno die Barzahlung am Beleg zurück. Jeder Eintrag lässt sich einmal stornieren, ein Storno nie. Auch nach dem Storno darf der Bestand nirgends unter 0 € fallen. Ist dem Eintrag ein Bankumsatz zugeordnet, lehnt die Route ab, bis die Zuordnung gelöst ist.

Benötigt einen Schlüssel mit der Berechtigung `matching:write`.

> **Achtung:** Ändert Daten der Firma; wird atomar mit Idempotenzbeleg und Herkunft protokolliert.
>
> KI-Agenten fragen vor diesem Aufruf beim Nutzer nach.

### Authentifizierung

`Authorization: Bearer bm_…` (alternativ `X-API-KEY: bm_…`, nie beide zugleich).

### Parameter

| Name | Ort | Pflicht | Typ | Beschreibung |
| --- | --- | --- | --- | --- |
| `id` | path | ja | string (uuid) | ID des Eintrags (UUID). |
| `Idempotency-Key` | header | ja | string | Stabiler Schlüssel für genau diese Änderung: 1–128 druckbare ASCII-Zeichen ohne Leerzeichen. Bei Wiederholungen denselben Schlüssel und unveränderten Inhalt senden; das Ergebnis wird nicht nochmals erzeugt. |

### Request-Body (`application/json`)

the reason

Schema `CashBookReverseEntryRequest`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `reason` | string | Pflicht: warum storniert wird, höchstens 120 Zeichen. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/cash-book-entries/{id}/reverse" \
  -H "Authorization: Bearer $BIMETRICS_API_KEY" \
  -H "Idempotency-Key: rechnung-2026-001" \
  -H "Content-Type: application/json" \
  -d '{"kind":"and","children":[],"limit":50,"offset":0}'
```

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Erfolg. | `application/json`: CashBookEntriesResult |
| 400 | Ungültige Anfrage, z. B. ein Parameter mit ungültigem Wert wie eine ID, die keine UUID ist; korrigieren statt wiederholen. Mehr unter [Fehler](https://developer.bimetrics.de/errors). | `application/json`: Error |
| 401 | Kein gültiger Schlüssel: fehlt (`Unauthorized`), ist unbekannt, abgelaufen oder widerrufen oder wurde nicht in genau einem Header gesendet (`InvalidAPIKey`). Schlüssel prüfen, nicht wiederholen. Auch eine ID, die zu einer anderen Firma gehört, ergibt `401 Unauthorized`. | `application/json`: Error |
| 403 | Dem Schlüssel fehlt die Berechtigung für diese Route (`APIKeyPermissionDenied`), oder die Firma hat keinen API-Zugang (mehr), etwa nach Ende der Testphase oder des Abos (`APIUnavailable`). | `application/json`: Error |
| 404 | Nicht gefunden (`NotFound`). | `application/json`: Error |
| 409 | Versionskonflikt (`VersionConflict`), abweichender Inhalt für denselben Idempotency-Key (`IdempotencyConflict`), Dublette (`ContactDuplicate`) oder fachlich gesperrte Änderung. Aktuellen Zustand laden und prüfen; keinen anderen Schlüssel verwenden, um einen Konflikt zu umgehen. | `application/json`: Error |
| 413 | Die Anfrage ist zu groß (`APIRequestTooLarge`), siehe `x-bimetrics-limits`. | `application/json`: Error |
| 429 | Zu viele Anfragen; nach `Retry-After` Sekunden erneut senden. Mehr unter [Fehler](https://developer.bimetrics.de/errors). (Header: Retry-After) | `application/json`: Error |
| 500 | Serverfehler; die Anfrage später wiederholen. Mehr unter [Fehler](https://developer.bimetrics.de/errors). | `application/json`: Error |

#### Felder der Antwort 200 (`CashBookEntriesResult`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `balanceMinor` | integer | Geld in der Kasse danach, in Cent. |
| `bookings` | Array<CashBookEntryBooking> | Nur in der Vorschau: die Buchungszeilen der Einträge ohne Beleg. |
| `entries` | Array<CashBookEntry>, kann null sein | Die Einträge; bei einer Wiederholung mit demselben Idempotency-Key leer. |
| `exported` | boolean | Nur in der Vorschau: `true`, wenn ein Eintrag in einem Zeitraum liegt, der schon an DATEV exportiert ist. Er kommt dann erst mit, wenn die Firma den Monat noch einmal exportiert. |
| `replayed` | boolean | `true` bei einer Wiederholung. |

Verschachtelte Schemas stehen vollständig in der OpenAPI-Beschreibung: https://app.bimetrics.de/api/openapi.json
