{"openapi":"3.1.0","info":{"title":"DeepScribe API","description":"REST API для транскрипции аудио и видео.\n\n**Аутентификация:** `Authorization: Bearer dsk_live_xxxxx`\n\nAPI-ключ создаётся через Telegram-бота: /api в @DeepScribe_bot\n\n**Каналы доступа:**\n- [@DeepScribe_bot](https://t.me/DeepScribe_bot) — основной канал в Telegram\n- [DeepScribe в MAX](https://max.ru/id772172955804_1_bot) — российский мессенджер\n- [deepscribe.ru](https://deepscribe.ru) — веб-версия с личным кабинетом\n","version":"1.0.0"},"paths":{"/v1/public/stats":{"get":{"tags":["public"],"summary":"Public Stats","description":"Публичные счётчики для лендинга — без auth.\nАктивные юзеры (не demo-anonymous) + сумма обработанных минут.","operationId":"public_stats_v1_public_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/public/maintenance":{"get":{"tags":["public"],"summary":"Public Maintenance","description":"Публичный endpoint без auth — лендинг и webapp дёргают раз в N\nсекунд чтобы показать баннер «тех. работы». Управляется админом\nчерез POST /v1/admin/maintenance.","operationId":"public_maintenance_v1_public_maintenance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public Maintenance V1 Public Maintenance Get"}}}}}}},"/v1/tariffs":{"get":{"tags":["public"],"summary":"Каталог тарифов","description":"Публичный список тарифов. Не требует авторизации. По умолчанию скрывает API Developer (показывается через `include_api=true`).","operationId":"list_tariffs_v1_tariffs_get","parameters":[{"name":"include_api","in":"query","required":false,"schema":{"type":"boolean","description":"Включить ли API Developer в список","default":false,"title":"Include Api"},"description":"Включить ли API Developer в список"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TariffInfo"},"title":"Response List Tariffs V1 Tariffs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["account"],"summary":"Информация о пользователе","operationId":"get_me_v1_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/balance":{"get":{"tags":["account"],"summary":"Баланс и квоты","operationId":"get_balance_v1_balance_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs":{"post":{"tags":["jobs"],"summary":"Создать задание на транскрипцию","description":"Multipart-запрос с файлом и опциями.\n\n**Пример curl:**\n```bash\ncurl -X POST https://deepscribe.ru/api/v1/jobs \\\n  -H \"Authorization: Bearer dsk_live_xxx\" \\\n  -F \"file=@interview.mp3\" \\\n  -F 'options={\"output_formats\":[\"txt\",\"docx\",\"srt\"],\"diarize\":true}'\n```\n\nВозвращает `job_id` для polling-а статуса через `GET /v1/jobs/{id}`.","operationId":"create_job_v1_jobs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_job_v1_jobs_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["jobs"],"summary":"Список своих заданий","operationId":"list_jobs_v1_jobs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Фильтр: pending, queued, processing, done, failed, cancelled","title":"Status"},"description":"Фильтр: pending, queued, processing, done, failed, cancelled"},{"name":"folder","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Фильтр по папке (точное совпадение)","title":"Folder"},"description":"Фильтр по папке (точное совпадение)"},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Фильтр по тегу (один тег)","title":"Tag"},"description":"Фильтр по тегу (один тег)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/from-url":{"post":{"tags":["jobs"],"summary":"Создать job, скачав файл по публичной ссылке","description":"MVP-замена Zoom-bot: пользователь даёт URL на запись (Zoom Cloud, Google Drive, Yandex Disk, прямой файл) — мы скачиваем и кладём в обычный pipeline.\n\nОграничения:\n- только HTTPS\n- размер до 2 ГБ\n- ссылка должна быть публично доступна (без OAuth)\n- блокируются приватные сети (SSRF-защита)","operationId":"create_job_from_url_v1_jobs_from_url_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobFromUrlIn"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Статус задания и доступные форматы","operationId":"get_job_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["jobs"],"summary":"Обновить папку/теги задания","description":"Меняет только `folder` и/или `tags` существующего job'а. Тэги: массив строк до 32 символов каждая, до 20 тегов. Папка: строка до 64 символов, lowercase.","operationId":"update_job_meta_v1_jobs__job_id__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobMetaPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["jobs"],"summary":"Отменить задание","description":"Можно отменить только jobs в статусе PENDING или QUEUED.","operationId":"cancel_job_v1_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/_meta/folders":{"get":{"tags":["jobs"],"summary":"Список папок юзера + кол-во jobs в каждой","operationId":"list_folders_v1_jobs__meta_folders_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/_meta/tags":{"get":{"tags":["jobs"],"summary":"Список всех тегов юзера + кол-во использований","operationId":"list_tags_v1_jobs__meta_tags_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/audio":{"get":{"tags":["jobs"],"summary":"Скачать/проиграть оригинальное аудио","description":"Возвращает оригинальный аудио-файл (или извлечённую дорожку для видео). Используется webapp-плеером для навигации по сегментам.","operationId":"download_audio_v1_jobs__job_id__audio_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/purge":{"post":{"tags":["jobs"],"summary":"Удалить все файлы задания (приватность)","description":"Iter 5.33: безвозвратное удаление файлов после обработки. Удаляет: исходное аудио, все форматы результата (txt/srt/json/docx/pdf/summary), edits.json, transcript.json. Job остаётся в БД с пометкой purged=True (для аудита и отчёта по списанным минутам), но скачивание и редактирование становятся недоступны. Действие НЕОБРАТИМОЕ — кнопка только для пользователей, уверенных что результат уже сохранили локально.","operationId":"purge_job_files_v1_jobs__job_id__purge_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/result/{format}":{"get":{"tags":["jobs"],"summary":"Скачать результат в формате","description":"Доступные форматы зависят от того, что было запрошено при создании. Файл возвращается как `application/octet-stream` или application/json.","operationId":"download_result_v1_jobs__job_id__result__format__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"path","required":true,"schema":{"type":"string","title":"Format"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/email/request":{"post":{"tags":["auth"],"summary":"Запросить 6-значный код на email","description":"Отправляет код на указанный email. Код действителен 10 минут.\n\nRate limit: до 5 запросов в час на один email.","operationId":"request_code_v1_auth_email_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/email/verify":{"post":{"tags":["auth"],"summary":"Проверить код и создать сессию","description":"Если код верный — создаёт пользователя (если ещё нет) и возвращает session-ключ `dsk_session_*` для использования в заголовке `Authorization: Bearer ...`.","operationId":"verify_code_v1_auth_email_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/history":{"get":{"tags":["account"],"summary":"История списаний и пополнений","description":"Лента событий за период (по умолчанию 30 дней) + сводка: сколько обработано минут, с плана/с баланса, сколько jobs, сколько пополнений по минутам, сколько активаций плана.","operationId":"get_history_v1_usage_history_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageHistory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/dashboard":{"get":{"tags":["account"],"summary":"Дашборд обработки за последние N месяцев","description":"Группирует minutes_consumed события по месяцам и возвращает массив бакетов для построения графика. Возвращает ВСЕ месяцы в окне (даже с нулевым обороtom) — чтобы график без дырок.","operationId":"get_dashboard_v1_usage_dashboard_get","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":6,"title":"Months"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardData"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/share":{"post":{"tags":["sharing"],"summary":"Создать публичную ссылку на транскрипт","description":"Возвращает существующую активную ссылку (если есть) либо создаёт новую с указанным TTL. Аудио и файлы для скачивания через ссылку не доступны — только web-просмотрщик.","operationId":"create_share_v1_jobs__job_id__share_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sharing"],"summary":"Отозвать активную ссылку (если есть)","operationId":"revoke_share_v1_jobs__job_id__share_delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/shares":{"get":{"tags":["sharing"],"summary":"История ссылок для этого job","operationId":"list_shares_v1_jobs__job_id__shares_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShareInfo"},"title":"Response List Shares V1 Jobs  Job Id  Shares Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/s/{token}":{"get":{"tags":["public"],"summary":"Публичный read-only транскрипт по ссылке","description":"Не требует авторизации. Возвращает текст транскрипта с применёнными правками владельца. Аудио и downloadable-файлы не отдаются.","operationId":"get_public_s__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTranscript"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/referrals/me":{"get":{"tags":["referrals"],"summary":"Мой реферальный код, ссылка и статистика","operationId":"get_my_stats_v1_referrals_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/referrals/apply":{"post":{"tags":["referrals"],"summary":"Применить реферальный код (связать с реферером)","description":"Привязывает текущего юзера к рефереру по коду. Работает только если у юзера ещё нет реферера И код принадлежит другому пользователю. После этого реферал получит 20% скидку на первый платёж.","operationId":"apply_referral_v1_referrals_apply_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyReferralIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search":{"get":{"tags":["search"],"summary":"Поиск по транскриптам","description":"Полнотекстовый поиск по всем готовым транскриптам пользователя. Поддерживает префиксный поиск: «бюдж» найдёт «бюджет», «бюджете», «бюджетный». Подсветка совпадений через «...».","operationId":"do_search_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/reindex":{"post":{"tags":["search"],"summary":"Принудительная переиндексация всех своих jobs","operationId":"reindex_v1_search_reindex_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export/zip":{"get":{"tags":["export"],"summary":"Скачать архив с результатами за период","description":"Возвращает application/zip со всеми результатами обработки за указанный период. Полезно для архивирования или передачи в команду. На больших архивах может занять время — стримит файл частями.","operationId":"export_zip_v1_export_zip_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"formats","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSV-список форматов: 'txt,docx,pdf'. None = все доступные.","title":"Formats"},"description":"CSV-список форматов: 'txt,docx,pdf'. None = все доступные."},{"name":"folder","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List My Webhooks","operationId":"list_my_webhooks_v1_webhooks_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookOut"},"title":"Response List My Webhooks V1 Webhooks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"create_webhook_v1_webhooks_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{sub_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_v1_webhooks__sub_id__delete","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","title":"Sub Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/vocabularies":{"get":{"tags":["vocabularies"],"summary":"List My","operationId":"list_my_v1_vocabularies_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VocabularyOut"},"title":"Response List My V1 Vocabularies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["vocabularies"],"summary":"Create Voc","operationId":"create_voc_v1_vocabularies_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VocabularyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VocabularyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/vocabularies/{voc_id}":{"get":{"tags":["vocabularies"],"summary":"Get Voc","operationId":"get_voc_v1_vocabularies__voc_id__get","parameters":[{"name":"voc_id","in":"path","required":true,"schema":{"type":"integer","title":"Voc Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VocabularyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["vocabularies"],"summary":"Patch Voc","operationId":"patch_voc_v1_vocabularies__voc_id__patch","parameters":[{"name":"voc_id","in":"path","required":true,"schema":{"type":"integer","title":"Voc Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VocabularyPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VocabularyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["vocabularies"],"summary":"Delete Voc","operationId":"delete_voc_v1_vocabularies__voc_id__delete","parameters":[{"name":"voc_id","in":"path","required":true,"schema":{"type":"integer","title":"Voc Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/templates/docx":{"get":{"tags":["templates"],"summary":"Get Docx Template","description":"Текущий шаблон пользователя + признак can_edit (Business+).","operationId":"get_docx_template_v1_templates_docx_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocxTemplateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["templates"],"summary":"Update Docx Template","description":"Обновить шаблон. Только Business.","operationId":"update_docx_template_v1_templates_docx_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocxTemplateConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocxTemplateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["templates"],"summary":"Reset Docx Template","description":"Сбросить шаблон → дефолт DeepScribe.","operationId":"reset_docx_template_v1_templates_docx_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/chunks":{"get":{"tags":["editor"],"summary":"Получить chunks с применёнными правками","description":"Возвращает массив сегментов транскрипта. Если есть правки (`edits.json` сохранён через PATCH) — они применены поверх оригинальных chunks. У каждого изменённого сегмента есть поле `_edited: true`. Отклонённые сегменты (accepted=false) исключаются по умолчанию.","operationId":"get_chunks_v1_jobs__job_id__chunks_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/chunks/{seg_idx}":{"patch":{"tags":["editor"],"summary":"Сохранить правку одного сегмента","description":"Принимает частичный JSON со списком полей для обновления. Любое поле может отсутствовать. Возвращает текущее состояние правки этого сегмента (после merge с предыдущими).","operationId":"patch_chunk_v1_jobs__job_id__chunks__seg_idx__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"seg_idx","in":"path","required":true,"schema":{"type":"integer","title":"Seg Idx"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/regenerate":{"post":{"tags":["editor"],"summary":"Пересобрать файлы из отредактированных сегментов","description":"Применяет накопленные правки (`edits.json`) к оригинальному транскрипту и перегенерирует ВСЕ форматы, которые были доступны у job'а: TXT, SRT, VTT, JSON, DOCX, PDF. Отклонённые сегменты (accepted=false) исключаются из выдачи.\n\nФайлы перезаписываются по тем же путям — поэтому ссылки на скачивание остаются актуальными. Если правок нет — возвращает `regenerated: false` без изменений.","operationId":"regenerate_files_v1_jobs__job_id__regenerate_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/rename_speaker":{"post":{"tags":["editor"],"summary":"Переименовать спикера во всех сегментах","description":"Меняет имя спикера во всех сегментах транскрипта одним вызовом. Учитывает уже сделанные правки. Пример: переименовать «speaker_00» в «Иван» — все 50 реплик speaker_00 станут «Иван».","operationId":"bulk_rename_speaker_v1_jobs__job_id__rename_speaker_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRenameIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRenameOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/segments/insert":{"post":{"tags":["editor"],"summary":"Вставить новый сегмент","description":"Добавляет новый блок после сегмента с указанным `after_idx`. after_idx=-1 — в самое начало. Возвращает id вставки, по которому потом можно редактировать или удалять.","operationId":"insert_segment_endpoint_v1_jobs__job_id__segments_insert_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsertSegmentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsertSegmentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/segments/insert/{insert_id}":{"patch":{"tags":["editor"],"summary":"Обновить вставленный сегмент","operationId":"patch_insert_endpoint_v1_jobs__job_id__segments_insert__insert_id__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"insert_id","in":"path","required":true,"schema":{"type":"string","title":"Insert Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsertPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["editor"],"summary":"Удалить вставленный сегмент","operationId":"delete_insert_endpoint_v1_jobs__job_id__segments_insert__insert_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"insert_id","in":"path","required":true,"schema":{"type":"string","title":"Insert Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/segments/{seg_idx}/split":{"post":{"tags":["editor"],"summary":"Разделить сегмент на две части (split-speaker)","description":"Разбивает сегмент по позиции в тексте: левая часть остаётся за оригинальным `seg_idx` (PATCH text+end_sec), правая создаётся как INSERT после него с новым спикером. Время разреза — точное от клиента или пропорциональное.","operationId":"split_segment_endpoint_v1_jobs__job_id__segments__seg_idx__split_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"seg_idx","in":"path","required":true,"schema":{"type":"integer","title":"Seg Idx"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitSegmentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/segments/{seg_idx}/merge_with_next":{"post":{"tags":["editor"],"summary":"Объединить реплику со следующей","description":"Iter 5.32: склеивает текущую реплику со следующей (`seg_idx` + `seg_idx+1`). Текст объединяется (через пробел или пунктуацию), `end_sec` берётся от следующей, а следующая помечается accepted=false (мягкое удаление). Применяется когда postprocess или ASR ошибочно разрезал одну реплику на две.","operationId":"merge_segments_with_next_endpoint_v1_jobs__job_id__segments__seg_idx__merge_with_next_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"seg_idx","in":"path","required":true,"schema":{"type":"integer","title":"Seg Idx"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/translate":{"post":{"tags":["editor"],"summary":"Перевести уже готовый транскрипт на другой язык","description":"Применяет Qwen-перевод к chunks уже завершённого job-а. Сохраняет translated_text в edits.json (как часть правок), и обновляет transcript.json. После — можно сделать regenerate, чтобы DOCX/TXT собрались с переводом.","operationId":"translate_existing_job_v1_jobs__job_id__translate_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/chat":{"post":{"tags":["editor"],"summary":"Спросить ассистента по содержимому транскрипта","description":"Передаёт транскрипт (с применёнными правками) + ваш вопрос в Qwen. Ответ опирается ТОЛЬКО на содержимое — модель просили не выдумывать. Можно передавать `history` для контекста предыдущих сообщений.","operationId":"chat_with_transcript_v1_jobs__job_id__chat_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/upload":{"post":{"tags":["support"],"summary":"Загрузить файл-вложение для тикета","description":"Юзер прикладывает файл к сообщению поддержки (≤ 10 МБ).\nФайл сохраняется в support-storage с уникальным токеном, ссылка\nвозвращается клиенту. Клиент вставляет URL в текст сообщения.\nStorage: deepscribe_data/support/{user_id}/{token}_{name}","operationId":"support_upload_v1_support_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_support_upload_v1_support_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportUploadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/ticket":{"post":{"tags":["support"],"summary":"Создать тикет поддержки или добавить сообщение","operationId":"create_or_reply_ticket_v1_support_ticket_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/tickets":{"get":{"tags":["support"],"summary":"Список тикетов текущего пользователя","operationId":"list_tickets_v1_support_tickets_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketOut"},"title":"Response List Tickets V1 Support Tickets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/tickets/{ticket_id}":{"get":{"tags":["support"],"summary":"Получить тикет со всеми сообщениями","operationId":"get_ticket_detail_v1_support_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/promo/validate":{"post":{"tags":["promo"],"summary":"Проверить промокод перед оплатой","operationId":"validate_promo_v1_promo_validate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/promo/validate-public":{"post":{"tags":["promo"],"summary":"Проверить промокод БЕЗ авторизации (для лендинга)","description":"То же что /validate, но без Bearer token. Проверяет код, срок действия, исчерпание max_uses, фильтр по плану и минимум суммы. НЕ проверяет «уже использовал ли юзер этот код» (это проверится при создании платежа).","operationId":"validate_promo_public_v1_promo_validate_public_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoPublicCheckIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/promo/redeem":{"post":{"tags":["promo"],"summary":"Применить BONUS_MINUTES промокод (без оплаты)","description":"Только для BONUS_MINUTES типа — мгновенное начисление минут.\n\nДля PERCENT/AMOUNT — нельзя применять отдельно, они валидируются и\nучитываются при создании платежа в /v1/tariffs/buy / billing/service.","operationId":"redeem_promo_v1_promo_redeem_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/offers":{"get":{"tags":["billing"],"summary":"Каталог оферт (тарифы + пополнения минут)","description":"Возвращает все доступные тарифы и пакеты пополнения.","operationId":"list_offers_v1_billing_offers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OfferOut"},"type":"array","title":"Response List Offers V1 Billing Offers Get"}}}}}}},"/v1/billing/checkout":{"post":{"tags":["billing"],"summary":"Создать платёж — получить URL Тинькофф для оплаты","description":"Создаёт заказ в Тинькофф эквайринг и возвращает payment_url. Frontend делает redirect на эту страницу. После оплаты юзер возвращается на success_url с параметром ?payment=success.\n\nПоддерживается промокод — PERCENT и AMOUNT_KOPECK типы применяются автоматически к amount_kopeck.","operationId":"checkout_v1_billing_checkout_post","parameters":[{"name":"X-Metrika-Client-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Yandex.Metrika ClientID для server-side офлайн-конверсий","title":"X-Metrika-Client-Id"},"description":"Yandex.Metrika ClientID для server-side офлайн-конверсий"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__billing__CheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__billing__CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/checkout-public":{"post":{"tags":["billing"],"summary":"Оплата с лендинга (без авторизации, с обязательным email)","description":"Создаёт WEB-юзера по email (или находит существующего, если этот email уже привязан к TG/MAX-аккаунту через email_for_receipt) и инициирует платёж в Тинькофф.\n\nПосле успешной оплаты юзер возвращается на /webapp/?payment=success&login_email=... — там автоматически стартует email-OTP вход в ЛК.","operationId":"checkout_public_v1_billing_checkout_public_post","parameters":[{"name":"X-Metrika-Client-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Metrika-Client-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__billing__CheckoutPublicIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__billing__CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/auto-renew":{"get":{"tags":["billing"],"summary":"Get Auto Renew","description":"Текущее состояние авто-продления подписки.","operationId":"get_auto_renew_v1_billing_auto_renew_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRenewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["billing"],"summary":"Set Auto Renew","description":"Вкл/выкл авто-продления. Текущий период подписки доработает —\nпросто не будет автоматических списаний после plan_expires_at.","operationId":"set_auto_renew_v1_billing_auto_renew_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRenewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRenewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/one-file/{job_id}/quote":{"get":{"tags":["billing"],"summary":"Рассчитать цену разовой обработки файла (без создания платежа)","description":"Возвращает цену за one-file processing для конкретного job.","operationId":"one_file_quote_v1_billing_one_file__job_id__quote_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OneFileQuoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/one-file/checkout":{"post":{"tags":["billing"],"summary":"Создать платёж за разовую обработку файла","description":"Создаёт Payment(kind='one_file') связанный с конкретным job, инициализирует Tinkoff invoice и возвращает payment_url. После CONFIRMED webhook'а job автоматически перепланируется для полной обработки. Минуты НЕ списываются с баланса.","operationId":"one_file_checkout_v1_billing_one_file_checkout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OneFileCheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__billing__CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/one-file/price":{"get":{"tags":["one-file"],"summary":"Цена разовой обработки для конкретного job","description":"Считает по длительности файла (audio_duration_sec). Если файл больше 360 минут — support_required=true (через поддержку).","operationId":"one_file_price_v1_one_file_price_get","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/one-file/checkout":{"post":{"tags":["one-file"],"summary":"Купить разовую обработку файла (требует auth)","description":"Создаёт Payment с kind=one_file для конкретного job. После успешной оплаты webhook разблокирует full_processing.\n\nЮзер должен быть авторизован (cookie/Bearer). Для покупки без авторизации — см. /checkout-public с обязательным email.","operationId":"one_file_checkout_v1_one_file_checkout_post","parameters":[{"name":"X-Metrika-Client-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Metrika-Client-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__one_file__CheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__one_file__CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/one-file/checkout-public":{"post":{"tags":["one-file"],"summary":"Купить разовую обработку файла с лендинга (без auth, email обязателен)","operationId":"one_file_checkout_public_v1_one_file_checkout_public_post","parameters":[{"name":"X-Metrika-Client-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Metrika-Client-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__one_file__CheckoutPublicIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/dv_bot__api__routers__one_file__CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/speakers":{"get":{"tags":["speakers"],"summary":"Список зарегистрированных голосов","operationId":"list_speakers_v1_speakers_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SpeakerOut"},"title":"Response List Speakers V1 Speakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/speakers/enroll":{"post":{"tags":["speakers"],"summary":"Зарегистрировать новый голос","description":"Загружает аудио-фрагмент (15-60 секунд чистой речи) и сохраняет embedding в БД. После этого в новых записях DeepScribe будет автоматически распознавать этого человека и подписывать его имя вместо «Голос N».\n\nРекомендации:\n- 15-60 секунд непрерывной речи (без долгих пауз)\n- Один говорящий в записи\n- Тот же тип записи что будет в реальных встречах (микрофон / телефон / помещение)","operationId":"enroll_speaker_v1_speakers_enroll_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_enroll_speaker_v1_speakers_enroll_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/speakers/{enrollment_id}":{"delete":{"tags":["speakers"],"summary":"Удалить зарегистрированный голос","operationId":"delete_speaker_v1_speakers__enrollment_id__delete","parameters":[{"name":"enrollment_id","in":"path","required":true,"schema":{"type":"integer","title":"Enrollment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/link-code":{"post":{"tags":["account"],"summary":"Сгенерировать 6-значный код для связки этого аккаунта с другим","operationId":"create_link_code_v1_account_link_code_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/link":{"post":{"tags":["account"],"summary":"Привязать этот аккаунт к primary (по коду из другого канала)","operationId":"link_account_v1_account_link_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/unlink":{"post":{"tags":["account"],"summary":"Отвязаться от primary (этот аккаунт снова сам по себе)","operationId":"unlink_account_v1_account_unlink_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/links":{"get":{"tags":["account"],"summary":"Список связанных аккаунтов","operationId":"list_linked_accounts_v1_account_links_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats":{"get":{"tags":["admin"],"summary":"KPI и сводная статистика для дашборда","operationId":"admin_stats_v1_admin_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Stats V1 Admin Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_id}/refund-empty":{"post":{"tags":["admin"],"summary":"Вернуть пользователю минуты за job без речи (FAILED + empty)","description":"Возврат минут для job, в котором pipeline не нашёл речь.\n\nВалидация (защита от случайного нажатия):\n  • Job существует\n  • Job.status в (FAILED, DONE)\n  • Job.minutes_consumed > 0 (есть что возвращать)\n  • Job.error_message содержит «не обнаружена речь» / «нет звука» /\n    «нет речи» ИЛИ result_paths пустой\n  • Не было возврата ранее (метка в options/log)","operationId":"refund_empty_job_v1_admin_jobs__job_id__refund_empty_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refund Empty Job V1 Admin Jobs  Job Id  Refund Empty Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/recent":{"get":{"tags":["admin"],"summary":"Последние события (юзеры, jobs, платежи)","operationId":"admin_recent_v1_admin_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Recent V1 Admin Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_id}/requeue":{"post":{"tags":["admin"],"summary":"Вернуть зависший PROCESSING job обратно в PENDING","operationId":"admin_requeue_job_v1_admin_jobs__job_id__requeue_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Requeue Job V1 Admin Jobs  Job Id  Requeue Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_id}/force-fail":{"post":{"tags":["admin"],"summary":"Принудительно пометить FAILED + вернуть минуты","operationId":"admin_force_fail_job_v1_admin_jobs__job_id__force_fail_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Force Fail Job V1 Admin Jobs  Job Id  Force Fail Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/worker/restart":{"post":{"tags":["admin"],"summary":"Перезапустить удалённый worker (через worker_commands)","operationId":"admin_restart_worker_v1_admin_worker_restart_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Restart Worker V1 Admin Worker Restart Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/tickets":{"get":{"tags":["admin"],"summary":"Список открытых тикетов","operationId":"admin_list_tickets_v1_admin_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin List Tickets V1 Admin Tickets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/tickets/{ticket_id}":{"get":{"tags":["admin"],"summary":"Детали тикета + история сообщений","operationId":"admin_get_ticket_v1_admin_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Get Ticket V1 Admin Tickets  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/tickets/{ticket_id}/reply":{"post":{"tags":["admin"],"summary":"Ответить на тикет (от админа)","operationId":"admin_reply_ticket_v1_admin_tickets__ticket_id__reply_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketReplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Reply Ticket V1 Admin Tickets  Ticket Id  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/worker/log":{"get":{"tags":["admin"],"summary":"Что сейчас делает worker (heartbeats + текущий job)","description":"Возвращает последние N heartbeat'ов worker'а + текущий обрабатываемый\njob (со всеми деталями). Этого достаточно для удалённой диагностики\nтипа «worker ли мёртв» / «застрял ли на job N» / «когда последний раз\nпинговал».","operationId":"admin_worker_log_v1_admin_worker_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Worker Log V1 Admin Worker Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/api-errors":{"get":{"tags":["admin"],"summary":"Последние API-ошибки (WARNING+) из лог-буфера","operationId":"admin_api_errors_v1_admin_api_errors_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contains"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Api Errors V1 Admin Api Errors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/api-errors/clear":{"post":{"tags":["admin"],"summary":"Очистить лог-буфер","operationId":"admin_api_errors_clear_v1_admin_api_errors_clear_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Api Errors Clear V1 Admin Api Errors Clear Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/worker/kill-current-job":{"post":{"tags":["admin"],"summary":"Прервать текущий job worker'а и перезапустить","description":"Шлёт worker'у команду kill_current. Worker:\n  1. Пометит текущий job FAILED с error=\"killed by admin\"\n  2. Выйдет с exit(0) → watchdog поднимет его снова\nИспользуется когда worker завис на сложном файле (preprocess loop,\nOOM на gpu и т.п.).","operationId":"admin_kill_current_job_v1_admin_worker_kill_current_job_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Kill Current Job V1 Admin Worker Kill Current Job Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_id}":{"get":{"tags":["admin"],"summary":"Детали job: status, options, error, time","operationId":"admin_job_details_v1_admin_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Job Details V1 Admin Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users":{"get":{"tags":["admin"],"summary":"Поиск/список пользователей","description":"q — поиск по id / external_id / email_for_receipt (LIKE).\nЕсли q пустой — последние N пользователей.","operationId":"admin_list_users_v1_admin_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin List Users V1 Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/grant-minutes":{"post":{"tags":["admin"],"summary":"Начислить N минут на баланс юзеру (компенсация)","operationId":"admin_grant_minutes_v1_admin_users__user_id__grant_minutes_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantMinutesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Grant Minutes V1 Admin Users  User Id  Grant Minutes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/change-plan":{"post":{"tags":["admin"],"summary":"Сменить тариф юзеру (без оплаты)","operationId":"admin_change_plan_v1_admin_users__user_id__change_plan_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Change Plan V1 Admin Users  User Id  Change Plan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/maintenance":{"post":{"tags":["admin"],"summary":"Вкл/выкл баннер тех. работ на сайте","operationId":"admin_set_maintenance_v1_admin_maintenance_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Set Maintenance V1 Admin Maintenance Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"Текущее состояние maintenance-режима","operationId":"admin_get_maintenance_v1_admin_maintenance_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Get Maintenance V1 Admin Maintenance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/requeue-stuck":{"post":{"tags":["admin"],"summary":"Вернуть в очередь все processing > N минут","description":"Возвращает в pending все jobs, которые висят в processing дольше\n`older_than_min` минут. Используется после восстановления worker'а\nкогда нужно «дочистить» зависшие задания одним кликом.","operationId":"admin_requeue_stuck_v1_admin_jobs_requeue_stuck_post","parameters":[{"name":"older_than_min","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Older Than Min"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Requeue Stuck V1 Admin Jobs Requeue Stuck Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/tickets/{ticket_id}/close":{"post":{"tags":["admin"],"summary":"Закрыть тикет без ответа","operationId":"admin_close_ticket_v1_admin_tickets__ticket_id__close_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Close Ticket V1 Admin Tickets  Ticket Id  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/system-health":{"get":{"tags":["admin"],"summary":"Worker heartbeat + очередь + error-rate (для виджета на /admin)","operationId":"admin_system_health_v1_admin_system_health_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin System Health V1 Admin System Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/promocodes":{"post":{"tags":["admin"],"summary":"Создать промокод со скидкой % (только админ)","operationId":"admin_create_promocode_v1_admin_promocodes_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"Список промокодов (последние 50)","operationId":"admin_list_promocodes_v1_admin_promocodes_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/b2b/lead":{"post":{"tags":["b2b"],"summary":"Заявка от B2B-клиента (Enterprise)","operationId":"submit_lead_v1_b2b_lead_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback":{"post":{"tags":["feedback"],"summary":"Оставить отзыв и получить персональный промокод 25% на месячный тариф","operationId":"submit_feedback_v1_feedback_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/me":{"get":{"tags":["feedback"],"summary":"Проверить, оставил ли текущий юзер отзыв","operationId":"my_feedback_status_v1_feedback_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo/upload":{"post":{"tags":["demo"],"summary":"Demo Upload","description":"Анонимная загрузка демо-файла.\n\nИспользуется на лендинге для «попробовать без регистрации».\nНе требует auth. Создаёт job под спец-юзером demo_anonymous.","operationId":"demo_upload_v1_demo_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_demo_upload_v1_demo_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoUploadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo/{token}":{"get":{"tags":["demo"],"summary":"Demo Status","description":"Опрос статуса демо-job по token. Когда DONE — возвращает TXT и SRT.\n\nЧерез 24 часа после создания job помечается expired=true (контент уже\nстёрт cleanup'ом — возвращаем заглушку «срок истёк»).","operationId":"demo_status_v1_demo__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo/{token}/download/{fmt}":{"get":{"tags":["demo"],"summary":"Demo Download File","description":"Скачивание готового файла (TXT/DOCX/SRT/JSON) после оплаты one-file.\n\nДоступно только для оплаченных job (paid_at IS NOT NULL и\nis_demo=False). Демо-фрагменты НЕ отдаём (платный контент).\n\nFrontend модалка строит URL из download_urls в DemoStatusOut.\nEmail-письмо тоже использует абсолютную версию этого endpoint'а.","operationId":"demo_download_file_v1_demo__token__download__fmt__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"fmt","in":"path","required":true,"schema":{"type":"string","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo/{token}/email":{"post":{"tags":["demo"],"summary":"Demo Capture Email","description":"Захватываем email после удачного демо.\nСоздаёт WEB-юзера с этим email (или находит существующего), привязывает\nк нему демо-job (опционально), отправляет письмо с ссылкой\nна результат + промокод WELCOME25. Welcome-серия запустится сама\nпо cron.send_welcome_emails (welcome_1_sent_at IS NULL).","operationId":"demo_capture_email_v1_demo__token__email_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoEmailIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoEmailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/contact":{"post":{"tags":["public-contact"],"summary":"Public Contact","description":"Анонимный посетитель лендинга отправляет вопрос/жалобу.\n\nИспользуется плавающим виджетом чата в dv_bot/landing/static/index.html.","operationId":"public_contact_v1_public_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplyReferralIn":{"properties":{"code":{"type":"string","maxLength":16,"minLength":4,"title":"Code"}},"type":"object","required":["code"],"title":"ApplyReferralIn"},"AutoRenewIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"AutoRenewIn"},"AutoRenewOut":{"properties":{"auto_renew_enabled":{"type":"boolean","title":"Auto Renew Enabled"},"has_rebill_id":{"type":"boolean","title":"Has Rebill Id"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"plan_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Expires At"}},"type":"object","required":["auto_renew_enabled","has_rebill_id"],"title":"AutoRenewOut"},"BalanceInfo":{"properties":{"plan_name":{"type":"string","title":"Plan Name"},"plan_display_name":{"type":"string","title":"Plan Display Name"},"plan_active":{"type":"boolean","title":"Plan Active"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At"},"plan_minutes_left":{"type":"number","title":"Plan Minutes Left"},"balance_minutes":{"type":"number","title":"Balance Minutes"},"total_available_minutes":{"type":"number","title":"Total Available Minutes"}},"type":"object","required":["plan_name","plan_display_name","plan_active","plan_minutes_left","balance_minutes","total_available_minutes"],"title":"BalanceInfo","description":"GET /v1/balance ответ."},"Body_create_job_v1_jobs_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Аудио или видео файл"},"options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Options","description":"JSON-объект опций (JobOptions). Пример: {\"output_formats\":[\"txt\",\"docx\"],\"diarize\":true}"},"client_duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Client Duration Sec","description":"Опц. хинт длительности от клиента (для случая когда ffprobe не может определить duration — например запись с MediaRecorder в webm без закрытого container header)."},"paywall":{"type":"boolean","title":"Paywall","description":"Iter 5.28: paywall-upload. Если у юзера нет квоты, передаём paywall=true чтобы создать job без consume квоты. Job получит options['_locked_until_payment']=True и НЕ подхватится воркером пока не пройдёт one-file checkout. Используется только в webapp при детекции 0 минут на балансе.","default":false}},"type":"object","required":["file"],"title":"Body_create_job_v1_jobs_post"},"Body_demo_upload_v1_demo_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Аудио до 2 минут, max 30 МБ"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"yclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yclid"}},"type":"object","required":["file"],"title":"Body_demo_upload_v1_demo_upload_post"},"Body_enroll_speaker_v1_speakers_enroll_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"WAV/MP3 фрагмент 15-60 секунд"},"display_name":{"type":"string","maxLength":64,"minLength":1,"title":"Display Name"},"notes":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Notes"}},"type":"object","required":["file","display_name"],"title":"Body_enroll_speaker_v1_speakers_enroll_post"},"Body_support_upload_v1_support_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_support_upload_v1_support_upload_post"},"BulkRenameIn":{"properties":{"old_speaker":{"type":"string","maxLength":128,"minLength":1,"title":"Old Speaker"},"new_speaker":{"type":"string","maxLength":128,"minLength":1,"title":"New Speaker"}},"type":"object","required":["old_speaker","new_speaker"],"title":"BulkRenameIn"},"BulkRenameOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"old_speaker":{"type":"string","title":"Old Speaker"},"new_speaker":{"type":"string","title":"New Speaker"},"updated_segments":{"type":"integer","title":"Updated Segments"}},"type":"object","required":["job_id","old_speaker","new_speaker","updated_segments"],"title":"BulkRenameOut"},"ChangePlanIn":{"properties":{"plan_name":{"type":"string","title":"Plan Name","description":"lite|solo|pro|business|free"},"months":{"type":"integer","maximum":24.0,"minimum":1.0,"title":"Months","default":1}},"type":"object","required":["plan_name"],"title":"ChangePlanIn"},"ChatIn":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question"},"history":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","maxItems":20,"title":"History"}},"type":"object","required":["question"],"title":"ChatIn"},"ChatMessage":{"properties":{"role":{"type":"string","pattern":"^(user|assistant)$","title":"Role"},"content":{"type":"string","maxLength":4000,"minLength":1,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"ChatOut":{"properties":{"answer":{"type":"string","title":"Answer"},"tokens_used":{"type":"integer","title":"Tokens Used","default":0}},"type":"object","required":["answer"],"title":"ChatOut"},"ContactIn":{"properties":{"email":{"type":"string","maxLength":128,"title":"Email"},"message":{"type":"string","maxLength":4000,"minLength":5,"title":"Message"},"subject":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Subject"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"}},"type":"object","required":["email","message"],"title":"ContactIn"},"ContactOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"message":{"type":"string","title":"Message"}},"type":"object","required":["ok","message"],"title":"ContactOut"},"DashboardData":{"properties":{"months":{"items":{"$ref":"#/components/schemas/MonthBucket"},"type":"array","title":"Months"},"total_months":{"type":"integer","title":"Total Months"},"grand_total_minutes":{"type":"number","title":"Grand Total Minutes"},"grand_total_jobs":{"type":"integer","title":"Grand Total Jobs"},"avg_minutes_per_month":{"type":"number","title":"Avg Minutes Per Month"}},"type":"object","required":["months","total_months","grand_total_minutes","grand_total_jobs","avg_minutes_per_month"],"title":"DashboardData"},"DemoEmailIn":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"DemoEmailIn"},"DemoEmailOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"is_new_user":{"type":"boolean","title":"Is New User"},"welcome_minutes_granted":{"type":"number","title":"Welcome Minutes Granted","default":0.0},"message":{"type":"string","title":"Message"}},"type":"object","required":["ok","is_new_user","message"],"title":"DemoEmailOut"},"DemoStatusOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress"},"progress_pct":{"type":"number","title":"Progress Pct","default":0},"duration_sec":{"type":"number","title":"Duration Sec","default":0},"audio_duration_sec":{"type":"number","title":"Audio Duration Sec","default":0},"transcript_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Txt"},"transcript_srt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Srt"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"expired":{"type":"boolean","title":"Expired","default":false},"is_demo":{"type":"boolean","title":"Is Demo","default":true},"paid":{"type":"boolean","title":"Paid","default":false},"download_urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Download Urls","default":{}},"email_sent_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Sent To"}},"type":"object","required":["job_id","status"],"title":"DemoStatusOut"},"DemoUploadOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"token":{"type":"string","title":"Token"},"share_url":{"type":"string","title":"Share Url"},"poll_url":{"type":"string","title":"Poll Url"},"expires_in_hours":{"type":"integer","title":"Expires In Hours"}},"type":"object","required":["job_id","token","share_url","poll_url","expires_in_hours"],"title":"DemoUploadOut"},"DocxTemplateConfig":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Company Name"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color","description":"HEX-цвет #RRGGBB"},"title_prefix":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Title Prefix"},"footer_text":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Footer Text"},"show_deepscribe_branding":{"type":"boolean","title":"Show Deepscribe Branding","default":true}},"type":"object","title":"DocxTemplateConfig"},"DocxTemplateOut":{"properties":{"config":{"$ref":"#/components/schemas/DocxTemplateConfig"},"plan_name":{"type":"string","title":"Plan Name"},"can_edit":{"type":"boolean","title":"Can Edit"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["config","plan_name","can_edit"],"title":"DocxTemplateOut"},"FeedbackIn":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"1-5 звёзд"},"text":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Text"},"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["rating"],"title":"FeedbackIn"},"FeedbackOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"promocode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promocode"},"discount_percent":{"type":"integer","title":"Discount Percent","default":25},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"message":{"type":"string","title":"Message"}},"type":"object","required":["ok","message"],"title":"FeedbackOut"},"GrantMinutesIn":{"properties":{"minutes":{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0,"title":"Minutes"},"reason":{"type":"string","maxLength":200,"title":"Reason","default":"admin compensation"}},"type":"object","required":["minutes"],"title":"GrantMinutesIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InsertPatchIn":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Text"},"speaker":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Speaker"},"start_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Sec"},"end_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"End Sec"},"accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accepted"},"illegible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Illegible"}},"type":"object","title":"InsertPatchIn"},"InsertSegmentIn":{"properties":{"after_idx":{"type":"integer","minimum":-1.0,"title":"After Idx","description":"-1 = в самое начало"},"text":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Text","default":""},"speaker":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Speaker","default":""},"start_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Sec","default":0.0},"end_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"End Sec","default":0.0}},"type":"object","required":["after_idx"],"title":"InsertSegmentIn"},"InsertSegmentOut":{"properties":{"id":{"type":"string","title":"Id"},"after_idx":{"type":"integer","title":"After Idx"},"text":{"type":"string","title":"Text"},"speaker":{"type":"string","title":"Speaker"},"start_sec":{"type":"number","title":"Start Sec"},"end_sec":{"type":"number","title":"End Sec"}},"type":"object","required":["id","after_idx","text","speaker","start_sec","end_sec"],"title":"InsertSegmentOut"},"JobCreated":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"eta_seconds":{"type":"integer","title":"Eta Seconds"},"minutes_to_process":{"type":"number","title":"Minutes To Process"},"will_trim":{"type":"boolean","title":"Will Trim","default":false},"trim_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trim Note"}},"type":"object","required":["job_id","status","created_at","eta_seconds","minutes_to_process"],"title":"JobCreated"},"JobFromUrlIn":{"properties":{"url":{"type":"string","maxLength":4096,"minLength":10,"title":"Url","description":"HTTPS-ссылка на запись. Поддерживаются прямые URL (mp3/mp4/wav/...), Google Drive (file/d/...), Yandex Disk (disk.yandex.ru/i/...), Zoom public recordings."},"options":{"$ref":"#/components/schemas/JobOptions"},"filename_hint":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Filename Hint","description":"Подсказка для имени файла. Если не указано — будет 'remote_recording'."}},"type":"object","required":["url"],"title":"JobFromUrlIn"},"JobInfo":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"audio_duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration Sec"},"audio_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Size Bytes"},"minutes_consumed":{"type":"number","title":"Minutes Consumed","default":0.0},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"available_formats":{"items":{"type":"string"},"type":"array","title":"Available Formats"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"processing_time_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Processing Time Sec"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"is_demo":{"type":"boolean","title":"Is Demo","default":false},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"parent_demo_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Demo Job Id"}},"type":"object","required":["id","status","created_at"],"title":"JobInfo"},"JobMetaPatch":{"properties":{"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"JobMetaPatch","description":"Метаданные: только folder и tags. Остальное на этом эндпоинте не меняем."},"JobOptions":{"properties":{"output_formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Output Formats","description":"Форматы выдачи: txt, docx, srt, vtt, json, pdf. Если не указано — берутся все, разрешённые на тарифе. Если указано — фильтруется до тех, что разрешены."},"language":{"type":"string","title":"Language","description":"Язык распознавания (ISO 639-1)","default":"ru"},"diarize":{"type":"boolean","title":"Diarize","description":"Разделять голоса спикеров","default":true},"num_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Speakers","description":"Точное число спикеров (если известно)"},"preprocess":{"type":"boolean","title":"Preprocess","description":"Применить препроцессинг аудио","default":true},"preprocess_profile":{"type":"string","title":"Preprocess Profile","description":"Профиль: default / phone / cctv / outdoor / studio","default":"default"},"use_qwen_polish":{"type":"boolean","title":"Use Qwen Polish","description":"Полировка пунктуации через ИИ (доступно на Lite+)","default":true},"use_nemo_ensemble":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Nemo Ensemble","description":"NeMo Conformer-CTC RU как вторая ASR — даёт ASR_DISAGREEMENT флаги где WhisperX и NeMo расходятся. Авто-вкл для Pro/Business."},"use_summary":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Summary","description":"Сгенерировать summary встречи (краткое содержание + action items). Доступно на Pro и Business. Если None — включается автоматически для подходящих тарифов."},"detailed_summary":{"type":"boolean","title":"Detailed Summary","description":"Расширенный summary (Business). Более детальные action items.","default":false},"mask_pii":{"type":"boolean","title":"Mask Pii","description":"Маскировать ПДн в финальном тексте: телефоны, email, ИНН, СНИЛС, номера карт, паспорта РФ. Полезно перед шерингом транскрипта или хранением в облаке. По умолчанию выключено.","default":false},"use_diarization_reranker":{"type":"boolean","title":"Use Diarization Reranker","description":"LLM-reranker диаризации через Qwen: смержить ложные splits когда pyannote разделил одного человека на 2-3 метки. Пропускается если num_speakers задано явно или Ollama недоступна.","default":true},"use_diarization_postprocess":{"type":"boolean","title":"Use Diarization Postprocess","description":"Структурный пост-процессинг диаризации: smart merge микро-сегментов <500мс, punctuation-aware boundary refinement, lexical fingerprint dedup. Дёшево, без LLM.","default":true},"diarization_min_segment_sec":{"type":"number","maximum":2.0,"minimum":0.1,"title":"Diarization Min Segment Sec","description":"Порог длительности микро-сегмента для smart-merge.","default":0.5},"diarization_lexical_threshold":{"type":"number","maximum":1.0,"minimum":0.5,"title":"Diarization Lexical Threshold","description":"Cosine similarity порог для lexical-dedup. Выше = строже (меньше ложных мержей).","default":0.85},"use_speaker_matching":{"type":"boolean","title":"Use Speaker Matching","description":"Сматчить найденных диаризатором спикеров с зарегистрированными голосами юзера (через /v1/speakers/enroll). При совпадении «Голос 1» автоматически переименовывается в «Иван».","default":true},"translate_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translate To","description":"Перевести транскрипт через Qwen в указанный язык. Поддержка: en, es, de, fr, zh, kk. None = без перевода."},"vocabulary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vocabulary","description":"Тематический словарь (legal_general, ...)"},"thematic_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thematic Context","description":"Произвольный контекст для подсказки модели"}},"type":"object","title":"JobOptions","description":"Опции обработки (передаются в POST /v1/jobs)."},"JobsList":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/JobInfo"},"type":"array","title":"Jobs"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["jobs","total"],"title":"JobsList"},"LeadIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"company":{"type":"string","maxLength":200,"minLength":2,"title":"Company"},"email":{"type":"string","maxLength":200,"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Phone"},"employees":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Employees"},"estimated_hours":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Estimated Hours"},"needs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Needs"},"message":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Message"}},"type":"object","required":["name","company","email"],"title":"LeadIn"},"LinkCodeOut":{"properties":{"code":{"type":"string","title":"Code"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"primary_user_id":{"type":"integer","title":"Primary User Id"}},"type":"object","required":["code","expires_at","primary_user_id"],"title":"LinkCodeOut"},"LinkIn":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["code"],"title":"LinkIn"},"LinkedAccountOut":{"properties":{"user_id":{"type":"integer","title":"User Id"},"source":{"type":"string","title":"Source"},"external_id":{"type":"string","title":"External Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"is_primary":{"type":"boolean","title":"Is Primary"}},"type":"object","required":["user_id","source","external_id","display_name","is_primary"],"title":"LinkedAccountOut"},"LinksOut":{"properties":{"primary_user_id":{"type":"integer","title":"Primary User Id"},"is_primary_for_current":{"type":"boolean","title":"Is Primary For Current"},"accounts":{"items":{"$ref":"#/components/schemas/LinkedAccountOut"},"type":"array","title":"Accounts"}},"type":"object","required":["primary_user_id","is_primary_for_current","accounts"],"title":"LinksOut"},"MaintenanceIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"message":{"type":"string","title":"Message","default":"Идут плановые технические работы. Сервис вернётся через несколько минут."},"block_new_jobs":{"type":"boolean","title":"Block New Jobs","default":false}},"type":"object","required":["enabled"],"title":"MaintenanceIn"},"MonthBucket":{"properties":{"month":{"type":"string","title":"Month","description":"Метка месяца YYYY-MM"},"label":{"type":"string","title":"Label","description":"Человечная подпись: 'Май 26'"},"minutes_used":{"type":"number","title":"Minutes Used"},"jobs_count":{"type":"integer","title":"Jobs Count"}},"type":"object","required":["month","label","minutes_used","jobs_count"],"title":"MonthBucket"},"OfferOut":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck"},"topup_minutes":{"type":"number","title":"Topup Minutes","default":0},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"period_months":{"type":"integer","title":"Period Months","default":1},"monthly_rate_kopeck":{"type":"integer","title":"Monthly Rate Kopeck","default":0}},"type":"object","required":["code","name","kind","amount_kopeck"],"title":"OfferOut"},"OneFileCheckoutIn":{"properties":{"job_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Job Id"},"email":{"type":"string","maxLength":128,"minLength":5,"title":"Email"},"utm_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Utm Term"},"yclid":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Yclid"}},"type":"object","required":["job_id","email"],"title":"OneFileCheckoutIn","description":"Тело для разовой оплаты конкретного файла."},"OneFileQuoteOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"duration_min":{"type":"number","title":"Duration Min"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck"},"amount_rub":{"type":"integer","title":"Amount Rub"},"support_required":{"type":"boolean","title":"Support Required"},"already_paid":{"type":"boolean","title":"Already Paid"}},"type":"object","required":["job_id","duration_min","amount_kopeck","amount_rub","support_required","already_paid"],"title":"OneFileQuoteOut","description":"Расчёт цены без создания платежа — для отображения в модалке."},"PriceOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"duration_sec":{"type":"number","title":"Duration Sec"},"duration_min":{"type":"number","title":"Duration Min"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck"},"amount_rub":{"type":"integer","title":"Amount Rub"},"support_required":{"type":"boolean","title":"Support Required","default":false},"already_paid":{"type":"boolean","title":"Already Paid","default":false}},"type":"object","required":["job_id","duration_sec","duration_min","amount_kopeck","amount_rub"],"title":"PriceOut"},"PromoCheckIn":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"amount_kopeck":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Amount Kopeck","description":"Сумма заказа в копейках (нужна для % и фикс. скидок)"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan","description":"Какой план юзер собирается купить (lite/pro/business)"},"offer_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Offer Code","description":"Конкретный offer_code (lite / lite_3m / topup_300 / ...)"}},"type":"object","required":["code"],"title":"PromoCheckIn"},"PromoCheckOut":{"properties":{"valid":{"type":"boolean","title":"Valid"},"code":{"type":"string","title":"Code"},"promo_type":{"type":"string","title":"Promo Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"discount_kopeck":{"type":"integer","title":"Discount Kopeck","default":0},"bonus_minutes":{"type":"integer","title":"Bonus Minutes","default":0},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["valid","code","promo_type","description"],"title":"PromoCheckOut"},"PromoCreateIn":{"properties":{"code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Code","description":"Если не задан — генерируется автоматически"},"percent":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Percent","description":"Процент скидки (1-99)"},"description":{"type":"string","maxLength":256,"title":"Description","default":""},"max_uses":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"},"expires_days":{"anyOf":[{"type":"integer","maximum":730.0,"minimum":1.0},{"type":"null"}],"title":"Expires Days","description":"Срок действия в днях от сейчас (NULL = бессрочно)"},"plan_filter":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Plan Filter","description":"Список планов: ['lite','pro'] или null = все"}},"type":"object","required":["percent"],"title":"PromoCreateIn"},"PromoCreateOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"code":{"type":"string","title":"Code"},"percent":{"type":"integer","title":"Percent"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["ok","code","percent","expires_at","max_uses"],"title":"PromoCreateOut"},"PromoPublicCheckIn":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"amount_kopeck":{"type":"integer","minimum":0.0,"title":"Amount Kopeck"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"offer_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Offer Code"}},"type":"object","required":["code","amount_kopeck"],"title":"PromoPublicCheckIn"},"PublicTranscript":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"job_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Filename"},"audio_duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration Sec"},"chunks_count":{"type":"integer","title":"Chunks Count"},"chunks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Chunks"},"shared_at":{"type":"string","format":"date-time","title":"Shared At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["job_id","chunks_count","chunks","shared_at","expires_at","views"],"title":"PublicTranscript"},"ReferralPayoutOut":{"properties":{"payment_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payment Id"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck"},"commission_kopeck":{"type":"integer","title":"Commission Kopeck"},"minutes_credited":{"type":"number","title":"Minutes Credited"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["payment_id","amount_kopeck","commission_kopeck","minutes_credited","created_at"],"title":"ReferralPayoutOut"},"ReferralStats":{"properties":{"code":{"type":"string","title":"Code"},"share_url":{"type":"string","title":"Share Url"},"commission_percent":{"type":"integer","title":"Commission Percent"},"invitee_discount_percent":{"type":"integer","title":"Invitee Discount Percent"},"balance_minutes":{"type":"number","title":"Balance Minutes"},"total_invited":{"type":"integer","title":"Total Invited"},"total_paying_invited":{"type":"integer","title":"Total Paying Invited"},"total_commission_kopeck":{"type":"integer","title":"Total Commission Kopeck"},"recent_payouts":{"items":{"$ref":"#/components/schemas/ReferralPayoutOut"},"type":"array","title":"Recent Payouts"},"invited_users":{"items":{"$ref":"#/components/schemas/ReferredUserOut"},"type":"array","title":"Invited Users"}},"type":"object","required":["code","share_url","commission_percent","invitee_discount_percent","balance_minutes","total_invited","total_paying_invited","total_commission_kopeck","recent_payouts","invited_users"],"title":"ReferralStats"},"ReferredUserOut":{"properties":{"user_id":{"type":"integer","title":"User Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"source":{"type":"string","title":"Source"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["user_id","first_name","source","created_at"],"title":"ReferredUserOut"},"RequestCodeIn":{"properties":{"email":{"type":"string","maxLength":255,"minLength":3,"pattern":"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$","title":"Email","description":"Email для входа"}},"type":"object","required":["email"],"title":"RequestCodeIn"},"RequestCodeOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"message":{"type":"string","title":"Message"},"debug_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug Code"}},"type":"object","required":["ok","message"],"title":"RequestCodeOut"},"SearchHit":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"filename":{"type":"string","title":"Filename"},"snippet":{"type":"string","title":"Snippet"},"rank":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rank"}},"type":"object","required":["job_id","filename","snippet"],"title":"SearchHit"},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"indexed_jobs":{"type":"integer","title":"Indexed Jobs"},"hits":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Hits"}},"type":"object","required":["query","indexed_jobs","hits"],"title":"SearchResponse"},"SegmentPatch":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Text"},"speaker":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Speaker"},"accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accepted"},"illegible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Illegible"},"start_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Sec"},"end_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"End Sec"}},"type":"object","title":"SegmentPatch","description":"Тело PATCH запроса. Любое поле может отсутствовать (частичная правка).\n\ntext:      новый текст сегмента (после правки)\nspeaker:   новое имя спикера (например \"Иван\" вместо \"Голос 1\")\naccepted:  True — сегмент явно принят, False — отклонён (исключён из выдачи)\nillegible: True — пометить как \"[неразборчиво]\" (текст игнорируется в выдаче)\nstart_sec: новая отметка начала в секундах (>= 0)\nend_sec:   новая отметка конца в секундах (должна быть > start_sec)"},"ShareCreateIn":{"properties":{"ttl_days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Ttl Days","default":7},"max_views":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Max Views"}},"type":"object","title":"ShareCreateIn"},"ShareInfo":{"properties":{"token":{"type":"string","title":"Token"},"url":{"type":"string","title":"Url"},"job_id":{"type":"integer","title":"Job Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"is_revoked":{"type":"boolean","title":"Is Revoked"},"view_count":{"type":"integer","title":"View Count"},"max_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Views"}},"type":"object","required":["token","url","job_id","created_at","expires_at","is_revoked","view_count"],"title":"ShareInfo"},"SpeakerOut":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"source_duration_sec":{"type":"number","title":"Source Duration Sec"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","display_name","source_duration_sec","is_active","created_at"],"title":"SpeakerOut"},"SplitSegmentIn":{"properties":{"split_char_idx":{"type":"integer","minimum":1.0,"title":"Split Char Idx","description":"Позиция символа разреза (1..len(text)-1)"},"new_speaker":{"type":"string","maxLength":128,"minLength":1,"title":"New Speaker"},"split_time_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Split Time Sec"}},"type":"object","required":["split_char_idx","new_speaker"],"title":"SplitSegmentIn","description":"Разделить сегмент по позиции в тексте, присвоить хвосту другого спикера."},"SupportUploadOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"url":{"type":"string","title":"Url"},"filename":{"type":"string","title":"Filename"},"size_bytes":{"type":"integer","title":"Size Bytes"}},"type":"object","required":["ok","url","filename","size_bytes"],"title":"SupportUploadOut"},"TariffInfo":{"properties":{"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"price_rub":{"type":"number","title":"Price Rub"},"monthly_minutes":{"type":"integer","title":"Monthly Minutes"},"features":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Features"}},"type":"object","required":["name","display_name","price_rub","monthly_minutes"],"title":"TariffInfo"},"TicketDetailOut":{"properties":{"ticket_id":{"type":"integer","title":"Ticket Id"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_message_at":{"type":"string","format":"date-time","title":"Last Message At"},"messages_count":{"type":"integer","title":"Messages Count"},"messages":{"items":{"$ref":"#/components/schemas/TicketMessageOut"},"type":"array","title":"Messages"}},"type":"object","required":["ticket_id","subject","status","created_at","last_message_at","messages_count","messages"],"title":"TicketDetailOut"},"TicketIn":{"properties":{"message":{"type":"string","maxLength":5000,"minLength":2,"title":"Message"},"subject":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Subject"},"ticket_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ticket Id","description":"Если задан — это новое сообщение в существующем тикете. Иначе создаётся новый тикет."}},"type":"object","required":["message"],"title":"TicketIn"},"TicketMessageOut":{"properties":{"id":{"type":"integer","title":"Id"},"sender_is_admin":{"type":"boolean","title":"Sender Is Admin"},"text":{"type":"string","title":"Text"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","sender_is_admin","text","created_at"],"title":"TicketMessageOut"},"TicketOut":{"properties":{"ticket_id":{"type":"integer","title":"Ticket Id"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_message_at":{"type":"string","format":"date-time","title":"Last Message At"},"messages_count":{"type":"integer","title":"Messages Count"}},"type":"object","required":["ticket_id","subject","status","created_at","last_message_at","messages_count"],"title":"TicketOut"},"TicketReplyIn":{"properties":{"text":{"type":"string","maxLength":4000,"minLength":3,"title":"Text"},"close_after":{"type":"boolean","title":"Close After","default":false}},"type":"object","required":["text"],"title":"TicketReplyIn"},"TranslateIn":{"properties":{"target_lang":{"type":"string","maxLength":8,"minLength":2,"title":"Target Lang","description":"en, es, de, fr, zh, kk"}},"type":"object","required":["target_lang"],"title":"TranslateIn"},"TranslateOut":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"target_lang":{"type":"string","title":"Target Lang"},"chunks_translated":{"type":"integer","title":"Chunks Translated"},"chunks_total":{"type":"integer","title":"Chunks Total"}},"type":"object","required":["job_id","target_lang","chunks_translated","chunks_total"],"title":"TranslateOut"},"UsageEvent":{"properties":{"id":{"type":"integer","title":"Id"},"timestamp":{"type":"string","title":"Timestamp"},"event_type":{"type":"string","title":"Event Type"},"label":{"type":"string","title":"Label","description":"Человекопонятное описание события"},"minutes_used":{"type":"number","title":"Minutes Used"},"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"},"job_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Filename"},"from_plan":{"type":"number","title":"From Plan","default":0.0},"from_balance":{"type":"number","title":"From Balance","default":0.0},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","required":["id","timestamp","event_type","label","minutes_used"],"title":"UsageEvent"},"UsageHistory":{"properties":{"summary":{"$ref":"#/components/schemas/UsageSummary"},"events":{"items":{"$ref":"#/components/schemas/UsageEvent"},"type":"array","title":"Events"}},"type":"object","required":["summary","events"],"title":"UsageHistory"},"UsageSummary":{"properties":{"days":{"type":"integer","title":"Days"},"total_minutes_used":{"type":"number","title":"Total Minutes Used"},"total_from_plan":{"type":"number","title":"Total From Plan"},"total_from_balance":{"type":"number","title":"Total From Balance"},"total_jobs_processed":{"type":"integer","title":"Total Jobs Processed"},"total_topups_minutes":{"type":"number","title":"Total Topups Minutes"},"plans_activated":{"type":"integer","title":"Plans Activated"}},"type":"object","required":["days","total_minutes_used","total_from_plan","total_from_balance","total_jobs_processed","total_topups_minutes","plans_activated"],"title":"UsageSummary"},"UserInfo":{"properties":{"user_id":{"type":"integer","title":"User Id"},"plan_name":{"type":"string","title":"Plan Name"},"plan_display_name":{"type":"string","title":"Plan Display Name"},"plan_active":{"type":"boolean","title":"Plan Active"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At"},"email_for_receipt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email For Receipt"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","required":["user_id","plan_name","plan_display_name","plan_active"],"title":"UserInfo","description":"GET /v1/me ответ."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCodeIn":{"properties":{"email":{"type":"string","maxLength":255,"minLength":3,"pattern":"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$","title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyCodeIn"},"VerifyCodeOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"message":{"type":"string","title":"Message"},"session_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Key"},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["ok","message"],"title":"VerifyCodeOut"},"VocabularyIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"terms":{"items":{"type":"string"},"type":"array","maxItems":500,"title":"Terms"},"is_default":{"type":"boolean","title":"Is Default","default":false}},"type":"object","required":["name"],"title":"VocabularyIn"},"VocabularyOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"terms":{"items":{"type":"string"},"type":"array","title":"Terms"},"is_default":{"type":"boolean","title":"Is Default"},"terms_count":{"type":"integer","title":"Terms Count"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","terms","is_default","terms_count","created_at","updated_at"],"title":"VocabularyOut"},"VocabularyPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Name"},"terms":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":500},{"type":"null"}],"title":"Terms"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"VocabularyPatch"},"WebhookCreateIn":{"properties":{"url":{"type":"string","maxLength":512,"minLength":10,"pattern":"^https?://.+","title":"Url"},"events":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Events"}},"type":"object","required":["url"],"title":"WebhookCreateIn"},"WebhookOut":{"properties":{"id":{"type":"integer","title":"Id"},"url":{"type":"string","title":"Url"},"secret":{"type":"string","title":"Secret"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","title":"Created At"},"last_triggered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Triggered At"},"success_count":{"type":"integer","title":"Success Count"},"failure_count":{"type":"integer","title":"Failure Count"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"type":"object","required":["id","url","secret","events","is_active","created_at","last_triggered_at","success_count","failure_count","last_error"],"title":"WebhookOut"},"dv_bot__api__routers__billing__CheckoutIn":{"properties":{"offer_code":{"type":"string","maxLength":64,"minLength":2,"title":"Offer Code"},"email":{"type":"string","maxLength":128,"minLength":5,"title":"Email"},"promo_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Promo Code"}},"type":"object","required":["offer_code","email"],"title":"CheckoutIn"},"dv_bot__api__routers__billing__CheckoutOut":{"properties":{"success":{"type":"boolean","title":"Success"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"payment_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payment Id"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck","default":0},"discount_kopeck":{"type":"integer","title":"Discount Kopeck","default":0},"promo_applied":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Applied"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"CheckoutOut"},"dv_bot__api__routers__billing__CheckoutPublicIn":{"properties":{"offer_code":{"type":"string","maxLength":64,"minLength":2,"title":"Offer Code"},"email":{"type":"string","maxLength":128,"minLength":5,"title":"Email"},"promo_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Promo Code"}},"type":"object","required":["offer_code","email"],"title":"CheckoutPublicIn","description":"Тело для покупки с лендинга — без auth, но обязательный email."},"dv_bot__api__routers__one_file__CheckoutIn":{"properties":{"job_id":{"type":"integer","minimum":1.0,"title":"Job Id"},"promo_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Promo Code"}},"type":"object","required":["job_id"],"title":"CheckoutIn"},"dv_bot__api__routers__one_file__CheckoutOut":{"properties":{"success":{"type":"boolean","title":"Success"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"payment_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payment Id"},"amount_kopeck":{"type":"integer","title":"Amount Kopeck","default":0},"discount_kopeck":{"type":"integer","title":"Discount Kopeck","default":0},"promo_applied":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Applied"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"support_required":{"type":"boolean","title":"Support Required","default":false}},"type":"object","required":["success"],"title":"CheckoutOut"},"dv_bot__api__routers__one_file__CheckoutPublicIn":{"properties":{"job_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Job Id"},"demo_token":{"anyOf":[{"type":"string","maxLength":64,"minLength":16},{"type":"null"}],"title":"Demo Token"},"email":{"type":"string","maxLength":128,"minLength":5,"title":"Email"},"promo_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Promo Code"}},"type":"object","required":["email"],"title":"CheckoutPublicIn","description":"Покупка с лендинга без авторизации: указывается email + job_id демо.\n\nБэкенд найдёт/создаст web-юзера по email и привяжет к job (если у job\nещё нет user_id — он указывает на demo_anonymous).\n\nМай-2026 v6: job_id теперь опционален — если frontend потерял его (race\ncondition или клиент перезагрузил страницу), backend может resolve'ить\nчерез demo_token. Один из двух обязателен."}}},"servers":[{"url":"/api"}]}