# Version wiederherstellen (https://developer.bimetrics.de/reference/layouts/restore-layout-version)

`POST https://app.bimetrics.de/api/layouts/versions/{id}/restore`

operationId: `restoreLayoutVersion` · Berechtigung (Scope): `layout:write` · Bereich: Layouts

Legt eine neue Version mit dem Stand einer älteren Version desselben Layouts an, wie „Wiederherstellen“ im Editor; `originRef` nennt die wiederhergestellte. So lässt sich jede Änderung zurücknehmen. Eine Version mit `check: failed` lässt sich nicht wiederherstellen. Idempotency-Key bei Wiederholung unverändert senden.

Benötigt einen Schlüssel mit der Berechtigung `layout: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 der Version (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. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/layouts/versions/{id}/restore" -X POST \
  -H "Authorization: Bearer $BIMETRICS_API_KEY" \
  -H "Idempotency-Key: rechnung-2026-001"
```

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Erfolg. | `application/json`: Layout |
| 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 |
| 422 | Das Layout bricht eine Regel der Rechnung (`LayoutCheckFailed`, `context.code` nennt sie): Ein Bereich fehlt oder liegt außerhalb der Seite (`layout_check_region`), Bereiche überlappen (`layout_check_overlap`), das Anschriftfeld verlässt seinen Platz nach DIN 5008 (`layout_check_address`), ein Pflichtwert der E-Rechnung fehlt im Text (`layout_check_text`), ein Text ist zu klein (`layout_check_size`) oder eine Schrift fehlt (`layout_check_font`). Oder die E-Rechnung mit diesem Layout besteht die Prüfung nicht (`LayoutProbeFailed`). Einen anderen Wert wählen statt wiederholen. | `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 (`Layout`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `appliesTo` | Array<string>, kann null sein | Belegarten, für die das Layout gilt; `*` für alle ohne eigenes. Leer, wenn es für keine gilt. |
| `archivedAt` | string (date-time), kann null sein | Archiviert seit; `null`, solange nicht archiviert. |
| `editable` | boolean | False für das bisherige Layout `classic`: Es lässt sich nicht ändern. |
| `id` | string | ID des Layouts (UUID); `standard` für das Layout einer Firma ohne eigenes. |
| `module` | string | Modul mit Version, etwa `modern@2`. `classic@1` ist das bisherige Layout ohne Einstellungen. |
| `name` | string | Name, etwa „Angebote“. |
| `own` | boolean | False, solange die Firma kein eigenes Layout hat; die erste Änderung legt es an. |
| `spec` | LayoutSpec | Die Gestaltung. |
| `version` | LayoutVersion | Aktuelle Version; `null` ohne eigenes Layout. |

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