Back to docs
Guide 04

API Reference

REST, SSE, auth and rate limits.

API REST del server Express (porta 3000, prefisso /api). Swagger UI su /api-docs, spec OpenAPI su /api-docs/json (generata da annotazioni @openapi JSDoc).

Autenticazione

MetodoHeaderUso
JWTAuthorization: Bearer <token>Utenti interni (frontend, Tauri)
API keyX-Api-Key: sk-...Widget embed, integrazioni programmatiche
Collector secretX-Collector-SecretServer↔collector (confronto constant-time)
Query token?token=Accesso immagini OCR

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

Rate limit

LimiterLimite (prod/dev)Scope
generale200 / 2000 req/minIP
auth10 / 100 req/minIP
chat LLMCommunity 20 / Enterprise 100 req/minUser ID (fallback IP)
widget chat30 / 200 req/minwidgetId
widget session5 / 50 al giornoIP
widget lead3 / 30 all'oraIP

Convenzioni risposta

  • Successo: entità JSON o { ok: true }.
  • Errore: { error: string } (+ details per errori validazione Zod).
  • License gating: 402 { error, feature, tier, limit?, current? }.
  • RBAC: 401 (no auth), 403 (permessi insufficienti).
  • SSE: event: <type>\ndata: <json>\n\n.

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

MetodoPathAuthRBACNote
POST/auth/registerpubblicoSolo se ALLOW_REGISTRATION=true; body registerSchema
POST/auth/admin-registerJWTrequireAdminbody adminRegisterSchema
POST/auth/loginpubblicobody loginSchema{ user, token }
GET/auth/meJWTProfilo corrente
GET/auth/usersJWTrequireAdminLista utenti
POST/auth/change-passwordJWTchangePasswordSchema
POST/auth/set-initial-passwordJWTPrimo login (mustChangePassword)
POST/auth/admin-reset-passwordJWTrequireAdminReset password utente

Users — /api/users (routes/users.ts, authMiddleware)

MetodoPathRBACNote
GET/usersrequireAdminLista paginata
GET/users/:idself/admin
PUT/PATCH/users/:idself/adminupdateUserSchema
DELETE/users/:idrequireAdmin
POST/DELETE/users/:id/avatarJWTUpload/rimozione avatar (multipart)

Roles — /api/roles (routes/roles.ts, authMiddleware)

MetodoPathRBACNote
GET/roles/me/menu-sectionsJWTSezioni sidebar visibili
GET/rolesrequireAdminLista ruoli
GET/roles/:roleIdrequireAdminDettaglio (UUID)
POST/rolesrequireAdminCrea ruolo (createRoleSchema, isDefault=false)
PUT/roles/:roleIdrequireAdminUpdate (replace atomico permessi)
PUT/roles/:roleId/menu-sectionsrequireAdminSezioni menu
DELETE/roles/:roleIdrequireAdmin
POST/roles/assignrequireAdminAssegna ruolo a utente
POST/roles/revokerequireAdminRevoca ruolo

Projects — /api/projects (routes/projects.ts, authMiddleware)

MetodoPathRBACLicenseNote
GET/projectsJWTLista paginata
POST/projectsproject:createmax_projectsCreazione
GET/projects/:projectIdrequireProjectAccess
GET/projects/:projectId/usagerequireProjectAccessStatistiche uso
GET/projects/:projectId/exportrequireProjectAccessStream archivio
PUT/projects/:projectIdrequireProjectAccess
DELETE/projects/:projectIdrequireProjectAccessSoft delete
POST/DELETE/projects/:projectId/accessrequireProjectAccessGestione ProjectAccess

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

MetodoPathRBACLicenseNote
GET/workspacesJWTLista
POST/workspacesworkspace:createmax_workspacesCreazione
GET/PUT/DELETE/workspaces/:workspaceIdrequireWorkspaceAccessSoft delete
PUT/workspaces/:workspaceId/restorerequireWorkspaceAccessRipristino soft-deleted
POST/workspaces/:workspaceId/accessrequireWorkspaceAccessWorkspaceAccess
GET/POST/PUT/DELETE/workspaces/:workspaceId/folders[/:folderId]requireWorkspaceAccessCartelle chat
PUT/workspaces/:workspaceId/folders/:folderId/restorerequireWorkspaceAccess

Chat — montati su /api/workspaces (routes/chat*.ts, authMiddleware)

MetodoPathRBACNote
POST/workspaces/:id/chatrequireWorkspaceAccessNon-streaming → { chat, message }
POST/workspaces/:id/chat/streamrequireWorkspaceAccessSSE
GET/workspaces/:id/chatsrequireWorkspaceAccessLista paginata (chatList.ts)
GET/workspaces/:id/chats/:chatId/messagesrequireWorkspaceAccessMessaggi paginati
PUT/workspaces/:id/chats/:chatIdrequireWorkspaceAccessRename (chatCrud.ts)
PATCH/workspaces/:id/chats/:chatId/modelrequireWorkspaceAccessModello per-chat { providerId?, model? }
PATCH/workspaces/:id/chats/:chatId/folderrequireWorkspaceAccessSposta in cartella
DELETE/workspaces/:id/chats/:chatIdrequireWorkspaceAccess
PUT/workspaces/:id/chats/:chatId/moverequireWorkspaceAccessRiordina
POST/DELETE/workspaces/:id/chats/:chatId/pinrequireWorkspaceAccessPin chat
DELETE/PUT/workspaces/:id/chats/:chatId/messages/:messageIdrequireWorkspaceAccessDelete/edit messaggio
GET/workspaces/:id/agent-configrequireWorkspaceAccessConfig agente 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/previewrequireWorkspaceAccessPreview import (chatImport.ts)
POST/workspaces/:id/chats/import/confirmrequireWorkspaceAccessConferma import
GET/workspaces/:id/chats/:chatId/tokensrequireWorkspaceAccessToken usati (chatTokens.ts)
GET/workspaces/:id/tokens/todayrequireWorkspaceAccess

SSE — /workspaces/:id/chat/stream

Eventi: token, status, citations ({ sources }), done ({ chatId, messageId, modelUsed, providerUsed, mcpSources }), error ({ error }), oltre plan e wiki_edit.

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

MetodoPathRBACNote
GET/documentsJWTLista
GET/documents/:idJWTDettaglio
GET/documents/:id/textJWTTesto estratto
POST/documents/uploaddocument:writeMultipart upload
PUT/documents/:id/status(pre-middleware)Callback collector
DELETE/documents/:iddocument:deleteSoft delete
POST/uploadsdocument:writeStaging draft (uploads.ts)
POST/uploads/:id/assigndocument:writeAssegna draft a workspace
GET/uploads/pendingdocument:writeDrafts pending
DELETE/PATCH/uploads/:iddocument:write

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

GET lista, POST crea (raw key mostrata una sola volta, bcrypt), DELETE/:keyId.

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

GET /api/agent/skills → skill builtin (rag_search, workspace_memory, document_temp_process).

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

GET lista, GET /statuses (runtime live), POST crea, PUT /:id (auto-disconnect/reconnect se enabled), 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 inbound (per IDE) — 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 lista (query ?search, ?category, ?workspaceId per isInstalled), GET /:entryId, POST crea entry, POST /:entryId/install, POST /:entryId/uninstall. Vedi 07 — MCP Marketplace.

Providers / Models — /api/providers (routes/providers.ts, authMiddleware)

GET /models/available (selettore frontend), GET lista, GET/:id, POST crea, 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 lista, GET /:presetId, POST /:presetId/install.

Widget (admin) — /api/widgets (routes/widgets.ts, authMiddleware + requireAdmin)

GET lista, POST (license widget_enabled + max_widgets), GET/PUT/DELETE /:id, PUT /:id/workspaces (whitelist), GET /:id/workspaces, GET /:id/leads (paginati), GET /:id/leads/export (CSV, license lead_export), GET /:id/leads/:leadId. Analytics: GET /analytics/daily, /analytics/topics, /analytics/summary.

Internal Widget (embed) — /api/internal/widget (routes/internalWidget.ts, apiKeyMiddleware + widgetCors)

Autenticazione API key (X-Api-Key). POST /search (RAG, IDOR-safe via widgetId), POST /lead, GET /:id/config, GET /session/:token, POST /session, PATCH /session/:token/increment, PATCH /session/:token/chat/archive. Vedi 06 — Widget Integration.

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

GruppoPathPermessiLicense
Logs/api/system/backupsbackup:log:read
Destinations/api/backup-destinationsbackup:destination:read/writemax_backup_destinations
Jobs/api/backup-jobsbackup:job:read/write
Restore/api/backups, /api/backups/restore/:logId[/dry-run]backup:log:read / backup:restore:write

POST /backup-jobs/:id/run (trigger manuale), POST /backup-destinations/:id/test.

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

CRUD + POST /:id/test. HMAC-SHA256, retry exponential backoff (5 tentativi), auto-disable dopo 5 fallimenti.

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

GET /vapid-key (pubblico key), POST/DELETE /subscribe (license push_notifications), POST /test (admin).

License — /api/license (routes/license.ts)

GET /license/info (pubblico) → { 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 lista, GET /:id, POST crea, PUT/DELETE /:id (requireAdmin). Interpolazione {{var}}.

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 (license white_label). Vedi 03 — Configuration.

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

GET /is-initialized (pubblico), POST /initialize (setup wizard, solo se non inizializzato), POST /reset-db (admin), POST /reindex-documents (admin, reindex RAG), POST /ocr/prewarm (admin).

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

GET con filtri (type/user/workspace/date/action), paginazione cursor.

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

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

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

GET lista, POST (archive:write), GET/PUT/DELETE /:archiveId (archive:delete per delete), POST /from-template, POST /:archiveId/reindex. Pages: GET/POST /:archiveId/pages, GET/PUT/DELETE /:archiveId/pages/:slug. Config, search (hybrid 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)

Catalogo OCR su /api/ocr. Jobs su archivi: 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.

Wiki — /api/wiki-write, /api/wikilinks, /api/wiki-edits (routes/wikiChat.ts, wikilinks.ts)

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], maintenance GET/POST /wikilinks/maintenance/:archiveId[/merge].

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

PUT (system:write, confirmDataLoss: true, audited). Vedi 03 — Configuration.

Health — / (routes/health.ts)

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


Widget Service — porta 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 (sessione anonima), POST /api/chat/:id/stream (SSE, x-session-token), POST /api/lead/:id (lead capture).

Collector Service — porta 3210 (packages/collector)

GET /api/health, GET /api/ingest/chunks/:documentId, POST /api/ingest (X-Collector-Secret, multipart), POST /api/ingest/query (vector search), 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.

Cross-link