August 2026
API: Format für benutzerdefinierte Felder geändert
Betrifft alle API-Antworten mit benutzerdefinierten Feldern (Betriebsmittel, Prüfberichte, Kunden, Kontakte, Artikel, Produkte, Angebote, Aufträge, Rechnungen).
customFieldsist in GET-Antworten nicht mehr eine Liste von Objekten, sondern ein einfaches Schlüssel-Wert-Objekt (Schlüssel = Feldname, Wert = der eigentliche Feldwert). Felder ohne Wert sind mitnullstatt fehlendem Schlüssel enthalten.- Betroffen ist nur das Lesen; das Speichern von Feldwerten ist unverändert.
- Zusätzlich liefert
POST /inventory/{id}/unarchivejetzt keinen Datensatz mehr zurück (nur noch Erfolg/Fehler), analog zu den bereits bestehenden Sammel-Endpunkten für Archivieren/Entarchivieren.
Bitte prüfen Sie eigene Integrationen, die diese Endpunkte verwenden.
API: Kleinere Fehler bei Betriebsmitteln behoben
- Das Archivieren/Entarchivieren von Betriebsmitteln über einen API-Key wurde fälschlich mit “403 Forbidden” abgelehnt — behoben.
- Der Inventory-Endpunkt lieferte in Einzelfällen nicht alle Felder eines Betriebsmittels zurück (u. a. Prüfungsanzahl und benutzerdefinierte Felder nach dem Entarchivieren) — behoben.
Benutzerdefinierte Felder für Betriebsmittel und Prüfberichte
- Sie können jetzt eigene Felder für Betriebsmittel und Prüfberichte anlegen — Text, Zahl, Datum, Checkbox, E-Mail, URL oder Dropdown. Neuer Bereich Entitätsfelder in der Administration.
- Die Felder erscheinen automatisch im Bearbeiten-Formular und auf der Detailseite.
- Sie lassen sich jetzt auch als zusätzliche Spalte in der Inventarliste einblenden und danach filtern.
- Auch der JSON-Import für Betriebsmittel unterstützt jetzt Werte für diese Felder.
Kleinere Fehler bei den gespeicherten Ansichten behoben
- Ein Wechsel der Ansicht zeigte im Inventar-/Prüfberichte-Grid manchmal keine sichtbare Änderung.
- Im Kunden-Grid überschrieb das Anpassen der Spalten ungefragt die zuletzt aktive Ansicht, statt nur die aktuelle Anzeige zu ändern.
Startprobleme bei neu eingerichteten Konten behoben
- Bei einigen frisch eingerichteten Konten blieb die Administrationsseite ohne erkennbaren Grund leer.
- Die Einrichtung neuer Konten läuft jetzt zuverlässig durch; tritt trotzdem ein Ladefehler auf, wird das jetzt klar angezeigt statt einer stillen, leeren Seite.
Mehrere gespeicherte Ansichten für Ihre Tabellen
- Sie können jetzt beliebig viele benannte Ansichten Ihrer Spalteneinstellungen speichern und jederzeit wechseln — bisher gab es pro Tabelle nur eine einzige Einstellung.
- Neuer Ansichten-Umschalter: Ansicht wählen, aktuelle Ansicht aktualisieren, unter neuem Namen speichern, umbenennen, löschen oder als Standard festlegen.
- Verfügbar für Inventar, Prüfberichte und Kunden.
Mehrere gespeicherte Ansichten für Ihre Tabellen
- Sie können jetzt beliebig viele benannte Ansichten Ihrer Spalteneinstellungen speichern und jederzeit wechseln.
- Neu verfügbar für Kunden, Aufträge, Angebote, Rechnungen, Artikel und Mailbox-Verbindungen — dort gab es bisher noch gar keine Spaltenkonfiguration.
API: Nutzungszählung korrigiert, Rate-Limit deutlich angehoben
- API-Zugriffe über einen API-Key wurden bei manchen Mandanten nicht in der monatlichen Nutzungsstatistik gezählt — behoben.
- Das allgemeine Rate-Limit wurde von 60 auf 250 Anfragen pro Minute angehoben.
Lizenz-Budgets jetzt auch für Prüfberichte und API-Zugriffe
- Zusätzliche Budgets über das lizenzierte Kontingent hinaus lassen sich jetzt auch für Prüfberichte und API-Zugriffe festlegen (bisher nur für Betriebsmittel und Benutzer).
- Die Eingabe erfolgt jetzt als Menge statt als Euro-Betrag; der resultierende Preis wird direkt im Bearbeiten-Dialog angezeigt.
- Wichtig: Die Sperre bei Erreichen des Budgets ist jetzt standardmäßig aktiv (vorher standardmäßig aus).
Lizenzseite: mehrere Anzeigefehler behoben
- Eine Lizenzänderung mit demselben Startdatum wie die bisherige wurde nicht wirksam.
- Die Nutzungsanzeige auf der Lizenzseite blieb in manchen Fällen leer.
- Die angezeigte Nutzung konnte in Einzelfällen dem falschen Mandanten zugeordnet sein.
Dashboard: neue Auswertungen und bessere Übersicht
- Neues Diagramm “Fehlerquote” im Dashboard, jetzt zusätzlich nach Projekt und/oder Kunde filterbar.
- Kunde und Projekt werden jetzt überall gemeinsam angezeigt: in den Dashboard-Widgets, in Prüfberichten und in der Inventar-Kartenansicht.
Kleinere Verbesserungen
- Doppelklick auf einen Eintrag in der Kundenliste öffnet jetzt direkt die zugehörige Inventarliste.
- Die Nutzungsbalken auf der Lizenzseite sind jetzt farbig (grün/gelb/rot je nach Auslastung).
MXP-Export im echten MEBEDO-ElektroManager-Format
- Der “Als MXP exportieren”-Export erzeugt jetzt Dateien im echten MEBEDO-ElektroManager-Format und lässt sich direkt in die MEBEDO-Software re-importieren.
- Im Anschluss wurden mehrere Nachbesserungen vorgenommen, damit der Re-Import zuverlässig funktioniert (u. a. bei Herstellern, Normen, Geräte-Arten und Personaldaten).
- Hinweis: einzelne Sichtprüfungs-Ergebnisse und Messwerte werden in dieser Version noch nicht aus revuwork übernommen.
Neues Dashboard für revuwork.suite
- Die Startseite zeigt jetzt ein echtes, individuell anpassbares Dashboard statt der bisherigen Platzhalterseite.
- Erste Widgets: offene Aufträge und offene Rechnungen, jeweils mit direktem Link zur jeweiligen Liste.
- Optional dazu buchbar: ein Widget mit dem aktuellen Lizenz-Status.
Auth
Anmeldung, Registrierung und Benutzerinfo
Statuscodes
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"
} Statuscodes
Statuscodes
Response Beispiel
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Max Mustermann",
"email": "max@musterfirma.de",
"role": "Admin",
"mandantId": 3,
"mandantName": "Musterfirma GmbH"
} Statuscodes
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"
} Statuscodes
Response Beispiel
{
"tenantName": "Muster GmbH",
"email": "employee@firma.de"
} Statuscodes
Statuscodes
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"
} Statuscodes
Response Beispiel
{
"newsSubscriptionEnabled": true,
"themePreference": "light"
} Statuscodes
Request Beispiel
{
"newsSubscriptionEnabled": true,
"themePreference": "light"
} Statuscodes
Response Beispiel
[
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 1
},
{
"columnKey": "ergebnis",
"isVisible": true,
"sortOrder": 2
},
{
"columnKey": "naechstePruefung",
"isVisible": true,
"sortOrder": 3
}
] Statuscodes
Request Beispiel
[
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 1
},
{
"columnKey": "ergebnis",
"isVisible": false,
"sortOrder": 2
}
] Statuscodes
Response Beispiel
[
{
"columnKey": "customerName",
"sortOrder": 0
}
] Statuscodes
Request Beispiel
[
{
"columnKey": "customerName",
"sortOrder": 0
}
] Statuscodes
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
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
Statuscodes
Response Beispiel
{
"deviceCategory": [
"Leiter",
"Kran",
"Hubarbeitsbühne"
],
"building": [
"Halle A",
"Halle B"
],
"result": [
"Bestanden",
"Nicht bestanden"
]
} Statuscodes
Statuscodes
Request Beispiel
{
"ids": [
101,
102,
103
]
} Statuscodes
Statuscodes
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"
} Statuscodes
Statuscodes
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"
}
] Statuscodes
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"
} Statuscodes
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"
} Statuscodes
Statuscodes
Response Beispiel
[
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
}
] Statuscodes
Request Beispiel
{
"name": "DGUV V3"
} Response Beispiel
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
} Statuscodes
Response Beispiel
[
{
"id": 1,
"name": "DGUV V3"
},
{
"id": 2,
"name": "VDE 0701/0702"
}
] Statuscodes
Request Beispiel
{
"pvId1": 5,
"pvId2": 6
} Statuscodes
Request Beispiel
{
"isActive": true,
"sortOrder": 2
} Response Beispiel
{
"id": 5,
"inventoryId": 1042,
"inspectionRegulationId": 1,
"name": "DGUV V3",
"isActive": true,
"sortOrder": 1
} Statuscodes
Statuscodes
Response Beispiel
{
"mandantenProcessed": 5,
"itemsArchived": 12,
"errors": []
} Statuscodes
Response Beispiel
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Hans Prüfer"
}
] Statuscodes
Statuscodes
Request Beispiel
{
"inventoryIds": [
101,
102,
103
],
"customerId": 7
} Statuscodes
Request Beispiel
{
"ids": [
101,
102,
103
]
} Statuscodes
Request Beispiel
{
"ids": [
101,
102,
103
]
} Statuscodes
Response Beispiel
[
{
"id": 1,
"name": "DGUV V3"
},
{
"id": 2,
"name": "VDE 0701/0702"
}
] Prüfberichte
Prüfergebnisse importieren und abrufen (MXP / JSON)
Statuscodes
Response Beispiel
{
"projectNumber": 2024001,
"importedCount": 42,
"autoCreatedInventoryItems": 3,
"warnings": [
"Inventarnummer 'INV-0099' konnte keinem Eintrag zugeordnet werden."
],
"customerNo": "10042"
} Statuscodes
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"
} Statuscodes
Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Response Beispiel
{
"totalReports": 150,
"passed": 130,
"failed": 8,
"overdueCount": 5,
"dueSoonCount": 12
} Statuscodes
Response Beispiel
{
"mandantenProcessed": 3,
"filesBackedUp": 47,
"errors": []
} Statuscodes
Statuscodes
Response Beispiel
{
"schutzleiterwiderstandMax": 0.3,
"isolationswiderstandMin": 1,
"ableitstromMax": 3.5
} Statuscodes
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
Response Beispiel
{
"projectNumbers": [
2024001,
2024002
],
"results": [
"Bestanden",
"Nicht bestanden"
],
"inspectors": [
"Hans Prüfer"
],
"locations": [
"Halle A"
],
"manufacturers": [
"Günzburger"
]
} Statuscodes
Statuscodes
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": {}
} Statuscodes
Statuscodes
Import
Inventardaten per XLS-Datei oder JSON importieren
Statuscodes
Response Beispiel
{
"importedCount": 98,
"skippedCount": 2,
"errors": [
"Zeile 5: Ungültiges Datumsformat in 'letztePruefung'."
],
"folderPath": "/imports/2024-03-15",
"customerNo": "10042"
} Statuscodes
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"
} Statuscodes
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"
} Statuscodes
Statuscodes
Response Beispiel
{
"basePath": "/imports/mandant_3",
"basePathExists": true
} Statuscodes
Dashboard
Statistiken für die Startseite
Statuscodes
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"
}
]
} Statuscodes
Response Beispiel
{
"passed": 7,
"failed": 3
} Statuscodes
Response Beispiel
{
"projectNumbers": [
"100",
"200"
],
"customers": [
{
"id": 12,
"name": "Musterfirma GmbH"
}
]
} Statuscodes
Statuscodes
Statuscodes
Einstellungen
Mandantenspezifische Einstellungen und Branding
Statuscodes
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"
} Statuscodes
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"
} Statuscodes
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)
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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"
} Statuscodes
Request Beispiel
{
"name": "Lena Musterfrau",
"email": "lena.neu@musterfirma.de",
"role": "Admin",
"mandantId": null
} Statuscodes
Statuscodes
Statuscodes
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"
} Statuscodes
Statuscodes
Statuscodes
Admin – API-Keys
Verwaltung von API-Keys (Rolle Admin)
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
Request Beispiel
{
"name": "Prüfgerät Halle A"
} Response Beispiel
{
"id": 12,
"name": "Prüfgerät Halle A",
"plainKey": "rw_a1b2c3d4e5f6g7h8i9j0klmnopqrstuvwxyz"
} Statuscodes
Admin – Visual-Check-Vorlagen
Verwaltung der Sichtprüfungs-Vorlagen (Rolle Admin)
Statuscodes
Response Beispiel
[
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden",
"source": "global"
}
] Statuscodes
Request Beispiel
[
{
"order": 1,
"function": "Sichtprüfung",
"step": "Gehäuse",
"criterion": "Keine sichtbaren Schäden"
}
] Statuscodes
Admin – Benachrichtigungskonfiguration
Benachrichtigungsschwellwerte und E-Mail-Adressen konfigurieren (Rolle Admin)
Statuscodes
Response Beispiel
{
"thresholdDays": [
30,
60,
90
],
"notifyEmails": [
"admin@musterfirma.de"
],
"webhookUrl": null,
"hasWebhookAuth": false
} Statuscodes
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
Statuscodes
Response Beispiel
{
"mandantenProcessed": 5,
"emailsSent": 3,
"webhooksFired": 1,
"errors": []
} Kunden
Kundenverwaltung (Zuordnung von Inventareinträgen zu Kunden)
Statuscodes
Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
Request Beispiel
{
"customerIds": [
7,
12,
19
]
} Produkte
Produktverwaltung (revuwork.suite, ab v0.7.0) — übergeordnete Warengruppen/Kategorien für den Artikelstamm
Statuscodes
Statuscodes
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": {}
} Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
Statuscodes
Artikel
Artikelverwaltung (revuwork.suite, ab v0.7.0) — konkrete verkaufbare Positionen je Produkt, Grundlage für künftige Auftragspositionen
Statuscodes
Statuscodes
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": {}
} Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
Statuscodes
Aufträge
Auftragsverwaltung (revuwork.suite, ab v0.8.0) — Status-Workflow Draft → Confirmed → Fulfilled / Cancelled, Positionen wahlweise mit Artikelbezug (Snapshot) oder als Freitext
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
Response Beispiel
{
"openCount": 3
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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.
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
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`.
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Statuscodes
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": {}
} Statuscodes
Response Beispiel
{
"openAmount": 1487.5,
"openCount": 3
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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": {}
} Statuscodes
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
Statuscodes
Statuscodes
Statuscodes
Statuscodes
Request Beispiel
{
"isDefault": true
} Statuscodes
Statuscodes
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)
Statuscodes
Statuscodes
Statuscodes
Statuscodes
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"
} Statuscodes
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"
} Statuscodes
Statuscodes
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.
Statuscodes
Statuscodes
Statuscodes
Statuscodes
Statuscodes
Statuscodes
Statuscodes
Lizenz
Lizenzstatus des eigenen Mandanten (Rolle Admin)
Statuscodes
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
}
} Statuscodes
Statuscodes
Statuscodes
Request Beispiel
{
"maxOverageQuantity": 10000,
"stopUsageWhenReached": true,
"alertsEnabled": true
} Audit
Audit-Log für Änderungen (Rolle Admin/SuperAdmin)
Statuscodes
Response Beispiel
{
"items": [],
"totalCount": 320,
"page": 1,
"pageSize": 25,
"totalPages": 13
} Admin – Webhooks
Webhook-Konfiguration (Rolle Admin)
Statuscodes
Statuscodes
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
} Statuscodes
Statuscodes
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.
Statuscodes
Statuscodes
Statuscodes
Support
Support-Tickets und Nachrichten
Statuscodes
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
} Statuscodes
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": []
} Statuscodes
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": []
} Statuscodes
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": []
} Statuscodes
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": []
} Statuscodes
Response Beispiel
{
"fileName": "screenshot.png",
"mimeType": "image/png",
"sizeBytes": 45210
} Statuscodes
Tour
Geführte Onboarding-Touren für Benutzer
Statuscodes
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
} Statuscodes
Request Beispiel
{
"lastStepId": 11
} Statuscodes
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
Statuscodes
Statuscodes
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
} Statuscodes
Response Beispiel
{
"id": 12,
"gridKey": "inventory",
"viewName": "Standard",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
],
"isDefault": true
} Statuscodes
Statuscodes
Response Beispiel
{
"id": 12,
"gridKey": "inventory",
"viewName": "Standard",
"columns": [
{
"columnKey": "inventarnummer",
"isVisible": true,
"sortOrder": 0
}
],
"isDefault": true
}