> 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/for-admins/cost-control/cost-center-admin-api.md).

# Admin-API für Kostenstellen

Verwalten Sie die gültigen Projektcodes eines Mandanten und den Schalter zur Kostenstellenvalidierung.

### **Bereich**

Admin-API zum Verwalten der gültigen Projektcodes eines Mandanten und des Schalters zur Kostenstellenvalidierung: wie man sich authentifiziert, die CRUD-Endpunkte für Einzelcode und Batch, Massenimport per CSV/JSON mit Trockenlauf-Vorschau, Wertvalidierung und den Konfigurationsschalter.

**Die Referenz pro Endpunkt ist hier absichtlich komprimiert.** Die stets aktuelle Live-Referenz 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 die Beschreibung, das Authentifizierungsmodell sowie Anfrage-/Antwortbeispiele.

***

### Überblick

Die Cost Center Admin API verwaltet die Liste gültiger **Projektcodes** und den **Schalter zur Kostenstellenvalidierung**. Codes gelangen über den REST-Einzelcode-Endpunkt, die JSON-Batch-Endpunkte oder einen Massenimport per CSV/JSON hinein, und jeder mögliche Wert kann gegen die aktiven Codes des Mandanten geprüft werden.

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

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

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

> **Wann wird Validierung erzwungen?** Nur wenn der Validierungsschalter 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-Zusammenfassung

Jeder Endpunkt, den die Cost Center Admin API bereitstellt. Die Pfade sind relativ zum Basispfad `/api/v1/admin/cb-limit/cost-center`. Die vollständigen Anfrage- und Antwortdetails 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 (seitengesteuert, 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 massenhaft aus einer CSV- oder JSON-Datei importieren.                           |
| Import        | `POST`   | `/import/preview`         | Einen Import als Trockenlauf ausführen und jede Zeile klassifizieren.                  |
| Konfiguration | `GET`    | `/config`                 | Den Validierungsschalter lesen.                                                        |
| Konfiguration | `PUT`    | `/config`                 | Den Validierungsschalter ein- oder ausschalten.                                        |

***

### Authentifizierung

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

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

Es werden zwei Arten von Anmeldedaten akzeptiert, und beide laufen über denselben Header:

| Anmeldedaten  | Sieht aus wie                        | Wie es verifiziert wird                                                                                                                                                                      |
| ------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Zitadel JWT   | ein JWT (`header.payload.signature`) | Gegen Zitadel verifiziert (JWKS, mit Token-Introspektion als Fallback). Dies ist der bestehende Access-Token-Pfad.                                                                           |
| API-Schlüssel | `sk-` präfixierter Schlüssel         | Per Introspektion über Blocky 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 nehmen muss. |

> Jedes folgende Beispiel verwendet `$TOKEN`, der beide Anmeldedaten enthalten kann. Ein fehlendes oder fehlerhaftes Token gibt `401`, und ein Token, dessen Rolle unter **admin** gibt zurück `403`.

***

### Gemeinsame Schemas

#### 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"
}
```

`Bezeichnung` ist nullable. `Quelle` ist eines von `rest-api`, `csv-import`, `json-import`, `admin-manual`. Codes stimmen unabhängig von der Groß-/Kleinschreibung überein (getrimmt, kleingeschrieben), und die angezeigte Schreibweise ist die zuletzt gespeicherte.

#### 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. Seitengesteuerte Liste mit Gesamtanzahl. Die Admin-Ansicht zeigt auch pausierte Codes. Standardmäßig wird zuerst nach den neuesten sortiert.

**Query-Parameter**

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

**Antworten**

| Status | Body                                    | Wann                                  |
| ------ | --------------------------------------- | ------------------------------------- |
| `200`  | `{ items, totalCount, page, pageSize }` | Seitengesteuerte Projektcodes.        |
| `400`  | `{ error }`                             | Ungültige Query-Parameter.            |
| `401`  |                                         | Fehlendes oder ungültiges Token.      |
| `403`  |                                         | Die Berechtigung cost-controls 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 für den Code ohne Berücksichtigung 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. Das erneute Hinzufügen eines Codes aktualisiert seine Schreibweise, Bezeichnung und sein Active-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.

**Body · application/json**

| Feld          | Typ           | Erforderlich | Beschreibung                                                                    |
| ------------- | ------------- | ------------ | ------------------------------------------------------------------------------- |
| `code`        | string 1..256 | Ja           | Der Projektcode. Vor dem Speichern getrimmt.                                    |
| `Bezeichnung` | string ≤ 512  | Nein         | Menschenlesbare Bezeichnung. Standardmäßig null.                                |
| `active`      | boolean       | Nein         | Standardmäßig `true`. Setzen Sie `false` auf, um zu pausieren, ohne zu löschen. |

**Antworten**

| Status      | Body          | Wann                               |
| ----------- | ------------- | ---------------------------------- |
| `200`       | `ProjectCode` | Der per Upsert gespeicherte 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 für den aufrufenden Mandanten hart (case-insensitive). Die Automatisierung des Clients ruft dies auf, wenn ein Projekt abgeschlossen wird. `code` Der zu löschende Codewert. Mindestlänge 1.

**Query-Parameter**

| Name   | Typ    | Erforderlich | Beschreibung        |
| ------ | ------ | ------------ | ------------------- |
| `code` | string | Ja           | { "deleted": true } |

**Antworten**

| Status      | Body                         | Wann                              |
| ----------- | ---------------------------- | --------------------------------- |
| `200`       | `Eine Zeile wurde entfernt.` | Eine Zeile wurde entfernt.        |
| `400`       | `{ error }`                  | Der `code` Query-Parameter fehlt. |
| `404`       | `{ error }`                  | Kein Code stimmte überein.        |
| `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 in Batch hinzufügen oder aktualisieren. Das Mehrfach-Code-Pendant zu `POST /codes`. Upsertet viele Codes in einer einzigen JSON-Anfrage (idempotent, ohne Berücksichtigung der Groß-/Kleinschreibung). Jeder Eintrag trägt seine eigene `Bezeichnung` und `active` (Standard ist true). **der erste gewinnt** (genauso wie beim Dateiimport). Gibt die Anzahl der geschriebenen eindeutigen Codes zurück. Verwenden Sie `/import` für sehr große Dateiladungen.

**Body · application/json**

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

**Antworten**

| Status      | Body                     | 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 in Batch aktivieren oder deaktivieren. Ändert nur das `active` Flag jedes aufgelisteten Codes (case-insensitive). Im Gegensatz zu `POST /codes`schreibt es niemals Bezeichnung oder Quelle neu, sodass ein Mehrfachauswahl-Pausieren oder -Fortsetzen die Anzeigemetadaten jedes Codes unverändert lässt. Durch Deaktivieren werden Codes pausiert: Sie hören auf zu validieren und bleiben im Dropdown, ohne gelöscht zu werden. Gibt die Anzahl der aktualisierten vorhandenen Codes zurück (nicht vorhandene Codes werden ignoriert).

**Body · application/json**

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

**Antworten**

| Status      | Body                    | Wann                                                                                |
| ----------- | ----------------------- | ----------------------------------------------------------------------------------- |
| `200`       | `{ "updated": number }` | Anzahl der aktualisierten vorhandenen Codes.                                        |
| `400`       | `{ error }`             | Leeres Array, fehlender oder nicht-boolescher `active`Wert 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 in Batch löschen. Löscht jeden aufgelisteten Code (case-insensitive) in einer Anfrage hart. Unterstützt das Mehrfachauswahl-Löschen der Admin-Oberfläche. Gibt die Anzahl der tatsächlich entfernten Codes zurück, die geringer sein kann als angefordert, wenn einige Codes nicht existierten.

**Body · application/json**

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

**Antworten**

| Status      | Body                    | 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 einem der aktiven Codes des Mandanten entspricht. Die Übereinstimmung ist nicht case-sensitiv und trimmt Leerzeichen. Ein pausierter Code gilt als ungültig.

**Body · application/json**

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

**Antworten**

| Status      | Body                     | Wann                                    |
| ----------- | ------------------------ | --------------------------------------- |
| `200`       | `{ "valid": true }`      | Der Wert entspricht einem aktiven Code. |
| `400`       | `{ error }`              | `Wert` 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 doppelte Einträge in der Datei case-insensitive zusammengeführt (der erste gewinnt). Jeder Code wird per Upsert gespeichert, sodass ein erneuter Import idempotent ist. Importierte Codes werden immer aktiviert. Eine Zeile, deren Code länger als 256 Zeichen ist oder deren Bezeichnung länger als 512 Zeichen ist, wird als Fehlerzeile gemeldet und nicht geschrieben (entspricht den API-Feldgrenzen). Maximal 5 MB und 200.000 Zeilen.

**Body · multipart/form-data**

| Feld     | Typ                 | Erforderlich | Beschreibung                                                               |
| -------- | ------------------- | ------------ | -------------------------------------------------------------------------- |
| `Datei`  | binär               | Ja           | CSV (Kopfzeile mit einer `code` Spalte, optional `Bezeichnung`) oder JSON. |
| `Format` | `"csv"` \| `"json"` | Ja           | Wie die Datei geparst werden soll.                                         |

**Akzeptierte JSON-Strukturen**

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

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

**Antworten**

| Status      | Body                                       | 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 Struktur). |
| `413`       | `{ error }`                                | Die 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. Analysiert die Datei und klassifiziert jede Zeile in Dateireihenfolge (`neu`, `Aktualisierung`, `Duplikat`, `Fehler`) damit der Admin vor dem Import prüfen kann. Eine Zeile ist ein `Fehler` wenn ihr Code leer ist oder ihr Code/Label die Feldgrenzen überschreitet (256 / 512). `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.

**Body · multipart/form-data**

| Feld     | Typ                 | Erforderlich | Beschreibung                           |
| -------- | ------------------- | ------------ | -------------------------------------- |
| `Datei`  | binär               | Ja           | Gleiche Dateistrukturen wie `/import`. |
| `Format` | `"csv"` \| `"json"` | Ja           | Wie die Datei geparst werden soll.     |

**Antworten**

| Status      | Body                                           | Wann                                                                  |
| ----------- | ---------------------------------------------- | --------------------------------------------------------------------- |
| `200`       | `{ entries[], totalRows, truncated, summary }` | Klassifizierung pro Zeile plus eine Zusammenfassung über alle Zeilen. |
| `400`       | `{ error }`                                    | Datei fehlt, falsches Format oder nicht analysierbar.                 |
| `413`       | `{ error }`                                    | Die 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": "new" },
    { "row": 2, "code": "prj-001", "label": null, "status": "duplicate", "reason": "Derselbe Code erscheint früher in der Datei (nur einmal behalten)." }
  ],
  "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 Einstellungsdatensatz meldet `false`.

**Antworten**

| Status      | Body                               | 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. Wenn sie erstmals aktiviert wird, wird aus der Systemvorgabe ein Einstellungsdatensatz angelegt. Beim Deaktivieren oder erneuten Aktivieren werden nur dieser Schalter und die Audit-Spalten aktualisiert und alle anderen Konfigurationen bleiben erhalten. Die Validierung greift erst, wenn der Schalter aktiviert ist und mindestens ein aktiver Code konfiguriert ist.

**Body · application/json**

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

**Antworten**

| Status      | Body                               | 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.blockbrain.ai/de/for-admins/cost-control/cost-center-admin-api.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
