🔐 Authentifizierung
POST /login Anmelden und JWT-Token erhalten Kein Token nötig
FeldTypPflichtBeschreibung
kundennrstringz.B. SC-XXXXXXXXXX
mitarbeiterNrstringz.B. SC-XXXX-XXXX
passwordstringPasswort des Mitarbeiters
pushTokenstringExpo Push Token (ExponentPushToken[...])
deviceTypestringios / android
deviceNamestringGerätename
{
  "kundennr": "SC-XXXXXXXXXX",
  "mitarbeiterNr": "SC-XXXX-XXXX",
  "password": "mitarbeiterpassword"
}
{
  "success": true,
  "token": "eyJrdW5kZW5uciI6IlNDLTU2OTcwOTk1MDEi...",
  "expiresIn": 86400,
  "user": {
    "id": 1,
    "mitarbeiterNr": "SC-XXXX-XXXX",
    "vorname": "Max",
    "nachname": "Mustermann",
    "rolle": "Admin",
    "kundennr": "SC-XXXXXXXXXX",
    "unternehmen": "Mein Restaurant"
  }
}
GET /health Server-Status prüfen Kein Token nötig
{ "status": "ok", "version": "2.0.0" }
📊 Dashboard
GET /dashboard Tagesstatistiken laden 🔑 Token
{
  "success": true,
  "stats": {
    "mitarbeiter_status": { "total_mitarbeiter": 8, "anwesend": 3, "pause": 1, "urlaub": 1, "krank": 0 },
    "bestellungen": { "gesamt": 24, "neu": 3, "tagesumsatz": 892.50 },
    "reservierungen_heute": 5,
    "aktuelle_gaeste": 12,
    "freie_tische": 8,
    "aktive_rufe": 1,
    "neue_urlaubsantraege": 2
  }
}
🧾 Bestellungen /orders
GET /orders Bestellungen laden 🔑 Token
ParameterTypDefaultWerte
statusstringalleneu · in_bearbeitung · kassenbon · abgeschlossen
# Alle Bestellungen
GET /orders

# Nur neue Bestellungen
GET /orders?status=neu

# Bezahlte Bons
GET /orders?status=kassenbon
POST /orders Neue Bestellung erstellen 🔑 Token
{
  "tischnr": 3,
  "items": [
    { "name": "Schnitzel", "quantity": 2, "price": 18.90 },
    { "name": "Cola", "quantity": 2, "price": 3.50 }
  ]
}
PUT /orders Bestellung aktualisieren 🔑 Token
{ "id": 42, "status": "in_bearbeitung" }
DELETE /orders Bestellung löschen 🔑 Token
{ "id": 42 }
📅 Reservierungen /reservations
GET /reservations Reservierungen laden 🔑 Token
ParameterDefaultWerte
statusaktivaktiv · storniert · no_show · alle
datumheuteYYYY-MM-DD
# Aktive Reservierungen heute
GET /reservations

# Für bestimmtes Datum
GET /reservations?datum=2026-03-15&status=aktiv
POST /reservations Neue Reservierung erstellen 🔑 Token
{
  "gast_name": "Familie Müller",
  "datum": "2026-03-15",
  "uhrzeit": "19:00",
  "anzahl_gaeste": 4,
  "tischnr": 5,
  "info": "Fensterplatz gewünscht",
  "farbe": "#3B82F6"
}
PUT /reservations Reservierung ändern oder Status setzen 🔑 Token
{ "id": 10, "action": "confirm" }
DELETE /reservations Reservierung löschen 🔑 Token
{ "id": 10 }
👥 Mitarbeiter /employees
GET /employees Alle Mitarbeiter laden Admin · Filialleitung
{
  "employees": [{
    "id": 1, "mitarbeiter_nr": "SC-XXXX-XXXX",
    "vorname": "Max", "nachname": "Mustermann",
    "rolle": "Admin", "aktiv": true,
    "status": "Anwesend", "status_color": "success"
  }]
}
POST /employees Neuen Mitarbeiter anlegen Admin · Filialleitung
{
  "vorname": "Anna", "nachname": "Schmidt",
  "email": "anna@restaurant.de",
  "rolle": "Service",
  "position": "Servicekraft",
  "urlaubstage": 30
}
→ Response enthält temp_password für Erstanmeldung
PUT /employees Mitarbeiter bearbeiten Admin · Filialleitung
{ "id": 2, "action": "update", "rolle": "Kasse", "vorname": "Anna" }
DELETE /employees Mitarbeiter deaktivieren (nicht löschen) Admin · Filialleitung
{ "id": 2 }
📆 Schichtplan /shifts
GET /shifts?week_start=2026-03-11 Schichtplan für Woche laden 🔑 Token
GET /shifts?week_start=2026-03-11
POST /shifts Schicht erstellen (Einzel oder Serie) Admin · Filialleitung
{
  "action": "single",
  "mitarbeiter_id": 2,
  "datum": "2026-03-15",
  "schicht_start": "08:00",
  "schicht_ende": "16:00",
  "schicht_typ": "Früh"
}
PUT /shifts Schicht bearbeiten Admin · Filialleitung
{ "id": 5, "schicht_start": "09:00", "schicht_ende": "17:00" }
DELETE /shifts Schicht löschen Admin · Filialleitung
{ "id": 5 }
🌴 Urlaub /vacation
GET /vacation Urlaubsanträge laden 🔑 Token
GET /vacation?type=my    # Eigene Anträge
GET /vacation?type=all   # Alle (Admin/Filialleitung)
POST /vacation Antrag einreichen / genehmigen / ablehnen 🔑 Token
{ "action": "submit_request", "von_datum": "2026-04-01", "bis_datum": "2026-04-05", "art": "urlaub" }
⏱️ Zeiterfassung /timetracking
GET /timetracking Zeiterfassung laden 🔑 Token
GET /timetracking?type=today                          # Heutiger Status
GET /timetracking?type=month&month=2026-03            # Monatsübersicht
GET /timetracking?type=overview                       # Gesamtübersicht
GET /timetracking?type=employee&mitarbeiter_id=2      # Einzelner MA
POST /timetracking Stempeln, Pause, Abwesenheit 🔑 Token
{ "action": "clock_in", "mitarbeiter_id": 2 }
DELETE /timetracking Eintrag löschen Admin · Filialleitung
{ "id": 15 }
📦 SmartCubes Hardware /hardware
GET /hardware Alle SmartCubes laden 🔑 Token
{
  "hardware": [{ "id": 1, "tischnr": 3, "helligkeit": 50, "ruf": "inaktiv", "batterie": 85 }],
  "slot_info": { "total_slots": 10, "used_slots": 7, "available_slots": 3 },
  "stats": { "online": 7, "aktive_rufe": 1 }
}
POST /hardware SmartCube hinzufügen oder Aktion ausführen 🔑 Token
{ "tischnr": 8, "helligkeit": 50 }
PUT /hardware SmartCube bearbeiten 🔑 Token
{ "id": 1, "tischnr": 4, "helligkeit": 80 }
DELETE /hardware SmartCube entfernen 🔑 Token
{ "id": 1 }
💰 Kassensystem /cash
GET /cash Kassendaten laden 🔑 Token
GET /cash?type=tables                        # Tischübersicht
GET /cash?type=order_details&tischnr=3      # Bestelldetails Tisch 3
GET /cash?type=mitarbeiter                   # MA-Liste für PIN-Login
POST /cash Kassen-Aktionen 🔑 Token
{ "action": "verify_pin", "mitarbeiter_id": 2, "pin": "1234" }
🍴 Service / Tischverwaltung /service
GET /service Tische und Bestellungen laden 🔑 Token
GET /service?action=get_tables              # Alle Tische
GET /service?action=get_order&tischnr=3    # Bestellung Tisch 3
POST /service Service-Aktionen 🔑 Token
{ "action": "add_item", "tischnr": 3, "produkt_id": 15, "anzahl": 2, "notizen": "ohne Zwiebeln" }
🖨️ Kassenabschluss /kassenabschluss
POST /kassenabschluss S/T/X/Z-Bon, Kassenstand Admin · Filialleitung
{ "action": "print_x_bon" }
👤 Profil /profile
GET /profile Eigenes Profil laden 🔑 Token
GET /profile
POST /profile Profil, Passwort oder PIN ändern 🔑 Token
{ "action": "update_profile", "vorname": "Max", "nachname": "Mustermann", "email": "max@demo.de" }
⚙️ Einstellungen
GETPOST /settings Kassen-Einstellungen Admin · Filialleitung
# Speichern
{ "action": "save_settings", "auto_lock_minutes": 5, "sound_enabled": true, "cloudprnt_enabled": true, "printer_mac": "AA:BB:CC:DD:EE:FF" }

# Testdruck
{ "action": "test_cloudprnt", "printer_mac": "AA:BB:CC:DD:EE:FF", "printer_name": "Bondrucker" }
GETPOST /restaurant Restaurant-Stammdaten & Öffnungszeiten Admin
# Infos speichern
{ "action": "save_info", "restaurantname": "Mein Restaurant", "plz": "75172", "ort": "Pforzheim", "ustid": "DE123456789" }

# Öffnungszeiten speichern
{ "action": "save_opening_hours", "opening_hours": { "montag": { "offen": true, "von": "11:00", "bis": "22:00" } } }
GETPOST /kassenbon-settings Kassenbon Logo, QR, Öffnungszeiten Admin · Filialleitung
{ "action": "save_settings", "logo_enabled": true, "qr_enabled": true, "qr_url": "https://mein-restaurant.de", "opening_hours_mode": "today" }
GETPOST /reservation-settings Auto-Cancel Einstellungen Admin · Filialleitung
{ "action": "save_settings", "auto_cancel_enabled": true, "auto_cancel_minutes": 30 }
GETPOST /payment-methods Zahlungsmethoden konfigurieren Admin
{ "action": "save_payment_method", "method": "karte", "enabled": true, "config": {} }
Methoden: bar · karte · paypal · stripe · stripe_terminal
GETPOST /printer-settings Bluetooth + CloudPRNT Drucker Admin · Filialleitung
{ "action": "save_settings", "cloudprnt_enabled": true, "cloudprnt_printer_mac": "AA:BB:CC:DD:EE:FF" }
{ "action": "test_cloudprnt", "printer_mac": "AA:BB:CC:DD:EE:FF" }
📄 Verträge & Rechnungen
GETPOST /contracts Verträge verwalten 🔑 Token
# Hardware bestellen
{ "action": "order_hardware", "anzahl": 5 }

# Kündigen
{ "action": "cancel_contract", "contract_id": 1 }

# Reaktivieren
{ "action": "reactivate_contract", "contract_id": 1 }
GETPUT /invoices Rechnungen laden und Status ändern 🔑 Token
GET /invoices                   # Alle Rechnungen
GET /invoices/pdf?invoice_id=5  # PDF Download

# Status ändern (PUT)
{ "id": 5, "status": "Bezahlt" }
GETPOST /payment-data Bankverbindung / SEPA Admin
{ "kontoinhaber": "Max Mustermann", "iban": "DE89370400440532013000", "bic": "COBADEFFXXX", "sepa_mandat": true, "abrechnungstag": 1 }
🔒 TSE & Steuer-Export
GETPOST /tse-config Fiskaly TSE konfigurieren Admin · Filialleitung
# Verbindung testen
{ "action": "test_connection" }

# TSS erstellen (vollautomatisch)
{ "action": "create_tss", "tss_id": "meine-tss-id", "description": "SmartCube TSS" }

# TSS initialisieren
{ "action": "initialize_tss" }

# Client anlegen
{ "action": "create_client", "client_id": "client-001", "serial_number": "SmartCube-001" }

# Status abrufen
{ "action": "get_status" }
GETPOST /dsfinvk DSFinV-K Export Admin · Filialleitung
GET /dsfinvk?action=list
GET /dsfinvk?action=status&export_id=abc-123
GET /dsfinvk?action=download&export_id=abc-123  → TAR Download

# Export starten (POST)
{ "action": "start_export", "start_date": "2026-03-01", "end_date": "2026-03-31" }
GETPOST /tse-tar TSE TAR Export Admin · Filialleitung
GET /tse-tar?action=list
GET /tse-tar?action=status&export_id=abc-123

# Kompletter Export (POST)
{ "action": "start_export" }

# Zeitraum-Export (POST)
{ "action": "start_export", "start_date": "2026-03-01", "end_date": "2026-03-31" }
GETPOST /datev DATEV cashregister Import Admin · Filialleitung
GET /datev?action=list
GET /datev?action=status&import_id=42

# Import starten (POST)
{ "action": "start_import", "start_date": "2026-03-01", "end_date": "2026-03-31", "sandbox": true }
📈 Statistiken
GET /tischauslastung Tischauslastung & Verweildauer 🔑 Token
GET /tischauslastung?zeitraum=day    # Heute
GET /tischauslastung?zeitraum=week   # Diese Woche
GET /tischauslastung?zeitraum=month  # Dieser Monat
{
  "stats": { "auslastung_prozent": 60.0, "belegte_tische": 6, "umsatz_gesamt": 634.50 },
  "tische": [{ "tischnr": 3, "umsatz": 187.60, "avg_verweildauer_min": 52.5 }],
  "hourly": [{ "stunde": 12, "tische": 3, "bestellungen": 5 }]
}
GET /umsatz Umsatz-Statistik mit Mitarbeiter-Vergleich 🔑 Token
GET /umsatz?zeitraum=day|week|month
{
  "totals": { "umsatz_gesamt": 892.50, "umsatz_bar": 534.00, "umsatz_ec": 358.50, "stornos": 1 },
  "top_items": [{ "name": "Schnitzel", "menge": 12, "umsatz": 226.80 }],
  "mitarbeiter": [{ "name": "Max M.", "bestellungen": 15, "umsatz": 567.00 }],
  "daily": [{ "datum": "2026-03-14", "umsatz": 892.50 }]
}
GET /wartezeiten Wartezeiten & P-Smart Score 🔑 Token
GET /wartezeiten?zeitraum=day|week|month
{
  "stats": { "avg_wartezeit_min": 12.5, "psmart_score": 87.5 },
  "verteilung": { "unter_5min": 3, "von_5_15min": 14, "von_15_30min": 6, "ueber_30min": 1 },
  "ausreisser": [{ "tischnr": 7, "wartezeit_min": 38 }]
}
⚠️ Fehlercodes
CodeBedeutungUrsache
200OKErfolgreich
201CreatedRessource wurde erstellt
400Bad RequestFehlende oder ungültige Felder
401UnauthorizedKein Token / Token abgelaufen
403ForbiddenFalsche Rolle / keine Berechtigung
404Not FoundRessource nicht gefunden
500Internal Server ErrorServerfehler / DB-Fehler
502Bad GatewayExterner API-Fehler (Fiskaly, DATEV)
# Fehler-Response Format:
{ "detail": "Fehlermeldung hier" }