# Sicherheitseinbehalt jetzt fällig stellen (https://developer.bimetrics.de/reference/receivables/release-retention)

`POST https://app.bimetrics.de/api/receivable/{id}/retention-release`

operationId: `releaseRetention` · Berechtigung (Scope): `invoices:draft` · Bereich: Forderungen und Mahnungen

Stellt den Sicherheitseinbehalt der Rechnung ab heute fällig, etwa wenn die Firma eine Bürgschaft stellt. Rechnung, PDF und E-Rechnung bleiben unverändert, nur der Zahlstand folgt: Der Einbehalt zählt ab heute zum fälligen Betrag und lässt sich mahnen. Mit expectedReceivableVersion aus getReceivable, sonst 409 ReceivablePreviewChanged. Ohne Einbehalt 409 RetentionMissing; ein schon fälliger oder bezahlter bleibt, wie er ist. Der Grund steht im Protokoll.

Benötigt einen Schlüssel mit der Berechtigung `invoices:draft`.

> **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 Objekts dieser Firma (UUID); bei Forderungsständen und neuen Korrekturen die Quellentwurfs-ID. |
| `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`)

 

Schema `ReleaseRetention`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `expectedReceivableVersion` | string | receivableVersion aus getReceivable, unverändert. |
| `reason` | string | Optionaler Grund fürs Protokoll, eine Zeile, höchstens 200 Zeichen, zum Beispiel „Bürgschaft gestellt“. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/receivable/{id}/retention-release" \
  -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`: InvoiceReceivable |
| 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 (`InvoiceReceivable`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `activeReminder` | ActiveReminder | Ausgestellte Mahnung, deren Zahlungsfrist noch läuft; fehlt, wenn keine läuft. Solange sie läuft, steht die Rechnung nicht in der Prüfliste review=reminders. |
| `canCorrect` | boolean | Für das Original ist eine weitere Rechnungskorrektur möglich. |
| `canRemind` | boolean | Aktuelle Forderung darf gemahnt werden. Eine laufende Mahnung (activeReminder) sperrt nicht, eine Mahnsperre (reminderHold) schon. |
| `cancellationBlockReason` | string | Maschinenlesbarer Grund, warum ein Storno abgelehnt wird: cancelled (schon storniert), corrected (per Gutschrift gemindert), paid (bezahlt) oder matched (eine Zahlung ist zugeordnet). Fehlt, solange ein Storno möglich ist. |
| `correctableMinor` | integer | Noch korrigierbarer Bruttobetrag in Cent, unabhängig vom Zahlungsstand. |
| `correctedMinor` | integer | Summe ausgestellter, nicht aufgehobener Korrekturen in Cent. |
| `correctionBlockReason` | string | Maschinenlesbarer Grund, wenn canCorrect false ist: cancelled, fully_corrected, no_amount (Rechnung über 0 € oder weniger), cash_discount, reminder_charges oder booking_error. Fehlt, solange eine Gutschrift möglich ist. |
| `currency` | string | Währung EUR. |
| `customerName` | string | Name des Rechnungsempfängers. |
| `dueDate` | NaiveDate | Fälligkeitsdatum; null, falls nicht vorhanden. |
| `invoiceDate` | NaiveDate | Rechnungsdatum des Originals. |
| `lastPaymentOn` | NaiveDate | Datum der jüngsten Zahlung: Wertstellung der zugeordneten Banktransaktion oder Datum einer erfassten Zahlung; fehlt ohne Zahlung. |
| `lastPaymentTransactionId` | string (uuid) | ID der Banktransaktion dieser Zahlung; fehlt bei einer erfassten Zahlung. |
| `nextReminderLevel` | integer | Die vorgeschlagene nächste Stufe, solange canRemind gilt: eins über der höchsten ausgestellten, zurückgezogene zählen nicht. Fehlt nach Stufe 3. |
| `number` | string | Nummer der Originalrechnung. |
| `openMinor` | integer | Aktuell offener Betrag in Cent; nur bei paymentKnown=true aussagekräftig. |
| `originalGrossMinor` | integer | Ursprünglicher Bruttobetrag in Cent. |
| `paidMinor` | integer | Eindeutig zugeordnete bzw. dokumentierte Zahlung in Cent; nur bei paymentKnown=true aussagekräftig. |
| `paymentKnown` | boolean | Zahlungen sind eindeutig zuordenbar. Bei false keine zahlungsabhängigen Nullwerte als tatsächlichen Nullbetrag interpretieren. |
| `receivableVersion` | string | Digest des aktuellen Forderungsstands; unverändert als expectedReceivableVersion senden. |
| `refundDueMinor` | integer | Guthaben des Kunden bei Überzahlung in Cent, keine ausgeführte Auszahlung; nur bei paymentKnown=true aussagekräftig. |
| `remindAgainOn` | NaiveDate | Erster Tag, an dem die Prüfliste review=reminders die Rechnung wieder vorschlägt: späteste Zahlungsfrist ihrer ausgestellten Mahnungen plus 3 Tage, weil Zahlungen nachlaufen (Europe/Berlin). Fehlt ab diesem Tag und ohne ausgestellte Mahnung. Nur aussagekräftig, solange die Rechnung offen und mahnbar ist (canRemind): bezahlte, stornierte oder gesperrte Rechnungen schlägt die Prüfliste nicht vor. canRemind bleibt davon unberührt. |
| `reminderBlockReason` | string | Maschinenlesbarer Grund einer gesperrten Mahnung: cancelled, payment_unknown, settled, reminder_hold, retention_not_due (offen ist nur der Sicherheitseinbehalt, noch nicht fällig), due_date_missing oder not_overdue. |
| `reminderHold` | ActiveReminderHold | Mahnsperre, die heute gilt; fehlt ohne. |
| `retention` | ReceivableRetention | Sicherheitseinbehalt der Rechnung; fehlt ohne. Sein `heldMinor` gehört zu `openMinor`, Mahnungen fordern nur den Rest. |
| `sourceDocumentId` | string (uuid) | ID des ausgestellten Originalbelegs. |
| `sourceDraftId` | string (uuid) | ID des Originalrechnungsentwurfs. |
| `sourceLayoutId` | string | Gespeichertes Layout der Originalrechnung: modern oder classic. Ältere Rechnungen ohne Layoutangabe verwenden modern. |
| `sourceVersion` | string (date-time) | Aktueller updatedAt-Wert des Originalentwurfs. |

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