Zum Inhalt springen
LunwerkBaubuch
Anmelden

Register 8 · Schnittstelle · Blatt 70

Schnittstelle API v1

Die Schnittstelle liefert JSON und arbeitet mit persönlichen Bearer-Tokens. Sie umfasst alles, was die Oberfläche kann: Baustellen, Tagesberichte mit Festschreiben und Prüfung, Stundenzettel, Mängel, Wetterchronik, Feiertage und die Rechenwerkzeuge. Die Beschreibung folgt OpenAPI 3.1 und steht unter /api/v1/openapi.json. Dieses Blatt wird aus derselben Datei erzeugt.

Grundlagen

Basis
https://<Adresse>/api/v1; die Adresse ist egal, alle Städte-Zugänge zeigen auf dieselben Daten.
Anmeldung
Header Authorization: Bearer lwk_…. Tokens legen Sie im Konto an (höchstens 10). Mit Sitzungscookie brauchen ändernde Anfragen zusätzlich X-CSRF-Token.
Fehler
Immer {"error":{"code","message","fields"},"request_id":"req_…"} mit passendem Statuscode; Texte sind deutsch, Codes englisch.
Grenzen
120 Anfragen pro Minute und Token (sonst 429 mit Retry-After); Rumpf höchstens 1 MB, Mängelfoto höchstens 300 KB.
Wiederholen
Bei POST mit Anmeldung lässt sich über den Header Idempotency-Key (bis 80 Zeichen) dieselbe Antwort erneut abrufen, ohne dass die Aktion zweimal läuft. Die Antwort trägt dann Idempotent-Replay: true.
Versionen
Aktuell v1. Die Version v0 wurde am 30. Juni 2023 abgeschaltet und antwortet mit 410, siehe Archiv.
Demo
Lesende Endpunkte der Baustellen, Berichte, Mängel, Zeiten und Wetterdaten gibt es ohne Anmeldung unter /api/v1/demo/… für das Demo-Konto „Muster Bau GmbH“.

Erster Aufruf

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' \
     'https://www.lunwerk.de/api/v1/reports?limit=5'

Prüfsummenkette

Ein festgeschriebener Bericht erhält die nächste Nummer seiner Baustelle und die SHA-256-Prüfsumme über Baustelle, Datum, Nummer, Inhalt, Unterzeichner, den Hash der Unterschrift und die Prüfsumme des Vorgängers. GET /api/v1/reports/{id}/verify berechnet die Kette bis zu diesem Bericht neu. Wer einen Bericht an der Datenbank vorbei verändert, wird dadurch am ersten abweichenden Bericht erkannt. Die Beschreibung des Verfahrens steht unter Sicherheit.

Endpunkte

56 Endpunkte. Die Beispiele zeigen jeweils Anfrage und Rumpf; Antworten haben immer die Form eines JSON-Objekts.

System

GET /api/v1/region ohne Anmeldung

Liefert die Region dieses Zugangs. Sie ergibt sich aus der Adresse, über die Sie die Seite aufrufen (zum Beispiel fra1 für Frankfurt am Main). Die Region stellt das Bundesland für die Feiertage voreingestellt ein.

curl 'https://www.lunwerk.de/api/v1/region'

Antworten: 200

GET /api/v1/stammdaten ohne Anmeldung

Bundesländer, Gewerke, Himmelsangaben, Mangelstatus und die Grenzen pro Konto.

curl 'https://www.lunwerk.de/api/v1/stammdaten'

Antworten: 200

GET /api/v1/health ohne Anmeldung

Schreibt und liest einen Wert in der Datenbank, prüft den freien Speicherplatz und das Alter der letzten Hintergrundaufgabe. Bei Störung 503.

curl 'https://www.lunwerk.de/api/v1/health'

Antworten: 200 503

GET /api/v1/status ohne Anmeldung

Status der Komponenten aus echten Messungen: Antwortzeit der Datenbank, Warteschlange, Speichernutzung. Kontozahlen werden nicht genannt.

curl 'https://www.lunwerk.de/api/v1/status'

Antworten: 200

GET /api/v1/openapi.json ohne Anmeldung

Liefert diese OpenAPI-3.1-Beschreibung.

curl 'https://www.lunwerk.de/api/v1/openapi.json'

Antworten: 200

Anmeldung

POST /api/v1/auth/register ohne Anmeldung

Legt sofort ein Konto an und meldet an. Es wird keine E-Mail versendet. Das Passwort hat mindestens 10 Zeichen. Bundesland als Kürzel (z. B. HE), Gewerk aus der Liste unter /api/v1/stammdaten.

Beispiel für den Rumpf der Anfrage

{
  "firma": "Roskothen Elektrotechnik",
  "name": "Anja Roskothen",
  "email": "anja@beispiel.test",
  "passwort": "ein-langes-passwort",
  "bundesland": "HE",
  "gewerk": "Elektro"
}
curl -X POST -H 'Content-Type: application/json' -d '{"firma": "Roskothen Elektrotechnik", "name": "Anja Roskothen", "email": "anja@beispiel.test", "passwort": "ein-langes-passwort", "bundesland": "HE", "gewerk": "Elektro"}' 'https://www.lunwerk.de/api/v1/auth/register'

Antworten: 201 400 409 422 429

POST /api/v1/auth/login ohne Anmeldung

Meldet mit E-Mail und Passwort an und setzt das Sitzungscookie (__Host-Präfix, HttpOnly, Secure, SameSite=Lax). Nach fünf Fehlversuchen für dieselbe E-Mail-Adresse folgen 15 Minuten lang 429.

Beispiel für den Rumpf der Anfrage

{
  "email": "anja@beispiel.test",
  "passwort": "ein-langes-passwort"
}
curl -X POST -H 'Content-Type: application/json' -d '{"email": "anja@beispiel.test", "passwort": "ein-langes-passwort"}' 'https://www.lunwerk.de/api/v1/auth/login'

Antworten: 200 400 401 422 429

POST /api/v1/auth/logout

Beendet die aktuelle Sitzung und löscht das Cookie.

curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/auth/logout'

Antworten: 200 401

Konto

GET /api/v1/me

Liefert Konto, Region, Nutzung und Grenzen. Bei Cookie-Sitzung enthält die Antwort das CSRF-Token für ändernde Anfragen.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/me'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/me ohne Anmeldung (Demo-Konto Muster Bau GmbH).

PATCH /api/v1/me

Ändert Firma, Name, Bundesland, Gewerk oder blendet die Startliste aus (start_ausblenden).

Beispiel für den Rumpf der Anfrage

{
  "firma": "Roskothen Elektrotechnik GmbH",
  "bundesland": "HE",
  "start_ausblenden": true
}
curl -X PATCH -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"firma": "Roskothen Elektrotechnik GmbH", "bundesland": "HE", "start_ausblenden": true}' 'https://www.lunwerk.de/api/v1/me'

Antworten: 200 400 401 403 422

DELETE /api/v1/me

Löscht das Konto mit allen Daten (Baustellen, Berichte, Zeiten, Mängel, Tokens, Sitzungen). Zur Bestätigung ist das Passwort anzugeben. Das Löschen ist endgültig.

Beispiel für den Rumpf der Anfrage

{
  "passwort": "ein-langes-passwort"
}
curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"passwort": "ein-langes-passwort"}' 'https://www.lunwerk.de/api/v1/me'

Antworten: 200 400 401 403

POST /api/v1/me/password

Ändert das Passwort. Aktuelles und neues Passwort sind anzugeben. Andere Sitzungen werden beendet.

Beispiel für den Rumpf der Anfrage

{
  "aktuell": "ein-langes-passwort",
  "neu": "ein-noch-laengeres-passwort"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"aktuell": "ein-langes-passwort", "neu": "ein-noch-laengeres-passwort"}' 'https://www.lunwerk.de/api/v1/me/password'

Antworten: 200 400 401 403 422

GET /api/v1/me/sessions

Listet die aktiven Sitzungen des Kontos.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/me/sessions'

Antworten: 200 401

DELETE /api/v1/me/sessions/{id}

Beendet eine Sitzung anhand der Kennung aus der Liste.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/me/sessions/<id>'

Antworten: 200 401 403 404

GET /api/v1/tokens

Listet die API-Tokens ohne das Geheimnis.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/tokens'

Antworten: 200 401

POST /api/v1/tokens

Legt ein persönliches Bearer-Token an. Das Geheimnis erscheint nur in dieser Antwort und wird danach nur als SHA-256-Wert gespeichert. Höchstens 10 Tokens.

Beispiel für den Rumpf der Anfrage

{
  "name": "Auswertung Buchhaltung"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"name": "Auswertung Buchhaltung"}' 'https://www.lunwerk.de/api/v1/tokens'

Antworten: 201 400 401 403 409 422

DELETE /api/v1/tokens/{id}

Widerruft ein Token. Anfragen mit diesem Token werden danach abgelehnt.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/tokens/<id>'

Antworten: 200 401 403 404

Baustellen

GET /api/v1/baustellen

Listet die Baustellen des Kontos mit Zählern (Berichte, festgeschrieben, offene Mängel).

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/baustellen'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/baustellen ohne Anmeldung (Demo-Konto Muster Bau GmbH).

POST /api/v1/baustellen

Legt eine Baustelle an. Jede Baustelle führt eine eigene Berichtskette. Höchstens 5 Baustellen im Konto.

Beispiel für den Rumpf der Anfrage

{
  "name": "Neubau Kita Am Anger",
  "ort": "Hanau",
  "auftraggeber": "Stadt Hanau",
  "bundesland": "HE"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"name": "Neubau Kita Am Anger", "ort": "Hanau", "auftraggeber": "Stadt Hanau", "bundesland": "HE"}' 'https://www.lunwerk.de/api/v1/baustellen'

Antworten: 201 400 401 403 409 422

GET /api/v1/baustellen/{id}

Liefert eine Baustelle.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/baustellen/<id>'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/baustellen/{id} ohne Anmeldung (Demo-Konto Muster Bau GmbH).

PATCH /api/v1/baustellen/{id}

Ändert Name, Ort, Auftraggeber, Bundesland oder archiviert die Baustelle (archiviert: true).

Beispiel für den Rumpf der Anfrage

{
  "archiviert": true
}
curl -X PATCH -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"archiviert": true}' 'https://www.lunwerk.de/api/v1/baustellen/<id>'

Antworten: 200 400 401 403 404 422

DELETE /api/v1/baustellen/{id}

Löscht eine Baustelle samt Entwürfen. Gibt es festgeschriebene Berichte, antwortet die API mit 409: Dann bitte archivieren, damit die Kette erhalten bleibt. Zugeordnete Mängel bleiben ohne Baustelle bestehen.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/baustellen/<id>'

Antworten: 200 401 403 404 409

Tagesberichte

GET /api/v1/reports

Listet Berichte, neueste zuerst. Filter: baustelle_id, von, bis (Datum), status (entwurf oder festgeschrieben). Seitenweise mit limit (höchstens 200) und offset.

Abfrageparameter: baustelle_id, von, bis, status, limit, offset

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/reports'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/reports ohne Anmeldung (Demo-Konto Muster Bau GmbH).

POST /api/v1/reports

Legt einen Bericht als Entwurf an. Pro Baustelle und Datum gibt es höchstens einen Bericht (sonst 409). Eine gezeichnete Unterschrift ist ein PNG als Data-URL bis 60 KB. Mit dem Header Idempotency-Key lässt sich die Anfrage gefahrlos wiederholen.

Beispiel für den Rumpf der Anfrage

{
  "baustelle_id": "bst_…",
  "datum": "2026-11-09",
  "inhalt": {
    "wetter": {
      "morgens_c": 6,
      "mittags_c": 11,
      "niederschlag_mm": 0.4,
      "wind_bft": 3,
      "himmel": "bedeckt",
      "arbeitsbehinderung": false
    },
    "personal": [
      {
        "name": "Dennis Kaltenbach",
        "gewerk": "Maurer",
        "von": "07:00",
        "bis": "16:00",
        "pause_min": 45,
        "anzahl": 1
      }
    ],
    "geraete": [
      {
        "name": "Turmdrehkran",
        "stunden": 6.5
      }
    ],
    "arbeiten": "Mauerwerk Treppenhaus B, 3. OG.",
    "besonderes": "",
    "behinderung": {
      "aktiv": false,
      "text": ""
    }
  },
  "unterzeichner": "Marko Veselić"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"baustelle_id": "bst_…", "datum": "2026-11-09", "inhalt": {"wetter": {"morgens_c": 6, "mittags_c": 11, "niederschlag_mm": 0.4, "wind_bft": 3, "himmel": "bedeckt", "arbeitsbehinderung": false}, "personal": [{"name": "Dennis Kaltenbach", "gewerk": "Maurer", "von": "07:00", "bis": "16:00", "pause_min": 45, "anzahl": 1}], "geraete": [{"name": "Turmdrehkran", "stunden": 6.5}], "arbeiten": "Mauerwerk Treppenhaus B, 3. OG.", "besonderes": "", "behinderung": {"aktiv": false, "text": ""}}, "unterzeichner": "Marko Veselić"}' 'https://www.lunwerk.de/api/v1/reports'

Antworten: 201 400 401 403 409 422

GET /api/v1/reports/{id}

Liefert einen Bericht mit vollständigem Inhalt und der gezeichneten Unterschrift.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/reports/<id>'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/reports/{id} ohne Anmeldung (Demo-Konto Muster Bau GmbH).

PATCH /api/v1/reports/{id}

Ändert einen Entwurf (inhalt, unterzeichner, signatur, datum). Festgeschriebene Berichte lehnt die API mit 409 ab.

Beispiel für den Rumpf der Anfrage

{
  "inhalt": {
    "arbeiten": "Mauerwerk Treppenhaus B, 3. OG, Fensterbrüstungen."
  }
}
curl -X PATCH -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"inhalt": {"arbeiten": "Mauerwerk Treppenhaus B, 3. OG, Fensterbrüstungen."}}' 'https://www.lunwerk.de/api/v1/reports/<id>'

Antworten: 200 400 401 403 404 409 422

DELETE /api/v1/reports/{id}

Löscht einen Entwurf. Festgeschriebene Berichte lassen sich nicht löschen (409).

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/reports/<id>'

Antworten: 200 401 403 404 409

POST /api/v1/reports/{id}/festschreiben

Schreibt den Entwurf fest: Der Bericht erhält die nächste laufende Nummer der Baustelle und eine SHA-256-Prüfsumme, in die die Prüfsumme des Vorgängers eingeht (Kette). Danach lehnt die API Änderungen mit 409 ab. Voraussetzung: Unterzeichner und Arbeiten sind ausgefüllt.

curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/reports/<id>/festschreiben'

Antworten: 200 401 403 404 409 422

GET /api/v1/reports/{id}/verify

Berechnet die Prüfsummen der Kette von der ersten Nummer bis zu diesem Bericht neu und vergleicht sie mit den gespeicherten Werten. Bei einem Entwurf ist gueltig null, weil er noch nicht in der Kette steht.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/reports/<id>/verify'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/reports/{id}/verify ohne Anmeldung (Demo-Konto Muster Bau GmbH).

GET /api/v1/baustellen/{id}/verify

Prüft die Kette aller festgeschriebenen Berichte einer Baustelle und nennt den ersten abweichenden Bericht, falls es einen gibt.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/baustellen/<id>/verify'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/baustellen/{id}/verify ohne Anmeldung (Demo-Konto Muster Bau GmbH).

Wetterchronik

GET /api/v1/wetter

Liefert die Wetterangaben aus den Tagesberichten als Reihe (Temperatur morgens/mittags, Niederschlag, Wind, Himmel) mit Monatswerten. Ohne von/bis: die letzten 120 Tage bis zum jüngsten Bericht.

Abfrageparameter: baustelle_id, von, bis

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/wetter'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/wetter ohne Anmeldung (Demo-Konto Muster Bau GmbH).

Zeiten

GET /api/v1/mitarbeiter

Listet die Mitarbeitenden, für die Stundenzettel geführt werden. Sie melden sich nicht an.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/mitarbeiter'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/mitarbeiter ohne Anmeldung (Demo-Konto Muster Bau GmbH).

POST /api/v1/mitarbeiter

Legt eine Person für Stundenzettel an. Höchstens 20 pro Konto.

Beispiel für den Rumpf der Anfrage

{
  "name": "Lukas Reinhardt",
  "gewerk": "Elektro"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"name": "Lukas Reinhardt", "gewerk": "Elektro"}' 'https://www.lunwerk.de/api/v1/mitarbeiter'

Antworten: 201 400 401 403 409 422

PATCH /api/v1/mitarbeiter/{id}

Ändert Name, Gewerk oder setzt aktiv auf false.

Beispiel für den Rumpf der Anfrage

{
  "aktiv": false
}
curl -X PATCH -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"aktiv": false}' 'https://www.lunwerk.de/api/v1/mitarbeiter/<id>'

Antworten: 200 400 401 403 404 422

DELETE /api/v1/mitarbeiter/{id}

Löscht die Person samt ihren Zeiteinträgen.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/mitarbeiter/<id>'

Antworten: 200 401 403 404

GET /api/v1/zeiten

Liefert eine Woche Mo bis So für alle aktiven Mitarbeitenden. Parameter woche: ein beliebiges Datum in der gewünschten Woche (Standard: heute).

Abfrageparameter: woche, land

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/zeiten'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/zeiten ohne Anmeldung (Demo-Konto Muster Bau GmbH).

PUT /api/v1/zeiten/{mid}/{datum}

Speichert die Eingabe für eine Person und einen Tag, zum Beispiel 7:30-16:00 P30, frei, U (Urlaub), K (krank) oder mehrere Abschnitte 6:00-10:00, 14:00-19:30. Eine leere Eingabe löscht die Zelle. Die Antwort enthält die gelesene Eingabe.

Beispiel für den Rumpf der Anfrage

{
  "eingabe": "7:30-16:00 P30"
}
curl -X PUT -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"eingabe": "7:30-16:00 P30"}' 'https://www.lunwerk.de/api/v1/zeiten/<mid>/<datum>'

Antworten: 200 400 401 403 404 422

GET /api/v1/zeiten/pruefung

Prüft die gespeicherten Stundenzettel nach dem Arbeitszeitgesetz. Parameter von und bis (Datum, höchstens 92 Tage; Standard: laufende Woche), land (Standard: Bundesland des Kontos).

Abfrageparameter: von, bis, land

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/zeiten/pruefung'

Antworten: 200 401 422 · Auch lesbar unter /api/v1/demo/zeiten/pruefung ohne Anmeldung (Demo-Konto Muster Bau GmbH).

Mängelregister

GET /api/v1/maengel

Listet Mängel. Filter: status, gewerk, baustelle_id, q (Suchtext in Titel, Ort, Verantwortlich), faellig=1 (Frist überschritten und nicht behoben). Sortierung nach Nummer absteigend.

Abfrageparameter: status, gewerk, baustelle_id, q, faellig, limit, offset

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel'

Antworten: 200 401 · Auch lesbar unter /api/v1/demo/maengel ohne Anmeldung (Demo-Konto Muster Bau GmbH).

POST /api/v1/maengel

Erfasst einen Mangel mit laufender Nummer. Das Foto folgt über PUT /maengel/{id}/foto.

Beispiel für den Rumpf der Anfrage

{
  "titel": "Silikonfuge Bad undicht",
  "ort": "Haus B, 2. OG, Wohnung 2.07",
  "gewerk": "SHK",
  "frist": "2026-11-30",
  "verantwortlich": "Ostermann Haustechnik",
  "baustelle_id": "bst_…"
}
curl -X POST -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"titel": "Silikonfuge Bad undicht", "ort": "Haus B, 2. OG, Wohnung 2.07", "gewerk": "SHK", "frist": "2026-11-30", "verantwortlich": "Ostermann Haustechnik", "baustelle_id": "bst_…"}' 'https://www.lunwerk.de/api/v1/maengel'

Antworten: 201 400 401 403 409 422

GET /api/v1/maengel/{id}

Liefert einen Mangel.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel/<id>'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/maengel/{id} ohne Anmeldung (Demo-Konto Muster Bau GmbH).

PATCH /api/v1/maengel/{id}

Ändert Felder oder den Status. Beim Wechsel auf behoben oder abgenommen setzt die API das Datum behoben_am auf heute, falls es leer ist.

Beispiel für den Rumpf der Anfrage

{
  "status": "behoben"
}
curl -X PATCH -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: application/json' -d '{"status": "behoben"}' 'https://www.lunwerk.de/api/v1/maengel/<id>'

Antworten: 200 400 401 403 404 422

DELETE /api/v1/maengel/{id}

Löscht einen Mangel mit Foto.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel/<id>'

Antworten: 200 401 403 404

PUT /api/v1/maengel/{id}/foto

Speichert ein Foto zum Mangel. Der Rumpf der Anfrage ist die Bilddatei selbst (Content-Type image/jpeg, image/png oder image/webp), höchstens 300 KB. Das Format wird an den ersten Bytes geprüft.

Der Rumpf der Anfrage ist die Datei selbst (image/jpeg).

curl -X PUT -H 'Authorization: Bearer $LUNWERK_TOKEN' -H 'Content-Type: image/jpeg' --data-binary @foto.jpg 'https://www.lunwerk.de/api/v1/maengel/<id>/foto'

Antworten: 200 401 403 404 413 415

GET /api/v1/maengel/{id}/foto

Liefert das Foto mit dem passenden Content-Type und nosniff.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel/<id>/foto'

Antworten: 200 401 404 · Auch lesbar unter /api/v1/demo/maengel/{id}/foto ohne Anmeldung (Demo-Konto Muster Bau GmbH).

DELETE /api/v1/maengel/{id}/foto

Entfernt das Foto.

curl -X DELETE -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel/<id>/foto'

Antworten: 200 401 403 404

GET /api/v1/maengel.csv

Exportiert alle Mängel in deutscher Konvention: Trennzeichen Semikolon, UTF-8 mit BOM, Datum TT.MM.JJJJ. Zellen, die mit = + - oder @ beginnen, werden gegen Formelinjektion mit einem Apostroph geschützt.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/maengel.csv'

Antworten: 200 401

Feiertage

GET /api/v1/feiertage/{land}/{jahr}.ics ohne Anmeldung

Liefert die gesetzlichen Feiertage eines Bundeslandes als iCalendar-Datei (ganztägige Termine).

curl 'https://www.lunwerk.de/api/v1/feiertage/<land>/<jahr>.ics'

Antworten: 200 404 422

GET /api/v1/feiertage/{land}/{jahr}/arbeitstage ohne Anmeldung

Liefert für jeden Monat die Zahl der Arbeitstage (Montag bis Freitag ohne gesetzliche Feiertage des Bundeslandes).

curl 'https://www.lunwerk.de/api/v1/feiertage/<land>/<jahr>/arbeitstage'

Antworten: 200 404 422

GET /api/v1/feiertage/{land}/{jahr} ohne Anmeldung

Liefert die gesetzlichen Feiertage eines Bundeslandes. Die Art bundesweit, land oder teilweise zeigt, ob der Tag überall im Land gilt.

curl 'https://www.lunwerk.de/api/v1/feiertage/<land>/<jahr>'

Antworten: 200 404 422

Werkzeuge

POST /api/v1/tools/arbzg-pruefung ohne Anmeldung

Prüft Stundenzettel nach ArbZG, ohne Anmeldung und ohne Speicherung. Höchstens 20 Personen mit je 93 Tagen. Ausgabe ist ein Prüfprotokoll mit Paragraph, Ist- und Sollwert je Befund.

Beispiel für den Rumpf der Anfrage

{
  "land": "HE",
  "mitarbeiter": [
    {
      "name": "Beispiel",
      "tage": [
        {
          "datum": "2026-11-09",
          "eingabe": "7:00-18:30 P30"
        },
        {
          "datum": "2026-11-10",
          "eingabe": "6:00-15:30 P30"
        }
      ]
    }
  ]
}
curl -X POST -H 'Content-Type: application/json' -d '{"land": "HE", "mitarbeiter": [{"name": "Beispiel", "tage": [{"datum": "2026-11-09", "eingabe": "7:00-18:30 P30"}, {"datum": "2026-11-10", "eingabe": "6:00-15:30 P30"}]}]}' 'https://www.lunwerk.de/api/v1/tools/arbzg-pruefung'

Antworten: 200 400 422 429

POST /api/v1/tools/stundensatz ohne Anmeldung

Berechnet den Verrechnungssatz aus Lohn, Lohnnebenkosten (lnk), Gemeinkosten (gk), Wagnis und Gewinn (wg), produktivem Anteil, Fahrzeit und Einsatzdauer. Zahlen dürfen mit Punkt oder Komma geschrieben werden. Die Antwort enthält den Rechenweg.

Beispiel für den Rumpf der Anfrage

{
  "lohn": 22.5,
  "lnk": 85,
  "gk": 14,
  "wg": 8,
  "produktiv": 82,
  "fahrzeit_min": 30,
  "einsatz_std": 6,
  "mwst": 19
}
curl -X POST -H 'Content-Type: application/json' -d '{"lohn": 22.5, "lnk": 85, "gk": 14, "wg": 8, "produktiv": 82, "fahrzeit_min": 30, "einsatz_std": 6, "mwst": 19}' 'https://www.lunwerk.de/api/v1/tools/stundensatz'

Antworten: 200 400 422 429

GET /api/v1/tools/stundensatz/presets ohne Anmeldung

Liefert Beispielwerte je Gewerk für den Stundensatz-Rechner. Es sind Ausgangswerte, keine Empfehlung.

curl 'https://www.lunwerk.de/api/v1/tools/stundensatz/presets'

Antworten: 200

Daten

GET /api/v1/export.zip

Liefert ein ZIP mit CSV-Dateien (Semikolon, UTF-8 mit BOM, Dezimalkomma), den gezeichneten Unterschriften und den Mängelfotos.

curl -H 'Authorization: Bearer $LUNWERK_TOKEN' 'https://www.lunwerk.de/api/v1/export.zip'

Antworten: 200 401

Kontakt

POST /api/v1/contact ohne Anmeldung

Speichert eine Nachricht an das Lunwerk-Team. Antworten kommen in einigen Werktagen. Höchstens drei Nachrichten pro Stunde je E-Mail-Adresse. E-Mails werden nicht versendet; die Antwort nennt eine Vorgangsnummer.

Beispiel für den Rumpf der Anfrage

{
  "name": "Anja Roskothen",
  "email": "anja@beispiel.test",
  "thema": "Passwort",
  "nachricht": "Bitte setzen Sie mein Passwort zurück."
}
curl -X POST -H 'Content-Type: application/json' -d '{"name": "Anja Roskothen", "email": "anja@beispiel.test", "thema": "Passwort", "nachricht": "Bitte setzen Sie mein Passwort zurück."}' 'https://www.lunwerk.de/api/v1/contact'

Antworten: 201 400 422 429

POST /api/v1/waitlist ohne Anmeldung

Trägt Sie für einen bezahlten Tarif in die Warteliste ein. Zahlungen gibt es nicht; es wird nichts abgebucht.

Beispiel für den Rumpf der Anfrage

{
  "email": "anja@beispiel.test",
  "tarif": "betrieb",
  "firma": "Roskothen Elektrotechnik",
  "mitarbeiter": "12"
}
curl -X POST -H 'Content-Type: application/json' -d '{"email": "anja@beispiel.test", "tarif": "betrieb", "firma": "Roskothen Elektrotechnik", "mitarbeiter": "12"}' 'https://www.lunwerk.de/api/v1/waitlist'

Antworten: 201 400 422 429

TitelSchnittstelle API v1Blatt70
Datum03.11.2026Rev.BMaßstab1:1
BearbeiterM. HartkopfRegion—