# Документация API VidConf REST + WebSocket API: аутентификация, профиль, динамические конференции, чат, администрирование, health check. Конференции создаются динамически — предустановленных комнат и бронирований нет (см. [ADR-001](../architecture/adr/001-dynamic-conferences-pivot.md)). ## Интерактивная документация FastAPI автоматически генерирует интерактивные документы: - **Swagger UI:** `http://localhost:8000/docs` - **ReDoc:** `http://localhost:8000/redoc` - **OpenAPI JSON:** `http://localhost:8000/openapi.json` ## Аутентификация & авторизация **[Полная документация: docs/api/auth.md](auth.md)** | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/auth/registration-options` | GET | Публичные опции регистрации (выбор команды) | | `/api/v1/auth/register` | POST | Регистрация нового пользователя | | `/api/v1/auth/verify-email` | POST | Подтверждение email по токену | | `/api/v1/auth/token` | POST | OAuth2 вход (email + пароль) → access + refresh токены | | `/api/v1/auth/refresh` | POST | Ротация refresh-токена → новый access-токен | | `/api/v1/auth/logout` | POST | Отзыв refresh-токена | ## Профиль пользователя **[Полная документация: docs/api/users.md](users.md)** | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/users/me` | GET | Профиль текущего пользователя | | `/api/v1/users/me` | PATCH | Обновить ФИО и команду | | `/api/v1/users/me/avatar` | POST | Загрузить аватар (JPEG/PNG/WebP, ≤2 МБ) | | `/api/v1/users/me/avatar` | DELETE | Удалить аватар | | `/api/v1/users` | GET | Поиск пользователей для пикера участников | ## Справочник команд **[Полная документация: docs/api/teams.md](teams.md)** | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/teams` | GET | Список всех команд (для выбора в профиле) | **Для CRUD операций над командами см. [Администраторский API](./admin.md#команды).** ## LiveKit интеграция | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/livekit/webhook` | POST | Приёмник webhook-событий от LiveKit | ## GET /api/health Проверка доступности backend и зависимостей. **Request:** ```bash curl http://localhost:8000/api/health ``` **Response (200 OK):** ```json { "status": "ok", "db": true, "redis": true } ``` --- ## Динамические конференции ### Управление конференциями **[Полная документация: docs/api/conferences.md](conferences.md)** | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/conferences` | POST | Создать конференцию (мгновенную без scheduled_at или плановую) | | `/api/v1/conferences/my` | GET | Мои конференции: закреплённые + предстоящие разовые | | `/api/v1/conferences/calendar` | GET | Развёртка вхождений (occurrences) в диапазоне дат (≤62 дней) | | `/api/v1/conferences/resolve` | GET | Найти конференцию по номеру или ссылке (публичный, rate limit 10/мин) | | `/api/v1/conferences/{id}/join` | POST | Вход зарегистрированного пользователя (с пароль-опцион) | | `/api/v1/conferences/{id}/guest-join` | POST | Вход гостем (публичный, rate limit, display_name обязателен) | | `/api/v1/conferences/{id}` | PATCH | Изменить конференцию (владелец/администратор) | | `/api/v1/conferences/{id}` | DELETE | Удалить конференцию (запрещено для активной) | **Ключевые особенности** (в отличие от прежней модели бронирования переговорных комнат, см. ADR-001): - Конференция имеет 9-значный номер (вместо room + booking) - Вход по номеру или постоянной ссылке (slug), без привязки к комнате - Гости представляются (display_name + email опционально) и участвуют в пайплайне - Закреплённые конференции могут повторяться (weekly/biweekly/monthly/every_n_days) - Нет конкуренции за ресурсы → EXCLUDE constraint не используется, конфликты — на уровне бизнес-логики --- ## Администраторский API **[Полная документация: docs/api/admin.md](admin.md)** | Эндпоинт | Метод | Описание | |----------|-------|---------| | `/api/v1/admin/conferences` | GET | Список всех конференций с фильтрацией и пагинацией (только админ) | | `/api/v1/admin/conferences/{id}` | PATCH | Изменить конференцию (только админ) | | `/api/v1/admin/conferences/{id}` | DELETE | Удалить конференцию (только админ, запрещено для активной) | | `/api/v1/admin/conferences/{id}/invitations` | POST | Поставить рассылку .ics-приглашений (202, асинхронно) | | `/api/v1/admin/users` | GET | Список пользователей с пагинацией (только админ) | | `/api/v1/admin/users/{id}` | PATCH | Изменить роль/блокировку/команду пользователя (только админ, запрет самоизменения роли/блокировки) | | `/api/v1/admin/teams` | GET | Список всех команд (только админ) | | `/api/v1/admin/teams` | POST | Создать команду (только админ, 409 при дубле названия) | | `/api/v1/admin/teams/{id}` | PATCH | Переименовать команду (только админ) | | `/api/v1/admin/teams/{id}` | DELETE | Удалить команду (только админ, у пользователей обнулится team_id) | | `/api/v1/admin/settings` | GET | Текущие настройки инстанса (только админ) | | `/api/v1/admin/settings` | PUT | Обновить настройки инстанса (только админ; AI-уровень/таймзона/домен регистрации валидируются) | Все эндпоинты требуют JWT токен администратора (403 иначе). --- ## Чат конференции ### Обмен сообщениями в реальном времени **[Полная документация: docs/api/chat.md](chat.md)** | Эндпоинт | Протокол | Описание | |----------|----------|---------| | `/api/v1/conferences/{id}/chat` | WebSocket | Текстовый чат (auth по LiveKit-токену, история, broadcast через Redis pub/sub) | **Особенности:** - Аутентификация на уровне протокола WS (первое сообщение `{"type":"auth","token":}`) - История: последние 50 сообщений открытой сессии конференции - Участники: зарегистрированные пользователи + гости (с пометкой `is_guest`) - Тоггл `chat.enabled` из настроек инстанса в БД, проверяется на каждом подключении - Отправитель видит своё сообщение через pub/sub (echo) **Close-коды:** 4401 (невалидный auth), 4403 (чужая комната), 4404 (чат выключен / конференция не найдена / завершена). **Frontend:** JoinOut содержит `chat_enabled` для отображения/скрытия UI панели без рестарта. --- ## Планируемый API - Прямой доступ к транскрипту сеанса через API (`GET /api/sessions/{id}/transcript`) — сейчас фразы доступны только внутри пайплайна и итогового саммари, отдельного read-эндпоинта нет. Транскрибация, суммаризация и рассылка саммари/приглашений уже реализованы асинхронно через Celery-воркеры (статус — `pipeline_status` в `conference_sessions`, см. [workers/README.md](../../workers/README.md)). --- ## Соглашения **Все timestamps в UTC:** ```json "created_at": "2026-07-15T14:30:00Z" ``` **Авторизация:** JWT Bearer token в заголовке `Authorization` (для защищённых эндпоинтов) **Публичные эндпоинты (без auth):** - `GET /api/v1/conferences/resolve` — поиск по номеру/ссылке (rate limit) - `POST /api/v1/conferences/{id}/guest-join` — вход гостем (rate limit) **CORS:** Frontend настроен в dev-прокси (vite.config.ts: `/api` → `localhost:8000`) **Плагины:** Конфигурация AI сервисов через `config/plugins.yaml`. См. [docs/plugins/contracts.md](../plugins/contracts.md). --- ## Тестирование ```bash # Health check curl http://localhost:8000/api/health # Swagger docs open http://localhost:8000/docs ``` Полная спецификация — в Swagger UI/ReDoc (см. выше) и в файлах этого каталога.