Zurück zur Dokumentation
Guide 04

API-Referenz

REST-API des Express-Servers (Port 3000, Präfix /api), mit interaktiver Swagger-UI und einer OpenAPI-Spec, die vom Server selbst ausgeliefert wird, hier nach Domäne dokumentiert mit ihren Authentifizierungsmechanismen, Rate-Limits und Antwortkonventionen.

6 Min. Lesezeit

REST-API des Express-Servers (Port 3000, Präfix /api), mit interaktiver Swagger-UI und einer OpenAPI-Spec, die vom Server selbst ausgeliefert wird, hier nach Domäne dokumentiert mit ihren Authentifizierungsmechanismen, Rate-Limits und Antwortkonventionen.

Authentifizierung

MethodeHeaderVerwendung
JWTAuthorization: Bearer <token>Interne Benutzer (Frontend, Tauri)
API-KeyX-Api-Key: sk-...Widget-Embed, programmatische Integrationen
Collector-SecretX-Collector-SecretServer↔collector (Vergleich in konstanter Zeit)
Query-Token?token=OCR-Bildzugriff

Middlewares (packages/server/src/middleware/): auth.ts, rbac.ts, license.ts, rateLimit.ts, widgetCors.ts.

Rate-Limit

LimiterLimit (prod/dev)Bereich
general200 / 2000 req/minIP
auth10 / 100 req/minIP
probe10 / 100 req/minIP
Widget-Chat30 / 200 req/min (pro-Widget-Override)widgetId
Widget täglich5 / 50 Nachrichten pro TagwidgetId + IP
Widget-Session50 / 500 Erstellungen pro TagIP
Widget-Lead3 / 30 pro StundeIP

Es gibt keinen dedizierten Chat-Rate-Limiter: Der ReAct-Agent setzt seine eigenen Limits intern durch (Concurrency pro Benutzer, Token-Budgets, Wallclock-Timeouts - agentBudgetService.ts); der globale 200/min-Limiter bleibt das Sicherheitsnetz. Anfragen mit einem X-Widget-Id-Header umgehen den globalen Limiter (der Widget-Dienst drosselt sie vorgelagert); Widgets verwenden rateLimitPerMinute / sessionLimitPerDay als Pro-Widget-Overrides.

Antwortkonventionen

  • Erfolg: JSON-Entität oder { ok: true }.
  • Fehler: { error: string } (+ details für Zod-Validierungsfehler).
  • Lizenz-Gating: 402 { error, feature, tier, limit?, current? }.
  • RBAC: 401 (keine Authentifizierung), 403 (unzureichende Berechtigungen).
  • SSE: event: <type>\ndata: <json>\n\n.

Auth - /api/auth (routes/auth.ts)

MethodePathAuthRBACNotizen
POST/auth/registerpublic—Nur wenn ALLOW_REGISTRATION=true; Body registerSchema
POST/auth/admin-registerJWTrequireAdminBody adminRegisterSchema
POST/auth/loginpublic—Body loginSchema (safeParse → 400 bei ungültig) → { user, token }
GET/auth/meJWT—Aktuelles Profil
GET/auth/usersJWTrequireAdminBenutzerliste
POST/auth/change-passwordJWT—changePasswordSchema
POST/auth/set-initial-passwordJWT—Erste Anmeldung (mustChangePassword)
POST/auth/admin-reset-passwordJWTrequireAdminPasswort eines Benutzers zurücksetzen

Benutzer - /api/users (routes/users.ts, authMiddleware)

MethodePathRBACNotizen
GET/usersrequireAdminPaginierte Liste
GET/users/:idself/admin
PUT/PATCH/users/:idself/adminupdateUserSchema
DELETE/users/:idrequireAdmin
POST/DELETE/users/:id/avatarJWTAvatar-Upload/-Entfernung (multipart)

Rollen - /api/roles (routes/roles.ts, authMiddleware)

MethodePathRBACNotizen
GET/roles/me/menu-sectionsJWTSichtbare Sidebar-Abschnitte
GET/rolesrequireAdminRollenliste
GET/roles/:roleIdrequireAdminDetail (UUID)
POST/rolesrequireAdminRolle erstellen (createRoleSchema, isDefault=false)
PUT/roles/:roleIdrequireAdminUpdate (atomarer Berechtigungsersatz)
PUT/roles/:roleId/menu-sectionsrequireAdminMenüabschnitte
DELETE/roles/:roleIdrequireAdmin
POST/roles/assignrequireAdminRolle einem Benutzer zuweisen
POST/roles/revokerequireAdminRolle entziehen

Projekte - /api/projects (routes/projects.ts, authMiddleware)

MethodePathRBACLizenzNotizen
GET/projectsJWT—Paginierte Liste
POST/projectsproject:createmax_projectsErstellung
GET/projects/:projectIdrequireProjectAccess—
GET/projects/:projectId/usagerequireProjectAccess—Nutzungsstatistiken
GET/projects/:projectId/exportrequireProjectAccess—Archiv-Stream
PUT/projects/:projectIdrequireProjectAccess—
DELETE/projects/:projectIdrequireProjectAccess—Soft Delete
POST/DELETE/projects/:projectId/accessrequireProjectAccess—ProjectAccess-Verwaltung

Workspaces - /api/workspaces (routes/workspaces.ts, authMiddleware)

MethodePathRBACLizenzNotizen
GET/workspacesJWT—Liste
POST/workspacesworkspace:createmax_workspacesErstellung
GET/PUT/DELETE/workspaces/:workspaceIdrequireWorkspaceAccess—Soft Delete
PUT/workspaces/:workspaceId/restorerequireWorkspaceAccess—Soft-Gelöschtes wiederherstellen
POST/workspaces/:workspaceId/accessrequireWorkspaceAccess—WorkspaceAccess
GET/POST/PUT/DELETE/workspaces/:workspaceId/folders[/:folderId]requireWorkspaceAccess—Chat-Ordner
PUT/workspaces/:workspaceId/folders/:folderId/restorerequireWorkspaceAccess—

Chat - unter /api/workspaces gemountet (routes/chat*.ts, authMiddleware)

MethodePathRBACNotizen
POST/workspaces/:id/chatrequireWorkspaceAccessNicht-Streaming → { chat, message }
POST/workspaces/:id/chat/streamrequireWorkspaceAccessSSE
GET/workspaces/:id/chatsrequireWorkspaceAccessPaginierte Liste (chatList.ts)
GET/workspaces/:id/chats/:chatId/messagesrequireWorkspaceAccessPaginierte Nachrichten
PUT/workspaces/:id/chats/:chatIdrequireWorkspaceAccessUmbenennen (chatCrud.ts)
PATCH/workspaces/:id/chats/:chatId/modelrequireWorkspaceAccessModell pro Chat { providerId?, model? }
PATCH/workspaces/:id/chats/:chatId/folderrequireWorkspaceAccessIn Ordner verschieben
DELETE/workspaces/:id/chats/:chatIdrequireWorkspaceAccess
PUT/workspaces/:id/chats/:chatId/moverequireWorkspaceAccessNeu sortieren
POST/DELETE/workspaces/:id/chats/:chatId/pinrequireWorkspaceAccessChat anpinnen
DELETE/PUT/workspaces/:id/chats/:chatId/messages/:messageIdrequireWorkspaceAccessNachricht löschen/bearbeiten
GET/workspaces/:id/agent-configrequireWorkspaceAccessAgent-Config des Workspace (chatAgentConfig.ts)
PUT/workspaces/:id/agent-configrequireWorkspaceAccess
GET/workspaces/:id/chats/exportrequireWorkspaceAccessExport (json/md/pdf) (chatExport.ts)
GET/workspaces/:id/chats/:chatId/exportrequireWorkspaceAccess
POST/workspaces/:id/chats/import/previewrequireWorkspaceAccessImport-Vorschau (chatImport.ts)
POST/workspaces/:id/chats/import/confirmrequireWorkspaceAccessImport bestätigen
GET/workspaces/:id/chats/:chatId/tokensrequireWorkspaceAccessVerwendete Tokens (chatTokens.ts)
GET/workspaces/:id/tokens/todayrequireWorkspaceAccess

SSE - /workspaces/:id/chat/stream

Ereignisse: token, status, citations ({ sources }), done ({ chatId, messageId, modelUsed, providerUsed, mcpSources }), error ({ error }), plus plan und wiki_edit.

Dokumente & Uploads (routes/documents.ts, routes/uploads.ts)

MethodePathRBACNotizen
GET/documentsJWTListe
GET/documents/:idJWTDetail
GET/documents/:id/textJWTExtrahierter Text
POST/documents/uploaddocument:writeMultipart-Upload
PUT/documents/:id/status(Pre-Middleware)Collector-Callback
DELETE/documents/:iddocument:deleteSoft Delete
POST/uploadsdocument:writeEntwurfs-Staging (uploads.ts)
POST/uploads/:id/assigndocument:writeEntwurf einem Workspace zuweisen
GET/uploads/pendingdocument:writeAusstehende Entwürfe
DELETE/PATCH/uploads/:iddocument:write

API-Keys - /api/api-keys (routes/apiKeys.ts, authMiddleware)

GET listet Ihre eigenen Keys, POST erstellt einen neuen (der rohe sk-...-Key wird nur einmal angezeigt), DELETE /:keyId widerruft.

Seit v0.20.1 sind API-Keys HMAC-SHA256: Der sk--Key wird nicht mehr bcrypt-gehasht, sondern mit einem dedizierten HMAC-SHA256-Digest (API_KEY_HMAC_SECRET, eine dedizierte Env-Var, entkoppelt von der JWT-/Verschlüsselungs-Schlüsselrotation) und die Verifikation ist eine indizierte O(1)-Lookup auf api_keys.key_hash (Postgres-Unique-Index), kein bcrypt-Loop-Vergleich. Breaking Change in v0.20.1: Betreiber müssen Widget-/Collector-Keys neu ausstellen (siehe docs/API_KEY_MIGRATION.md). Seit v0.22.0 sind Geheimnis-Vergleiche (X-Api-Key-Cache-Bust, X-Collector-Secret) timing-safe (crypto.timingSafeEqual mit Längenguard). Fehlender/ungültiger Key → 401; serverseitige HMAC-Fehlkonfiguration → 500 (lautes Scheitern).

Agent Skills - /api/agent (routes/skills.ts)

GET /api/agent/skills → eingebaute Skills (rag_search, workspace_memory, document_temp_process).

MCP-Verbindungen - /api/mcp-connections (routes/mcp.ts, authMiddleware + requireAdmin)

GET Liste, GET /statuses (Live-Runtime), POST erstellen, PUT /:id (Auto-Disconnect/Reconnect bei Aktivierung), DELETE /:id, POST /:id/toggle, POST /:id/test (10s-Timeout, toolCount).

MCP Pins - /api/chats/:chatId/pins (routes/mcpPins.ts)

GET, POST (mcpPinCreateSchema), DELETE /:pinId.

MCP-Server-Eingang (für IDEs) - agent/mcpServer.ts

GET /api/mcp/sse (SSE-Transport), POST /api/mcp/message (JSON-RPC).

Marketplace - /api/mcp-marketplace (routes/marketplace.ts, authMiddleware + requireAdmin)

GET Liste (Query ?search, ?category, ?workspaceId für isInstalled), GET /:entryId, POST Eintrag erstellen, POST /:entryId/install, POST /:entryId/uninstall. Siehe 07 - MCP Marketplace.

Provider / Modelle - /api/providers (routes/providers.ts, authMiddleware)

GET /models/available (Frontend-Auswahl), GET Liste, GET/:id, POST erstellen, PUT/:id, DELETE/:id, PUT /:id/set-default, GET /:id/models, POST /:id/models/refresh (Discovery), POST /:providerId/models/pull, PUT/DELETE /:providerId/models/:modelId, PUT /:providerId/models/:modelId/set-default.

Provider-Presets - /api/provider-presets (routes/providerPresets.ts)

GET Liste, GET /:presetId, POST /:presetId/install.

Widget (Admin) - /api/widgets (routes/widgets.ts, authMiddleware + requireAdmin)

GET Liste, POST (Lizenz widget_enabled + max_widgets), GET/PUT/DELETE /:id, PUT /:id/workspaces (Whitelist), GET /:id/workspaces, GET /:id/leads (paginiert), GET /:id/leads/export (CSV, Lizenz lead_export), GET /:id/leads/:leadId. Analytics: GET /analytics/daily, /analytics/topics, /analytics/summary.

Internes Widget (Embed) - /api/internal/widget (routes/internalWidget.ts, apiKeyMiddleware + widgetCors)

Authentifizierung über API-Key (X-Api-Key). POST /search (RAG, IDOR-sicher via widgetId), POST /lead, GET /:id/config, GET /session/:token, POST /session, PATCH /session/:token/increment, PATCH /session/:token/chat/archive. Siehe 06 - Widget Integration.

Backup (routes/backups.ts, backupDestinations.ts, backupJobs.ts, restore.ts)

GruppePathBerechtigungenLizenz
Logs/api/system/backupsbackup:log:read—
Ziele/api/backup-destinationsbackup:destination:read/writemax_backup_destinations
Jobs/api/backup-jobsbackup:job:read/write—
Wiederherstellung/api/backups, /api/backups/restore/:logId[/dry-run]backup:log:read / backup:restore:write—

POST /backup-jobs/:id/run (manueller Trigger), POST /backup-destinations/:id/test.

Webhooks - /api/webhooks (routes/webhooks.ts, authMiddleware + requireAdmin + requireFeature("webhooks"))

CRUD + POST /:id/test. HMAC-SHA256, exponentieller Backoff-Retry (5 Versuche), Auto-Deaktivierung nach 5 Fehlern.

Push - /api/system/push (routes/push.ts)

GET /vapid-key (öffentlicher Schlüssel), POST/DELETE /subscribe (Lizenz push_notifications), POST /test (Admin).

Lizenz - /api/license (routes/license.ts)

GET /license/info (public) → { license, features }.

SSO - /api/sso (routes/sso.ts, authMiddleware + requireAdmin + requireFeature("sso_enabled"))

GET /config, PUT /config, POST /test.

Templates - /api/templates (routes/templates.ts, authMiddleware)

GET Liste, GET /:id, POST erstellen, PUT/DELETE /:id (requireAdmin). {{var}}-Interpolation.

Settings - /api/system/settings (routes/settings.ts, authMiddleware + requireAdmin)

GET /embedding-config, GET /vector-db-config, GET settings, PUT settings ({ updated, rejected }), POST/DELETE /branding/icon (Lizenz white_label). Siehe 03 - Configuration.

System - /api/system (routes/system.ts)

GET /is-initialized (public), POST /initialize (Setup-Assistent, nur wenn nicht initialisiert), POST /reset-db (Admin), POST /reindex-documents (Admin, RAG-Reindex), POST /ocr/prewarm (Admin).

Audit / Ereignisprotokoll - /api/event-logs (routes/eventLogs.ts, authMiddleware + requireAdmin + requireFeature("audit_log_immutable"))

GET mit Filtern (Typ/Benutzer/Workspace/Datum/Aktion), Cursor-Pagination.

Analytics - /api/system/analytics (routes/analytics.ts, authMiddleware + requireAdmin)

GET /tokens, /models, /top-users.

Archive - /api/archives (routes/archives.ts + archivePages.ts, archiveConfig.ts, archiveSearch.ts, archiveGraph.ts, archiveExport.ts, archiveIndex.ts, archiveImport.ts, archiveSchemaTemplates.ts)

GET Liste, POST (archive:write), GET/PUT/DELETE /:archiveId (archive:delete für Löschung), POST /from-template, POST /:archiveId/reindex. Seiten: GET/POST /:archiveId/pages, GET/PUT/DELETE /:archiveId/pages/:slug. Config, Suche (hybrides RRF), Graph, Export, Index, Import (copy-from-doc, import/:jobId, import/:jobId/callback), Schema-Templates.

OCR - /api/ocr + /api/archives/:id/jobs (routes/ocr.ts, authMiddleware)

OCR-Katalog auf /api/ocr. Archiv-Jobs: GET /archives/:id/jobs, GET /:jobId, POST /:jobId/approve, POST /:jobId/reject, DELETE /:jobId, GET /:jobId/pages/:pageNumber/image (Query-Token-Auth).

Synthesis - /api/synthesis (routes/synthesis.ts, authMiddleware)

GET /status, GET /pending/count, POST /trigger (archive:write + Feature-Limit), GET /:runId, POST /:runId/approve, POST /:runId/reject, DELETE /:runId, PATCH /:runId/rename.

POST /wiki-write/preview, POST /wiki-write/:runId/approve|reject|undo, GET /wiki-write/history/:archiveId, POST /wiki-write/distill. Links: POST /wikilinks/resolve, GET /wikilinks/:archiveId[/:pageSlug], Wartung GET/POST /wikilinks/maintenance/:archiveId[/merge].

Chat-Aufbewahrung - /api/system/chat-retention (routes/chatRetention.ts)

PUT (system:write, confirmDataLoss: true, auditiert). Siehe 03 - Configuration.

Health - / (routes/health.ts)

GET / (public, { uptime }), GET /api/health (public, { status, checks: { database, collector, disk } }), GET /api/health/rag.

Widget Service - Port 3211 (packages/widget)

GET /health, GET /widget/:id.js (Loader), GET /widget/:id (HTML-iframe), GET /api/config/:id (branding+trigger+lead), POST /api/config/:id/cache-bust, POST /api/sessions (anonyme Session), POST /api/chat/:id/stream (SSE, x-session-token), POST /api/lead/:id (Lead-Erfassung).

Collector Service - Port 3210 (packages/collector)

GET /api/health, GET /api/ingest/chunks/:documentId, POST /api/ingest (X-Collector-Secret, multipart), POST /api/ingest/query (Vektorsuche), DELETE /api/ingest/:documentId, POST /api/ingest/reembed, POST /api/ingest/youtube, POST /api/ingest/wiki-pages, DELETE /api/ingest/wiki-pages/:pageId, POST /api/ingest/archive-page.