# Kostenstelle oder Verteilung ändern (https://developer.bimetrics.de/reference/cost-centers/update-cost-center)

`PUT https://app.bimetrics.de/api/cost-centers/{id}`

operationId: `updateCostCenter` · Berechtigung (Scope): `company:write` · Bereich: Kostenstellen

Ersetzt Name und Nummer einer Kostenstelle bzw. Name und Anteile einer Verteilung; `kind` bleibt, wie es ist. Schick deshalb immer alle Werte, auch die unveränderten. Den Namen kannst du jederzeit ändern. Nummer und Anteile stehen fest, sobald ein Beleg oder eine Buchung die Kostenstelle oder Verteilung trägt (`used`), damit ein erneuter Export alter Monate dieselben Zeilen ergibt. Eine Änderung daran lehnt die Route mit `409 CostCenterRejected` ab. Für andere Anteile legst du eine neue Verteilung an und archivierst die alte. `expectedUpdatedAt` ist das gelesene `updatedAt`; hat sich der Eintrag seitdem geändert, antwortet die Route mit `409 VersionConflict` und ändert nichts. Eine ID einer anderen Firma ergibt `404 CostCenterNotFound`.

Benötigt einen Schlüssel mit der Berechtigung `company: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 Kostenstelle oder Verteilung (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`)

name, code or shares; expectedUpdatedAt from the last read

Schema `CostCenterRequest`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `code` | string | Nur bei einer Kostenstelle: die KOST1 im DATEV-Export, 1 bis 8 Ziffern ohne führende Null oder 1 bis 8 Buchstaben ohne Umlaute, je Firma eindeutig. Fehlt bei einer Verteilung. |
| `expectedUpdatedAt` | string (date-time) | Nur beim Ändern: das zuletzt gelesene `updatedAt`, unverändert mit allen Nachkommastellen. Für API-Schlüssel Pflicht. |
| `kind` | string: `center`, `distribution` | Beim Anlegen Pflicht: `center` für eine Kostenstelle, `distribution` für eine Verteilung. Beim Ändern ohne Wirkung. |
| `name` | string | Name, höchstens 60 Zeichen, etwa „Standort Nord“. |
| `shares` | Array<CostCenterShare> | Nur bei einer Verteilung: die Kostenstellen mit ihren Anteilen, zusammen 10000 Basispunkte. Fehlt bei einer Kostenstelle. |

### Beispiel

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

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `archivedAt` | string (date-time) | Archiviert seit diesem Zeitpunkt: lässt sich nicht mehr auswählen, Belege behalten sie. Fehlt, solange aktiv. |
| `code` | string | Nur bei einer Kostenstelle: die KOST1 im DATEV-Export, 1 bis 8 Ziffern ohne führende Null oder 1 bis 8 Buchstaben ohne Umlaute, je Firma eindeutig. Fehlt bei einer Verteilung. |
| `companyId` | string (uuid) | ID der Firma. |
| `createdAt` | string (date-time) | Anlage in bimetrics. |
| `documents` | integer | Zahl der Belege, die sie tragen, ohne gelöschte. |
| `id` | string (uuid) | ID der Kostenstelle oder Verteilung. |
| `kind` | string: `center`, `distribution` | `center` für eine Kostenstelle, `distribution` für eine Verteilung. |
| `name` | string | Name, höchstens 60 Zeichen, etwa „Standort Nord“. |
| `shares` | Array<CostCenterShare> | Nur bei einer Verteilung: die Kostenstellen mit ihren Anteilen, zusammen 10000 Basispunkte. Fehlt bei einer Kostenstelle. |
| `updatedAt` | string (date-time) | Letzte Änderung. |
| `used` | boolean | `true`, sobald ein Beleg oder eine Buchung sie trägt, auch über eine Verteilung oder bei einem gelöschten Beleg mit Buchungen. Dann stehen Nummer und Anteile fest. |

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