Lexware Office anbinden: Zwei Anfragen pro Sekunde und kein Polling
Lexware Office einmal aufzurufen ist leicht. Schwierig wird es, sobald Sie es häufig tun. Drei dokumentierte Regeln entscheiden Ihre Architektur, bevor Sie eine Zeile schreiben: Das Ratenlimit gilt für alle Endpunkte zusammen, jedem Schreibvorgang geht ein Lesevorgang voraus, und Lexware bittet Sie, nicht zu pollen.


Warum Lexware Office über die Abdeckung im deutschen Mittelstand entscheidet
Bei Lexware Office führt ein großer Teil der deutschen Kleinunternehmen, Freiberufler und ihrer Steuerberater die Bücher. Wenn Ihr Produkt in diesen Markt verkauft, entscheidet die Abdeckung oft darüber, ob Sie in Deutschland ausliefern oder erklären müssen, warum nicht.
Das Protokoll ist der leichte Teil: Es ist eine REST-API, und einen einzelnen Datensatz zu erreichen ist unspektakulär. Die Schwierigkeit liegt darin, dass das deutsche Buchhaltungsrecht im Datenmodell steckt und dass die Plattform sich mit Regeln schützt, die an Ihrer Architektur ansetzen und nicht an Ihren Request-Bodies.
In diesem Leitfaden geht es um diese Regeln. Wenn Sie das Datenmodell, die Authentifizierungsoptionen und die Marktplatz-Stufen an einer Stelle suchen, finden Sie das auf der Seite zur Lexware Office Schnittstelle. Hier geht es darum, wie Sie gegen die Plattform bauen, ohne in die drei Einschränkungen zu laufen, die die meisten ersten Implementierungen erwischen.
Wer sich verbinden kann und mit welchem Tarif
Zwei Dinge entscheiden, ob Ihre Kunden sich überhaupt verbinden können, und beide liegen außerhalb Ihres Codes: der Tarif, in dem sie sind, und Ihre eigene Beziehung zu Lexware.
Der Weg, der allen offensteht, ist die öffentliche API, authentifiziert mit einem API-Schlüssel. Lexware gibt an, dass sie ab Version XL bereitsteht; Kunden in einem kleineren Tarif haben also keinen Schlüssel, den sie Ihnen geben könnten.
Der Schlüssel wird innerhalb von Lexware Office von einem Benutzer mit Administratorrechten erzeugt, auf der Add-on-Seite der öffentlichen API. Er gehört zu diesem einen Konto, Ihre Kunden gehen also je einmal für ihre eigene Umgebung hindurch.
Es gibt einen zweiten Weg, und er öffnet sich über eine Partnerschaft mit Lexware. Das ist eine manuelle Qualifizierung mit deren Partnerteam. Sie erreicht einen größeren Satz an Endpunkten und Operationen, sie authentifiziert sich anders, und sie läuft unter einem höheren Ratenlimit.
maesn unterstützt beide Wege, die Endpunkte ebenso wie die Authentifizierung, Ihre Implementierung ändert sich also nicht mit dem Weg, auf dem Ihre Kunden landen. Die Qualifizierung führen wir gemeinsam mit Ihnen durch.
Lexware veröffentlicht das Programm selbst, einschließlich der Vorteile, die über den API-Zugang hinausgehen. In der Praxis zählen kaufmännisch vor allem zwei: Co-Marketing und ein Eintrag im Lexware-Marktplatz. maesn hat es durchlaufen: Lexware führt uns auf der eigenen Seite als Partner, und das ist für eine solche Aussage der einzige Beleg, der nicht von uns kommt.
Tarifvoraussetzung und Programm von Lexwares eigener Partnerseite zur öffentlichen API, geprüft am 4. August 2026.
Die Tarifprüfung gehört in Ihren Verbindungsablauf, bevor Kunden je Ihr Support-Postfach erreichen. Wer keinen Schlüssel erzeugen kann, liest eine gescheiterte Verbindung als Ihren Fehler. Nennen Sie den nötigen Tarif, bevor es jemand versucht, und nennen Sie den zweiten Weg gleich mit.
Zwei Anfragen pro Sekunde, über alle Endpunkte
Ein Client darf zwei Anfragen pro Sekunde senden. Die wichtige Hälfte dieses Satzes ist der Geltungsbereich: Lexware dokumentiert, dass sich das Limit auf alle Endpunkte gleichzeitig bezieht. Ein Budget deckt Ihre ganze Integration ab; je Ressource gibt es keines.
Dieses Budget gehört zum öffentlichen Weg. Eine Partnerschaft hebt es an, und das ist zu wissen, wenn Volumen der Grund ist, aus dem Sie diesen Abschnitt überhaupt lesen.
Der Mechanismus ist ein Token Bucket, und wer ihn überschreitet, bekommt 429 zurück, ohne dass der Aufruf ausgeführt wird. Lexware empfiehlt, auch auf Ihrer Seite einen Token Bucket zu betreiben, mindestens aber eine Pause zwischen aufeinanderfolgenden Aufrufen mit exponentiellem Backoff bei 429. Sie weisen außerdem darauf hin, dass schon Netzwerk-Jitter einen Client auslöst, der das Limit exakt einhält. Planen Sie deshalb unterhalb davon.
Der Autorisierungsserver hat eigene Limits, und die sind nicht veröffentlicht. Die Folge ist dort härter als ein abgewiesener Aufruf: Ein Client, der weiter sendet, wird für Sekunden bis Minuten gesperrt, und wer nicht langsamer wird, bleibt gesperrt, bis er es tut.
Wiederholverhalten, Backoff und der Unterschied zwischen einem abgewiesenen Aufruf und einem gesperrten Client sind auf jedem System, das wir unterstützen, dasselbe Problem. Genau deshalb liegt es im einheitlichen Fehlerhandling und nicht in jeder einzelnen Integration.
die aktuelle Version lesen
sie mit dieser Version zurückschreiben
Eine Änderung füllt die Sekunde. Jeder andere Aufruf, auch die nächste Änderung, wartet auf die nächste.
| Ebene | Limit | Beim Überschreiten |
|---|---|---|
| Ressourcen-Endpunkte | 2 Anfragen pro Sekunde, alle Endpunkte zusammen | 429, der Aufruf wird nicht ausgeführt |
| Autorisierungsserver | getrennt, nicht öffentlich dokumentiert | 429 plus eine zeitweilige Sperre, die dauerhaft wird, solange die Rate hoch bleibt |
Beide Zeilen aus Lexwares API-Dokumentation, Abschnitt API Rate Limits, geprüft am 4. August 2026.
Jede Änderung beginnt mit einem Lesevorgang
Lexware arbeitet mit optimistischem Sperren, ein Datensatz wird also nie gesperrt, bevor Sie ihn ändern. Dafür muss jedes PUT die version tragen, die Sie beim letzten GET dieses Datensatzes erhalten haben. Hat etwas anderes ihn zwischenzeitlich geändert, ist Ihre Version veraltet und der Schreibvorgang wird abgewiesen.
version ist schreibgeschützt und steigt bei jeder Änderung. Sie können den Wert weder berechnen noch lange zwischenspeichern, und genau das kostet Sie etwas.
GET /v1/contacts/{id}→ 200 { "id": "f5d5e4c2…", "version": 2, … }PUT /v1/contacts/{id}{ "version": 2, … }→ 200 { "id": "f5d5e4c2…", "version": 3, … }PUT /v1/contacts/{id}{ "version": 2, … } # jemand anders hat version 3 bereits geschrieben→ 409 Conflict
Feldsemantik aus Lexwares Dokumentation, Abschnitt Optimistic Locking. Endpunktpfade zur besseren Lesbarkeit gekürzt.
Eine Änderung sind zwei Aufrufe, und Ihr Budget sind zwei Aufrufe pro Sekunde für alles. Eine naive Schleife über Datensätze schafft damit rund eine Änderung pro Sekunde und lässt nichts übrig für Lesevorgänge, Webhooks oder was Ihre Integration sonst gleichzeitig tut.
Diese Zahl sind die zwei dokumentierten Regeln von oben nebeneinandergelegt, keine eigene Messung. Sie ist auch der Grund, warum Massenarbeit gegen Lexware hinter einen Ratenregler in eine Warteschlange gehört.
Polling ist unerwünscht, also läuft die Synchronisierung über Events
Lexware ist darin deutlich. Ihr Cookbook sagt, dass das Pollen von Ressourcen zu vermeiden ist, und nennt Webhooks als den Weg, zwei Systeme im Gleichstand zu halten. Zusammen mit dem Budget von oben ist das eine Design-Vorgabe: Es gibt keine Rate, bei der Polling gleichzeitig innerhalb des Limits bleibt und die Daten frisch hält.
Nativ sendet Lexware ein Event wie invoice.status.changed an eine Callback-URL, die Sie registriert haben, mit dem Konto, der Ressourcen-ID und dem Zeitpunkt der Änderung. Fehlgeschlagene Zustellungen werden über 48 Stunden wiederholt, und Lexware empfiehlt, den Aufruf in eine Warteschlange aufzunehmen und asynchron zu verarbeiten.
Über maesn abonnieren Sie je Kunde eine Ressource und einen Event-Typ und erhalten dieselbe Form, die Sie für jedes andere System erhalten. Das ist es, was einheitliche Webhooks in der Praxis bedeuten: eine Nutzlast, ein Abo-Aufruf, was auch immer die Plattform darunter aussendet.
await axios.post(url, {callbackUrl,eventType: "CREATED",resource: "CUSTOMER"}, { headers: { "X-API-KEY": apiKey, "X-ACCOUNT-KEY": accountKey } });// was an callbackUrl ankommt{"eventType": "CREATED","filterDate": null, // von Lexware nicht unterstützt"resource": "CUSTOMER","resourceId": "1605408d-ed88-4228-8a12-ab857a2972d8","userId": null // von Lexware nicht unterstützt}
Anfrage und Form der Nutzlast wörtlich aus der maesn-Dokumentation zu Lexware Office.
- eventType
- invoice.status.changed
- organizationId
- aa93e8a8…
- resourceId
- 4d43ad14…
- eventDate
- 2023-05-23T12:30:00.000+02:00
- resource
- INVOICE
- eventType
- UPDATED
- resourceId
- 1605408d…
- filterDate
- nullvon Lexware nicht gesendet
- userId
- nullvon Lexware nicht gesendet
Zwei Dinge bleiben bei Ihnen. Das Abo wird je Kunde angelegt, ein neu verbundenes Konto bedeutet also ein neues Abo, und filterDate sowie userId kommen bei Lexware leer an. Eine vereinheitlichte Nutzlast erfindet keine Daten, die die Quelle nie gesendet hat, und eine Integration, die auf diese zwei Felder verzweigt, verzweigt hier falsch.
Schlüssel laufen nach 24 Monaten ab, und ein Widerruf kommt als Event
Ein API-Schlüssel gilt nicht dauerhaft. Lexware setzt seine Lebensdauer auf 24 Monate und erneuert ihn in derselben Schlüsselverwaltung, in der er erzeugt wurde. Eine Verbindung, die zwei Jahre lang funktioniert hat, ist damit eine Verbindung, die kurz davor ist, es nicht mehr zu tun.
Kunden können sie auch früher beenden, und dafür gibt es ein Signal. maesn sendet eine TOKEN-Ressource mit dem Event-Typ REVOKED, wenn Kunden den Zugriff zurückziehen oder das Token sich nicht mehr erneuern lässt. Ob Sie es behandeln, entscheidet darüber, ob Sie Ihren Kunden sagen, dass die Verbindung weg ist, oder es aus deren Support-Ticket erfahren.
Eine Sache lohnt es noch, von vornherein einzuplanen: Kunden können mehrere Schlüssel anlegen und einschränken, was ein Schlüssel erreichen darf. Schränken sie ihn enger ein, als Sie brauchen, scheitern Ihre Aufrufe mit 403 und nicht mit 401. Die Zugangsdaten sind gültig und die Berechtigung ist zu eng, sagen Sie also im Moment der Schlüsselerzeugung, welchen Umfang Sie benötigen. Wie sich das systemübergreifend in einen Ablauf fügt, steht bei einheitlicher Authentifizierung.
Schlüssellebensdauer und mehrere Schlüssel aus Lexwares Cookbook zur öffentlichen API, geprüft am 4. August 2026. Die 403-Semantik stammt aus deren Tabelle der HTTP-Statuscodes, das TOKEN-Event aus der maesn-Dokumentation.
Was das deutsche Recht in Ihr Datenmodell legt
Einige Felder sind nicht optional, und sie sind aus rechtlichen Gründen verpflichtend. Drei davon erreichen Ihr eigenes Modell, ob Sie sie eingeplant haben oder nicht.
| Feld | Was es ist | Der Haken |
|---|---|---|
| currency | Währung eines Preises und einer Positionssumme | Dokumentiert als ausschließlich EUR. Rechnen Sie auf Ihrer Seite um und behalten Sie Originalbetrag und Kurs |
| xRechnung.buyerReference | Die Leitweg-ID für Rechnungen an deutsche öffentliche Auftraggeber | Ist sie gesetzt, muss vendorNumberAtCustomer ebenfalls gesetzt sein |
| electronicDocumentProfile | NONE, EN16931 (ZUGFeRD) oder XRechnung | Schreibgeschützt, meldet also, was ein Dokument ist, und legt es nicht fest |
Alle drei aus Lexwares API-Dokumentation, Eigenschaften von Kontakten und Positionen, geprüft am 4. August 2026.
Es gibt eine zweite Ebene dessen, was bestimmte Kunden tatsächlich dürfen, und sie wird leicht falsch verstanden: Die Funktionen, die ihr Lexware-Vertrag einräumt, sind dokumentiert als orthogonal zu den Berechtigungen des Schlüssels, und sie ändern sich über die Zeit. Lexware gibt den verfügbaren Satz deshalb über den Profil-Endpunkt aus. Lesen Sie ihn aus.
Was maesn abdeckt und was bei Ihnen bleibt: Steuern, Währung und der Tarif
Wir nehmen Ihnen die Form der Integration ab, nicht die Regeln der Plattform. Fünf Dinge bleiben bei Ihnen, und es ist billiger, das jetzt zu wissen als nach dem ersten Kundengespräch.
- Die Steuerrechnung ist Ihre. Wir liefern Sätze und Strukturen so aus, wie das System sie veröffentlicht; was Sie schulden und auf welcher Grundlage, bleibt Ihr Modell.
- Die Währungsumrechnung ist Ihre. Lexware unterstützt ausschließlich EUR, der umgerechnete Wert und der verwendete Kurs sind also Entscheidungen auf Ihrer Seite.
- Die Tarifvoraussetzung ist Lexwares. Wir können Ihnen sagen, dass es sie gibt und wo sie greift. Aufheben können wir sie für Kunden nicht, die den Tarif nicht haben.
- Die Partner-Qualifizierung ist Lexwares Entscheidung. Wir bereiten sie vor und gehen sie mit Ihnen durch; erteilen können wir sie nicht.
- Abos je Kunde bleiben je Kunde. Ein verbundenes Konto, ein Abo. Das ist das Modell der Plattform und nichts, was sich wegabstrahieren lässt.
An Anhängen sieht man diese Linie am klarsten, deshalb hier der ganze Vorgang: Ein Dokument an eine Buchung zu hängen, sind auf dieser Plattform vier Schritte. Die Transaktion anlegen, den Saldo des zugehörigen Finanzkontos aktualisieren, die Datei hochladen, dann die Datei mit der Transaktion verknüpfen. Es sind mehr als vier Aufrufe, weil die Saldo-Aktualisierung aus den Gründen von oben ein Lese- und ein Schreibvorgang ist. Gegen unseren eigenen Endpunkt ist es eine Anfrage: POST /accounting/transactions, die Transaktion als JSON und bis zu sechs Dateien im selben Multipart-Body. Den Datei-Endpunkt, die Beleg-ID, die er zurückgibt, und den Aufruf, der beide verknüpft, bekommen Sie nie zu sehen.
Drei Grenzen kommen damit, und Sie entwerfen um sie herum.
- Es endet bei einem Vorschlag. Der Aufruf, der eine Datei an eine Transaktion bindet, heißt Hinweis, und genau das tut er. Das Dokument erscheint in der Lexware-Weboberfläche als vorgeschlagen, und eine Person bestätigt es. Lexware stellt nichts Stärkeres bereit, diesen letzten Schritt kann also niemand automatisieren, wir eingeschlossen.
- Es braucht eine externe Referenz von Ihnen. Die Verknüpfung hängt an einer Referenz, die Sie mit der Transaktion mitsenden. Die zurückgelieferte ID trägt sie nicht. Keine Referenz, keine Verknüpfung.
- Es ist Best Effort, keine atomare Operation. Eine Kette von Aufrufen hat keine gemeinsame Transaktion und kein Rollback. Scheitert der Upload, nachdem die Buchung geschrieben ist, bleibt die Buchung geschrieben, und Ihr Wiederholversuch muss damit rechnen.
Eine Sache noch zum Einplanen, weil sie in keiner der beiden Dokumentationen steht. Schritt eins braucht die ID des Finanzkontos, und es gibt keinen Endpunkt, der sie auflistet. Sie können eines per ID abrufen, mehr nicht; die ID stammt also aus dem Anlegen des Kontos oder daraus, dass eine Person sie aus der Lexware-Oberfläche abliest. Achten Sie dabei auf die Benennung: Unser Accounts-Endpunkt liefert Buchungskategorien, und das ist etwas ganz anderes.
Die vier Schritte, die eine Anfrage und die drei Grenzen sind am 11. August 2026 gegen unsere eigene Implementierung geprüft worden. Lexware dokumentiert den Datei-Endpunkt, diese Kette aber nicht; lesen Sie diesen Abschnitt deshalb als unseren eigenen Erfahrungsbericht.
Lexware erlaubt keine Last- oder Performance-Tests gegen die öffentliche API, und eine Abnahmeprüfung führen sie auch nicht durch. Niemand gibt Ihre Integration frei, und niemand möchte, dass Sie die Produktion belasten, um herauszufinden, wo sie nachgibt.
Häufige Fragen
Gibt es eine Sandbox für Lexware Office?
Wie lauten die Ratenlimits von Lexware Office?
Warum gibt meine Änderung 409 Conflict zurück?
Unterstützt Lexware Office Webhooks?
Welche Tarife können die öffentliche API von Lexware Office nutzen?
Welche Währungen unterstützt Lexware Office?

Tripletex anbinden: Ein Session-Token trägt jeden Aufruf
Tripletex verbindet zwei Tokens zu einem dritten, legt die Firma in den Benutzernamen und nummeriert neue Buchungszeilen über die Zeile. Was das beim Bauen heißt.
Lennart Svensson · 24. Sept. 2026
Procountor anbinden: Unbeaufsichtigt laufen lassen
Procountor hat zwei Wege hinein, und der unbeaufsichtigte endet an jedem Endpunkt mit zweitem Faktor. Was das für Token, Abgleich und Steuersätze heißt.
Lennart Svensson · 28. Aug. 2026
DATEV Rechnungswesen anbinden: Beide Richtungen, ein Token
Eine Verbindung trägt Lesen und Schreiben in DATEV Rechnungswesen, auf einem Zwei-Jahres-Token. Welche Objekte in welche Richtung reisen, ist die Entscheidung.
Lennart Svensson · 17. Aug. 2026Einmal bauen, auf der Unified API.
Ratenregler, Versions-Lesevorgänge, Abos je Kunde und Schlüsselerneuerungen sind auf jedem Buchhaltungssystem dasselbe Problem. Lösen Sie sie einmal mit maesn und nicht einmal je Plattform.