# App-Zeichen hochladen (https://developer.bimetrics.de/reference/logo/upload-app-logo)

`PUT https://app.bimetrics.de/api/company/logos/app`

operationId: `uploadAppLogo` · Berechtigung (Scope): `layout:write` · Bereich: Logo

Lädt ein eigenes App-Zeichen hoch, das Zeichen der Firma in der App. Es ersetzt das Zeichen, das bimetrics aus dem Rechnungslogo macht. Zählt zu den 20 Logo-Uploads je Firma und Tag. 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 |
| --- | --- | --- | --- | --- |
| `expectedLogoId` | query | nein | string | Optional: die ID des aktiven Bildes wie gelesen (`invoice.active.id` beim Rechnungslogo, `app.id` beim App-Zeichen), leer, wenn es keins gab. Hat sich das Logo seitdem geändert, antwortet die Route mit `409 LogoChanged` und ändert nichts. Ohne den Parameter prüft die Route nichts. |
| `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/octet-stream`)

Die Datei als PNG oder JPG, höchstens 2 MB, 200 bis 5000 px an der längeren Seite, als ganzer Anfrageinhalt (`application/octet-stream`).



### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/company/logos/app" -X PUT \
  -H "Authorization: Bearer $BIMETRICS_API_KEY" \
  -H "Idempotency-Key: rechnung-2026-001"
```

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Erfolg. | `application/json`: LogoSet |
| 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 |
| 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 Datei ist größer als 2 MB (`LogoFileTooLarge`) oder die Anfrage größer als 3 MB (`APIRequestTooLarge`). Eine kleinere Datei senden statt wiederholen. | `application/json`: Error |
| 415 | Die Datei ist kein PNG oder JPG (`LogoUnsupportedFormat`). bimetrics erkennt das Format am Inhalt, nicht am Namen oder am `Content-Type`. | `application/json`: Error |
| 422 | Das Logo ist zu klein (`LogoTooSmall`, unter 200 px an der längeren Seite) oder zu groß (`LogoDimensionsTooLarge`, über 5000 × 5000 px). Eine andere Datei senden 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 (`LogoSet`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `app` | AppLogo | Das App-Zeichen; `null` für das bimetrics-Zeichen. |
| `enabled` | boolean | Immer `true`, das Logo lässt sich ändern. |
| `frame` | LogoFrame | Der Logo-Rahmen des Layouts der Firma. |
| `invoice` | InvoiceLogo | Das Rechnungslogo; `null` ohne Logo. |

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