Zum Inhalt springen
WorkOffice ProHandbuch
Zum Programm

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

  1. 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).
  2. Im anderen Programm die Lexware-Adresse ersetzen durch https://buero.ihrbetrieb.de/api/lexware und den Schlüssel eintragen. WorkTime Pro erwartet beides in seiner .env (LEXWARE_API_URL und, 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

MethodePfadRechtHinweis
GET/profile–Betrieb: organizationId, Name, taxType, smallBusiness
GET/contactscustomer:readcustomer, vendor, name, email, number, page (ab 0), size (≤ 250)
GET/contacts/{id}customer:read
POST/contactscustomer:writeKunden- bzw. Lieferantennummer vergibt WorkOffice
PUT/contacts/{id}customer:writeversion muss stimmen, sonst 409
GET/articles, /articles/{id}article:readarticleNumber, type, page, size
POST/invoicesdocument:writeRechnungsentwurf; ?finalize=true schreibt fest und braucht document:finalize
GET/invoices/{id}document:readnur Rechnungen
POST/quotationsdocument:writeAngebotsentwurf
GET/quotations/{id}document:readnur Angebote
GET/payments/{id}document:readoffener Betrag, Bezahlt-Datum; Entwürfe und Angebote → 406
POST/filesexpense:writeBeleg einreichen (multipart/form-data: file, type=voucher), Antwort 202
GET/files/{id}expense:readdie eingereichte Datei
GET/vouchers/{id}expense:readStand: blank → unchecked → open/paid bzw. voided
POST, GET, DELETE/event-subscriptionsLeserecht des EreignissesWebhooks 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.