Auth Anmeldung, Registrierung und Benutzerinfo
POST /auth/login Anmelden Statuscodes
200 Anmeldung erfolgreich
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"email": "benutzer@beispiel.de",
"password": "MeinPasswort1!"
} Response Beispiel
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Max Mustermann",
"email": "max@musterfirma.de",
"role": "Admin",
"mandantId": 3,
"mandantName": "Musterfirma GmbH"
} POST /auth/logout Abmelden Statuscodes
204 Erfolgreich abgemeldet
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /auth/me Aktuellen Benutzer abrufen Statuscodes
200 Benutzerdaten
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Max Mustermann",
"email": "max@musterfirma.de",
"role": "Admin",
"mandantId": 3,
"mandantName": "Musterfirma GmbH"
} POST /auth/register Registrieren (Privatperson, Unternehmen oder Mitarbeiter-Beitritt) Statuscodes
202 Registrierung eingereicht – Bestätigungs-E-Mail wurde versandt
400 Validierungsfehler
403 Öffentliche Registrierung deaktiviert
409 E-Mail-Adresse/Unternehmen bereits vorhanden, oder Einladung (bei `type=Mitarbeiter`) ungültig, abgelaufen oder bereits verwendet
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"type": "Mitarbeiter",
"inviteToken": "3f9a1c...",
"adminFirstName": "Erika",
"adminLastName": "Musterfrau",
"adminEmail": "employee@firma.de",
"adminPassword": "MeinPasswort1!",
"newsSubscriptionEnabled": true
} Response Beispiel
{
"message": "Registrierung eingereicht. Bitte bestätigen Sie Ihre E-Mail-Adresse.",
"tenantId": 3,
"status": "Pending"
} GET /auth/invites/{token} Einladungsdetails abrufen (öffentlich) Statuscodes
200 Einladung gültig
404 Einladung ungültig, abgelaufen, widerrufen oder bereits verwendet
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"tenantName": "Muster GmbH",
"email": "employee@firma.de"
} GET /auth/confirm-email E-Mail-Adresse bestätigen Statuscodes
200 E-Mail erfolgreich bestätigt
400 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /auth/register-company Unternehmen registrieren Statuscodes
202 Registrierung eingereicht – wartet auf Freischaltung
400 Validierungsfehler
409 Unternehmen oder E-Mail bereits vorhanden
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"companyName": "Musterfirma GmbH",
"adminName": "Erika Musterfrau",
"adminEmail": "admin@musterfirma.de",
"adminPassword": "Sicher1234!",
"addressCompany": "Musterfirma GmbH",
"addressStreet": "Musterstraße 1",
"addressZip": "12345",
"addressCity": "Musterstadt",
"addressCountry": "Deutschland"
} GET /user/settings Benutzereinstellungen abrufen Statuscodes
200 Benutzereinstellungen
401 Nicht authentifiziert
Response Beispiel
{
"newsSubscriptionEnabled": true,
"themePreference": "light"
} PUT /user/settings Benutzereinstellungen speichern Statuscodes
204 Einstellungen gespeichert
400 Fehler
401 Nicht authentifiziert
Request Beispiel
{
"newsSubscriptionEnabled": true,
"themePreference": "light"
} GET /user/column-preferences Spalteneinstellungen abrufen Statuscodes
200 Spalteneinstellungen
400 Fehler
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
[
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 1
},
{
"columnKey": "ergebnis",
"isVisible": true,
"sortOrder": 2
},
{
"columnKey": "naechstePruefung",
"isVisible": true,
"sortOrder": 3
}
] PUT /user/column-preferences Spalteneinstellungen speichern Statuscodes
204 Einstellungen gespeichert
400 Fehler
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
[
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 1
},
{
"columnKey": "ergebnis",
"isVisible": false,
"sortOrder": 2
}
] GET /user/group-state Gruppierzustand abrufen Statuscodes
200 Gruppierebenen
400 Fehler
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
[
{
"columnKey": "customerName",
"sortOrder": 0
}
] PUT /user/group-state Gruppierzustand speichern Statuscodes
204 Gruppierebenen gespeichert
400 Fehler
401 Nicht authentifiziert
422 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
[
{
"columnKey": "customerName",
"sortOrder": 0
}
] POST /auth/set-password Passwort setzen (Einladungs-Link) Statuscodes
200 Passwort erfolgreich gesetzt
400 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"token": "CfDJ8...",
"password": "NeuesPasswort1!",
"confirmPassword": "NeuesPasswort1!"
} Response Beispiel
{
"message": "Passwort erfolgreich gesetzt. Sie können sich jetzt anmelden."
} Inventar Inventareinträge lesen, bearbeiten und exportieren
GET /inventory Inventarliste abrufen Statuscodes
200 Paginierte Inventarliste
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /inventory Inventareintrag manuell anlegen Statuscodes
201 Angelegter Inventareintrag
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Inventarnummer bereits vergeben
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"inventoryNumber": "INV-1099",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"building": "Halle A",
"floor": "EG",
"room": "Lager",
"result": "Offen",
"lastInspectionDate": "2026-07-07",
"nextInspectionDate": "2027-07-07",
"customFields": []
} Response Beispiel
{
"id": 1042,
"inventarnummer": "INV-1042",
"arbeitsmitteltyp": "Günzburger 3x10 Sprossen",
"arbeitsmittelart": "Leiter",
"hersteller": "Günzburger",
"gebaeude": "Halle A",
"geschoss": "EG",
"raum": "Lager",
"ergebnis": "Bestanden",
"letztePruefung": "2024-03-15",
"naechstePruefung": "2025-03-15",
"projectNumber": 2024001,
"updatedAt": "2024-03-15T14:22:00Z",
"schutzklasse": "I",
"leitungslaenge": 3.5,
"seriennummer": "SN-00042",
"externalReference": "EXT-REF-042",
"inspectionCount": 3,
"customerId": 7,
"customerName": "Musterfirma GmbH",
"customFields": {}
} GET /inventory/{id} Einzelnen Inventareintrag abrufen Statuscodes
200 Inventareintrag
401 Nicht authentifiziert
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"id": 1042,
"inventarnummer": "INV-1042",
"arbeitsmitteltyp": "Günzburger 3x10 Sprossen",
"arbeitsmittelart": "Leiter",
"hersteller": "Günzburger",
"gebaeude": "Halle A",
"geschoss": "EG",
"raum": "Lager",
"ergebnis": "Bestanden",
"letztePruefung": "2024-03-15",
"naechstePruefung": "2025-03-15",
"projectNumber": 2024001,
"updatedAt": "2024-03-15T14:22:00Z",
"schutzklasse": "I",
"leitungslaenge": 3.5,
"seriennummer": "SN-00042",
"externalReference": "EXT-REF-042",
"inspectionCount": 3,
"customerId": 7,
"customerName": "Musterfirma GmbH",
"customFields": {}
} PUT /inventory/{id} Inventareintrag bearbeiten Statuscodes
200 Aktualisierter Inventareintrag
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"building": "Halle A",
"floor": "EG",
"room": "Lager",
"result": "Bestanden",
"lastInspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"customFields": []
} Response Beispiel
{
"id": 1042,
"inventarnummer": "INV-1042",
"arbeitsmitteltyp": "Günzburger 3x10 Sprossen",
"arbeitsmittelart": "Leiter",
"hersteller": "Günzburger",
"gebaeude": "Halle A",
"geschoss": "EG",
"raum": "Lager",
"ergebnis": "Bestanden",
"letztePruefung": "2024-03-15",
"naechstePruefung": "2025-03-15",
"projectNumber": 2024001,
"updatedAt": "2024-03-15T14:22:00Z",
"schutzklasse": "I",
"leitungslaenge": 3.5,
"seriennummer": "SN-00042",
"externalReference": "EXT-REF-042",
"inspectionCount": 3,
"customerId": 7,
"customerName": "Musterfirma GmbH",
"customFields": {}
} POST /inventory/{id}/unarchive Eintrag aus dem Archiv zurückholen Statuscodes
204 Eintrag entarchiviert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /inventory/{id}/history Änderungshistorie eines Eintrags Statuscodes
200 Liste der Änderungseinträge
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /inventory/filter-options Verfügbare Filterwerte abrufen Statuscodes
200 Filterwerte gruppiert nach Feldname
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"deviceCategory": [
"Leiter",
"Kran",
"Hubarbeitsbühne"
],
"building": [
"Halle A",
"Halle B"
],
"result": [
"Bestanden",
"Nicht bestanden"
]
} GET /inventory/export Inventar exportieren (XLSX oder PDF) Statuscodes
200 Datei-Download
400 Fehler
401 Nicht authentifiziert
422 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /inventory/export/mxp MXP-Prüfliste exportieren Statuscodes
200 MXP-Datei
400 Fehler
401 Nicht authentifiziert
422 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"ids": [
101,
102,
103
]
} GET /inventory/{inventoryItemId}/documents Dokumente eines Inventareintrags abrufen Statuscodes
200 Liste der Dokumente
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /inventory/{inventoryItemId}/documents Dokument hochladen Statuscodes
201 Dokument hochgeladen
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"id": 1,
"inventoryId": 1042,
"fileName": "pruefprotokoll_2024.pdf",
"description": "Prüfprotokoll März 2024",
"category": "Prüfberichte",
"uploadedAt": "2024-03-15T14:00:00Z",
"uploadedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
} DELETE /inventory/{inventoryItemId}/documents/{docId} Dokument löschen Statuscodes
204 Dokument gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /inventory/{inventoryItemId}/hazard Gefährdungsbeurteilungen abrufen Statuscodes
200 Liste der Gefährdungsbeurteilungen
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
[
{
"id": 1,
"inventoryItemId": 1042,
"number": 1,
"date": "2024-03-15",
"description": "Regelmäßige Gefährdungsbeurteilung",
"inspectorUserId": null,
"inspectorName": "Hans Prüfer",
"hazardClass": 2,
"scopeVisualCheck": true,
"scopeElectrical": true,
"scopeMechanical": false,
"scopeFunction": false,
"createdAt": "2024-03-15T10:00:00Z"
}
] POST /inventory/{inventoryItemId}/hazard Gefährdungsbeurteilung anlegen Statuscodes
201 Gefährdungsbeurteilung angelegt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"date": "2024-03-15",
"description": "Regelmäßige Gefährdungsbeurteilung",
"inspectorUserId": null,
"inspectorName": "Hans Prüfer",
"hazardClass": 2,
"scopeVisualCheck": true,
"scopeElectrical": true,
"scopeMechanical": false,
"scopeFunction": false
} Response Beispiel
{
"id": 1,
"inventoryItemId": 1042,
"number": 1,
"date": "2024-03-15",
"description": "Regelmäßige Gefährdungsbeurteilung",
"inspectorUserId": null,
"inspectorName": "Hans Prüfer",
"hazardClass": 2,
"scopeVisualCheck": true,
"scopeElectrical": true,
"scopeMechanical": false,
"scopeFunction": false,
"createdAt": "2024-03-15T10:00:00Z"
} PUT /inventory/{inventoryItemId}/hazard/{hazardId} Gefährdungsbeurteilung bearbeiten Statuscodes
200 Aktualisierte Gefährdungsbeurteilung
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"date": "2024-03-15",
"description": "Regelmäßige Gefährdungsbeurteilung",
"inspectorUserId": null,
"inspectorName": "Hans Prüfer",
"hazardClass": 2,
"scopeVisualCheck": true,
"scopeElectrical": true,
"scopeMechanical": false,
"scopeFunction": false
} Response Beispiel
{
"id": 1,
"inventoryItemId": 1042,
"number": 1,
"date": "2024-03-15",
"description": "Regelmäßige Gefährdungsbeurteilung",
"inspectorUserId": null,
"inspectorName": "Hans Prüfer",
"hazardClass": 2,
"scopeVisualCheck": true,
"scopeElectrical": true,
"scopeMechanical": false,
"scopeFunction": false,
"createdAt": "2024-03-15T10:00:00Z"
} DELETE /inventory/{inventoryItemId}/hazard/{hazardId} Gefährdungsbeurteilung löschen Statuscodes
204 Gefährdungsbeurteilung gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /inventory/{inventoryItemId}/regulations Prüfvorschriften eines Inventareintrags abrufen Statuscodes
200 Liste der zugewiesenen Prüfvorschriften
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
[
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
}
] POST /inventory/{inventoryItemId}/regulations Prüfvorschrift hinzufügen Statuscodes
201 Prüfvorschrift angelegt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "DGUV V3"
} Response Beispiel
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
} GET /inventory/{inventoryItemId}/regulations/catalog Prüfvorschriften-Katalog abrufen Statuscodes
200 Katalogeinträge
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
[
{
"id": 1,
"name": "DGUV V3"
},
{
"id": 2,
"name": "VDE 0701/0702"
}
] POST /inventory/{inventoryItemId}/regulations/swap Reihenfolge zweier Prüfvorschriften tauschen Statuscodes
204 Reihenfolge getauscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"pvId1": 5,
"pvId2": 6
} PUT /inventory/{inventoryItemId}/regulations/{pvId} Prüfvorschrift bearbeiten Statuscodes
200 Aktualisierte Prüfvorschrift
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"isActive": true,
"sortOrder": 2
} Response Beispiel
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
} DELETE /inventory/{inventoryItemId}/regulations/{pvId} Prüfvorschrift löschen Statuscodes
204 Prüfvorschrift gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /inventory/archive/run Überfällige Inventar-Einträge archivieren Statuscodes
200 Laufergebnis
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"mandantenProcessed": 5,
"itemsArchived": 12,
"errors": []
} GET /inventory/assignable-users Zuweisbare Benutzer abrufen Statuscodes
200 Liste der zuweisbaren Benutzer
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Response Beispiel
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Hans Prüfer"
}
] GET /inventory/inspector-users Prüfer-Benutzer abrufen Statuscodes
200 Liste der Prüfer
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
PATCH /inventory/assign-customer Kunden-Zuweisung für mehrere Inventareinträge setzen Statuscodes
204 Zuweisung erfolgreich gesetzt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"inventoryIds": [
101,
102,
103
],
"customerId": 7
} PATCH /inventory/archive Mehrere Inventareinträge archivieren (Bulk) Statuscodes
204 Einträge archiviert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"ids": [
101,
102,
103
]
} PATCH /inventory/unarchive Mehrere Inventareinträge entarchivieren (Bulk) Statuscodes
204 Einträge entarchiviert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"ids": [
101,
102,
103
]
} GET /regulations/catalog Prüfvorschriften-Katalog abrufen (mandantenübergreifend) Statuscodes
200 Katalogeinträge
401 Nicht authentifiziert
Response Beispiel
[
{
"id": 1,
"name": "DGUV V3"
},
{
"id": 2,
"name": "VDE 0701/0702"
}
] Prüfberichte Prüfergebnisse importieren und abrufen (MXP / JSON)
POST /inspection/import/mxp Prüfergebnisse via MXP-Datei importieren Statuscodes
200 Importergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"projectNumber": 2024001,
"importedCount": 42,
"autoCreatedInventoryItems": 3,
"warnings": [
"Inventarnummer 'INV-0099' konnte keinem Eintrag zugeordnet werden."
],
"customerNo": "10042"
} POST /inspection/import/json Prüfergebnisse via JSON importieren Statuscodes
200 Importergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"projectNumber": 2024001,
"fileName": "pruefberichte_2024.json",
"customer": [
{
"customerNo": 10042,
"name": "Musterfirma GmbH",
"street": "Musterstraße",
"houseNumber": "1",
"zipCode": "12345",
"city": "Musterstadt",
"country": "Deutschland"
}
],
"reports": [
{
"reportKey": "RPT-001",
"reportNumber": "24-001",
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"result": "Bestanden",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"inventoryNumber": "INV-1042",
"location": "Halle A",
"inspector": "Hans Prüfer"
}
]
} Response Beispiel
{
"projectNumber": 2024001,
"importedCount": 42,
"autoCreatedInventoryItems": 3,
"warnings": [
"Inventarnummer 'INV-0099' konnte keinem Eintrag zugeordnet werden."
],
"customerNo": "10042"
} GET /inspection/reports Prüfberichte abrufen Statuscodes
200 Liste der Prüfberichte
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /inspection/reports Prüfbericht manuell anlegen Statuscodes
201 Prüfbericht angelegt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
Request Beispiel
{
"inventoryItemId": 1042,
"schutzklasse": "SK_I",
"leitungslaenge": 3.5,
"hatHeizelement": false,
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"pruefartNorm": "VDE0701",
"inspector": "Hans Prüfer",
"inspectorQualification": "VDSI-Fachkraft",
"pruefplaketteFaellig": "2025-03-15",
"visualChecks": [
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden",
"passed": true
}
],
"measurements": [
{
"order": 1,
"measurementType": "Schutzleiterwiderstand",
"unit": "Ω",
"calculatedLimitValue": 0.3,
"measuredValue": 0.12,
"passed": true
}
]
} Response Beispiel
{
"id": 301,
"mandantId": 3,
"projectNumber": 2024001,
"inventoryItemId": 1042,
"reportKey": "RPT-001",
"reportNumber": "24-001",
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"standard": "DGUV V3",
"inspector": "Hans Prüfer",
"result": "Bestanden",
"location": "Halle A",
"department": "Produktion",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"inventoryNumber": "INV-1042",
"customerName": "Musterfirma GmbH",
"importedAt": "2024-03-16T08:00:00Z",
"inspectorQualification": "VDSI-Fachkraft",
"pruefartNorm": "DGUV V3 §5",
"pruefplaketteFaellig": "2025-03-15",
"isFinalized": true,
"finalizedAt": "2024-03-16T09:00:00Z",
"hasPdf": true,
"externalReference": "EXT-RPT-042",
"customFields": {}
} GET /inspection/reports/{id} Einzelnen Prüfbericht abrufen Statuscodes
200 Prüfbericht mit Details (inkl. Prüfschritte und Messwerte)
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"id": 301,
"mandantId": 3,
"projectNumber": 2024001,
"inventoryItemId": 1042,
"reportKey": "RPT-001",
"reportNumber": "24-001",
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"standard": "DGUV V3",
"inspector": "Hans Prüfer",
"result": "Bestanden",
"location": "Halle A",
"department": "Produktion",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"inventoryNumber": "INV-1042",
"customerName": "Musterfirma GmbH",
"importedAt": "2024-03-16T08:00:00Z",
"inspectorQualification": "VDSI-Fachkraft",
"pruefartNorm": "DGUV V3 §5",
"pruefplaketteFaellig": "2025-03-15",
"isFinalized": true,
"finalizedAt": "2024-03-16T09:00:00Z",
"hasPdf": true,
"externalReference": "EXT-RPT-042",
"customFields": {}
} PUT /inspection/reports/{id} Prüfbericht bearbeiten Statuscodes
200 Aktualisierter Prüfbericht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Fehler
Request Beispiel
{
"inventoryItemId": 1042,
"schutzklasse": "SK_I",
"leitungslaenge": 3.5,
"hatHeizelement": false,
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"pruefartNorm": "VDE0701",
"inspector": "Hans Prüfer",
"inspectorQualification": "VDSI-Fachkraft",
"pruefplaketteFaellig": "2025-03-15",
"visualChecks": [
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden",
"passed": true
}
],
"measurements": [
{
"order": 1,
"measurementType": "Schutzleiterwiderstand",
"unit": "Ω",
"calculatedLimitValue": 0.3,
"measuredValue": 0.12,
"passed": true
}
],
"customFields": []
} Response Beispiel
{
"id": 301,
"mandantId": 3,
"projectNumber": 2024001,
"inventoryItemId": 1042,
"reportKey": "RPT-001",
"reportNumber": "24-001",
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"standard": "DGUV V3",
"inspector": "Hans Prüfer",
"result": "Bestanden",
"location": "Halle A",
"department": "Produktion",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"inventoryNumber": "INV-1042",
"customerName": "Musterfirma GmbH",
"importedAt": "2024-03-16T08:00:00Z",
"inspectorQualification": "VDSI-Fachkraft",
"pruefartNorm": "DGUV V3 §5",
"pruefplaketteFaellig": "2025-03-15",
"isFinalized": true,
"finalizedAt": "2024-03-16T09:00:00Z",
"hasPdf": true,
"externalReference": "EXT-RPT-042",
"customFields": {}
} GET /inspection/stats Prüfstatistiken abrufen Statuscodes
200 Zusammenfassung der Prüfergebnisse
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"totalReports": 150,
"passed": 130,
"failed": 8,
"overdueCount": 5,
"dueSoonCount": 12
} POST /inspection/pdf-backup/run Prüfbericht-PDFs beim Speicherprovider sichern Statuscodes
200 Laufergebnis
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"mandantenProcessed": 3,
"filesBackedUp": 47,
"errors": []
} GET /inspection/logs Import-Protokoll für Prüfberichte abrufen Statuscodes
200 Liste der Import-Protokolleinträge
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
GET /inspection/limits Grenzwerte für Prüfmessungen berechnen Statuscodes
200 Berechnete Grenzwerte
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Response Beispiel
{
"schutzleiterwiderstandMax": 0.3,
"isolationswiderstandMin": 1,
"ableitstromMax": 3.5
} DELETE /inspection/project/{projectNumber} Prüfprojekt löschen Statuscodes
204 Projekt gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
GET /inspection/reports/paged Prüfberichte paginiert abrufen Statuscodes
200 Paginierte Prüfberichte
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} GET /inspection/reports/filter-options Verfügbare Filterwerte für Prüfberichte abrufen Statuscodes
200 Filterwerte
401 Nicht authentifiziert
Response Beispiel
{
"projectNumbers": [
2024001,
2024002
],
"results": [
"Bestanden",
"Nicht bestanden"
],
"inspectors": [
"Hans Prüfer"
],
"locations": [
"Halle A"
],
"manufacturers": [
"Günzburger"
]
} GET /inspection/reports/export/excel Prüfberichte als Excel exportieren Statuscodes
200 Excel-Datei
401 Nicht authentifiziert
POST /inspection/reports/{id}/finalize Prüfbericht finalisieren Statuscodes
200 Finalisierter Prüfbericht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Fehler
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
Response Beispiel
{
"id": 301,
"mandantId": 3,
"projectNumber": 2024001,
"inventoryItemId": 1042,
"reportKey": "RPT-001",
"reportNumber": "24-001",
"inspectionDate": "2024-03-15",
"nextInspectionDate": "2025-03-15",
"standard": "DGUV V3",
"inspector": "Hans Prüfer",
"result": "Bestanden",
"location": "Halle A",
"department": "Produktion",
"deviceType": "Günzburger 3x10 Sprossen",
"deviceCategory": "Leiter",
"manufacturer": "Günzburger",
"inventoryNumber": "INV-1042",
"customerName": "Musterfirma GmbH",
"importedAt": "2024-03-16T08:00:00Z",
"inspectorQualification": "VDSI-Fachkraft",
"pruefartNorm": "DGUV V3 §5",
"pruefplaketteFaellig": "2025-03-15",
"isFinalized": true,
"finalizedAt": "2024-03-16T09:00:00Z",
"hasPdf": true,
"externalReference": "EXT-RPT-042",
"customFields": {}
} POST /inspection/reports/{id}/regenerate-pdf PDF eines Prüfberichts neu erzeugen Statuscodes
204 PDF neu erzeugt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Fehler
GET /inspection/reports/{id}/pdf PDF eines Prüfberichts herunterladen Statuscodes
200 PDF-Datei
401 Nicht authentifiziert
404 Fehler
409 Fehler
Import Inventardaten per XLS-Datei oder JSON importieren
POST /import/upload Inventar per XLS/XLSX-Datei importieren Statuscodes
200 Importergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"importedCount": 98,
"skippedCount": 2,
"errors": [
"Zeile 5: Ungültiges Datumsformat in 'letztePruefung'."
],
"folderPath": "/imports/2024-03-15",
"customerNo": "10042"
} POST /import/upload-from-provider Inventar aus einem verbundenen Storage Provider importieren Statuscodes
200 Importergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Fehler
Request Beispiel
{
"provider": "dropbox",
"sourcePath": "Exports/2026-Inventar.xlsx"
} Response Beispiel
{
"importedCount": 98,
"skippedCount": 2,
"errors": [
"Zeile 5: Ungültiges Datumsformat in 'letztePruefung'."
],
"folderPath": "/imports/2024-03-15",
"customerNo": "10042"
} POST /import/json Inventar per JSON importieren Statuscodes
200 Importergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"fileName": "inventar_export_2024.json",
"customer": [
{
"customerNo": 10042,
"name": "Musterfirma GmbH",
"street": "Musterstraße",
"houseNumber": "1",
"zipCode": "12345",
"city": "Musterstadt",
"country": "Deutschland"
}
],
"rows": [
{
"inventarnummer": "INV-1042",
"arbeitsmitteltyp": "Günzburger 3x10 Sprossen",
"arbeitsmittelart": "Leiter",
"hersteller": "Günzburger",
"gebaeude": "Halle A",
"geschoss": "EG",
"raum": "Lager",
"ergebnis": "Bestanden",
"letztePruefung": "2024-03-15",
"naechstePruefung": "2025-03-15",
"projectNumber": 2024001
}
]
} Response Beispiel
{
"importedCount": 98,
"skippedCount": 2,
"errors": [
"Zeile 5: Ungültiges Datumsformat in 'letztePruefung'."
],
"folderPath": "/imports/2024-03-15",
"customerNo": "10042"
} GET /import/logs Import-Protokoll abrufen Statuscodes
200 Liste der Import-Protokolleinträge
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /import/config Import-Konfiguration abrufen Statuscodes
200 Import-Konfiguration
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Response Beispiel
{
"basePath": "/imports/mandant_3",
"basePathExists": true
} DELETE /import/{id} Import-Eintrag löschen Statuscodes
204 Import gelöscht
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Zu den Inventareinträgen dieses Imports gehören noch Prüfberichte; Löschen erfordert Bestätigung.
Dashboard Statistiken für die Startseite
GET /dashboard/stats Dashboard-Statistiken abrufen Statuscodes
200 Statistiken
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"totalItems": 320,
"overdueCount": 5,
"dueSoonCount": 18,
"passed": 280,
"failed": 8,
"openCount": 32,
"defectRateByProject": [
{
"projectNumber": "42",
"total": 20,
"defects": 5,
"defectRatePercent": 25,
"customerName": "Musterfirma GmbH"
}
]
} GET /dashboard/failure-rate Fehlerquote (bestanden/fehlerhaft) abrufen, optional gefiltert Statuscodes
200 Bestanden/Fehlerhaft-Zähler
401 Nicht authentifiziert
Response Beispiel
{
"passed": 7,
"failed": 3
} GET /dashboard/failure-rate/filters Filteroptionen (Projekte/Kunden) für das Fehlerquote-Widget abrufen Statuscodes
200 Verfügbare Filteroptionen
401 Nicht authentifiziert
Response Beispiel
{
"projectNumbers": [
"100",
"200"
],
"customers": [
{
"id": 12,
"name": "Musterfirma GmbH"
}
]
} GET /dashboard/widgets Widget-Katalog für ein System abrufen Statuscodes
200 Liste der für das System freigegebenen Widgets
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
GET /dashboard/layout Benutzerdefiniertes Dashboard-Layout laden Statuscodes
200 Liste der Widget-Positionen
401 Nicht authentifiziert
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
PUT /dashboard/layout Benutzerdefiniertes Dashboard-Layout speichern Statuscodes
204 Layout erfolgreich gespeichert
401 Nicht authentifiziert
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
Einstellungen Mandantenspezifische Einstellungen und Branding
GET /settings/branding Branding-Einstellungen abrufen (öffentlich) Statuscodes
200 Branding-Daten
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"companyName": "Musterfirma GmbH",
"logoBase64": null,
"primaryColor": "#0891b2",
"accentColor": "#7c3aed",
"dueSoonThresholdDays": 90,
"addressCompany": "Musterfirma GmbH",
"statusOkColor": "#059669",
"statusWarningColor": "#d97706",
"statusErrorColor": "#dc2626",
"roleSuperAdminColor": "#92400e",
"roleAdminColor": "#1d4ed8",
"roleEditorColor": "#6d28d9",
"roleViewerColor": "#374151",
"roleApiClientColor": "#065f46"
} GET /settings Alle Mandanten-Einstellungen abrufen Statuscodes
200 Einstellungen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"companyName": "Musterfirma GmbH",
"logoBase64": null,
"primaryColor": "#0891b2",
"accentColor": "#7c3aed",
"defaultInspectionIntervalDays": 365,
"dueSoonThresholdDays": 90,
"notificationEmail": "benachrichtigung@musterfirma.de",
"addressCompany": "Musterfirma GmbH",
"addressStreet": "Musterstraße 1",
"addressZip": "12345",
"addressCity": "Musterstadt",
"addressCountry": "Deutschland",
"inventoryArchiveThresholdYears": 5,
"inventoryAutoArchiveEnabled": false,
"pruefberichtAutoBackupEnabled": false,
"statusOkColor": "#059669",
"statusWarningColor": "#d97706",
"statusErrorColor": "#dc2626",
"roleSuperAdminColor": "#92400e",
"roleAdminColor": "#1d4ed8",
"roleEditorColor": "#6d28d9",
"roleViewerColor": "#374151",
"roleApiClientColor": "#065f46"
} PUT /settings Mandanten-Einstellungen speichern Statuscodes
204 Erfolgreich gespeichert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"companyName": "Musterfirma GmbH",
"logoBase64": null,
"primaryColor": "#0891b2",
"accentColor": "#7c3aed",
"defaultInspectionIntervalDays": 365,
"dueSoonThresholdDays": 90,
"notificationEmail": "benachrichtigung@musterfirma.de",
"addressCompany": "Musterfirma GmbH",
"addressStreet": "Musterstraße 1",
"addressZip": "12345",
"addressCity": "Musterstadt",
"addressCountry": "Deutschland",
"inventoryArchiveThresholdYears": 5,
"inventoryAutoArchiveEnabled": false,
"pruefberichtAutoBackupEnabled": false,
"statusOkColor": "#059669",
"statusWarningColor": "#d97706",
"statusErrorColor": "#dc2626",
"roleSuperAdminColor": "#92400e",
"roleAdminColor": "#1d4ed8",
"roleEditorColor": "#6d28d9",
"roleViewerColor": "#374151",
"roleApiClientColor": "#065f46"
} Admin – Benutzer Benutzerverwaltung innerhalb eines Mandanten (Rolle Admin)
GET /admin/users Benutzerliste abrufen Statuscodes
200 Paginierte Benutzerliste
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /admin/users Neuen Benutzer anlegen Statuscodes
201 Benutzer angelegt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 E-Mail-Adresse wird bereits verwendet
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "Lena Beispiel",
"email": "lena@musterfirma.de",
"password": "Passwort123!",
"role": "Editor"
} Response Beispiel
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Max Mustermann",
"email": "max@musterfirma.de",
"role": "Editor",
"isLockedOut": false,
"emailConfirmed": true,
"emailConfirmationAttempts": 1,
"emailConfirmationLastSentAt": "2024-01-01T10:00:00Z",
"emailConfirmationLastError": null,
"mandantId": 3,
"mandantName": "Musterfirma GmbH"
} PUT /admin/users/{id} Benutzer bearbeiten Statuscodes
204 Erfolgreich aktualisiert
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "Lena Musterfrau",
"email": "lena.neu@musterfirma.de",
"role": "Admin",
"mandantId": null
} POST /admin/users/{id}/activate Benutzer aktivieren Statuscodes
204 Benutzer aktiviert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /admin/users/{id}/deactivate Benutzer deaktivieren Statuscodes
204 Benutzer deaktiviert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /admin/invites Self-Service-Einladung erstellen Statuscodes
201 Einladung erstellt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Ungültige Rolle(n) oder Lizenz-Benutzerlimit erreicht
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"email": "employee@firma.de",
"roles": [
"Editor"
]
} Response Beispiel
{
"id": 12,
"email": "employee@firma.de",
"roles": [
"Editor"
],
"createdAt": "2026-07-08T10:00:00Z",
"expiresAt": "2026-07-15T10:00:00Z"
} GET /admin/invites Offene Einladungen auflisten Statuscodes
200 Liste offener Einladungen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
DELETE /admin/invites/{id} Einladung widerrufen Statuscodes
204 Einladung widerrufen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /admin/users/{id}/invitation/resend Einladungs-E-Mail erneut senden Statuscodes
204 E-Mail erneut gesendet
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Admin – API-Keys Verwaltung von API-Keys (Rolle Admin)
GET /admin/apikeys API-Keys abrufen Statuscodes
200 Paginierte API-Key-Liste
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /admin/apikeys Neuen API-Key erstellen Statuscodes
201 API-Key erstellt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "Prüfgerät Halle A"
} Response Beispiel
{
"id": 12,
"name": "Prüfgerät Halle A",
"plainKey": "rw_a1b2c3d4e5f6g7h8i9j0klmnopqrstuvwxyz"
} DELETE /admin/apikeys/{id} API-Key deaktivieren oder löschen Statuscodes
204 API-Key deaktiviert oder (falls bereits inaktiv) endgültig gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Admin – Visual-Check-Vorlagen Verwaltung der Sichtprüfungs-Vorlagen (Rolle Admin)
GET /admin/visualcheck/templates Sichtprüfungs-Vorlage abrufen Statuscodes
200 Liste der Sichtprüfungsschritte
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Response Beispiel
[
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden",
"source": "global"
}
] PUT /admin/visualcheck/templates Sichtprüfungs-Vorlage überschreiben Statuscodes
200 Aktualisierte Vorlage
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
[
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden"
}
] DELETE /admin/visualcheck/templates Mandanten-Überschreibung der Sichtprüfungs-Vorlage löschen Statuscodes
200 Gelöschte Einträge
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Admin – Benachrichtigungskonfiguration Benachrichtigungsschwellwerte und E-Mail-Adressen konfigurieren (Rolle Admin)
GET /admin/config/notifications Benachrichtigungskonfiguration abrufen Statuscodes
200 Benachrichtigungskonfiguration
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Response Beispiel
{
"thresholdDays": [
30,
60,
90
],
"notifyEmails": [
"admin@musterfirma.de"
],
"webhookUrl": null,
"hasWebhookAuth": false
} PUT /admin/config/notifications Benachrichtigungskonfiguration speichern Statuscodes
200 Aktualisierte Konfiguration
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"thresholdDays": [
30,
60,
90
],
"notifyEmails": [
"admin@musterfirma.de"
],
"webhookUrl": null,
"webhookAuthHeader": null
} Response Beispiel
{
"thresholdDays": [
30,
60,
90
],
"notifyEmails": [
"admin@musterfirma.de"
],
"webhookUrl": null,
"hasWebhookAuth": false
} Benachrichtigungen Benachrichtigungsläufe anstoßen (E-Mail / Webhook) – für Cron-Jobs
POST /notifications/run Benachrichtigungslauf anstoßen Statuscodes
200 Laufergebnis
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"mandantenProcessed": 5,
"emailsSent": 3,
"webhooksFired": 1,
"errors": []
} Kunden Kundenverwaltung (Zuordnung von Inventareinträgen zu Kunden)
GET /customers Kundenliste abrufen Statuscodes
200 Liste aller Kunden
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /customers Neuen Kunden anlegen Statuscodes
201 Kunde angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "Musterfirma GmbH",
"street": "Musterstraße 1",
"postalCode": "12345",
"city": "Musterstadt",
"externalReference": "CRM-007",
"customFields": []
} Response Beispiel
{
"id": 7,
"mandantId": 3,
"name": "Musterfirma GmbH",
"street": "Musterstraße 1",
"postalCode": "12345",
"city": "Musterstadt",
"inventoryCount": 42,
"createdAt": "2024-01-10T10:00:00Z",
"externalReference": "CRM-007",
"customFields": {}
} PUT /customers/{id} Kunden bearbeiten Statuscodes
200 Aktualisierter Kunde
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"name": "Musterfirma GmbH",
"street": "Musterstraße 1",
"postalCode": "12345",
"city": "Musterstadt",
"externalReference": "CRM-007",
"customFields": []
} Response Beispiel
{
"id": 7,
"mandantId": 3,
"name": "Musterfirma GmbH",
"street": "Musterstraße 1",
"postalCode": "12345",
"city": "Musterstadt",
"inventoryCount": 42,
"createdAt": "2024-01-10T10:00:00Z",
"externalReference": "CRM-007",
"customFields": {}
} DELETE /customers/{id} Kunden löschen Statuscodes
204 Kunde gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Kunde hat noch zugeordnete Inventareinträge
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /customers/export/excel Kunden als Excel exportieren Statuscodes
200 Excel-Datei
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"customerIds": [
7,
12,
19
]
} Produkte Produktverwaltung (revuwork.suite, ab v0.7.0) — übergeordnete Warengruppen/Kategorien für den Artikelstamm
GET /products Produktliste (Warengruppen) abrufen Statuscodes
200 Liste aller Produkte
401 Nicht authentifiziert
POST /products Neues Produkt anlegen Statuscodes
201 Produkt angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"productNo": "P-100",
"name": "Schutzausrüstung",
"description": null,
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"productNo": "P-100",
"name": "Schutzausrüstung",
"description": null,
"isArchived": false,
"archivedAt": null,
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"customFields": {}
} GET /products/search Produkte paginiert suchen/sortieren/filtern Statuscodes
200 Paginierte Produktliste
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} PUT /products/{id} Produkt bearbeiten Statuscodes
200 Aktualisiertes Produkt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Request Beispiel
{
"productNo": "P-100",
"name": "Schutzausrüstung",
"description": null,
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"productNo": "P-100",
"name": "Schutzausrüstung",
"description": null,
"isArchived": false,
"archivedAt": null,
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"customFields": {}
} DELETE /products/{id} Produkt löschen Statuscodes
204 Produkt gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
PATCH /products/{id}/archive Produkt archivieren Statuscodes
204 Produkt archiviert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Artikel Artikelverwaltung (revuwork.suite, ab v0.7.0) — konkrete verkaufbare Positionen je Produkt, Grundlage für künftige Auftragspositionen
GET /articles Artikel eines Produkts abrufen Statuscodes
200 Liste der Artikel des Produkts
401 Nicht authentifiziert
POST /articles Neuen Artikel anlegen Statuscodes
201 Artikel angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Referenziertes Produkt nicht gefunden oder gehört zu einem anderen Mandanten
Request Beispiel
{
"productId": 1,
"articleNo": "A-100",
"name": "Erstprüfung ortsveränderliches Gerät",
"description": null,
"unit": "Stück",
"defaultUnitPrice": 49.9,
"customFields": []
} Response Beispiel
{
"id": 10,
"tenantId": 3,
"productId": 1,
"productName": "Ortsveränderliches Gerät",
"articleNo": "A-100",
"name": "Erstprüfung ortsveränderliches Gerät",
"description": null,
"unit": "Stück",
"defaultUnitPrice": 49.9,
"isArchived": false,
"archivedAt": null,
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"customFields": {}
} GET /articles/search Artikel paginiert suchen/sortieren/filtern Statuscodes
200 Paginierte Artikelliste
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} PUT /articles/{id} Artikel bearbeiten Statuscodes
200 Aktualisierter Artikel
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Request Beispiel
{
"productId": 1,
"articleNo": "A-100",
"name": "Erstprüfung ortsveränderliches Gerät",
"description": null,
"unit": "Stück",
"defaultUnitPrice": 49.9,
"customFields": []
} Response Beispiel
{
"id": 10,
"tenantId": 3,
"productId": 1,
"productName": "Ortsveränderliches Gerät",
"articleNo": "A-100",
"name": "Erstprüfung ortsveränderliches Gerät",
"description": null,
"unit": "Stück",
"defaultUnitPrice": 49.9,
"isArchived": false,
"archivedAt": null,
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"customFields": {}
} DELETE /articles/{id} Artikel löschen Statuscodes
204 Artikel gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
PATCH /articles/{id}/archive Artikel archivieren Statuscodes
204 Artikel archiviert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Aufträge Auftragsverwaltung (revuwork.suite, ab v0.8.0) — Status-Workflow Draft → Confirmed → Fulfilled / Cancelled, Positionen wahlweise mit Artikelbezug (Snapshot) oder als Freitext
GET /sales-orders Aufträge paginiert suchen/sortieren/filtern Statuscodes
200 Paginierte Auftragsliste
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /sales-orders Neuen Auftrag anlegen (Status Draft) Statuscodes
201 Auftrag angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Referenzierter Kunde/Kontakt/Artikel nicht gefunden oder gehört zu einem anderen Mandanten
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} GET /sales-orders/open-count Anzahl offener Aufträge des Mandanten Statuscodes
200 Offene-Aufträge-Aggregat
401 Nicht authentifiziert
Response Beispiel
{
"openCount": 3
} GET /sales-orders/{id} Auftrag inkl. Positionen abrufen Statuscodes
200 Auftrag
401 Nicht authentifiziert
404 Fehler
Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} PUT /sales-orders/{id} Auftrag bearbeiten (nur Status Draft) Statuscodes
200 Aktualisierter Auftrag
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Auftrag ist nicht im Status Draft
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} DELETE /sales-orders/{id} Auftrag löschen (nur Status Draft) Statuscodes
204 Auftrag gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Auftrag ist nicht im Status Draft
POST /sales-orders/{id}/confirm Auftrag bestätigen (Draft → Confirmed) Statuscodes
200 Bestätigter Auftrag
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Auftrag ist nicht im Status Draft
Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} POST /sales-orders/{id}/fulfill Auftrag als erfüllt markieren (Confirmed → Fulfilled) Statuscodes
200 Erfüllter Auftrag
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Auftrag ist nicht im Status Confirmed
Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} POST /sales-orders/{id}/cancel Auftrag stornieren (Draft/Confirmed → Cancelled) Statuscodes
200 Stornierter Auftrag
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Auftrag ist bereits Fulfilled oder Cancelled
Request Beispiel
{
"reason": "Kunde hat storniert"
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"orderNo": "A-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"isTemplate": false,
"orderDate": "2026-07-26",
"requestedDeliveryDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-26T10:00:00Z",
"updatedAt": "2026-07-26T10:00:00Z",
"confirmedAt": null,
"fulfilledAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} Angebote Angebotsverwaltung (revuwork.suite, ab v0.13.0) — Status-Workflow Draft → Sent → Accepted / Rejected, Accepted → Converted. Angebote werden per PDF ausgegeben und können per E-Mail versendet sowie bei Annahme in einen Auftrag umgewandelt werden.
GET /sales-quotes Angebote paginiert suchen/sortieren/filtern Statuscodes
200 Paginierte Angebotsliste
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /sales-quotes Neues Angebot anlegen (Status Draft) Statuscodes
201 Angebot angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Referenzierter Kunde/Kontakt/Artikel nicht gefunden oder gehört zu einem anderen Mandanten
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} GET /sales-quotes/{id} Angebot inkl. Positionen abrufen Statuscodes
200 Angebot
401 Nicht authentifiziert
404 Fehler
Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} PUT /sales-quotes/{id} Angebot bearbeiten (nur Status Draft) Statuscodes
200 Aktualisiertes Angebot
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Draft
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} DELETE /sales-quotes/{id} Angebot löschen (nur Status Draft) Statuscodes
204 Angebot gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Draft
POST /sales-quotes/{id}/send Angebot per E-Mail versenden (Draft → Sent) Statuscodes
200 Versendetes Angebot
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Draft, oder es ist kein Postfach verbunden
Request Beispiel
{
"toEmail": "kunde@example.com",
"mailboxConnectionId": null
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} POST /sales-quotes/{id}/accept Angebot als angenommen markieren (Sent → Accepted) Statuscodes
200 Angenommenes Angebot
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Sent
Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} POST /sales-quotes/{id}/reject Angebot ablehnen (Sent → Rejected) Statuscodes
200 Abgelehntes Angebot
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Sent
Request Beispiel
{
"reason": "Kein Bedarf"
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} POST /sales-quotes/{id}/convert-to-order Angenommenes Angebot in einen Auftrag umwandeln (Accepted → Converted) Statuscodes
200 Umgewandeltes Angebot (inkl. convertedToSalesOrderId)
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Angebot ist nicht im Status Accepted
Response Beispiel
{
"id": 1,
"tenantId": 3,
"quoteNo": "AN-2026-000001",
"customerId": 7,
"contactId": null,
"status": "Draft",
"quoteDate": "2026-07-27",
"validUntil": "2026-08-27",
"title": null,
"notes": null,
"currency": "EUR",
"hasPdf": false,
"convertedToSalesOrderId": null,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-27T10:00:00Z",
"updatedAt": "2026-07-27T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"acceptedAt": null,
"rejectedAt": null,
"rejectedReason": null,
"convertedAt": null,
"lines": [],
"subtotal": 0,
"customFields": {}
} GET /sales-quotes/{id}/pdf Angebots-PDF herunterladen Statuscodes
200 PDF-Datei
401 Nicht authentifiziert
404 Fehler
409 PDF wurde noch nicht erzeugt
POST /sales-quotes/{id}/regenerate-pdf Angebots-PDF neu erzeugen Statuscodes
204 PDF wurde neu erzeugt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Rechnungen Rechnungsverwaltung (revuwork.suite, ab Phase 3) — Status-Workflow Draft → Sent → Paid / Overdue / Cancelled. Die Rechnungsnummer wird erst beim Versand vergeben (lückenlose Nummernkreise), Belege sind danach unveränderlich; ein Storno erzeugt eine Gutschrift als eigenen Beleg mit negierten Positionen. Erfordert das Lizenz-Feature `Invoicing`.
GET /invoices Rechnungen paginiert suchen/sortieren/filtern Statuscodes
200 Paginierte Rechnungsliste
401 Nicht authentifiziert
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} POST /invoices Neue Rechnung anlegen (Status Draft) Statuscodes
201 Rechnung angelegt
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Referenzierter Kunde/Kontakt/Artikel/Auftrag nicht gefunden oder gehört zu einem anderen Mandanten
409 Der referenzierte Auftrag ist nicht im Status Fulfilled
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"invoiceDate": "2026-07-28",
"dueDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} GET /invoices/open-total Summe der offenen Posten des Mandanten Statuscodes
200 Offene-Posten-Aggregat
401 Nicht authentifiziert
Response Beispiel
{
"openAmount": 1487.5,
"openCount": 3
} GET /invoices/{id} Rechnung inkl. Positionen abrufen Statuscodes
200 Rechnung
401 Nicht authentifiziert
404 Fehler
Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} PUT /invoices/{id} Rechnung bearbeiten (nur Status Draft) Statuscodes
200 Aktualisierte Rechnung
400 Validierungsfehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Rechnung ist nicht im Status Draft
422 Validierungsfehler
Request Beispiel
{
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"invoiceDate": "2026-07-28",
"dueDate": null,
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"lines": [
{
"articleId": 10,
"description": "Erstprüfung ortsveränderliches Gerät",
"quantity": 2,
"unit": "Stück",
"unitPrice": 49.9
}
],
"customFields": []
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} DELETE /invoices/{id} Rechnung löschen (nur Status Draft) Statuscodes
204 Rechnung gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Rechnung ist nicht im Status Draft
POST /invoices/{id}/send Rechnung ausstellen und per E-Mail versenden (Draft → Sent) Statuscodes
200 Versendete Rechnung (inkl. vergebener invoiceNo)
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Rechnung ist nicht im Status Draft, oder es ist kein Postfach verbunden
Request Beispiel
{
"toEmail": "kunde@example.com",
"mailboxConnectionId": null
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} POST /invoices/{id}/mark-paid Rechnung als bezahlt markieren (Sent/Overdue → Paid) Statuscodes
200 Bezahlte Rechnung
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Rechnung ist nicht im Status Sent oder Overdue
Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} POST /invoices/{id}/cancel Rechnung stornieren und Gutschrift erzeugen (Sent/Overdue → Cancelled) Statuscodes
200 Stornierte Originalrechnung
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Rechnung ist nicht im Status Sent oder Overdue
422 Validierungsfehler
Request Beispiel
{
"reason": "Falscher Rechnungsempfänger"
} Response Beispiel
{
"id": 1,
"tenantId": 3,
"invoiceNo": null,
"type": "Invoice",
"status": "Draft",
"customerId": 7,
"contactId": null,
"sourceSalesOrderId": null,
"sourceInvoiceId": null,
"invoiceDate": "2026-07-28",
"dueDate": "2026-08-11",
"title": null,
"notes": null,
"currency": "EUR",
"vatRate": 19,
"subtotal": 99.8,
"vatAmount": 18.96,
"grossTotal": 118.76,
"hasPdf": false,
"createdByUserId": "a1b2c3d4",
"createdAt": "2026-07-28T10:00:00Z",
"updatedAt": "2026-07-28T10:00:00Z",
"sentAt": null,
"sentToEmail": null,
"paidAt": null,
"cancelledAt": null,
"cancelledReason": null,
"lines": [],
"customFields": {}
} GET /invoices/{id}/pdf Beleg-PDF (Rechnung oder Gutschrift) herunterladen Statuscodes
200 PDF-Datei
401 Nicht authentifiziert
404 Fehler
409 PDF wurde noch nicht erzeugt (Rechnung noch im Status Draft)
Mailbox-Verbindungen Office365-Postfach-Verbindungen je Mandant (revuwork.suite, ab v0.13.0) — OAuth2 gegen Microsoft Graph (Mail.Send), genutzt zum Versand von Angeboten im Namen des Mandanten
GET /admin/mailbox-connections Verbundene Office365-Postfächer des Mandanten auflisten Statuscodes
200 Liste der Postfach-Verbindungen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
GET /admin/mailbox-connections/connect OAuth2-Flow zum Verbinden eines Office365-Postfachs starten Statuscodes
302 Redirect zur Microsoft-Authorize-URL
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
GET /admin/mailbox-connections/callback OAuth2-Callback von Microsoft Statuscodes
302 Redirect ins Frontend
PATCH /admin/mailbox-connections/{id} Postfach-Verbindung ändern (Anzeigename, aktiv, Standard) Statuscodes
204 Postfach-Verbindung aktualisiert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Request Beispiel
{
"isDefault": true
} DELETE /admin/mailbox-connections/{id} Postfach-Verbindung trennen Statuscodes
204 Postfach-Verbindung getrennt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
POST /admin/mailbox-connections/{id}/test Testmail über die Postfach-Verbindung senden Statuscodes
200 Testergebnis
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Response Beispiel
{
"success": true,
"error": null
} Custom Fields Benutzerdefinierte Felder (revuwork.suite) — mandantenspezifische Feld-Definitionen für Customer/Contact, verwaltet über die Suite-Administration "Entitäten" (Rolle Admin)
GET /custom-field-definitions/entity-types Custom-Field-fähige Entitäten auflisten Statuscodes
200 Liste der Entitäten
401 Nicht authentifiziert
GET /custom-field-definitions/system-fields Eingebaute Standardfelder einer Entität abrufen Statuscodes
200 Liste der Standardfelder
401 Nicht authentifiziert
GET /custom-field-definitions Feld-Definitionen einer Entität abrufen Statuscodes
200 Liste der Feld-Definitionen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
POST /custom-field-definitions Neue Feld-Definition anlegen Statuscodes
201 Feld-Definition angelegt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
409 Schlüssel existiert für diese Entität bereits
422 Validierungsfehler
Request Beispiel
{
"entityType": "Contact",
"key": "kundenkategorie",
"label": "Kundenkategorie",
"fieldType": "DropdownSingle",
"options": [
"Premium",
"Standard"
],
"isRequired": false,
"sortOrder": 0
} Response Beispiel
{
"id": 3,
"entityType": "Contact",
"key": "kundenkategorie",
"label": "Kundenkategorie",
"fieldType": "DropdownSingle",
"options": [
"Premium",
"Standard"
],
"referenceEntityType": null,
"isRequired": false,
"sortOrder": 0,
"isArchived": false,
"hasValues": true,
"createdAt": "2026-07-25T10:00:00Z",
"updatedAt": "2026-07-25T10:00:00Z"
} PUT /custom-field-definitions/{id} Feld-Definition bearbeiten Statuscodes
200 Aktualisierte Feld-Definition
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
409 Feldtyp ist eingefroren (bereits Werte gespeichert) oder Schlüssel-Konflikt
422 Validierungsfehler
Request Beispiel
{
"entityType": "Contact",
"key": "kundenkategorie",
"label": "Kundenkategorie",
"fieldType": "DropdownSingle",
"options": [
"Premium",
"Standard"
],
"isRequired": false,
"sortOrder": 0
} Response Beispiel
{
"id": 3,
"entityType": "Contact",
"key": "kundenkategorie",
"label": "Kundenkategorie",
"fieldType": "DropdownSingle",
"options": [
"Premium",
"Standard"
],
"referenceEntityType": null,
"isRequired": false,
"sortOrder": 0,
"isArchived": false,
"hasValues": true,
"createdAt": "2026-07-25T10:00:00Z",
"updatedAt": "2026-07-25T10:00:00Z"
} PATCH /custom-field-definitions/{id}/archive Feld-Definition archivieren Statuscodes
204 Feld-Definition archiviert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
PUT /custom-field-definitions/reorder Reihenfolge der Feld-Definitionen einer Entität ändern Statuscodes
204 Reihenfolge gespeichert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Request Beispiel
{
"entityType": "Contact",
"entries": [
{
"id": 3,
"sortOrder": 0
},
{
"id": 5,
"sortOrder": 1
}
]
} PDF Templates Mandantenspezifisch anpassbare PDF-Layouts für Prüfberichte, Angebote und Inventarlisten (ab v0.60.0). Ist ein Layout als Standard markiert, nutzen PdfReportService/SalesQuotePdfService/ InventoryExportService es automatisch (ab v0.62.0, siehe Issue #169) — ohne Standard-Layout bleibt das bisherige interne Layout als Fallback erhalten. Rolle Admin/SuperAdmin.
GET /pdf-templates PDF-Templates eines Report-Typs auflisten Statuscodes
200 Liste der PDF-Templates
400 Fehler
401 Nicht authentifiziert
422 Validierungsfehler
POST /pdf-templates Neues PDF-Template anlegen Statuscodes
201 PDF-Template angelegt
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Validierungsfehler
GET /pdf-templates/variables/{reportType} Verfügbare Variablen eines Report-Typs abrufen Statuscodes
200 Liste der verfügbaren Variablen
401 Nicht authentifiziert
422 Validierungsfehler
GET /pdf-templates/{id} PDF-Template abrufen Statuscodes
200 PDF-Template
400 Fehler
401 Nicht authentifiziert
404 Fehler
PUT /pdf-templates/{id} PDF-Template bearbeiten Statuscodes
200 Aktualisiertes PDF-Template
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
422 Validierungsfehler
DELETE /pdf-templates/{id} PDF-Template löschen Statuscodes
204 PDF-Template gelöscht
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
GET /pdf-templates/{id}/preview PDF-Template mit Beispieldaten rendern Statuscodes
200 Gerendertes PDF
400 Fehler
401 Nicht authentifiziert
404 Fehler
Lizenz Lizenzstatus des eigenen Mandanten (Rolle Admin)
GET /admin/license Lizenzstatus abrufen Statuscodes
200 Lizenzstatus
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"status": "Active",
"isInGrace": false,
"graceDaysRemaining": null,
"validFrom": "2024-01-01",
"validUntil": "2024-12-31",
"graceDays": 14,
"notes": null,
"isTrial": false,
"templateName": "Pro",
"price": 299,
"inventoryItemOveragePrice": 0.03,
"inspectionReportOveragePrice": 0.2,
"userOveragePrice": 3.5,
"addinOveragePrice": 40,
"apiRequestOveragePrice": 0.0015,
"features": {
"mxpExport": true,
"pdfExport": true,
"inspections": true,
"import": true,
"externalIntegration": false,
"addins": []
},
"limits": {
"maxInventoryItems": 500,
"currentInventoryItems": 320,
"inventoryItemsWarning": false,
"maxUsers": 10,
"currentUsers": 7,
"usersWarning": false,
"maxInspectionReports": 125000,
"currentInspectionReports": 4200,
"inspectionReportsWarning": false,
"maxAddins": 1,
"currentAddins": 0,
"addinsWarning": false,
"maxApiRequestsPerMonth": 5000,
"currentApiRequests": 120,
"apiRequestsWarning": false
}
} GET /admin/licenses Lizenzstatus aller Produkte abrufen (vereinheitlicht) Statuscodes
200 Lizenzstatus je Produkt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
GET /admin/licenses/budgets Selbstservice-Budgets abrufen (revuwork.inventory) Statuscodes
200 Budgets je budgetierbarer Kontingent-Art
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
PUT /admin/licenses/budgets/{limitKind} Budget einer Kontingent-Art setzen (Upsert) Statuscodes
204 Budget gespeichert
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Validierungsfehler (z.B. negativer Betrag oder nicht budgetierbare Kontingent-Art)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"maxOverageQuantity": 10000,
"stopUsageWhenReached": true,
"alertsEnabled": true
} Audit Audit-Log für Änderungen (Rolle Admin/SuperAdmin)
GET /audit Audit-Log abrufen Statuscodes
200 Paginiertes Audit-Log
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Admin – Webhooks Webhook-Konfiguration (Rolle Admin)
GET /admin/webhooks Webhook-Konfigurationen abrufen Statuscodes
200 Liste der Webhook-Konfigurationen
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
PUT /admin/webhooks/{eventType} Webhook anlegen oder aktualisieren Statuscodes
200 Webhook gespeichert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"url": "https://example.com/webhook",
"headers": [
{
"key": "Authorization",
"value": "Bearer mytoken"
}
]
} Response Beispiel
{
"eventType": "inspection.completed",
"url": "https://example.com/webhook",
"headers": [],
"hasAuthHeader": false
} DELETE /admin/webhooks/{eventType} Webhook löschen Statuscodes
204 Webhook gelöscht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
POST /admin/webhooks/{eventType}/test Webhook-Test auslösen Statuscodes
200 Testergebnis
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"success": true,
"statusCode": 200,
"errorMessage": null
} Admin – Navigation & Rollen Rollenzuordnung pro Admin-Navigationseintrag der Administration-Übersichtsseite (ab v0.69.1, Issue #81) — pro Mandant zur Laufzeit editierbar. Lesen für alle authentifizierten Nutzer (gefiltert auf die eigene Rolle), Schreiben nur Rolle SuperAdmin.
GET /admin-nav-roles Sichtbare Admin-Navigationseinträge der eigenen Rolle abrufen Statuscodes
200 Sichtbare Item-Keys
400 Fehler
401 Nicht authentifiziert
PUT /admin-nav-roles Rollenzuordnung aller Admin-Navigationseinträge ersetzen Statuscodes
204 Rollenzuordnung gespeichert
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
422 Validierungsfehler
GET /admin-nav-roles/all Ungefilterte Rollenzuordnung aller Admin-Navigationseinträge abrufen Statuscodes
200 Rollenzuordnung aller Item-Keys
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
Support Support-Tickets und Nachrichten
GET /support/tickets Support-Tickets abrufen Statuscodes
200 Paginierte Ticket-Liste
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Bug",
"status": "Open",
"title": "Fehler beim Excel-Export",
"createdByName": "Max Mustermann",
"createdAt": "2024-03-15T10:00:00Z",
"updatedAt": "2024-03-15T10:00:00Z",
"messageCount": 2
}
],
"totalCount": 1,
"page": 1,
"pageSize": 25,
"totalPages": 1
} POST /support/tickets Support-Ticket erstellen Statuscodes
201 Ticket erstellt
400 Validierungsfehler
401 Nicht authentifiziert
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"type": "Bug",
"title": "Fehler beim Excel-Export",
"description": "Beim Export der Inventarliste wird ein leeres Dokument erzeugt.",
"errorLocation": "Inventar → Export → XLSX",
"expectedBehavior": "Eine Excel-Datei mit allen Inventareinträgen sollte heruntergeladen werden."
} Response Beispiel
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Bug",
"status": "Open",
"title": "Fehler beim Excel-Export",
"errorLocation": "Inventar → Export → XLSX",
"description": "Beim Export wird ein leeres Dokument erzeugt.",
"expectedBehavior": "Eine Excel-Datei mit allen Inventareinträgen.",
"createdByName": "Max Mustermann",
"createdByUserId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"createdAt": "2024-03-15T10:00:00Z",
"messages": []
} GET /support/tickets/{id} Support-Ticket abrufen Statuscodes
200 Ticket-Details inkl. Nachrichten
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Response Beispiel
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Bug",
"status": "Open",
"title": "Fehler beim Excel-Export",
"errorLocation": "Inventar → Export → XLSX",
"description": "Beim Export wird ein leeres Dokument erzeugt.",
"expectedBehavior": "Eine Excel-Datei mit allen Inventareinträgen.",
"createdByName": "Max Mustermann",
"createdByUserId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"createdAt": "2024-03-15T10:00:00Z",
"messages": []
} PATCH /support/tickets/{id}/status Ticket-Status ändern Statuscodes
200 Aktualisiertes Ticket
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"status": "Closed"
} Response Beispiel
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Bug",
"status": "Open",
"title": "Fehler beim Excel-Export",
"errorLocation": "Inventar → Export → XLSX",
"description": "Beim Export wird ein leeres Dokument erzeugt.",
"expectedBehavior": "Eine Excel-Datei mit allen Inventareinträgen.",
"createdByName": "Max Mustermann",
"createdByUserId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"createdAt": "2024-03-15T10:00:00Z",
"messages": []
} POST /support/tickets/{id}/messages Nachricht zu Ticket hinzufügen Statuscodes
200 Hinzugefügte Nachricht
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
429 Rate Limit überschritten – zu viele Anfragen von dieser IP
Request Beispiel
{
"body": "Ich habe das Problem reproduziert und sende weitere Details."
} Response Beispiel
{
"id": "660e8400-e29b-41d4-a716-446655440001",
"authorName": "Max Mustermann",
"authorRole": "Admin",
"authorUserId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"body": "Ich habe das Problem reproduziert und sende weitere Details.",
"createdAt": "2024-03-15T11:00:00Z",
"attachments": []
} POST /support/tickets/{ticketId}/messages/{messageId}/attachments Dateianhang zu einer Ticket-Nachricht hochladen Statuscodes
200 Anhang hochgeladen
400 Fehler
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Response Beispiel
{
"fileName": "screenshot.png",
"mimeType": "image/png",
"sizeBytes": 45210
} GET /support/tickets/{ticketId}/messages/{messageId}/attachments/{fileName} Dateianhang herunterladen Statuscodes
200 Dateiinhalt
401 Nicht authentifiziert
403 Keine Berechtigung (falsche Rolle)
404 Fehler
Tour Geführte Onboarding-Touren für Benutzer
GET /tour/{componentKey} Tour für eine Komponente abrufen Statuscodes
200 Tour-Daten
204 Tour abgeschlossen oder nicht vorhanden
401 Nicht authentifiziert
Response Beispiel
{
"tourId": 1,
"steps": [
{
"id": 10,
"nextStepId": 11,
"title": "Willkommen",
"body": "Hier finden Sie Ihr Inventar."
},
{
"id": 11,
"nextStepId": null,
"title": "Filter nutzen",
"body": "Filtern Sie nach Gebäude oder Kategorie."
}
],
"lastStepId": null
} PATCH /tour/{tourId}/progress Tour-Fortschritt speichern Statuscodes
204 Fortschritt gespeichert
401 Nicht authentifiziert
Request Beispiel
{
"lastStepId": 11
} POST /tour/{tourId}/complete Tour als abgeschlossen markieren Statuscodes
204 Tour abgeschlossen
401 Nicht authentifiziert
Spalten-Ansichten Gespeicherte, benannte Spaltenlayouts je Grid (ab v0.80.0, Issue #265) — beliebig viele Ansichten pro (Benutzer, Mandant, Grid), genau eine davon ist die feste Standard-Ansicht, die beim Öffnen des Grids geladen wird
GET /grid-views Gespeicherte Ansichten eines Grids abrufen Statuscodes
200 Ansichten des Benutzers
401 Nicht authentifiziert
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
POST /grid-views Neue Ansicht anlegen Statuscodes
201 Ansicht angelegt
401 Nicht authentifiziert
409 Es existiert bereits eine Ansicht mit diesem Namen für dieses Grid
422 Geschäftsregel-Fehler oder semantisch ungültige Anfrage
Request Beispiel
{
"gridKey": "inventory",
"viewName": "Wartung",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
]
} Response Beispiel
{
"id": 12,
"gridKey": "inventory",
"viewName": "Standard",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
],
"isDefault": true
} PUT /grid-views/{id} Ansicht umbenennen / Spalten aktualisieren Statuscodes
200 Ansicht aktualisiert
401 Nicht authentifiziert
404 Ansicht existiert nicht oder gehört nicht zum aktuellen Benutzer/Mandanten
409 Es existiert bereits eine andere Ansicht mit diesem Namen für dieses Grid
Response Beispiel
{
"id": 12,
"gridKey": "inventory",
"viewName": "Standard",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
],
"isDefault": true
} DELETE /grid-views/{id} Ansicht löschen Statuscodes
204 Ansicht gelöscht
401 Nicht authentifiziert
404 Ansicht existiert nicht oder gehört nicht zum aktuellen Benutzer/Mandanten
POST /grid-views/{id}/set-default Ansicht als Standard festlegen Statuscodes
200 Ansicht ist jetzt Standard
401 Nicht authentifiziert
404 Ansicht existiert nicht oder gehört nicht zum aktuellen Benutzer/Mandanten
Response Beispiel
{
"id": 12,
"gridKey": "inventory",
"viewName": "Standard",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
],
"isDefault": true
}