Datentypen
Wie Datumswerte, Zeitpunkte, Beträge, Prozentsätze, IDs und feste Werte in Antworten und Filtern aussehen.
Hier stehen die Datentypen der bimetrics API, der REST-API unter developer.bimetrics.de. Die MCP-Werkzeuge von bimetrics haben eigene Feldnamen und Formate. Für sie gelten ihre eigenen Beschreibungen und Schemas.
Überblick
| Art | In Antworten | In Filtern | Beispiele |
|---|---|---|---|
| Kalenderdatum | Objekt { "year", "month", "day" } | String JJJJ-MM-TT | invoiceDate, dueDate, bookingDate, valueDate |
| Zeitpunkt | String nach RFC 3339 mit Zeitzone | String nach RFC 3339 mit Zeitzone | createdAt, updatedAt, finalized |
| Betrag in Cent | Ganzzahl | Zahl | transactionAmount, balance, invoicePositions[].total, match.amountOpen |
| Betrag in Euro | Dezimalzahl als String | String, siehe Beträge | amount, netAmount und taxAmount bei Buchungen |
| Prozentsatz | Dezimalzahl als String | – | invoicePositions[].vatPercentage, cashDiscount.percent, taxRate bei Buchungen |
| ID | UUID als String | UUID als String | id, bankAccountId, refDocumentId |
| Fester Wert | String aus einer festen Liste | String | kind, status, uploadDocument.ocrStatus |
Welche Attribute sich filtern lassen und welchen Typ sie haben, steht unter Filtern und Paginieren.
Kalenderdaten
Rechnungsdatum, Fälligkeit, Buchungstag und ähnliche Angaben sind Kalenderdaten ohne Uhrzeit und ohne Zeitzone. In Antworten kommen sie als Objekt:
{ "invoiceDate": { "year": 2026, "month": 9, "day": 30 } }Fehlt ein Datum, etwa solange ein Beleg noch nicht erkannt ist, ist der Wert null.
In Filtern schreibst du ein Kalenderdatum als String im Format JJJJ-MM-TT, mit führenden Nullen und ohne Uhrzeit:
{ "kind": "range", "attribute": "invoiceDate", "lower": "2026-09-01", "upper": "2026-09-30" }rangeschließt beide Grenzen ein. Das Beispiel trifft alle Belege mit einem Rechnungsdatum im September 2026.- Die API vergleicht Kalenderdaten Zeichen für Zeichen in diesem Format. Andere Schreibweisen lehnt sie hier nicht ab, sie liefern aber falsche Treffer. So schließt
2026-09-01T00:00:00Zals Untergrenze den 1. September aus. - Eine Zeitzone spielt keine Rolle: Ein Filter auf
invoiceDatetrifft das Datum, das auf dem Beleg steht.
Welches Datum was bedeutet
| Ressource | Attribut | Bedeutung |
|---|---|---|
| Belege | invoiceDate | Rechnungsdatum laut Beleg |
| Belege | createdAt | Zeitpunkt, zu dem der Beleg in bimetrics angelegt wurde |
| Umsätze | bookingDate | Buchungstag laut Bank |
| Umsätze | valueDate | Wertstellung laut Bank |
| Buchungen | bookingDate | Buchungsdatum: bei Buchungen zu einem Beleg in der Regel das Rechnungsdatum, bei Buchungen zu einem Umsatz dessen Wertstellung (valueDate) |
Erstreckt sich der Leistungszeitraum eines Belegs über mehrere Monate, verteilt bimetrics den Betrag auf diese Monate. Die Buchungen tragen den jeweiligen Zeitraum dann in performanceFrom und performanceTo.
Zeitpunkte
createdAt, updatedAt, finalized und ähnliche Angaben sind Zeitpunkte. Sie kommen als String nach RFC 3339 mit Zeitzone, auf Mikrosekunden genau:
{ "updatedAt": "2026-09-27T08:15:42.123456Z" }In Filtern schreibst du Zeitpunkte ebenfalls nach RFC 3339, zum Beispiel 2026-09-01T00:00:00Z oder 2026-09-01T00:00:00+02:00.
- Gib die Zeitzone immer mit an. Einen Wert ohne Zeitzone oder ohne Uhrzeit, etwa
2026-09-01, liest die Datenbank in ihrer eigenen Zeitzone. Darauf solltest du dich nicht verlassen. - Einen Zeitpunkt aus einer Antwort kannst du unverändert als Filterwert verwenden. Das nutzt der Delta-Sync.
- Die API nimmt auch die übrigen Formen nach ISO 8601 an: ein Leerzeichen statt
T, eine Uhrzeit ohne Sekunden, einen Wert ohne Zeitzone oder nur ein Datum, etwa2026-09-01 08:15. Andere Schreibweisen, etwa01.09.2026, ergeben400.
Beträge
Beträge in Cent
Die meisten Beträge sind Ganzzahlen in Cent: 11900 steht für 119,00 €.
| Feld | Bedeutung | Vorzeichen |
|---|---|---|
transactionAmount (Umsätze) | Betrag des Umsatzes | positiv bei Eingängen, negativ bei Ausgängen |
balance (Bankkonten) | Saldo zum Zeitpunkt balanceDate | |
invoicePositions[].total (Belege) | Bruttobetrag der Position | |
match.amountOpen (Belege, Umsätze) | offener Betrag der Zuordnung, 0, wenn Belege und Umsätze aufgehen | |
cashDiscount.basisAmount, discountAmount, payableAmount | Skonto: Grundlage, Abzug und Zahlbetrag |
Den Bruttobetrag eines Belegs erhältst du als Summe von total über alle invoicePositions; gebucht wird er immer als Euro. Die Währung steht bei Umsätzen in transactionCurrency und bei Bankkonten in currency. Ist ein Beleg in einer anderen Währung als Euro, nennt sie documentCurrency (ISO 4217, fehlt bei Euro), den Bruttobetrag vom Beleg originalTotalAmount in Hundertsteln dieser Währung, und euroAmountSource sagt, woher der Euro-Betrag stammt: payment aus der Zahlung, person selbst eingetragen oder bestätigt. Fehlt euroAmountSource, sind die Positionen noch der Betrag vom Beleg („Euro-Betrag fehlt“).
In Filtern gibst du Cent-Beträge als Zahl an, etwa { "kind": "range", "attribute": "transactionAmount", "upper": -10000 } für Ausgänge ab 100,00 €.
Beträge von Buchungen
Das Feld amount einer Buchung ist ein Betrag in Euro als Dezimalzahl im String, zum Beispiel "119", "-19.5" oder "1234.56".
- Das Vorzeichen bezieht sich auf das Konto in
account: größer als 0 ist Soll, kleiner als 0 ist Haben. Das GegenkontoaccountContrahat die umgekehrte Seite. - Die Zahl hat keine feste Anzahl an Nachkommastellen. 119,00 € kommt als
"119", 19,50 € als"19.5". - Lies den Wert als Dezimalzahl, nicht als Gleitkommazahl, damit keine Rundungsfehler entstehen.
netAmountundtaxAmountteilenamountin Netto und Steuer, im selben Format und mit demselben Vorzeichen, auf Cent gerundet. Sie stehen nur in den Antworten der Buchungsrouten, nicht inbookingsan Belegen und Umsätzen.
Beträge von Buchungen in Filtern: Die API vergleicht
amountin Filtern und beim Sortieren als Text. Ein Filterwert muss deshalb ein String in genau der Schreibweise aus den Antworten sein, also"119"und nicht"119.00"oder119.rangeundsortnachamountergeben keine Reihenfolge nach Betrag. Filtere und sortiere Beträge von Buchungen deshalb in deiner Anwendung.
Prozentsätze
Prozentsätze sind Dezimalzahlen im String und bedeuten Prozent, nicht Anteile: "19" steht für 19 %, "5.5" für 5,5 %. Das gilt für den Steuersatz einer Position (vatPercentage), den Skontosatz (cashDiscount.percent) und den Steuersatz einer Buchung (taxRate, "0" ohne Steuer).
Nur die Anteile einer Verteilung von Kostenstellen sind ganze Zahlen in Basispunkten (shares[].basisPoints): 5000 sind 50 %, 3333 sind 33,33 %, zusammen ergeben sie 10000.
IDs
Alle IDs sind UUIDs als String, zum Beispiel "0b5c2f4e-8a1d-4c3e-9f6a-2d7b1e8c4a90".
- Eine ID im Pfad, die keine UUID ist, ergibt
400. - Eine ID, die zu einer anderen Firma gehört, ergibt
401mit dem CodeUnauthorized(siehe Fehler). - In Filtern schreibst du UUIDs als String. Ein Wert, der keine UUID ist, ergibt
400.
Feste Werte
Felder mit einer festen Liste von Werten sind Strings, zum Beispiel:
| Feld | Werte |
|---|---|
kind (Belege) | invoice (Ausgangsrechnung), receipt (Eingangsbeleg); bei kindReview: true nur die Vermutung der Erkennung, siehe Glossar |
uploadDocument.ocrStatus (Belege) | pending, processing, success, failed, quota_paused, siehe Beleg-Upload |
status (Umsätze) | booked (gebucht), pending (vorgemerkt) |
status (Buchungen) | open (nicht festgeschrieben), finalized (festgeschrieben), changed_after_export (nach dem DATEV-Export storniert, das Storno ist noch nicht exportiert), siehe Glossar |
finalizedBy (Buchungen) | export (DATEV-Export), auto (nächtliche Festschreibung) |
kind (Buchungen) | Buchungsart, etwa purchase_invoice, sales_invoice, payment oder reversal |
type (Kontakte) | customer, supplier, partner |
kind (Kostenstellen) | center (Kostenstelle), distribution (Verteilung), siehe Glossar |
match.category | payment, invoice_cancellation, money_transfer, siehe Glossar |
Die Werte je Feld stehen in der Referenz. Plane in deiner Anwendung einen Standardfall für Werte ein, die du nicht kennst.
Leere Werte
- Felder, die in der Referenz als „kann null sein“ markiert sind, kommen als
null, wenn es keinen Wert gibt. - Einige Felder fehlen ganz, statt
nullzu sein, zum Beispielduplicatebeim Upload odercashDiscountohne Skonto. Die Beschreibung des Felds nennt das. - Mit
{ "kind": "eq", "attribute": "…", "value": null }findest du Einträge ohne Wert.