> For the complete documentation index, see [llms.txt](https://docs.blockbrain.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.blockbrain.ai/de/fur-administratoren/cost-center-admin-api.md).

# Kostenstellen-Admin-API

### **Umfang**

> Admin-API zur Verwaltung der gültigen Projektcodes eines Mandanten und des Umschalters für die Kostenstellenvalidierung: Authentifizierung, CRUD-Endpunkte für Einzelcodes und Batches, Massenimport per CSV/JSON mit Trockenlauf-Vorschau, Wertvalidierung und der Konfigurationsumschalter.
>
> **Die Referenz pro Endpunkt ist hier absichtlich komprimiert.** Die Live-Referenz, die stets aktuell ist, finden Sie unter [analytics.theblockbrain.ai/docs](https://analytics.theblockbrain.ai/docs#tag/admin--cost-center) (Scalar, automatisch aus der OpenAPI-Spezifikation gerendert). Diese Seite behandelt den Fließtext, das Authentifizierungsmodell sowie Anfrage-/Antwortbeispiele.

***

### Übersicht

Die Cost Center Admin API verwaltet die Liste gültiger **Projektcodes** und den **Umschalter für die Kostenstellenvalidierung**. Codes gelangen über den einzelnen REST-Endpunkt, die JSON-Batch-Endpunkte oder einen Massenimport per CSV/JSON herein, und jeder potenzielle Wert kann gegen die aktiven Codes des Mandanten geprüft werden.

**Basis-URL:** `https://analytics.theblockbrain.ai`

**Basis-Pfad:** `/api/v1/admin/cb-limit/cost-center`

| Eigenschaft    | Wert                                                                                                                  |
| -------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Basis-Pfad** | `/api/v1/admin/cb-limit/cost-center`                                                                                  |
| **Host**       | `https://analytics.theblockbrain.ai`                                                                                  |
| **Auth**       | Bearer **JWT** oder **API-Schlüssel** (`sk-`), Rolle **admin**. Der betroffene Mandant wird aus dem Token abgeleitet. |

> **Wann wird die Validierung durchgesetzt?** Nur wenn der Validierungsumschalter des Mandanten aktiviert ist (siehe `PUT /config`) und mindestens ein aktiver Code konfiguriert ist. Andernfalls wird jeder Wert akzeptiert. Jeder JSON-Batch-Endpunkt akzeptiert bis zu **10,000** Codes pro Anfrage. Verwenden Sie `/import` für größere Datenmengen.

***

### API-Übersicht

Alle Endpunkte, die die Cost Center Admin API anbietet. Pfade sind relativ zum Basispfad `/api/v1/admin/cb-limit/cost-center`. Ausführliche Details zu Anfrage und Antwort finden Sie in [Scalar](https://analytics.theblockbrain.ai/docs#tag/admin--cost-center).

| Gruppe        | Methode  | Endpunkt                  | Beschreibung                                                                       |
| ------------- | -------- | ------------------------- | ---------------------------------------------------------------------------------- |
| Codes         | `GET`    | `/codes`                  | Listet die Projektcodes des Mandanten auf (paginierbar, durchsuchbar, sortierbar). |
| Codes         | `POST`   | `/codes`                  | Einen einzelnen Projektcode hinzufügen oder aktualisieren (idempotentes Upsert).   |
| Codes         | `DELETE` | `/codes`                  | Einen Projektcode anhand seines Werts löschen.                                     |
| Codes         | `POST`   | `/codes/batch`            | Viele Codes in einer Anfrage hinzufügen oder aktualisieren.                        |
| Codes         | `POST`   | `/codes/batch-set-active` | Viele Codes aktivieren oder deaktivieren (pausieren oder fortsetzen).              |
| Codes         | `POST`   | `/codes/batch-delete`     | Viele Codes in einer Anfrage löschen.                                              |
| Validierung   | `POST`   | `/validate`               | Einen Wert gegen die aktiven Codes des Mandanten prüfen.                           |
| Import        | `POST`   | `/import`                 | Codes per CSV- oder JSON-Datei massenhaft importieren.                             |
| Import        | `POST`   | `/import/preview`         | Einen Import im Trockenlauf ausführen und jede Zeile klassifizieren.               |
| Konfiguration | `GET`    | `/config`                 | Den Validierungsumschalter auslesen.                                               |
| Konfiguration | `PUT`    | `/config`                 | Den Validierungsumschalter ein- oder ausschalten.                                  |

***

### Authentifizierung

Jeder Endpunkt erwartet ein Bearer-Token im `Authorization` -Header:

```
Authorization: Bearer <token>
```

Zwei Arten von Anmeldeinformationen werden akzeptiert, und beide laufen über denselben Header:

| Anmeldeinformation | Sieht aus wie                        | Wie es verifiziert wird                                                                                                                                                                           |
| ------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Zitadel JWT        | ein JWT (`header.payload.signature`) | Gegen Zitadel verifiziert (JWKS, mit Token-Introspection als Fallback). Dies ist der bestehende Zugriffstoken-Pfad.                                                                               |
| API-Schlüssel      | `sk-` Schlüssel mit Präfix           | Über Blocky per Introspection geprüft. Der Schlüssel autorisiert über seine eigene Rolle, daher muss er die **admin** Rolle tragen – dieselbe Hürde, die auch ein Benutzer-Token überwinden muss. |

> Alle folgenden Beispiele verwenden `$TOKEN`, der beide Anmeldeinformationen enthalten kann. Ein fehlendes oder fehlerhaftes Token wird `401`, und ein Token, dessen Rolle unter **admin** zurückgegeben `403`.

***

### Gemeinsame Schemata

#### ProjectCode

```json
{
  "id": "c7a1…",
  "code": "PRJ-001",
  "label": "Projekt Eins",
  "active": true,
  "source": "rest-api",
  "createdAt": "2026-07-28T09:00:00.000Z",
  "updatedAt": "2026-07-28T09:00:00.000Z"
}
```

`label` ist NULL-fähig. `source` ist einer von `rest-api`, `csv-import`, `json-import`, `admin-manual`. Codes stimmen unabhängig von der Groß-/Kleinschreibung überein (getrimmt, kleingeschrieben), und die Anzeige-Schreibweise entspricht dem zuletzt geschriebenen Wert.

#### Problem (422, application/problem+json)

```json
{
  "title": "Validierung fehlgeschlagen",
  "status": 422,
  "errors": [
    { "message": "Projektcode existiert nicht" }
  ]
}
```

Wird nur zurückgegeben von `POST /validate` wenn der Wert keinem aktiven Code entspricht. Alle anderen Fehler geben einen einfachen `{ "error": "…" }` JSON-Body zurück.

***

### Codes

#### GET /codes

Listet die Projektcodes des Mandanten auf. Paginierte Liste mit Gesamtanzahl. Die Admin-Ansicht zeigt auch pausierte Codes. Standardmäßig steht die neueste Eintragung zuerst.

**Abfrageparameter**

| Name         | Typ                               | Erforderlich | Standard    | Beschreibung                                                                                            |
| ------------ | --------------------------------- | ------------ | ----------- | ------------------------------------------------------------------------------------------------------- |
| `search`     | string                            | Nein         |             | Groß-/Kleinschreibungsunabhängige Teilzeichenfolgenübereinstimmung auf Code oder Label. Mindestlänge 1. |
| `activeOnly` | `"true"` \| `"false"`             | Nein         | `false`     | Übergeben `true` um pausierte Codes auszublenden (wie es das Dropdown tut).                             |
| `von`        | Datum (ISO)                       | Nein         |             | Inklusive untere Grenze für `createdAt`.                                                                |
| `bis`        | Datum (ISO)                       | Nein         |             | Exklusive obere Grenze für `createdAt`.                                                                 |
| `page`       | integer ≥ 1                       | Nein         | `1`         | Seitennummer ab 1.                                                                                      |
| `pageSize`   | integer 1..100                    | Nein         | `25`        | Zeilen pro Seite. Werte über 100 geben 400 zurück.                                                      |
| `sortBy`     | `code` \| `createdAt` \| `active` | Nein         | `createdAt` | Sortierspalte.                                                                                          |
| `sortOrder`  | `asc` \| `desc`                   | Nein         | `desc`      | Sortierrichtung.                                                                                        |

**Antworten**

| Status | Inhalt                                  | Wann                                  |
| ------ | --------------------------------------- | ------------------------------------- |
| `200`  | `{ items, totalCount, page, pageSize }` | Paginierte Projektcodes.              |
| `400`  | `{ error }`                             | Ungültige Abfrageparameter.           |
| `401`  |                                         | Fehlendes oder ungültiges Token.      |
| `403`  |                                         | Die cost-controls-Berechtigung fehlt. |

**Anfrage**

```bash
curl -H "Authorization: Bearer $TOKEN" \\
  "https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes?search=PRJ&pageSize=25&sortBy=createdAt&sortOrder=desc"
```

**Antwort (200)**

```json
{
  "items": [ /* ProjectCode[] */ ],
  "totalCount": 1,
  "page": 1,
  "pageSize": 25
}
```

#### POST /codes

Einen einzelnen Projektcode hinzufügen oder aktualisieren. Idempotentes Upsert auf den Code unabhängig von der Groß-/Kleinschreibung. Dies ist der Endpunkt, den die Automatisierung eines Clients aufruft, um Codes synchron zu halten: beim Projektstart anlegen, mit active: false pausieren. `active: false`. Das erneute Hinzufügen eines Codes aktualisiert seine Schreibweise, Bezeichnung und sein Aktiv-Flag, behält aber seine ID und Audit-Spalten bei.

> Das Weglassen von `active` setzt es zurück auf `true`, sodass ein erneutes Hinzufügen einen pausierten Code reaktiviert.

**Anfragekörper · application/json**

| Feld     | Typ           | Erforderlich | Beschreibung                                                         |
| -------- | ------------- | ------------ | -------------------------------------------------------------------- |
| `code`   | string 1..256 | Ja           | Der Projektcode. Vor dem Speichern getrimmt.                         |
| `label`  | string ≤ 512  | Nein         | Menschliche Bezeichnung. Standardmäßig null.                         |
| `active` | boolean       | Nein         | Standardmäßig `true`. Setzen Sie `false` zum Pausieren ohne Löschen. |

**Antworten**

| Status      | Inhalt        | Wann                               |
| ----------- | ------------- | ---------------------------------- |
| `200`       | `ProjectCode` | Der per Upsert geschriebene Code.  |
| `400`       | `{ error }`   | Code fehlt, ist leer oder zu lang. |
| `401 / 403` |               | Nicht autorisiert oder verboten.   |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"code":"PRJ-001","label":"Projekt Eins"}' \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes
```

**Antwort (200)**

```json
{
  "id": "c7a1…",
  "code": "PRJ-001",
  "label": "Projekt Eins",
  "active": true,
  "source": "rest-api",
  "createdAt": "2026-07-28T09:00:00.000Z",
  "updatedAt": "2026-07-28T09:00:00.000Z"
}
```

#### DELETE /codes

Einen Projektcode löschen. Löscht den passenden Code hart `code` (unabhängig von der Groß-/Kleinschreibung) für den aufrufenden Mandanten. Die Automatisierung des Clients ruft dies auf, wenn ein Projekt geschlossen wird.

**Abfrageparameter**

| Name   | Typ    | Erforderlich | Beschreibung                               |
| ------ | ------ | ------------ | ------------------------------------------ |
| `code` | string | Ja           | Der zu löschende Codewert. Mindestlänge 1. |

**Antworten**

| Status      | Inhalt                | Wann                               |
| ----------- | --------------------- | ---------------------------------- |
| `200`       | `{ "deleted": true }` | Eine Zeile wurde entfernt.         |
| `400`       | `{ error }`           | Der `code` Abfrageparameter fehlt. |
| `404`       | `{ error }`           | Kein Code passte.                  |
| `401 / 403` |                       | Nicht autorisiert oder verboten.   |

**Anfrage**

```bash
curl -X DELETE -H "Authorization: Bearer $TOKEN" \\
  "https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes?code=PRJ-001"
```

#### POST /codes/batch

Projektcodes hinzufügen oder aktualisieren (Batch). Das Mehrcode-Pendant von `POST /codes`. Führt viele Codes in einer JSON-Anfrage per Upsert aus (idempotent, unabhängig von der Groß-/Kleinschreibung). Jeder Eintrag hat seine eigene `label` und `active` (Standardwert: true). **der erste gewinnt** (genau wie beim Dateiimport). Gibt die Anzahl der geschriebenen eindeutigen Codes zurück. Verwenden Sie `/import` für sehr große Dateiladungen.

**Anfragekörper · application/json**

| Feld             | Typ            | Erforderlich | Beschreibung                          |
| ---------------- | -------------- | ------------ | ------------------------------------- |
| `codes`          | Array 1..10000 | Ja           | Nicht leeres Array von Codeeinträgen. |
| `codes[].code`   | string 1..256  | Ja           | Der Projektcode.                      |
| `codes[].label`  | string ≤ 512   | Nein         | Menschliche Bezeichnung.              |
| `codes[].active` | boolean        | Nein         | Standardmäßig `true`.                 |

**Antworten**

| Status      | Inhalt                   | Wann                                                                   |
| ----------- | ------------------------ | ---------------------------------------------------------------------- |
| `200`       | `{ "upserted": number }` | Anzahl der geschriebenen eindeutigen Codes.                            |
| `400`       | `{ error }`              | Leeres Array, mehr als 10.000 Einträge oder ein leerer/zu großer Code. |
| `401 / 403` |                          | Nicht autorisiert oder verboten.                                       |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"codes":[{"code":"PRJ-001","label":"Eins"},{"code":"PRJ-002","active":false}]}' \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes/batch
```

**Antwort (200)**

```json
{ "upserted": 2 }
```

#### POST /codes/batch-set-active

Projektcodes (Batch) aktivieren oder deaktivieren. Ändert nur das `active` Kennzeichen jedes aufgelisteten Codes (unabhängig von der Groß-/Kleinschreibung). Anders als `POST /codes`, schreibt es label oder source nie neu, sodass ein Pausieren oder Fortsetzen per Mehrfachauswahl die Anzeigemetadaten jedes Codes intakt lässt. Beim Deaktivieren werden Codes pausiert: Sie validieren nicht mehr und verlassen das Dropdown, ohne gelöscht zu werden. Gibt die Anzahl der aktualisierten vorhandenen Codes zurück (nicht vorhandene Codes werden ignoriert).

**Anfragekörper · application/json**

| Feld     | Typ                | Erforderlich | Beschreibung                                               |
| -------- | ------------------ | ------------ | ---------------------------------------------------------- |
| `codes`  | string\[] 1..10000 | Ja           | Nicht leeres Array von Codewerten, jeweils 1..256 Zeichen. |
| `active` | boolean            | Ja           | `true` zum Aktivieren, `false` zum Pausieren.              |

**Antworten**

| Status      | Inhalt                  | Wann                                                                       |
| ----------- | ----------------------- | -------------------------------------------------------------------------- |
| `200`       | `{ "updated": number }` | Anzahl der aktualisierten vorhandenen Codes.                               |
| `400`       | `{ error }`             | Leeres Array, fehlend oder kein Boolean `active`, oder ein zu großer Code. |
| `401 / 403` |                         | Nicht autorisiert oder verboten.                                           |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"codes":["PRJ-001","PRJ-002"],"active":false}' \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes/batch-set-active
```

**Antwort (200)**

```json
{ "updated": 2 }
```

#### POST /codes/batch-delete

Projektcodes (Batch) löschen. Löscht jeden aufgelisteten Code (unabhängig von der Groß-/Kleinschreibung) in einer Anfrage hart. Unterstützt das Mehrfachauswahl-Löschen der Admin-Oberfläche. Gibt die tatsächlich entfernte Anzahl zurück, die geringer als angefordert sein kann, wenn einige Codes nicht existierten.

**Anfragekörper · application/json**

| Feld    | Typ                | Erforderlich | Beschreibung                                               |
| ------- | ------------------ | ------------ | ---------------------------------------------------------- |
| `codes` | string\[] 1..10000 | Ja           | Nicht leeres Array von Codewerten, jeweils 1..256 Zeichen. |

**Antworten**

| Status      | Inhalt                  | Wann                                                            |
| ----------- | ----------------------- | --------------------------------------------------------------- |
| `200`       | `{ "deleted": number }` | Anzahl der tatsächlich entfernten Codes.                        |
| `400`       | `{ error }`             | Leeres Array, mehr als 10.000 Einträge oder ein zu großer Code. |
| `401 / 403` |                         | Nicht autorisiert oder verboten.                                |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"codes":["PRJ-001","PRJ-002"]}' \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/codes/batch-delete
```

**Antwort (200)**

```json
{ "deleted": 2 }
```

***

### Validierung

#### POST /validate

Einen Projektcode validieren. Gibt `{ "valid": true }` zurück, wenn der Wert mit einem der aktiven Codes des Mandanten übereinstimmt. Die Übereinstimmung ist unabhängig von der Groß-/Kleinschreibung und trimmt Leerzeichen. Ein pausierter Code zählt als ungültig.

**Anfragekörper · application/json**

| Feld    | Typ    | Erforderlich | Beschreibung                                                   |
| ------- | ------ | ------------ | -------------------------------------------------------------- |
| `value` | string | Ja           | Der zu prüfende Wert. Mindestlänge 1 nach dem Trimmen.         |
| `Feld`  | string | Nein         | Im Vertrag enthalten. Nur `project-code` wird heute validiert. |

**Antworten**

| Status      | Inhalt                   | Wann                                            |
| ----------- | ------------------------ | ----------------------------------------------- |
| `200`       | `{ "valid": true }`      | Der Wert stimmt mit einem aktiven Code überein. |
| `400`       | `{ error }`              | `value` fehlt oder ist leer.                    |
| `422`       | `Problem` (problem+json) | Der Wert ist kein gültiger Projektcode.         |
| `401 / 403` |                          | Nicht autorisiert oder verboten.                |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"field":"project-code","value":"PRJ-001"}' \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/validate
```

**Antwort (422)**

```json
{
  "title": "Validierung fehlgeschlagen",
  "status": 422,
  "errors": [{ "message": "Projektcode existiert nicht" }]
}
```

***

### Import

#### POST /import

Projektcodes aus einer CSV- oder JSON-Datei importieren. Multipart-Upload. Codes werden getrimmt, leere Zeilen übersprungen und dateiinterne Duplikate unabhängig von der Groß-/Kleinschreibung zusammengeführt (der erste gewinnt). Jeder Code wird per Upsert verarbeitet, sodass ein erneuter Import idempotent ist. Importierte Codes werden immer aktiviert. Eine Zeile, deren Code 256 Zeichen überschreitet oder deren Label 512 überschreitet, wird als Fehlerzeile gemeldet und nicht geschrieben (entspricht den Feldobergrenzen der API). Max. 5 MB und 200.000 Zeilen.

**Anfragekörper · multipart/form-data**

| Feld     | Typ                 | Erforderlich | Beschreibung                                                         |
| -------- | ------------------- | ------------ | -------------------------------------------------------------------- |
| `file`   | binary              | Ja           | CSV (Kopfzeile mit einer `code` Spalte, optional `label`) oder JSON. |
| `Format` | `"csv"` \| `"json"` | Ja           | Wie die Datei geparst wird.                                          |

**Akzeptierte JSON-Formen**

```json
[ { "code": "PRJ-001", "label": "Projekt Eins" } ]
```

```json
{ "codes": [ { "code": "PRJ-001" } ] }
```

**Antworten**

| Status      | Inhalt                                     | Wann                                                                                                  |
| ----------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
| `200`       | `{ imported, duplicatesInFile, errors[] }` | Importzusammenfassung. Jeder Fehler enthält `{ row, code, reason }`.                                  |
| `400`       | `{ error }`                                | Datei fehlt, falsches Format oder nicht parsbar (keine `code` Spalte, ungültiges JSON, falsche Form). |
| `413`       | `{ error }`                                | Datei überschreitet das Größen- oder Zeilenlimit.                                                     |
| `401 / 403` |                                            | Nicht autorisiert oder verboten.                                                                      |

**Anfrage**

```bash
curl -X POST -H "Authorization: Bearer $TOKEN" \\
  -F "format=csv" \\
  -F "file=@codes.csv;type=text/csv" \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/import
```

**Antwort (200)**

```json
{
  "imported": 2,
  "duplicatesInFile": 1,
  "errors": [
    { "row": 3, "code": "", "reason": "Code ist erforderlich." }
  ]
}
```

#### POST /import/preview

Vorschau eines CSV/JSON-Imports ohne etwas zu schreiben. Parst die Datei und klassifiziert jede Zeile in Dateireihenfolge (`neu`, `Aktualisierung`, `Duplikat`, `Fehler`) damit der Admin vor dem Import prüfen kann. Eine Zeile ist eine `Fehler` wenn sein Code leer ist oder sein Code/Label die Feldgrenzen (256 / 512) überschreitet. `Aktualisierung` gegenüber `neu` wird gegen die vorhandenen Codes des Mandanten aufgelöst. Schreibt nichts. Die `Einträge` Array ist auf 2000 Zeilen begrenzt, aber die `Zusammenfassung` zählt jede Zeile.

**Anfragekörper · multipart/form-data**

| Feld     | Typ                 | Erforderlich | Beschreibung                             |
| -------- | ------------------- | ------------ | ---------------------------------------- |
| `file`   | binary              | Ja           | Dieselben Dateistrukturen wie `/import`. |
| `Format` | `"csv"` \| `"json"` | Ja           | Wie die Datei geparst wird.              |

**Antworten**

| Status      | Inhalt                                         | Wann                                                              |
| ----------- | ---------------------------------------------- | ----------------------------------------------------------------- |
| `200`       | `{ entries[], totalRows, truncated, summary }` | Pro-Zeile-Klassifizierung plus eine Zusammenfassung aller Zeilen. |
| `400`       | `{ error }`                                    | Datei fehlt, falsches Format oder nicht analysierbar.             |
| `413`       | `{ error }`                                    | Datei überschreitet das Größen- oder Zeilenlimit.                 |
| `401 / 403` |                                                | Nicht autorisiert oder verboten.                                  |

**Antwort (200)**

```json
{
  "entries": [
    { "row": 1, "code": "PRJ-001", "label": "Projekt Eins", "status": "neu" },
    { "row": 2, "code": "prj-001", "label": null, "status": "Duplikat", "reason": "Der gleiche Code kommt früher in der Datei vor (einmal beibehalten)." }
  ],
  "totalRows": 2,
  "truncated": false,
  "summary": { "new": 1, "update": 0, "duplicate": 1, "error": 0 }
}
```

***

### Konfiguration

#### GET /config

Ruft den Schalter zur Kostenstellenvalidierung des Mandanten ab. Gibt zurück, ob die Validierung für den aufrufenden Mandanten aktiviert ist. Ein Mandant ohne Einstellungszeile meldet `false`.

**Antworten**

| Status      | Inhalt                             | Wann                             |
| ----------- | ---------------------------------- | -------------------------------- |
| `200`       | `{ "validationEnabled": boolean }` | Schalterzustand.                 |
| `401 / 403` |                                    | Nicht autorisiert oder verboten. |

**Anfrage**

```bash
curl -H "Authorization: Bearer $TOKEN" \\
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/config
```

**Antwort (200)**

```json
{ "validationEnabled": true }
```

#### PUT /config

Setzt den Schalter zur Kostenstellenvalidierung des Mandanten. Schaltet die Validierung ein oder aus. Beim ersten Einschalten wird eine Einstellungszeile aus der Systemvorgabe angelegt. Beim Ausschalten oder erneuten Einschalten werden nur dieser Schalter und die Audit-Spalten geändert; alle anderen Konfigurationen bleiben erhalten. Die Validierung wird erst durchgesetzt, wenn der Schalter aktiviert ist und mindestens ein aktiver Code konfiguriert ist.

**Anfragekörper · application/json**

| Feld                | Typ     | Erforderlich | Beschreibung              |
| ------------------- | ------- | ------------ | ------------------------- |
| `validationEnabled` | boolean | Ja           | Der neue Schalterzustand. |

**Antworten**

| Status      | Inhalt                             | Wann                                                     |
| ----------- | ---------------------------------- | -------------------------------------------------------- |
| `200`       | `{ "validationEnabled": boolean }` | Aktualisierter Schalterzustand.                          |
| `400`       | `{ error }`                        | `validationEnabled` fehlt oder ist kein boolescher Wert. |
| `401 / 403` |                                    | Nicht autorisiert oder verboten.                         |

**Anfrage**

```bash
curl -X PUT -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \\
  -d '{"validationEnabled":true}' \
  https://analytics.theblockbrain.ai/api/v1/admin/cb-limit/cost-center/config
```

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.blockbrain.ai/de/fur-administratoren/cost-center-admin-api.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
