К документации
Руководство 04

Справочник API

REST API сервера Express (порт 3000, префикс /api) с интерактивным Swagger UI и OpenAPI-спецификацией, отдаваемой самим сервером, документированная здесь по доменам с её механизмами аутентификации, ограничениями скорости и соглашениями о ответах.

6 мин чтения

REST API сервера Express (порт 3000, префикс /api) с интерактивным Swagger UI и OpenAPI-спецификацией, отдаваемой самим сервером, документированная здесь по доменам с её механизмами аутентификации, ограничениями скорости и соглашениями о ответах.

Аутентификация

МетодHeaderИспользование
JWTAuthorization: Bearer <token>Внутренние пользователи (frontend, Tauri)
API-ключX-Api-Key: sk-...Встраивание виджета, программные интеграции
Secret коллектораX-Collector-SecretServer↔collector (сравнение за постоянное время)
Токен запроса?token=Доступ к изображениям OCR

Промежуточные обработчики (packages/server/src/middleware/): auth.ts, rbac.ts, license.ts, rateLimit.ts, widgetCors.ts.

Ограничение скорости

ЛимитерЛимит (prod/dev)Область
general200 / 2000 req/minIP
auth10 / 100 req/minIP
probe10 / 100 req/minIP
чат виджета30 / 200 req/min (override на виджет)widgetId
виджет в день5 / 50 сообщений в деньwidgetId+IP
сессия виджета50 / 500 созданий в деньIP
лиды виджета3 / 30 в часIP

Отдельного лимитера для чата нет: ReAct-агент применяет собственные лимиты внутри (конкурентность на пользователя, токен-бюджеты, wallclock-таймауты - agentBudgetService.ts); глобальный лимитер 200/мин остаётся страховочной сетью. Запросы с заголовком X-Widget-Id пропускают глобальный лимитер (сервис виджета троттлит их выше по течению); виджеты используют rateLimitPerMinute / sessionLimitPerDay как override на виджет.

Соглашения об ответах

  • Успех: JSON-сущность или { ok: true }.
  • Ошибка: { error: string } (+ details для ошибок валидации Zod).
  • Гейтинг лицензии: 402 { error, feature, tier, limit?, current? }.
  • RBAC: 401 (нет аутентификации), 403 (недостаточно прав).
  • SSE: event: <type>\ndata: <json>\n\n.

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

МетодPathAuthRBACЗаметки
POST/auth/registerpublic—Только если ALLOW_REGISTRATION=true; body registerSchema
POST/auth/admin-registerJWTrequireAdminbody adminRegisterSchema
POST/auth/loginpublic—body loginSchema (safeParse → 400 при невалидности) → { user, token }
GET/auth/meJWT—Текущий профиль
GET/auth/usersJWTrequireAdminСписок пользователей
POST/auth/change-passwordJWT—changePasswordSchema
POST/auth/set-initial-passwordJWT—Первый вход (mustChangePassword)
POST/auth/admin-reset-passwordJWTrequireAdminСброс пароля пользователя

Пользователи - /api/users (routes/users.ts, authMiddleware)

МетодPathRBACЗаметки
GET/usersrequireAdminСписок с пагинацией
GET/users/:idself/admin
PUT/PATCH/users/:idself/adminupdateUserSchema
DELETE/users/:idrequireAdmin
POST/DELETE/users/:id/avatarJWTЗагрузка/удаление аватара (multipart)

Роли - /api/roles (routes/roles.ts, authMiddleware)

МетодPathRBACЗаметки
GET/roles/me/menu-sectionsJWTВидимые разделы сайдбара
GET/rolesrequireAdminСписок ролей
GET/roles/:roleIdrequireAdminДетали (UUID)
POST/rolesrequireAdminСоздать роль (createRoleSchema, isDefault=false)
PUT/roles/:roleIdrequireAdminОбновление (атомарная замена прав)
PUT/roles/:roleId/menu-sectionsrequireAdminРазделы меню
DELETE/roles/:roleIdrequireAdmin
POST/roles/assignrequireAdminНазначить роль пользователю
POST/roles/revokerequireAdminСнять роль

Проекты - /api/projects (routes/projects.ts, authMiddleware)

МетодPathRBACЛицензияЗаметки
GET/projectsJWT—Список с пагинацией
POST/projectsproject:createmax_projectsСоздание
GET/projects/:projectIdrequireProjectAccess—
GET/projects/:projectId/usagerequireProjectAccess—Статистика использования
GET/projects/:projectId/exportrequireProjectAccess—Поток архива
PUT/projects/:projectIdrequireProjectAccess—
DELETE/projects/:projectIdrequireProjectAccess—Мягкое удаление
POST/DELETE/projects/:projectId/accessrequireProjectAccess—Управление ProjectAccess

Рабочие пространства - /api/workspaces (routes/workspaces.ts, authMiddleware)

МетодPathRBACЛицензияЗаметки
GET/workspacesJWT—Список
POST/workspacesworkspace:createmax_workspacesСоздание
GET/PUT/DELETE/workspaces/:workspaceIdrequireWorkspaceAccess—Мягкое удаление
PUT/workspaces/:workspaceId/restorerequireWorkspaceAccess—Восстановить удалённое
POST/workspaces/:workspaceId/accessrequireWorkspaceAccess—WorkspaceAccess
GET/POST/PUT/DELETE/workspaces/:workspaceId/folders[/:folderId]requireWorkspaceAccess—Папки чатов
PUT/workspaces/:workspaceId/folders/:folderId/restorerequireWorkspaceAccess—

Чат - смонтирован под /api/workspaces (routes/chat*.ts, authMiddleware)

МетодPathRBACЗаметки
POST/workspaces/:id/chatrequireWorkspaceAccessБез стриминга → { chat, message }
POST/workspaces/:id/chat/streamrequireWorkspaceAccessSSE
GET/workspaces/:id/chatsrequireWorkspaceAccessСписок с пагинацией (chatList.ts)
GET/workspaces/:id/chats/:chatId/messagesrequireWorkspaceAccessСообщения с пагинацией
PUT/workspaces/:id/chats/:chatIdrequireWorkspaceAccessПереименовать (chatCrud.ts)
PATCH/workspaces/:id/chats/:chatId/modelrequireWorkspaceAccessМодель на чат { providerId?, model? }
PATCH/workspaces/:id/chats/:chatId/folderrequireWorkspaceAccessПереместить в папку
DELETE/workspaces/:id/chats/:chatIdrequireWorkspaceAccess
PUT/workspaces/:id/chats/:chatId/moverequireWorkspaceAccessПереупорядочить
POST/DELETE/workspaces/:id/chats/:chatId/pinrequireWorkspaceAccessЗакрепить чат
DELETE/PUT/workspaces/:id/chats/:chatId/messages/:messageIdrequireWorkspaceAccessУдалить/изменить сообщение
GET/workspaces/:id/agent-configrequireWorkspaceAccessКонфиг агента пространства (chatAgentConfig.ts)
PUT/workspaces/:id/agent-configrequireWorkspaceAccess
GET/workspaces/:id/chats/exportrequireWorkspaceAccessЭкспорт (json/md/pdf) (chatExport.ts)
GET/workspaces/:id/chats/:chatId/exportrequireWorkspaceAccess
POST/workspaces/:id/chats/import/previewrequireWorkspaceAccessПредпросмотр импорта (chatImport.ts)
POST/workspaces/:id/chats/import/confirmrequireWorkspaceAccessПодтвердить импорт
GET/workspaces/:id/chats/:chatId/tokensrequireWorkspaceAccessИспользованные токены (chatTokens.ts)
GET/workspaces/:id/tokens/todayrequireWorkspaceAccess

SSE - /workspaces/:id/chat/stream

События: token, status, citations ({ sources }), done ({ chatId, messageId, modelUsed, providerUsed, mcpSources }), error ({ error }), плюс plan и wiki_edit.

Документы и загрузки (routes/documents.ts, routes/uploads.ts)

МетодPathRBACЗаметки
GET/documentsJWTСписок
GET/documents/:idJWTДетали
GET/documents/:id/textJWTИзвлечённый текст
POST/documents/uploaddocument:writeЗагрузка multipart
PUT/documents/:id/status(pre-middleware)Callback коллектора
DELETE/documents/:iddocument:deleteМягкое удаление
POST/uploadsdocument:writeСтадирование черновиков (uploads.ts)
POST/uploads/:id/assigndocument:writeНазначить черновик пространству
GET/uploads/pendingdocument:writeОжидающие черновики
DELETE/PATCH/uploads/:iddocument:write

API-ключи - /api/api-keys (routes/apiKeys.ts, authMiddleware)

GET перечисляет ваши ключи, POST создаёт новый (сырой ключ sk-... показывается только один раз), DELETE /:keyId отзывает.

С v0.20.1 API-ключи — HMAC-SHA256: ключ sk- больше не хэшируется bcrypt, а хэшируется выделенным HMAC-SHA256-дайджестом (API_KEY_HMAC_SECRET, выделенная env-переменная, отвязанная от ротации ключей JWT/шифрования), и проверка — это индексированный O(1)-поиск по api_keys.key_hash (уникальный индекс Postgres), а не сравнение в цикле bcrypt. Ломающее изменение в v0.20.1: операторы должны перевыпустить ключи виджета/коллектора (см. docs/API_KEY_MIGRATION.md). С v0.22.0 сравнения секретов (X-Api-Key cache-bust, X-Collector-Secret) timing-safe (crypto.timingSafeEqual с защитой длины). Отсутствующий/ невалидный ключ → 401; ошибочная HMAC-конфигурация на сервере → 500 (громкий сбой).

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

GET /api/agent/skills → встроенные навыки (rag_search, workspace_memory, document_temp_process).

MCP-подключения - /api/mcp-connections (routes/mcp.ts, authMiddleware + requireAdmin)

GET список, GET /statuses (живой runtime), POST создать, PUT /:id (авто-отключение/подключение при включении), DELETE /:id, POST /:id/toggle, POST /:id/test (таймаут 10 с, toolCount).

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

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

Входящий MCP-сервер (для IDE) - agent/mcpServer.ts

GET /api/mcp/sse (SSE-транспорт), POST /api/mcp/message (JSON-RPC).

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

GET список (query ?search, ?category, ?workspaceId для isInstalled), GET /:entryId, POST создать запись, POST /:entryId/install, POST /:entryId/uninstall. См. 07 - MCP Marketplace.

Провайдеры / Модели - /api/providers (routes/providers.ts, authMiddleware)

GET /models/available (селектор фронтенда), GET список, GET/:id, POST создать, PUT/:id, DELETE/:id, PUT /:id/set-default, GET /:id/models, POST /:id/models/refresh (обнаружение), POST /:providerId/models/pull, PUT/DELETE /:providerId/models/:modelId, PUT /:providerId/models/:modelId/set-default.

Пресеты провайдеров - /api/provider-presets (routes/providerPresets.ts)

GET список, GET /:presetId, POST /:presetId/install.

Widget (админ) - /api/widgets (routes/widgets.ts, authMiddleware + requireAdmin)

GET список, POST (лицензия widget_enabled + max_widgets), GET/PUT/DELETE /:id, PUT /:id/workspaces (whitelist), GET /:id/workspaces, GET /:id/leads (с пагинацией), GET /:id/leads/export (CSV, лицензия lead_export), GET /:id/leads/:leadId. Аналитика: GET /analytics/daily, /analytics/topics, /analytics/summary.

Внутренний виджет (встраивание) - /api/internal/widget (routes/internalWidget.ts, apiKeyMiddleware + widgetCors)

Аутентификация через API-ключ (X-Api-Key). POST /search (RAG, IDOR-безопасно через widgetId), POST /lead, GET /:id/config, GET /session/:token, POST /session, PATCH /session/:token/increment, PATCH /session/:token/chat/archive. См. 06 - Widget Integration.

Бэкапы (routes/backups.ts, backupDestinations.ts, backupJobs.ts, restore.ts)

ГруппаPathРазрешенияЛицензия
Логи/api/system/backupsbackup:log:read—
Назначения/api/backup-destinationsbackup:destination:read/writemax_backup_destinations
Задания/api/backup-jobsbackup:job:read/write—
Восстановление/api/backups, /api/backups/restore/:logId[/dry-run]backup:log:read / backup:restore:write—

POST /backup-jobs/:id/run (ручной запуск), POST /backup-destinations/:id/test.

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

CRUD + POST /:id/test. HMAC-SHA256, повторы с экспоненциальной задержкой (5 попыток), авто-отключение после 5 сбоев.

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

GET /vapid-key (публичный ключ), POST/DELETE /subscribe (лицензия push_notifications), POST /test (админ).

Лицензия - /api/license (routes/license.ts)

GET /license/info (публично) → { license, features }.

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

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

Шаблоны - /api/templates (routes/templates.ts, authMiddleware)

GET список, GET /:id, POST создать, PUT/DELETE /:id (requireAdmin). Интерполяция {{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 (лицензия white_label). См. 03 - Configuration.

Система - /api/system (routes/system.ts)

GET /is-initialized (публично), POST /initialize (мастер настройки, только когда не инициализировано), POST /reset-db (админ), POST /reindex-documents (админ, переиндексация RAG), POST /ocr/prewarm (админ).

Аудит / журнал событий - /api/event-logs (routes/eventLogs.ts, authMiddleware + requireAdmin + requireFeature("audit_log_immutable"))

GET с фильтрами (тип/пользователь/пространство/дата/действие), пагинация курсором.

Аналитика - /api/system/analytics (routes/analytics.ts, authMiddleware + requireAdmin)

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

Архивы - /api/archives (routes/archives.ts + archivePages.ts, archiveConfig.ts, archiveSearch.ts, archiveGraph.ts, archiveExport.ts, archiveIndex.ts, archiveImport.ts, archiveSchemaTemplates.ts)

GET список, POST (archive:write), GET/PUT/DELETE /:archiveId (archive:delete для удаления), POST /from-template, POST /:archiveId/reindex. Страницы: GET/POST /:archiveId/pages, GET/PUT/DELETE /:archiveId/pages/:slug. Конфиг, поиск (гибридный RRF), граф, экспорт, индекс, импорт (copy-from-doc, import/:jobId, import/:jobId/callback), шаблоны схем.

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

Каталог OCR на /api/ocr. Задания архивов: GET /archives/:id/jobs, GET /:jobId, POST /:jobId/approve, POST /:jobId/reject, DELETE /:jobId, GET /:jobId/pages/:pageNumber/image (аутентификация токеном запроса).

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

GET /status, GET /pending/count, POST /trigger (archive:write + лимит фичи), 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. Ссылки: POST /wikilinks/resolve, GET /wikilinks/:archiveId[/:pageSlug], обслуживание GET/POST /wikilinks/maintenance/:archiveId[/merge].

Хранение чатов - /api/system/chat-retention (routes/chatRetention.ts)

PUT (system:write, confirmDataLoss: true, аудируется). См. 03 - Configuration.

Health - / (routes/health.ts)

GET / (публично, { uptime }), GET /api/health (публично, { status, checks: { database, collector, disk } }), GET /api/health/rag.

Widget Service - порт 3211 (packages/widget)

GET /health, GET /widget/:id.js (загрузчик), GET /widget/:id (HTML-iframe), GET /api/config/:id (branding+trigger+lead), POST /api/config/:id/cache-bust, POST /api/sessions (анонимная сессия), POST /api/chat/:id/stream (SSE, x-session-token), POST /api/lead/:id (захват лидов).

Collector Service - порт 3210 (packages/collector)

GET /api/health, GET /api/ingest/chunks/:documentId, POST /api/ingest (X-Collector-Secret, multipart), POST /api/ingest/query (векторный поиск), 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.