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ätzlichX-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
POSTmit Anmeldung lässt sich über den HeaderIdempotency-Key(bis 80 Zeichen) dieselbe Antwort erneut abrufen, ohne dass die Aktion zweimal läuft. Die Antwort trägt dannIdempotent-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'import json, os, urllib.request
req = urllib.request.Request(
"https://www.lunwerk.de/api/v1/reports?limit=5",
headers={"Authorization": "Bearer " + os.environ["LUNWERK_TOKEN"]})
with urllib.request.urlopen(req) as r:
for b in json.load(r)["berichte"]:
print(b["datum"], b["status"], b["arbeiten"])const r = await fetch("https://www.lunwerk.de/api/v1/reports?limit=5", {
headers: { Authorization: "Bearer " + process.env.LUNWERK_TOKEN },
});
const { berichte } = await r.json();
berichte.forEach((b) => console.log(b.datum, b.status));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
- Anmeldung
- Konto
- Baustellen
- Tagesberichte
- Wetterchronik
- Zeiten
- Mängelregister
- Feiertage
- Werkzeuge
- Daten
- Kontakt
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