Lexware-kompatible Schnittstelle
Unter /api/lexware/v1 bildet WorkOffice Pro die Schnittstelle von Lexware Office nach – im Umfang, den WorkTime Pro und andere Programme tatsächlich nutzen. Ein Programm mit fertiger Lexware-Anbindung spricht damit WorkOffice an, ohne dass sich an ihm etwas ändert: Es bekommt nur eine andere Adresse und einen WorkOffice-Schlüssel statt des Lexware-Schlüssels.
Für wen
- Ältere Fassungen von WorkTime Pro ohne direkte Verbindung. Neuere nutzen die WorkTime-Anbindung (v1).
- Shops, Zahlungsdienste und Scan-Apps, die heute Eingangsbelege an Lexware Office schicken – sie landen dann im Belegeingang von WorkOffice (siehe Belege erfassen).
- Eigene Werkzeuge, die mit einer stabilen Schnittstelle arbeiten wollen.
Die Schnittstelle steckt in jedem Paket, auch in „Start“.
Einrichten
- Unter Verwaltung → WorkTime Pro → API-Schlüssel einen Schlüssel erzeugen – Vorlage „WorkTime Pro“ für WorkTime, „Belege einreichen“ für Shops und Scan-Apps (siehe Authentifizierung).
- Im anderen Programm die Lexware-Adresse ersetzen durch
https://buero.ihrbetrieb.de/api/lexwareund den Schlüssel eintragen. WorkTime Pro erwartet beides in seiner.env(LEXWARE_API_URLund, für die Webhooks,LEXWARE_WEBHOOK_PUBLIC_KEY); die Einstellungsseite zeigt beide Zeilen fertig zum Kopieren.
Nur Schlüssel, keine Sitzung
Die Schnittstelle nimmt nur allgemeine API-Schlüssel an, als Authorization: Bearer wo_… (wie bei Lexware) oder im Kopffeld X-API-Key. Eine angemeldete Browsersitzung bekommt 401:
Diese Schnittstelle nimmt nur API-Schlüssel an (Authorization: Bearer wo_…). Schlüssel unter Einstellungen → WorkTime Pro & API erzeugen.
So kann kein fremdes Skript im Namen eines angemeldeten Benutzers über diesen Weg Belege anlegen.
Endpunkte
| Methode | Pfad | Recht | Hinweis |
|---|---|---|---|
| GET | /profile | – | Betrieb: organizationId, Name, taxType, smallBusiness |
| GET | /contacts | customer:read | customer, vendor, name, email, number, page (ab 0), size (≤ 250) |
| GET | /contacts/{id} | customer:read | |
| POST | /contacts | customer:write | Kunden- bzw. Lieferantennummer vergibt WorkOffice |
| PUT | /contacts/{id} | customer:write | version muss stimmen, sonst 409 |
| GET | /articles, /articles/{id} | article:read | articleNumber, type, page, size |
| POST | /invoices | document:write | Rechnungsentwurf; ?finalize=true schreibt fest und braucht document:finalize |
| GET | /invoices/{id} | document:read | nur Rechnungen |
| POST | /quotations | document:write | Angebotsentwurf |
| GET | /quotations/{id} | document:read | nur Angebote |
| GET | /payments/{id} | document:read | offener Betrag, Bezahlt-Datum; Entwürfe und Angebote → 406 |
| POST | /files | expense:write | Beleg einreichen (multipart/form-data: file, type=voucher), Antwort 202 |
| GET | /files/{id} | expense:read | die eingereichte Datei |
| GET | /vouchers/{id} | expense:read | Stand: blank → unchecked → open/paid bzw. voided |
| POST, GET, DELETE | /event-subscriptions | Leserecht des Ereignisses | Webhooks abonnieren, ansehen, beenden – nur die Abos dieses Schlüssels |
Was WorkOffice nicht kennt, nimmt diese Schnittstelle an und übergeht es: Ein Lexware-Programm schickt Felder, die es in WorkOffice nicht gibt, und die sollen die Anfrage nicht scheitern lassen. Geprüft wird in der Abbildung auf WorkOffice.
Fehler im Format von Lexware
{
"timestamp": "2026-10-23T08:30:00.000Z",
"status": 400,
"error": "Bad Request",
"path": "/api/lexware/v1/invoices",
"message": "Die Anfrage ist unvollständig oder fehlerhaft. Einzelheiten unter details.",
"details": [
{ "field": "lineItems[0].unitPrice.taxRatePercentage", "violation": "INVALID", "message": "Erlaubt sind 0, 7 und 19 %." }
]
}
message ist immer ein Text – WorkTime Pro zeigt daraus und aus details seinen Benutzern, was nicht gepasst hat.
Grenzen
Dieselben wie überall: 300 Anfragen je Minute und Schlüssel, darüber 429 mit Retry-After (siehe Taktsperre). Steht der Betrieb auf „nur lesen“, wird jede schreibende Anfrage abgewiesen – auch die von WorkTime Pro.