API Dokumentation
Vollstaendige Referenz der Benning E-CAD REST API. Alle Endpoints benoetigen eine aktive Session (Cookie-basiert), ausser /auth/login und /health.
session Cookie gesetzt. Alle weiteren Requests benoetigen diesen Cookie. Alle Endpoints ausser POST /auth/login und GET /health liefern 401 wenn nicht angemeldet. Response-Format: {"ok": true/false, "data": ..., "error": "..."}
Authentifizierung
3 EndpointsRequest Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| username | string | Ja | Benutzername |
| password | string | Ja | Passwort |
| remember | boolean | Nein | Session dauerhaft merken (default: false) |
Response 200
{ "ok": true, "data": { "id": 1, "username": "admin", "email": "...", "company_name": "..." } }
Response 401 - Ungueltige Anmeldedaten
{ "ok": false, "error": "Ungueltige Anmeldedaten" }
Try it
Request
Kein Body erforderlich. Benoetigt aktive Session.
Response 200
{ "ok": true, "data": { "message": "Abgemeldet" } }
Try it
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
Projekte
5 EndpointsResponse 200
[{ "id": 1, "user_id": 1, "name": "Maschinensteuerung", "description": "...", "page_count": 3, "created_at": "...", "updated_at": "...", "is_favorite": false }]
Try it
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| name | string | Ja | Projektname |
| description | string | Nein | Beschreibung |
| page_format | string | Nein | A4 (default), A3, A2 |
| orientation | string | Nein | quer (default), hoch |
Response 201
{ "ok": true, "data": { "id": 42, "name": "Mein Projekt", "page_count": 1, ... } }
Try it
URL Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| project_id | integer | Ja | Projekt-ID |
Response 200
{ "ok": true, "data": { "id": 1, "name": "...", "pages": [{ "id": 1, "page_number": 1, "title": "Seite 1", "canvas_data": {...} }] } }
Try it
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| name | string | Nein | Neuer Name |
| description | string | Nein | Neue Beschreibung |
Response 200
{ "ok": true, "data": { "id": 1, "name": "Neuer Name", ... } }
Response 200
{ "ok": true, "data": { "deleted": 1 } }
Hinweis
Loescht unwiderruflich alle Seiten, Elemente und Revisionen des Projekts.
Seiten (SchaltplanPages)
7 EndpointsResponse 200
[{ "id": 1, "project_id": 1, "page_number": 1, "title": "Seite 1", "page_format": "A4", "orientation": "quer", "canvas_data": { "elements": [], "wires": [] } }]
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| title | string | Nein | Seitentitel (default: "Seite N") |
| page_format | string | Nein | A4, A3, A2 (default: A4) |
| orientation | string | Nein | quer, hoch (default: quer) |
| canvas_data | object | Nein | Initiale 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" }
]
}
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| canvas_data | object | Nein | Gesamter Canvas-Inhalt |
| title | string | Nein | Neuer Seitentitel |
| page_format | string | Nein | A4, A3, A2 |
| orientation | string | Nein | quer, hoch |
Revisions-System
Jede Speicherung erstellt automatisch einen Revisions-Snapshot in canvas_data._versions[]. Max. 20 Revisionen werden gespeichert.
Response 200
[{ "timestamp": "2026-03-23T12:00:00", "elements": [...], "wires": [...] }]
Response 200
{ "ok": true, "data": { "restored": true, "timestamp": "2026-03-23T12:00:00" } }
Response 200
{ "ok": true, "data": { "deleted": 5 } }
Response 400 - Letzte Seite
{ "ok": false, "error": "Mindestens eine Seite muss vorhanden sein" }
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| page_number | integer | Ja | Neue Seitennummer |
Symbole
4 EndpointsQuery Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| category | string | Nein | Kategorie-Filter (z.B. "Schuetze") |
| search | string | Nein | Suche in Name, Beschreibung, IEC-Nummer |
Response 200
[{ "id": 1, "name": "Schuetz 3-polig", "category": "Schuetze", "subcategory": "", "description": "...", "iec_number": "IEC 60617", "tags": ["motor", "3ph"], "is_custom": false }]
Try it
Response 200
{ "ok": true, "data": { "categories": [{ "name": "Schuetze", "symbols": [...], "count": 12 }] } }
Try it
Response
Content-Type: image/svg+xml. Gibt das SVG direkt zurueck (kein JSON-Wrapper).
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| name | string | Ja | Symbolname |
| category | string | Ja | Kategorie |
| svg_data | string | Ja | SVG-Quellcode (wird sanitized) |
| description | string | Nein | Beschreibung |
| iec_number | string | Nein | IEC 60617 Nummer |
| tags | array | Nein | Tags fuer Suche |
Sicherheitshinweis
SVG-Daten werden vor dem Speichern automatisch sanitized: <script>, <foreignObject> und javascript: URLs werden entfernt.
Export & Dokumentation
10 EndpointsRequest Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| pages | array[int] | Nein | Seiten-IDs zum Export. Leer = alle Seiten |
| company | object | Nein | Firmendaten fuer Schriftfeld |
| with_schriftfeld | boolean | Nein | DIN-Schriftfeld einblenden (default: true) |
Response
Content-Type: application/pdf. Direkt als Datei-Download.
Inhalt des generierten PDFs
1. Deckblatt (A3 quer, DIN EN 61082) • 2. Inhaltsverzeichnis • 3. Alle Schaltplan-Seiten • 4. Stueckliste (BOM) • 5. Klemmplan • 6. Kabelplan • 7. Pruefprotokoll-Vorlage nach VDE 0100-600
Response
Content-Type: application/pdf
Response 200
{ "ok": true, "data": { "items": [{ "Pos": 1, "BMK": "-Q1", "Bezeichnung": "Leitungsschutzschalter", "Hersteller": "", "Bestellnummer": "", "Symbol": "ls3", "Seite": "Seite 1", "Menge": 1 }], "total": 5 } }
Try it
Response
Content-Type: text/csv; charset=utf-8. Semikolon-separiert, UTF-8 BOM fuer Excel.
Response 200
{ "ok": true, "data": { "terminals": [...], "groups": { "X1": [...] }, "total": 12, "project": "Mein Projekt" } }
Response
Content-Type: application/pdf
Response 200
{ "ok": true, "data": { "cables": [{ "number": "1", "potential": "L1", "cable": "", "cross_section": "1.5", "color": "#a0522d", "page": "Seite 1", "length_approx": 250, "from_bmk": "-Q1", "to_bmk": "-K1" }], "total": 8, "total_length_mm": 2400 } }
Response 200
{ "ok": true, "data": { "references": [{ "bmk": "-K1", "label": "Hauptschuetz", "symbol": "main_contactor", "occurrences": [{"page": "Seite 1", "page_number": 1, "x": 200, "y": 340}] }], "total": 5, "multi_page": [...] } }
URL Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
| bmk | string | BMK-Bezeichner (z.B. "-K1") |
Response 200
{ "ok": true, "data": { "bmk": "-K1", "contacts": [{ "contact_nr": "13", "type": "NO", "page": "Seite 2", "connected_to": "-F1" }] } }
Request Body (JSON)
| Feld | Typ | Beschreibung |
|---|---|---|
| anlage | string | Anlagenbezeichnung |
| standort | string | Standort der Anlage |
| auftraggeber | string | Auftraggeber |
| pruefer | string | Name des Pruefers |
| datum | string | Pruef-Datum (DD.MM.YYYY) |
| norm | string | Pruefnorm (default: "VDE 0100-600") |
| messungen | array | Messergebnisse |
KI / DeepSeek Integration
4 EndpointsRequest Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| prompt | string | Ja | Natuerlichsprachliche Beschreibung (z.B. "Erstelle einen Direktstarter fuer einen 4kW Motor") |
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}] }
] } }
Modell
DeepSeek Chat API (deepseek-chat), temperature=0.3, max_tokens=4000. Timeout: 60s.
Try it
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| prompt | string | Ja | Aenderungsbefehl (z.B. "Fuege eine zweite Sicherung hinzu") |
| elements | array | Ja | Aktuelle Canvas-Elemente |
Response 200
{ "ok": true, "data": { "add": [...], "remove": [...], "modify": [...] } }
Request Body (JSON)
| Feld | Typ | Beschreibung |
|---|---|---|
| elements | array | Canvas-Elemente |
| wires | array | Leitungen |
Response 200
{ "ok": true, "data": { "issues": [{ "type": "warning", "message": "...", "rule": "VDE 0100" }], "score": 85 } }
Request Body
{ "bmk": "-K1" }
Response 200
{ "ok": true, "data": { "unique": false, "existing_pages": [1, 3] } }
Makros, Templates & Sonstiges
7 EndpointsResponse 200
{ "ok": true, "data": { "status": "ok", "service": "benning-ecad", "version": "1.0.0" } }
Try it
Verfuegbare Makros
| ID | Name | Kategorie | Elemente |
|---|---|---|---|
| direktstarter | Direktstarter | Motorsteuerung | 4 |
| stern_dreieck | Stern-Dreieck-Anlauf | Motorsteuerung | 7 |
| wendeschaltung | Wendeschaltung | Motorsteuerung | 5 |
| steckdosenabzweig | Steckdosenabzweig | Niederspannung | 5 |
| beleuchtungsabzweig | Beleuchtungsabzweig | Niederspannung | 4 |
Try it
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" }], "wires": [] } }
Response 200
[{ "id": "empty", "name": "Leeres Projekt", "description": "...", "pages_count": 1 }]
Request Body (JSON)
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| name | string | Ja | Projektname |
| template_id | string | Nein | Template-ID (default: "empty") |
| description | string | Nein | Projektbeschreibung |
Response 200
[{ "id": 1, "name": "Standard A4", "format": "A4", "company_data": {}, "logo_path": "" }]
Response 200
{ "ok": true, "data": { "potentials": { "L1": [{ "page": "Seite 1", "direction": "out" }] } } }