API v1 vs v2: Beide Versionen sind aktiv und funktional identisch. v2 ist die empfohlene Version fuer neue Integrationen und bietet zusätzlich GET /api/v2/openapi.json und GET /api/v2/openapi.yaml. v1-Endpoints werden weiterhin unterstützt.
Session-Cookie-Authentifizierung. Nach POST /auth/login wird ein session-Cookie gesetzt. Alle weiteren Requests müssen diesen Cookie mitsenden. Fehlt die Session, antworten alle Endpoints mit 401 Unauthorized.

Response-Format: {"ok": true, "data": {...}} oder {"ok": false, "error": "Fehlermeldung"}
Binäre Responses (PDF, CSV, PNG, SVG, ZIP) haben direkte Content-Type-Header ohne JSON-Wrapper.

HTTP Statuscodes

CodeBedeutungTypischer Grund
200OKErfolgreiche GET/PUT/DELETE-Anfrage
201CreatedRessource erfolgreich erstellt (POST)
400Bad RequestFehlendes Pflichtfeld, ungültiger Wert
401UnauthorizedNicht angemeldet oder Session abgelaufen
403ForbiddenKeine Berechtigung fuer dieses Projekt
404Not FoundProjekt/Seite/Symbol existiert nicht
409ConflictBMK-Duplikat, Username bereits vorhanden
500Server ErrorInterner Fehler, PDF-Generierung fehlgeschlagen

Authentifizierung

5 Endpoints
POST /auth/login Session starten

Request Body

FeldTypPflichtBeschreibung
usernamestringJaBenutzername
passwordstringJaPasswort
rememberbooleanNeinPermanente Session (default: false)

Response 200

{"ok":true,"data":{"id":1,"username":"admin","email":"admin@example.com","company_name":"VBWork"}}

Try it

POST /auth/logout Session beenden

Response 200

{"ok":true,"data":{"message":"Abgemeldet"}}

Try it

GET /auth/me Aktueller Benutzer

Response 200

{"ok":true,"data":{"id":1,"username":"admin","email":"admin@example.com","company_name":"VBWork","created_at":"2026-01-01T00:00:00"}}

Try it

POST /auth/change-password Passwort aendern

Request Body

FeldTypPflichtBeschreibung
old_passwordstringJaAktuelles Passwort
new_passwordstringJaNeues Passwort (min. 6 Zeichen)

Einstellungen

4 Endpoints
GET /settings Benutzer-Einstellungen lesen

Response 200

{"ok":true,"data":{"profile":{"username":"admin","email":"...","company_name":"..."},"preferences":{"theme":"dark","language":"de","default_format":"A4"}}}

Try it

PUT /settings Einstellungen aktualisieren

Request Body

FeldTypBeschreibung
company_namestringFirmenname fuer Schriftfeld
default_formatstringA4, A3, A2
default_orientationstringquer, hoch
languagestringde, en
PUT /settings/profile Profil aktualisieren

Request Body

FeldTypBeschreibung
emailstringE-Mail-Adresse
company_namestringFirmenname
first_namestringVorname
last_namestringNachname

Projekte

17 Endpoints
GET /projects Alle eigenen Projekte

Query Parameter

ParameterTypBeschreibung
statusstringFilter: active, archived
searchstringSuche in Name/Beschreibung
tagstringTag-Filter

Response 200

[{"id":1,"name":"Maschinensteuerung","description":"...","page_count":3,"status":"active","tags":[],"is_favorite":false,"created_at":"...","updated_at":"..."}]

Try it

POST /projects Neues Projekt erstellen

Request Body

FeldTypPflichtBeschreibung
namestringJaProjektname
descriptionstringNeinBeschreibung
page_formatstringNeinA4 (default), A3, A2
orientationstringNeinquer (default), hoch
tagsarray[string]NeinTags

Response 201

{"ok":true,"data":{"id":42,"name":"Mein Projekt","page_count":1,"status":"active","created_at":"..."}}

Try it

GET /projects/{project_id} Projekt laden

Response 200

{"ok":true,"data":{"id":1,"name":"...","pages":[{"id":1,"page_number":1,"title":"Seite 1","canvas_data":{"elements":[],"wires":[]}}]}}

Try it

PUT /projects/{project_id} Projekt aktualisieren

Request Body

FeldTypBeschreibung
namestringNeuer Projektname
descriptionstringNeue Beschreibung
customerstringAuftraggeber
locationstringAufstellort
DELETE /projects/{project_id} Projekt loeschen
Loescht unwiderruflich alle Seiten, Elemente, Kabel, Revisions und Annotationen des Projekts.

Response 200

{"ok":true,"data":{"deleted":1}}
GET /projects/recent Zuletzt bearbeitete Projekte

Response 200

{"ok":true,"data":[{"id":1,"name":"...","updated_at":"..."}]}
POST /projects/{project_id}/duplicate Projekt duplizieren (alle Seiten kopieren)

Request Body

FeldTypBeschreibung
namestringName der Kopie (default: "Kopie von ...")

Response 201

{"ok":true,"data":{"id":43,"name":"Kopie von Mein Projekt","page_count":3}}
PUT /projects/{project_id}/status Status setzen (in_progress, review, done, ...)

Request Body

{"status":"in_progress"}

Werte: draft, in_progress, review, done, archived

PUT /projects/{project_id}/archive  |  /unarchive Archivieren / reaktivieren

Response 200

{"ok":true,"data":{"archived":true}}
POST /projects/{project_id}/favorite  |  DELETE Favorit hinzufuegen / entfernen

Response 200

{"ok":true,"data":{"is_favorite":true}}
PUT /projects/{project_id}/tags Tags setzen

Request Body

{"tags":["automation","400V","SPS"]}
GET /projects/{project_id}/quickstats Schnellstatistik (Elemente, Leitungen, Klemmen)

Response 200

{"ok":true,"data":{"pages":3,"elements":24,"wires":18,"terminals":12,"cables":6,"symbols_used":["ls3","contactor-3p"]}}
GET /projects/{project_id}/qrcode QR-Code-PNG fuer Projekt-URL
Response: image/png direkt (kein JSON-Wrapper). QR-Code des Projektlinks.
POST /projects/{project_id}/auto-number Alle BMKs automatisch durchnummerieren

Request Body

FeldTypBeschreibung
startintegerStartnummer (default: 1)
prefixstringPrefix (default: "-")
per_pagebooleanPro Seite neu nummerieren (default: false)

Response 200

{"ok":true,"data":{"renamed":12}}
POST /projects/bulk Mehrere Projekte gleichzeitig aendern (Status, Tags, Archiv)

Request Body

{"ids":[1,2,3],"action":"archive"}

Actions: archive, unarchive, delete, set_status, add_tag, remove_tag

GET /projects/{project_id}/export-zip Gesamtprojekt als ZIP exportieren
Response: application/zip. Enthaelt JSON-Dump aller Seiten, Canvas-Daten, Metadaten und Symbolreferenzen.
POST /projects/compare  |  /compare/export-pdf Zwei Projekte vergleichen (Diff)

Request Body

{"project_id_a":1,"project_id_b":2}

Response 200

{"ok":true,"data":{"added":[],"removed":[],"changed":[{"bmk":"-K1","field":"label","old":"Alt","new":"Neu"}]}}
GET /projects/{project_id}/settings  |  PUT Projektspezifische Einstellungen

Response 200

{"ok":true,"data":{"auto_save":true,"wire_snap":10,"default_wire_color":"#a0522d","cross_section":"1.5","norm":"DIN EN 61082"}}
PUT /projects/{project_id}/kanban Kanban-Daten (Projektboard) speichern

Request Body

{"columns":[{"id":"todo","title":"Offen","cards":[]},{"id":"done","title":"Fertig","cards":[]}]}

Seiten (Schaltplanseiten)

8 Endpoints
GET /projects/{project_id}/pages Alle Seiten eines Projekts

Response 200

[{"id":1,"project_id":1,"page_number":1,"title":"Seite 1","page_format":"A4","orientation":"quer","canvas_data":{"elements":[],"wires":[]}}]
POST /projects/{project_id}/pages Neue Seite anlegen

Request Body

FeldTypPflichtBeschreibung
titlestringNeinSeitentitel (default: "Seite N")
page_formatstringNeinA4, A3, A2
orientationstringNeinquer, hoch
canvas_dataobjectNeinInitiale Canvas-Daten {elements:[], wires:[]}

canvas_data Struktur

{
  "elements": [
    {"id":"el_1","symbolId":"ls3","x":200,"y":300,"width":60,"height":60,
     "bmk":"-Q1","label":"Leitungsschutzschalter","voltage":"400V","rotation":0}
  ],
  "wires": [
    {"id":"w_1","segments":[{"x1":200,"y1":80,"x2":200,"y2":300}],
     "color":"#a0522d","potential":"L1","crossSection":"1.5","number":"1"}
  ]
}
POST /projects/{project_id}/pages/from-template Seite aus Seitentemplate erzeugen

Request Body

{"template_id":3,"title":"Motorseite"}
GET /pages/{page_id} Einzelne Seite abrufen

Response 200

{"ok":true,"data":{"id":1,"title":"Seite 1","page_format":"A4","orientation":"quer","canvas_data":{...}}}
PUT /pages/{page_id} Seite speichern (Auto-Revisioning)

Request Body

FeldTypBeschreibung
canvas_dataobjectVollstaendiger Canvas-Inhalt
titlestringSeitentitel
page_formatstringA4, A3, A2
orientationstringquer, hoch
Jede Speicherung erstellt automatisch einen Revisions-Snapshot (max. 20 Versionen). Aeltere Versionen werden automatisch geloescht.
DELETE /pages/{page_id} Seite loeschen (mind. 1 bleibt)

Response 400 - Letzte Seite

{"ok":false,"error":"Mindestens eine Seite muss vorhanden sein"}
PUT /pages/{page_id}/reorder Seite verschieben

Request Body

{"page_number":3}
PUT /projects/{project_id}/pages/order Reihenfolge aller Seiten setzen

Request Body

{"order":[3,1,2]}

Array aus Seiten-IDs in der gewuenschten Reihenfolge.

Revisionen (Versionierung)

10 Endpoints
GET /pages/{page_id}/versions Seiten-Versionen (automatisch)

Response 200

[{"index":0,"timestamp":"2026-03-23T12:00:00","element_count":12,"wire_count":8}]
POST /pages/{page_id}/versions/{version_idx}/restore Seitenversion wiederherstellen

Response 200

{"ok":true,"data":{"restored":true,"timestamp":"2026-03-23T12:00:00"}}
GET /projects/{project_id}/revisions Projekt-Revisionen (manuelle Snapshots)

Response 200

[{"id":1,"version":"v1.0","comment":"Freigabe Kunde","created_at":"...","page_count":3}]
POST /projects/{project_id}/revisions Manuellen Revisions-Snapshot erstellen

Request Body

FeldTypBeschreibung
versionstringVersionsbezeichnung (z.B. "v2.1")
commentstringKommentar zur Revision
GET /projects/{project_id}/revisions/{rev_id}/compare Revision mit aktuellem Stand vergleichen

Response 200

{"ok":true,"data":{"added":[{"bmk":"-K3","type":"contactor"}],"removed":[],"changed":[{"bmk":"-Q1","field":"label","old":"Alt","new":"Neu"}]}}
POST /projects/{project_id}/revisions/{rev_id}/restore Revision komplett wiederherstellen
Ueberschreibt alle aktuellen Seiten. Vorher automatischer Backup-Snapshot wird erstellt.

BMK-Verwaltung (Betriebsmittelkennzeichnung)

5 Endpoints
POST /projects/{project_id}/bmk/check BMK-Eindeutigkeit pruefen

Request Body

{"bmk":"-K1"}

Response 200

{"ok":true,"data":{"unique":false,"existing_pages":[1,3],"count":2}}
POST /projects/{project_id}/bmk/next Naechste freie BMK vorschlagen

Request Body

{"prefix":"-K","type":"contactor"}

Response 200

{"ok":true,"data":{"next":"-K4","existing":["-K1","-K2","-K3"]}}
POST /projects/{project_id}/bmk/suggest BMK-Vorschlag nach Symbol-Typ

Request Body

{"symbol_type":"motor","page_id":1}

Response 200

{"ok":true,"data":{"suggested":"-M2"}}
POST /projects/{project_id}/bmk/bulk-renumber Alle BMKs eines Typs umnummerieren

Request Body

{"prefix":"-K","start":1,"step":1}

Response 200

{"ok":true,"data":{"renamed":4,"mapping":{"-K3":"-K1","-K7":"-K2"}}}

Symbole

6 Endpoints
GET /symbols Symbole suchen

Query Parameter

ParameterTypBeschreibung
categorystringKategorie-Filter (z.B. "Schuetze")
searchstringSuche in Name, Beschreibung, IEC-Nummer
is_custombooleanNur eigene Symbole

Response 200

[{"id":1,"name":"Schuetz 3-polig","category":"Schuetze","iec_number":"IEC 60617","tags":["motor"],"is_custom":false}]

Try it

GET /symbols/categories Alle Kategorien mit Anzahl

Response 200

{"ok":true,"data":{"categories":[{"name":"Schuetze","count":12},{"name":"Sicherungen","count":8}]}}

Try it

GET /symbols/{symbol_id}/svg SVG-Rohdaten
Response: image/svg+xml direkt (kein JSON-Wrapper).
GET /symbols/file/{sym_path} Symbol-Datei per Pfad laden

Beispiel: /api/symbols/file/schuetze/contactor-3p.svg → liefert SVG-Inhalt.

POST /symbols Eigenes Symbol erstellen

Request Body

FeldTypPflichtBeschreibung
namestringJaSymbolname
categorystringJaKategorie
svg_datastringJaSVG-Quellcode (wird sanitized: kein script, foreignObject, javascript:)
descriptionstringNeinBeschreibung
iec_numberstringNeinIEC 60617 Nummer
tagsarrayNeinSuchbegriffe
POST /symbols/custom Benutzerdefiniertes Symbol speichern (Symbol-Editor)

Request Body

{"name":"Mein Symbol","category":"Custom","paths":[{"d":"M0 0 L60 60","stroke":"#fff"}],"width":60,"height":60}

Komponenten & Artikelkatalog

6 Endpoints
GET /components/search Komponenten suchen

Query Parameter

ParameterTypBeschreibung
qstringSuchbegriff (Name, Artikelnr, Hersteller)
manufacturerstringHersteller-Filter
limitintegerErgebnislimit (default: 20)

Response 200

[{"id":1,"name":"3RT2015 Schuetz","manufacturer":"Siemens","article_nr":"3RT2015-1BB41","current":"7A","voltage":"24VDC"}]
GET /components/by-symbol/{sym_type} Passende Komponenten fuer Symbol-Typ

Liefert Komponenten-Vorschlaege zum Symbol-Typ (z.B. contactor, fuse, motor).

GET /components/sym-types Alle Symbol-Typen mit Komponenten

Response 200

{"ok":true,"data":["contactor","fuse","motor","circuit_breaker","terminal"]}
GET /catalog/search Artikelkatalog durchsuchen

Query Parameter

ParameterBeschreibung
qSuchbegriff
manufacturerHersteller-Filter
categoryKategorie-Filter

Try it

GET /catalog/article/{artikelnr} Artikel per Nummer laden

Response 200

{"ok":true,"data":{"artikelnr":"3RT2015-1BB41","name":"...","manufacturer":"Siemens","price":89.50,"unit":"Stueck","datasheet_url":"..."}}
GET /catalog/manufacturers Alle Hersteller im Katalog

Response 200

{"ok":true,"data":["Siemens","ABB","Schneider Electric","Eaton","Phoenix Contact","Wago"]}

Export (PDF, SVG, DXF, PNG, Import)

12 Endpoints
POST /projects/{project_id}/export/pdf Schaltplan als PDF

Request Body

FeldTypBeschreibung
pagesarray[int]Seiten-IDs. Leer = alle Seiten.
with_schriftfeldbooleanDIN-Schriftfeld (default: true)
companyobject{name, address, project_nr, drawn_by, date}
include_bombooleanStueckliste anhaengen (default: false)
Response: application/pdf als direkter Datei-Download.
POST /projects/{project_id}/export/complete Komplette Projektdokumentation (1 PDF)

PDF-Inhalt

1. Deckblatt (DIN EN 61082) • 2. Inhaltsverzeichnis • 3. Alle Schaltplanseiten • 4. Stueckliste (BOM) • 5. Klemmplan • 6. Kabelplan • 7. Verdrahtungsliste • 8. Pruefprotokoll-Vorlage (VDE 0100-600)

POST /projects/{project_id}/export/svg Seiten als SVG exportieren

Request Body

{"page_ids":[1,2]}
Response: image/svg+xml oder application/zip (mehrere Seiten).
POST /projects/{project_id}/export/dxf DXF-Export fuer CAD-Systeme
Response: application/dxf. Kompatibel mit AutoCAD, EPLAN, WSCAD.
POST /projects/{project_id}/export/png Seiten als PNG-Bilder

Request Body

FeldTypBeschreibung
dpiintegerAufloesung (default: 150, max: 300)
page_idsarray[int]Seiten-IDs
POST /projects/{project_id}/export/batch Mehrere Formate gleichzeitig als ZIP

Request Body

{"formats":["pdf","svg","dxf"],"page_ids":[1,2,3]}
POST /projects/{project_id}/export/connector-pdf Steckerbelegungsplan als PDF
Generiert PDF mit allen Steckern und deren Pin-Belegung aus dem Projekt.
POST /projects/{project_id}/import/csv  |  /dxf  |  /svg  |  /image Projekt-Import aus verschiedenen Formaten

Request

Multipart-Form-Upload: file-Feld mit der zu importierenden Datei.

Formate

EndpointFormatFunktion
/import/csvCSVStueckliste / Komponentenliste importieren
/import/dxfDXFCAD-Zeichnung als Vorlage importieren
/import/svgSVGSVG-Zeichnung als Hintergrund
/import/imagePNG/JPGBild als Hintergrundebene
POST /projects/import Projekt-JSON importieren
Multipart-Upload: komplettes Projekt-JSON (z.B. aus ZIP-Export). Erstellt neues Projekt mit allen Seiten.

Stueckliste (BOM)

3 Endpoints
GET /projects/{project_id}/bom Stueckliste als JSON

Response 200

{"ok":true,"data":{"items":[
  {"Pos":1,"BMK":"-Q1","Bezeichnung":"Leitungsschutzschalter 3-pol",
   "Hersteller":"","Bestellnummer":"","Symbol":"ls3","Seite":"Seite 1","Menge":1}
],"total":5}}

Try it

GET /projects/{project_id}/bom/csv Stueckliste als CSV (Excel-kompatibel)
Response: text/csv; charset=utf-8. Semikolon-separiert, UTF-8 BOM fuer Excel.
POST /projects/{project_id}/bom/pdf Stueckliste als formatiertes PDF
Response: application/pdf. Tabellarische Auflistung aller Betriebsmittel mit Pos., BMK, Bezeichnung, Menge.

Klemmplan & Klemmenliste

4 Endpoints
GET /projects/{project_id}/klemmplan Klemmplan-Daten

Response 200

{"ok":true,"data":{
  "groups":{"X1":[
    {"nr":"1","bezeichnung":"Einspeisung L1","potential":"L1","querschnitt":"2.5",
     "von_bmk":"-Q1","nach_bmk":"-K1","farbe":"braun"}
  ]},
  "total":12
}}

Try it

POST /projects/{project_id}/klemmplan/pdf Klemmplan als PDF (grafisch nach DIN EN 61082)
Grafische Darstellung jeder Klemme mit Potentialangabe und Verdrahtungsinformation.
GET /projects/{project_id}/kontaktspiegel Kontaktspiegel aller Geraete

Response 200

{"ok":true,"data":[{"bmk":"-K1","contacts":[{"nr":"13/14","type":"NO","page":"Seite 2"}]}]}
GET /projects/{project_id}/kontaktspiegel/{bmk} Kontaktspiegel einzelnes Geraet

Response 200

{"ok":true,"data":{"bmk":"-K1","label":"Hauptschuetz","contacts":[{"contact_nr":"13","type":"NO","page":"Seite 2","connected_to":"-Q1"}]}}

Kabelmanagement

9 Endpoints
GET /projects/{project_id}/kabel Alle Kabel eines Projekts

Response 200

{"ok":true,"data":[{
  "id":1,"project_id":1,"bezeichnung":"W1","typ":"NYCY","querschnitt":"3x1.5","laenge":5.5,
  "farbe":"schwarz","von_bmk":"-Q1","nach_bmk":"-M1","adern":3,"schirm":true,
  "von_klemme":"1","nach_klemme":"U","note":"Motorleitung"
}]}

Try it

POST /projects/{project_id}/kabel Kabel hinzufuegen

Request Body

FeldTypPflichtBeschreibung
bezeichnungstringJaKabelbezeichnung (z.B. "W1")
typstringNeinKabeltyp (NYCY, H05VV-F, ...)
querschnittstringNeinQuerschnitt (z.B. "3x1.5")
laengefloatNeinLaenge in Metern
von_bmkstringNeinStartpunkt BMK
nach_bmkstringNeinEndpunkt BMK
adernintegerNeinAnzahl Adern
schirmbooleanNeinGeschirmt (default: false)
PUT /projects/{project_id}/kabel/{kabel_id} Kabel bearbeiten

Gleiche Felder wie POST. Nur angegebene Felder werden aktualisiert.

DELETE /projects/{project_id}/kabel/{kabel_id} Kabel loeschen

Response 200

{"ok":true,"data":{"deleted":1}}
GET /projects/{project_id}/kabel/stats Kabelstatistik (Laengen, Typen, Gesamtquerschnitt)

Response 200

{"ok":true,"data":{"total_cables":8,"total_length_m":42.5,"types":{"NYCY":3,"H05VV-F":5},"total_weight_kg":2.1}}
GET /projects/{project_id}/kabel/export/csv  |  /pdf Kabelliste exportieren
CSV: text/csv semikolon-separiert. PDF: application/pdf tabellarisch.
POST /projects/{project_id}/kabel/import_schaltplan Kabel aus Schaltplan-Leitungen importieren
Analysiert alle Leitungen in den Schaltplanseiten und erstellt daraus automatisch Eintraege in der Kabelliste.

Verdrahtungsliste & Kabelplan-Ansicht

5 Endpoints
GET /projects/{project_id}/verdrahtungsliste Verdrahtungsliste (Von-Nach-Verbindungen)

Response 200

{"ok":true,"data":{"connections":[
  {"nr":"1","potential":"L1","querschnitt":"1.5","farbe":"braun",
   "von_bmk":"-Q1","von_klemme":"2","nach_bmk":"-K1","nach_klemme":"A1","laenge":0.25}
],"total":18}}
GET /projects/{project_id}/verdrahtungsliste/export/csv  |  /pdf Verdrahtungsliste exportieren
CSV: semikolon-separiert. PDF: tabellarisch nach VDE 0113.
GET /projects/{project_id}/kabelplan Kabelplan-Ansicht (Datenbasis fuer kabelplan.html)

Response 200

{"ok":true,"data":{"cables":[{"number":"1","potential":"L1","cross_section":"1.5","color":"#a0522d","from_bmk":"-Q1","to_bmk":"-K1","length_approx":250}],"total":8}}
GET /projects/{project_id}/querverweise Querverweisliste (BMK-Vorkommen ueber alle Seiten)

Response 200

{"ok":true,"data":{"references":[{
  "bmk":"-K1","label":"Hauptschuetz",
  "occurrences":[{"page":"Seite 1","page_number":1,"x":200,"y":340}]
}],"multi_page":["-K1","-F1"]}}
GET /projects/{project_id}/potential-arrows Potentialpfeile (Seitenverknuepfungen)

Response 200

{"ok":true,"data":{"potentials":{"L1":[{"page":"Seite 1","direction":"out"},{"page":"Seite 2","direction":"in"}]}}}

Steckerbelegung (Connectors)

2 Endpoints
GET /projects/{project_id}/connectors Alle Steckverbinder im Projekt

Response 200

{"ok":true,"data":[{"bmk":"-X1","type":"DSUB9","pins":9,"page":"Seite 1","connections":[{"pin":1,"signal":"RxD","connected_to":"-A1"}]}]}
GET /projects/{project_id}/connectors/kontaktspiegel Kontaktspiegel aller Steckverbinder

Response 200

{"ok":true,"data":[{"bmk":"-X1","pins":[{"nr":"1","von":"A1:1","nach":"X2:1","farbe":"ws"}]}]}

VDE-Pruefung & Sicherheitsanalyse

5 Endpoints
POST /api/ki/vde-check  (auch: /ki/vde-check) KI-gestuetzte VDE-Pruefung

Request Body

FeldTypBeschreibung
elementsarrayCanvas-Elemente der Seite
wiresarrayLeitungen der Seite
normstringPruefnorm (default: "VDE 0100")

Response 200

{"ok":true,"data":{
  "issues":[
    {"type":"error","message":"Fehlender PE-Anschluss an -M1","rule":"VDE 0100-540","severity":"high"},
    {"type":"warning","message":"Querschnitt 1.5mm2 bei 16A-Sicherung unterdimensioniert","rule":"VDE 0100-430"}
  ],
  "score":72,
  "passed":false
}}

Try it

POST /projects/{project_id}/vde-check-advanced Erweiterte VDE-Pruefung (alle Seiten, Bericht)

Response 200

{"ok":true,"data":{"pages_checked":3,"total_issues":5,"errors":2,"warnings":3,"score":78,"report":[...]}}
POST /projects/{project_id}/safety-check Sicherheitspruefung (NOT-AUS, Schutzleiter, ...)

Response 200

{"ok":true,"data":{"emergency_stop":true,"pe_circuit":true,"fuses":true,"issues":[],"safety_score":100}}
POST /projects/{project_id}/fehlerstrom-analyse Fehlerstromanalyse (RCD-Dimensionierung)

Response 200

{"ok":true,"data":{"total_leakage_ma":2.4,"rcd_required":true,"recommended_rcd":"30mA","circuits":[...]}}
POST /projects/{project_id}/verteilerplan Verteilerplan generieren

Response 200

{"ok":true,"data":{"circuits":[{"name":"Abgang 1","fuse":"16A","consumer":"-M1","current_demand":12}]}}

Pruefprotokoll & Pruefkalender

12 Endpoints
GET /projects/{project_id}/pruefprotokoll Pruefprotokoll-Daten abrufen

Response 200

{"ok":true,"data":{"anlage":"Maschinensteuerung","pruefpunkte":[{"nr":1,"beschreibung":"Sichtpruefung","norm":"VDE 0100-600","ergebnis":null}]}}
GET /projects/{project_id}/pruefpunkte Pruefpunkte-Liste

Response 200

[{"id":1,"nr":"1.1","beschreibung":"Isolationswiderstand messen","norm":"VDE 0100-600:2017 Abschn. 61","einheit":"MOhm","sollwert":">1"}]
POST /projects/{project_id}/pruefpunkte/generate Pruefpunkte automatisch aus Schaltplan generieren
Analysiert Schaltplan und erzeugt VDE-konforme Pruefpunkte (Isolationsmessung, PE-Pruefung, Funktionspruefung je Antrieb).
GET /projects/{project_id}/prueftermine Faellige Prueftermine fuer Projekt

Response 200

[{"id":1,"bezeichnung":"UVV-Pruefung","faellig_am":"2026-04-01","intervall_monate":12,"letzter_pruefer":"M. Muster","status":"faellig"}]
PUT /prueftermine/{termin_id}/erledigen Prueftermin als erledigt markieren

Request Body

FeldTypBeschreibung
prueferstringName des Pruefers
ergebnisstringbestanden, nicht_bestanden, auflagen
notizstringPruefnotiz
datumstringPruef-Datum (default: heute)
GET /api/pruefkalender Pruefkalender (alle faelligen Termine)

Response 200

{"ok":true,"data":{"overdue":2,"due_soon":3,"upcoming":5,"items":[...]}}

Try it

POST /api/pruefprotokoll/export Pruefprotokoll nach VDE 0100-600 als PDF

Request Body

FeldTypBeschreibung
anlagestringAnlagenbezeichnung
standortstringAufstellort
auftraggeberstringAuftraggeber
prueferstringName Pruefer
datumstringPruef-Datum (DD.MM.YYYY)
normstringPruefnorm (default: "VDE 0100-600")
messungenarrayMessergebnisse [{punkt, wert, einheit, bestanden}]

Wartungsplan

6 Endpoints
GET /projects/{project_id}/wartungsplan/status Wartungsplan-Status

Response 200

{"ok":true,"data":{"active_tasks":3,"overdue":1,"due_this_month":2,"last_service":"2026-01-15"}}
GET /projects/{project_id}/wartungsplan/analyse Wartungsbedarfsanalyse aus Schaltplan

Response 200

{"ok":true,"data":{"components":[{"bmk":"-K1","typ":"Schuetz","wartungsintervall_monate":12,"letzte_wartung":null}],"gesamtaufwand_h":4.5}}
GET /projects/{project_id}/wartungsplan/checkliste Wartungscheckliste abrufen

Response 200

[{"id":1,"aufgabe":"Schuetz -K1 pruefen","faellig":"2026-04-01","erledigt":false,"zugewiesen_an":""}]
POST /projects/{project_id}/wartungsplan/checkliste Wartungsaufgabe hinzufuegen

Request Body

{"aufgabe":"Schmiermittel wechseln","faellig":"2026-06-01","zugewiesen_an":"Max Muster","intervall_monate":6}
PUT /projects/{project_id}/wartungsplan/update Wartungsplan aktualisieren

Request Body

{"task_id":1,"erledigt":true,"notiz":"Erledigt am 2026-03-24","naechste_faelligkeit":"2026-09-24"}
POST /projects/{project_id}/wartungsplan/pdf Wartungsplan als PDF exportieren
Response: application/pdf. Vollstaendiger Wartungsplan mit Checklisten und Intervallplanung.

Energiebilanz & Leistungsanalyse

2 Endpoints
GET /projects/{project_id}/energiebilanz Energiebilanz des Projekts

Response 200

{"ok":true,"data":{
  "total_power_kw":22.5,"total_current_a":42.3,
  "consumers":[{"bmk":"-M1","label":"Hauptantrieb","power_kw":15,"current_a":28.5,"cos_phi":0.85}],
  "fuse_check":{"ok":true,"issues":[]}
}}

Try it

POST /projects/{project_id}/energiebilanz/pdf Energiebilanz als PDF
Response: application/pdf. Lastflussdiagramm und Leistungstabelle.

Schaltschrank-Layout

6 Endpoints
POST /projects/{project_id}/schaltschrank Schaltschrank-Layout erstellen

Request Body

FeldTypBeschreibung
width_mmintegerBreite in mm (default: 600)
height_mmintegerHoehe in mm (default: 800)
depth_mmintegerTiefe in mm (default: 250)
herstellerstringSchaltschranktyp (Rittal, Siemens, ...)
GET /projects/{project_id}/schaltschrank Schaltschrank-Layout abrufen

Response 200

{"ok":true,"data":{"layout_id":1,"width_mm":600,"height_mm":800,"components":[{"bmk":"-Q1","x_mm":20,"y_mm":50,"width_mm":40,"height_mm":80}]}}
GET /projects/{project_id}/schaltschrank/components Platzierte Komponenten im Schaltschrank

Response 200

[{"bmk":"-K1","label":"Hauptschuetz","x":100,"y":200,"width":45,"height":90,"row":2,"slot":3}]
GET /schaltschrank/{layout_id} Layout per ID laden

Laedt Schaltschrank-Layout unabhaengig vom Projekt-Kontext.

PUT /schaltschrank/{layout_id} Layout speichern

Request Body

{"components":[{"bmk":"-Q1","x":20,"y":50}],"din_rails":[{"y":80,"length_mm":400}]}
POST /schaltschrank/{layout_id}/pdf Bestuckungsplan als PDF
Response: application/pdf. Massstaebliche Zeichnung mit Bauteilpositionen und Beschriftung.

Motor-Datenblaetter

2 Endpoints
GET /projects/{project_id}/motor-datenblaetter Motordaten aus Schaltplan extrahieren

Response 200

{"ok":true,"data":[{"bmk":"-M1","label":"Hauptantrieb","power_kw":7.5,"voltage":"400V","current_a":15.2,"protection":"IP55","poles":4}]}
GET /projects/{project_id}/motor-datenblaetter/pdf Motordatenblaetter als PDF
Response: application/pdf. Alle Motoren mit technischen Kenndaten.

Statistik & Dashboard

2 Endpoints
GET /statistics Nutzungsstatistiken des Benutzers

Response 200

{"ok":true,"data":{"projects":12,"pages":48,"symbols_used":234,"exports_this_month":8,"storage_mb":45.2}}

Try it

GET /dashboard Dashboard-Daten (Projekte, Aktivitaet, Alarme)

Response 200

{"ok":true,"data":{"recent_projects":[...],"pending_tasks":3,"overdue_checks":1,"notifications":2}}

KI-Assistenz (DeepSeek & Gemini)

10 Endpoints
GET /ki/providers Verfuegbare KI-Anbieter und Status

Response 200

{"ok":true,"data":{"providers":[
  {"name":"deepseek","model":"deepseek-chat","status":"available","features":["generate","edit","chat","vde-check"]},
  {"name":"gemini","model":"gemini-2.0-flash","status":"available","features":["analyze-image","explain","generate","optimize"]}
]}}

Try it

POST /ki/generate Schaltplan aus Textbeschreibung generieren (DeepSeek)

Request Body

FeldTypPflichtBeschreibung
promptstringJaNatuerlichsprachliche Beschreibung (z.B. "Erstelle Direktstarter 4kW")
contextobjectNeinBestehendes canvas_data als Kontext

Response 200

{"ok":true,"data":{"elements":[
  {"type":"busline","y":80,"label":"L1","color":"#a0522d"},
  {"type":"symbol","symbolFile":"schuetze/contactor-3p.svg","x":200,"y":340,"bmk":"-K1"},
  {"type":"wire","segments":[{"x1":200,"y1":80,"x2":200,"y2":340}]}
],"description":"Direktstarter mit Hauptschuetz und Leitungsschutz"}}
Modell: deepseek-chat, temperature=0.3, max_tokens=4000. Timeout: 60s.

Try it

POST /ki/edit Bestehenden Schaltplan per Textbefehl aendern

Request Body

FeldTypPflichtBeschreibung
promptstringJaAenderungsbefehl (z.B. "Fuege zweite Sicherung ein")
elementsarrayJaAktuelle Canvas-Elemente
wiresarrayNeinAktuelle Leitungen

Response 200

{"ok":true,"data":{"add":[...],"remove":["el_3"],"modify":[{"id":"el_1","changes":{"label":"Neu"}}]}}
POST /ki/chat Chat mit KI-Assistent (Kontext-basiert)

Request Body

FeldTypBeschreibung
messagestringFrage/Nachricht an KI
historyarrayChat-Verlauf [{role:"user/assistant",content:"..."}]
contextobjectcanvas_data als Kontext fuer Fragen

Response 200

{"ok":true,"data":{"reply":"Um einen Stern-Dreieck-Starter zu ergaenzen...","suggestions":["Zeige mir den Anlasserkreis"]}}
POST /ki/smart-assist Intelligente Vorschlaege basierend auf aktuellem Schaltplan

Request Body

{"canvas_data":{"elements":[...],"wires":[...]},"mode":"complete"}

Modes: complete (Schaltplan vervollstaendigen), optimize (optimieren), errors (Fehler finden)

POST /ki/gemini/generate Schaltplan generieren via Gemini

Request Body

{"prompt":"Stern-Dreieck-Anlauf fuer 11kW Motor","model":"gemini-2.0-flash"}
Gleiche Response-Struktur wie /ki/generate. Verwendet Google Gemini statt DeepSeek.
POST /ki/gemini/analyze-image Schaltplan-Bild analysieren und digitalisieren

Request Body (JSON)

FeldTypBeschreibung
image_base64stringBase64-kodiertes Bild (JPG/PNG)
taskstringdescribe, extract_elements, convert_to_ecad

Response (task: convert_to_ecad)

{"ok":true,"data":{"elements":[...],"wires":[...],"confidence":0.87}}
POST /ki/gemini/explain Schaltplan erklaeren lassen

Request Body

{"canvas_data":{...},"level":"beginner"}

Levels: beginner, intermediate, expert

Response 200

{"ok":true,"data":{"explanation":"Der Schaltplan zeigt einen Direktstarter...","components_explained":[...],"safety_notes":[]}}
POST /ki/gemini/optimize Schaltplan optimieren (Kosten, Platz, Norm)

Request Body

{"canvas_data":{...},"goals":["cost","space","vde_compliance"]}

Response 200

{"ok":true,"data":{"suggestions":[{"type":"replace","bmk":"-Q1","current":"LS-Schalter 3-pol 16A","proposed":"LS-Schalter 3-pol 10A","reason":"Motorstrom 8A, 10A ausreichend","saving_eur":12.50}]}}

Annotationen & Kommentare

4 Endpoints
GET /projects/{project_id}/annotations Alle Annotationen eines Projekts

Response 200

[{"id":1,"text":"Hier PE-Anschluss pruefen","page_id":1,"x":200,"y":300,"author":"admin","created_at":"...","resolved":false}]
POST /projects/{project_id}/annotations Annotation hinzufuegen

Request Body

FeldTypPflichtBeschreibung
textstringJaKommentartext
page_idintegerJaSeiten-ID
xnumberNeinX-Position auf der Seite
ynumberNeinY-Position auf der Seite
bmk_refstringNeinReferenziertes Betriebsmittel
PUT /projects/{project_id}/annotations/{ann_id} Annotation bearbeiten / als erledigt markieren

Request Body

{"text":"Aktualisierter Text","resolved":true}
DELETE /projects/{project_id}/annotations/{ann_id} Annotation loeschen

Response 200

{"ok":true,"data":{"deleted":1}}

Berechtigungen (Projekt-Sharing)

3 Endpoints
GET /projects/{project_id}/permissions Berechtigungen abrufen

Response 200

[{"id":1,"user_id":2,"username":"mitarbeiter","role":"viewer","granted_at":"..."}]

Roles: viewer (nur lesen), editor (bearbeiten), admin (voller Zugriff)

POST /projects/{project_id}/permissions Berechtigung erteilen

Request Body

{"user_id":2,"role":"editor"}
DELETE /projects/{project_id}/permissions/{perm_id} Berechtigung entziehen

Response 200

{"ok":true,"data":{"deleted":1}}

Makros (Vordefinierte Schaltungsgruppen)

7 Endpoints
GET /macros Alle System-Makros

Verfuegbare System-Makros

IDNameKategorie
direktstarterDirektstarterMotorsteuerung
stern_dreieckStern-Dreieck-AnlaufMotorsteuerung
wendeschaltungWendeschaltungMotorsteuerung
sanftanlaufSanftanlaufMotorsteuerung
steckdosenabzweigSteckdosenabzweigNiederspannung
beleuchtungsabzweigBeleuchtungsabzweigNiederspannung
notaus_kreisNOT-AUS-KreisSicherheit

Try it

GET /macros/{macro_id} Makro-Details mit allen Elementen

Response 200

{"ok":true,"data":{"id":"direktstarter","name":"Direktstarter","elements":[
  {"symId":"ls3","dx":0,"dy":0,"w":60,"h":60,"label":"LS","bmk_prefix":"-Q"},
  {"symId":"contactor-3p","dx":0,"dy":120,"w":60,"h":60,"label":"Schuetz","bmk_prefix":"-K"}
],"wires":[...]}}

Try it

GET /macros/custom Eigene Makros

Response 200

[{"id":1,"name":"Mein Makro","category":"Custom","elements_count":5}]
POST /macros/custom Eigenes Makro erstellen

Request Body

FeldTypPflichtBeschreibung
namestringJaMakroname
elementsarrayJaElement-Definitionen
wiresarrayNeinLeitungs-Definitionen
categorystringNeinKategorie (default: "Custom")

Projekt- & Seitenvorlagen

6 Endpoints
GET /project-templates Projekt-Templates abrufen

Response 200

[{"id":"empty","name":"Leeres Projekt","pages_count":1},{"id":"maschine","name":"Maschinensteuerung","pages_count":4}]
POST /projects/from-template Projekt aus Vorlage erstellen

Request Body

{"name":"Neues Projekt","template_id":"maschine","description":"..."}
GET /api/page-templates Seiten-Templates abrufen

Response 200

[{"id":1,"name":"Motor A4 quer","format":"A4","orientation":"quer","element_count":8}]
GET /templates Schriftfeld-Templates

Response 200

[{"id":1,"name":"Standard A4","format":"A4","company_data":{"name":"","address":""},"logo_path":""}]

Benachrichtigungen

4 Endpoints
GET /notifications Alle Benachrichtigungen

Response 200

{"ok":true,"data":[{"id":1,"type":"prueftermin","message":"UVV-Pruefung faellig: Maschine X","read":false,"created_at":"...","project_id":1}],"unread_count":2}

Try it

PUT /notifications/{nid}/read  |  PUT /notifications/read-all Als gelesen markieren

Response 200

{"ok":true,"data":{"read":true}}
DELETE /notifications/{nid} Benachrichtigung loeschen

Response 200

{"ok":true,"data":{"deleted":1}}
POST /notifications/check-prueffristen Prueffristen manuell pruefen und Notifs erzeugen

Response 200

{"ok":true,"data":{"checked":12,"new_notifications":3,"overdue":1}}

Lesezeichen (Bookmarks)

4 Endpoints
GET /projects/{project_id}/bookmarks Lesezeichen eines Projekts

Response 200

[{"id":1,"label":"Motor-Hauptkreis","page_id":2,"page_number":2,"bmk":"-K1","x":200,"y":340}]
POST /projects/{project_id}/bookmarks Lesezeichen setzen

Request Body

{"label":"Wichtige Stelle","page_id":2,"bmk":"-K1","x":200,"y":340}
PUT /bookmarks/{bm_id} Lesezeichen bearbeiten

Request Body

{"label":"Neuer Name"}
DELETE /bookmarks/{bm_id} Lesezeichen loeschen

Response 200

{"ok":true,"data":{"deleted":1}}

Administration (Admin-Rolle erforderlich)

14 Endpoints
Alle /api/admin/* Endpoints erfordern die Admin-Rolle. Normale Benutzer erhalten 403 Forbidden.
GET /admin/users Alle Benutzer auflisten

Response 200

[{"id":1,"username":"admin","email":"...","role":"admin","created_at":"...","last_login":"...","project_count":12}]

Try it

POST /admin/users Neuen Benutzer erstellen

Request Body

FeldTypPflichtBeschreibung
usernamestringJaEindeutiger Benutzername
passwordstringJaInitialpasswort (min. 6 Zeichen)
emailstringNeinE-Mail-Adresse
rolestringNeinuser (default), admin
company_namestringNeinFirmenname
GET /admin/users/{user_id} Benutzer-Details

Response 200

{"ok":true,"data":{"id":2,"username":"user2","email":"...","role":"user","projects":[...],"last_login":"..."}}
PUT /admin/users/{user_id} Benutzer bearbeiten (Rolle, Status, ...)

Request Body

{"role":"admin","email":"new@example.com","is_active":true}
DELETE /admin/users/{user_id} Benutzer loeschen
Loescht Benutzer und ALLE zugehoerigen Projekte und Seiten unwiderruflich.
POST /admin/users/{user_id}/reset-password Passwort zuruecksetzen

Request Body

{"new_password":"NeuesPasswort123"}
POST /admin/backup/create Datenbank-Backup erstellen

Response 200

{"ok":true,"data":{"filename":"backup_20260324_120000.db","size_mb":45.2,"created_at":"2026-03-24T12:00:00"}}

Try it

GET /admin/backup/list Verfuegbare Backups auflisten

Response 200

{"ok":true,"data":{"backups":[{"filename":"backup_20260324.db","size_mb":45.2,"created_at":"..."}]}}

Try it

GET /admin/backup/download/{filename} Backup herunterladen
Response: application/octet-stream Datei-Download.
POST /admin/backup/restore Backup einspielen

Request Body

{"filename":"backup_20260324.db"}
Ueberschreibt die gesamte aktuelle Datenbank. Server-Neustart empfohlen.
GET /admin/db-stats Datenbank-Statistiken

Response 200

{"ok":true,"data":{"size_mb":45.2,"users":5,"projects":48,"pages":192,"symbols":234,"last_vacuum":"2026-03-20"}}

Try it

POST /admin/symbols/reindex Symbol-Index neu aufbauen
Scannt das Dateisystem und aktualisiert die Symbol-Datenbank. Benoetigt einige Sekunden.
POST /admin/catalog/import-csv Artikelkatalog aus CSV importieren

Request

Multipart-Upload: file-Feld mit CSV. Erwartete Spalten: artikelnr;name;manufacturer;price;unit;category

Health, Dashboard & Sonstiges

4 Endpoints
GET /health Service-Health (kein Login noetig)

Response 200

{"ok":true,"data":{"status":"ok","service":"benning-ecad","version":"1.0.0","db":"ok","uptime_s":86400}}

Try it

GET /api/v2/openapi.json  |  /openapi.yaml OpenAPI 3.0 Spezifikation (nur v2)
Maschinenlesbare OpenAPI 3.0 Spezifikation. Nutzbar mit Swagger UI, Postman, etc. Kein Login erforderlich.
GET /projects/{project_id}/fehlerstrom-analyse & andere Analyse-Endpoints Weitere Analyse-Endpoints (Verteilerplan, Schaltschrank)
EndpointMethodeFunktion
/projects/{id}/verteilerplanPOSTVerteilerplan generieren
/projects/{id}/verteilerplan/pdfPOSTVerteilerplan als PDF
/projects/{id}/fehlerstrom-analysePOSTRCD-Dimensionierung
/api/pruefkalender/check-fristenPOSTAlle Fristen pruefen
/projects/{id}/import/csvPOSTKomponentenliste importieren

Keine Endpoints gefunden

Suche anpassen oder