{"openapi":"3.1.0","info":{"title":"AI Aggregator","version":"0.1.0"},"paths":{"/v1/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health V1 Health Get"}}}}}}},"/v1/health/db":{"get":{"tags":["health"],"summary":"Health Db","operationId":"health_db_v1_health_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Db V1 Health Db Get"}}}}}}},"/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Регистрация по email: НЕ создаёт User, а кладёт pending и шлёт письмо.\nРеальный аккаунт (+кошельки, аналитика, реферал) создаётся в verify_email по\nссылке из письма. Signup-мета/реферал переехали в verify (данные — в pending).","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/google":{"post":{"tags":["auth"],"summary":"Oauth Google Login","description":"Логин через Google. Принимает id_token, который фронт получил после\nOAuth-flow с Google. Бэк валидирует подпись через JWKS, находит/создаёт\nюзера, выдаёт нашу пару токенов.","operationId":"oauth_google_login_v1_auth_oauth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/yandex":{"post":{"tags":["auth"],"summary":"Oauth Yandex Login","description":"Логин через Яндекс ID. Принимает access_token (фронт получает его\nчерез PKCE-flow). Бэк делает запрос к login.yandex.ru/info, получает\nemail и id, находит/создаёт юзера, выдаёт нашу пару токенов.","operationId":"oauth_yandex_login_v1_auth_oauth_yandex_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthAccessTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","operationId":"verify_email_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/verify-email-code":{"post":{"tags":["auth"],"summary":"Verify Email Code","description":"Подтверждение email по КОДУ (регистрация из Mini App) → создаём юзера и сразу\nвыдаём токены (авто-вход). Тенант — по X-Tenant-Domain (email уникален в тенанте).","operationId":"verify_email_code_v1_auth_verify_email_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","operationId":"resend_verification_v1_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Resend Verification V1 Auth Resend Verification Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/resend-verification-public":{"post":{"tags":["auth"],"summary":"Resend Verification Public","description":"Повторная отправка письма подтверждения по email (юзер ещё не залогинен).\nВсегда 200 (без enumeration), rate-limited.","operationId":"resend_verification_public_v1_auth_resend_verification_public_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Resend Verification Public V1 Auth Resend Verification Public Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","operationId":"forgot_password_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Forgot Password V1 Auth Forgot Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"reset_password_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Reset Password V1 Auth Reset Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users":{"get":{"tags":["admin"],"summary":"List Users","operationId":"list_users_v1_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(created_at|email)$","default":"created_at","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Order"}},{"name":"has_subscription","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Subscription"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"User Detail","description":"Подробная карточка пользователя (Dialog в /admin/users). 404, если нет.","operationId":"user_detail_v1_admin_users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats/overview":{"get":{"tags":["admin"],"summary":"Stats Overview","operationId":"stats_overview_v1_admin_stats_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminDashboardStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/payments":{"get":{"tags":["admin"],"summary":"List Payments","operationId":"list_payments_v1_admin_payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(api_topup|token_pack|subscription_initial|subscription_renewal)$"},{"type":"null"}],"title":"Kind"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|succeeded|failed|refunded)$"},{"type":"null"}],"title":"Status"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPaymentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats/payments":{"get":{"tags":["admin"],"summary":"Stats Payments","operationId":"stats_payments_v1_admin_stats_payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPaymentsStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/visits/overview":{"get":{"tags":["admin"],"summary":"Visits Overview","operationId":"visits_overview_v1_admin_visits_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitsOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/visits/visitors":{"get":{"tags":["admin"],"summary":"Visits Visitors","operationId":"visits_visitors_v1_admin_visits_visitors_get","security":[{"HTTPBearer":[]}],"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":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/visits/bots":{"get":{"tags":["admin"],"summary":"Visits Bots","operationId":"visits_bots_v1_admin_visits_bots_get","security":[{"HTTPBearer":[]}],"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":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/visits/recent":{"get":{"tags":["admin"],"summary":"Visits Recent","description":"Сырой журнал последних визитов (время МСК на фронте, IP, страница, устройство).","operationId":"visits_recent_v1_admin_visits_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|human|bot)$","default":"all","title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentVisitsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/tenants":{"get":{"tags":["admin"],"summary":"List Tenants","description":"Список брендов (тенантов) для фильтра статистики per-brand (white-label).","operationId":"list_tenants_v1_admin_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/status/providers":{"get":{"tags":["admin"],"summary":"Status Providers","description":"Доступность и баланс внешних провайдеров (кэш ~60с; refresh=1 — обойти).","operationId":"status_providers_v1_admin_status_providers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvidersStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/status/system":{"get":{"tags":["admin"],"summary":"Status System","description":"Здоровье нашей инфры: БД, Redis, фоновые таймеры, нагрузка, агрегаты.","operationId":"status_system_v1_admin_status_system_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/status/test/tochka":{"post":{"tags":["admin"],"summary":"Status Test Tochka","description":"Создать тестовый платёж 1₽ (payment-link) — админ платит картой, проверяем\nдоставку вебхука. Баланс/Payment не трогаем (диспетчер noop-ack’ает).","operationId":"status_test_tochka_v1_admin_status_test_tochka_post","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TochkaTestResponse"}}}}}},"get":{"tags":["admin"],"summary":"Status Test Tochka Check","description":"Пришёл ли вебхук по operationId (опрашивается фронтом после оплаты).","operationId":"status_test_tochka_check_v1_admin_status_test_tochka_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"operation_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TochkaTestStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/status/test/email":{"post":{"tags":["admin"],"summary":"Status Test Email","description":"Отправить тестовое письмо (по умолчанию — на email админа) и показать реальный\nответ Resend. Проверка почтового канала (домен/SPF/DKIM/ключ).","operationId":"status_test_email_v1_admin_status_test_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/models":{"get":{"tags":["admin-pages"],"summary":"Admin List Models","description":"Доступные модели (enabled) для выбора model_ref на странице.","operationId":"admin_list_models_v1_admin_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminModelListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/pages":{"get":{"tags":["admin-pages"],"summary":"Admin List Pages","operationId":"admin_list_pages_v1_admin_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-pages"],"summary":"Admin Create Page","operationId":"admin_create_page_v1_admin_pages_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageWrite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pages/{page_id}":{"get":{"tags":["admin-pages"],"summary":"Admin Get Page","operationId":"admin_get_page_v1_admin_pages__page_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-pages"],"summary":"Admin Update Page","operationId":"admin_update_page_v1_admin_pages__page_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pages/{page_id}/behavior":{"put":{"tags":["admin-pages"],"summary":"Admin Update Page Behavior","description":"Вшитый промпт / контролы / pipeline (Промпт 2). Невалидный pipeline → 400.","operationId":"admin_update_page_behavior_v1_admin_pages__page_id__behavior_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageBehaviorWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pages/{page_id}/preview":{"post":{"tags":["admin-pages"],"summary":"Admin Preview Page","description":"Предпросмотр промптов и цены БЕЗ генерации (можно с несохранённым кандидатом).","operationId":"admin_preview_page_v1_admin_pages__page_id__preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagePreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pages/{page_id}/active":{"patch":{"tags":["admin-pages"],"summary":"Admin Set Page Active","operationId":"admin_set_page_active_v1_admin_pages__page_id__active_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageActiveWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pages/{page_id}/bots-enabled":{"patch":{"tags":["admin-pages"],"summary":"Admin Set Page Bots Enabled","description":"Тумблер «доступно из ботов TG/MAX» для инструмента каталога.","operationId":"admin_set_page_bots_enabled_v1_admin_pages__page_id__bots_enabled_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageBotsEnabledWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pricing/tools":{"get":{"tags":["admin-pricing"],"summary":"List Tools","description":"Экономика юзер-инструментов: цена, Σ шагов, себестоимость, маржа.","operationId":"list_tools_v1_admin_pricing_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolsPricingResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/pricing/tools/{tool_id}":{"patch":{"tags":["admin-pricing"],"summary":"Patch Tool","description":"Правка цены карточки/шагов. Действует на проде сразу (каталог читает БД).","operationId":"patch_tool_v1_admin_pricing_tools__tool_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolPricingPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolPricingRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pricing/plans":{"get":{"tags":["admin-pricing"],"summary":"List Plans","operationId":"list_plans_v1_admin_pricing_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlansResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin-pricing"],"summary":"Create Plan","description":"Изменения тарифов касаются только НОВЫХ подписок (снапшот в subscriptions).","operationId":"create_plan_v1_admin_pricing_plans_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/pricing/plans/{plan_id}":{"patch":{"tags":["admin-pricing"],"summary":"Patch Plan","operationId":"patch_plan_v1_admin_pricing_plans__plan_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pricing/api-models":{"get":{"tags":["admin-pricing"],"summary":"List Api Models","description":"Read-only: dev-цены правятся в config/providers.yaml + рестарт бэка.","operationId":"list_api_models_v1_admin_pricing_api_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiModelsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/pricing/audit":{"get":{"tags":["admin-pricing"],"summary":"List Audit","operationId":"list_audit_v1_admin_pricing_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/agent-skills":{"get":{"tags":["admin-agent-skills"],"summary":"List Skills","operationId":"list_skills_v1_admin_agent_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AgentSkillOut"},"type":"array","title":"Response List Skills V1 Admin Agent Skills Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/agent-skills/{skill_id}":{"put":{"tags":["admin-agent-skills"],"summary":"Update Skill","operationId":"update_skill_v1_admin_agent_skills__skill_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSkillPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSkillOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["me"],"summary":"Get Me","operationId":"get_me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["me"],"summary":"Delete Me","description":"Soft-delete: аккаунт деактивируется, все сессии отзываются.\n\nРеактивация — только админом (не в этой итерации). Hard-delete (с зачисткой\nданных) добавим, когда появится требование по GDPR/152-ФЗ.","operationId":"delete_me_v1_me_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["me"],"summary":"Update Me","operationId":"update_me_v1_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/change-password":{"post":{"tags":["me"],"summary":"Change Password","operationId":"change_password_v1_me_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/gallery":{"get":{"tags":["me"],"summary":"Get Gallery","description":"«Моя галерея»: все картинки и видео юзера из диалогов, новейшие сверху,\nkeyset-пагинация (`cursor`). `kind` фильтрует image|video. 400 — битый курсор.","operationId":"get_gallery_v1_me_gallery_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["image","video"],"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/telegram":{"get":{"tags":["me"],"summary":"Telegram Link Status","operationId":"telegram_link_status_v1_me_telegram_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramLinkStatus"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/telegram/link-token":{"post":{"tags":["me"],"summary":"Create Telegram Link Token","description":"Одноразовый токен + deep-link для привязки Telegram к текущему аккаунту.","operationId":"create_telegram_link_token_v1_me_telegram_link_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramLinkTokenResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/telegram/link":{"delete":{"tags":["me"],"summary":"Unlink Telegram","operationId":"unlink_telegram_v1_me_telegram_link_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/me/messengers/{platform}":{"get":{"tags":["me"],"summary":"Messenger Link Status","operationId":"messenger_link_status_v1_me_messengers__platform__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessengerLinkStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/messengers/{platform}/link-token":{"post":{"tags":["me"],"summary":"Create Messenger Link Token","description":"Одноразовый токен + deep-link для привязки мессенджера к текущему аккаунту.\n\nТокен несёт тенант, поэтому связка ложится в тот же кабинет, откуда её начали\n(важно для вайтлейбла). Бот обменяет его в ``BotService._handle_link_token``.","operationId":"create_messenger_link_token_v1_me_messengers__platform__link_token_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessengerLinkTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/messengers/{platform}/link":{"delete":{"tags":["me"],"summary":"Unlink Messenger","operationId":"unlink_messenger_v1_me_messengers__platform__link_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/connectors":{"get":{"tags":["connectors"],"summary":"List Connectors","operationId":"list_connectors_v1_me_connectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConnectorOut"},"type":"array","title":"Response List Connectors V1 Me Connectors Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["connectors"],"summary":"Connect Connector","operationId":"connect_connector_v1_me_connectors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorConnectRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/connectors/{connector_type}/test":{"post":{"tags":["connectors"],"summary":"Test Connector","operationId":"test_connector_v1_me_connectors__connector_type__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_type","in":"path","required":true,"schema":{"type":"string","title":"Connector Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/connectors/{connector_type}":{"delete":{"tags":["connectors"],"summary":"Disconnect Connector","operationId":"disconnect_connector_v1_me_connectors__connector_type__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_type","in":"path","required":true,"schema":{"type":"string","title":"Connector Type"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/events/visit":{"post":{"tags":["analytics"],"summary":"Record Visit","description":"Зафиксировать визит страницы. Вызывается фоновым beacon из proxy.ts.","operationId":"record_visit_v1_events_visit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupAttribution"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations":{"post":{"tags":["conversations"],"summary":"Create Conversation","description":"Новый тред, закреплённый за моделью/шаблоном (catalog_slug). 404 — нет записи.","operationId":"create_conversation_v1_me_conversations_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["conversations"],"summary":"List Conversations","operationId":"list_conversations_v1_me_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}":{"get":{"tags":["conversations"],"summary":"Get Conversation","operationId":"get_conversation_v1_me_conversations__conversation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["conversations"],"summary":"Rename Conversation","operationId":"rename_conversation_v1_me_conversations__conversation_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages":{"get":{"tags":["conversations"],"summary":"Get Messages","description":"Keyset-страница ленты (подгрузка вверх): последние сообщения старше `before`.","operationId":"get_messages_v1_me_conversations__conversation_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagePageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["conversations"],"summary":"Send Message","description":"Текстовый ход диалога: списывает token_cost, шлёт окно контекста модели,\nсохраняет сообщения. 402 — мало токенов; 502 — провайдер упал (резерв возвращён);\n400 — у треда не текстовая модель (image/video — следующий шаг).","operationId":"send_message_v1_me_conversations__conversation_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationSendRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages/stream":{"post":{"tags":["conversations"],"summary":"Send Message Stream","description":"Потоковый (SSE) текстовый ход диалога — токены ответа идут на экран по мере\nгенерации. Только для ТЕКСТОВЫХ моделей; картинки/видео/аудио — обычный\nPOST .../messages. Пред-проверки (владение, текстовая модель, баланс) идут ДО\nстарта потока → ошибки уходят чистым 4xx, а не SSE-событием.\n\nСобытия потока: `data: {\"type\":\"delta\",\"text\":…}` … `{\"type\":\"done\",…}` |\n`{\"type\":\"error\",\"message\":…}`. Тариф фиксированный (token_cost карточки).","operationId":"send_message_stream_v1_me_conversations__conversation_id__messages_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationSendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages/{message_id}/media/{idx}":{"get":{"tags":["conversations"],"summary":"Get Message Media","description":"Файл медиа сообщения (картинка/видео) под JWT. Проверка владения беседой.","operationId":"get_message_media_v1_me_conversations__conversation_id__messages__message_id__media__idx__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages/{message_id}/poll":{"post":{"tags":["conversations"],"summary":"Poll Message","description":"Опрос статуса async-видео сообщения: pending→done/failed (settle/release токенов).","operationId":"poll_message_v1_me_conversations__conversation_id__messages__message_id__poll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/archive":{"post":{"tags":["conversations"],"summary":"Archive Conversation","operationId":"archive_conversation_v1_me_conversations__conversation_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/template-runs":{"post":{"tags":["template-runs"],"summary":"Start Run","description":"Старт интерактивного прогона шаблона в диалоге. 400 — шаблон не interactive;\n402 — мало токенов; 404 — чужой/несуществующий диалог.","operationId":"start_run_v1_me_template_runs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunStartRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/template-runs/{run_id}/regenerate":{"post":{"tags":["template-runs"],"summary":"Regenerate Run","description":"Перегенерировать текущий шаг (дописать вариант(ы) с уточнением).","operationId":"regenerate_run_v1_me_template_runs__run_id__regenerate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunRegenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/template-runs/{run_id}/repeat":{"post":{"tags":["template-runs"],"summary":"Repeat Run","description":"«Новая сцена с теми же героями»: зафиксировать текущий (последний) шаг и\nзапустить повторяемый блок (loop) заново — копим сцены для будущего мини-мульта.","operationId":"repeat_run_v1_me_template_runs__run_id__repeat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunRepeatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/template-runs/{run_id}/goto":{"post":{"tags":["template-runs"],"summary":"Goto Run","description":"Свободная навигация (navigation:free): вернуться на пройденный шаг и\nпереоткрыть его (current+active). Ничего не удаляет.","operationId":"goto_run_v1_me_template_runs__run_id__goto_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunGotoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/template-runs/{run_id}/advance":{"post":{"tags":["template-runs"],"summary":"Advance Run","description":"Зафиксировать выбор и перейти к следующему шагу (или завершить run).","operationId":"advance_run_v1_me_template_runs__run_id__advance_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunAdvanceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/media/{message_id}/{idx}":{"get":{"tags":["media"],"summary":"Get Signed Media","description":"Файл медиа по подписи. 404 — подпись неверна/протухла или файла нет\n(404, а не 403 — не раскрываем существование чужих ресурсов).","operationId":"get_signed_media_v1_media__message_id___idx__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"full","title":"Variant"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","operationId":"list_api_keys_v1_me_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys V1 Me Api Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["api-keys"],"summary":"Create Api Key","operationId":"create_api_key_v1_me_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/api-keys/{key_id}":{"patch":{"tags":["api-keys"],"summary":"Rename Api Key","operationId":"rename_api_key_v1_me_api_keys__key_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-keys"],"summary":"Delete Api Key","operationId":"delete_api_key_v1_me_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/token-lots":{"get":{"tags":["wallets"],"summary":"List Token Lots","description":"Живые лоты токенов юзера со сроками сгорания (earliest-expiry-first).","operationId":"list_token_lots_v1_me_token_lots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenLotResponse"},"type":"array","title":"Response List Token Lots V1 Me Token Lots Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/wallets":{"get":{"tags":["wallets"],"summary":"List Wallets","operationId":"list_wallets_v1_me_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WalletResponse"},"type":"array","title":"Response List Wallets V1 Me Wallets Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/wallets/{currency}":{"get":{"tags":["wallets"],"summary":"Get Wallet","operationId":"get_wallet_v1_me_wallets__currency__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/transactions":{"get":{"tags":["wallets"],"summary":"List Transactions","operationId":"list_transactions_v1_me_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/topup":{"post":{"tags":["billing"],"summary":"Topup","operationId":"topup_v1_billing_topup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/api-balance/topup":{"post":{"tags":["payments"],"summary":"Api Balance Topup","operationId":"api_balance_topup_v1_me_api_balance_topup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTopupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/tokens/purchase-card":{"post":{"tags":["payments"],"summary":"Buy Token Pack","operationId":"buy_token_pack_v1_me_tokens_purchase_card_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/promo/redeem":{"post":{"tags":["promo"],"summary":"Redeem Promo","description":"Погасить промокод. 404 — нет кода; 409 — уже использован;\n422 — истёк / лимит / не подходит.","operationId":"redeem_promo_v1_me_promo_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/benefits":{"get":{"tags":["promo"],"summary":"My Benefits","description":"Активные плюшки юзера (доступные к применению скидки и т.п.).","operationId":"my_benefits_v1_me_benefits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenefitsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/referral":{"get":{"tags":["promo"],"summary":"My Referral","description":"Личный пригласительный код + статистика (создаётся при первом обращении).","operationId":"my_referral_v1_me_referral_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions/quote":{"get":{"tags":["promo"],"summary":"Quote Subscription","description":"Превью цены подписки со скидкой (если есть активная плюшка).","operationId":"quote_subscription_v1_me_subscriptions_quote_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"plan","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/tokens/quote":{"get":{"tags":["promo"],"summary":"Quote Tokens","description":"Превью цены пака токенов со скидкой (поверх объёмной).","operationId":"quote_tokens_v1_me_tokens_quote_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tokens","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Tokens"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/promo-codes":{"get":{"tags":["admin-promo"],"summary":"List Promo Codes","operationId":"list_promo_codes_v1_admin_promo_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin-promo"],"summary":"Create Promo Code","operationId":"create_promo_code_v1_admin_promo_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/promo-codes/{code_id}/stats":{"get":{"tags":["admin-promo"],"summary":"Promo Code Stats","description":"Детальная статистика по коду: активации, суммы скидок/бонусов, последние погашения.","operationId":"promo_code_stats_v1_admin_promo_codes__code_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/promo-codes/{code_id}":{"patch":{"tags":["admin-promo"],"summary":"Update Promo Code","operationId":"update_promo_code_v1_admin_promo_codes__code_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Code Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/promo-codes/batch":{"post":{"tags":["admin-promo"],"summary":"Create Promo Batch","description":"Сгенерировать пачку уникальных промокодов (для раздачи).","operationId":"create_promo_batch_v1_admin_promo_codes_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoBatchCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/referrals":{"get":{"tags":["admin-referral"],"summary":"Referrals Overview","description":"Сводка по рефералам (для аналитики/фрод-ревью).","operationId":"referrals_overview_v1_admin_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralOverview"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/referrals/list":{"get":{"tags":["admin-referral"],"summary":"Referrals List","description":"Список рефералов с email и fraud_signals — для фрод-ревью.","operationId":"referrals_list_v1_admin_referrals_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/referral-program":{"get":{"tags":["admin-referral"],"summary":"Get Referral Program","operationId":"get_referral_program_v1_admin_referral_program_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralProgramOut"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["admin-referral"],"summary":"Update Referral Program","operationId":"update_referral_program_v1_admin_referral_program_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralProgramUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralProgramOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/generations":{"post":{"tags":["generations"],"summary":"Create Generation","description":"Зарезервировать токены, выполнить задачу реальной моделью, финализировать.\n\nРезерв (hold) → execute → settle (успех) / release (сбой). 404 — задачи нет;\n402 — не хватает токенов; 502 — генерация упала (резерв возвращён). Повтор с\nтем же Idempotency-Key идемпотентен: успех → повтор-ответ без списания, сбой →\nснова 502 (без повторного исполнения).","operationId":"create_generation_v1_me_generations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/chat":{"post":{"tags":["generations"],"summary":"Chat Turn","description":"Один ход диалога: списываем токены за задачу chat, шлём историю модели,\nвозвращаем ответ. 402 — недостаточно токенов; 502 — провайдер упал (резерв возвращён).","operationId":"chat_turn_v1_me_chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurnRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations":{"post":{"tags":["generations"],"summary":"Create Video Generation","description":"Зарезервировать токены и засабмитить видео-задачу. 202 + job (processing).\nОпрос — GET /v1/me/video-generations/{id}. 404 — задачи нет; 402 — мало токенов;\n400 — задача не видео; 502 — сабмит упал (резерв возвращён).","operationId":"create_video_generation_v1_me_video_generations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations/{job_id}":{"get":{"tags":["generations"],"summary":"Get Video Generation","description":"Опрос задания: при готовности — settle резерва (completed) либо release (failed).","operationId":"get_video_generation_v1_me_video_generations__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations/{job_id}/download":{"get":{"tags":["generations"],"summary":"Ui Video Download","description":"Отдать MP4 (409 если не COMPLETED).","operationId":"ui_video_download_v1_me_video_generations__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/subscriptions/checkout":{"post":{"tags":["subscriptions"],"summary":"Subscribe Checkout","description":"Оформить подписку картой через Точку → ссылка на оплату.\n\nАктивация (начисление токенов) — после оплаты по вебхуку. Не блокирует при\nналичии активной подписки (смена тарифа): старая гасится при оплате новой.","operationId":"subscribe_checkout_v1_me_subscriptions_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions":{"get":{"tags":["subscriptions"],"summary":"Current Subscription","operationId":"current_subscription_v1_me_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionResponse"},{"type":"null"}],"title":"Response Current Subscription V1 Me Subscriptions Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["subscriptions"],"summary":"Subscribe","description":"409 — уже есть активная; 404 — нет тарифа; 402 — мало ₽.","operationId":"subscribe_v1_me_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions/cancel":{"post":{"tags":["subscriptions"],"summary":"Cancel Subscription","description":"Отменить автопродление (404 если активной нет). Токены остаются.","operationId":"cancel_subscription_v1_me_subscriptions_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions/resume":{"post":{"tags":["subscriptions"],"summary":"Resume Subscription","description":"Снова включить автопродление (404 если активной нет).","operationId":"resume_subscription_v1_me_subscriptions_resume_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/tokens/purchase":{"post":{"tags":["tokens"],"summary":"Purchase Tokens","description":"Купить токены: списать ₽ по тарифной цене, начислить токены.\n400 — объём вне лимитов; 402 — мало ₽. Повтор по ключу не задвоит.","operationId":"purchase_tokens_v1_me_tokens_purchase_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPurchaseRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications":{"get":{"tags":["notifications"],"summary":"List My Notifications","description":"Уведомления для текущего юзера, с пометкой is_read и общим unread-counter.","operationId":"list_my_notifications_v1_me_notifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications/{notification_id}/read":{"post":{"tags":["notifications"],"summary":"Mark One Read","operationId":"mark_one_read_v1_me_notifications__notification_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notification Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications/mark-all-read":{"post":{"tags":["notifications"],"summary":"Mark All Read","operationId":"mark_all_read_v1_me_notifications_mark_all_read_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/notifications":{"get":{"tags":["admin"],"summary":"List All Notifications","operationId":"list_all_notifications_v1_admin_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationAdminItem"},"type":"array","title":"Response List All Notifications V1 Admin Notifications Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Notification","description":"Создать broadcast — увидят все юзеры тенанта.\n\nReason: повышение цен, новые модели, тех-работы, важные изменения.","operationId":"create_notification_v1_admin_notifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationAdminItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/notifications/{notification_id}":{"delete":{"tags":["admin"],"summary":"Delete Notification","operationId":"delete_notification_v1_admin_notifications__notification_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notification Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/telegram/webhook":{"post":{"tags":["bots"],"summary":"Telegram Webhook","description":"Вебхук дефолтного бота (тенант Main), токен/секрет из конфига.","operationId":"telegram_webhook_v1_bots_telegram_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telegram Webhook V1 Bots Telegram Webhook Post"}}}}}}},"/v1/bots/telegram/webhook/{tenant_domain}":{"post":{"tags":["bots"],"summary":"Telegram Webhook Tenant","description":"Вебхук бота вайтлейбл-тенанта (мультитокен-роутинг, docs/23 фаза 4).\n\nТенант определяется по домену в пути (его указываем при setWebhook), токен и\nсекрет — из ``tenant.settings`` (`telegram_bot_token` / `telegram_webhook_secret`).","operationId":"telegram_webhook_tenant_v1_bots_telegram_webhook__tenant_domain__post","parameters":[{"name":"tenant_domain","in":"path","required":true,"schema":{"type":"string","title":"Tenant Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Telegram Webhook Tenant V1 Bots Telegram Webhook  Tenant Domain  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/max/webhook":{"post":{"tags":["bots"],"summary":"Max Webhook","description":"Вебхук дефолтного MAX-бота (тенант Main). Ставится через ``POST /subscriptions``\nс тем же секретом (заголовок ``X-Max-Bot-Api-Secret``).","operationId":"max_webhook_v1_bots_max_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Max Webhook V1 Bots Max Webhook Post"}}}}}}},"/v1/bots/max/webhook/{tenant_domain}":{"post":{"tags":["bots"],"summary":"Max Webhook Tenant","description":"Вебхук MAX-бота вайтлейбл-тенанта: токен/секрет из ``tenant.settings``\n(`max_bot_token` / `max_webhook_secret`).","operationId":"max_webhook_tenant_v1_bots_max_webhook__tenant_domain__post","parameters":[{"name":"tenant_domain","in":"path","required":true,"schema":{"type":"string","title":"Tenant Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Max Webhook Tenant V1 Bots Max Webhook  Tenant Domain  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/telegram/miniapp/auth":{"post":{"tags":["bots"],"summary":"Telegram Miniapp Auth","description":"Вход из Mini App. Тенант — по домену (X-Tenant-Domain). initData валидируем\nтокеном ЭТОГО тенанта; связку ищем в ЭТОМ тенанте (один tg_id = разные\nкабинеты в разных ботах).","operationId":"telegram_miniapp_auth_v1_bots_telegram_miniapp_auth_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/telegram/miniapp/link":{"post":{"tags":["bots"],"summary":"Telegram Miniapp Link","description":"Связать TG-личность с текущим сайт-аккаунтом (с согласием).\n\nТенант берём у аутентифицированного пользователя (его домашний бренд) —\nтак связка гарантированно в том же тенанте, что и сайт-User. initData\nвалидируется токеном этого тенанта: tg_id нельзя подделать под чужой.","operationId":"telegram_miniapp_link_v1_bots_telegram_miniapp_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/bots/max/miniapp/auth":{"post":{"tags":["bots"],"summary":"Max Miniapp Auth","description":"Вход из Mini App MAX. Зеркало телеграмного: тенант по домену (X-Tenant-Domain),\ninitData валидируем токеном MAX-бота ЭТОГО тенанта, связку ищем в ЭТОМ тенанте.","operationId":"max_miniapp_auth_v1_bots_max_miniapp_auth_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaxMiniAppAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/max/miniapp/link":{"post":{"tags":["bots"],"summary":"Max Miniapp Link","description":"Связать MAX-личность с текущим сайт-аккаунтом (с согласием).\n\nТенант — у аутентифицированного пользователя, initData валидируется токеном\nэтого тенанта: подделать чужой ``platform_user_id`` нельзя.","operationId":"max_miniapp_link_v1_bots_max_miniapp_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniAppLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaxMiniAppLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/chat/completions":{"post":{"tags":["text"],"summary":"Создать chat completion","description":"OpenAI-совместимая генерация текста: `model` + `messages`, авторизация — `Authorization: Bearer <API-ключ>`. Принимаются оба cap-поля (`max_tokens` и `max_completion_tokens`) — шлюз сам нормализует под семейство модели (openai/* получает `max_completion_tokens`, остальные — `max_tokens`; оба поля с разными значениями → 400). Стриминг — `stream: true` (SSE); финальный чанк с `usage` приходит только при `stream_options.include_usage: true`. Списание с баланса — после успешного ответа провайдера по фактическому usage, при ошибке апстрима денег не берём; лимит — 60 запросов в минуту на аккаунт (общий bucket для text/images/video/audio).","operationId":"chat_completions_v1_chat_completions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/audio/speech":{"post":{"tags":["audio"],"summary":"Озвучить текст (TTS)","description":"OpenAI-совместимый синтез речи: в ответ приходит бинарное аудио (`audio/mpeg` | `audio/wav` | `audio/pcm`), не JSON. `input` — до 4096 символов; `voice` принимает OpenAI-имена (alloy→Puck, coral→Kore, echo→Charon, nova→Aoede, onyx→Fenrir, shimmer→Leda) и родные имена Gemini, неизвестный голос → Kore. `speed` — приблизительный (передаётся модели инструкцией). Списание — после успешного ответа по фактическому usage провайдера (при его отсутствии — оценка по длине текста); rate-limit — общий bucket 60 запросов в минуту.","operationId":"create_speech_v1_audio_speech_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/images/generations":{"post":{"tags":["images"],"summary":"Сгенерировать изображение","description":"Генерация картинки по `prompt` в OpenAI-формате; ответ — `data[].b64_json` (default `response_format=b64_json`). Непустое поле `image` переключает запрос в режим редактирования (instruct-edit) — модель должна иметь capability `image_input`, иначе 400 `unsupported_capability`. Списание — после успешного ответа провайдера (по usage либо фикс-цене за картинку), при ошибке апстрима денег не берём; rate-limit — общий bucket 60 запросов в минуту на аккаунт.","operationId":"images_generations_v1_images_generations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/images/edits":{"post":{"tags":["images"],"summary":"Отредактировать изображение","description":"OpenAI-совместимое редактирование картинок: принимает и multipart/form-data (как `client.images.edit()` в SDK — файлы `image`, опционально `mask`), и application/json с base64-картинками (то же тело, что у generations с полем `image`). Суммарный размер файлов — не больше 20 МБ. Модель должна иметь capability `image_input`, иначе 400 `unsupported_capability`; биллинг и rate-limit — как у /v1/images/generations (списание после успеха, 60 запросов в минуту).","operationId":"images_edits_v1_images_edits_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/video/generations":{"post":{"tags":["video"],"summary":"Создать видео-генерацию (исходный формат)","description":"Наш исходный (не Sora) формат видео-генерации — рабочий алиас /v1/videos, для новых интеграций рекомендуем именно /v1/videos. Возвращает 202 с job в статусе `processing`; дальше статус опрашивается GET-запросом. На входе проверяется баланс, списание (тариф модели за секунду × `duration_seconds`) — после успешного завершения генерации.","operationId":"create_video_generation_v1_video_generations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/video/generations/{job_id}":{"get":{"tags":["video"],"summary":"Статус видео-генерации (исходный формат)","description":"Статус job в исходном формате: `processing` → `completed` | `failed` (poll-on-demand — запрос сам опрашивает провайдера). При переходе в `completed` происходит списание и в ответе появляется `download_url` и `cost_rub`.","operationId":"get_video_generation_v1_video_generations__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/video/generations/{job_id}/download":{"get":{"tags":["video"],"summary":"Скачать MP4 (исходный формат)","description":"Отдаёт байты MP4 завершённого job (Content-Type `video/mp4`). Если генерация не завершена — 409, чужой или несуществующий job — 404. Скачивание бесплатное.","operationId":"video_download_v1_video_generations__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/videos":{"post":{"tags":["video"],"summary":"Создать видео-задачу","description":"Sora-совместимое создание видео: принимает и application/json, и multipart/form-data (как `client.videos.create()` в SDK). `seconds` маппится на длительность, `size` (\"1280x720\") — на соотношение сторон и разрешение, `input_reference` (файл или URL) — на первый кадр. Генерация асинхронная: в ответ приходит video object со статусом `queued`, дальше статус опрашивается через GET /v1/videos/{id}. На входе проверяется баланс, а списание (по тарифу модели за секунду) — только после успешного завершения генерации.","operationId":"create_video_v1_videos_post","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoObject"}}}}}},"get":{"tags":["video"],"summary":"Список видео-задач","description":"Видео-задачи текущего API-ключа (точнее — его владельца), новые первыми. Пагинация курсором: `after` — id последнего видео предыдущей страницы, `limit` — до 100. Список не опрашивает провайдера — статус конкретной задачи продвигается только запросом GET /v1/videos/{id}.","operationId":"list_videos_v1_videos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/videos/{video_id}":{"get":{"tags":["video"],"summary":"Статус видео-задачи","description":"Возвращает video object и при необходимости опрашивает провайдера (poll-on-demand): статусы `queued` → `in_progress` → `completed` | `failed`, `progress` грубый (0/50/100 — у провайдеров нет точных процентов). Именно в момент перехода в `completed` происходит списание за генерацию. Принимает id и как `video_<uuid>`, и как голый uuid.","operationId":"get_video_v1_videos__video_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoObject"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/videos/{video_id}/content":{"get":{"tags":["video"],"summary":"Скачать готовое видео","description":"Отдаёт байты MP4 завершённой задачи (Content-Type `video/mp4`). Если генерация ещё не завершена — 409 в OpenAI-формате ошибки, несуществующий или чужой id — 404. Скачивание бесплатное — списание уже произошло при завершении генерации.","operationId":"get_video_content_v1_videos__video_id__content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models":{"get":{"tags":["models"],"summary":"Список доступных моделей","description":"Возвращает все модели, доступные по API (текст, картинки, видео, озвучка) — поле `id` подставляется в параметр `model` остальных эндпоинтов. Авторизация — `Authorization: Bearer <API-ключ>`; запрос бесплатный, баланс не трогает.","operationId":"list_models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/pricing":{"get":{"tags":["pricing"],"summary":"Get Pricing","operationId":"get_pricing_v1_me_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/public/pricing":{"get":{"tags":["public"],"summary":"Public Pricing","description":"То же что /v1/me/pricing, но без JWT — для публичных страниц\n(/pricing и /models). PII не возвращает.\n\nДля image-моделей подмешиваем `avg_cost_rub` — фактическое среднее списание\nза картинку из истории (точнее теоретической оценки tokens_per_image).","operationId":"public_pricing_v1_public_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}}}}},"/v1/public/ui-tasks":{"get":{"tags":["public"],"summary":"Public Ui Tasks","description":"Каталог UI-задач с фикс-ценой в токенах — для витрины (без JWT).\nВнутренние поля (model_ref, preset_prompt, params) не отдаём.","operationId":"public_ui_tasks_v1_public_ui_tasks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UiTaskListResponse"}}}}}}},"/v1/public/categories":{"get":{"tags":["public"],"summary":"Public Categories","description":"Категории каталога — чипы главной и секции /catalog (без JWT).\n\nДо этого категории были захардкожены в четырёх местах фронта, с разными\nподписями («Текст» / «Текст и чат» / «Текстовые»). Теперь источник один.\nКатегории общие для всех вайтлейблов, поэтому tenant_id тут не нужен.","operationId":"public_categories_v1_public_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryListResponse"}}}}}}},"/v1/public/catalog":{"get":{"tags":["public"],"summary":"Public Catalog","description":"Единый каталог моделей+шаблонов для витрины/пикера (без JWT).\n\nОпциональные фильтры kind (model|template) и capability. Внутренние поля\n(preset_prompt, params) не отдаём.","operationId":"public_catalog_v1_public_catalog_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/{slug}":{"get":{"tags":["public"],"summary":"Public Catalog Entry","description":"Деталь записи каталога по slug — наполнение страницы /chat/{slug}\n(пустое состояние, скрины 41/42) и SEO. Для шаблонов — со списком сэмплов.","operationId":"public_catalog_entry_v1_public_catalog__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/{slug}/score":{"post":{"tags":["public"],"summary":"Public Catalog Score","description":"Посчитать шкалы анкеты БЕЗ авторизации и БЕЗ токенов.\n\nКлиент присылает только ответы; баллы всегда считает сервер (веса —\nключ теста, наружу не уходят). Ответы гостя НЕ сохраняются. Наружу\nотдаём ровно то, что разрешает gate.free шаблона.","operationId":"public_catalog_score_v1_public_catalog__slug__score_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/{slug}/price":{"post":{"tags":["public"],"summary":"Public Catalog Price","description":"Итоговая цена генерации в токенах для записи + выбранных контролов.\nДля pipeline — сумма шагов (с переменной ценой по форматам/длительности/качеству);\nдля legacy — count×token_cost или плоско. Фронт показывает её в окне ввода.","operationId":"public_catalog_price_v1_public_catalog__slug__price_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Catalog Price V1 Public Catalog  Slug  Price Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/subscription-plans":{"get":{"tags":["public"],"summary":"Public Subscription Plans","description":"Каталог тарифов (без JWT) — для витрины подписок.\n\nДоп. поля под визуал-конверсию: ``recommended`` (герой = средний тариф по\nsort_order), ``pack_price_rub`` + ``savings_pct`` (якорь «те же токены паком\nдороже»). Считаем на бэке, чтобы фронт не дублировал логику.","operationId":"public_subscription_plans_v1_public_subscription_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanListResponse"}}}}}}},"/v1/public/token-pricing":{"get":{"tags":["public"],"summary":"Public Token Pricing","description":"Предрасчёт цены докупки для калькулятора (без JWT). Цена за токен падает с объёмом.","operationId":"public_token_pricing_v1_public_token_pricing_get","parameters":[{"name":"tokens","in":"query","required":true,"schema":{"type":"integer","title":"Tokens"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPriceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/model-pages/{vendor}/{model}":{"get":{"tags":["public"],"summary":"Public Model Page","description":"Оверлей страницы модели по user-facing id «{vendor}/{model}».\n\nmodel_id содержит «/» («anthropic/claude-haiku-4.5»), поэтому путь —\nдва параметра со склейкой. Если оверлея нет — обычный 404 (фронт\nfail-safe рендерит страницу без него).","operationId":"public_model_page_v1_public_model_pages__vendor___model__get","parameters":[{"name":"vendor","in":"path","required":true,"schema":{"type":"string","title":"Vendor"}},{"name":"model","in":"path","required":true,"schema":{"type":"string","title":"Model"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelPageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/blog":{"get":{"tags":["blog"],"summary":"List Blog","operationId":"list_blog_v1_public_blog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogListResponse"}}}}}}},"/v1/public/blog/media/{name}":{"get":{"tags":["blog"],"summary":"Get Blog Media","description":"Отдаёт загруженную через админку картинку блога (WebP). Публично.","operationId":"get_blog_media_v1_public_blog_media__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/blog/{slug}":{"get":{"tags":["blog"],"summary":"Get Blog","operationId":"get_blog_v1_public_blog__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticlePublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/blog":{"get":{"tags":["admin-blog"],"summary":"Admin List Blog","operationId":"admin_list_blog_v1_admin_blog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogAdminListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin-blog"],"summary":"Admin Create Blog","operationId":"admin_create_blog_v1_admin_blog_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticleWrite"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticleAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/blog/{article_id}":{"get":{"tags":["admin-blog"],"summary":"Admin Get Blog","operationId":"admin_get_blog_v1_admin_blog__article_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticleAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-blog"],"summary":"Admin Update Blog","operationId":"admin_update_blog_v1_admin_blog__article_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticleWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogArticleAdmin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-blog"],"summary":"Admin Delete Blog","operationId":"admin_delete_blog_v1_admin_blog__article_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/blog/upload":{"post":{"tags":["admin-blog"],"summary":"Admin Upload Blog Image","description":"Загрузка картинки блога (обложка или инлайн) — multipart. Конвертит в\nWebP, возвращает {url} для cover_src или вставки в тело статьи (#6).","operationId":"admin_upload_blog_image_v1_admin_blog_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_blog_image_v1_admin_blog_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Admin Upload Blog Image V1 Admin Blog Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"AdminApiKeyItem":{"properties":{"key_prefix":{"type":"string","title":"Key Prefix"},"name":{"type":"string","title":"Name"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["key_prefix","name","is_active","created_at"],"title":"AdminApiKeyItem"},"AdminDashboardStats":{"properties":{"users":{"$ref":"#/components/schemas/MetricBlock"},"chats":{"$ref":"#/components/schemas/MetricBlock"}},"type":"object","required":["users","chats"],"title":"AdminDashboardStats","description":"Сводка дашборда: пользователи + чаты (диалоги)."},"AdminLedgerEntry":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"type":{"type":"string","title":"Type"},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount"},"balance_after":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Balance After"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["created_at","type","amount","balance_after","status","currency"],"title":"AdminLedgerEntry"},"AdminModelCount":{"properties":{"slug":{"type":"string","title":"Slug"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["slug","count"],"title":"AdminModelCount"},"AdminModelItem":{"properties":{"id":{"type":"string","title":"Id"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["id","capabilities","enabled"],"title":"AdminModelItem","description":"Доступная модель для дропдауна выбора model_ref."},"AdminModelListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminModelItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AdminModelListResponse"},"AdminPaymentRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"kind":{"type":"string","title":"Kind"},"amount_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Rub"},"tokens":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tokens"},"status":{"type":"string","title":"Status"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"attempt":{"type":"integer","title":"Attempt"}},"type":"object","required":["id","created_at","kind","amount_rub","status","attempt"],"title":"AdminPaymentRow","description":"Строка журнала карт-платежей (таблица «Платежи»)."},"AdminPaymentsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminPaymentRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"AdminPaymentsResponse"},"AdminPaymentsStats":{"properties":{"revenue":{"$ref":"#/components/schemas/RevenueWindow"},"succeeded_count":{"type":"integer","title":"Succeeded Count"},"avg_check":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Avg Check"},"series":{"items":{"$ref":"#/components/schemas/RevenueSeries"},"type":"array","title":"Series"},"subscriptions":{"$ref":"#/components/schemas/SubscriptionsStats"},"problems":{"$ref":"#/components/schemas/PaymentsProblems"}},"type":"object","required":["revenue","succeeded_count","avg_check","series","subscriptions","problems"],"title":"AdminPaymentsStats"},"AdminRecentConversation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"catalog_slug":{"type":"string","title":"Catalog Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"}},"type":"object","required":["id","catalog_slug","created_at","last_activity_at"],"title":"AdminRecentConversation"},"AdminReferrerInfo":{"properties":{"invited_count":{"type":"integer","title":"Invited Count"},"qualified_count":{"type":"integer","title":"Qualified Count"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["invited_count","qualified_count"],"title":"AdminReferrerInfo"},"AdminSubscriptionItem":{"properties":{"plan_key":{"type":"string","title":"Plan Key"},"status":{"type":"string","title":"Status"},"price_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price Rub"},"tokens_per_period":{"type":"integer","title":"Tokens Per Period"},"period":{"type":"string","title":"Period"},"current_period_end":{"type":"string","format":"date-time","title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"failed_charges":{"type":"integer","title":"Failed Charges"},"next_retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Retry At"}},"type":"object","required":["plan_key","status","price_rub","tokens_per_period","period","current_period_end","cancel_at_period_end","failed_charges"],"title":"AdminSubscriptionItem"},"AdminTenantItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},"type":"object","required":["id","name"],"title":"AdminTenantItem"},"AdminTenantsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTenantItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AdminTenantsResponse"},"AdminTokenLot":{"properties":{"amount_granted":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Granted"},"amount_remaining":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Remaining"},"source":{"type":"string","title":"Source"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["amount_granted","amount_remaining","source","created_at"],"title":"AdminTokenLot"},"AdminUserAttribution":{"properties":{"signup_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Ip"},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country"},"geo_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Region"},"geo_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo City"},"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"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"referred_by_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred By Code"}},"type":"object","title":"AdminUserAttribution"},"AdminUserBalances":{"properties":{"token_balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Token Balance"},"token_held":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Token Held"},"rub_balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rub Balance"},"rub_held":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rub Held"},"token_lots":{"items":{"$ref":"#/components/schemas/AdminTokenLot"},"type":"array","title":"Token Lots","default":[]},"tokens_outstanding":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tokens Outstanding"}},"type":"object","required":["token_balance","token_held","rub_balance","rub_held","tokens_outstanding"],"title":"AdminUserBalances"},"AdminUserBenefit":{"properties":{"benefit_type":{"type":"string","title":"Benefit Type"},"scope":{"type":"string","title":"Scope"},"percent":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percent"},"fixed_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fixed Rub"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"status":{"type":"string","title":"Status"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"}},"type":"object","required":["benefit_type","scope","status"],"title":"AdminUserBenefit"},"AdminUserDetail":{"properties":{"profile":{"$ref":"#/components/schemas/AdminUserProfile"},"attribution":{"$ref":"#/components/schemas/AdminUserAttribution"},"balances":{"$ref":"#/components/schemas/AdminUserBalances"},"subscription":{"$ref":"#/components/schemas/AdminUserSubscription"},"payments":{"$ref":"#/components/schemas/AdminUserPayments"},"usage":{"$ref":"#/components/schemas/AdminUserUsage"},"ledger":{"items":{"$ref":"#/components/schemas/AdminLedgerEntry"},"type":"array","title":"Ledger","default":[]},"benefits":{"items":{"$ref":"#/components/schemas/AdminUserBenefit"},"type":"array","title":"Benefits","default":[]},"referrals":{"$ref":"#/components/schemas/AdminUserReferrals"},"api_keys":{"items":{"$ref":"#/components/schemas/AdminApiKeyItem"},"type":"array","title":"Api Keys","default":[]}},"type":"object","required":["profile","attribution","balances","subscription","payments","usage","referrals"],"title":"AdminUserDetail"},"AdminUserPaymentItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"amount_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Rub"},"tokens":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tokens"},"status":{"type":"string","title":"Status"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"tochka_operation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tochka Operation Id"}},"type":"object","required":["id","kind","amount_rub","status","created_at"],"title":"AdminUserPaymentItem"},"AdminUserPayments":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminUserPaymentItem"},"type":"array","title":"Items","default":[]},"paid_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Paid Total"},"paid_count":{"type":"integer","title":"Paid Count"}},"type":"object","required":["paid_total","paid_count"],"title":"AdminUserPayments"},"AdminUserProfile":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"email_verified":{"type":"boolean","title":"Email Verified"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"has_password":{"type":"boolean","title":"Has Password"},"oauth_providers":{"items":{"type":"string"},"type":"array","title":"Oauth Providers","default":[]},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["id","email","role","is_active","email_verified","created_at","updated_at","has_password"],"title":"AdminUserProfile"},"AdminUserReferrals":{"properties":{"as_referrer":{"$ref":"#/components/schemas/AdminReferrerInfo"},"referred_by_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred By Code"}},"type":"object","required":["as_referrer"],"title":"AdminUserReferrals"},"AdminUserRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"role":{"type":"string","title":"Role"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"signup_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Ip"},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country"},"geo_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Region"},"geo_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo City"},"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"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"referred_by_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred By Code"},"token_balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Token Balance"},"rub_balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rub Balance"},"has_subscription":{"type":"boolean","title":"Has Subscription"},"last_active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active At"}},"type":"object","required":["id","email","created_at","is_active","role","token_balance","rub_balance","has_subscription"],"title":"AdminUserRow","description":"Строка таблицы пользователей в админке."},"AdminUserSubscription":{"properties":{"current":{"anyOf":[{"$ref":"#/components/schemas/AdminSubscriptionItem"},{"type":"null"}]},"history":{"items":{"$ref":"#/components/schemas/AdminSubscriptionItem"},"type":"array","title":"History","default":[]}},"type":"object","title":"AdminUserSubscription"},"AdminUserUsage":{"properties":{"conversations_count":{"type":"integer","title":"Conversations Count"},"messages_count":{"type":"integer","title":"Messages Count"},"tokens_spent":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tokens Spent"},"last_active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active At"},"top_models":{"items":{"$ref":"#/components/schemas/AdminModelCount"},"type":"array","title":"Top Models","default":[]},"recent_conversations":{"items":{"$ref":"#/components/schemas/AdminRecentConversation"},"type":"array","title":"Recent Conversations","default":[]}},"type":"object","required":["conversations_count","messages_count","tokens_spent"],"title":"AdminUserUsage"},"AdminUsersResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminUserRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"AdminUsersResponse"},"AgentSkillOut":{"properties":{"id":{"type":"string","title":"Id"},"version":{"type":"integer","title":"Version"},"title":{"type":"string","title":"Title"},"system_prompt":{"type":"string","title":"System Prompt"},"model_ref":{"type":"string","title":"Model Ref"},"tools":{"items":{"type":"string"},"type":"array","title":"Tools"},"limits":{"additionalProperties":{"type":"integer"},"type":"object","title":"Limits"},"is_active":{"type":"boolean","title":"Is Active"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","version","title","system_prompt","model_ref","tools","limits","is_active","updated_at"],"title":"AgentSkillOut"},"AgentSkillPatch":{"properties":{"system_prompt":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"System Prompt"},"model_ref":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Model Ref"},"limits":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Limits"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AgentSkillPatch"},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"total_spent_rub":{"type":"string","title":"Total Spent Rub","default":"0.00000000"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","key_prefix","last_used_at","created_at","is_active","key"],"title":"ApiKeyCreatedResponse","description":"Создан ключ — plaintext показывается один раз."},"ApiKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"total_spent_rub":{"type":"string","title":"Total Spent Rub","default":"0.00000000"}},"type":"object","required":["id","name","key_prefix","last_used_at","created_at","is_active"],"title":"ApiKeyResponse","description":"Без plaintext — для list/get/patch."},"ApiKeyUpdateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyUpdateRequest"},"ApiModelPricingRow":{"properties":{"model_id":{"type":"string","title":"Model Id"},"provider":{"type":"string","title":"Provider"},"api_visible":{"type":"boolean","title":"Api Visible"},"enabled":{"type":"boolean","title":"Enabled"},"unit":{"type":"string","title":"Unit"},"sell_input_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sell Input Rub"},"sell_output_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sell Output Rub"},"cost_input_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Input Rub"},"cost_output_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Output Rub"},"sell_per_image_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sell Per Image Rub"},"cost_per_image_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Per Image Rub"},"sell_per_second_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sell Per Second Rub"},"cost_per_second_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Per Second Rub"},"margin_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Margin Pct"},"fact_avg_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fact Avg Rub"}},"type":"object","required":["model_id","provider","api_visible","enabled","unit"],"title":"ApiModelPricingRow"},"ApiModelsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiModelPricingRow"},"type":"array","title":"Items"},"exchange_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Exchange Rate"}},"type":"object","required":["items","exchange_rate"],"title":"ApiModelsResponse"},"ApiTopupRequest":{"properties":{"amount_rub":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount Rub","description":"Сумма пополнения API-баланса в рублях"}},"type":"object","required":["amount_rub"],"title":"ApiTopupRequest"},"AuditResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"AuditResponse"},"AuditRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"admin_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Email"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"entity_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Title"},"field":{"type":"string","title":"Field"},"old_value":{"title":"Old Value"},"new_value":{"title":"New Value"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","entity_type","entity_id","field","created_at"],"title":"AuditRow"},"BenefitOut":{"properties":{"type":{"type":"string","title":"Type"},"scope":{"type":"string","title":"Scope"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent"},"fixed_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fixed Rub"},"duration_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Periods"},"valid_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Until"}},"type":"object","required":["type","scope"],"title":"BenefitOut"},"BenefitsResponse":{"properties":{"active":{"items":{"$ref":"#/components/schemas/BenefitOut"},"type":"array","title":"Active"}},"type":"object","required":["active"],"title":"BenefitsResponse"},"BlogAdminListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"category":{"type":"string","title":"Category"},"status":{"type":"string","title":"Status"},"date_modified":{"type":"string","format":"date","title":"Date Modified"}},"type":"object","required":["id","slug","title","category","status","date_modified"],"title":"BlogAdminListItem","description":"Лёгкая строка списка админки — без тяжёлого body/tldr/faq/cta/cover.\nПолную статью редактор грузит по id (GET /admin/blog/{id}, #5)."},"BlogAdminListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BlogAdminListItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"BlogAdminListResponse"},"BlogArticleAdmin":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"date_published":{"type":"string","format":"date","title":"Date Published"},"date_modified":{"type":"string","format":"date","title":"Date Modified"},"tldr":{"type":"string","title":"Tldr"},"body":{"type":"string","title":"Body"},"cover":{"anyOf":[{"$ref":"#/components/schemas/Cover"},{"type":"null"}]},"cta":{"anyOf":[{"$ref":"#/components/schemas/Cta"},{"type":"null"}]},"faq":{"items":{"$ref":"#/components/schemas/FaqItem"},"type":"array","title":"Faq"},"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["slug","title","description","category","date_published","date_modified","tldr","body","id","status"],"title":"BlogArticleAdmin"},"BlogArticlePublic":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"date_published":{"type":"string","format":"date","title":"Date Published"},"date_modified":{"type":"string","format":"date","title":"Date Modified"},"tldr":{"type":"string","title":"Tldr"},"body":{"type":"string","title":"Body"},"cover":{"anyOf":[{"$ref":"#/components/schemas/Cover"},{"type":"null"}]},"cta":{"anyOf":[{"$ref":"#/components/schemas/Cta"},{"type":"null"}]},"faq":{"items":{"$ref":"#/components/schemas/FaqItem"},"type":"array","title":"Faq"}},"type":"object","required":["slug","title","description","category","date_published","date_modified","tldr","body"],"title":"BlogArticlePublic"},"BlogArticleWrite":{"properties":{"slug":{"type":"string","maxLength":200,"minLength":1,"title":"Slug"},"title":{"type":"string","maxLength":300,"minLength":1,"title":"Title"},"description":{"type":"string","maxLength":400,"minLength":1,"title":"Description"},"category":{"type":"string","pattern":"^(access|compare|guide|models)$","title":"Category"},"date_published":{"type":"string","format":"date","title":"Date Published"},"date_modified":{"type":"string","format":"date","title":"Date Modified"},"tldr":{"type":"string","minLength":1,"title":"Tldr"},"body":{"type":"string","minLength":1,"title":"Body"},"cover":{"anyOf":[{"$ref":"#/components/schemas/Cover"},{"type":"null"}]},"cta":{"anyOf":[{"$ref":"#/components/schemas/Cta"},{"type":"null"}]},"faq":{"items":{"$ref":"#/components/schemas/FaqItem"},"type":"array","title":"Faq"},"status":{"type":"string","pattern":"^(draft|published)$","title":"Status","default":"published"}},"type":"object","required":["slug","title","description","category","date_published","date_modified","tldr","body"],"title":"BlogArticleWrite","description":"Создание/правка статьи (админ)."},"BlogListItem":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"date_published":{"type":"string","format":"date","title":"Date Published"},"date_modified":{"type":"string","format":"date","title":"Date Modified"},"cover":{"anyOf":[{"$ref":"#/components/schemas/Cover"},{"type":"null"}]}},"type":"object","required":["slug","title","description","category","date_published","date_modified"],"title":"BlogListItem","description":"Карточка для индекса /blog и sitemap (без тяжёлого body)."},"BlogListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BlogListItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"BlogListResponse"},"Body_admin_upload_blog_image_v1_admin_blog_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_blog_image_v1_admin_blog_upload_post"},"BotCount":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","kind","count"],"title":"BotCount"},"BotRow":{"properties":{"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"kind":{"type":"string","title":"Kind"},"hits":{"type":"integer","title":"Hits"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"},"last_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Ip"},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country"}},"type":"object","required":["bot_name","kind","hits","last_seen"],"title":"BotRow"},"BotsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BotRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"BotsResponse"},"CatalogDetailResponse":{"properties":{"kind":{"type":"string","title":"Kind"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"price_mul":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price Mul"},"capability":{"type":"string","title":"Capability"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"requires_image":{"type":"boolean","title":"Requires Image","default":false},"interactive":{"type":"boolean","title":"Interactive","default":false},"agent":{"type":"boolean","title":"Agent","default":false},"agent_connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Connector"},"input_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Hint"},"model_ref":{"type":"string","title":"Model Ref"},"base_model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Model Ref"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls","default":[]},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"samples":{"items":{"$ref":"#/components/schemas/TemplateSamplePublic"},"type":"array","title":"Samples","default":[]},"h1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H1"},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article"},"faq":{"items":{"$ref":"#/components/schemas/CatalogFaqItem"},"type":"array","title":"Faq","default":[]},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"form":{"anyOf":[{"$ref":"#/components/schemas/FormPublic"},{"type":"null"}]}},"type":"object","required":["kind","slug","title","description","token_cost","capability","model_ref","updated_at"],"title":"CatalogDetailResponse","description":"Деталь записи для страницы /chat/{slug} (пустое состояние) и SEO.\nСэмплы наследуются от CatalogEntryPublic."},"CatalogEntryPublic":{"properties":{"kind":{"type":"string","title":"Kind"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"price_mul":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price Mul"},"capability":{"type":"string","title":"Capability"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"requires_image":{"type":"boolean","title":"Requires Image","default":false},"interactive":{"type":"boolean","title":"Interactive","default":false},"agent":{"type":"boolean","title":"Agent","default":false},"agent_connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Connector"},"input_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Hint"},"model_ref":{"type":"string","title":"Model Ref"},"base_model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Model Ref"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls","default":[]},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"samples":{"items":{"$ref":"#/components/schemas/TemplateSamplePublic"},"type":"array","title":"Samples","default":[]}},"type":"object","required":["kind","slug","title","description","token_cost","capability","model_ref"],"title":"CatalogEntryPublic","description":"Запись каталога (kind=model|template) — публичный вид для витрины/пикера."},"CatalogFaqItem":{"properties":{"q":{"type":"string","title":"Q"},"a":{"type":"string","title":"A"}},"type":"object","required":["q","a"],"title":"CatalogFaqItem","description":"Вопрос-ответ FAQ страницы модели/шаблона (A1)."},"CatalogListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"entries":{"items":{"$ref":"#/components/schemas/CatalogEntryPublic"},"type":"array","title":"Entries"}},"type":"object","required":["entries"],"title":"CatalogListResponse"},"CategoryListResponse":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/CategoryPublic"},"type":"array","title":"Categories"}},"type":"object","required":["categories"],"title":"CategoryListResponse"},"CategoryPublic":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"blurb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blurb"},"icon":{"type":"string","title":"Icon"},"color":{"type":"string","title":"Color"}},"type":"object","required":["slug","title","icon","color"],"title":"CategoryPublic","description":"Категория каталога. `icon` — имя из белого списка на фронте, не код."},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","maxLength":256,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":256,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChatCompletionRequest":{"properties":{"model":{"type":"string","title":"Model"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"},"max_completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Completion Tokens"},"top_p":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top P"},"stream":{"type":"boolean","title":"Stream","default":false},"stream_options":{"anyOf":[{"$ref":"#/components/schemas/StreamOptions"},{"type":"null"}]},"stop":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stop"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"},"tools":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tools"},"tool_choice":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Choice"},"response_format":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Response Format"},"n":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"logprobs":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Logprobs"},"frequency_penalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frequency Penalty"},"presence_penalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Presence Penalty"}},"additionalProperties":true,"type":"object","required":["model","messages"],"title":"ChatCompletionRequest","description":"Запрос от юзера к POST /v1/chat/completions.\n\nМинимум обязательных полей — model и messages. Остальное опционально и\nпрокидывается в upstream через `extra=\"allow\"`.","examples":[{"max_completion_tokens":512,"messages":[{"content":"Объясни, что такое эмбеддинги, в двух абзацах","role":"user"}],"model":"openai/gpt-5-mini","temperature":0.7}]},"ChatCompletionResponse":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"chat.completion","title":"Object","default":"chat.completion"},"created":{"type":"integer","title":"Created"},"model":{"type":"string","title":"Model"},"choices":{"items":{"$ref":"#/components/schemas/Choice"},"type":"array","title":"Choices"},"usage":{"$ref":"#/components/schemas/Usage"}},"additionalProperties":true,"type":"object","required":["id","created","model","choices","usage"],"title":"ChatCompletionResponse","description":"Ответ от провайдера в non-streaming режиме."},"ChatMessage":{"properties":{"role":{"type":"string","enum":["system","user","assistant","tool","developer"],"title":"Role"},"content":{"anyOf":[{"type":"string"},{"items":{"$ref":"#/components/schemas/ContentPart"},"type":"array"},{"type":"null"}],"title":"Content"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"additionalProperties":true,"type":"object","required":["role"],"title":"ChatMessage"},"ChatTurnMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":8000,"minLength":1,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatTurnMessage"},"ChatTurnRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatTurnMessage"},"type":"array","maxItems":40,"minItems":1,"title":"Messages"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"image":{"anyOf":[{"type":"string","maxLength":15000000},{"type":"null"}],"title":"Image"}},"type":"object","required":["messages"],"title":"ChatTurnRequest"},"ChatTurnResponse":{"properties":{"reply":{"type":"string","title":"Reply"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"}},"type":"object","required":["reply","charged_tokens","balance_after"],"title":"ChatTurnResponse"},"Choice":{"properties":{"index":{"type":"integer","title":"Index"},"message":{"anyOf":[{"$ref":"#/components/schemas/ChatMessage"},{"type":"null"}]},"finish_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finish Reason"}},"additionalProperties":true,"type":"object","required":["index"],"title":"Choice"},"ConnectorConnectRequest":{"properties":{"type":{"type":"string","maxLength":32,"minLength":1,"title":"Type"},"fields":{"additionalProperties":{"type":"string"},"type":"object","title":"Fields"}},"type":"object","required":["type","fields"],"title":"ConnectorConnectRequest"},"ConnectorFieldOut":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"secret":{"type":"boolean","title":"Secret"}},"type":"object","required":["name","label","secret"],"title":"ConnectorFieldOut"},"ConnectorOut":{"properties":{"type":{"type":"string","title":"Type"},"auth_kind":{"type":"string","title":"Auth Kind"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"fields":{"items":{"$ref":"#/components/schemas/ConnectorFieldOut"},"type":"array","title":"Fields"},"connected":{"type":"boolean","title":"Connected"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mask"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"}},"type":"object","required":["type","auth_kind","title","description","fields","connected"],"title":"ConnectorOut"},"ContentPart":{"properties":{"type":{"type":"string","title":"Type"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"image_url":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Image Url"}},"additionalProperties":true,"type":"object","required":["type"],"title":"ContentPart","description":"Часть multimodal-сообщения — текст, картинка, аудио и т.д."},"ConversationCreateRequest":{"properties":{"catalog_slug":{"type":"string","maxLength":80,"minLength":1,"title":"Catalog Slug"}},"type":"object","required":["catalog_slug"],"title":"ConversationCreateRequest"},"ConversationListResponse":{"properties":{"conversations":{"items":{"$ref":"#/components/schemas/ConversationResponse"},"type":"array","title":"Conversations"}},"type":"object","required":["conversations"],"title":"ConversationListResponse"},"ConversationRenameRequest":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"}},"type":"object","required":["title"],"title":"ConversationRenameRequest"},"ConversationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"catalog_slug":{"type":"string","title":"Catalog Slug"},"model_ref":{"type":"string","title":"Model Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"archived":{"type":"boolean","title":"Archived","default":false},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","catalog_slug","model_ref","last_activity_at","created_at"],"title":"ConversationResponse"},"ConversationSendRequest":{"properties":{"text":{"type":"string","maxLength":8000,"title":"Text","default":""},"image":{"anyOf":[{"type":"string","maxLength":16000000},{"type":"null"}],"title":"Image"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","title":"ConversationSendRequest"},"ConversationTurnResponse":{"properties":{"user_message":{"$ref":"#/components/schemas/MessageResponse"},"assistant_message":{"$ref":"#/components/schemas/MessageResponse"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"}},"type":"object","required":["user_message","assistant_message","charged_tokens","balance_after"],"title":"ConversationTurnResponse","description":"Результат текстового хода: сохранённые сообщения юзера и ассистента + биллинг."},"Cover":{"properties":{"src":{"type":"string","title":"Src"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt"}},"type":"object","required":["src"],"title":"Cover"},"Cta":{"properties":{"text":{"type":"string","title":"Text"},"href":{"type":"string","title":"Href"}},"type":"object","required":["text","href"],"title":"Cta"},"EmailTestRequest":{"properties":{"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},"type":"object","title":"EmailTestRequest"},"EmailTestResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"backend":{"type":"string","title":"Backend"},"to":{"type":"string","title":"To"},"detail":{"type":"string","title":"Detail"},"provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Id"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"}},"type":"object","required":["ok","backend","to","detail"],"title":"EmailTestResponse"},"FaqItem":{"properties":{"q":{"type":"string","title":"Q"},"a":{"type":"string","title":"A"}},"type":"object","required":["q","a"],"title":"FaqItem"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"FormPublic":{"properties":{"step_id":{"type":"string","title":"Step Id"},"page_size":{"type":"integer","title":"Page Size","default":0},"gate":{"$ref":"#/components/schemas/GatePublic"},"questions":{"items":{"$ref":"#/components/schemas/QuestionPublic"},"type":"array","title":"Questions"}},"type":"object","required":["step_id","gate","questions"],"title":"FormPublic","description":"Анкета шага form.collect для SSR страницы теста. Весов и промптов нет."},"GalleryItem":{"properties":{"message_id":{"type":"string","format":"uuid","title":"Message Id"},"idx":{"type":"integer","title":"Idx"},"kind":{"type":"string","title":"Kind"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"catalog_slug":{"type":"string","title":"Catalog Slug"},"conversation_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Title"},"model_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url"},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime"},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Job Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["message_id","idx","kind","created_at","conversation_id","catalog_slug"],"title":"GalleryItem","description":"Один элемент галереи — картинка или готовое/идущее видео из ассистентского\nсообщения. `message_id`+`idx` — координата части в сообщении (как в подписи\nмедиа). Контекст диалога — чтобы открыть исходный тред."},"GalleryPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GalleryItem"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["items"],"title":"GalleryPage","description":"Keyset-страница галереи + курсор на более старые элементы."},"GatePublic":{"properties":{"free":{"type":"string","title":"Free","default":"none"},"title":{"type":"string","title":"Title","default":""},"text":{"type":"string","title":"Text","default":""},"cta":{"type":"string","title":"Cta","default":""}},"type":"object","title":"GatePublic","description":"Что гость видит бесплатно (задаёт шаблон, не код)."},"GenerateRequest":{"properties":{"task":{"type":"string","title":"Task","description":"ключ задачи из каталога ui_tasks (chat/image/...)"},"prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Prompt"},"image":{"anyOf":[{"type":"string","maxLength":15000000},{"type":"null"}],"title":"Image"}},"type":"object","required":["task"],"title":"GenerateRequest"},"GenerateResponse":{"properties":{"task":{"type":"string","title":"Task"},"title":{"type":"string","title":"Title"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"},"status":{"type":"string","title":"Status"},"result":{"$ref":"#/components/schemas/GenerationResult"}},"type":"object","required":["task","title","charged_tokens","balance_after","status","result"],"title":"GenerateResponse"},"GenerationResult":{"properties":{"kind":{"type":"string","title":"Kind"},"note":{"type":"string","title":"Note"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images"},"sample_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Url"},"audio_b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio B64"},"audio_mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Mime"}},"type":"object","required":["kind","note"],"title":"GenerationResult","description":"Результат генерации. text/images — реальный вывод модели (Р.5b);\nsample_url — заглушка для ещё не подключённого видео."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageData":{"properties":{"b64_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"B64 Json"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"revised_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revised Prompt"}},"additionalProperties":true,"type":"object","title":"ImageData","description":"Одна сгенерированная картинка."},"ImageGenerationRequest":{"properties":{"model":{"type":"string","title":"Model"},"prompt":{"type":"string","title":"Prompt"},"n":{"type":"integer","title":"N","default":1},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"},"response_format":{"type":"string","enum":["b64_json","url"],"title":"Response Format","default":"b64_json"},"image":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Image"},"mask":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Reference Images"}},"additionalProperties":true,"type":"object","required":["model","prompt"],"title":"ImageGenerationRequest","description":"Запрос на генерацию картинки в OpenAI-формате.\n\n`image` непустой → image-edit режим (instruct-edit без маски).\nАдаптер сам решает в какой URL и как сериализовать (для Gemini —\ninline_data в :generateContent). Capability `image_input` обязательна\nдля моделей которые принимают image.","examples":[{"model":"google/gemini-2.5-flash-image","n":1,"prompt":"Уютное кафе на морском берегу на закате, акварель","size":"1024x1024"}]},"ImageGenerationResponse":{"properties":{"created":{"type":"integer","title":"Created"},"data":{"items":{"$ref":"#/components/schemas/ImageData"},"type":"array","title":"Data"},"usage":{"anyOf":[{"$ref":"#/components/schemas/ImageUsage"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["data"],"title":"ImageGenerationResponse"},"ImageInput":{"properties":{"type":{"type":"string","enum":["url","base64"],"title":"Type"},"data":{"type":"string","minLength":1,"title":"Data"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type","description":"image/png, image/jpeg, image/webp"}},"additionalProperties":false,"type":"object","required":["type","data"],"title":"ImageInput","description":"Картинка, которую юзер передал во входе запроса.\n\nДва варианта `type`:\n  - `url`     — внешний URL, провайдер (или мы) скачаем по запросу.\n  - `base64`  — уже сырые байты в base64 (без data:image/...; префикса).\n\n`mime_type` обязателен для base64 (нужен Gemini для inline_data),\nдля url — опционально (можно определить из ответа)."},"ImageUsage":{"properties":{"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"input_tokens":{"type":"integer","title":"Input Tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","default":0}},"additionalProperties":true,"type":"object","title":"ImageUsage","description":"Usage для image-моделей. gpt-image даёт полный breakdown,\ngemini — только total_tokens, imagen — все нули."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MarginOut":{"properties":{"scenario":{"type":"string","title":"Scenario"},"rub_per_token":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rub Per Token"},"revenue_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Revenue Rub"},"margin_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Margin Pct"}},"type":"object","required":["scenario","rub_per_token","revenue_rub"],"title":"MarginOut"},"MaxMiniAppAuthResponse":{"properties":{"status":{"type":"string","enum":["linked","unlinked"],"title":"Status"},"user":{"$ref":"#/components/schemas/MiniAppTelegramUser"},"session":{"anyOf":[{"$ref":"#/components/schemas/TokenPair"},{"type":"null"}]}},"type":"object","required":["status","user"],"title":"MaxMiniAppAuthResponse","description":"Ответ на вход из Mini App MAX (тот же смысл, что у Telegram-варианта)."},"MaxMiniAppLinkResponse":{"properties":{"status":{"type":"string","const":"linked","title":"Status","default":"linked"},"user":{"$ref":"#/components/schemas/MiniAppTelegramUser"}},"type":"object","required":["user"],"title":"MaxMiniAppLinkResponse"},"MessagePageResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array","title":"Messages"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["messages"],"title":"MessagePageResponse","description":"Keyset-страница ленты: сообщения в хронологии + курсор на более старые."},"MessageResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"parts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Parts"},"token_cost":{"type":"integer","title":"Token Cost"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","role","parts","token_cost","created_at"],"title":"MessageResponse"},"MessengerLinkStatus":{"properties":{"platform":{"type":"string","title":"Platform"},"linked":{"type":"boolean","title":"Linked"},"platform_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","required":["platform","linked"],"title":"MessengerLinkStatus","description":"Статус привязки мессенджера у сайт-аккаунта — общий вид для /me/messengers."},"MessengerLinkTokenResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"deep_link":{"type":"string","title":"Deep Link"},"bot_username":{"type":"string","title":"Bot Username"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["platform","deep_link","bot_username","expires_in"],"title":"MessengerLinkTokenResponse","description":"Deep-link привязки: открывает бота платформы с одноразовым токеном."},"MetricBlock":{"properties":{"total":{"type":"integer","title":"Total"},"new_today":{"type":"integer","title":"New Today"},"new_week":{"type":"integer","title":"New Week"},"new_month":{"type":"integer","title":"New Month"},"series":{"items":{"$ref":"#/components/schemas/StatsPoint"},"type":"array","title":"Series"}},"type":"object","required":["total","new_today","new_week","new_month","series"],"title":"MetricBlock","description":"Сводка по одной метрике: тотал + приросты + дневной ряд."},"MiniAppAuthRequest":{"properties":{"init_data":{"type":"string","maxLength":8192,"minLength":1,"title":"Init Data"}},"type":"object","required":["init_data"],"title":"MiniAppAuthRequest"},"MiniAppAuthResponse":{"properties":{"status":{"type":"string","enum":["linked","unlinked"],"title":"Status"},"telegram":{"$ref":"#/components/schemas/MiniAppTelegramUser"},"session":{"anyOf":[{"$ref":"#/components/schemas/TokenPair"},{"type":"null"}]}},"type":"object","required":["status","telegram"],"title":"MiniAppAuthResponse","description":"Ответ на попытку входа из Mini App.\n\n``linked`` — TG-личность связана с сайт-аккаунтом в этом тенанте, выдаём сессию.\n``unlinked`` — связки нет: фронт показывает вход/регистрацию, затем /link."},"MiniAppLinkRequest":{"properties":{"init_data":{"type":"string","maxLength":8192,"minLength":1,"title":"Init Data"}},"type":"object","required":["init_data"],"title":"MiniAppLinkRequest"},"MiniAppLinkResponse":{"properties":{"status":{"type":"string","const":"linked","title":"Status","default":"linked"},"telegram":{"$ref":"#/components/schemas/MiniAppTelegramUser"}},"type":"object","required":["telegram"],"title":"MiniAppLinkResponse"},"MiniAppTelegramUser":{"properties":{"id":{"type":"string","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"}},"type":"object","required":["id"],"title":"MiniAppTelegramUser","description":"Пользователь Telegram из провалидированного initData."},"ModelInfo":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"model","title":"Object","default":"model"},"created":{"type":"integer","title":"Created","default":0},"owned_by":{"type":"string","title":"Owned By"}},"additionalProperties":true,"type":"object","required":["id","owned_by"],"title":"ModelInfo","description":"Запись в `data: [...]` ответа GET /v1/models."},"ModelListResponse":{"properties":{"object":{"type":"string","const":"list","title":"Object","default":"list"},"data":{"items":{"$ref":"#/components/schemas/ModelInfo"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"ModelListResponse"},"ModelPageOut":{"properties":{"model_id":{"type":"string","title":"Model Id"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"h1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H1"},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article"},"faq":{"items":{"$ref":"#/components/schemas/CatalogFaqItem"},"type":"array","title":"Faq","default":[]},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["model_id","updated_at"],"title":"ModelPageOut"},"ModelPricing":{"properties":{"id":{"type":"string","title":"Id"},"input_per_million_rub":{"type":"string","title":"Input Per Million Rub"},"output_per_million_rub":{"type":"string","title":"Output Per Million Rub"},"per_image_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Per Image Rub"},"per_second_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Per Second Rub"},"tokens_per_image":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens Per Image"},"avg_cost_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avg Cost Rub"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"}},"type":"object","required":["id","input_per_million_rub","output_per_million_rub","capabilities"],"title":"ModelPricing","description":"Цены одной модели в RUB (уже пересчитано из USD по нашему курсу).\n\nДля текстовых моделей релевантны input/output_per_million_rub.\nДля image-моделей с flat-fee — per_image_rub. Для image-моделей с\nvirtual usage (gemini-image) — tokens_per_image × output_per_million_rub.\nДля видео — per_second_rub."},"NameCount":{"properties":{"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","count"],"title":"NameCount"},"NotificationAdminItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","body","level","created_at"],"title":"NotificationAdminItem","description":"Уведомление в админ-листинге (без is_read — у админа нет личного контекста)."},"NotificationCreateRequest":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level","default":"info"},"link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Link"}},"type":"object","required":["title","body"],"title":"NotificationCreateRequest","description":"Создание уведомления админом."},"NotificationListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Data"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["data","unread_count"],"title":"NotificationListResponse"},"NotificationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_read":{"type":"boolean","title":"Is Read"}},"type":"object","required":["id","title","body","level","created_at","is_read"],"title":"NotificationResponse","description":"Уведомление как видит юзер — с флагом is_read для него."},"OAuthAccessTokenRequest":{"properties":{"access_token":{"type":"string","minLength":10,"title":"Access Token"}},"type":"object","required":["access_token"],"title":"OAuthAccessTokenRequest","description":"access_token для провайдеров без OIDC (Яндекс, GitHub, VK)."},"OAuthLoginRequest":{"properties":{"id_token":{"type":"string","minLength":10,"title":"Id Token"}},"type":"object","required":["id_token"],"title":"OAuthLoginRequest","description":"id_token, полученный фронтом от OAuth-провайдера (Google и т.п.)."},"PageActiveWrite":{"properties":{"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["is_active"],"title":"PageActiveWrite"},"PageAdmin":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"capability":{"type":"string","title":"Capability"},"kind":{"type":"string","title":"Kind"},"model_ref":{"type":"string","title":"Model Ref"},"base_model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Model Ref"},"preset_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Prompt"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls"},"pipeline":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pipeline"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"input_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Hint"},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article"},"faq":{"items":{"$ref":"#/components/schemas/CatalogFaqItem"},"type":"array","title":"Faq"},"accepts_image":{"type":"boolean","title":"Accepts Image"},"requires_image":{"type":"boolean","title":"Requires Image"},"is_active":{"type":"boolean","title":"Is Active"},"bots_enabled":{"type":"boolean","title":"Bots Enabled"},"sort_order":{"type":"integer","title":"Sort Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","key","slug","title","description","token_cost","capability","kind","model_ref","base_model_ref","preset_prompt","params","controls","pipeline","seo_title","seo_description","og_image","input_hint","article","faq","accepts_image","requires_image","is_active","bots_enabled","sort_order","created_at","updated_at"],"title":"PageAdmin","description":"Полная запись ui_tasks для редактора (включая controls/pipeline на чтение)."},"PageBehaviorWrite":{"properties":{"preset_prompt":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Preset Prompt"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls"},"pipeline":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pipeline"}},"type":"object","title":"PageBehaviorWrite","description":"Редактирование вшитого промпта / контролов / pipeline (Промпт 2).\n\nОтдельно от PageWrite (мета/SEO), чтобы сохранение «Основное» не затирало\npipeline и наоборот. Фронт грузит текущее поведение из PageAdmin, правит и\nшлёт ВСЕ 4 поля целиком."},"PageBotsEnabledWrite":{"properties":{"bots_enabled":{"type":"boolean","title":"Bots Enabled"}},"type":"object","required":["bots_enabled"],"title":"PageBotsEnabledWrite","description":"Тумблер «доступно из ботов TG/MAX» (ui_tasks.bots_enabled)."},"PageListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind"},"capability":{"type":"string","title":"Capability"},"model_ref":{"type":"string","title":"Model Ref"},"is_active":{"type":"boolean","title":"Is Active"},"bots_enabled":{"type":"boolean","title":"Bots Enabled"},"sort_order":{"type":"integer","title":"Sort Order"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","key","slug","title","kind","capability","model_ref","is_active","bots_enabled","sort_order","updated_at"],"title":"PageListItem","description":"Строка таблицы /admin/pages."},"PageListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PageListItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PageListResponse"},"PagePreviewRequest":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params"},"pipeline":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pipeline"},"preset_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Prompt"}},"type":"object","title":"PagePreviewRequest","description":"Предпросмотр без генерации. Можно передать кандидат pipeline/preset_prompt\n(несохранённые правки) — иначе берётся сохранённое состояние страницы."},"PagePreviewResponse":{"properties":{"kind":{"type":"string","title":"Kind"},"estimated_tokens":{"type":"integer","title":"Estimated Tokens"},"steps":{"items":{"$ref":"#/components/schemas/PreviewStep"},"type":"array","title":"Steps"},"preset_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Prompt"}},"type":"object","required":["kind","estimated_tokens"],"title":"PagePreviewResponse"},"PageWrite":{"properties":{"slug":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","title":"Slug"},"key":{"anyOf":[{"type":"string","maxLength":50,"pattern":"^[a-z0-9][a-z0-9_-]*$"},{"type":"null"}],"title":"Key"},"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"type":"string","maxLength":4000,"title":"Description","default":""},"capability":{"type":"string","pattern":"^(text|image_output|video_output|audio_output)$","title":"Capability"},"model_ref":{"type":"string","maxLength":255,"minLength":1,"title":"Model Ref"},"token_cost":{"type":"integer","minimum":0.0,"title":"Token Cost"},"kind":{"type":"string","pattern":"^(model|template)$","title":"Kind","default":"template"},"seo_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Og Image"},"input_hint":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Input Hint"},"article":{"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}],"title":"Article"},"faq":{"items":{"$ref":"#/components/schemas/CatalogFaqItem"},"type":"array","title":"Faq"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"requires_image":{"type":"boolean","title":"Requires Image","default":false},"preset_prompt":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Preset Prompt"},"is_active":{"type":"boolean","title":"Is Active","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["slug","title","capability","model_ref","token_cost"],"title":"PageWrite","description":"Создание/правка страницы-инструмента (админ)."},"PaymentLinkResponse":{"properties":{"payment_id":{"type":"string","format":"uuid","title":"Payment Id"},"payment_link":{"type":"string","title":"Payment Link"},"status":{"type":"string","title":"Status"}},"type":"object","required":["payment_id","payment_link","status"],"title":"PaymentLinkResponse","description":"Ответ на инициацию платежа: ссылка Точки, на которую уводим пользователя."},"PaymentsProblems":{"properties":{"failed_renewals":{"type":"integer","title":"Failed Renewals"},"webhooks_invalid":{"type":"integer","title":"Webhooks Invalid"},"webhooks_unprocessed":{"type":"integer","title":"Webhooks Unprocessed"}},"type":"object","required":["failed_renewals","webhooks_invalid","webhooks_unprocessed"],"title":"PaymentsProblems"},"PlanCount":{"properties":{"plan_key":{"type":"string","title":"Plan Key"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["plan_key","count"],"title":"PlanCount"},"PlanCreate":{"properties":{"key":{"type":"string","maxLength":50,"minLength":1,"pattern":"^[a-z0-9_-]+$","title":"Key"},"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"price_rub":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":10.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Price Rub"},"tokens":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Tokens"},"period":{"type":"string","pattern":"^(week|month)$","title":"Period","default":"month"},"sort_order":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Sort Order","default":0}},"type":"object","required":["key","title","price_rub","tokens"],"title":"PlanCreate"},"PlanOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"price_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price Rub"},"tokens":{"type":"integer","title":"Tokens"},"period":{"type":"string","title":"Period"},"is_active":{"type":"boolean","title":"Is Active"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","key","title","price_rub","tokens","period","is_active","sort_order"],"title":"PlanOut"},"PlanPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"price_rub":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":10.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Rub"},"tokens":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Tokens"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"sort_order":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"PlanPatch"},"PlansResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlanOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PlansResponse"},"PreviewStep":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"model_ref":{"type":"string","title":"Model Ref"},"prompts":{"items":{"type":"string"},"type":"array","title":"Prompts"}},"type":"object","required":["id","type","model_ref","prompts"],"title":"PreviewStep"},"PricingResponse":{"properties":{"exchange_rate_usd_to_rub":{"type":"string","title":"Exchange Rate Usd To Rub"},"min_balance_rub":{"type":"string","title":"Min Balance Rub"},"default_currency":{"type":"string","title":"Default Currency"},"models":{"items":{"$ref":"#/components/schemas/ModelPricing"},"type":"array","title":"Models"}},"type":"object","required":["exchange_rate_usd_to_rub","min_balance_rub","default_currency","models"],"title":"PricingResponse"},"PromoBatchCreate":{"properties":{"prefix":{"type":"string","maxLength":24,"title":"Prefix","default":""},"count":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Count"},"title":{"type":"string","title":"Title","default":""},"benefit_type":{"type":"string","title":"Benefit Type"},"scope":{"type":"string","title":"Scope"},"percent":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percent"},"fixed_rub":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fixed Rub"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"duration_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Periods"},"plan_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Plan Keys"},"constraints":{"additionalProperties":true,"type":"object","title":"Constraints"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"max_redemptions_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions Total"},"max_per_user":{"type":"integer","title":"Max Per User","default":1},"benefit_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Benefit Ttl Days","default":30}},"type":"object","required":["count","benefit_type","scope"],"title":"PromoBatchCreate","description":"Батч уникальных промокодов с общей спекой выгоды. Код = prefix + случайный суффикс."},"PromoBatchResponse":{"properties":{"created":{"type":"integer","title":"Created"},"codes":{"items":{"type":"string"},"type":"array","title":"Codes"}},"type":"object","required":["created","codes"],"title":"PromoBatchResponse"},"PromoCodeCreate":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"title":{"type":"string","title":"Title","default":""},"benefit_type":{"type":"string","title":"Benefit Type"},"scope":{"type":"string","title":"Scope"},"percent":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percent"},"fixed_rub":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fixed Rub"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"duration_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Periods"},"plan_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Plan Keys"},"constraints":{"additionalProperties":true,"type":"object","title":"Constraints"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"max_redemptions_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions Total"},"max_per_user":{"type":"integer","title":"Max Per User","default":1},"benefit_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Benefit Ttl Days","default":30},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["code","benefit_type","scope"],"title":"PromoCodeCreate"},"PromoCodeListResponse":{"properties":{"codes":{"items":{"$ref":"#/components/schemas/PromoCodeOut"},"type":"array","title":"Codes"}},"type":"object","required":["codes"],"title":"PromoCodeListResponse"},"PromoCodeOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"benefit_type":{"type":"string","title":"Benefit Type"},"scope":{"type":"string","title":"Scope"},"percent":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percent"},"fixed_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fixed Rub"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"duration_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Periods"},"plan_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Plan Keys"},"constraints":{"additionalProperties":true,"type":"object","title":"Constraints"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"max_redemptions_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions Total"},"max_per_user":{"type":"integer","title":"Max Per User"},"redemptions_count":{"type":"integer","title":"Redemptions Count"},"benefit_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Benefit Ttl Days"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","code","title","benefit_type","scope","percent","fixed_rub","tokens","duration_periods","plan_keys","constraints","valid_from","valid_until","max_redemptions_total","max_per_user","redemptions_count","benefit_ttl_days","is_active","created_at"],"title":"PromoCodeOut"},"PromoCodeStats":{"properties":{"code_id":{"type":"string","format":"uuid","title":"Code Id"},"code":{"type":"string","title":"Code"},"redemptions_total":{"type":"integer","title":"Redemptions Total"},"redemptions_applied":{"type":"integer","title":"Redemptions Applied"},"total_discount_rub":{"type":"string","title":"Total Discount Rub"},"total_bonus_tokens":{"type":"integer","title":"Total Bonus Tokens"},"tokens_granted":{"type":"integer","title":"Tokens Granted"},"recent":{"items":{"$ref":"#/components/schemas/PromoRedemptionRow"},"type":"array","title":"Recent"}},"type":"object","required":["code_id","code","redemptions_total","redemptions_applied","total_discount_rub","total_bonus_tokens","tokens_granted","recent"],"title":"PromoCodeStats","description":"Детальная статистика по одному промокоду (для админ-панели)."},"PromoCodeUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"max_redemptions_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions Total"},"max_per_user":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Per User"}},"type":"object","title":"PromoCodeUpdate"},"PromoRedemptionRow":{"properties":{"user_email":{"type":"string","title":"User Email"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_email","status","created_at"],"title":"PromoRedemptionRow"},"ProviderStatusItem":{"properties":{"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"available":{"type":"boolean","title":"Available"},"state":{"type":"string","title":"State"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"balance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance"},"balance_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance Label"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"scenarios":{"items":{"type":"string"},"type":"array","title":"Scenarios","default":[]}},"type":"object","required":["name","title","available","state"],"title":"ProviderStatusItem"},"ProvidersStatusResponse":{"properties":{"providers":{"items":{"$ref":"#/components/schemas/ProviderStatusItem"},"type":"array","title":"Providers"}},"type":"object","required":["providers"],"title":"ProvidersStatusResponse"},"QuestionOptionPublic":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"}},"type":"object","required":["value","label"],"title":"QuestionOptionPublic","description":"Вариант ответа БЕЗ весов — ключ теста остаётся на сервере."},"QuestionPublic":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"text":{"type":"string","title":"Text"},"required":{"type":"boolean","title":"Required","default":true},"options":{"items":{"$ref":"#/components/schemas/QuestionOptionPublic"},"type":"array","title":"Options","default":[]},"min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max"},"max_select":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Select"},"show_if":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Show If"}},"type":"object","required":["id","type","text"],"title":"QuestionPublic"},"QuoteResponse":{"properties":{"scope":{"type":"string","title":"Scope"},"base_rub":{"type":"string","title":"Base Rub"},"discount_rub":{"type":"string","title":"Discount Rub"},"final_rub":{"type":"string","title":"Final Rub"}},"type":"object","required":["scope","base_rub","discount_rub","final_rub"],"title":"QuoteResponse"},"RecentVisitRow":{"properties":{"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"client_kind":{"type":"string","title":"Client Kind"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"landing_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Path"},"device":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country"},"geo_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Region"},"geo_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo City"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"anonymous_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anonymous Id"}},"type":"object","required":["occurred_at","client_kind"],"title":"RecentVisitRow","description":"Одна строка сырого журнала посещений (последние визиты по времени)."},"RecentVisitsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RecentVisitRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"RecentVisitsResponse"},"RedeemRequest":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"}},"type":"object","required":["code"],"title":"RedeemRequest"},"RedeemResponse":{"properties":{"redeemed":{"type":"boolean","title":"Redeemed"},"code":{"type":"string","title":"Code"},"benefit":{"$ref":"#/components/schemas/BenefitOut"},"applied_now":{"additionalProperties":{"type":"integer"},"type":"object","title":"Applied Now"},"pending":{"anyOf":[{"$ref":"#/components/schemas/BenefitOut"},{"type":"null"}]}},"type":"object","required":["redeemed","code","benefit"],"title":"RedeemResponse"},"ReferralListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/ReferralRow"},"type":"array","title":"Items"}},"type":"object","required":["total","items"],"title":"ReferralListResponse"},"ReferralOverview":{"properties":{"total":{"type":"integer","title":"Total"},"pending":{"type":"integer","title":"Pending"},"qualified":{"type":"integer","title":"Qualified"},"rewarded":{"type":"integer","title":"Rewarded"},"void":{"type":"integer","title":"Void"}},"type":"object","required":["total","pending","qualified","rewarded","void"],"title":"ReferralOverview"},"ReferralProgramOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"is_active":{"type":"boolean","title":"Is Active"},"qualify_on":{"type":"string","title":"Qualify On"},"qualify_min_rub":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Qualify Min Rub"},"referrer_tokens":{"type":"integer","title":"Referrer Tokens"},"referee_tokens":{"type":"integer","title":"Referee Tokens"},"referrer_cap_period":{"type":"integer","title":"Referrer Cap Period"},"benefit_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Benefit Ttl Days"}},"type":"object","required":["id","is_active","qualify_on","qualify_min_rub","referrer_tokens","referee_tokens","referrer_cap_period","benefit_ttl_days"],"title":"ReferralProgramOut"},"ReferralProgramUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"qualify_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualify On"},"qualify_min_rub":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Qualify Min Rub"},"referrer_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referrer Tokens"},"referee_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referee Tokens"},"referrer_cap_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referrer Cap Period"},"benefit_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Benefit Ttl Days"}},"type":"object","title":"ReferralProgramUpdate"},"ReferralResponse":{"properties":{"code":{"type":"string","title":"Code"},"share_url":{"type":"string","title":"Share Url"},"stats":{"$ref":"#/components/schemas/ReferralStats"}},"type":"object","required":["code","share_url","stats"],"title":"ReferralResponse"},"ReferralRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"referrer_email":{"type":"string","title":"Referrer Email"},"referee_email":{"type":"string","title":"Referee Email"},"code":{"type":"string","title":"Code"},"status":{"type":"string","title":"Status"},"fraud_signals":{"additionalProperties":true,"type":"object","title":"Fraud Signals"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"qualified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Qualified At"}},"type":"object","required":["id","referrer_email","referee_email","code","status","fraud_signals","created_at"],"title":"ReferralRow"},"ReferralStats":{"properties":{"invited":{"type":"integer","title":"Invited"},"qualified":{"type":"integer","title":"Qualified"},"tokens_earned":{"type":"integer","title":"Tokens Earned"}},"type":"object","required":["invited","qualified","tokens_earned"],"title":"ReferralStats"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":8,"title":"Password"},"referral_code":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Referral Code"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/SignupAttribution"},{"type":"null"}]},"via_code":{"type":"boolean","title":"Via Code","default":false}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"RegisterResponse":{"properties":{"pending_verification":{"type":"boolean","title":"Pending Verification","default":true},"verification":{"type":"string","enum":["code","link"],"title":"Verification","default":"link"}},"type":"object","title":"RegisterResponse"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","maxLength":256,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"RevenuePoint":{"properties":{"date":{"type":"string","title":"Date"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["date","amount"],"title":"RevenuePoint"},"RevenueSeries":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"points":{"items":{"$ref":"#/components/schemas/RevenuePoint"},"type":"array","title":"Points"}},"type":"object","required":["key","label","points"],"title":"RevenueSeries"},"RevenueWindow":{"properties":{"today":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Today"},"week":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Week"},"month":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Month"}},"type":"object","required":["today","week","month"],"title":"RevenueWindow","description":"Скользящие окна выручки (карта, succeeded), заканчивающиеся «сейчас»."},"ScenarioOut":{"properties":{"scenario":{"type":"string","title":"Scenario"},"rub_per_token":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rub Per Token"}},"type":"object","required":["scenario","rub_per_token"],"title":"ScenarioOut"},"ScoreRequest":{"properties":{"answers":{"additionalProperties":true,"type":"object","title":"Answers"}},"type":"object","required":["answers"],"title":"ScoreRequest","description":"Ответы гостя на анкету. Только ответы — баллы всегда считает сервер."},"ScoreResponse":{"properties":{"gated":{"type":"boolean","title":"Gated","default":true},"scales":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Scales"},"verdict":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Verdict"}},"type":"object","title":"ScoreResponse","description":"Ровно то, что разрешает gate.free шаблона."},"ServerMetrics":{"properties":{"load_avg":{"items":{"type":"number"},"type":"array","title":"Load Avg"},"cpu_count":{"type":"integer","title":"Cpu Count"},"load_pct":{"type":"number","title":"Load Pct"},"mem_total_mb":{"type":"integer","title":"Mem Total Mb"},"mem_used_mb":{"type":"integer","title":"Mem Used Mb"},"mem_used_pct":{"type":"number","title":"Mem Used Pct"},"disk_total_gb":{"type":"number","title":"Disk Total Gb"},"disk_used_gb":{"type":"number","title":"Disk Used Gb"},"disk_used_pct":{"type":"number","title":"Disk Used Pct"}},"type":"object","required":["load_avg","cpu_count","load_pct","mem_total_mb","mem_used_mb","mem_used_pct","disk_total_gb","disk_used_gb","disk_used_pct"],"title":"ServerMetrics"},"SignupAttribution":{"properties":{"utm_source":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Campaign"},"utm_term":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Content"},"referrer":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Referrer"},"landing_path":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Landing Path"},"anonymous_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Anonymous Id"}},"type":"object","title":"SignupAttribution","description":"Атрибуция «первого касания» с фронта (cookie tr_attrib).\n\nBest-effort: всё опционально, любое поле может прийти null. IP/User-Agent сюда\nНЕ кладём — их бэк берёт сам из запроса (get_client_meta), фронту не доверяем."},"SpeechRequest":{"properties":{"model":{"type":"string","title":"Model"},"input":{"type":"string","title":"Input"},"voice":{"type":"string","title":"Voice","default":""},"response_format":{"type":"string","enum":["mp3","wav","pcm"],"title":"Response Format","default":"mp3"},"speed":{"type":"number","maximum":4.0,"minimum":0.25,"title":"Speed","default":1.0},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"}},"additionalProperties":true,"type":"object","required":["model","input"],"title":"SpeechRequest","description":"Запрос POST /v1/audio/speech (OpenAI Audio API, спека §4).\n\n`voice` — OpenAI-имя (alloy/coral/echo/nova/onyx/shimmer), маппится на голоса\nGemini в speech_service; неизвестное/пустое → дефолт Kore.\n`speed` — у Gemini нет прямого параметра, передаём словами в инструкцию\n(approximate). `instructions` клиента дополняют дефолтную префикс-инструкцию\n(без неё Gemini TTS отвечает текстом вместо озвучки).","examples":[{"input":"Привет! Это тестовая озвучка текста.","model":"google/gemini-2.5-flash-preview-tts","response_format":"mp3","voice":"coral"}]},"StatsPoint":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"StatsPoint","description":"Точка временного ряда (день в TZ Europe/Moscow)."},"StepCostOut":{"properties":{"step_id":{"type":"string","title":"Step Id"},"type":{"type":"string","title":"Type"},"model_ref":{"type":"string","title":"Model Ref"},"base":{"type":"integer","title":"Base"},"mul":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mul"},"repeats":{"type":"integer","title":"Repeats","default":1}},"type":"object","required":["step_id","type","model_ref","base"],"title":"StepCostOut"},"StepPatch":{"properties":{"step_id":{"type":"string","maxLength":60,"minLength":1,"title":"Step Id"},"base":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Base"}},"type":"object","required":["step_id","base"],"title":"StepPatch"},"StreamOptions":{"properties":{"include_usage":{"type":"boolean","title":"Include Usage","default":false}},"additionalProperties":true,"type":"object","title":"StreamOptions"},"SubscribeRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"SubscribeRequest"},"SubscriptionPlanListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"plans":{"items":{"$ref":"#/components/schemas/SubscriptionPlanResponse"},"type":"array","title":"Plans"}},"type":"object","required":["plans"],"title":"SubscriptionPlanListResponse"},"SubscriptionPlanResponse":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"price_rub":{"type":"string","title":"Price Rub"},"tokens":{"type":"integer","title":"Tokens"},"period":{"type":"string","title":"Period"},"sort_order":{"type":"integer","title":"Sort Order"},"recommended":{"type":"boolean","title":"Recommended","default":false},"pack_price_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pack Price Rub"},"savings_pct":{"type":"integer","title":"Savings Pct","default":0}},"type":"object","required":["key","title","price_rub","tokens","period","sort_order"],"title":"SubscriptionPlanResponse","description":"Публичный вид тарифа (витрина)."},"SubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"plan_key":{"type":"string","title":"Plan Key"},"status":{"type":"string","title":"Status"},"price_rub":{"type":"string","title":"Price Rub"},"tokens_per_period":{"type":"integer","title":"Tokens Per Period"},"period":{"type":"string","title":"Period"},"current_period_start":{"type":"string","format":"date-time","title":"Current Period Start"},"current_period_end":{"type":"string","format":"date-time","title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"}},"type":"object","required":["id","plan_key","status","price_rub","tokens_per_period","period","current_period_start","current_period_end","cancel_at_period_end"],"title":"SubscriptionResponse"},"SubscriptionsStats":{"properties":{"active":{"type":"integer","title":"Active"},"mrr":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Mrr"},"by_plan":{"items":{"$ref":"#/components/schemas/PlanCount"},"type":"array","title":"By Plan"},"cancel_at_period_end":{"type":"integer","title":"Cancel At Period End"},"past_due":{"type":"integer","title":"Past Due"}},"type":"object","required":["active","mrr","by_plan","cancel_at_period_end","past_due"],"title":"SubscriptionsStats"},"SystemStatusResponse":{"properties":{"db_ok":{"type":"boolean","title":"Db Ok"},"redis_ok":{"type":"boolean","title":"Redis Ok"},"timers":{"additionalProperties":{"$ref":"#/components/schemas/TimerStatus"},"type":"object","title":"Timers"},"tokens_outstanding":{"type":"integer","title":"Tokens Outstanding"},"rub_balance_total":{"type":"number","title":"Rub Balance Total"},"active_subscriptions":{"type":"integer","title":"Active Subscriptions"},"server":{"$ref":"#/components/schemas/ServerMetrics"}},"type":"object","required":["db_ok","redis_ok","timers","tokens_outstanding","rub_balance_total","active_subscriptions","server"],"title":"SystemStatusResponse"},"TelegramLinkStatus":{"properties":{"linked":{"type":"boolean","title":"Linked"},"telegram_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","required":["linked"],"title":"TelegramLinkStatus","description":"Статус привязки Telegram у текущего сайт-аккаунта (для раздела в ЛК)."},"TelegramLinkTokenResponse":{"properties":{"deep_link":{"type":"string","title":"Deep Link"},"bot_username":{"type":"string","title":"Bot Username"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["deep_link","bot_username","expires_in"],"title":"TelegramLinkTokenResponse","description":"Deep-link для привязки: открывает бота с одноразовым токеном."},"TemplateRunAdvanceRequest":{"properties":{"step_id":{"type":"string","title":"Step Id"},"selected_index":{"type":"integer","minimum":0.0,"title":"Selected Index"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},"type":"object","required":["step_id","selected_index"],"title":"TemplateRunAdvanceRequest"},"TemplateRunGotoRequest":{"properties":{"step_id":{"type":"string","title":"Step Id"}},"type":"object","required":["step_id"],"title":"TemplateRunGotoRequest"},"TemplateRunMeta":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"current_step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step Id"},"total_charged":{"type":"integer","title":"Total Charged"}},"type":"object","required":["id","status","total_charged"],"title":"TemplateRunMeta"},"TemplateRunRegenerateRequest":{"properties":{"step_id":{"type":"string","title":"Step Id"},"edit":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Edit"},"n":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":1.0},{"type":"null"}],"title":"N"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"edit_from":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Edit From"},"brief":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Brief"},"controls":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Controls"},"answers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answers"}},"type":"object","required":["step_id"],"title":"TemplateRunRegenerateRequest"},"TemplateRunRepeatRequest":{"properties":{"step_id":{"type":"string","title":"Step Id"}},"type":"object","required":["step_id"],"title":"TemplateRunRepeatRequest"},"TemplateRunStartRequest":{"properties":{"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"text":{"type":"string","maxLength":4000,"title":"Text","default":""},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"answers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answers"}},"type":"object","required":["conversation_id"],"title":"TemplateRunStartRequest"},"TemplateRunTurnResponse":{"properties":{"run":{"$ref":"#/components/schemas/TemplateRunMeta"},"messages":{"items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array","title":"Messages"},"balance_after":{"type":"integer","title":"Balance After"}},"type":"object","required":["run","messages","balance_after"],"title":"TemplateRunTurnResponse"},"TemplateSamplePublic":{"properties":{"thumbnail_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Path"},"prompt_text":{"type":"string","title":"Prompt Text"}},"type":"object","required":["prompt_text"],"title":"TemplateSamplePublic","description":"Сэмпл шаблона: превью + готовый промпт (для модалки «Выбрать шаблон»)."},"TimerStatus":{"properties":{"active":{"type":"string","title":"Active"},"result":{"type":"string","title":"Result"},"next":{"type":"string","title":"Next"}},"type":"object","required":["active","result","next"],"title":"TimerStatus"},"TochkaTestResponse":{"properties":{"operation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Id"},"payment_link":{"type":"string","title":"Payment Link"}},"type":"object","required":["payment_link"],"title":"TochkaTestResponse"},"TochkaTestStatus":{"properties":{"received":{"type":"boolean","title":"Received"},"signature_verified":{"type":"boolean","title":"Signature Verified"},"received_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Received At"}},"type":"object","required":["received","signature_verified"],"title":"TochkaTestStatus"},"TokenLotResponse":{"properties":{"amount_remaining":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Remaining"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"source":{"type":"string","title":"Source"}},"type":"object","required":["amount_remaining","expires_at","source"],"title":"TokenLotResponse","description":"Партия токенов со сроком: для UI «столько-то сгорят тогда-то»."},"TokenPackRequest":{"properties":{"tokens":{"type":"integer","exclusiveMinimum":0.0,"title":"Tokens","description":"Сколько токенов купить (цена по объёму)"}},"type":"object","required":["tokens"],"title":"TokenPackRequest"},"TokenPair":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","const":"bearer","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenPair"},"TokenPriceResponse":{"properties":{"tokens":{"type":"integer","title":"Tokens"},"price_per_token":{"type":"string","title":"Price Per Token"},"cost_rub":{"type":"string","title":"Cost Rub"}},"type":"object","required":["tokens","price_per_token","cost_rub"],"title":"TokenPriceResponse","description":"Предрасчёт цены для калькулятора докупки (публичный)."},"TokenPurchaseRequest":{"properties":{"tokens":{"type":"integer","title":"Tokens"}},"type":"object","required":["tokens"],"title":"TokenPurchaseRequest"},"TokenPurchaseResponse":{"properties":{"tokens_added":{"type":"integer","title":"Tokens Added"},"charged_rub":{"type":"string","title":"Charged Rub"},"token_balance":{"type":"integer","title":"Token Balance"},"rub_balance":{"type":"string","title":"Rub Balance"}},"type":"object","required":["tokens_added","charged_rub","token_balance","rub_balance"],"title":"TokenPurchaseResponse"},"ToolPricingPatch":{"properties":{"token_cost":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Token Cost"},"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/StepPatch"},"type":"array"},{"type":"null"}],"title":"Steps"},"sync_badge":{"type":"boolean","title":"Sync Badge","default":false}},"type":"object","title":"ToolPricingPatch"},"ToolPricingRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind"},"capability":{"type":"string","title":"Capability"},"is_active":{"type":"boolean","title":"Is Active"},"token_cost":{"type":"integer","title":"Token Cost"},"engine_sum":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Engine Sum"},"mismatch":{"type":"boolean","title":"Mismatch","default":false},"steps":{"items":{"$ref":"#/components/schemas/StepCostOut"},"type":"array","title":"Steps"},"price_mul":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price Mul"},"cost_theory_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Theory Rub"},"cost_fact_rub":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Fact Rub"},"cost_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Note"},"margins":{"items":{"$ref":"#/components/schemas/MarginOut"},"type":"array","title":"Margins"}},"type":"object","required":["id","slug","title","kind","capability","is_active","token_cost"],"title":"ToolPricingRow"},"ToolsPricingResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolPricingRow"},"type":"array","title":"Items"},"scenarios":{"items":{"$ref":"#/components/schemas/ScenarioOut"},"type":"array","title":"Scenarios"}},"type":"object","required":["items","scenarios"],"title":"ToolsPricingResponse"},"TopupRequest":{"properties":{"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"currency":{"type":"string","maxLength":10,"minLength":3,"title":"Currency","default":"RUB"},"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"}},"type":"object","required":["amount"],"title":"TopupRequest"},"TopupResponse":{"properties":{"transaction_id":{"type":"string","format":"uuid","title":"Transaction Id"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"status":{"type":"string","title":"Status"}},"type":"object","required":["transaction_id","payment_url","status"],"title":"TopupResponse"},"TransactionListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TransactionResponse"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data","next_cursor"],"title":"TransactionListResponse"},"TransactionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"currency":{"type":"string","title":"Currency"},"type":{"type":"string","title":"Type"},"amount":{"type":"string","title":"Amount"},"balance_after":{"type":"string","title":"Balance After"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","currency","type","amount","balance_after","status","description","idempotency_key","meta","created_at"],"title":"TransactionResponse"},"UiTaskListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"tasks":{"items":{"$ref":"#/components/schemas/UiTaskResponse"},"type":"array","title":"Tasks"}},"type":"object","required":["tasks"],"title":"UiTaskListResponse"},"UiTaskResponse":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"capability":{"type":"string","title":"Capability"},"sort_order":{"type":"integer","title":"Sort Order"},"input_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Hint"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"model_ref":{"type":"string","title":"Model Ref"}},"type":"object","required":["key","title","description","token_cost","capability","sort_order","model_ref"],"title":"UiTaskResponse","description":"Публичный вид UI-задачи (витрина). preset_prompt и params не отдаём\n(детали исполнения); model_ref показываем — пользователю полезно знать модель."},"UpdateMeRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UpdateMeRequest"},"Usage":{"properties":{"prompt_tokens":{"type":"integer","title":"Prompt Tokens"},"completion_tokens":{"type":"integer","title":"Completion Tokens"},"total_tokens":{"type":"integer","title":"Total Tokens"}},"additionalProperties":true,"type":"object","required":["prompt_tokens","completion_tokens","total_tokens"],"title":"Usage"},"UserMe":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"email_verified":{"type":"boolean","title":"Email Verified"},"has_password":{"type":"boolean","title":"Has Password"},"auth_providers":{"items":{"type":"string"},"type":"array","title":"Auth Providers","default":[]},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","role","email_verified","has_password","created_at"],"title":"UserMe"},"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"},"VerifyEmailCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":12,"minLength":4,"title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyEmailCodeRequest"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VerifyEmailResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In"}},"type":"object","required":["verified"],"title":"VerifyEmailResponse"},"VideoErrorObject":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"VideoErrorObject"},"VideoGenerationRequest":{"properties":{"model":{"type":"string","title":"Model","description":"User-facing model id (например google/veo-3.1-fast)"},"prompt":{"type":"string","maxLength":5000,"minLength":1,"title":"Prompt"},"duration_seconds":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Duration Seconds","default":4},"first_frame":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"last_frame":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Reference Images"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"например '16:9' или '9:16'"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"например '720p', '1080p'"},"generate_audio":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Audio"},"seed":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Seed"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"additionalProperties":false,"type":"object","required":["model","prompt"],"title":"VideoGenerationRequest","description":"POST /v1/video/generations body.\n\n`first_frame`/`last_frame` — для image-to-video (Veo принимает image\nи lastFrame в instances[0]). `reference_images` зарезервировано под\nбудущие провайдеры (Pika/Ideogram) — Veo их пока не использует.\n\nОстальные provider-specific параметры (camera control и т.п.) можно\nпередать через `parameters` — мерджатся с явными полями в адаптере."},"VideoGenerationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"task":{"type":"string","title":"Task"},"status":{"type":"string","title":"Status"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","task","status"],"title":"VideoGenerationResponse","description":"Async-видео задание (Р.5b-video)."},"VideoJobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"model":{"type":"string","title":"Model"},"prompt":{"type":"string","title":"Prompt"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"cost_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Rub"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"}},"additionalProperties":true,"type":"object","required":["id","model","prompt","duration_seconds","status","created_at","updated_at"],"title":"VideoJobResponse","description":"Ответ на любой запрос про конкретный job — POST или GET."},"VideoListResponse":{"properties":{"object":{"type":"string","const":"list","title":"Object","default":"list"},"data":{"items":{"$ref":"#/components/schemas/VideoObject"},"type":"array","title":"Data"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["data"],"title":"VideoListResponse"},"VideoObject":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"video","title":"Object","default":"video"},"model":{"type":"string","title":"Model"},"status":{"type":"string","enum":["queued","in_progress","completed","failed"],"title":"Status"},"progress":{"type":"integer","title":"Progress"},"created_at":{"type":"integer","title":"Created At"},"completed_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed At"},"expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires At"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size"},"seconds":{"type":"string","title":"Seconds"},"prompt":{"type":"string","title":"Prompt"},"error":{"anyOf":[{"$ref":"#/components/schemas/VideoErrorObject"},{"type":"null"}]}},"type":"object","required":["id","model","status","progress","created_at","seconds","prompt"],"title":"VideoObject","description":"Video job object в формате Sora API.","examples":[{"created_at":1752345600,"id":"video_5f2c1d8e-3a4b-4c5d-8e9f-0a1b2c3d4e5f","model":"google/veo-3.1-fast","object":"video","progress":50,"prompt":"Дрон летит над зимним лесом на рассвете","seconds":"8","size":"1280x720","status":"in_progress"}]},"VisitorRow":{"properties":{"visitor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visitor"},"visits":{"type":"integer","title":"Visits"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country"},"geo_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Region"},"geo_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo City"},"last_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Ip"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"landing_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Path"}},"type":"object","required":["visitor","visits","first_seen","last_seen"],"title":"VisitorRow"},"VisitorsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VisitorRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"VisitorsResponse"},"VisitsOverview":{"properties":{"human_visits":{"type":"integer","title":"Human Visits"},"unique_visitors":{"type":"integer","title":"Unique Visitors"},"sessions":{"type":"integer","title":"Sessions"},"bot_visits":{"type":"integer","title":"Bot Visits"},"bots_by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"Bots By Category"},"top_bots":{"items":{"$ref":"#/components/schemas/BotCount"},"type":"array","title":"Top Bots"},"series_human":{"items":{"$ref":"#/components/schemas/StatsPoint"},"type":"array","title":"Series Human"},"top_countries":{"items":{"$ref":"#/components/schemas/NameCount"},"type":"array","title":"Top Countries"},"top_sources":{"items":{"$ref":"#/components/schemas/NameCount"},"type":"array","title":"Top Sources"}},"type":"object","required":["human_visits","unique_visitors","sessions","bot_visits","bots_by_category","top_bots","series_human","top_countries","top_sources"],"title":"VisitsOverview"},"WalletResponse":{"properties":{"currency":{"type":"string","title":"Currency"},"balance":{"type":"string","title":"Balance"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["currency","balance","updated_at"],"title":"WalletResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}