# Originaldatei eines Belegs laden (https://developer.bimetrics.de/reference/documents/get-document-content)

`GET https://app.bimetrics.de/api/document/{id}/content`

operationId: `getDocumentContent` · Berechtigung (Scope): `read` · Bereich: Belege

Liefert die hochgeladene Originaldatei als Binärdaten. PDFs und Bilder kommen mit ihrem Typ (`application/pdf`, `image/png`, `image/jpeg`), alles andere, etwa XML-E-Rechnungen, als `application/octet-stream`. Der `ETag` ist der SHA-256 der Datei (Hex, ohne Anführungszeichen); mit genau diesem Wert in `If-None-Match` antwortet die Route mit `304` ohne Inhalt. `404`, wenn der Beleg keine Originaldatei hat.

Benötigt einen Schlüssel mit der Berechtigung `read`.

### Authentifizierung

`Authorization: Bearer bm_…` (alternativ `X-API-KEY: bm_…`, nie beide zugleich).

### Parameter

| Name | Ort | Pflicht | Typ | Beschreibung |
| --- | --- | --- | --- | --- |
| `id` | path | ja | string (uuid) | ID des Belegs (UUID). |
| `download` | query | nein | string | Beliebiger nicht leerer Wert, z. B. `1`: Die Antwort trägt `Content-Disposition: attachment` mit dem ursprünglichen Dateinamen. |
| `If-None-Match` | header | nein | string | ETag einer früheren Antwort; stimmt er, antwortet die Route mit `304`. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/document/{id}/content" \
  -H "Authorization: Bearer $BIMETRICS_API_KEY" \
  --output beleg.pdf
```

Das Beispiel sendet kein `If-None-Match` und lädt die Datei immer. Schickst du den `ETag` einer früheren Antwort in `If-None-Match` mit und ist die Datei unverändert, antwortet die API mit `304` ohne Inhalt und ohne `ETag`. Behalte dann die gespeicherte Datei, statt sie mit der leeren Antwort zu überschreiben. Ein vollständiges Beispiel steht im [Monatsexport](https://developer.bimetrics.de/recipes/monthly-export).

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Die Originaldatei. (Header: Content-Disposition, ETag) | `application/octet-stream`: string (binary), `application/pdf`: string (binary), `image/*`: string (binary) |
| 304 | Nicht geändert: `If-None-Match` entspricht dem `ETag`. |  |
| 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 aktiven Tarif mit API-Zugang, etwa in der Testphase oder nach Ende des Abos (`APIUnavailable`). | `application/json`: Error |
| 404 | Nicht gefunden (`NotFound`). | `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 |

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