maesn
Für Entwickler

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.

Lennart Svensson, CTO und Mitgründer bei Maesn
Lennart Svensson
CTO und Mitgründer · · Aktualisiert
Illustration zu Lexware Office anbinden: Synchronisieren ohne Polling
Der Kontext

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.

Das Problem

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.

Was das für Ihr Onboarding bedeutet

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.

Das Problem

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.

Eine Sekunde, alle Endpunkte2 Anfragen
1GET /contacts/{id}

die aktuelle Version lesen

2PUT /contacts/{id}

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.

Das ganze Budget sind zwei Anfragen pro Sekunde, und es gilt für alle Endpunkte gleichzeitig. Eine Änderung verbraucht beide.
Zwei Limits, zwei Fehlerbilder
EbeneLimitBeim Überschreiten
Ressourcen-Endpunkte2 Anfragen pro Sekunde, alle Endpunkte zusammen429, der Aufruf wird nicht ausgeführt
Autorisierungsservergetrennt, nicht öffentlich dokumentiert429 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.

Das Problem

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.

Die Version lesen, dann zurückschreibenHTTP
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.

Die Rechnung, die Ihr Design entscheidet

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.

Wie maesn es löst

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.

Für einen Kunden abonnieren, dann eine Form behandelnJS
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.

Lexware sendet
eventType
invoice.status.changed
organizationId
aa93e8a8…
resourceId
4d43ad14…
eventDate
2023-05-23T12:30:00.000+02:00
maesn liefert
resource
INVOICE
eventType
UPDATED
resourceId
1605408d…
filterDate
nullvon Lexware nicht gesendet
userId
nullvon Lexware nicht gesendet
Dieselbe Änderung, in Lexwares Form und in der einheitlichen. Zwei Felder bleiben leer, weil Lexware sie nicht sendet, und die Dokumentation sagt es offen.

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.

Wie maesn es löst

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 Sie bekommen

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.

FeldWas es istDer Haken
currencyWährung eines Preises und einer PositionssummeDokumentiert als ausschließlich EUR. Rechnen Sie auf Ihrer Seite um und behalten Sie Originalbetrag und Kurs
xRechnung.buyerReferenceDie Leitweg-ID für Rechnungen an deutsche öffentliche AuftraggeberIst sie gesetzt, muss vendorNumberAtCustomer ebenfalls gesetzt sein
electronicDocumentProfileNONE, EN16931 (ZUGFeRD) oder XRechnungSchreibgeschü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.

Wo unser Teil endet

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.

Ebenfalls gut zu wissen

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.

FAQ

Häufige Fragen

Gibt es eine Sandbox für Lexware Office?

Nein. Die öffentliche API existiert nur in Lexwares Produktivumgebung. Für die Entwicklung legen Sie ein Lexware-Testkonto an, das kostenlos ist, 30 Tage gilt und die Funktionen von Version XL mit wenigen Ausnahmen bietet, Elster darunter. Wann Sie live gehen, entscheiden Sie selbst, denn Lexware führt keine Abnahmeprüfung durch.

Wie lauten die Ratenlimits von Lexware Office?

Ein Client darf zwei Anfragen pro Sekunde senden, und dieses Limit gilt für alle Endpunkte gleichzeitig. Ein eigenes Budget je Endpunkt gibt es nicht. Wer es überschreitet, bekommt 429 zurück. Der Autorisierungsserver hat eigene Limits, die nicht veröffentlicht sind, und ein Client, der weiter drückt, bleibt gesperrt, bis er langsamer wird.

Warum gibt meine Änderung 409 Conflict zurück?

Weil Lexware mit optimistischem Sperren arbeitet. Ein PUT muss die version tragen, die Sie beim letzten GET dieses Datensatzes erhalten haben. Hat irgendetwas sie zwischenzeitlich geändert, ist Ihre Version veraltet und der Schreibvorgang wird mit 409 abgewiesen. Die Abhilfe ist, den Datensatz erneut zu lesen und mit der neuen Version zu wiederholen.

Unterstützt Lexware Office Webhooks?

Ja, und sie sind der vorgesehene Weg, im Gleichstand zu bleiben, weil Lexware Sie bittet, auf Polling zu verzichten. Über maesn abonnieren Sie je Kunde eine Ressource und einen Event-Typ. Zwei Felder der einheitlichen Nutzlast bleiben bei Lexware leer, filterDate und userId, weil Lexware sie nicht sendet.

Welche Tarife können die öffentliche API von Lexware Office nutzen?

Lexware gibt an, dass die öffentliche API ab Version XL bereitsteht; Ihre Kunden brauchen also mindestens diesen Tarif, um einen API-Schlüssel anzulegen. Eine Partnerschaft mit Lexware ändert, was erreichbar ist, und maesn unterstützt beide Wege, Ihre Implementierung bleibt also in beiden Fällen dieselbe.

Welche Währungen unterstützt Lexware Office?

Ausschließlich EUR. Die Dokumentation sagt das sowohl für den Preis als auch für die Positionssumme, und Steuersätze und -schlüssel folgen deutschem Recht. Wenn Ihr Produkt andere Währungen führt, rechnen Sie um, bevor Sie buchen, und behalten Sie Originalbetrag und Kurs auf Ihrer Seite.

Einmal 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.