Modulares ERP für Elektrohandwerksbetriebe (Bootlabs)
Volt führt Rechnungen & operative Belege · Lexware optional (Sync) · Operativer Tagesbetrieb in Volt
Was ist Volt? · Module · Installation · Kernfunktionen · Wo finde ich was? · Backups · Skripte · Troubleshooting · API
- Was ist Volt?
- Module (M01–M12)
- Architektur
- Installation & Ersteinrichtung
- Kernfunktionen einrichten
- Wo finde ich was?
- Datenbank, Redis & Umgebung
- Skripte & Befehle
- Entwicklung & Qualität
- Production, Updates & Backups
- Troubleshooting
- Integrationen (Kurzüberblick)
- Subunternehmer (Plantafel)
- Dokumentation (Wiki)
- DSGVO & Security
- REST-API
Volt ist ein modulares ERP für deutsche Elektrohandwerksbetriebe. Es bündelt den operativen Tagesbetrieb in einer Oberfläche — von Kunden und Projekten über Einsatzplanung und Zeiterfassung bis zu Material, Service und Schnittstellen.
| Prinzip | Bedeutung |
|---|---|
| Lexware = Buchhaltung | Rechnungswesen, offizielle Buchführung und Steuerexport bleiben in Lexware Office. Volt liest/schreibt dort über die API und cached Dokumente lokal. |
| Volt = Tagesgeschäft | CRM, Projekte, Plantafel, Monteur-App, Lager, Angebote, Kundenportal, Integrationen. |
| Modular | Funktionen sind in M01–M12 gegliedert; Feature-Flags und RBAC schalten Bereiche pro Rolle frei. |
| DSGVO | Hosting in Deutschland; Audit-Logs auf kritischen Entitäten; verschlüsselte Integrations-Tokens. |
| Bereich | Funktionen |
|---|---|
| Stammdaten | Kunden, Leads, Kontakte, Kundenaktivitäten-Timeline, Mitarbeiter, Lieferanten, Subunternehmer, Stundensätze |
| Projekte | Aufträge PRJ-YYYY-NNN, LV/GAEB, Aufmaß, Material, Lohn, Rechnungen, Dokumente |
| Vertrieb | Angebote, Vorlagen, PDF-Import, Punch-Out (OCI/IDS), Kundenportal |
| Planung | Plantafel, Terminplanung, Abwesenheiten, Outlook-Kalender-Sync |
| Feld | Monteur-UI, Zeiterfassung, Checklisten, Fotos, Offline-Sync |
| Lager | Materialkatalog, Bewegungen, Bestellungen, Meldebestände |
| Service | Serviceaufträge, Wartungsverträge, E-Check, PV-Protokolle |
| Controlling | KPI-Dashboard, DB I/II, Wochenstandup, Exporte (CSV, DATEV, Lexware) |
| Admin | Benutzer, RBAC-Matrix, Integrationen, System-Doctor, Updates |
Roadmap & Reifegrad: docs/ROADMAP-READINESS-M01-M12.md · M01–M06 im Tagesbetrieb · M07–M12 in aktiver Ausbauphase.
| Modul | Name | UI (typisch) | Kurzbeschreibung |
|---|---|---|---|
| M01 | Admin & System | /admin/*, /system |
Benutzer, Firmeneinstellungen, Feature-Flags, Integrationen, Backup, Updates |
| M02 | KPI-Dashboard | /dashboard |
Projekt-Ampeln, Rolling-Overview, Wochenbericht / Standup |
| M03 | CRM & Stammdaten | /customers, /leads, /communications |
Kunden, Kontakte, Leads, Kommunikation, Bewertungen, Kundenportal, Aktivitäten-Timeline |
| M04 | Aufträge & Projekte | /projects |
Projekte, LV, Angebote im Projekt, Material, Lohn, Rechnungen, GAEB |
| M05 | Import & Export | /imports, Export-Menü |
CSV, Lexware, DATANORM, GAEB; DATEV/SP-Data-Export |
| M06 | Einsatzplanung | /deployment-planner |
Plantafel, Einsätze, Ressourcen, Abwesenheiten |
| M07 | Field App | /monteur/*, OpenAPI /docs/field-app |
Monteur-Zeiten, Einsätze, Checklisten, QR, Offline |
| M08 | Material & Lager | /materials, /purchase-orders |
Katalog, Bewegungen, Bestellungen, Reservierungen |
| M09 | Service & Wartung | /service/*, /e-check, /pv |
Serviceaufträge, Wartung, EMA, E-Check, PV |
| M10 | Automatisierung | Admin → Automatisierung | Workflows, n8n-Trigger, Ollama (LV-Analyse, optional CRM-Zusammenfassung) |
| M11 | Schnittstellen | Admin → Integrationen | Lexware, Outlook, GAEB, IDS, DATEV, Lieferanten |
| M12 | Telefonie | /telephony |
Anrufe, Rückruf-Aufgaben, Webhooks, Aufzeichnungen |
Zusätzliche Vertragsmodule (Messprotokolle, EMA-Wartung, Solo-Zeiterfassung): siehe Roadmap-Dokument.
Volt bündelt CRM-Funktionen ohne separates Vertriebs-CRM: Stammdaten, Kommunikationslog und eine gemeinsame Aktivitäten-Timeline aus bestehenden Quellen (kein zusätzliches Activity-Datenmodell).
| Quelle | Inhalt in der Timeline |
|---|---|
Kommunikation (communication_entry) |
E-Mail, SMS, Telefon, Notizen — manuell oder auto bei Angebot/Mahnung |
Telefonie (telephony_call_log, M12) |
Anrufe inkl. Transkript-Hinweis, wenn Modul aktiv |
| Leads | Anlage und Aktualisierung (Status, Quelle) |
Bewertungen (customer_review) |
Veröffentlichte Kundenbewertungen |
Navigation (Sidebar): aufklappbare Gruppe Kunden mit Unterpunkten Kunden, Leads, Kommunikation, Kundenportal, Bewertungen (je nach Feature-Flag).
| UI | Pfad / Tab | Timeline-Kontext |
|---|---|---|
| Kundendetail | /customers/:id → Tab Aktivitäten |
customerId |
| Lead-Detail | /leads/:id (unter dem Formular) |
leadId (+ Anrufe des verknüpften Kunden) |
| Projekt-Detail | /projects/:id/activities |
projectId |
| Globale Liste | /communications |
manuelles Logging, Filter in der Timeline pro Kontext |
API (aggregiert, chronologisch):
| Methode | Pfad | Parameter |
|---|---|---|
GET |
/api/v1/crm/activities |
genau einer: customerId, leadId oder projectId; optional channel, limit, offset |
POST |
/api/v1/crm/activities/summarize |
gleicher Kontext; optional activityLimit (max. 50) |
Notizen direkt aus der Timeline: legt einen communication_entry mit channel=note an (MODULE_KOMMUNIKATION).
Feature-Flags (Admin → Module):
| Flag | Bündel | Default | Wirkung |
|---|---|---|---|
MODULE_CRM |
CRM & Kunden | an | Kunden, Kundendetail, Timeline pro Kunde |
MODULE_LEADS |
CRM & Kunden | aus | Leads, Lead-Timeline |
MODULE_KOMMUNIKATION |
CRM & Kunden | an | /communications, Notiz-Quick-Action, Projekt-Tab Aktivitäten |
MODULE_REVIEWS |
CRM & Kunden | an | Bewertungen in Timeline und Navigation |
MODULE_KUNDENPORTAL |
CRM & Kunden | aus | Kundenportal-Admin in Sidebar-Gruppe |
MODULE_TELEFONIE |
Telefonie | aus | Anrufe in Kunden-Timeline (M12) |
MODULE_AUTOMATISIERUNGEN |
Automatisierung & KI | an | Basis für Ollama-Features |
OLLAMA_CRM_ASSISTANT |
Automatisierung & KI | aus | Button „KI-Zusammenfassung“ in der Timeline |
OLLAMA_LV_ANALYSIS |
Automatisierung & KI | aus | LV-KI in Projektdokumenten (unabhängig vom CRM) |
KI-Zusammenfassung aktivieren: Admin → Module → Bündel Automatisierung & KI → OLLAMA_CRM_ASSISTANT einschalten; Ollama unter Einstellungen → Schnittstellen → Ollama konfigurieren (siehe Ollama & n8n). Die Zusammenfassung ist ein Vorschlag — es werden weder Status noch E-Mails automatisch geändert.
| Bereich | Technologie |
|---|---|
| Runtime | Node.js 24 LTS, TypeScript 5.9 (strict) |
| Monorepo | pnpm 11 Workspaces (packageManager in package.json) |
| Backend | Fastify 5, Prisma 6, Zod 4, JWT + Argon2id, BullMQ + Redis 8 |
| Frontend | React 19, Vite 7, TanStack Query 5, Tailwind 4, shadcn/ui |
| Datenbank | PostgreSQL 18 |
| API | /api/v1 · Fehler als RFC 7807 · Geld in Cent (bigint) · IDs als UUID v7 |
apps/backend/ API, Prisma, Services, Lexware-Sync, BullMQ-Worker
apps/frontend/ React-SPA (Vite), Feature-Module unter src/features/
packages/cli/ volt install | onboard | update | doctor
packages/shared/ Zod-Schemas, Enums, gemeinsame Typen (dist-Build)
docs/ Architektur, Installation, Module, Operations
infra/ Caddy, Update-Daemon, PostgreSQL-Backup
scripts/ Bootstrap, Prod-Deploy, Test-DB, CI-Gates
Schichten im Backend: routes → services → repositories (Prisma). Lexware-Code nur unter apps/backend/src/lib/lexware/. Details: docs/ARCHITECTURE.md.
| Komponente | Version / Hinweis |
|---|---|
| Node.js | 24+ (.nvmrc) |
| pnpm | 11+ (Pin in Root-package.json) |
| Docker | empfohlen: Postgres 18 + Redis 8 (docker-compose.yml) |
| Linux-Install | sudo bash scripts/install-system-deps.sh installiert Node, pnpm, Docker, Build-Tools |
Ein Befehl (ohne vorinstalliertes pnpm) — interaktiv Dev oder Production:
git clone https://github.com/zPoche/volt.git
cd volt
./install # System-Deps, .env, Docker, Migrationen, CLI globalOhne ./install: sudo bash scripts/install-system-deps.sh, dann pnpm install && pnpm volt install.
Terminal neu öffnen (pnpm schreibt PNPM_HOME ins PATH). Bis dahin: pnpm volt <befehl> oder ./bin/volt.
pnpm dev
pnpm volt onboard # Setup-URL + Token in der Konsole| Schritt | URL / Hinweis |
|---|---|
| Frontend | http://localhost:5173 |
| Setup-Wizard | http://localhost:5173/setup |
| Backend / Health | http://localhost:4000/health |
| Field-App OpenAPI (Dev) | http://localhost:4000/docs/field-app |
Vite proxyt /api → Backend (vite.config.ts). VITE_API_BASE_URL nur setzen, wenn kein Proxy genutzt wird.
Dev-Seed (optional, nur lokal): admin@volt.local / ChangeMe!2026 — nach prisma db seed.
git clone https://github.com/zPoche/volt.git
cd volt
bash scripts/bootstrap-volt.sh
pnpm devProduction-Secrets: VOLT_BOOTSTRAP_MODE=production bash scripts/bootstrap-volt.sh · danach node scripts/validate-install-env.mjs.
pnpm docker:up
pnpm --filter @volt/backend exec prisma migrate deploy
pnpm --filter @volt/backend exec prisma db seed # optional
pnpm devTests ohne Docker: pnpm test:db:ensure.
docker compose down stoppt Container und entfernt sie samt Compose-Netzwerk. Ohne -v bleiben Volumes (z. B. Postgres-Daten) erhalten; mit -v werden Volumes mitgelöscht.
Dev-Stack (postgres, redis aus docker-compose.yml):
pnpm docker:down # stoppen + Container entfernen
docker compose down -v # zusätzlich Volumes löschen (Dev-DB weg)Prod-Stack (volt-prod-* aus docker-compose.prod.yml):
docker compose -f docker-compose.prod.yml --env-file .env.production down
docker compose -f docker-compose.prod.yml --env-file .env.production down -v # inkl. VolumesBeide Stacks (Dev + Prod):
docker compose down -v
docker compose -f docker-compose.prod.yml --env-file .env.production down -vHinweis: docker compose down ohne -f docker-compose.prod.yml betrifft nur den Dev-Stack, nicht volt-prod-*. Hängende Einzelcontainer: docker ps -a --filter "name=volt" · docker rm -f <id>.
./install --production # Domain, Secrets, .env.production, Prod-Compose
pnpm volt onboardAlternativ mit pnpm: pnpm volt install --production
Ausführlich: docs/INSTALL.md · docs/DEPLOYMENT.md · Cloud-Agent: AGENTS.md.
Beim Install (./install --production) wählen Sie den Edge-Proxy:
| Modus | VOLT_EDGE_PROXY |
Was läuft |
|---|---|---|
| Integrierter Caddy (Default) | caddy |
Container caddy:2-alpine auf Host 80/443 — routet API, SPA, Webhook |
| Externer Proxy | external |
Kein Edge-Caddy-Container — TLS auf nginx/Apache/eigenem Caddy am Host |
Wichtig — zwei verschiedene „Caddy“:
volt-prod-caddy-1(nur beiVOLT_EDGE_PROXY=caddy): öffentlicher Reverse-Proxy, Ports 80/443.volt-prod-frontend-1zeigt immercaddy run --config …— das ist nur der Static-Server für die SPA im Container auf Port 8080 (nicht öffentlich). Das bleibt in beiden Modi so; ersetzt keinen Edge-Proxy.
Bei externem Proxy fragt der Installer nicht nach HTTP/HTTPS-Ports 80/443 für Volt — die liegen auf Ihrem Host-Proxy. Volt bindet nur localhost:
| Dienst | Default-Port | Zweck |
|---|---|---|
| Frontend (SPA) | 127.0.0.1:8080 |
Browser-UI |
| Backend (API) | 127.0.0.1:4000 |
/api/*, /health |
| Update-Daemon | 127.0.0.1:9090 |
/_internal/update (Deploy-Webhook) |
.env.production (extern):
VOLT_EDGE_PROXY=external
VOLT_EXTERNAL_PROXY_KIND=nginx
CORS_ORIGIN=https://volt.example.de
TRUST_PROXY_HOPS=1
# Nginx im Docker-Container (nicht auf dem Host):
# VOLT_EXTERNAL_PROXY_NGINX_CONTAINER=nginx-proxy
# VOLT_EDGE_PROXY_RELOAD_CMD=docker exec nginx-proxy nginx -t && docker exec nginx-proxy nginx -s reloadNach dem Install liegt eine angepasste Vorlage unter infra/proxy/ (z. B. nginx-volt.generated.conf).
nginx im Container (z. B. nginx-proxy): Auf dem Host gibt es kein nginx-Binary — Reload mit docker exec nginx-proxy nginx -s reload. volt update / prod-deploy versucht das automatisch, wenn der Container läuft.
Edge-Caddy startet bei externem Modus nicht — weder beim ersten up -d noch bei volt update / prod-update.sh (der Deploy recycelt dann nur migrator, backend, frontend).
FQDN volt.example.de — Pfad-Routing, kein blindes 443 → Container:443:
upstream volt_frontend {
server 127.0.0.1:8080;
}
upstream volt_backend {
server 127.0.0.1:4000;
}
upstream volt_update_daemon {
server 127.0.0.1:9090;
}
server {
listen 443 ssl http2;
server_name volt.example.de;
# ssl_certificate /etc/ssl/certs/volt.example.de-fullchain.pem;
# ssl_certificate_key /etc/ssl/private/volt.example.de.key;
client_max_body_size 64m;
location /_internal/update {
proxy_pass http://volt_update_daemon;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Assistent-Chat und Ollama-Verbindungstest (Admin) — Default 60s reicht nicht
location /api/v1/assistant/ {
proxy_pass http://volt_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /api/ {
proxy_pass http://volt_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Assistent-Chat und Ollama-Verbindungstest (Admin) — Default 60s reicht nicht
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location = /health {
proxy_pass http://volt_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ ^/suppliers/[0-9a-fA-F-]{36}/oci-return$ {
rewrite ^/suppliers/([0-9a-fA-F-]{36})/oci-return$ /api/v1/suppliers/$1/oci/return break;
proxy_pass http://volt_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://volt_frontend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Ohne proxy_read_timeout / proxy_send_timeout (mind. 300s) bricht nginx nach 60s ab — typisch HTTP 504 beim Ollama-Verbindungstest (Intent-Chat, Modell lädt) oder langem Assistenten-Chat. Gleiche Werte wie in infra/proxy/nginx-volt.generated.conf nach volt install.
Module: a2enmod proxy proxy_http rewrite ssl headers
<VirtualHost *:443>
ServerName volt.example.de
# SSLEngine on
# SSLCertificateFile /etc/ssl/certs/volt.example.de-fullchain.pem
# SSLCertificateKeyFile /etc/ssl/private/volt.example.de.key
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass /_internal/update http://127.0.0.1:9090/_internal/update
ProxyPassReverse /_internal/update http://127.0.0.1:9090/_internal/update
ProxyPass /api/ http://127.0.0.1:4000/api/
ProxyPassReverse /api/ http://127.0.0.1:4000/api/
ProxyPass /health http://127.0.0.1:4000/health
ProxyPassReverse /health http://127.0.0.1:4000/health
RewriteEngine On
RewriteRule ^/suppliers/([0-9a-fA-F-]{36})/oci-return$ /api/v1/suppliers/$1/oci/return [PT]
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>CORS_ORIGIN muss exakt der öffentlichen URL entsprechen (z. B. https://volt.example.de). Setup, Login und API laufen dann wie mit integriertem Caddy — nur TLS und Routing liegen auf dem Host.
Integrierter Caddy (weiterhin Default): docker compose --profile caddy -f docker-compose.prod.yml --env-file .env.production up -d
Nach Installation und /setup werden die folgenden Bereiche typischerweise in dieser Reihenfolge konfiguriert.
| Schritt | Inhalt |
|---|---|
| Token | pnpm volt onboard oder VOLT_SETUP_TOKEN in apps/backend/.env |
| API | GET/POST /api/v1/setup/* mit Setup-Token |
| Abschluss | Firmendaten, Admin-User, optionale Backup-Prüfung |
| Aufgabe | Wo |
|---|---|
| Benutzer anlegen | Admin → Benutzer (/admin/users) |
| Fachrollen & Rechte | Admin → Berechtigungen (/admin/permissions) |
| Display / Wallboard | Fachrolle Display / Fernseher, Start /display |
| Buchhaltung | Fachrolle Buchhaltung (nicht im Seed) |
API: /api/v1/rbac/* · Doku: RBAC-Matrix in der UI, Feature-Flags unter Admin → Module.
| Schritt | Aktion |
|---|---|
| OAuth | Admin → Integrationen → Lexware verbinden, oder GET /api/v1/oauth/lexware/authorize |
| Sync | Admin → Lexware sync / POST /api/v1/admin/integrations/lexware/sync |
| Projektzuordnung | Projektnummer PRJ-YYYY-NNN als erstes Token im Lexware-Beschreibungsfeld |
Beispiel: PRJ-2026-015 Materialeinkauf Baustelle Müller · Regex: /PRJ-\d{4}-\d{3,5}/
Volt nutzt eine Azure-App-Registration im Kunden-Tenant für Kalender-Sync, System-E-Mail-Versand und Assistent-M365-Tools (Mail, OneDrive, SharePoint, Teams). Tenant und App liegen beim Kunden; Volt liefert Redirect-URIs und die Scope-Liste.
Ausführlich: docs/operations/MICROSOFT-365-OUTLOOK-INTEGRATION.md
Schritt-für-Schritt: Azure App anlegen
- Azure Portal → Microsoft Entra ID → App registrations → New registration
- Name: z. B.
Volt ERP - Supported account types: Single tenant (nur euer Tenant)
- Redirect URI: vorerst leer lassen → Register
- Name: z. B.
- Notieren: Application (client) ID und Directory (tenant) ID
- Certificates & secrets → New client secret → Wert sicher speichern (nur einmal sichtbar)
- Authentication → Add a platform → Web → Redirect URIs eintragen (exakt, inkl.
https://):- Kalender / Mitarbeiter-OAuth:
https://<volt-host>/api/v1/outlook/oauth/callback - System-E-Mail:
https://<volt-host>/api/v1/admin/system/mail-delivery/oauth/callback
Die exakten URLs stehen in Volt unter Einstellungen → Schnittstellen → Microsoft 365 / Outlook (kopierbar).
- Kalender / Mitarbeiter-OAuth:
- API permissions → Add a permission → Microsoft Graph → Delegated permissions — alle hinzufügen:
| Berechtigung | Zweck |
|---|---|
User.Read |
Anmeldung / Profil |
offline_access |
Refresh-Token |
Calendars.ReadWrite |
Kalender lesen/schreiben, Plantafel-Push, Assistent-Termine |
Mail.Read |
Posteingang + einzelne Mails (Assistent) |
Mail.ReadWrite |
E-Mail-Entwürfe (Assistent) |
Mail.Send |
E-Mail senden/antworten (Assistent + System-Versand) |
Files.Read.All |
OneDrive listen/lesen (Assistent) |
Sites.Read.All |
SharePoint (Assistent) |
Team.ReadBasic.All |
Teams auflisten (Assistent) |
Chat.Read |
Teams-Chats lesen (Assistent) |
ChannelMessage.Read.All |
Teams-Kanalnachrichten lesen (Assistent) |
Tasks.ReadWrite |
To-Do-Sync + Assistent |
Notes.Read / Notes.ReadWrite |
OneNote lesen / Seiten anlegen (Assistent) |
- Grant admin consent for [Tenant] — ohne Admin-Einwilligung schlagen OAuth und Assistent-Tools mit 403 fehl.
- (Optional, Krankmeldungs-Import) Application permission
Mail.Read+ Exchange Application Access Policy auf das Krankmeldungs-Postfach — siehe Operations-Doku.
Nach neuen Assistent-Scopes: Berechtigungen in Azure ergänzen, Admin Consent erneut, dann jeder Mitarbeiter M365 erneut verbinden.
Schritt-für-Schritt: In Volt einrichten (Admin)
| Schritt | Wo | Aktion |
|---|---|---|
| 1 | Admin → Module | MODULE_SCHNITTSTELLEN aktivieren |
| 2 | Admin → Einstellungen → Schnittstellen → Karte Microsoft 365 / Outlook | Tenant-ID, Client-ID, Client-Secret eintragen |
| 3 | Dieselbe Karte | Beide Redirect-URIs in Azure übernehmen (Felder sind schreibgeschützt, zum Kopieren) |
| 4 | Dieselbe Karte | Kalender-Push aktivieren, wenn Einsätze/Abwesenheiten nach Outlook sollen |
| 5 | Dieselbe Karte | Speichern → Testen (OAuth-App erreichbar) |
| 6 | Server | REDIS_URL setzen, damit Push/Pull alle 15 Min. läuft (Worker volt-outlook-calendar-sync) |
| 7 | .env / Prod |
OUTLOOK_PROVIDER=graph (nicht stub) |
System-E-Mail (Angebote, Wochenberichte): danach Admin → System → E-Mail-Versand → Modus Microsoft 365 (OAuth) → mit demselben Azure-Tenant verbinden (Mail.Send muss in der App consented sein).
Krankmeldungs-Postfach: in der M365-Karte Postfach-Adresse eintragen, Postfach testen, optional automatischen Import aktivieren.
Schritt-für-Schritt: Mitarbeiter verbinden
Voraussetzung: Azure-App in Volt konfiguriert, Mitarbeiter hat verknüpftes Benutzerkonto.
| Schritt | Wo | Aktion |
|---|---|---|
| 1 | Profil (/profile) → Abschnitt Microsoft 365 Kalender |
Mit Microsoft 365 verbinden |
| 2 | Microsoft-Anmeldung | Mit dem eigenen Firmenkonto anmelden und zustimmen |
| 3 | Zurück in Volt | Status Verbunden; optional Sync-Optionen (Einsätze push/pull, Abwesenheiten) |
| 4 | Bei Fehlern / neuen Scopes | Erneut verbinden (alte Tokens haben nicht alle Berechtigungen) |
Ohne persönliche Verbindung kann der Assistent keine M365-Daten dieses Nutzers lesen oder schreiben (Kalender, Mail, OneDrive, Teams).
Assistent: Ollama + M365-Tools
Der Volt-Assistent nutzt lokales Ollama mit Tool-Calling; M365-Zugriff läuft über das verbundene Konto des angemeldeten Mitarbeiters.
| Schritt | Wo | Aktion |
|---|---|---|
| 1 | Admin → Module | MODULE_AUTOMATISIERUNGEN aktiv |
| 2 | Admin → Einstellungen → Schnittstellen → Ollama / KI | Basis-URL (z. B. http://ollama:11434), Standard-Modell |
| 3 | Dieselbe Karte | Aufgabe Assistent (Tool-Calling) — Modell mit Tool-Support (z. B. qwen3:14b) |
| 4 | Profil → Microsoft 365 Kalender | Persönliche M365-Verbindung (siehe oben) |
| 5 | Assistent (Panel oder /assistant) |
Freie Fragen; bei M365-Schreibaktionen (Mail senden/antworten, Termin) Bestätigung im UI |
Volt-interne Tools (Projekte, Kunden, Material, Plantafel) brauchen kein M365 — nur die üblichen Volt-Rechte des Nutzers.
To-Do: Persönliche Dashboard-Todos syncen bidirektional mit Microsoft To-Do-Liste „Volt - Aufgaben" (pro Benutzer eine Liste). Standup-Todos sind ausgenommen.
Prod-Hinweis Docker-Netz: Ollama & n8n.
| Kurz | Aktion |
|---|---|
| Azure | App-Registration, delegated Graph-Scopes, Admin Consent, zwei Redirect-URIs |
| Admin | Einstellungen → Schnittstellen → Microsoft 365 / Outlook |
| MA | Profil → Microsoft 365 Kalender → Verbinden |
| Sync | REDIS_URL + Kalender-Push; Worker alle 15 Min. |
| Assistent | Ollama Tool-Calling-Modell + MA-M365-Verbindung |
Stammdaten unter Lieferanten (/suppliers): Kundennummer, Partnernummer, Shop-Passwort, Einstiegs-URLs aus dem Würth-Portal.
→ Abschnitt Würth unten · ENCRYPTION_KEY (64 Hex) für verschlüsseltes Shop-Passwort.
Einstellungen → Stundensätze (/settings/hourly-rates) · Margen-Schwellen und Projektstatus unter /settings/*.
Admin → Module (/admin/modules) — Feature-Flags nach Bündeln (CRM & Kunden, Automatisierung & KI, Telefonie, …).
| Bündel | Typische Flags |
|---|---|
| CRM & Kunden | MODULE_CRM, MODULE_LEADS, MODULE_KOMMUNIKATION, MODULE_REVIEWS, MODULE_KUNDENPORTAL |
| Automatisierung & KI | MODULE_AUTOMATISIERUNGEN, OLLAMA_LV_ANALYSIS, OLLAMA_CRM_ASSISTANT |
| Sonstiges | MODULE_SUBCONTRACTORS, MODULE_FIELD_APP, MODULE_TELEFONIE, … |
Details und Timeline: CRM & Kundenaktivitäten (M03).
Einladungen: Sidebar-Gruppe Kunden → Kundenportal · öffentliche Angebotslinks und Terminbuchung über jeweilige Admin-Bereiche.
→ docs/operations/customer-portal-dsgvo.md
Native Android-App für Monteure (Zeiten, Einsätze, Krankmeldung mit AU-Foto, Push). Web-Monteur-UI unter /monteur/* ist unabhängig davon.
| Schritt | Aktion |
|---|---|
| Modul | Admin → Module — MODULE_FIELD_APP aktivieren (siehe §7) |
| Benutzer | Mitarbeiter mit verknüpftem Benutzerkonto und Recht Field-App nutzen |
| App | Volt-App installieren (Play Store / APK) |
| Schritt | Wo |
|---|---|
| Code erzeugen | Mitarbeiter → Detail → Benutzerkonto (Login) oder Admin → Benutzer → Bearbeiten — Kopplungscode + QR |
| App | QR scannen oder 6-stelligen Code eingeben (volt://pair?code=123456) |
| API | POST /api/v1/auth/field-app/pair |
Code ist 10 Minuten gültig und einmalig verwendbar.
Für Android-Push braucht das Volt-Backend einen Firebase Service Account derselben Firebase-App wie die Android-App. Ohne FCM funktionieren Kopplung und API; nur Push auf dem Gerät fehlt dann.
1. Firebase Console (Projekt der Volt-App) → Einstellungen → Dienstkonten → Neuen privaten Schlüssel generieren → JSON herunterladen.
2. JSON niemals ins Git — nur lokal oder als Secret auf dem Server.
Entwicklung (apps/backend/.env):
# Datei liegt gitignored unter apps/backend/.fcm-service-account.json
FCM_SERVICE_ACCOUNT_PATH=apps/backend/.fcm-service-account.jsonProduction (.env.production / Docker): Dateipfad im Container ist umständlich — praktischer ist einzeiliges JSON:
FCM_SERVICE_ACCOUNT_JSON={"type":"service_account","project_id":"…",…}(Tip: jq -c . fcm-service-account.json erzeugt eine Zeile.)
Alternativ Secret-Datei mounten und FCM_SERVICE_ACCOUNT_PATH=/pfad/im/container/fcm.json setzen.
Mehrere Volt-Installationen — brauche ich jedes Mal ein neues Firebase?
Nein. Firebase hängt an der Android-App (Package Name + Signatur), nicht an der Volt-Server-Instanz.
| Situation | Firebase |
|---|---|
| Zweiter Kunde, dritter Server, dieselbe Volt-App aus dem Store | Gleiches Firebase-Projekt + gleiche Service-Account-JSON auf jedem Server |
| Dev / Staging / Production | Empfohlen: je Umgebung ein eigenes Firebase-Projekt (und passende App-Builds) |
| Eigener App-Build (anderes Package, andere Signatur) | Neues Firebase-Projekt für diese App-Identität |
| Bewusste Mandantenisolation (Push getrennt) | Optional separates Firebase pro Mandant — selten nötig |
Kurz: Pro App-Identität ein Firebase; pro Volt-Server nur die Credentials hinterlegen, nicht neu anlegen.
→ OpenAPI (Dev): /docs/field-app
| Bereich | Pfad | Rolle (typisch) |
|---|---|---|
| Login | /login |
alle |
| Dashboard | /dashboard, /dashboard/standup |
Büro, Admin |
| Kunden (Gruppe) | Sidebar Kunden (aufklappbar) | Büro, Admin |
| Kunden | /customers, Tab Aktivitäten |
Büro, Admin |
| Leads | /leads |
Büro, Admin (MODULE_LEADS) |
| Kommunikation | /communications |
Büro, Admin (MODULE_KOMMUNIKATION) |
| Bewertungen | /reviews |
Büro, Admin (MODULE_REVIEWS) |
| Kundenportal (Admin) | /customer-portal |
Büro, Admin (MODULE_KUNDENPORTAL) |
| Projekte | /projects, /projects/:id/* (Tab Aktivitäten) |
Büro, Polier, Admin |
| Plantafel | /deployment-planner |
Büro, Polier |
| Monteur | /monteur/* |
Monteur (fitter) |
| Material | /materials, /purchase-orders |
Büro, Lager |
| Angebote | /offers |
Büro |
| Service | /service/orders |
Büro |
| Importe | /imports |
Admin, Büro |
| Admin | /admin/users, /admin/integrations, /system |
Admin |
| Display | /display |
Display-User |
| Kundenportal | /portal/* |
Kunde (eigenes JWT) |
| Setup | /setup |
Setup-Token |
Vollständige Routen: apps/frontend/src/app/router.tsx.
| Was | Pfad |
|---|---|
| API-Routen | apps/backend/src/routes/ |
| Domänen-Module | apps/backend/src/modules/ |
| Prisma-Schema (Source of Truth) | apps/backend/prisma/schema.prisma |
| Migrationen | apps/backend/prisma/migrations/ |
| Lexware | apps/backend/src/lib/lexware/ |
| ENV Dev | apps/backend/.env (von .env.example) |
| ENV Production | .env.production (von .env.production.example) |
| Thema | Datei |
|---|---|
| Installation | docs/INSTALL.md |
| Deployment / Updates | docs/DEPLOYMENT.md |
| API (generiert) | docs/API-REFERENCE.md |
| Datenbank | docs/DATABASE-SCHEMA.md |
| Architektur | docs/ARCHITECTURE.md |
| Dienst | Port | Container (Dev) | Zweck |
|---|---|---|---|
| PostgreSQL 18 | 5432 | volt-postgres |
Haupt-DB volt |
| Redis 8 | 6379 | volt-redis |
Cache, BullMQ (Outlook-Sync, Jobs) |
DATABASE_URL in apps/backend/.env · Test-DB: volt_test via scripts/ensure-backend-test-db.sh.
| Dienst | Compose-Projekt | Typischer Container |
|---|---|---|
| Stack | volt-prod |
docker-compose.prod.yml |
| Postgres | volt-prod-postgres-1 |
Migrationen via migrator-Service |
| Env-Datei | .env.production |
Secrets, Domain, VOLT_PUBLIC_BASE_URL |
# Tabellen anzeigen (Production)
docker exec -it volt-prod-postgres-1 psql -U volt -d volt -c "\dt"Vorsicht: prisma migrate reset löscht alle Daten.
| Variable | Zweck |
|---|---|
DATABASE_URL |
PostgreSQL-Verbindung |
REDIS_URL |
BullMQ / Cache (optional in Dev) |
JWT_SECRET / JWT_REFRESH_SECRET |
Auth-Tokens |
ENCRYPTION_KEY |
32 Byte hex — OAuth-Tokens, Shop-Passwörter |
VOLT_SETUP_TOKEN |
Setup-Wizard |
VOLT_PUBLIC_BASE_URL |
Öffentliche URLs (OCI-Rückkehr, Portal) |
FCM_SERVICE_ACCOUNT_JSON / FCM_SERVICE_ACCOUNT_PATH |
Android-Push (Field App) — siehe §9 |
LEXWARE_* |
Lexware OAuth & Webhook |
Vorlagen: .env.example · .env.production.example · Prüfung: pnpm validate:install-env.
| Befehl | Wirkung |
|---|---|
./install |
Erstinstallation ohne vorinstalliertes pnpm (empfohlen) |
./install --production |
Production-Install (Domain, Secrets, Prod-Compose) |
pnpm volt install |
Wie ./install, wenn pnpm bereits vorhanden |
pnpm volt install --production |
Prod-Install über CLI |
pnpm volt onboard |
Setup-URL + Token ausgeben |
pnpm volt update |
Dev: git + deps + Migrationen · Prod: prod-update.sh |
pnpm volt update --force |
Prod: Deploy auch ohne VERSION-Bump bei neuem Git-Stand (siehe Updates) |
pnpm volt doctor |
Toolchain, ENV, /health, Setup-Status |
CLI-ENV: VOLT_SKIP_DOCKER, VOLT_NONINTERACTIVE, VOLT_AUTO_START_STACK — siehe Troubleshooting.
| Befehl | Wirkung |
|---|---|
pnpm dev |
Backend :4000 + Frontend :5173 |
pnpm build |
Production-Builds aller Packages |
pnpm test |
Vitest in allen Workspaces |
pnpm typecheck |
TypeScript (Shared zuerst bauen) |
pnpm lint |
ESLint |
pnpm db:migrate |
Prisma migrate dev (interaktiv) |
pnpm db:migrate:deploy |
Migrationen (CI / non-interactive) |
pnpm db:studio |
Prisma Studio |
pnpm docker:up / down |
Dev-Compose Postgres + Redis (Stoppen/Löschen: Container) |
pnpm test:db:ensure |
Test-DB volt_test vorbereiten |
pnpm generate:api-reference |
docs/API-REFERENCE.md + README-API-Abschnitt |
pnpm validate:install-env |
Production-Secrets prüfen |
pnpm validate:readiness-gate |
Roadmap-Gate (CI) |
pnpm validate:release-gate |
Release-Gate |
Wichtig: Vor typecheck/test: pnpm --filter @volt/shared run build · nach Schema-Änderung: prisma generate.
| Skript | Wirkung |
|---|---|
bootstrap-volt.sh |
Alternative Erstinstallation (ENV, Docker, migrate, seed) |
install-system-deps.sh |
Node 24, pnpm, Docker, Build-Pakete (Linux) |
prod-update.sh |
Production-Update: git pull, VERSION, compose build/up, Health (volt update / --force) |
lib/prod-deploy.sh |
Deploy-Logik (von prod-update / CLI genutzt) |
ensure-backend-test-db.sh |
Lokale/ephemere Postgres-Test-DB für Vitest |
validate-install-env.mjs |
Fail-fast bei Platzhalter-Secrets (Production) |
validate-readiness-gate.mjs |
Roadmap-Struktur validieren |
validate-release-gate.mjs |
Release-Kriterien |
bump-deploy-version.sh |
VERSION / Deploy-Tags für Prod |
prod-diagnose-backend.sh |
Backend-Container Diagnose |
prod-enable-core-modules.sh |
Kern-Module in DB aktivieren |
verify-boo-457-backend.sh |
BOO-457 Backend-Verifikation |
verify-backend-audit-gate.mjs |
Audit-Gate für kritische Entitäten |
run-e2e-scheduling-smoke.sh |
E2E Plantafel-Smoke |
run-e2e-m07-field-app.sh |
E2E Field-App |
run-e2e-m08-integration.sh |
E2E Material-Integration |
smoke-qol-wave1.sh |
QoL-Welle-1 Smoke |
smoke-qol-wave2bc.sh |
QoL-Welle-2bc Smoke |
| Datei | Wirkung |
|---|---|
update-daemon.sh |
Webhook-gesteuertes Prod-Deploy (127.0.0.1:9090) |
pg-backup.sh |
PostgreSQL-Dump (Cron) |
verify-volt-update-stack.sh |
Update-Stack prüfen |
pnpm --filter @volt/shared run build
pnpm --filter @volt/backend exec prisma generate
pnpm devBackend-Tests mit DB:
eval "$(scripts/ensure-backend-test-db.sh export)"
pnpm --filter @volt/backend exec prisma migrate deploy
pnpm --filter @volt/backend test| Check | Befehl |
|---|---|
| TypeScript | pnpm typecheck |
| Lint | pnpm lint |
| Unit/Integration | pnpm test |
| E2E (Frontend) | pnpm --filter @volt/frontend exec playwright test |
Compose-Projekt volt-prod · Env: .env.production.
cd ~/coding/volt # oder /home/volt/volt
volt update
# oder: bash scripts/prod-update.shAblauf: git pull → VOLT_VERSION/VOLT_GIT_SHA → Docker build/pull → up -d → Health-Check.
VERSION-Regel (Prod): Liegt nach git pull ein neuer Git-Stand vor (VOLT_GIT_SHA ≠ HEAD), muss VERSION im Repo höher sein — sonst bricht das Update ab. Im Repo: ./scripts/bump-deploy-version.sh, CHANGELOG.md, commit + push. Details: docs/versioning.md.
Deploy ohne VERSION-Bump (z. B. nur Code-Änderungen auf gleicher Versionsnummer, interner Rollout):
volt update --force
# Äquivalent: VOLT_ALLOW_SAME_VERSION_DEPLOY=1 bash scripts/prod-update.sh--force gilt nur für Production (prod-update.sh). In der Entwicklung hat der Schalter keine zusätzliche Wirkung.
Nur GHCR-Images: VOLT_DEPLOY_STRATEGY=pull bash scripts/prod-update.sh
# Integrierter Caddy (Default):
docker compose --profile caddy -f docker-compose.prod.yml --env-file .env.production up -d
# Externer Proxy (VOLT_EDGE_PROXY=external) — ohne --profile caddy:
docker compose -f docker-compose.prod.yml -f docker-compose.prod.external-proxy.yml --env-file .env.production up -d
docker compose -f docker-compose.prod.yml --env-file .env.production logs -f backend
docker compose -f docker-compose.prod.yml --env-file .env.production down # stoppen, ohne Volumes
docker compose -f docker-compose.prod.yml --env-file .env.production down -v # inkl. Volumes löschenStoppen/Löschen Dev + Prod: Abschnitt Container stoppen und entfernen.
Ollama und n8n laufen oft in eigenen Compose-Stacks neben volt-prod. Container erreichen sich nur per Hostname, wenn sie im selben user-defined Docker-Netz hängen — localhost im Volt-Backend zeigt auf den eigenen Container, nicht auf Ollama auf dem Host.
| Schritt | Aktion |
|---|---|
| 1 | Gemeinsames Netz (z. B. proxy-net): docker network create proxy-net |
| 2 | Ollama-Compose und Volt hängen beide an diesem Netz |
| 3 | In .env.production: VOLT_INTEGRATIONS_DOCKER_NETWORK=proxy-net |
| 4 | Deploy: bash scripts/prod-update.sh (bindet docker-compose.prod.integrations-network.yml ein) |
| 5 | Admin → Einstellungen → Schnittstellen → Ollama: Basis-URL http://ollama:11434, Modell = installiertes Modell (z. B. gemma4), API-Key leer |
| 6 | Admin → Module → Automatisierung & KI: optional OLLAMA_LV_ANALYSIS (Projekt-LV) und OLLAMA_CRM_ASSISTANT (Timeline-Zusammenfassung) |
Host: ollama existiert nicht als Shell-Befehl — nur im Container: docker exec ollama ollama list.
Prüfen: docker exec volt-prod-backend-1 wget -qO- http://ollama:11434/api/tags
Compose immer mit Env-Datei: docker compose -f docker-compose.prod.yml --env-file .env.production … — ohne --env-file fehlen Secrets und DATABASE_URL/REDIS_URL mit localhost brechen Migrator/Backend.
Ausführlich: docs/DEPLOYMENT.md — Nebenservices.
Passwörter sind Argon2id in user.password_hash — nicht per PostgreSQL-crypt().
Empfohlen: Admin → Benutzer → Passwort setzen.
Shell: Hash im Backend-Container erzeugen, dann UPDATE in Postgres — siehe docs/DEPLOYMENT.md oder frühere README-Version (Abschnitt Datenbank & Admin).
| Thema | Doku |
|---|---|
| Semver / VERSION-Datei | docs/versioning.md |
| Release-Gate | docs/operations/RELEASE-GATE.md |
| Auto-Deploy Webhook | /_internal/update — integrierter Caddy oder Host-Proxy (nginx/Apache) → 127.0.0.1:9090 |
Roher SQL-Dump der Datenbank — ergänzt das Anwendungsbackup (ZIP über Admin-UI), ersetzt es nicht.
chmod +x /home/volt/volt/infra/pg-backup.shCrontab (Beispiel täglich 02:15):
15 2 * * * /home/volt/volt/infra/pg-backup.sh >> /home/volt/volt/backups/postgres/backup.log 2>&1Container-Name typisch: volt-prod-postgres-1 (Projekt volt-prod).
Volt bietet zwei komplementäre Sicherungsebenen:
| Ebene | Zweck | Wo konfigurieren |
|---|---|---|
| Anwendungsbackup (ZIP) | Portabler Snapshot aller Volt-Betriebsdaten; Restore über Admin-UI oder API | Admin → System → Daten-Backup |
| PostgreSQL-Dump | Vollständiger DB-Rohdump auf Server-Ebene (Disaster Recovery, DBA) | infra/pg-backup.sh + Cron (siehe oben) |
Für den operativen Betrieb (Serverwechsel, Testsystem, Notfall-Restore der Volt-Daten) reicht in der Regel das Anwendungsbackup. Für Bare-Metal oder inkonsistente DB-Zustände zusätzlich pg_dump nutzen.
Pfad: Admin → System → Daten-Backup
| Aktion | Beschreibung |
|---|---|
| Backup jetzt ausführen | Erzeugt ein ZIP, speichert es auf dem Server und kopiert es auf alle aktiven Ziele |
| Nur herunterladen | Einzel-Export als ZIP in den Browser (ohne Eintrag in der Backup-Liste) |
| Backup wiederherstellen | ZIP hochladen, Metadaten prüfen, Import starten |
| Zeitplan | Automatische Backups (stündlich / 6h / 12h / täglich / wöchentlich) |
| Ziele | Lokaler Pfad, FTP, SharePoint-Sync-Ordner |
| Gespeicherte Backups | Liste mit Speicherort, Download, Wiederherstellen |
Rolle: Admin mit Systemmodul (MODULE_ADMIN).
- Export aller Prisma-Modelle in FK-Reihenfolge (Stammdaten, Projekte, Material, Service, Lexware-Cache, RBAC, Einstellungen, …)
- Metadaten:
meta.json(exportedAt,voltVersion,backupFormatVersion,schemaHash) - Daten:
data.json(pro Tabelle ein Array, Schlüssel = Prisma-Delegate, z. B.employee,project)
Ausgeschlossen (bewusst, nicht portabel):
| Modell | Grund |
|---|---|
RefreshSession |
Aktive Login-Sessions |
SetupToken |
Einmal-Setup |
OfflineSyncQueue |
Transiente Field-App-Sync-Warteschlange |
Sicherheit: User.passwordHash wird weder exportiert noch beim Import geschrieben.
Einschränkungen:
- Große Binärfelder (
ImportedDocument.contentBytes, Buffer) werden alsnullgesichert — Metadaten und SharePoint-Verknüpfungen bleiben erhalten; Datei-Inhalte liegen weiter in SharePoint bzw. am Originalspeicherort. - SharePoint-Ziel in Volt = lokaler Sync-Ordner (OneDrive/SharePoint-Client), kein direkter Microsoft-Graph-Upload.
- FTP: klassisches FTP (Port 21); FTPS (
secure: true) wird aktuell nicht unterstützt. - Ältere Backups (v1): Import weiter möglich (14 Kern-Tabellen); neue Exporte sind immer v2.
| Variable | Bedeutung | Standard |
|---|---|---|
BACKUP_STORAGE_PATH |
Verzeichnis für ZIP-Artefakte + manifest.json |
./data/backups (relativ zum Backend-CWD) |
REDIS_URL |
BullMQ-Worker für geplante Backups | ohne Redis: nur manueller Lauf / UI |
Einstellungen (Zeitplan, Ziele, FTP-Passwort) liegen verschlüsselt in der DB (setting, Key backup:automation). Beim ersten Start wird ein Standard-Ziel Lokaler Server (BACKUP_STORAGE_PATH) angelegt.
Beispiel apps/backend/.env:
BACKUP_STORAGE_PATH=/var/lib/volt/backups
REDIS_URL=redis://localhost:6379Typ (kind) |
Beschreibung |
|---|---|
local |
Beliebiger Pfad auf dem Volt-Server (z. B. /mnt/backup/volt) |
ftp |
Upload per FTP (host, user, password, remotePath) — Passwort verschlüsselt in der DB |
sharepoint_path |
Lokaler Pfad zu einem synchronisierten SharePoint-/OneDrive-Ordner + Unterordner (z. B. Volt-Backups) |
Nach jedem Lauf zeigt die Tabelle Gespeicherte Backups pro Artefakt, auf welchen Zielen die Datei liegt (uploaded / failed inkl. Pfad oder Fehlermeldung).
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/v1/admin/backup/export |
ZIP-Stream (Download, ohne Speicherung) |
POST |
/api/v1/admin/backup/import |
ZIP importieren; Query: conflictPolicy=skip|overwrite, validateOnly=true |
POST |
/api/v1/admin/backup/run |
Backup erzeugen + auf Ziele verteilen |
GET |
/api/v1/admin/backup/artifacts |
Liste gespeicherter Backups |
GET |
/api/v1/admin/backup/artifacts/:id/download |
Gespeichertes ZIP herunterladen |
GET |
/api/v1/admin/backup/automation |
Zeitplan + Ziele lesen |
PATCH |
/api/v1/admin/backup/automation |
Zeitplan + Ziele speichern |
Import-Query conflictPolicy:
skip— bestehende Datensätze (gleiche ID/Schlüssel) überspringenoverwrite— per Upsert überschreiben
Validierung ohne Schreiben: POST .../backup/import?validateOnly=true mit Multipart-Feld file.
- Backup in der Liste wählen → Wiederherstellen (oder ZIP manuell hochladen).
meta.jsonund Datensatz-Anzahlen prüfen (schemaHashmuss zur Installation passieren, außer Legacy-v1).- Konflikt-Strategie wählen (
skipfür Teilsystem,overwritefür Voll-Restore auf leerer DB). - Nach erfolgreichem Import ggf. Lexware-/Outlook-Sync und externe Integrationen neu anstoßen.
| Symptom | Ursache | Lösung |
|---|---|---|
| Backend startet nicht (Prod) | Platzhalter-Secrets | pnpm validate:install-env · .env.production prüfen |
typecheck fehlgeschlagen |
Shared nicht gebaut | pnpm --filter @volt/shared run build |
| Prisma Client fehlt | Nach install/schema | pnpm --filter @volt/backend exec prisma generate |
| Tests ohne DB | Kein Postgres | eval "$(scripts/ensure-backend-test-db.sh export)" |
pnpm db:migrate hängt |
Interaktiv | pnpm db:migrate:deploy (CI/Cloud) |
| API 401 | Token abgelaufen | POST /api/v1/auth/refresh oder neu einloggen |
| Outlook-Sync nur bei Aktion | Kein Redis | REDIS_URL setzen, Worker volt-outlook-calendar-sync |
| Assistent: M365-Tools schlagen fehl | MA nicht verbunden oder alte OAuth-Scopes | Profil → Microsoft 365 erneut verbinden; Azure-Scopes + Admin Consent prüfen (§4) |
| Assistent: Tool-Calling ohne Antwort | Falsches/fehlendes Ollama-Modell | Schnittstellen → Ollama → Aufgabe Assistent (Tool-Calling) |
| Android-Push kommt nicht an | FCM_* fehlt oder falsches Firebase-Projekt |
Service Account setzen (§9) · App und Backend müssen dieselbe Firebase-App nutzen |
| OCI-Rückkehr leer (Würth) | Falsche Hook-URL | VOLT_PUBLIC_BASE_URL in Prod · Shop erneut öffnen |
docker compose down löscht Prod nicht |
Falsches Compose-File | -f docker-compose.prod.yml verwenden |
Prod: Migrator localhost:5432 / Redis ECONNREFUSED |
DATABASE_URL/REDIS_URL mit localhost oder Compose ohne --env-file .env.production |
Hostnamen postgres/redis · bash scripts/prod-update.sh |
| Ollama in Volt nicht erreichbar | Getrennte Docker-Netze (volt-prod_default vs. proxy-net) |
VOLT_INTEGRATIONS_DOCKER_NETWORK=proxy-net · Ollama & n8n |
Host: ollama: command not found |
Ollama nur im Container | docker exec ollama ollama list |
| Merge-Konflikt-Marker | Git | pnpm verify:no-merge-conflicts |
Diagnose:
pnpm volt doctor
bash scripts/prod-diagnose-backend.sh # Production
curl -s http://localhost:4000/health | jq .Cloud-Agent-Setup: AGENTS.md.
| Integration | Einrichtung | Doku |
|---|---|---|
| Lexware Office | Admin → Integrationen, OAuth, Webhook | docs/LEXWARE-INTEGRATION.md |
| Outlook / M365 | Azure App, Admin Schnittstellen, MA-Profil verbinden, Redis für Sync | §4 Microsoft 365 · docs/operations/MICROSOFT-365-OUTLOOK-INTEGRATION.md |
| DATEV / Export | Export-Routen, Admin DATEV | docs/INTEGRATION-BILLING-LEXWARE-DATEV.md |
| eSign / QES | Webhook + Admin | docs/operations/esign-qes.md |
| GAEB | Projekt-Import/Export | docs/integrations/GAEB-X81-X83-CONTRACT-PREP.md |
| Telefonie (Agfeo) | Webhook, Admin Config | docs/integrations/TELEPHONY-AGFEO.md |
| Ollama (Assistent / KI) | Schnittstellen → Ollama; Aufgabe Tool-Calling; Modul Automatisierung & KI | §4 Assistent · Ollama & n8n · CRM-Timeline |
| n8n (Workflows) | Admin → Automatisierung; Webhook-URLs in Systemeinstellungen | docs/DEPLOYMENT.md |
| Würth Shop | Lieferanten-Stammdaten | unten |
| Volt Android-App | Modul MODULE_FIELD_APP, Kopplung in Mitarbeiterverwaltung, FCM in ENV |
§9 Volt Android-App |
Nachunternehmer-Firmen und planbare NU-Mitarbeiter (NU-… Personalnummern) für die Plantafel.
| Feature-Flag | MODULE_SUBCONTRACTORS |
| Rechte | subcontractor.read / subcontractor.write |
| UI | /subcontractors · Projekt-Tab „Nachunternehmer“ |
| API | /api/v1/subcontractors/* · Worker: /workers |
NU-Kräfte erscheinen in der Plantafel wie interne Monteure (POST /api/v1/deployment-planner/assignments mit employeeId). GET /api/v1/employees listet nur interne MA-… Kräfte.
Vollständige Doku: docs/modules/SUBCONTRACTORS.md.
Anbindung an den Würth E-Shop (Intershop). Werte aus Mein Konto → ComNorm / OCI / IDS im Würth-Portal.
Voraussetzungen & Parameter
| Voraussetzung | Hinweis |
|---|---|
Migration 20260527200000_supplier_shop_integration_fields |
Shop-Felder am Lieferanten |
ENCRYPTION_KEY |
64 Hex-Zeichen — Shop-Passwort verschlüsselt |
| Rolle | admin oder office |
| Würth (Portal) | Feld in Volt |
|---|---|
| CN / ORGANIZATION / kndnr | Kundennummer |
| UI / NAME / name_kunde | Partnernummer |
| PASSWORD / pw_kunde | Shop-Passwort |
| URL Zeile 10 | OCI-/IDS-/ComNorm-Einstiegs-URL |
Schritt für Schritt & Beispiel
- Lieferanten → Neuer Lieferant (Code z. B.
wuerth). - Schnittstellen OCI / IDS / ComNorm aktivieren.
- Portal-Werte eintragen, speichern.
- OCI-Shop öffnen auf der Detailseite — Warenkorb-Rückkehr importiert Positionen.
Typische URLs (Platzhalter — echte Werte nur aus dem Portal):
- OCI:
…/OCICatalogService-Inbound - IDS:
…/ViewIDSCatalogService-IDSInBound - ComNorm:
…/ViewComNormCatalogService-Dispatch
Häufige Fehler
| Symptom | Lösung |
|---|---|
| Validierung Pflichtfelder | Kundennummer, Partnernummer, Passwort, Einstiegs-URL aus Portal |
| ComNorm-Sync schlägt fehl | VOLT_COMNORM_* nur für JSON-Gateway — nicht Intershop-Shop-URL |
| OCI-Rückkehr leer | VOLT_PUBLIC_BASE_URL in Prod; Hook /api/v1/suppliers/{id}/oci/return |
| Kategorie | Dateien |
|---|---|
| Produkt & Planung | GOALS.md, ROADMAP-READINESS-M01-M12.md, SPRINT-PLAN.md |
| Installation & Betrieb | INSTALL.md, DEPLOYMENT.md, RELEASE-GATE.md, AGENTS.md |
| Architektur & API | ARCHITECTURE.md, API-REFERENCE.md, DATABASE-SCHEMA.md |
| Module | SUBCONTRACTORS.md |
| Agenten / Handoffs | ROUTING-RUNBOOK.md, handoffs/README.md |
- Hosting in Deutschland (Hetzner Falkenstein/Nürnberg)
- Audit-Log für schreibende Operationen auf kritischen Entitäten (
project,time_entry,material_consumption, …) - Lexware- und Integrations-Tokens AES-256-GCM (
ENCRYPTION_KEY) - JWT nur im
Authorization-Header · Passwörter Argon2id - Rate-Limits auf Auth · CORS strikt · Helmet/CSP
- AVV mit Hetzner und Lexware
Privat / proprietär — siehe LICENSE.
Volt · Bootlabs
Vollständige, aus dem Code generierte Endpoint-Liste. Regenerieren: pnpm generate:api-reference.
Allgemein — Basis-URL, Auth, Fehlerformat
| Basis-URL (Dev) | http://localhost:4000 (Vite proxyt /api → Backend) |
| Präfix | /api/v1 |
| Login | POST /api/v1/auth/login → Access- + Refresh-Token |
| Requests | Header Authorization: Bearer <access_token> |
| Refresh | POST /api/v1/auth/refresh mit Refresh-Token (Body/Cookie je Implementierung) |
| Fehler | RFC 7807 application/problem+json (type, title, status, detail, optional errors[]) |
| Validierung | Zod; HTTP 422 bei ungültigen Query-/Body-Feldern |
| Paginierung | limit + offset (effektives Limit max. 200) |
| Geld | Beträge in Cent (bigint, JSON oft als String) |
Öffentliche oder spezielle Auth: Webhooks (x-webhook-token / Signatur), Setup (VOLT_SETUP_TOKEN), Kundenportal, öffentliche Buchung, ICS-Feed — siehe Spalte Auth in den Modul-Tabellen.
Field App (Monteur): OpenAPI UI unter /docs/field-app (Dev). Vollreferenz auch in docs/API-REFERENCE.md.
778 Endpunkte — nach Modul aufklappbar.
absences — absences (13)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/absences |
JWT Bearer |
POST |
/api/v1/absences |
JWT Bearer |
DELETE |
/api/v1/absences/:id |
JWT Bearer |
PATCH |
/api/v1/absences/:id |
JWT Bearer |
POST |
/api/v1/absences/:id/approve |
JWT Bearer |
POST |
/api/v1/absences/:id/cancel |
JWT Bearer |
GET |
/api/v1/absences/:id/certificate |
JWT Bearer |
POST |
/api/v1/absences/:id/certificate |
JWT Bearer |
POST |
/api/v1/absences/:id/reject |
JWT Bearer |
POST |
/api/v1/absences/check-calendar-overlaps |
JWT Bearer |
POST |
/api/v1/absences/confirm-calendar |
JWT Bearer |
POST |
/api/v1/absences/parse-calendar |
JWT Bearer |
POST |
/api/v1/absences/parse-calendar-pdf |
JWT Bearer |
Administration — admin (123)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/admin/assistant-actions |
JWT Bearer |
POST |
/api/v1/admin/assistant-actions/:id/undo |
JWT Bearer |
GET |
/api/v1/admin/assistant-chats |
JWT Bearer |
GET |
/api/v1/admin/assistant-chats/retention |
JWT Bearer |
PATCH |
/api/v1/admin/assistant-chats/retention |
JWT Bearer |
GET |
/api/v1/admin/assistant-chats/threads |
JWT Bearer |
GET |
/api/v1/admin/assistant-chats/threads/:threadId |
JWT Bearer |
GET |
/api/v1/admin/backup/artifacts |
JWT Bearer |
GET |
/api/v1/admin/backup/artifacts/:id/download |
JWT Bearer |
GET |
/api/v1/admin/backup/automation |
JWT Bearer |
PATCH |
/api/v1/admin/backup/automation |
JWT Bearer |
GET |
/api/v1/admin/backup/export |
JWT Bearer |
POST |
/api/v1/admin/backup/import |
JWT Bearer |
GET |
/api/v1/admin/backup/progress/:operationId |
JWT Bearer |
GET |
/api/v1/admin/backup/readiness |
JWT Bearer |
POST |
/api/v1/admin/backup/run |
JWT Bearer |
GET |
/api/v1/admin/company-settings |
JWT Bearer |
PATCH |
/api/v1/admin/company-settings |
JWT Bearer |
DELETE |
/api/v1/admin/company-settings/logo |
JWT Bearer |
GET |
/api/v1/admin/company-settings/logo |
JWT Bearer |
POST |
/api/v1/admin/company-settings/logo |
JWT Bearer |
GET |
/api/v1/admin/feature-flags |
JWT Bearer |
PATCH |
/api/v1/admin/feature-flags |
JWT Bearer |
PATCH |
/api/v1/admin/feature-flags/:key |
JWT Bearer |
POST |
/api/v1/admin/field-app/pairing-codes |
JWT Bearer |
GET |
/api/v1/admin/integrations/:provider/field-mappings |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/:provider/field-mappings |
JWT Bearer |
POST |
/api/v1/admin/integrations/:provider/sync |
JWT Bearer |
GET |
/api/v1/admin/integrations/cloud-storage |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/cloud-storage |
JWT Bearer |
POST |
/api/v1/admin/integrations/cloud-storage/migrate-legacy |
JWT Bearer |
POST |
/api/v1/admin/integrations/cloud-storage/sync |
JWT Bearer |
POST |
/api/v1/admin/integrations/cloud-storage/test |
JWT Bearer |
GET |
/api/v1/admin/integrations/datev/export |
JWT Bearer |
POST |
/api/v1/admin/integrations/datev/export |
JWT Bearer |
GET |
/api/v1/admin/integrations/datev/export-jobs |
JWT Bearer |
GET |
/api/v1/admin/integrations/datev/export-jobs/latest/:profile |
JWT Bearer |
GET |
/api/v1/admin/integrations/datev/preview |
JWT Bearer |
POST |
/api/v1/admin/integrations/datev/trip-log/export |
JWT Bearer |
POST |
/api/v1/admin/integrations/ids/order |
JWT Bearer |
POST |
/api/v1/admin/integrations/ids/price-update |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/articles |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/billing-status |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/contacts |
JWT Bearer |
POST |
/api/v1/admin/integrations/lexware/export |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/invoices |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/oauth |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/lexware/oauth |
JWT Bearer |
POST |
/api/v1/admin/integrations/lexware/webhook |
JWT Bearer |
GET |
/api/v1/admin/integrations/lexware/webhook-status |
JWT Bearer |
POST |
/api/v1/admin/integrations/outlook/import-sick-leave-mails |
JWT Bearer |
GET |
/api/v1/admin/integrations/outlook/oauth |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/outlook/oauth |
JWT Bearer |
POST |
/api/v1/admin/integrations/outlook/smoke-push |
JWT Bearer |
GET |
/api/v1/admin/integrations/outlook/status |
JWT Bearer |
POST |
/api/v1/admin/integrations/outlook/sync |
JWT Bearer |
POST |
/api/v1/admin/integrations/outlook/test |
JWT Bearer |
POST |
/api/v1/admin/integrations/outlook/test-sick-leave-mailbox |
JWT Bearer |
GET |
/api/v1/admin/integrations/remote-support/config |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/remote-support/config |
JWT Bearer |
POST |
/api/v1/admin/integrations/remote-support/test |
JWT Bearer |
GET |
/api/v1/admin/integrations/settings |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/settings/:provider |
JWT Bearer |
GET |
/api/v1/admin/integrations/spdata/export |
JWT Bearer |
GET |
/api/v1/admin/integrations/sync-state |
JWT Bearer |
GET |
/api/v1/admin/integrations/telematics/config |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/telematics/config |
JWT Bearer |
POST |
/api/v1/admin/integrations/telematics/sync |
JWT Bearer |
POST |
/api/v1/admin/integrations/telematics/test |
JWT Bearer |
GET |
/api/v1/admin/integrations/whatsapp |
JWT Bearer |
PATCH |
/api/v1/admin/integrations/whatsapp |
JWT Bearer |
GET |
/api/v1/admin/integrations/whatsapp/templates |
JWT Bearer |
POST |
/api/v1/admin/integrations/whatsapp/test |
JWT Bearer |
POST |
/api/v1/admin/jobs/project-kpi-snapshot |
JWT Bearer |
GET |
/api/v1/admin/personal-data-exports/audit |
JWT Bearer |
POST |
/api/v1/admin/sync/spdata |
JWT Bearer |
GET |
/api/v1/admin/system/auth-session |
JWT Bearer |
PATCH |
/api/v1/admin/system/auth-session |
JWT Bearer |
GET |
/api/v1/admin/system/automation |
JWT Bearer |
PATCH |
/api/v1/admin/system/automation |
JWT Bearer |
POST |
/api/v1/admin/system/automation/ollama/models |
JWT Bearer |
POST |
/api/v1/admin/system/automation/test/:target |
JWT Bearer |
GET |
/api/v1/admin/system/doctor |
JWT Bearer |
POST |
/api/v1/admin/system/doctor/repair/:checkId |
JWT Bearer |
GET |
/api/v1/admin/system/gaeb-unit-map |
JWT Bearer |
PUT |
/api/v1/admin/system/gaeb-unit-map |
JWT Bearer |
DELETE |
/api/v1/admin/system/gaeb-unit-map/:id |
JWT Bearer |
GET |
/api/v1/admin/system/mail-delivery |
JWT Bearer |
PATCH |
/api/v1/admin/system/mail-delivery |
JWT Bearer |
GET |
/api/v1/admin/system/mail-delivery/oauth/authorize |
JWT Bearer |
GET |
/api/v1/admin/system/mail-delivery/oauth/callback |
Ohne JWT (Allowlist) |
POST |
/api/v1/admin/system/mail-delivery/test |
JWT Bearer |
POST |
/api/v1/admin/system/mail-delivery/test-email |
JWT Bearer |
GET |
/api/v1/admin/telephony/config |
JWT Bearer |
PATCH |
/api/v1/admin/telephony/config |
JWT Bearer |
POST |
/api/v1/admin/telephony/test/cti-gateway |
JWT Bearer |
GET |
/api/v1/admin/tickets |
JWT Bearer |
DELETE |
/api/v1/admin/tickets/:id |
JWT Bearer |
GET |
/api/v1/admin/tickets/:id |
JWT Bearer |
PATCH |
/api/v1/admin/tickets/:id |
JWT Bearer |
POST |
/api/v1/admin/tickets/:id/archive |
JWT Bearer |
GET |
/api/v1/admin/tickets/:id/audit |
JWT Bearer |
POST |
/api/v1/admin/tickets/:id/unarchive |
JWT Bearer |
GET |
/api/v1/admin/ui-appearance |
JWT Bearer |
PATCH |
/api/v1/admin/ui-appearance |
JWT Bearer |
POST |
/api/v1/admin/update |
JWT Bearer |
GET |
/api/v1/admin/update/check |
JWT Bearer |
GET |
/api/v1/admin/update/history |
JWT Bearer |
GET |
/api/v1/admin/update/status |
JWT Bearer |
GET |
/api/v1/admin/user-feedback |
JWT Bearer |
GET |
/api/v1/admin/users |
JWT Bearer |
POST |
/api/v1/admin/users |
JWT Bearer |
DELETE |
/api/v1/admin/users/:id |
JWT Bearer |
PATCH |
/api/v1/admin/users/:id |
JWT Bearer |
POST |
/api/v1/admin/users/:id/request-password-reset |
JWT Bearer |
GET |
/api/v1/admin/users/check-email |
JWT Bearer |
POST |
/api/v1/admin/users/from-employee/:employeeId |
JWT Bearer |
GET |
/api/v1/admin/wiki/articles |
JWT Bearer |
POST |
/api/v1/admin/wiki/articles |
JWT Bearer |
DELETE |
/api/v1/admin/wiki/articles/:id |
JWT Bearer |
GET |
/api/v1/admin/wiki/articles/:id |
JWT Bearer |
PATCH |
/api/v1/admin/wiki/articles/:id |
JWT Bearer |
POST |
/api/v1/admin/wiki/reindex |
JWT Bearer |
Angebote — offers (39)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/offers |
JWT Bearer |
POST |
/api/v1/offers |
JWT Bearer |
DELETE |
/api/v1/offers/:id |
JWT Bearer |
GET |
/api/v1/offers/:id |
JWT Bearer |
PATCH |
/api/v1/offers/:id |
JWT Bearer |
POST |
/api/v1/offers/:id/accept |
JWT Bearer |
POST |
/api/v1/offers/:id/apply-template |
JWT Bearer |
POST |
/api/v1/offers/:id/customer-invoice |
JWT Bearer |
GET |
/api/v1/offers/:id/customer-pdf |
JWT Bearer |
POST |
/api/v1/offers/:id/duplicate |
JWT Bearer |
DELETE |
/api/v1/offers/:id/edit-lock |
JWT Bearer |
POST |
/api/v1/offers/:id/edit-lock |
JWT Bearer |
POST |
/api/v1/offers/:id/esign-request |
JWT Bearer |
GET |
/api/v1/offers/:id/items |
JWT Bearer |
POST |
/api/v1/offers/:id/items |
JWT Bearer |
DELETE |
/api/v1/offers/:id/items/:itemId |
JWT Bearer |
PATCH |
/api/v1/offers/:id/items/:itemId |
JWT Bearer |
DELETE |
/api/v1/offers/:id/items/:itemId/logo |
JWT Bearer |
POST |
/api/v1/offers/:id/items/:itemId/logo |
JWT Bearer |
POST |
/api/v1/offers/:id/items/reorder |
JWT Bearer |
POST |
/api/v1/offers/:id/order-confirmation |
JWT Bearer |
GET |
/api/v1/offers/:id/order-confirmation-pdf |
JWT Bearer |
DELETE |
/api/v1/offers/:id/release-portal |
JWT Bearer |
POST |
/api/v1/offers/:id/release-portal |
JWT Bearer |
GET |
/api/v1/offers/:id/rfq-pdf |
JWT Bearer |
POST |
/api/v1/offers/:id/save-as-template |
JWT Bearer |
POST |
/api/v1/offers/:id/send-email |
JWT Bearer |
GET |
/api/v1/offers/:id/supplier-comparison |
JWT Bearer |
POST |
/api/v1/offers/:id/supplier-quote-import |
JWT Bearer |
POST |
/api/v1/offers/:id/supplier-quote-import/confirm |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/ids/import-cart |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/ids/place-order |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/ids/session |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/oci/import-cart |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/oci/place-order |
JWT Bearer |
POST |
/api/v1/offers/:id/suppliers/:supplierId/oci/session |
JWT Bearer |
POST |
/api/v1/offers/pdf-import/confirm |
JWT Bearer |
POST |
/api/v1/offers/pdf-import/preview |
JWT Bearer |
GET |
/api/v1/offers/pdf-import/progress/:operationId |
JWT Bearer |
assistant — assistant (7)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/assistant/actions |
JWT Bearer |
POST |
/api/v1/assistant/actions/:id/confirm |
JWT Bearer |
POST |
/api/v1/assistant/actions/:id/undo |
JWT Bearer |
POST |
/api/v1/assistant/attachments |
JWT Bearer |
POST |
/api/v1/assistant/chat |
JWT Bearer |
POST |
/api/v1/assistant/chat/stream |
JWT Bearer |
GET |
/api/v1/assistant/status |
JWT Bearer |
Authentifizierung — auth (8)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/auth/field-app/pair |
Öffentlich / Refresh-Token |
POST |
/api/v1/auth/login |
Öffentlich / Refresh-Token |
POST |
/api/v1/auth/logout |
Öffentlich / Refresh-Token |
GET |
/api/v1/auth/me |
JWT Bearer |
POST |
/api/v1/auth/password-setup/confirm |
Öffentlich / Refresh-Token |
GET |
/api/v1/auth/password-setup/validate |
Öffentlich / Refresh-Token |
POST |
/api/v1/auth/refresh |
Öffentlich / Refresh-Token |
GET |
/api/v1/auth/session-policy |
JWT Bearer |
Automatisierung / KI — automations (7)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/automations/ai-analyze |
JWT Bearer |
POST |
/api/v1/automations/document-parsing/callback |
Ohne JWT (Allowlist) |
GET |
/api/v1/automations/ollama/status |
JWT Bearer |
GET |
/api/v1/automations/workflows |
JWT Bearer |
PATCH |
/api/v1/automations/workflows/:id |
JWT Bearer |
GET |
/api/v1/automations/workflows/:id/executions |
JWT Bearer |
POST |
/api/v1/automations/workflows/:id/trigger |
JWT Bearer |
Bestellungen — purchase-orders (8)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/purchase-orders |
JWT Bearer |
POST |
/api/v1/purchase-orders |
JWT Bearer |
GET |
/api/v1/purchase-orders/:id |
JWT Bearer |
PATCH |
/api/v1/purchase-orders/:id |
JWT Bearer |
GET |
/api/v1/purchase-orders/:id/labels.pdf |
JWT Bearer |
POST |
/api/v1/purchase-orders/:id/receive |
JWT Bearer |
POST |
/api/v1/purchase-orders/scan-receive |
JWT Bearer |
POST |
/api/v1/purchase-orders/scan-resolve |
JWT Bearer |
Bewertungen — reviews (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/reviews |
JWT Bearer |
POST |
/api/v1/reviews |
JWT Bearer |
DELETE |
/api/v1/reviews/:id |
JWT Bearer |
GET |
/api/v1/reviews/:id |
JWT Bearer |
PATCH |
/api/v1/reviews/:id |
JWT Bearer |
POST |
/api/v1/reviews/:id/send-request |
JWT Bearer |
billing — billing (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/billing/accounts |
JWT Bearer |
GET |
/api/v1/billing/invoices |
JWT Bearer |
POST |
/api/v1/billing/invoices/:invoiceId/dunning |
JWT Bearer |
POST |
/api/v1/billing/invoices/:invoiceId/dunning/send-email |
JWT Bearer |
PATCH |
/api/v1/billing/invoices/:invoiceId/payment |
JWT Bearer |
GET |
/api/v1/billing/summary |
JWT Bearer |
company-vehicles — company-vehicles (5)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/company-vehicles |
JWT Bearer |
POST |
/api/v1/company-vehicles |
JWT Bearer |
DELETE |
/api/v1/company-vehicles/:id |
JWT Bearer |
GET |
/api/v1/company-vehicles/:id |
JWT Bearer |
PATCH |
/api/v1/company-vehicles/:id |
JWT Bearer |
crm — crm (2)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/crm/activities |
JWT Bearer |
POST |
/api/v1/crm/activities/summarize |
JWT Bearer |
E-Check — e-check (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/e-check |
JWT Bearer |
POST |
/api/v1/e-check |
JWT Bearer |
DELETE |
/api/v1/e-check/:id |
JWT Bearer |
GET |
/api/v1/e-check/:id |
JWT Bearer |
PATCH |
/api/v1/e-check/:id |
JWT Bearer |
POST |
/api/v1/e-check/:id/generate-pdf |
JWT Bearer |
Einsatzplanung (Plantafel) — deployment-planner (12)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/deployment-planner |
JWT Bearer |
GET |
/api/v1/deployment-planner/absences |
JWT Bearer |
POST |
/api/v1/deployment-planner/assignments |
JWT Bearer |
DELETE |
/api/v1/deployment-planner/assignments/:id |
JWT Bearer |
PATCH |
/api/v1/deployment-planner/assignments/:id |
JWT Bearer |
POST |
/api/v1/deployment-planner/assignments/:id/split |
JWT Bearer |
GET |
/api/v1/deployment-planner/employee-visibility |
JWT Bearer |
PATCH |
/api/v1/deployment-planner/employee-visibility |
JWT Bearer |
POST |
/api/v1/deployment-planner/resource-reservations |
JWT Bearer |
DELETE |
/api/v1/deployment-planner/resource-reservations/:id |
JWT Bearer |
PATCH |
/api/v1/deployment-planner/resource-reservations/:id |
JWT Bearer |
GET |
/api/v1/deployment-planner/staffing-needs |
JWT Bearer |
Einstellungen (Stundensätze) — settings (23)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/settings/break-rules |
JWT Bearer |
PATCH |
/api/v1/settings/break-rules |
JWT Bearer |
GET |
/api/v1/settings/calculation-settings |
JWT Bearer |
PATCH |
/api/v1/settings/calculation-settings |
JWT Bearer |
GET |
/api/v1/settings/hourly-rate-defaults |
JWT Bearer |
PATCH |
/api/v1/settings/hourly-rate-defaults |
JWT Bearer |
GET |
/api/v1/settings/invoice-number-format |
JWT Bearer |
PATCH |
/api/v1/settings/invoice-number-format |
JWT Bearer |
GET |
/api/v1/settings/kpi-definitions |
JWT Bearer |
PATCH |
/api/v1/settings/kpi-definitions/:code |
JWT Bearer |
GET |
/api/v1/settings/margin-thresholds |
JWT Bearer |
PATCH |
/api/v1/settings/margin-thresholds |
JWT Bearer |
GET |
/api/v1/settings/project-number-format |
JWT Bearer |
PATCH |
/api/v1/settings/project-number-format |
JWT Bearer |
GET |
/api/v1/settings/project-statuses |
JWT Bearer |
POST |
/api/v1/settings/project-statuses |
JWT Bearer |
DELETE |
/api/v1/settings/project-statuses/:code |
JWT Bearer |
PATCH |
/api/v1/settings/project-statuses/:code |
JWT Bearer |
GET |
/api/v1/settings/ui-appearance |
Ohne JWT (Allowlist) |
GET |
/api/v1/settings/weekly-standup |
JWT Bearer |
PATCH |
/api/v1/settings/weekly-standup |
JWT Bearer |
GET |
/api/v1/settings/work-week |
JWT Bearer |
PATCH |
/api/v1/settings/work-week |
JWT Bearer |
esign-requests — esign-requests (4)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/esign-requests |
JWT Bearer |
GET |
/api/v1/esign-requests/:requestId/audit |
JWT Bearer |
POST |
/api/v1/esign-requests/:requestId/complete-stub |
JWT Bearer |
POST |
/api/v1/esign-requests/:requestId/retry |
JWT Bearer |
Export — exports (15)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/exports/csv |
JWT Bearer |
GET |
/api/v1/exports/datev |
JWT Bearer |
GET |
/api/v1/exports/datev/customer-invoices.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/customers.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/incoming-invoices.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/payroll.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/subcontractors.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/suppliers.csv |
JWT Bearer |
GET |
/api/v1/exports/datev/trip-log.csv |
JWT Bearer |
GET |
/api/v1/exports/json |
JWT Bearer |
GET |
/api/v1/exports/lexware-office/customer-invoices.csv |
JWT Bearer |
GET |
/api/v1/exports/spdata |
JWT Bearer |
GET |
/api/v1/exports/subcontractors.xlsx |
JWT Bearer |
GET |
/api/v1/exports/timesheet |
JWT Bearer |
GET |
/api/v1/exports/trip-log.xlsx |
JWT Bearer |
Fahrtenbuch — trip-log (7)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/trip-log |
JWT Bearer |
POST |
/api/v1/trip-log |
JWT Bearer |
DELETE |
/api/v1/trip-log/:id |
JWT Bearer |
GET |
/api/v1/trip-log/:id |
JWT Bearer |
PATCH |
/api/v1/trip-log/:id |
JWT Bearer |
POST |
/api/v1/trip-log/:id/confirm |
JWT Bearer |
POST |
/api/v1/trip-log/:id/reject |
JWT Bearer |
Field App (Monteur) — field-app (23)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/service/field-app/absences |
JWT Bearer |
GET |
/api/v1/service/field-app/articles/search |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/:id |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/:id/checklist |
JWT Bearer |
PATCH |
/api/v1/service/field-app/assignments/:id/checklist |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/:id/material-requests |
JWT Bearer |
POST |
/api/v1/service/field-app/assignments/:id/material-requests |
JWT Bearer |
POST |
/api/v1/service/field-app/assignments/:id/materials |
JWT Bearer |
POST |
/api/v1/service/field-app/assignments/:id/photos |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/:id/pick-list |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/:id/planned-material |
JWT Bearer |
POST |
/api/v1/service/field-app/assignments/:id/report |
JWT Bearer |
POST |
/api/v1/service/field-app/assignments/:id/signature-link |
JWT Bearer |
PATCH |
/api/v1/service/field-app/assignments/:id/status |
JWT Bearer |
GET |
/api/v1/service/field-app/assignments/today |
JWT Bearer |
GET |
/api/v1/service/field-app/materials |
JWT Bearer |
PATCH |
/api/v1/service/field-app/pick-list-items/:itemId |
JWT Bearer |
DELETE |
/api/v1/service/field-app/push/register |
JWT Bearer |
POST |
/api/v1/service/field-app/push/register |
JWT Bearer |
POST |
/api/v1/service/field-app/qr-scan |
JWT Bearer |
POST |
/api/v1/service/field-app/sync |
JWT Bearer |
POST |
/api/v1/service/field-app/time-entries |
JWT Bearer |
GET |
/api/v1/service/field-app/time-entries/today |
JWT Bearer |
GAEB (LV Import/Export) — gaeb (1)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/gaeb/documents/:documentId |
JWT Bearer |
Globale Suche — search (1)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/search |
JWT Bearer |
hourly-rates — hourly-rates (3)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/hourly-rates |
JWT Bearer |
POST |
/api/v1/hourly-rates |
JWT Bearer |
PATCH |
/api/v1/hourly-rates/:id |
JWT Bearer |
Import — imports (8)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/imports |
JWT Bearer |
GET |
/api/v1/imports/:id |
JWT Bearer |
POST |
/api/v1/imports/csv |
JWT Bearer |
POST |
/api/v1/imports/csv/confirm |
JWT Bearer |
POST |
/api/v1/imports/customers-csv |
JWT Bearer |
POST |
/api/v1/imports/datanorm |
JWT Bearer |
POST |
/api/v1/imports/lexware-csv |
JWT Bearer |
POST |
/api/v1/imports/preview |
JWT Bearer |
Kalkulation & Steuer — calculation (1)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/calculation/preview |
JWT Bearer |
Kommunikation — communications (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/communications |
JWT Bearer |
POST |
/api/v1/communications |
JWT Bearer |
GET |
/api/v1/communications/:id |
JWT Bearer |
PATCH |
/api/v1/communications/:id |
JWT Bearer |
POST |
/api/v1/communications/:id/queue |
JWT Bearer |
GET |
/api/v1/communications/whatsapp/templates |
JWT Bearer |
KPI-Dashboard — dashboard (17)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/dashboard/department-utilization |
JWT Bearer |
GET |
/api/v1/dashboard/executive-export |
JWT Bearer |
GET |
/api/v1/dashboard/pipeline-book |
JWT Bearer |
GET |
/api/v1/dashboard/projects |
JWT Bearer |
GET |
/api/v1/dashboard/resource-overview |
JWT Bearer |
GET |
/api/v1/dashboard/rolling-overview |
JWT Bearer |
GET |
/api/v1/dashboard/summary |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup/config |
JWT Bearer |
PATCH |
/api/v1/dashboard/weekly-standup/config |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup/report-recipients |
JWT Bearer |
PATCH |
/api/v1/dashboard/weekly-standup/report-recipients |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup/snapshots |
JWT Bearer |
POST |
/api/v1/dashboard/weekly-standup/snapshots |
JWT Bearer |
DELETE |
/api/v1/dashboard/weekly-standup/snapshots/:id |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup/snapshots/:id |
JWT Bearer |
GET |
/api/v1/dashboard/weekly-standup/snapshots/:id/pdf |
JWT Bearer |
Kunden (CRM) — customers (13)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/customers |
JWT Bearer |
POST |
/api/v1/customers |
JWT Bearer |
DELETE |
/api/v1/customers/:id |
JWT Bearer |
GET |
/api/v1/customers/:id |
JWT Bearer |
PATCH |
/api/v1/customers/:id |
JWT Bearer |
GET |
/api/v1/customers/:id/contacts |
JWT Bearer |
POST |
/api/v1/customers/:id/contacts |
JWT Bearer |
DELETE |
/api/v1/customers/:id/contacts/:contactId |
JWT Bearer |
PATCH |
/api/v1/customers/:id/contacts/:contactId |
JWT Bearer |
GET |
/api/v1/customers/address-search |
JWT Bearer |
GET |
/api/v1/customers/check-number |
JWT Bearer |
GET |
/api/v1/customers/export.xlsx |
JWT Bearer |
GET |
/api/v1/customers/next-number |
JWT Bearer |
Kundenportal — customer-portal (19)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/customer-portal/bautagebuch |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/cockpit |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/invites |
JWT Bearer |
POST |
/api/v1/customer-portal/invites |
JWT Bearer |
DELETE |
/api/v1/customer-portal/invites/:id |
JWT Bearer |
GET |
/api/v1/customer-portal/invites/:id |
JWT Bearer |
PATCH |
/api/v1/customer-portal/invites/:id |
JWT Bearer |
POST |
/api/v1/customer-portal/invites/:id/link |
JWT Bearer |
POST |
/api/v1/customer-portal/invites/:id/send |
JWT Bearer |
GET |
/api/v1/customer-portal/invoices |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/offers |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/offers/:offerId |
Kundenportal-JWT |
POST |
/api/v1/customer-portal/offers/:offerId/accept |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/offers/:offerId/pdf |
Kundenportal-JWT |
GET |
/api/v1/customer-portal/remote-support |
Kundenportal-JWT |
DELETE |
/api/v1/customer-portal/remote-support/grant |
Kundenportal-JWT |
POST |
/api/v1/customer-portal/remote-support/grant |
Kundenportal-JWT |
DELETE |
/api/v1/customer-portal/session |
Kundenportal-Session |
POST |
/api/v1/customer-portal/session |
Kundenportal-Session |
Leads — leads (5)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/leads |
JWT Bearer |
POST |
/api/v1/leads |
JWT Bearer |
DELETE |
/api/v1/leads/:id |
JWT Bearer |
GET |
/api/v1/leads/:id |
JWT Bearer |
PATCH |
/api/v1/leads/:id |
JWT Bearer |
Material & Lager — materials (17)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/materials |
JWT Bearer |
POST |
/api/v1/materials |
JWT Bearer |
PATCH |
/api/v1/materials/:id |
JWT Bearer |
GET |
/api/v1/materials/:id/supplier-prices |
JWT Bearer |
GET |
/api/v1/materials/movements |
JWT Bearer |
POST |
/api/v1/materials/movements |
JWT Bearer |
GET |
/api/v1/materials/purchase-orders |
JWT Bearer |
POST |
/api/v1/materials/purchase-orders |
JWT Bearer |
GET |
/api/v1/materials/purchase-orders/:id |
JWT Bearer |
PATCH |
/api/v1/materials/purchase-orders/:id |
JWT Bearer |
GET |
/api/v1/materials/purchase-orders/:id/labels.pdf |
JWT Bearer |
POST |
/api/v1/materials/purchase-orders/:id/receive |
JWT Bearer |
POST |
/api/v1/materials/purchase-orders/scan-receive |
JWT Bearer |
POST |
/api/v1/materials/purchase-orders/scan-resolve |
JWT Bearer |
GET |
/api/v1/materials/reorder-alerts |
JWT Bearer |
GET |
/api/v1/materials/supplier-invoices |
JWT Bearer |
POST |
/api/v1/materials/supplier-invoices/import |
JWT Bearer |
me — me (27)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/me/absences |
JWT Bearer |
POST |
/api/v1/me/absences |
JWT Bearer |
POST |
/api/v1/me/absences/:id/cancel |
JWT Bearer |
GET |
/api/v1/me/absences/:id/certificate |
JWT Bearer |
POST |
/api/v1/me/absences/:id/certificate |
JWT Bearer |
GET |
/api/v1/me/dashboard-overview |
JWT Bearer |
GET |
/api/v1/me/deployments-today |
JWT Bearer |
GET |
/api/v1/me/employee |
JWT Bearer |
POST |
/api/v1/me/ics-token |
JWT Bearer |
GET |
/api/v1/me/outlook |
JWT Bearer |
DELETE |
/api/v1/me/outlook/connection |
JWT Bearer |
GET |
/api/v1/me/outlook/oauth/authorize |
JWT Bearer |
PATCH |
/api/v1/me/outlook/sync-preferences |
JWT Bearer |
GET |
/api/v1/me/personal-todos |
JWT Bearer |
POST |
/api/v1/me/personal-todos |
JWT Bearer |
DELETE |
/api/v1/me/personal-todos/:id |
JWT Bearer |
PATCH |
/api/v1/me/personal-todos/:id |
JWT Bearer |
GET |
/api/v1/me/preferences |
JWT Bearer |
PATCH |
/api/v1/me/preferences |
JWT Bearer |
GET |
/api/v1/me/projects |
JWT Bearer |
GET |
/api/v1/me/standup-todos |
JWT Bearer |
PATCH |
/api/v1/me/standup-todos/:id |
JWT Bearer |
GET |
/api/v1/me/time-correction-requests |
JWT Bearer |
POST |
/api/v1/me/time-correction-requests |
JWT Bearer |
POST |
/api/v1/me/time-entries |
JWT Bearer |
GET |
/api/v1/me/time-summary |
JWT Bearer |
GET |
/api/v1/me/time-summary/export.csv |
JWT Bearer |
Mitarbeiter — employees (33)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/employees |
JWT Bearer |
POST |
/api/v1/employees |
JWT Bearer |
DELETE |
/api/v1/employees/:id |
JWT Bearer |
GET |
/api/v1/employees/:id |
JWT Bearer |
PATCH |
/api/v1/employees/:id |
JWT Bearer |
POST |
/api/v1/employees/:id/ics-token |
JWT Bearer |
GET |
/api/v1/employees/:id/labor-entries |
JWT Bearer |
GET |
/api/v1/employees/calendar/:token.ics |
ICS-Token (URL) |
GET |
/api/v1/employees/check-name |
JWT Bearer |
GET |
/api/v1/employees/check-personnel-number |
JWT Bearer |
GET |
/api/v1/employees/export.xlsx |
JWT Bearer |
GET |
/api/v1/employees/hours-overview |
JWT Bearer |
POST |
/api/v1/employees/import |
JWT Bearer |
POST |
/api/v1/employees/import/commit |
JWT Bearer |
GET |
/api/v1/employees/me/absences |
JWT Bearer |
POST |
/api/v1/employees/me/absences |
JWT Bearer |
POST |
/api/v1/employees/me/absences/:id/cancel |
JWT Bearer |
GET |
/api/v1/employees/me/absences/:id/certificate |
JWT Bearer |
POST |
/api/v1/employees/me/absences/:id/certificate |
JWT Bearer |
GET |
/api/v1/employees/me/assignments |
JWT Bearer |
GET |
/api/v1/employees/me/assignments/:assignmentId/checklist |
JWT Bearer |
PATCH |
/api/v1/employees/me/assignments/:assignmentId/checklist |
JWT Bearer |
GET |
/api/v1/employees/me/labor-entries |
JWT Bearer |
POST |
/api/v1/employees/me/labor-entries |
JWT Bearer |
GET |
/api/v1/employees/me/notifications |
JWT Bearer |
POST |
/api/v1/employees/me/notifications/mark-read |
JWT Bearer |
POST |
/api/v1/employees/me/offline-sync |
JWT Bearer |
PUT |
/api/v1/employees/me/push-subscription |
JWT Bearer |
GET |
/api/v1/employees/me/push-subscription/vapid-public-key |
JWT Bearer |
POST |
/api/v1/employees/me/site-photos |
JWT Bearer |
POST |
/api/v1/employees/me/time-entries |
JWT Bearer |
GET |
/api/v1/employees/me/time-entries/today |
JWT Bearer |
GET |
/api/v1/employees/role-definitions |
JWT Bearer |
oauth — oauth (2)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/oauth/lexware/authorize |
JWT Bearer |
GET |
/api/v1/oauth/lexware/callback |
Ohne JWT (Allowlist) |
Öffentliche Terminbuchung — public-booking (11)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/public-booking/:slug |
Öffentlich (Turnstile) |
POST |
/api/v1/public-booking/:slug/book |
Öffentlich (Turnstile) |
GET |
/api/v1/public-booking/:slug/slots |
Öffentlich (Turnstile) |
POST |
/api/v1/public-booking/cancel |
Öffentlich (Turnstile) |
GET |
/api/v1/public-booking/links |
JWT Bearer |
POST |
/api/v1/public-booking/links |
JWT Bearer |
PATCH |
/api/v1/public-booking/links/:linkId |
JWT Bearer |
GET |
/api/v1/public-booking/links/:linkId/audit |
JWT Bearer |
GET |
/api/v1/public-booking/links/:linkId/slots |
JWT Bearer |
POST |
/api/v1/public-booking/links/:linkId/slots |
JWT Bearer |
PATCH |
/api/v1/public-booking/links/:linkId/slots/:slotId/release |
JWT Bearer |
offer-templates — offer-templates (5)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/offer-templates |
JWT Bearer |
POST |
/api/v1/offer-templates |
JWT Bearer |
DELETE |
/api/v1/offer-templates/:id |
JWT Bearer |
GET |
/api/v1/offer-templates/:id |
JWT Bearer |
PATCH |
/api/v1/offer-templates/:id |
JWT Bearer |
Outlook / Kalender — outlook (5)
| Methode | Pfad | Auth |
|---|---|---|
DELETE |
/api/v1/outlook/connections/:employeeId |
JWT Bearer |
GET |
/api/v1/outlook/connections/:employeeId |
JWT Bearer |
PATCH |
/api/v1/outlook/connections/:employeeId/sync-preferences |
JWT Bearer |
GET |
/api/v1/outlook/oauth/authorize |
JWT Bearer |
GET |
/api/v1/outlook/oauth/callback |
OAuth-Redirect |
Projekte & Aufträge — projects (147)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/projects |
JWT Bearer |
POST |
/api/v1/projects |
JWT Bearer |
DELETE |
/api/v1/projects/:id |
JWT Bearer |
GET |
/api/v1/projects/:id |
JWT Bearer |
PATCH |
/api/v1/projects/:id |
JWT Bearer |
GET |
/api/v1/projects/:id/amendments |
JWT Bearer |
POST |
/api/v1/projects/:id/amendments |
JWT Bearer |
DELETE |
/api/v1/projects/:id/amendments/:amendmentId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/amendments/:amendmentId |
JWT Bearer |
GET |
/api/v1/projects/:id/budget-status |
JWT Bearer |
GET |
/api/v1/projects/:id/checklist-items |
JWT Bearer |
POST |
/api/v1/projects/:id/checklist-items |
JWT Bearer |
DELETE |
/api/v1/projects/:id/checklist-items/:itemId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/checklist-items/:itemId |
JWT Bearer |
GET |
/api/v1/projects/:id/cloud-folder/files |
JWT Bearer |
GET |
/api/v1/projects/:id/cloud-folder/files/content |
JWT Bearer |
POST |
/api/v1/projects/:id/cloud-folder/sync |
JWT Bearer |
POST |
/api/v1/projects/:id/cloud-folder/test |
JWT Bearer |
GET |
/api/v1/projects/:id/construction-phases |
JWT Bearer |
PATCH |
/api/v1/projects/:id/construction-phases |
JWT Bearer |
GET |
/api/v1/projects/:id/cost-summary |
JWT Bearer |
GET |
/api/v1/projects/:id/customer-invoices |
JWT Bearer |
POST |
/api/v1/projects/:id/customer-invoices |
JWT Bearer |
DELETE |
/api/v1/projects/:id/customer-invoices/:invoiceId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/customer-invoices/:invoiceId |
JWT Bearer |
POST |
/api/v1/projects/:id/customer-invoices/:invoiceId/follow-up |
JWT Bearer |
POST |
/api/v1/projects/:id/customer-invoices/:invoiceId/lexware/pull-payment |
JWT Bearer |
POST |
/api/v1/projects/:id/customer-invoices/:invoiceId/lexware/push |
JWT Bearer |
GET |
/api/v1/projects/:id/customer-invoices/:invoiceId/pdf |
JWT Bearer |
GET |
/api/v1/projects/:id/customer-invoices/:invoiceId/zugferd |
JWT Bearer |
GET |
/api/v1/projects/:id/customer-invoices/:invoiceId/zugferd.pdf |
JWT Bearer |
POST |
/api/v1/projects/:id/customer-invoices/from-measurements |
JWT Bearer |
GET |
/api/v1/projects/:id/documents |
JWT Bearer |
POST |
/api/v1/projects/:id/documents |
JWT Bearer |
DELETE |
/api/v1/projects/:id/documents/:documentId |
JWT Bearer |
GET |
/api/v1/projects/:id/documents/:documentId/cloud-link |
JWT Bearer |
GET |
/api/v1/projects/:id/documents/:documentId/content |
JWT Bearer |
GET |
/api/v1/projects/:id/ema-maintenance-records |
JWT Bearer |
POST |
/api/v1/projects/:id/ema-maintenance-records |
JWT Bearer |
GET |
/api/v1/projects/:id/ema-maintenance-records/:recordId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/ema-maintenance-records/:recordId |
JWT Bearer |
GET |
/api/v1/projects/:id/ema-maintenance-records/:recordId/pdf |
JWT Bearer |
GET |
/api/v1/projects/:id/events |
JWT Bearer |
GET |
/api/v1/projects/:id/export/gaeb |
JWT Bearer |
POST |
/api/v1/projects/:id/field-photos |
JWT Bearer |
GET |
/api/v1/projects/:id/gaeb/documents |
JWT Bearer |
DELETE |
/api/v1/projects/:id/gaeb/documents/:documentId |
JWT Bearer |
POST |
/api/v1/projects/:id/gaeb/documents/:documentId/commit-lv |
JWT Bearer |
GET |
/api/v1/projects/:id/gaeb/documents/:documentId/commit-preview |
JWT Bearer |
GET |
/api/v1/projects/:id/gaeb/import-jobs/:jobId |
JWT Bearer |
POST |
/api/v1/projects/:id/import/gaeb |
JWT Bearer |
POST |
/api/v1/projects/:id/import/lv |
JWT Bearer |
POST |
/api/v1/projects/:id/import/lv/commit |
JWT Bearer |
POST |
/api/v1/projects/:id/import/lv/ollama-preview |
JWT Bearer |
GET |
/api/v1/projects/:id/inspection-records |
JWT Bearer |
POST |
/api/v1/projects/:id/inspection-records |
JWT Bearer |
PATCH |
/api/v1/projects/:id/inspection-records/:recordId |
JWT Bearer |
GET |
/api/v1/projects/:id/inspection-records/:recordId/protocol |
JWT Bearer |
GET |
/api/v1/projects/:id/kpi-history |
JWT Bearer |
GET |
/api/v1/projects/:id/labor-billings |
JWT Bearer |
POST |
/api/v1/projects/:id/labor-billings |
JWT Bearer |
GET |
/api/v1/projects/:id/labor-entries |
JWT Bearer |
POST |
/api/v1/projects/:id/labor-entries |
JWT Bearer |
GET |
/api/v1/projects/:id/labor-plans |
JWT Bearer |
PATCH |
/api/v1/projects/:id/labor-plans |
JWT Bearer |
DELETE |
/api/v1/projects/:id/lv-positions |
JWT Bearer |
GET |
/api/v1/projects/:id/lv-positions |
JWT Bearer |
POST |
/api/v1/projects/:id/lv-positions |
JWT Bearer |
PATCH |
/api/v1/projects/:id/lv-positions/:lvId |
JWT Bearer |
GET |
/api/v1/projects/:id/maintenance-contracts |
JWT Bearer |
POST |
/api/v1/projects/:id/maintenance-contracts |
JWT Bearer |
GET |
/api/v1/projects/:id/maintenance-contracts/:contractId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/maintenance-contracts/:contractId |
JWT Bearer |
POST |
/api/v1/projects/:id/maintenance-contracts/:contractId/billing-draft |
JWT Bearer |
GET |
/api/v1/projects/:id/maintenance-contracts/:contractId/contract.pdf |
JWT Bearer |
POST |
/api/v1/projects/:id/maintenance-contracts/:contractId/esign-request |
JWT Bearer |
GET |
/api/v1/projects/:id/material-entries |
JWT Bearer |
POST |
/api/v1/projects/:id/material-entries |
JWT Bearer |
PATCH |
/api/v1/projects/:id/material-entries/:materialId |
JWT Bearer |
GET |
/api/v1/projects/:id/material-plan |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan |
JWT Bearer |
DELETE |
/api/v1/projects/:id/material-plan/:planLineId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/material-plan/:planLineId |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan/create-purchase-order |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan/import-offer |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan/reserve |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan/supplier-quote-import |
JWT Bearer |
POST |
/api/v1/projects/:id/material-plan/supplier-quote-import/confirm |
JWT Bearer |
GET |
/api/v1/projects/:id/material-requests |
JWT Bearer |
PATCH |
/api/v1/projects/:id/material-requests/:requestId |
JWT Bearer |
POST |
/api/v1/projects/:id/material-requests/:requestId/fulfill-all |
JWT Bearer |
PATCH |
/api/v1/projects/:id/material-requests/:requestId/lines/:lineId |
JWT Bearer |
GET |
/api/v1/projects/:id/material-requests/:requestId/pdf |
JWT Bearer |
GET |
/api/v1/projects/:id/material-reservations |
JWT Bearer |
POST |
/api/v1/projects/:id/material-reservations |
JWT Bearer |
GET |
/api/v1/projects/:id/measurement-reports |
JWT Bearer |
POST |
/api/v1/projects/:id/measurement-reports |
JWT Bearer |
DELETE |
/api/v1/projects/:id/measurement-reports/:reportId |
JWT Bearer |
GET |
/api/v1/projects/:id/measurement-reports/:reportId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/measurement-reports/:reportId |
JWT Bearer |
GET |
/api/v1/projects/:id/measurement-reports/:reportId/pdf |
JWT Bearer |
GET |
/api/v1/projects/:id/measurement-reports/summary |
JWT Bearer |
GET |
/api/v1/projects/:id/measurements |
JWT Bearer |
POST |
/api/v1/projects/:id/measurements |
JWT Bearer |
DELETE |
/api/v1/projects/:id/measurements/:measurementId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/measurements/:measurementId |
JWT Bearer |
GET |
/api/v1/projects/:id/messages |
JWT Bearer |
POST |
/api/v1/projects/:id/messages |
JWT Bearer |
PATCH |
/api/v1/projects/:id/next-action |
JWT Bearer |
POST |
/api/v1/projects/:id/offers/from-lv |
JWT Bearer |
GET |
/api/v1/projects/:id/participants |
JWT Bearer |
GET |
/api/v1/projects/:id/performance-status |
JWT Bearer |
PATCH |
/api/v1/projects/:id/pick-list-items/:itemId |
JWT Bearer |
GET |
/api/v1/projects/:id/pick-lists |
JWT Bearer |
POST |
/api/v1/projects/:id/pick-lists |
JWT Bearer |
GET |
/api/v1/projects/:id/schedule-deviation |
JWT Bearer |
GET |
/api/v1/projects/:id/service-reminders |
JWT Bearer |
GET |
/api/v1/projects/:id/service-tickets |
JWT Bearer |
POST |
/api/v1/projects/:id/service-tickets |
JWT Bearer |
PATCH |
/api/v1/projects/:id/service-tickets/:ticketId |
JWT Bearer |
GET |
/api/v1/projects/:id/service-tickets/:ticketId/audit |
JWT Bearer |
PATCH |
/api/v1/projects/:id/standup |
JWT Bearer |
POST |
/api/v1/projects/:id/standup/appointments |
JWT Bearer |
DELETE |
/api/v1/projects/:id/standup/appointments/:itemId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/standup/appointments/:itemId |
JWT Bearer |
POST |
/api/v1/projects/:id/standup/copy-week-assignments |
JWT Bearer |
POST |
/api/v1/projects/:id/standup/planned-assignments |
JWT Bearer |
POST |
/api/v1/projects/:id/standup/todos |
JWT Bearer |
DELETE |
/api/v1/projects/:id/standup/todos/:itemId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/standup/todos/:itemId |
JWT Bearer |
PATCH |
/api/v1/projects/:id/traffic-override |
JWT Bearer |
GET |
/api/v1/projects/:id/work-orders |
JWT Bearer |
POST |
/api/v1/projects/:id/work-orders |
JWT Bearer |
PATCH |
/api/v1/projects/:id/work-orders/:ticketId |
JWT Bearer |
GET |
/api/v1/projects/:id/work-orders/:ticketId/audit |
JWT Bearer |
PATCH |
/api/v1/projects/:projectId/customer-invoices/:invoiceId/portal-release |
JWT Bearer |
PATCH |
/api/v1/projects/:projectId/documents/:documentId/portal-release |
JWT Bearer |
GET |
/api/v1/projects/:projectId/esign-requests |
JWT Bearer |
PATCH |
/api/v1/projects/:projectId/portal/cockpit |
JWT Bearer |
PATCH |
/api/v1/projects/bulk/status |
JWT Bearer |
PATCH |
/api/v1/projects/bulk/traffic |
JWT Bearer |
GET |
/api/v1/projects/export.xlsx |
JWT Bearer |
POST |
/api/v1/projects/import |
JWT Bearer |
POST |
/api/v1/projects/import/commit |
JWT Bearer |
GET |
/api/v1/projects/next-number |
JWT Bearer |
GET |
/api/v1/projects/number-format |
JWT Bearer |
GET |
/api/v1/projects/status-definitions |
JWT Bearer |
public-offer — public-offer (3)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/public-offer/:token |
Ohne JWT (Allowlist) |
POST |
/api/v1/public-offer/:token/accept |
Ohne JWT (Allowlist) |
GET |
/api/v1/public-offer/:token/pdf |
Ohne JWT (Allowlist) |
PV-Anlagen — pv-installations (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/pv-installations |
JWT Bearer |
POST |
/api/v1/pv-installations |
JWT Bearer |
DELETE |
/api/v1/pv-installations/:id |
JWT Bearer |
GET |
/api/v1/pv-installations/:id |
JWT Bearer |
PATCH |
/api/v1/pv-installations/:id |
JWT Bearer |
POST |
/api/v1/pv-installations/:id/generate-pdf |
JWT Bearer |
RBAC / Berechtigungen — rbac (22)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/rbac/delegations |
JWT Bearer |
POST |
/api/v1/rbac/delegations |
JWT Bearer |
DELETE |
/api/v1/rbac/delegations/:id |
JWT Bearer |
GET |
/api/v1/rbac/departments |
JWT Bearer |
POST |
/api/v1/rbac/departments |
JWT Bearer |
DELETE |
/api/v1/rbac/departments/:departmentId |
JWT Bearer |
PATCH |
/api/v1/rbac/departments/:departmentId |
JWT Bearer |
DELETE |
/api/v1/rbac/departments/:departmentId/logo |
JWT Bearer |
GET |
/api/v1/rbac/departments/:departmentId/logo |
JWT Bearer |
POST |
/api/v1/rbac/departments/:departmentId/logo |
JWT Bearer |
GET |
/api/v1/rbac/employee-roles |
JWT Bearer |
POST |
/api/v1/rbac/employee-roles |
JWT Bearer |
DELETE |
/api/v1/rbac/employee-roles/:code |
JWT Bearer |
PATCH |
/api/v1/rbac/employee-roles/:code |
JWT Bearer |
GET |
/api/v1/rbac/me |
JWT Bearer |
GET |
/api/v1/rbac/permissions |
JWT Bearer |
GET |
/api/v1/rbac/roles |
JWT Bearer |
PUT |
/api/v1/rbac/roles/:fachRolle |
JWT Bearer |
PATCH |
/api/v1/rbac/roles/matrix |
JWT Bearer |
POST |
/api/v1/rbac/roles/reset |
JWT Bearer |
GET |
/api/v1/rbac/users/:userId |
JWT Bearer |
PATCH |
/api/v1/rbac/users/:userId |
JWT Bearer |
remote-support — remote-support (3)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/remote-support/remote-support/sessions/:sessionId/sync |
JWT Bearer |
GET |
/api/v1/remote-support/service-orders/:serviceOrderId/remote-support/sessions |
JWT Bearer |
POST |
/api/v1/remote-support/service-orders/:serviceOrderId/remote-support/sessions |
JWT Bearer |
Service & Wartung — service (22)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/service/maintenance-contracts |
JWT Bearer |
POST |
/api/v1/service/maintenance-contracts |
JWT Bearer |
DELETE |
/api/v1/service/maintenance-contracts/:id |
JWT Bearer |
GET |
/api/v1/service/maintenance-contracts/:id |
JWT Bearer |
PATCH |
/api/v1/service/maintenance-contracts/:id |
JWT Bearer |
POST |
/api/v1/service/maintenance-contracts/:id/billing-draft |
JWT Bearer |
POST |
/api/v1/service/maintenance-contracts/:id/esign-request |
JWT Bearer |
POST |
/api/v1/service/maintenance-contracts/:id/generate-pdf |
JWT Bearer |
POST |
/api/v1/service/maintenance-contracts/:id/signature |
JWT Bearer |
GET |
/api/v1/service/orders |
JWT Bearer |
POST |
/api/v1/service/orders |
JWT Bearer |
DELETE |
/api/v1/service/orders/:id |
JWT Bearer |
GET |
/api/v1/service/orders/:id |
JWT Bearer |
PATCH |
/api/v1/service/orders/:id |
JWT Bearer |
POST |
/api/v1/service/orders/:id/checklist-items |
JWT Bearer |
DELETE |
/api/v1/service/orders/:id/checklist-items/:itemId |
JWT Bearer |
PATCH |
/api/v1/service/orders/:id/checklist-items/:itemId |
JWT Bearer |
GET |
/api/v1/service/orders/:id/protocol.pdf |
JWT Bearer |
POST |
/api/v1/service/orders/:id/reminders |
JWT Bearer |
DELETE |
/api/v1/service/orders/:id/reminders/:reminderId |
JWT Bearer |
PATCH |
/api/v1/service/orders/:id/status |
JWT Bearer |
GET |
/api/v1/service/project-service-tickets |
JWT Bearer |
Setup-Wizard — setup (5)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/setup/audit-step |
Setup-Token (VOLT_SETUP_TOKEN) |
POST |
/api/v1/setup/complete |
Setup-Token (VOLT_SETUP_TOKEN) |
GET |
/api/v1/setup/status |
Setup-Token (VOLT_SETUP_TOKEN) |
POST |
/api/v1/setup/test-backup |
Setup-Token (VOLT_SETUP_TOKEN) |
POST |
/api/v1/setup/validate-token |
Setup-Token (VOLT_SETUP_TOKEN) |
Subunternehmer — subcontractors (22)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/subcontractors |
JWT Bearer |
POST |
/api/v1/subcontractors |
JWT Bearer |
DELETE |
/api/v1/subcontractors/:id |
JWT Bearer |
GET |
/api/v1/subcontractors/:id |
JWT Bearer |
PATCH |
/api/v1/subcontractors/:id |
JWT Bearer |
GET |
/api/v1/subcontractors/:id/contacts |
JWT Bearer |
POST |
/api/v1/subcontractors/:id/contacts |
JWT Bearer |
DELETE |
/api/v1/subcontractors/:id/contacts/:contactId |
JWT Bearer |
PATCH |
/api/v1/subcontractors/:id/contacts/:contactId |
JWT Bearer |
GET |
/api/v1/subcontractors/:id/framework-contracts |
JWT Bearer |
POST |
/api/v1/subcontractors/:id/framework-contracts |
JWT Bearer |
DELETE |
/api/v1/subcontractors/:id/framework-contracts/:contractId |
JWT Bearer |
PATCH |
/api/v1/subcontractors/:id/framework-contracts/:contractId |
JWT Bearer |
GET |
/api/v1/subcontractors/:id/workers |
JWT Bearer |
POST |
/api/v1/subcontractors/:id/workers |
JWT Bearer |
DELETE |
/api/v1/subcontractors/:id/workers/:workerId |
JWT Bearer |
PATCH |
/api/v1/subcontractors/:id/workers/:workerId |
JWT Bearer |
GET |
/api/v1/subcontractors/next-number |
JWT Bearer |
GET |
/api/v1/subcontractors/project-assignments |
JWT Bearer |
POST |
/api/v1/subcontractors/project-assignments |
JWT Bearer |
DELETE |
/api/v1/subcontractors/project-assignments/:id |
JWT Bearer |
PATCH |
/api/v1/subcontractors/project-assignments/:id |
JWT Bearer |
suppliers — suppliers (20)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/suppliers |
JWT Bearer |
POST |
/api/v1/suppliers |
JWT Bearer |
GET |
/api/v1/suppliers/:id |
JWT Bearer |
PATCH |
/api/v1/suppliers/:id |
JWT Bearer |
GET |
/api/v1/suppliers/:id/contacts |
JWT Bearer |
POST |
/api/v1/suppliers/:id/contacts |
JWT Bearer |
DELETE |
/api/v1/suppliers/:id/contacts/:contactId |
JWT Bearer |
PATCH |
/api/v1/suppliers/:id/contacts/:contactId |
JWT Bearer |
POST |
/api/v1/suppliers/:id/ids/import-cart |
JWT Bearer |
POST |
/api/v1/suppliers/:id/ids/session |
JWT Bearer |
POST |
/api/v1/suppliers/:id/oci/import-cart |
JWT Bearer |
GET |
/api/v1/suppliers/:id/oci/return |
Ohne JWT (Allowlist) |
POST |
/api/v1/suppliers/:id/oci/return |
Ohne JWT (Allowlist) |
POST |
/api/v1/suppliers/:id/oci/session |
JWT Bearer |
POST |
/api/v1/suppliers/:id/sync/comnorm |
JWT Bearer |
POST |
/api/v1/suppliers/:id/sync/ids |
JWT Bearer |
POST |
/api/v1/suppliers/:id/test/:target |
JWT Bearer |
POST |
/api/v1/suppliers/from-preset |
JWT Bearer |
GET |
/api/v1/suppliers/meta/catalog-gateway-status |
JWT Bearer |
GET |
/api/v1/suppliers/presets |
JWT Bearer |
Telefonie — telephony (16)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/telephony/callback-tasks |
JWT Bearer |
PATCH |
/api/v1/telephony/callback-tasks/:id |
JWT Bearer |
POST |
/api/v1/telephony/callback-tasks/schedule |
JWT Bearer |
GET |
/api/v1/telephony/calls |
JWT Bearer |
POST |
/api/v1/telephony/calls |
JWT Bearer |
DELETE |
/api/v1/telephony/calls/:id |
JWT Bearer |
GET |
/api/v1/telephony/calls/:id |
JWT Bearer |
PATCH |
/api/v1/telephony/calls/:id |
JWT Bearer |
POST |
/api/v1/telephony/calls/:id/callback-tasks |
JWT Bearer |
GET |
/api/v1/telephony/calls/:id/transcript |
JWT Bearer |
PATCH |
/api/v1/telephony/calls/:id/transcript |
JWT Bearer |
GET |
/api/v1/telephony/cti/monitor-targets |
Ohne JWT (Allowlist) |
POST |
/api/v1/telephony/dial |
JWT Bearer |
GET |
/api/v1/telephony/live |
JWT Bearer |
GET |
/api/v1/telephony/lookup |
JWT Bearer |
POST |
/api/v1/telephony/webhook |
Ohne JWT (Allowlist) |
Terminplanung — scheduling (5)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/scheduling/assignments |
JWT Bearer |
DELETE |
/api/v1/scheduling/assignments/:id |
JWT Bearer |
PATCH |
/api/v1/scheduling/assignments/:id |
JWT Bearer |
POST |
/api/v1/scheduling/assignments/:id/split |
JWT Bearer |
GET |
/api/v1/scheduling/slots |
JWT Bearer |
Vertragsverlängerungen — renewals (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/renewals |
JWT Bearer |
POST |
/api/v1/renewals |
JWT Bearer |
DELETE |
/api/v1/renewals/:id |
JWT Bearer |
GET |
/api/v1/renewals/:id |
JWT Bearer |
PATCH |
/api/v1/renewals/:id |
JWT Bearer |
POST |
/api/v1/renewals/:id/schedule-reminder |
JWT Bearer |
Webhooks (extern) — webhooks (5)
| Methode | Pfad | Auth |
|---|---|---|
POST |
/api/v1/webhooks/esign |
Webhook-Secret (Header) |
POST |
/api/v1/webhooks/lexware |
Webhook-Secret (Header) |
POST |
/api/v1/webhooks/telephony |
Webhook-Secret (Header) |
GET |
/api/v1/webhooks/whatsapp |
Webhook-Secret (Header) |
POST |
/api/v1/webhooks/whatsapp |
Webhook-Secret (Header) |
Werkzeuge — tools (6)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/tools |
JWT Bearer |
POST |
/api/v1/tools |
JWT Bearer |
DELETE |
/api/v1/tools/:id |
JWT Bearer |
GET |
/api/v1/tools/:id |
JWT Bearer |
PATCH |
/api/v1/tools/:id |
JWT Bearer |
POST |
/api/v1/tools/:id/maintenance-queue |
JWT Bearer |
wiki — wiki (2)
| Methode | Pfad | Auth |
|---|---|---|
GET |
/api/v1/wiki/articles |
JWT Bearer |
GET |
/api/v1/wiki/articles/:slug |
JWT Bearer |