bimetricsEntwickler
Belege

Beleg hochladen

Als Markdown ansehen

Benötigte Berechtigung:upload(Belege hochladen)

Echte Wirkung

Erzeugt einen echten Beleg, verbraucht Kontingent und wird GoBD-protokolliert.
post/api/document/

Kein Testversand aus der Dokumentation: Jeder Aufruf legt einen echten Beleg an. Nutze das Codebeispiel mit einer Datei, die wirklich in die Firma gehört.

Lädt genau eine Datei als neuen Beleg hoch und stößt die Erkennung an. Die Antwort ist ein Array mit genau einem Beleg. Das Formularfeld bestimmt die Belegart: invoice[] Ausgangsrechnung, receipt[] Eingangsbeleg, beides bindend; bei auto[] entscheidet die Erkennung mit den Daten deiner Firma. Kann sie nicht sicher entscheiden, bekommt der Beleg „Belegtyp prüfen“ (kindReview) und wird nicht gebucht, bis du den Belegtyp wählst. Unterstützt werden PDF, PNG, JPEG und XML-E-Rechnungen. X-Upload-Request-Id macht Wiederholungen sicher: Dieselbe ID mit identischer Datei, identischem Dateinamen und Feld liefert denselben Beleg, ohne weiteres Kontingent; dieselbe ID mit anderem Inhalt ergibt 409 UploadRequestConflict. Für jeden neuen Beleg eine neue ID verwenden. Ist das Belegkontingent ausgeschöpft, wird der Beleg trotzdem gespeichert (uploadDocument.ocrStatus = quota_paused); dann keinen weiteren Upload mit neuer ID starten.

Benötigt einen Schlüssel mit der Berechtigung upload.

Authentifizierung

headerAuthentifizierungBearer <bm_…>

Empfohlen: Authorization: Bearer bm_…. Der Schlüssel wird nur einmal angezeigt; nie in URLs, Logs oder Frontend-Code ablegen.

Header-Parameter

X-Upload-Request-Id*string

Idempotenzschlüssel des Uploads: 1–128 druckbare ASCII-Zeichen ohne Leerzeichen. Für jeden neuen Beleg eine neue ID, bei Wiederholungen dieselbe.

Muster^[!-~]+$
Länge1 <= length <= 128

Request-Body

multipart/form-data
  1. body

Genau eine Datei (höchstens 30 MiB) in genau einem der Felder; weitere Felder sind nicht erlaubt.

Felder1 <= properties <= 1
auto[]?unknown

Belegart entscheidet die Erkennung; unsicher heißt „Belegtyp prüfen“ (kindReview).

invoice[]?unknown

Ausgangsrechnung.

receipt[]?unknown

Eingangsbeleg.

Antworten

Der angelegte oder bei Wiederholung derselbe Beleg, als Array mit genau einem Eintrag.

application/json
  1. response
Einträge1 <= items <= 1
[index: integer]?

Ein hochgeladener Beleg; Felder wie bei Document.

Beispielanfrage
curl --fail-with-body "https://app.bimetrics.de/api/document/" \  -H "Authorization: Bearer $BIMETRICS_API_KEY" \  -H "X-Upload-Request-Id: rechnung-2026-001" \  -F "auto[]=@rechnung.pdf"
Beispielantwort
[  {    "bookingErrors": null,    "bookings": null,    "companyId": "9c388e1f-04a6-4770-80bd-66cd98dd00d5",    "contentSource": "auto",    "createdAt": "2026-09-26T14:03:27Z",    "deliveryDate": null,    "documentContract": null,    "documentContractId": null,    "documentSeries": null,    "documentSeriesId": null,    "dueDate": null,    "id": "a2543540-c7ca-413d-8bcc-1ef3427e8aa4",    "importOrigin": "upload",    "invoiceDate": null,    "invoiceNumber": "",    "invoicePositions": null,    "issuer": {      "address": "",      "customerNumber": null,      "iban": "",      "name": "",      "taxId": ""    },    "kind": "receipt",    "match": null,    "paymentTerms": "",    "performancePeriodFrom": null,    "performancePeriodTo": null,    "recipient": {      "address": "",      "customerNumber": null,      "iban": "",      "name": "",      "taxId": ""    },    "source": "",    "updatedAt": "2026-09-26T14:03:27Z",    "uploadDocument": {      "blob": {        "companyId": "9c388e1f-04a6-4770-80bd-66cd98dd00d5",        "createdAt": "2026-09-26T14:03:27Z",        "id": "44374af9-cacd-40be-8c61-34d6d6e5c09e",        "length": 126904,        "mime": "application/pdf",        "originalFilename": "Rechnung_4711.pdf",        "sha256": "25e061231f41488ae299135b3507c724b1b18eaf751b5a705f9322e3c24a4445",        "updatedAt": "2026-09-26T14:03:27Z"      },      "blobId": "44374af9-cacd-40be-8c61-34d6d6e5c09e",      "creatorUserCompanyId": "53cd10a9-c864-4dc3-a777-9860d59efe6c",      "ocrFinishedAt": null,      "ocrStartedAt": null,      "ocrStatus": "pending",      "pageCount": 0,      "pagesRead": 0    },    "uploadDocumentId": "d7c6a90d-a8e3-4397-a8ec-3d64b03f0c63",    "version": ""  }]

Endpunkte

Alle Endpunkte der bimetrics API mit Parametern, Antworten und Playground.

Kategorie für mehrere Belege setzen POST

Setzt eine Kategorie auf alle Positionen jedes Belegs, samt dem Steuersatz, den die Kategorie vorgibt, wie „Kategorie setzen“ in der Mehrfachauswahl der App. bimetrics bucht jeden geänderten Beleg sofort neu. Übersprungen werden wie in der App festgeschriebene Belege und ausgestellte Rechnungen (`finalized`), Belege mit mehreren Kategorien (`multiple`), aus Dauerbuchungen oder Vorlagen (`linked`), stornierte (`deleted`), mit erfasster Zahlung (`paid`), noch nicht gelesene (`unread`), Belege, zu deren Art die Kategorie nicht passt (`otherKind`), und Belege ohne Positionen (`other`). Dazu `unchanged`, `notFound` und `notPreviewed`. Ein Beleg kommt in `failed`, wenn `PATCH /api/document/{id}` ihn ablehnen würde, etwa bei einem Steuersatz, den die Kategorie nicht erlaubt. Höchstens 50 Belege je Aufruf (`400 BulkLimitExceeded`). Die Antwort nennt je Beleg, was geschah: `change` geändert, `skipped` mit Grund übersprungen, `failed` mit Code abgelehnt. Das ist ein Teilerfolg wie in der App: Ein abgelehnter Beleg hält die anderen nicht auf, und die Route antwortet mit `200`. Mit `dryRun` ändert sie nichts und zeigt, was geschähe, mit einer `version` je Beleg. Zum Ausführen gibst du diese als `expectedVersions` zurück, sonst antwortet die Route mit `400 ExpectedVersionRequired`. Es ändert sich nur, was unter `change` stand und seitdem unverändert ist: Ein geänderter Beleg kommt mit `VersionConflict` in `failed`, die übrigen laufen, und ein Beleg ohne Eintrag bleibt mit `notPreviewed` in `skipped`. Jeder Beleg läuft als eigener Befehl mit eigenem Eintrag im Protokoll und zählt einzeln auf die Tagesgrenzen der Firma und der Testphase. Der ganze Aufruf zählt einmal auf die Grenzen je Minute. Eine Wiederholung mit gleichem Idempotency-Key ändert nichts doppelt und erledigt, was noch offen ist. Sie klärt auch den Stand, wenn ein Aufruf abbricht: `OutcomeUnknown` heißt, der Beleg kann schon gebucht sein. Benötigt einen Schlüssel mit der Berechtigung `documents:write`.