{"openapi":"3.1.0","info":{"title":"VectorAds API","description":"AI-настройка контекстной рекламы для МСБ СНГ","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","description":"Корневой endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Health check для load balancer и мониторинга.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Регистрация нового пользователя. Rate limit: 5 регистраций в час с IP.","operationId":"register_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/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Вход в систему. Rate limit: 10 попыток в минуту с IP.\n\nЕсли у пользователя включена 2FA — НЕ выдаём access_token сразу, а\nвозвращаем pre_auth_token (короткоживущий, purpose=2fa) + two_factor_required.\nВторой шаг — POST /auth/login/2fa с кодом TOTP или recovery-кодом.","operationId":"login_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/LoginResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/2fa":{"post":{"tags":["auth"],"summary":"Login 2Fa","description":"Второй шаг входа с 2FA. Принимает pre_auth_token (из /login) + код:\n6 цифр = TOTP, иначе одноразовый recovery-код. Возвращает access_token.","operationId":"login_2fa_auth_login_2fa_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Login2FARequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/telegram":{"post":{"tags":["auth"],"summary":"Telegram Login","description":"Вход через Telegram Login Widget (в один тап). Проверяем подпись Telegram\n(HMAC-SHA256, ключ = SHA256(bot_token)), находим/создаём пользователя по telegram id.","operationId":"telegram_login_auth_telegram_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}}}},"/auth/google/start":{"get":{"tags":["auth-oauth"],"summary":"Google Start","description":"Начать OAuth-флоу с Google для логина/регистрации в VectorAds.","operationId":"google_start_auth_google_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"tags":["auth-oauth"],"summary":"Google Callback","description":"Принять callback от Google после авторизации.","operationId":"google_callback_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/yandex/start":{"get":{"tags":["auth-oauth"],"summary":"Yandex Start","description":"Начать OAuth-флоу с Яндекс для логина/регистрации.","operationId":"yandex_start_auth_yandex_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/yandex/callback":{"get":{"tags":["auth-oauth"],"summary":"Yandex Callback","description":"Принять callback от Яндекса.","operationId":"yandex_callback_auth_yandex_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/vk/start":{"get":{"tags":["auth"],"summary":"Vk Login Start","description":"Старт входа через VK. Redirect URI: https://api.vads-ai.com/auth/vk/callback","operationId":"vk_login_start_auth_vk_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/vk/callback":{"get":{"tags":["auth"],"summary":"Vk Login Callback","operationId":"vk_login_callback_auth_vk_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/magic-link":{"post":{"tags":["auth"],"summary":"Magic Link Request","description":"Запросить вход по ссылке (magic link). Находим/создаём пользователя по email,\nшлём одноразовую ссылку. Всегда отвечаем ok (не раскрываем, есть ли аккаунт).\nПисьмо уйдёт, когда настроен SMTP (app-пароль почты).","operationId":"magic_link_request_auth_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/magic-link/verify":{"get":{"tags":["auth"],"summary":"Magic Link Verify","description":"Переход по ссылке из письма → логиним пользователя (JWT) → кабинет.","operationId":"magic_link_verify_auth_magic_link_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"Информация о текущем пользователе.","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"delete":{"tags":["auth"],"summary":"Delete My Account","description":"Удалить (деактивировать) аккаунт — мягкое удаление: ставим deleted_at.\nДанные физически удаляются по cron через 30 дней; до этого восстановимы\nчерез поддержку. JWT после этого недействителен (get_current_user отвергает\ndeleted_at != None).","operationId":"delete_my_account_auth_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["auth"],"summary":"Update Me","description":"Обновить личные данные текущего пользователя.","operationId":"update_me_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/auth/me/avatar":{"delete":{"tags":["auth"],"summary":"Delete Avatar","description":"Удалить аватар пользователя.","operationId":"delete_avatar_auth_me_avatar_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["auth"],"summary":"Update Avatar","description":"Сохранить аватар пользователя.\nКлиент присылает base64 data-URL после ресайза до 512×512 JPEG.","operationId":"update_avatar_auth_me_avatar_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/auth/me/export":{"get":{"tags":["auth"],"summary":"Export My Data","description":"Экспорт персональных данных пользователя (право на доступ к данным).\nВозвращает профиль + связанных клиентов + заявки. Скачивается JSON-файлом.","operationId":"export_my_data_auth_me_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/auth/verify-email/send":{"post":{"tags":["auth"],"summary":"Send Verification Email","description":"Отправить (или переотправить) письмо подтверждения email.","operationId":"send_verification_email_auth_verify_email_send_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Подтвердить email по токену (из письма).","operationId":"verify_email_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Запросить ссылку для сброса пароля.\n\nВсегда возвращаем 200 (даже если email не зарегистрирован) —\nзащита от user enumeration.","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Сбросить пароль по токену из email.","operationId":"reset_password_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/telegram/connect-link":{"get":{"tags":["telegram"],"summary":"Get Connect Link","description":"Сгенерировать deep-link для подключения клиента к боту.","operationId":"get_connect_link_telegram_connect_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/telegram/disconnect":{"post":{"tags":["telegram"],"summary":"Disconnect","description":"Отключить Telegram-уведомления.","operationId":"disconnect_telegram_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/telegram/webhook/{secret}":{"post":{"tags":["telegram"],"summary":"Telegram Webhook","description":"Webhook от Telegram при сообщении в нашего бота.\n\nЗащита двумя факторами:\n1. URL-секрет (часть PATH) — обычная меросугс, отсекает случайные обращения.\n2. Заголовок X-Telegram-Bot-Api-Secret-Token — выставляется Telegram'ом при setWebhook\n   с параметром secret_token. Это рекомендуемый способ верификации.\nОба должны совпасть.","operationId":"telegram_webhook_telegram_webhook__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}},{"name":"x-telegram-bot-api-secret-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Telegram-Bot-Api-Secret-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/telegram/admin/test":{"post":{"tags":["telegram"],"summary":"Admin Test Message","description":"Отправить тестовое сообщение в admin chat.","operationId":"admin_test_message_telegram_admin_test_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"text","in":"query","required":false,"schema":{"type":"string","default":"Test от VectorAds 🚀","title":"Text"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/2fa/setup":{"post":{"tags":["2fa"],"summary":"Setup 2Fa","description":"Шаг 1: сгенерировать секрет и показать QR.\n\nСекрет ВРЕМЕННО сохраняется в БД (encrypted), но 2FA ещё не активна —\nпока клиент не подтвердит первый код через /verify-setup.","operationId":"setup_2fa_2fa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/2fa/verify-setup":{"post":{"tags":["2fa"],"summary":"Verify Setup","description":"Шаг 2: подтвердить настройку первым кодом из authenticator-приложения.","operationId":"verify_setup_2fa_verify_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifySetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifySetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/2fa/verify":{"post":{"tags":["2fa"],"summary":"Verify 2Fa Code","description":"Проверить TOTP-код (используется при логине для двухшаговой авторизации\nили при критичных действиях).","operationId":"verify_2fa_code_2fa_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/2fa/disable":{"post":{"tags":["2fa"],"summary":"Disable 2Fa","description":"Отключить 2FA.\n\nТребует:\n  - Текущий пароль\n  - Действующий TOTP код","operationId":"disable_2fa_2fa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/clients/":{"post":{"tags":["clients"],"summary":"Create Client","description":"Создать новый клиент-бизнес.","operationId":"create_client_clients__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["clients"],"summary":"List My Clients","description":"Список клиентов текущего пользователя.","operationId":"list_my_clients_clients__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientOut"},"title":"Response List My Clients Clients  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clients/{client_id}":{"get":{"tags":["clients"],"summary":"Get Client","description":"Получить один клиент по ID.","operationId":"get_client_clients__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["clients"],"summary":"Update Client","description":"Обновить данные клиента (частично).","operationId":"update_client_clients__client_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clients"],"summary":"Delete Client","description":"Soft-удаление клиента (через deleted_at).","operationId":"delete_client_clients__client_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/":{"get":{"tags":["campaigns"],"summary":"List Campaigns","description":"Список кампаний — фильтры по клиенту, платформе, статусу. Пагинация skip/limit.","operationId":"list_campaigns_campaigns__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Фильтр по клиенту","title":"Client Id"},"description":"Фильтр по клиенту"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"google_ads | yandex_direct","title":"Platform"},"description":"google_ads | yandex_direct"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignOut"},"title":"Response List Campaigns Campaigns  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/creatives/generate":{"post":{"tags":["campaigns"],"summary":"Generate Creatives","description":"Генерация рекламных креативов под нишу клиента: изображения (DALL-E) или видео.\nСерверная генерация через API (для SaaS), не MCP. Картинки — при OPENAI_API_KEY,\nвидео — при настроенном video-провайдере.","operationId":"generate_creatives_campaigns_creatives_generate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreativeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/creatives/angles":{"post":{"tags":["campaigns"],"summary":"Generate Creative Angles","description":"Рекламные «заходы» (углы): 8 разных психологических концепций под нишу клиента\n(боль/выгода/срочность/соцдоказательство/гарантия/цена/любопытство/экспертность),\nкаждый со своим триггером + заголовок + текст + CTA. Метод «N углов» для A/B-тестов креативов.\nРаботает БЕЗ рекламных API (только бриф). Провайдер — Claude (бизнес-данные, ПДн нет).","operationId":"generate_creative_angles_campaigns_creatives_angles_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/competitor-audit":{"post":{"tags":["campaigns"],"summary":"Start Competitor Audit","description":"Запустить аудит конкурентов в ФОНЕ (LLM на CPU медленный — до ~2 мин).\nСоздаёт pending-запись, ставит задачу, фронт опрашивает /competitor-audit/latest.","operationId":"start_competitor_audit_campaigns_competitor_audit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/campaigns/competitor-audit/latest":{"get":{"tags":["campaigns"],"summary":"Latest Competitor Audit","description":"Последний аудит конкурентов клиента: {status: none|pending|done, result}.","operationId":"latest_competitor_audit_campaigns_competitor_audit_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/campaigns/ai-activity":{"get":{"tags":["campaigns"],"summary":"List Ai Activity","description":"Лента действий и рекомендаций AI для клиента (что система сделала/предлагает).\n\nВАЖНО: объявлено ДО `/{campaign_id}`, иначе catch-all перехватит «ai-activity» как id.","operationId":"list_ai_activity_campaigns_ai_activity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/ai-activity/{activity_id}/dismiss":{"post":{"tags":["campaigns"],"summary":"Dismiss Ai Activity","description":"Скрыть карточку из ленты (клиент прочитал/неактуально).","operationId":"dismiss_ai_activity_campaigns_ai_activity__activity_id__dismiss_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{campaign_id}":{"get":{"tags":["campaigns"],"summary":"Get Campaign","description":"Получить кампанию по ID.","operationId":"get_campaign_campaigns__campaign_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{campaign_id}/status":{"patch":{"tags":["campaigns"],"summary":"Update Campaign Status","description":"Изменить статус кампании.\n\nДопустимые значения: active, paused, archived.\n\nTODO: после Developer Token — реальный вызов Google Ads API\nдля синхронизации статуса с площадкой.","operationId":"update_campaign_status_campaigns__campaign_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/stats/daily":{"get":{"tags":["campaigns"],"summary":"Campaign Stats Daily","description":"Ежедневная статистика кампаний за N дней — для графика расход/конверсии.\n\nКлиент видит только свои данные. Админ может передать client_id любого клиента.\nВозвращает: {days: [{date, impressions, clicks, cost_byn, conversions}], totals: {...}}","operationId":"campaign_stats_daily_campaigns_stats_daily_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":1,"default":30,"title":"Days"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Только для админа — посмотреть чужого клиента","title":"Client Id"},"description":"Только для админа — посмотреть чужого клиента"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/plan/preview":{"post":{"tags":["campaigns"],"summary":"Plan Preview","description":"Предпросмотр рекламного плана для клиента.\n\nГенерируется ОФЛАЙН из брифа (build_campaign_plan), без обращения к Google/Yandex\nAPI — поэтому работает до получения Basic Access и до реального запуска кампаний.\nКлиент видит, что именно развернёт AI: группы, ключевые слова, тексты объявлений.","operationId":"plan_preview_campaigns_plan_preview_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/plan/save":{"post":{"tags":["campaigns"],"summary":"Plan Save","description":"Сохранить построенный план как ЧЕРНОВИК кампании — чтобы превью не было тупиком.\n\nКампания создаётся в статусе DRAFT и в рекламный аккаунт НЕ заливается (реальный\nзапуск — после подключения кабинета: Google Basic Access / Yandex OAuth). Клиент\nвидит запланированную кампанию в списке и не теряет работу. План сохраняется в\nschedule_json, чтобы развернуть его как есть, когда появится доступ.\nИдемпотентно: повторное сохранение обновляет существующий черновик этой платформы.","operationId":"plan_save_campaigns_plan_save_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/ingress":{"post":{"tags":["leads"],"summary":"Ingress Lead","description":"Приём заявки от формы на сайте клиента (БЕЗ авторизации).\n\nИспользуется через JavaScript-сниппет на сайте клиента:\n    fetch('https://api.vads-ai.com/leads/ingress', {\n        method: 'POST',\n        body: JSON.stringify({client_id, name, phone, ...})\n    })\n\nПосле приёма:\n  1. Создаём Lead в БД\n  2. Атрибуция по UTM/click_id\n  3. Push в Bitrix24 клиента (если подключен)\n  4. Email + Telegram уведомление клиенту (Celery task)\n  5. Передача конверсии в Google/Yandex (offline conversions)","operationId":"ingress_lead_leads_ingress_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadIngressRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/":{"get":{"tags":["leads"],"summary":"List Leads","description":"Список лидов с фильтрами.","operationId":"list_leads_leads__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeadOut"},"title":"Response List Leads Leads  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/{lead_id}/status":{"patch":{"tags":["leads"],"summary":"Update Lead Status","description":"Обновить статус лида (new → in_work → qualified → won/lost, либо spam).","operationId":"update_lead_status_leads__lead_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/{lead_id}":{"get":{"tags":["leads"],"summary":"Get Lead","description":"Получить один лид.","operationId":"get_lead_leads__lead_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/yandex/start":{"get":{"tags":["integrations"],"summary":"Yandex Oauth Start","description":"Шаг 1: формируем URL и редиректим клиента на Яндекс OAuth.\n\nState используется для CSRF-защиты — привязан к user_id + выбранному client_id\n(мультитенантность: подключаем кабинет именно выбранному клиенту), проверяется в callback.","operationId":"yandex_oauth_start_integrations_yandex_start_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/yandex/callback":{"get":{"tags":["integrations"],"summary":"Yandex Oauth Callback","description":"Шаг 2: Яндекс редиректит сюда с code → обмениваем на токены.\n\nState валидируется через oauth_state.verify_state — защита от CSRF.\nЕсли code/state нет (пользователь отменил или ошибка Яндекса) —\nмягкий редирект в кабинет, без сырого 422.","operationId":"yandex_oauth_callback_integrations_yandex_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/vk/connect-self":{"post":{"tags":["integrations"],"summary":"Vk Connect Self","description":"Подключить НАШ собственный VK-кабинет (client_credentials) к выбранному клиенту.\nИспользуется для демо/своего аккаунта — не требует OAuth клиента.","operationId":"vk_connect_self_integrations_vk_connect_self_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/vk/start":{"get":{"tags":["integrations"],"summary":"Vk Oauth Start","description":"Шаг 1 per-client OAuth: URL согласия VK. redirect_uri должен быть зарегистрирован в VK-приложении.","operationId":"vk_oauth_start_integrations_vk_start_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/vk/callback":{"get":{"tags":["integrations"],"summary":"Vk Oauth Callback","description":"Шаг 2 per-client OAuth: code → refresh_token, привязка к клиенту, импорт кампаний.","operationId":"vk_oauth_callback_integrations_vk_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/vk/accounts":{"get":{"tags":["integrations"],"summary":"Vk Accounts","description":"Список VK-подключений выбранного клиента.","operationId":"vk_accounts_integrations_vk_accounts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/vk/accounts/{conn_id}":{"delete":{"tags":["integrations"],"summary":"Vk Account Delete","description":"Отключить VK-кабинет.","operationId":"vk_account_delete_integrations_vk_accounts__conn_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/start":{"get":{"tags":["integrations"],"summary":"Google Oauth Start","description":"Шаг 1: формируем URL и редиректим клиента на Google OAuth.\n\nState — CSRF-токен, привязан к user_id, проверяется в callback.","operationId":"google_oauth_start_integrations_google_start_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"login_hint","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Email клиента (опционально)","title":"Login Hint"},"description":"Email клиента (опционально)"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/callback":{"get":{"tags":["integrations"],"summary":"Google Oauth Callback","description":"Шаг 2: Google редиректит сюда с code → обмениваем на токены.\nState валидируется через oauth_state.verify_state — защита от CSRF.\nБез code/state (отмена/ошибка) — мягкий редирект, без сырого 422.","operationId":"google_oauth_callback_integrations_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/submit-id":{"post":{"tags":["integrations"],"summary":"Google Submit Customer Id","description":"Клиент сообщает свой Google Ads Customer ID. Создаём запись подключения\nв статусе PENDING — админ затем отправит MCC-приглашение, клиент примет.","operationId":"google_submit_customer_id_integrations_google_submit_id_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleCustomerIdRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/invite":{"post":{"tags":["integrations"],"summary":"Google Send Invitation","description":"Отправить MCC-приглашение клиенту.\n\nТребует Developer Token (после approval). До этого — заглушка.","operationId":"google_send_invitation_integrations_google_invite_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleInviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleInviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/invite/{customer_id}/status":{"get":{"tags":["integrations"],"summary":"Google Invitation Status","description":"Проверить статус ранее отправленного MCC-приглашения.","operationId":"google_invitation_status_integrations_google_invite__customer_id__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/accounts":{"get":{"tags":["integrations"],"summary":"Google List Accounts","description":"Список Google Ads кабинетов клиента (мультиаккаунт, до 10). Первый в цене тарифа, доп. +100/мес.","operationId":"google_list_accounts_integrations_google_accounts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/accounts/{conn_id}":{"delete":{"tags":["integrations"],"summary":"Google Delete Account","description":"Отвязать Google Ads кабинет. Если был доп. (аккаунтов было ≥2) — снимаем доплату −100/мес.","operationId":"google_delete_account_integrations_google_accounts__conn_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/me":{"get":{"tags":["integrations"],"summary":"List My Integrations","description":"Список активных интеграций пользователя — реальные данные из БД.","operationId":"list_my_integrations_integrations_me_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/verify":{"post":{"tags":["integrations"],"summary":"Google Verify Connection","description":"Проверить, принято ли MCC-приглашение клиентом, и обновить статус.\nСпрашиваем Google (customer_client_link.status). Если ACTIVE — помечаем\nподключение активным, и кабинет показывает «Подключено».\ncustomer_id (опц.) — проверить КОНКРЕТНЫЙ кабинет (мультиаккаунт), иначе первый.","operationId":"google_verify_connection_integrations_google_verify_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/google/connection":{"delete":{"tags":["integrations"],"summary":"Google Delete Connection","description":"Отменить заявку / убрать отправленный Customer ID (крестик в кабинете).","operationId":"google_delete_connection_integrations_google_connection_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/gtm":{"get":{"tags":["integrations"],"summary":"List Gtm","description":"Список подключённых GTM-контейнеров клиента.","operationId":"list_gtm_integrations_gtm_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Connect Gtm","description":"Подключить GTM-контейнер (web или server-side). Можно несколько.","operationId":"connect_gtm_integrations_gtm_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GtmConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/gtm/{conn_id}":{"delete":{"tags":["integrations"],"summary":"Delete Gtm","description":"Удалить GTM-контейнер (крестик в кабинете).","operationId":"delete_gtm_integrations_gtm__conn_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/analytics":{"get":{"tags":["integrations"],"summary":"List Analytics","description":"Список подключённых ресурсов аналитики (GA4/GSC/Метрика) по share-схеме.","operationId":"list_analytics_integrations_analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Connect Analytics","description":"Зарегистрировать ресурс аналитики (после того как клиент дал доступ на vectorads.by@gmail.com).","operationId":"connect_analytics_integrations_analytics_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/meta/connect":{"post":{"tags":["integrations"],"summary":"Connect Meta","description":"Подключить Meta (Facebook + Instagram): Pixel ID + Conversions API токен.\nСразу шлём тестовое событие — при успехе статус active, и конверсии трекера\nначинают дублироваться в Meta server-side (надёжнее браузерного пикселя).","operationId":"connect_meta_integrations_meta_connect_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/meta/connection":{"delete":{"tags":["integrations"],"summary":"Delete Meta Connection","description":"Отключить Meta Pixel.","operationId":"delete_meta_connection_integrations_meta_connection_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/meta/oauth/start":{"get":{"tags":["integrations"],"summary":"Meta Oauth Start","description":"Подключение РЕКЛАМНОГО КАБИНЕТА Meta (управление кампаниями), не пиксель.\nШаг 1: формируем URL Facebook Login и редиректим клиента.\nТребует settings.meta_app_id/secret (наше приложение Meta).","operationId":"meta_oauth_start_integrations_meta_oauth_start_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/meta/callback":{"get":{"tags":["integrations"],"summary":"Meta Oauth Callback","description":"Шаг 2: Meta редиректит сюда с code → меняем на long-lived токен → сохраняем рекл. аккаунт.","operationId":"meta_oauth_callback_integrations_meta_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/meta/deauthorize":{"post":{"tags":["integrations"],"summary":"Meta Deauthorize","description":"Callback Meta при отзыве доступа пользователем (Settings → Business Integrations → Remove).\nMeta шлёт signed_request. Мы отвечаем 200; токен почистится при следующей проверке/удалении.","operationId":"meta_deauthorize_integrations_meta_deauthorize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations/meta/data-deletion":{"post":{"tags":["integrations"],"summary":"Meta Data Deletion","description":"Data Deletion Callback (Meta). Пользователь запросил удаление данных через Facebook.\nMeta ждёт JSON {url, confirmation_code}. Возвращаем ссылку на статус + код.\nФактическое удаление выполняется по нашей процедуре (см. /data-deletion).","operationId":"meta_data_deletion_integrations_meta_data_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations/tiktok/oauth/start":{"get":{"tags":["integrations"],"summary":"Tiktok Oauth Start","description":"Подключение РЕКЛАМНОГО КАБИНЕТА TikTok (управление кампаниями), не пиксель.\nТребует settings.tiktok_app_id/secret (наше приложение TikTok for Business).","operationId":"tiktok_oauth_start_integrations_tiktok_oauth_start_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/tiktok/callback":{"get":{"tags":["integrations"],"summary":"Tiktok Oauth Callback","description":"Шаг 2: TikTok редиректит сюда с auth_code → меняем на access_token → сохраняем рекл. аккаунт.","operationId":"tiktok_oauth_callback_integrations_tiktok_callback_get","parameters":[{"name":"auth_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Code"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/tiktok/connect":{"post":{"tags":["integrations"],"summary":"Connect Tiktok","description":"Подключить TikTok: Pixel Code + Events API токен. Тестовое событие → active.","operationId":"connect_tiktok_integrations_tiktok_connect_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TikTokConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/tiktok/connection":{"delete":{"tags":["integrations"],"summary":"Delete Tiktok Connection","description":"Отключить TikTok Pixel.","operationId":"delete_tiktok_connection_integrations_tiktok_connection_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/analytics/{conn_id}/verify":{"post":{"tags":["integrations"],"summary":"Verify Analytics","description":"Мгновенная проверка доступа по требованию клиента (кнопка «Проверить» +\nавто-опрос после подключения). GTM/GSC — через Google API; если доступ\nвыдан → сразу active. Чтобы клиент не ждал 10-минутный cron.","operationId":"verify_analytics_integrations_analytics__conn_id__verify_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/analytics/{conn_id}":{"delete":{"tags":["integrations"],"summary":"Delete Analytics","description":"Удалить ресурс аналитики (крестик).","operationId":"delete_analytics_integrations_analytics__conn_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/inbound-url":{"get":{"tags":["integrations"],"summary":"Get Inbound Lead Url","description":"Секретный URL для приёма лидов из любой формы / Make / n8n / TikTok Lead Gen.\nКлиент вставляет его в источник — заявки падают в воронку + Telegram + Bitrix.","operationId":"get_inbound_lead_url_integrations_inbound_url_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/widget":{"get":{"tags":["integrations"],"summary":"Get Widget Config","description":"Текущий конфиг виджета захвата лидов клиента.","operationId":"get_widget_config_integrations_widget_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Set Widget Config","description":"Сохранить конфиг виджета. Появляется на сайте автоматически (трекер уже установлен).","operationId":"set_widget_config_integrations_widget_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetConfigIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/ab":{"get":{"tags":["integrations"],"summary":"Get Ab Experiments","description":"Список A/B-экспериментов лендинга клиента.","operationId":"get_ab_experiments_integrations_ab_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Set Ab Experiments","description":"Сохранить список A/B-экспериментов. Применяются на сайте автоматически (трекер установлен).","operationId":"set_ab_experiments_integrations_ab_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ABListIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/amocrm":{"post":{"tags":["integrations"],"summary":"Connect Amocrm","description":"Подключение amoCRM по субдомену + долгосрочному токену интеграции.\nПроверяем доступ (GET /account), шифруем и сохраняем. BETA.","operationId":"connect_amocrm_integrations_amocrm_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmoCRMConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["integrations"],"summary":"Disconnect Amocrm","description":"Отключить amoCRM.","operationId":"disconnect_amocrm_integrations_amocrm_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/bitrix24":{"post":{"tags":["integrations"],"summary":"Connect Bitrix24","description":"Подключение Bitrix24 входящим вебхуком.\nВалидируем формат, делаем тестовый вызов, шифруем и сохраняем.","operationId":"connect_bitrix24_integrations_bitrix24_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Bitrix24ConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["integrations"],"summary":"Disconnect Bitrix24","description":"Отключить Bitrix24.","operationId":"disconnect_bitrix24_integrations_bitrix24_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/my":{"get":{"tags":["billing"],"summary":"My Billing Overview","description":"Сводка по подписке клиента: тариф, статус, период, цена, история.\nУдобный endpoint без необходимости знать client_id.","operationId":"my_billing_overview_billing_my_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/billing/subscription":{"get":{"tags":["billing"],"summary":"Get My Subscription","description":"Текущая активная подписка.","operationId":"get_my_subscription_billing_subscription_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionOut"},{"type":"null"}],"title":"Response Get My Subscription Billing Subscription Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["billing"],"summary":"Subscribe","description":"Создать новую подписку.\n\nПо умолчанию — 7-дневный trial без оплаты.\nПосле trial — статус PAST_DUE до оплаты.","operationId":"subscribe_billing_subscription_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription/tier":{"patch":{"tags":["billing"],"summary":"Change Tier","description":"Изменить тариф (upgrade/downgrade).","operationId":"change_tier_billing_subscription_tier_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeTierRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription/cancel":{"post":{"tags":["billing"],"summary":"Cancel Subscription","description":"Отменить подписку (действует до конца оплаченного периода).","operationId":"cancel_subscription_billing_subscription_cancel_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/invoice":{"post":{"tags":["billing"],"summary":"Create Invoice","description":"Создать счёт-фактуру для безналичной оплаты юр.лицом.","operationId":"create_invoice_billing_invoice_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/billing/invoices":{"get":{"tags":["billing"],"summary":"List Invoices","description":"История счетов для клиента.","operationId":"list_invoices_billing_invoices_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceOut"},"title":"Response List Invoices Billing Invoices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/invoice/{invoice_id}":{"get":{"tags":["billing"],"summary":"Get Invoice","description":"Один счёт по id (для печати акта). Проверяет владение через клиента.","operationId":"get_invoice_billing_invoice__invoice_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout/erip":{"post":{"tags":["billing"],"summary":"Checkout Erip","description":"Начать оплату через ЕРИП (express-pay).\n\nИдемпотентно: один счёт-ЕРИП на подписку в день — повторные нажатия «Оплатить через ЕРИП»\nНЕ плодят новые счета (раньше каждый клик создавал новый Invoice + новый express-pay счёт).\nЛицевой счёт клиента постоянный, поэтому переиспользуем уже выставленный PENDING-счёт.\nЕсли express-pay недоступен — не падаем 502, а отдаём реквизиты для оплаты по счёту.","operationId":"checkout_erip_billing_checkout_erip_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout/webpay":{"post":{"tags":["billing"],"summary":"Checkout Webpay","description":"Начать оплату картой через WEBPAY.","operationId":"checkout_webpay_billing_checkout_webpay_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout/manual":{"post":{"tags":["billing"],"summary":"Checkout Manual","description":"Ручная оплата банковским переводом (НПД, без НДС) — пока нет договора с ЕРИП/WebPay.\nСоздаёт PENDING-счёт и возвращает реквизиты + назначение платежа.\nПосле поступления оплаты админ помечает подписку оплаченной (/admin/subscriptions/{id}/mark-paid).","operationId":"checkout_manual_billing_checkout_manual_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/erip/payment":{"post":{"tags":["webhooks"],"summary":"Erip Payment Webhook","description":"Webhook от БМРЦ о факте оплаты через ЕРИП.\n\nPayload:\n{\n  \"invoice_id\": \"uuid-from-our-db\",\n  \"account_number\": \"VA...\",\n  \"amount\": 29900,         // копейки\n  \"currency\": \"BYN\",\n  \"paid_at\": \"2026-06-03T12:30:00Z\",\n  \"transaction_id\": \"TXN-67890\"\n}","operationId":"erip_payment_webhook_webhooks_erip_payment_post","parameters":[{"name":"X-Signature","in":"header","required":false,"schema":{"type":"string","title":"X-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/webpay/notify":{"post":{"tags":["webhooks"],"summary":"Webpay Notify Webhook","description":"WEBPAY server-to-server уведомление о факте оплаты картой.\n\nForm-data:\n    wsb_order_num=SUB-{subscription_uuid}-{ts}\n    wsb_signature=abc...\n    wsb_status=Approved\n    wsb_total=299.00\n    wsb_transaction_id=...","operationId":"webpay_notify_webhook_webhooks_webpay_notify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/paddle/event":{"post":{"tags":["webhooks"],"summary":"Paddle Event Webhook","description":"Webhook от Paddle обо всех событиях подписки.\n\nEvents:\n  - transaction.completed\n  - subscription.created\n  - subscription.updated (renewal)\n  - subscription.canceled\n  - subscription.past_due","operationId":"paddle_event_webhook_webhooks_paddle_event_post","parameters":[{"name":"Paddle-Signature","in":"header","required":false,"schema":{"type":"string","title":"Paddle-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/bitrix24/event":{"post":{"tags":["webhooks"],"summary":"Bitrix24 Event Webhook","description":"Webhook от Bitrix24 о событиях с лидами/сделками.\n\nПодписываемся через crm.lead.* / crm.deal.* события в самом Bitrix24.\n\nPayload (form-data):\n    event=ONCRMDEALUPDATE\n    data[FIELDS][ID]=12345\n    ts=1717420000\n    auth[application_token]=...","operationId":"bitrix24_event_webhook_webhooks_bitrix24_event_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/meta/lead":{"post":{"tags":["webhooks"],"summary":"Meta Lead Webhook","description":"Webhook от Meta о новом лиде из Facebook/Instagram Lead Form («обратные формы»).\n\nПоток: Meta шлёт leadgen_id → по page_id находим клиента (его Meta-подключение) →\nчерез page-токен тянем поля формы → создаём Lead. Push в Bitrix24 если подключён.\nДокументация: https://developers.facebook.com/docs/marketing-api/guides/lead-ads/retrieving","operationId":"meta_lead_webhook_webhooks_meta_lead_post","parameters":[{"name":"X-Hub-Signature-256","in":"header","required":false,"schema":{"type":"string","title":"X-Hub-Signature-256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"Meta Lead Verification","description":"Meta verification challenge при настройке webhook'а.\n\nMeta делает GET с verify_token — мы должны вернуть hub_challenge\nесли token совпадает с тем что мы указали при настройке.","operationId":"meta_lead_verification_webhooks_meta_lead_get","parameters":[{"name":"hub_mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub Mode"}},{"name":"hub_verify_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub Verify Token"}},{"name":"hub_challenge","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub Challenge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/inbound/lead/{client_id}/{token}":{"post":{"tags":["webhooks"],"summary":"Inbound Lead Webhook","description":"Единая точка приёма лида: наша форма, Make/n8n, TikTok Lead Gen, любой webhook.\nЗащита — секретный per-client токен (HMAC от client_id, без хранения в БД).\nТело — произвольный JSON (нормализуем поля name/phone/email/message/utm/*clid).\nДоставка: Lead в воронку + Telegram владельцу + Bitrix (со сквозным id), дедуп по platform_ref.","operationId":"inbound_lead_webhook_webhooks_inbound_lead__client_id___token__post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/telegram/{secret}":{"post":{"tags":["webhooks"],"summary":"Telegram Webhook","description":"Webhook от Telegram о сообщениях в нашего бота.\n\nИспользуется для:\n  - Подключение клиента (start с токеном)\n  - Команды /status, /help\n  - Inline-кнопки в наших уведомлениях","operationId":"telegram_webhook_webhooks_telegram__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}},{"name":"X-Telegram-Bot-Api-Secret-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Telegram-Bot-Api-Secret-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/db":{"get":{"tags":["health"],"summary":"Health Db","description":"Проверка PostgreSQL.","operationId":"health_db_health_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentHealth"}}}}}}},"/health/redis":{"get":{"tags":["health"],"summary":"Health Redis","description":"Проверка Redis.","operationId":"health_redis_health_redis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentHealth"}}}}}}},"/health/external":{"get":{"tags":["health"],"summary":"Health External","description":"Проверка доступности всех внешних API.","operationId":"health_external_health_external_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/detailed":{"get":{"tags":["health"],"summary":"Health Detailed","description":"Полный health-check всех компонентов.","operationId":"health_detailed_health_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedHealth"}}}}}}},"/admin/notifications":{"get":{"tags":["admin"],"summary":"Admin Notifications","description":"Счётчики для индикаторов в сайдбаре: новые регистрации (пользователи/клиенты с\nмомента последнего просмотра) + новые обращения в поддержку. Горят, пока админ\nне откроет соответствующий раздел (см. /notifications/seen).","operationId":"admin_notifications_admin_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/notifications/seen":{"post":{"tags":["admin"],"summary":"Admin Notifications Seen","description":"Отметить регистрации просмотренными (гасит бейдж «новые»).","operationId":"admin_notifications_seen_admin_notifications_seen_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"Список всех пользователей.","operationId":"list_users_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"locked_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Locked Only"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response List Users Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"Get User","description":"Детали пользователя.","operationId":"get_user_admin_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Admin Update User","description":"Админ редактирует данные пользователя (имя, телефон, email).","operationId":"admin_update_user_admin_users__user_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete User","description":"Soft-удаление пользователя (через deleted_at).","operationId":"admin_delete_user_admin_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/role":{"patch":{"tags":["admin"],"summary":"Update User Role","description":"Изменить роль пользователя. Только для админов.","operationId":"update_user_role_admin_users__user_id__role_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/lock":{"post":{"tags":["admin"],"summary":"Lock User","description":"Заблокировать пользователя на N часов.","operationId":"lock_user_admin_users__user_id__lock_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/unlock":{"post":{"tags":["admin"],"summary":"Unlock User","description":"Снять блокировку.","operationId":"unlock_user_admin_users__user_id__unlock_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clients":{"get":{"tags":["admin"],"summary":"Admin List Clients","description":"Все клиенты-бизнесы на платформе.","operationId":"admin_list_clients_admin_clients_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"niche","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/integrations/overview":{"get":{"tags":["admin"],"summary":"Admin Integrations Overview","description":"Сводка интеграций ПО ВСЕМ клиентам — админ как звено между клиентами.\nBulk-загрузка (без N+1): для каждого клиента флаги Google/Yandex/GTM/GA4/Метрика/Meta/CRM.","operationId":"admin_integrations_overview_admin_integrations_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/subscriptions":{"get":{"tags":["admin"],"summary":"Admin List Subscriptions","description":"Все подписки на платформе.","operationId":"admin_list_subscriptions_admin_subscriptions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Subscription","description":"Админ создаёт подписку вручную для клиента (триал или платная).","operationId":"admin_create_subscription_admin_subscriptions_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"tags":["admin"],"summary":"Platform Stats","description":"Общая статистика платформы.","operationId":"platform_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformStats"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/analytics/overview":{"get":{"tags":["admin"],"summary":"Admin Analytics Overview","description":"Кросс-клиентская аналитика — админ как звено между клиентами.\nПо каждому клиенту: сессии, лиды, квалифицированы, продажи, выручка + агрегаты.\nBulk без N+1: всего 3 запроса (клиенты, лиды-агрегаты по всем, сессии по всем).","operationId":"admin_analytics_overview_admin_analytics_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/campaigns/overview":{"get":{"tags":["admin"],"summary":"Admin Campaigns Overview","description":"Все рекламные кампании по всем клиентам + статистика за период.\nВозвращает плоский список (клиент, ниша, платформа, статус, даты, показы/клики/расход/конверсии);\nфильтр по платформе и группировку (ниша/платформа/статус) делает фронт. Bulk без N+1 (2 запроса).","operationId":"admin_campaigns_overview_admin_campaigns_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/google-ads/pending":{"get":{"tags":["admin"],"summary":"Google Ads Pending","description":"Заявки клиентов на подключение Google Ads — ждут MCC-приглашения\n(invitation_status=PENDING). Дашборд админа подсвечивает их количество.","operationId":"google_ads_pending_admin_google_ads_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GoogleAdsPendingOut"},"type":"array","title":"Response Google Ads Pending Admin Google Ads Pending Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/google-ads/{connection_id}/mark-invited":{"post":{"tags":["admin"],"summary":"Google Ads Mark Invited","description":"Отметить, что MCC-приглашение отправлено (вручную из кабинета MCC).","operationId":"google_ads_mark_invited_admin_google_ads__connection_id__mark_invited_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/google-ads/{connection_id}/confirm-active":{"post":{"tags":["admin"],"summary":"Google Ads Confirm Active","description":"Вручную подтвердить, что клиент принял MCC-приглашение и аккаунт активен.\nФолбэк, когда авто-проверка через Google API недоступна. Кабинет клиента\nпосле этого показывает «Подключено».","operationId":"google_ads_confirm_active_admin_google_ads__connection_id__confirm_active_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/integrations/pending":{"get":{"tags":["admin"],"summary":"Integrations Pending","description":"Заявки клиентов на подключение GTM/GA4/GSC/Метрики — ждут подтверждения админом.","operationId":"integrations_pending_admin_integrations_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/integrations/{conn_id}/confirm":{"post":{"tags":["admin"],"summary":"Integrations Confirm","description":"Подтвердить, что админ проверил доступ и привязал ресурс. Клиент увидит «Подключено».","operationId":"integrations_confirm_admin_integrations__conn_id__confirm_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/reset-password":{"post":{"tags":["admin"],"summary":"Admin Reset Password","description":"Сброс пароля пользователя — генерирует новый случайный пароль и возвращает его.\nАдмин передаёт его пользователю любым безопасным способом.","operationId":"admin_reset_password_admin_users__user_id__reset_password_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/verify-email":{"post":{"tags":["admin"],"summary":"Admin Verify Email","description":"Подтвердить email пользователя вручную.","operationId":"admin_verify_email_admin_users__user_id__verify_email_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/disable-2fa":{"post":{"tags":["admin"],"summary":"Admin Disable 2Fa","description":"Отключить 2FA пользователю (если потерял доступ к authenticator).","operationId":"admin_disable_2fa_admin_users__user_id__disable_2fa_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clients/{client_id}":{"patch":{"tags":["admin"],"summary":"Admin Update Client","description":"Админ редактирует бриф клиента (любые поля).","operationId":"admin_update_client_admin_clients__client_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Client","description":"Soft-удаление клиента.","operationId":"admin_delete_client_admin_clients__client_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads":{"get":{"tags":["admin"],"summary":"Admin List Leads","description":"Все лиды по платформе (для саппорта / аналитики).","operationId":"admin_list_leads_admin_leads_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads/{lead_id}/status":{"patch":{"tags":["admin"],"summary":"Admin Update Lead Status","description":"Админ меняет статус лида. client_id НЕ меняется — лид остаётся за исходным клиентом.","operationId":"admin_update_lead_status_admin_leads__lead_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadStatusUpdateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/subscriptions/{subscription_id}/mark-paid":{"post":{"tags":["admin"],"summary":"Admin Mark Subscription Paid","description":"Подтвердить РУЧНУЮ оплату (банковский перевод поступил) → активировать подписку,\nзаписать платёж (method=MANUAL), послать письмо/Telegram, начислить реферальную награду.","operationId":"admin_mark_subscription_paid_admin_subscriptions__subscription_id__mark_paid_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/subscriptions/{sub_id}":{"patch":{"tags":["admin"],"summary":"Admin Update Subscription","description":"Админ обновляет подписку: меняет тариф, статус, цену, или продлевает на N дней.","operationId":"admin_update_subscription_admin_subscriptions__sub_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/case-drafts":{"get":{"tags":["admin-drafts"],"summary":"List Drafts","description":"Список всех draft-кейсов, отсортированных по дате (новые первыми).","operationId":"list_drafts_admin_case_drafts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CaseDraftSummary"},"type":"array","title":"Response List Drafts Admin Case Drafts Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/case-drafts/{filename}":{"get":{"tags":["admin-drafts"],"summary":"Get Draft","description":"Полный текст draft-кейса для review.","operationId":"get_draft_admin_case_drafts__filename__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseDraftFull"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/case-drafts/{filename}/approve":{"post":{"tags":["admin-drafts"],"summary":"Approve Draft","description":"Одобрить draft.\n\nПосле одобрения статус меняется на 'approved'. Cron-задача (раз в день)\nсобирает все 'approved' кейсы, добавляет в landing/src/data/cases.ts,\nтриггерит rebuild + deploy. См. src/tasks/publish_drafts_task.py.","operationId":"approve_draft_admin_case_drafts__filename__approve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseDraftActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/case-drafts/{filename}/reject":{"post":{"tags":["admin-drafts"],"summary":"Reject Draft","description":"Отклонить draft. Файл удаляется.","operationId":"reject_draft_admin_case_drafts__filename__reject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseDraftActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/case-drafts/generate-now":{"post":{"tags":["admin-drafts"],"summary":"Generate Now","description":"Запустить генерацию draft вручную (не дожидаясь cron). Полезно для тестирования.","operationId":"generate_now_admin_case_drafts_generate_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseDraftActionResult"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/case-drafts/generate-custom":{"post":{"tags":["admin-drafts"],"summary":"Generate Custom","description":"Сгенерировать draft под кастомные параметры:\n- niche + city + slug — обязательные\n- description — краткое описание клиента/проекта (опционально)\n- extra_prompt — дополнительные инструкции для AI (опционально)","operationId":"generate_custom_admin_case_drafts_generate_custom_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseDraftActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/ai-chat":{"post":{"tags":["admin-ai","admin-ai"],"summary":"Admin Ai Chat","description":"Чат админа с AI-ассистентом, scoped к конкретному клиенту.","operationId":"admin_ai_chat_admin_ai_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/clients/{client_id}/integrations":{"get":{"tags":["admin-ai","admin-ai"],"summary":"Admin List Client Integrations","description":"Список всех интеграций клиента — для админа без обхода кабинета клиента.","operationId":"admin_list_client_integrations_admin_clients__client_id__integrations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/rules":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Rules","operationId":"list_rules_kb_rules_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/KbPlatform"},{"type":"null"}],"title":"Platform"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/KbRuleTopic"},{"type":"null"}],"title":"Topic"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Search"}},{"name":"only_active","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Active"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RuleOut"},"title":"Response List Rules Kb Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Create Rule","operationId":"create_rule_kb_rules_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/rules/{rule_id}":{"patch":{"tags":["knowledge-base","knowledge-base"],"summary":"Update Rule","operationId":"update_rule_kb_rules__rule_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["knowledge-base","knowledge-base"],"summary":"Delete Rule","operationId":"delete_rule_kb_rules__rule_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/benchmarks":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Benchmarks","operationId":"list_benchmarks_kb_benchmarks_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"niche","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"}},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/KbPlatform"},{"type":"null"}],"title":"Channel"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/BenchmarkMetric"},{"type":"null"}],"title":"Metric"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkOut"},"title":"Response List Benchmarks Kb Benchmarks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Create Benchmark","operationId":"create_benchmark_kb_benchmarks_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/articles":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Articles","operationId":"list_articles_kb_articles_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ArticleType"},{"type":"null"}],"title":"Type"}},{"name":"niche","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/KbPlatform"},{"type":"null"}],"title":"Platform"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/src__routes__kb__ArticleOut"},"title":"Response List Articles Kb Articles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Create Article","operationId":"create_article_kb_articles_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__routes__kb__ArticleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/articles/{article_id}":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"Get Article","operationId":"get_article_kb_articles__article_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleFull"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/client-notes/{client_id}":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Notes","operationId":"list_notes_kb_client_notes__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/NoteKind"},{"type":"null"}],"title":"Kind"}},{"name":"only_pinned","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Pinned"}},{"name":"only_open","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Open"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteOut"},"title":"Response List Notes Kb Client Notes  Client Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Create Note","operationId":"create_note_kb_client_notes__client_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/client-notes/{note_id}":{"patch":{"tags":["knowledge-base","knowledge-base"],"summary":"Update Note","operationId":"update_note_kb_client_notes__note_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["knowledge-base","knowledge-base"],"summary":"Delete Note","operationId":"delete_note_kb_client_notes__note_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/recommendations/{client_id}":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Recommendations","operationId":"list_recommendations_kb_recommendations__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RecommendationStatus"},{"type":"null"}],"title":"Status Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecommendationOut"},"title":"Response List Recommendations Kb Recommendations  Client Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/recommendations/{rec_id}/react":{"post":{"tags":["knowledge-base","knowledge-base"],"summary":"React To Recommendation","operationId":"react_to_recommendation_kb_recommendations__rec_id__react_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rec_id","in":"path","required":true,"schema":{"type":"string","title":"Rec Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationReaction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/recommendations/my/latest":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"My Latest Recommendations","description":"Свежие рекомендации для клиента-владельца.\nИспользуется виджетом на дашборде /app.\nВозвращает только status='shown' + метаданные «обновлено N часов назад / следующий анализ через X».","operationId":"my_latest_recommendations_kb_recommendations_my_latest_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/recommendations/regenerate/{client_id}":{"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Admin Regenerate Recommendations","description":"Запуск пересчёта рекомендаций для клиента вручную (через Celery).","operationId":"admin_regenerate_recommendations_kb_recommendations_regenerate__client_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/summary":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"Kb Summary","description":"Сводка: сколько чего в базе — для дашборда админа.","operationId":"kb_summary_kb_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/referrals/my":{"get":{"tags":["referrals","referrals"],"summary":"My Referrals","description":"Реф-код, ссылка и статистика для кабинета клиента.","operationId":"my_referrals_referrals_my_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralStats"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/referrals/my/list":{"get":{"tags":["referrals","referrals"],"summary":"My Referral List","description":"Список приглашённых (email маскируется — ПДн).","operationId":"my_referral_list_referrals_my_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReferralListItem"},"type":"array","title":"Response My Referral List Referrals My List Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/deploy/yandex/{client_id}/plan":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Yandex Deploy Plan","description":"Построить план кампании (dry run) — для просмотра перед запуском.","operationId":"yandex_deploy_plan_admin_deploy_yandex__client_id__plan_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deploy/yandex/{client_id}/execute":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Yandex Deploy Execute","description":"РЕАЛЬНЫЙ деплой кампании в Яндекс.Директ.\nВызывается только после просмотра плана админом.","operationId":"yandex_deploy_execute_admin_deploy_yandex__client_id__execute_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deploy/google/{client_id}/plan":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Google Deploy Plan","description":"План Google-кампании (dry run) с RSA-текстами.","operationId":"google_deploy_plan_admin_deploy_google__client_id__plan_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deploy/google/{client_id}/execute":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Google Deploy Execute","description":"РЕАЛЬНЫЙ деплой в Google Ads (создаётся PAUSED). Требует Developer Token.","operationId":"google_deploy_execute_admin_deploy_google__client_id__execute_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deploy/google/{client_id}/pull-stats":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Google Pull Stats Now","description":"Подтянуть статистику Google Ads сейчас.","operationId":"google_pull_stats_now_admin_deploy_google__client_id__pull_stats_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deploy/yandex/{client_id}/pull-stats":{"post":{"tags":["admin-deploy","admin-deploy"],"summary":"Yandex Pull Stats Now","description":"Подтянуть статистику Директа для клиента прямо сейчас (вне расписания).","operationId":"yandex_pull_stats_now_admin_deploy_yandex__client_id__pull_stats_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects":{"post":{"tags":["seo"],"summary":"Create Project","description":"Создать новый SEO-проект (после регистрации клиента или upsell).","operationId":"create_project_seo_projects_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"List Projects","description":"Список SEO-проектов клиента.","operationId":"list_projects_seo_projects_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeoProjectOut"},"title":"Response List Projects Seo Projects Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects/{project_id}":{"get":{"tags":["seo"],"summary":"Get Project","description":"Один проект.","operationId":"get_project_seo_projects__project_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects/{project_id}/plan":{"get":{"tags":["seo"],"summary":"Get Plan","description":"30-дневный план статей.","operationId":"get_plan_seo_projects__project_id__plan_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ArticlePlanOut"},"title":"Response Get Plan Seo Projects  Project Id  Plan Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects/{project_id}/articles":{"get":{"tags":["seo"],"summary":"List Articles","description":"Список опубликованных статей.","operationId":"list_articles_seo_projects__project_id__articles_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/src__routes__seo__ArticleOut"},"title":"Response List Articles Seo Projects  Project Id  Articles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects/{project_id}/wordpress":{"post":{"tags":["seo"],"summary":"Connect Wordpress","description":"Подключить WordPress к проекту: проверить креды, зашифровать, сохранить.","operationId":"connect_wordpress_seo_projects__project_id__wordpress_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WordPressConnectionInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/audit":{"post":{"tags":["seo"],"summary":"Run Audit","description":"SEO-аудит сайта. Базовый блок — on-page проверки (наш сервер качает страницу и\nразбирает теги, всегда работает). Скорость/Lighthouse — через PageSpeed, только\nесли задан ключ (без ключа PSI упирается в нулевую квоту → аудит «не работал»).\nРезультат кэшируется 1ч.","operationId":"run_audit_seo_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/seo/sites":{"get":{"tags":["seo"],"summary":"Available Sites","description":"Список сайтов клиента для выбора в аудите/новом проекте — чтобы не вводить URL руками.\nИсточник: website_url из бизнес-профиля клиента + домены уже заведённых SEO-проектов.","operationId":"available_sites_seo_sites_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo/projects/{project_id}/build-plan":{"post":{"tags":["seo"],"summary":"Build Plan Now","description":"Запустить AI-генерацию 30-дневного плана статей (фоном). Идемпотентно по статусу.","operationId":"build_plan_now_seo_projects__project_id__build_plan_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/utils/rates":{"get":{"tags":["utils"],"summary":"Get Currency Rates","description":"Курсы валют от НБРБ для конвертации в кабинете клиента.\n\nКэширует на 6 часов (НБРБ обновляет раз в день).\nВозвращает курсы относительно BYN.","operationId":"get_currency_rates_utils_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatesResponse"}}}}}}},"/utils/convert":{"post":{"tags":["utils"],"summary":"Convert Amount","description":"Конвертирует сумму в BYN в указанную валюту по курсу НБРБ.","operationId":"convert_amount_utils_convert_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/today":{"get":{"tags":["dashboard"],"summary":"Dashboard Today","description":"Метрики кабинета за выбранный период (days: 7/30/90 — селектор периода).\nCPL/ROAS/бюджет считаются из реальных агрегатов кампаний; пока данных нет\n(нет открученной статистики) — честное «—», не выдумываем.","operationId":"dashboard_today_dashboard_today_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardMetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/ai-activity":{"get":{"tags":["dashboard"],"summary":"Dashboard Ai Activity","description":"Что AI сделал за последние N дней — РЕАЛЬНЫЕ рекомендации от\nConversionAnalystAgent на основе данных клиента.\n\nЕсли ANTHROPIC_API_KEY не настроен — fallback на статичные примеры.","operationId":"dashboard_ai_activity_dashboard_ai_activity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":1,"title":"Days"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AiActivity"},"title":"Response Dashboard Ai Activity Dashboard Ai Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/analytics":{"get":{"tags":["dashboard"],"summary":"Dashboard Analytics","description":"Сквозная воронка жизненного цикла + выручка на данных трекера и лидов.\nСессии → заявки(формы) → лиды → квалифицированы → продажи + выручка BYN.\nПериод — пресет `days` ИЛИ произвольный диапазон start..end (YYYY-MM-DD).","operationId":"dashboard_analytics_dashboard_analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Start"},"description":"YYYY-MM-DD"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"End"},"description":"YYYY-MM-DD"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/attribution":{"get":{"tags":["dashboard"],"summary":"Dashboard Attribution","description":"Сквозная аналитика «как Roistat»: экономика по КАНАЛАМ и КАМПАНИЯМ, КОГОРТЫ по месяцу\nпривлечения (окупаемость дозревает), юнит-экономика + предельный CPL и дневной тренд.\nПериод — пресет `days` ИЛИ произвольный диапазон start..end (YYYY-MM-DD).","operationId":"dashboard_attribution_dashboard_attribution_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD — начало произвольного диапазона","title":"Start"},"description":"YYYY-MM-DD — начало произвольного диапазона"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD — конец произвольного диапазона","title":"End"},"description":"YYYY-MM-DD — конец произвольного диапазона"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/behavior":{"get":{"tags":["dashboard"],"summary":"Dashboard Behavior","description":"Поведенческий слой сквозной аналитики из трекера: сессии, просмотры, посетители,\nглубина (стр./сессия), вовлечённость (клики), топ страниц, источники трафика, устройства.","operationId":"dashboard_behavior_dashboard_behavior_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Start"},"description":"YYYY-MM-DD"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"End"},"description":"YYYY-MM-DD"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/agent/run/{agent_name}":{"post":{"tags":["dashboard"],"summary":"Run Agent","description":"Ручной запуск AI-агента для клиента.\nДоступные: conversion_analyst, campaign_optimizer","operationId":"run_agent_dashboard_agent_run__agent_name__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/alerts":{"get":{"tags":["dashboard"],"summary":"Dashboard Alerts","description":"Требующие внимания события.\n\nИсточники алертов:\n- Перерасход бюджета\n- Падение CTR/CR\n- Бан объявлений модерацией\n- Истёкший срок подписки\n- Email не подтверждён","operationId":"dashboard_alerts_dashboard_alerts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Alert"},"title":"Response Dashboard Alerts Dashboard Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/widget/{client_id}.js":{"get":{"tags":["tracking"],"summary":"Widget Config Js","description":"JSONP-стиль: отдаём JS, который кладёт конфиг виджета в window.__VA_WIDGET__.\nЧерез <script src> обходим CORS (сайт клиента — чужой домен). Публично, кэш 5 мин.","operationId":"widget_config_js_track_widget__client_id__js_get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/lead":{"post":{"tags":["tracking"],"summary":"Track Lead","description":"Приём заявки из виджета захвата на сайте клиента. Публично, fire-and-forget\n(как /track/event — text/plain без preflight). Honeypot + rate-limit от спама.\nДоставка через единый роутер: Lead + Telegram + Bitrix (со сквозным id).","operationId":"track_lead_track_lead_post","responses":{"204":{"description":"Successful Response"}}}},"/track/ab/{client_id}.js":{"get":{"tags":["tracking"],"summary":"Ab Config Js","description":"JSONP-конфиг активных A/B-экспериментов для сайта клиента (обход CORS, кэш 2 мин).","operationId":"ab_config_js_track_ab__client_id__js_get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/ab-results":{"get":{"tags":["tracking"],"summary":"Ab Results","description":"Результаты A/B-эксперимента по вариантам: посетители, конверсии, конверсия, аплифт.","operationId":"ab_results_track_ab_results_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exp_id","in":"query","required":true,"schema":{"type":"string","title":"Exp Id"}},{"name":"goal","in":"query","required":false,"schema":{"type":"string","default":"form_submit","title":"Goal"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/event":{"post":{"tags":["tracking"],"summary":"Track Event","description":"Приём события от клиентского сниппета. Без авторизации.\n\nТело парсим вручную (любой Content-Type, включая text/plain от sendBeacon),\nчтобы браузер на ЧУЖОМ домене клиента не слал CORS-preflight (OPTIONS) —\nиначе события блокируются. text/plain — «простой» запрос, без preflight.","operationId":"track_event_track_event_post","responses":{"204":{"description":"Successful Response"}}}},"/track/stats/{client_id}":{"get":{"tags":["tracking"],"summary":"Get Stats","description":"Аналитика для конкретного клиента. Видит только владелец или админ/саппорт.","operationId":"get_stats_track_stats__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/health/{client_id}":{"get":{"tags":["tracking"],"summary":"Check Install","description":"Проверка установки сниппета: когда последний раз приходило событие.","operationId":"check_install_track_health__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/sources-funnel/{client_id}":{"get":{"tags":["tracking"],"summary":"Sources Funnel","description":"Сквозная воронка по источникам за 30 дней: визиты → заявки → конверсия,\n+ правило-ориентированная рекомендация по каждому источнику.\nРаботает на данных трекера (без рекламных API).","operationId":"sources_funnel_track_sources_funnel__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/recommendations/{client_id}":{"get":{"tags":["tracking"],"summary":"Get Recommendations","description":"Анализ событий клиента и рекомендации:\n- какие конверсии система автоматически видит\n- какие НЕ видит, но стоит добавить (ручной трекинг)\n- какие страницы выглядят как «goal pages» (спасибо, успех, заказ)","operationId":"get_recommendations_track_recommendations__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/goals/{client_id}":{"get":{"tags":["tracking"],"summary":"List Goals","description":"Список целей клиента + hit_count за 30 дней (считается из tracking_events).","operationId":"list_goals_track_goals__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tracking"],"summary":"Create Goal","description":"Создать цель. Максимум 20 активных. is_primary=true сбрасывает прежнюю главную.","operationId":"create_goal_track_goals__client_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/track/goals/{client_id}/{goal_id}":{"delete":{"tags":["tracking"],"summary":"Delete Goal","description":"Деактивировать цель (мягкое удаление — статистика остаётся).","operationId":"delete_goal_track_goals__client_id___goal_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","title":"Goal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/messages":{"post":{"tags":["support"],"summary":"Create Message","description":"Создать сообщение в админ inbox. Auth = client message. No auth = guest.","operationId":"create_message_support_messages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/my":{"get":{"tags":["support"],"summary":"My Messages","description":"Мои сообщения (клиент видит только свои).","operationId":"my_messages_support_my_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/support/admin/inbox":{"get":{"tags":["support"],"summary":"Admin Inbox","description":"Inbox админа — все сообщения от клиентов.","operationId":"admin_inbox_support_admin_inbox_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/admin/inbox/{msg_id}":{"get":{"tags":["support"],"summary":"Admin Get Message","operationId":"admin_get_message_support_admin_inbox__msg_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["support"],"summary":"Admin Update","description":"Изменить статус/категорию/приоритет.","operationId":"admin_update_support_admin_inbox__msg_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/admin/inbox/{msg_id}/reply":{"post":{"tags":["support"],"summary":"Admin Reply","description":"Ответить на сообщение.","operationId":"admin_reply_support_admin_inbox__msg_id__reply_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/admin/inbox/stats/counts":{"get":{"tags":["support"],"summary":"Admin Inbox Counts","description":"Счётчики для бэйджей: новых, открытых, urgent.","operationId":"admin_inbox_counts_support_admin_inbox_stats_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}}},"components":{"schemas":{"ABExperimentIn":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"enabled":{"type":"boolean","title":"Enabled","default":true},"selector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selector"},"variant_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant B"},"split":{"type":"integer","title":"Split","default":50},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal"}},"type":"object","title":"ABExperimentIn"},"ABListIn":{"properties":{"experiments":{"items":{"$ref":"#/components/schemas/ABExperimentIn"},"type":"array","title":"Experiments","default":[]}},"type":"object","title":"ABListIn"},"AIChatRequest":{"properties":{"client_id":{"type":"string","maxLength":64,"minLength":8,"title":"Client Id"},"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"},"history":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","maxItems":12,"title":"History"}},"type":"object","required":["client_id","message"],"title":"AIChatRequest"},"AiActivity":{"properties":{"action":{"type":"string","title":"Action"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["action"],"title":"AiActivity"},"Alert":{"properties":{"level":{"type":"string","title":"Level"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"cta_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Url"}},"type":"object","required":["level","title","body"],"title":"Alert"},"AmoCRMConnectRequest":{"properties":{"subdomain":{"type":"string","title":"Subdomain"},"access_token":{"type":"string","title":"Access Token"}},"type":"object","required":["subdomain","access_token"],"title":"AmoCRMConnectRequest"},"AnalyticsConnectRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"account_id":{"type":"string","title":"Account Id"},"api_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Secret"}},"type":"object","required":["platform","account_id"],"title":"AnalyticsConnectRequest"},"ArticleFull":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"niche":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"is_public":{"type":"boolean","title":"Is Public"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"body":{"type":"string","title":"Body"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["id","type","title","tags","is_public","body"],"title":"ArticleFull"},"ArticleIn":{"properties":{"type":{"$ref":"#/components/schemas/ArticleType"},"title":{"type":"string","maxLength":300,"title":"Title"},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Summary"},"body":{"type":"string","maxLength":80000,"title":"Body"},"niche":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Niche"},"platform":{"anyOf":[{"$ref":"#/components/schemas/KbPlatform"},{"type":"null"}]},"tags":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Tags"},"author":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Author"},"source_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Source Url"},"is_public":{"type":"boolean","title":"Is Public","default":false}},"type":"object","required":["type","title","body"],"title":"ArticleIn"},"ArticlePlanOut":{"properties":{"id":{"type":"string","title":"Id"},"scheduled_for":{"type":"string","format":"date","title":"Scheduled For"},"title":{"type":"string","title":"Title"},"target_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Keywords"},"word_count_target":{"type":"integer","title":"Word Count Target"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","scheduled_for","title","target_keywords","word_count_target","status"],"title":"ArticlePlanOut"},"ArticleType":{"type":"string","enum":["case_study","audit","guide","news","platform_update","prompt_template"],"title":"ArticleType"},"AuditInput":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"strategy":{"type":"string","pattern":"^(mobile|desktop)$","title":"Strategy","default":"mobile"}},"type":"object","required":["url"],"title":"AuditInput"},"AvatarRequest":{"properties":{"avatar":{"type":"string","maxLength":500000,"minLength":10,"title":"Avatar"}},"type":"object","required":["avatar"],"title":"AvatarRequest"},"BenchmarkIn":{"properties":{"niche":{"type":"string","maxLength":120,"title":"Niche"},"channel":{"$ref":"#/components/schemas/KbPlatform"},"city":{"type":"string","maxLength":80,"title":"City","default":"РБ"},"metric":{"$ref":"#/components/schemas/BenchmarkMetric"},"value_low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Low"},"value_med":{"type":"number","title":"Value Med"},"value_high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value High"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"BYN"},"sample_size":{"type":"integer","minimum":0.0,"title":"Sample Size","default":0},"source":{"$ref":"#/components/schemas/BenchmarkSource"},"notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Notes"}},"type":"object","required":["niche","channel","metric","value_med","source"],"title":"BenchmarkIn"},"BenchmarkMetric":{"type":"string","enum":["cpc","cpm","cr","cpl","ctr","cpa","budget_min","budget_typical"],"title":"BenchmarkMetric"},"BenchmarkOut":{"properties":{"id":{"type":"string","title":"Id"},"niche":{"type":"string","title":"Niche"},"channel":{"type":"string","title":"Channel"},"city":{"type":"string","title":"City"},"metric":{"type":"string","title":"Metric"},"value_low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Low"},"value_med":{"type":"number","title":"Value Med"},"value_high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value High"},"currency":{"type":"string","title":"Currency"},"sample_size":{"type":"integer","title":"Sample Size"},"source":{"type":"string","title":"Source"},"is_draft":{"type":"boolean","title":"Is Draft"}},"type":"object","required":["id","niche","channel","city","metric","value_med","currency","sample_size","source","is_draft"],"title":"BenchmarkOut"},"BenchmarkSource":{"type":"string","enum":["internal","openweb","manual","platform_official"],"title":"BenchmarkSource"},"Bitrix24ConnectRequest":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url"}},"type":"object","required":["webhook_url"],"title":"Bitrix24ConnectRequest"},"CampaignOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"platform":{"type":"string","title":"Platform"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"daily_budget_byn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Daily Budget Byn"},"bidding_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bidding Strategy"},"target_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Locations"},"impressions_total":{"type":"integer","title":"Impressions Total"},"clicks_total":{"type":"integer","title":"Clicks Total"},"cost_total_byn":{"type":"number","title":"Cost Total Byn"},"conversions_total":{"type":"integer","title":"Conversions Total"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","client_id","platform","name","status","impressions_total","clicks_total","cost_total_byn","conversions_total","created_at"],"title":"CampaignOut"},"CampaignStatusUpdate":{"properties":{"status":{"type":"string","title":"Status","description":"active | paused | archived"}},"type":"object","required":["status"],"title":"CampaignStatusUpdate","description":"Изменение статуса кампании (пауза/запуск/архив)."},"CaseDraftActionResult":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"CaseDraftActionResult"},"CaseDraftFull":{"properties":{"filename":{"type":"string","title":"Filename"},"slug":{"type":"string","title":"Slug"},"niche":{"type":"string","title":"Niche"},"city":{"type":"string","title":"City"},"generated_at":{"type":"string","title":"Generated At"},"status":{"type":"string","title":"Status"},"model":{"type":"string","title":"Model"},"raw_code_preview":{"type":"string","title":"Raw Code Preview"},"raw_code":{"type":"string","title":"Raw Code"}},"type":"object","required":["filename","slug","niche","city","generated_at","status","model","raw_code_preview","raw_code"],"title":"CaseDraftFull"},"CaseDraftSummary":{"properties":{"filename":{"type":"string","title":"Filename"},"slug":{"type":"string","title":"Slug"},"niche":{"type":"string","title":"Niche"},"city":{"type":"string","title":"City"},"generated_at":{"type":"string","title":"Generated At"},"status":{"type":"string","title":"Status"},"model":{"type":"string","title":"Model"},"raw_code_preview":{"type":"string","title":"Raw Code Preview"}},"type":"object","required":["filename","slug","niche","city","generated_at","status","model","raw_code_preview"],"title":"CaseDraftSummary"},"ChangeTierRequest":{"properties":{"new_tier":{"type":"string","title":"New Tier"},"channels_count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Channels Count","default":1}},"type":"object","required":["new_tier"],"title":"ChangeTierRequest"},"ChatMessage":{"properties":{"role":{"type":"string","pattern":"^(user|assistant)$","title":"Role"},"content":{"type":"string","maxLength":4000,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"CheckoutResponse":{"properties":{"payment_method":{"type":"string","title":"Payment Method"},"invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Id"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"payment_form":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Payment Form"},"payment_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Instructions"},"amount_byn":{"type":"number","title":"Amount Byn"}},"type":"object","required":["payment_method","amount_byn"],"title":"CheckoutResponse","description":"Ответ при инициации оплаты."},"ClientCreate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name"},"legal_form":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Legal Form"},"unp":{"anyOf":[{"type":"string","maxLength":20,"pattern":"^[A-Z]{0,2}\\d{7,9}$|^\\d{9}$"},{"type":"null"}],"title":"Unp"},"legal_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Address"},"contact_email":{"type":"string","format":"email","title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Contact Phone"},"niche":{"type":"string","maxLength":50,"title":"Niche","examples":["remont_kvartir","internet_magazin_shin"]},"niche_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche Description"},"target_cities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Cities","examples":[["Минск","Гомель"]]},"services":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Services","examples":[["под ключ","косметический"]]},"main_competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Main Competitors"},"website_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Website Url"}},"type":"object","required":["contact_email","niche"],"title":"ClientCreate","description":"Создание клиента (после оплаты подписки)."},"ClientOut":{"properties":{"id":{"type":"string","title":"Id"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Form"},"unp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unp"},"contact_email":{"type":"string","title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"niche":{"type":"string","title":"Niche"},"niche_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche Description"},"target_cities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Cities"},"services":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Services"},"main_competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Main Competitors"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"campaign_goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Goal"},"target_cpl_byn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Cpl Byn"},"monthly_budget_byn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget Byn"},"qualified_lead_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualified Lead Criteria"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","contact_email","niche","created_at"],"title":"ClientOut","description":"Информация о клиенте для API."},"ClientUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name"},"legal_form":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Legal Form"},"unp":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Unp"},"legal_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Address"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"niche_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche Description"},"target_cities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Cities"},"services":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Services"},"main_competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Main Competitors"},"website_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Website Url"},"campaign_goal":{"anyOf":[{"type":"string","pattern":"^(leads|calls|messengers|sales)$"},{"type":"null"}],"title":"Campaign Goal"},"target_cpl_byn":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Target Cpl Byn"},"monthly_budget_byn":{"anyOf":[{"type":"number","maximum":200000.0,"minimum":30.0},{"type":"null"}],"title":"Monthly Budget Byn"},"qualified_lead_criteria":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Qualified Lead Criteria"}},"type":"object","title":"ClientUpdate","description":"Обновление клиента."},"ClientUpdateAdmin":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name"},"niche":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Niche"},"niche_description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Niche Description"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Contact Phone"},"website_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Website Url"},"target_cities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Cities"},"services":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Services"},"main_competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Main Competitors"},"unp":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Unp"},"legal_form":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Legal Form"},"legal_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Legal Address"}},"type":"object","title":"ClientUpdateAdmin"},"ComponentHealth":{"properties":{"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["name","status"],"title":"ComponentHealth"},"ConvertRequest":{"properties":{"amount_byn":{"type":"number","title":"Amount Byn"},"target_currency":{"type":"string","title":"Target Currency"}},"type":"object","required":["amount_byn","target_currency"],"title":"ConvertRequest"},"ConvertResponse":{"properties":{"amount_byn":{"type":"number","title":"Amount Byn"},"amount_target":{"type":"number","title":"Amount Target"},"target_currency":{"type":"string","title":"Target Currency"},"rate":{"type":"number","title":"Rate"},"rate_date":{"type":"string","title":"Rate Date"}},"type":"object","required":["amount_byn","amount_target","target_currency","rate","rate_date"],"title":"ConvertResponse"},"CreativeRequest":{"properties":{"kind":{"type":"string","title":"Kind","description":"image | video","default":"image"},"format":{"type":"string","title":"Format","description":"square | story | landscape","default":"square"},"count":{"type":"integer","maximum":6.0,"minimum":1.0,"title":"Count","default":3},"custom_prompt":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Custom Prompt"},"reference_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reference Url"}},"type":"object","title":"CreativeRequest"},"CustomGenerateRequest":{"properties":{"niche":{"type":"string","title":"Niche"},"city":{"type":"string","title":"City","default":"Минск"},"slug":{"type":"string","title":"Slug"},"extra_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Prompt"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["niche","slug"],"title":"CustomGenerateRequest"},"DashboardMetrics":{"properties":{"leads_week":{"type":"integer","title":"Leads Week"},"leads_change":{"type":"string","title":"Leads Change"},"cpl":{"type":"string","title":"Cpl"},"roas":{"type":"string","title":"Roas"},"budget":{"type":"string","title":"Budget"},"sparks":{"additionalProperties":{"$ref":"#/components/schemas/SparklineSeries"},"type":"object","title":"Sparks"}},"type":"object","required":["leads_week","leads_change","cpl","roas","budget","sparks"],"title":"DashboardMetrics"},"DeployRequest":{"properties":{"daily_budget_byn":{"type":"number","maximum":2000.0,"minimum":5.0,"title":"Daily Budget Byn","default":20.0},"use_ai_ads":{"type":"boolean","title":"Use Ai Ads","default":true}},"type":"object","title":"DeployRequest"},"DetailedHealth":{"properties":{"overall":{"type":"string","title":"Overall"},"timestamp":{"type":"integer","title":"Timestamp"},"components":{"items":{"$ref":"#/components/schemas/ComponentHealth"},"type":"array","title":"Components"}},"type":"object","required":["overall","timestamp","components"],"title":"DetailedHealth"},"DisableRequest":{"properties":{"password":{"type":"string","title":"Password"},"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"}},"type":"object","required":["password","code"],"title":"DisableRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GoalIn":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"is_primary":{"type":"boolean","title":"Is Primary","default":false}},"type":"object","required":["name","kind"],"title":"GoalIn"},"GoogleAdsPendingOut":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"client_id":{"type":"string","title":"Client Id"},"client_name":{"type":"string","title":"Client Name"},"customer_id_formatted":{"type":"string","title":"Customer Id Formatted"},"invitation_status":{"type":"string","title":"Invitation Status"},"invitation_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Invitation Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["connection_id","client_id","client_name","customer_id_formatted","invitation_status","created_at"],"title":"GoogleAdsPendingOut"},"GoogleCustomerIdRequest":{"properties":{"customer_id":{"type":"string","title":"Customer Id","description":"Google Ads Customer ID (10 цифр, с/без дефисов)"}},"type":"object","required":["customer_id"],"title":"GoogleCustomerIdRequest"},"GoogleInviteRequest":{"properties":{"customer_id":{"type":"string","maxLength":12,"minLength":10,"title":"Customer Id","description":"ID клиентского Google Ads (10 цифр, с/без дефисов)","examples":["123-456-7890","1234567890"]}},"type":"object","required":["customer_id"],"title":"GoogleInviteRequest","description":"Запрос на отправку MCC-приглашения клиенту."},"GoogleInviteResponse":{"properties":{"customer_id":{"type":"string","title":"Customer Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["customer_id","status","message"],"title":"GoogleInviteResponse"},"GtmConnectRequest":{"properties":{"container_id":{"type":"string","title":"Container Id"},"type":{"type":"string","title":"Type","default":"web"}},"type":"object","required":["container_id"],"title":"GtmConnectRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InvoiceCreateRequest":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id"},"payer_name":{"type":"string","maxLength":255,"minLength":2,"title":"Payer Name"},"payer_unp":{"type":"string","pattern":"^[A-Z]{0,2}\\d{7,9}$|^\\d{9}$","title":"Payer Unp"},"payer_address":{"type":"string","title":"Payer Address"},"payer_bank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Bank"},"payer_account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Account"}},"type":"object","required":["subscription_id","payer_name","payer_unp","payer_address"],"title":"InvoiceCreateRequest","description":"Создание счёта для безналичной оплаты юр.лицом."},"InvoiceOut":{"properties":{"id":{"type":"string","title":"Id"},"invoice_number":{"type":"string","title":"Invoice Number"},"invoice_date":{"type":"string","title":"Invoice Date"},"amount_byn":{"type":"number","title":"Amount Byn"},"total_byn":{"type":"number","title":"Total Byn"},"payer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Name"},"payer_unp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Unp"},"payer_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Address"},"payer_bank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Bank"},"payer_account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Account"},"status":{"type":"string","title":"Status"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"act_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Act Pdf Url"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","invoice_number","invoice_date","amount_byn","total_byn","status","created_at"],"title":"InvoiceOut"},"KbConfidence":{"type":"string","enum":["high","medium","low"],"title":"KbConfidence"},"KbPlatform":{"type":"string","enum":["google_ads","yandex_direct","meta_facebook","tiktok_ads","vk_ads","telegram_ads","seo","landing","generic"],"title":"KbPlatform"},"KbRuleTopic":{"type":"string","enum":["format_limit","policy","best_practice","common_mistake","bid_strategy","conversion_tip","quota","pricing"],"title":"KbRuleTopic"},"LeadIngressRequest":{"properties":{"client_id":{"type":"string","title":"Client Id","description":"ID клиента-владельца сайта"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"yclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yclid"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"},"ttclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ttclid"}},"type":"object","required":["client_id"],"title":"LeadIngressRequest","description":"Заявка от формы на сайте клиента (без авторизации)."},"LeadOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"primary_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Channel"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"yclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yclid"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"},"ttclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ttclid"},"status":{"type":"string","title":"Status","default":"new"},"manager_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manager Note"},"status_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Status Changed At"},"crm_deal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Crm Deal Id"},"deal_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Stage"},"deal_value_byn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deal Value Byn"},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","submitted_at","created_at"],"title":"LeadOut"},"LeadStatusUpdate":{"properties":{"status":{"type":"string","pattern":"^(new|in_work|qualified|won|lost|spam)$","title":"Status"},"manager_note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Manager Note"}},"type":"object","required":["status"],"title":"LeadStatusUpdate"},"LeadStatusUpdateAdmin":{"properties":{"status":{"type":"string","pattern":"^(new|in_work|qualified|won|lost|spam)$","title":"Status"},"manager_note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Manager Note"}},"type":"object","required":["status"],"title":"LeadStatusUpdateAdmin"},"LockRequest":{"properties":{"reason":{"type":"string","title":"Reason"},"hours":{"type":"integer","title":"Hours","default":24}},"type":"object","required":["reason"],"title":"LockRequest"},"Login2FARequest":{"properties":{"pre_auth_token":{"type":"string","minLength":10,"title":"Pre Auth Token"},"code":{"type":"string","maxLength":16,"minLength":6,"title":"Code"}},"type":"object","required":["pre_auth_token","code"],"title":"Login2FARequest"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LoginResult":{"properties":{"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"two_factor_required":{"type":"boolean","title":"Two Factor Required","default":false},"pre_auth_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pre Auth Token"}},"type":"object","title":"LoginResult","description":"Результат входа: либо токен, либо требование второго фактора."},"MagicLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"MagicLinkRequest"},"MessageCreate":{"properties":{"subject":{"type":"string","maxLength":255,"title":"Subject"},"body":{"type":"string","maxLength":10000,"title":"Body"},"category":{"type":"string","pattern":"^(general|billing|technical|feature|complaint)$","title":"Category","default":"general"},"priority":{"type":"string","pattern":"^(low|normal|high|urgent)$","title":"Priority","default":"normal"},"guest_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Guest Email"},"guest_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Guest Name"},"guest_phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Guest Phone"}},"type":"object","required":["subject","body"],"title":"MessageCreate"},"MetaConnectRequest":{"properties":{"pixel_id":{"type":"string","title":"Pixel Id","description":"Meta Pixel ID (числовой)"},"capi_token":{"type":"string","title":"Capi Token","description":"Conversions API Access Token"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"ad_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Account Id"}},"type":"object","required":["pixel_id","capi_token"],"title":"MetaConnectRequest"},"NoteIn":{"properties":{"kind":{"$ref":"#/components/schemas/NoteKind","default":"communication"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"body":{"type":"string","maxLength":8000,"title":"Body"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false}},"type":"object","required":["body"],"title":"NoteIn"},"NoteKind":{"type":"string","enum":["communication","internal","decision","issue","resolution"],"title":"NoteKind"},"NoteOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"kind":{"type":"string","title":"Kind"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"type":"string","title":"Body"},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_resolved":{"type":"boolean","title":"Is Resolved"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","client_id","kind","body","is_pinned","is_resolved","created_at","updated_at"],"title":"NoteOut"},"NoteUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Body"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"is_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Resolved"},"kind":{"anyOf":[{"$ref":"#/components/schemas/NoteKind"},{"type":"null"}]}},"type":"object","title":"NoteUpdate"},"OAuthStartResponse":{"properties":{"authorization_url":{"type":"string","title":"Authorization Url"},"state":{"type":"string","title":"State"}},"type":"object","required":["authorization_url","state"],"title":"OAuthStartResponse"},"PlanPreviewRequest":{"properties":{"platform":{"type":"string","title":"Platform","description":"google | yandex","default":"google"},"daily_budget_byn":{"type":"number","maximum":2000.0,"minimum":5.0,"title":"Daily Budget Byn","default":20.0},"use_ai_ads":{"type":"boolean","title":"Use Ai Ads","default":true},"goal":{"anyOf":[{"type":"string","pattern":"^(leads|calls|messengers|sales)$"},{"type":"null"}],"title":"Goal"},"target_cpl_byn":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Target Cpl Byn"},"qualified_lead_criteria":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Qualified Lead Criteria"}},"type":"object","title":"PlanPreviewRequest","description":"Запрос предпросмотра плана кампании клиентом."},"PlatformStats":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"total_clients":{"type":"integer","title":"Total Clients"},"active_subscriptions":{"type":"integer","title":"Active Subscriptions"},"trial_subscriptions":{"type":"integer","title":"Trial Subscriptions"},"total_leads_today":{"type":"integer","title":"Total Leads Today"},"total_leads_this_month":{"type":"integer","title":"Total Leads This Month"},"mrr_byn":{"type":"number","title":"Mrr Byn"}},"type":"object","required":["total_users","total_clients","active_subscriptions","trial_subscriptions","total_leads_today","total_leads_this_month","mrr_byn"],"title":"PlatformStats"},"RateItem":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"rate_byn":{"type":"number","title":"Rate Byn"},"scale":{"type":"integer","title":"Scale","default":1},"date":{"type":"string","title":"Date"}},"type":"object","required":["code","name","rate_byn","date"],"title":"RateItem"},"RatesResponse":{"properties":{"base":{"type":"string","title":"Base","default":"BYN"},"rates":{"items":{"$ref":"#/components/schemas/RateItem"},"type":"array","title":"Rates"},"updated_at":{"type":"string","title":"Updated At"},"source":{"type":"string","title":"Source","default":"НБРБ"}},"type":"object","required":["rates","updated_at"],"title":"RatesResponse"},"RecommendationOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"agent_name":{"type":"string","title":"Agent Name"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"priority":{"type":"string","title":"Priority"},"status":{"type":"string","title":"Status"},"source_rule_ids":{"items":{"type":"string"},"type":"array","title":"Source Rule Ids"},"source_benchmark_ids":{"items":{"type":"string"},"type":"array","title":"Source Benchmark Ids"},"created_at":{"type":"string","title":"Created At"},"reaction_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reaction At"}},"type":"object","required":["id","client_id","agent_name","title","body","priority","status","source_rule_ids","source_benchmark_ids","created_at"],"title":"RecommendationOut"},"RecommendationReaction":{"properties":{"status":{"$ref":"#/components/schemas/RecommendationStatus"},"reaction_note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reaction Note"}},"type":"object","required":["status"],"title":"RecommendationReaction"},"RecommendationStatus":{"type":"string","enum":["shown","accepted","rejected","applied","superseded"],"title":"RecommendationStatus"},"ReferralListItem":{"properties":{"id":{"type":"string","title":"Id"},"referred_email_masked":{"type":"string","title":"Referred Email Masked"},"status":{"type":"string","title":"Status"},"reward_days":{"type":"integer","title":"Reward Days"},"created_at":{"type":"string","title":"Created At"},"converted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Converted At"}},"type":"object","required":["id","referred_email_masked","status","reward_days","created_at"],"title":"ReferralListItem"},"ReferralStats":{"properties":{"code":{"type":"string","title":"Code"},"link":{"type":"string","title":"Link"},"reward_days":{"type":"integer","title":"Reward Days"},"referee_discount_pct":{"type":"integer","title":"Referee Discount Pct"},"total_invited":{"type":"integer","title":"Total Invited"},"converted":{"type":"integer","title":"Converted"},"rewarded":{"type":"integer","title":"Rewarded"},"pending":{"type":"integer","title":"Pending"},"days_earned":{"type":"integer","title":"Days Earned"}},"type":"object","required":["code","link","reward_days","referee_discount_pct","total_invited","converted","rewarded","pending","days_earned"],"title":"ReferralStats"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"ref":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Ref"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"ReplyRequest":{"properties":{"body":{"type":"string","maxLength":10000,"title":"Body"}},"type":"object","required":["body"],"title":"ReplyRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","minLength":10,"title":"Token"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"ResetPasswordResponse":{"properties":{"new_password":{"type":"string","title":"New Password"},"status":{"type":"string","title":"Status","default":"ok"}},"type":"object","required":["new_password"],"title":"ResetPasswordResponse"},"RoleUpdateRequest":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleUpdateRequest"},"RuleIn":{"properties":{"platform":{"$ref":"#/components/schemas/KbPlatform"},"topic":{"$ref":"#/components/schemas/KbRuleTopic"},"title":{"type":"string","maxLength":200,"title":"Title"},"body":{"type":"string","maxLength":10000,"title":"Body"},"example":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Example"},"citation_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Citation Url"},"citation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation Date"},"confidence":{"$ref":"#/components/schemas/KbConfidence","default":"medium"},"tags":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Tags"}},"type":"object","required":["platform","topic","title","body"],"title":"RuleIn"},"RuleOut":{"properties":{"id":{"type":"string","title":"Id"},"platform":{"type":"string","title":"Platform"},"topic":{"type":"string","title":"Topic"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"example":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example"},"citation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation Url"},"citation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation Date"},"confidence":{"type":"string","title":"Confidence"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["id","platform","topic","title","body","confidence","tags"],"title":"RuleOut"},"SeoProjectCreate":{"properties":{"client_id":{"type":"string","title":"Client Id"},"domain":{"type":"string","maxLength":255,"minLength":4,"title":"Domain"},"cms_type":{"type":"string","pattern":"^(wordpress|webflow|astro|tilda|next|manual)$","title":"Cms Type","default":"manual"},"tier":{"type":"string","pattern":"^(start|growth|premium|agency)$","title":"Tier","default":"start"},"target_regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Regions"}},"type":"object","required":["client_id","domain"],"title":"SeoProjectCreate"},"SeoProjectOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"domain":{"type":"string","title":"Domain"},"cms_type":{"type":"string","title":"Cms Type"},"tier":{"type":"string","title":"Tier"},"articles_per_month":{"type":"integer","title":"Articles Per Month"},"status":{"type":"string","title":"Status"},"primary_lang":{"type":"string","title":"Primary Lang"},"target_regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Regions"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","client_id","domain","cms_type","tier","articles_per_month","status","primary_lang","target_regions","created_at"],"title":"SeoProjectOut"},"SetupResponse":{"properties":{"secret":{"type":"string","title":"Secret","description":"Показывается клиенту 1 раз для ручного ввода"},"qr_uri":{"type":"string","title":"Qr Uri","description":"otpauth:// URI для QR-кода"}},"type":"object","required":["secret","qr_uri"],"title":"SetupResponse"},"SparklineSeries":{"properties":{"points":{"items":{"type":"number"},"type":"array","title":"Points"},"trend":{"type":"string","title":"Trend"}},"type":"object","required":["points","trend"],"title":"SparklineSeries"},"SubscribeRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"tier":{"type":"string","title":"Tier","description":"starter | growth | premium | pro"},"channels_count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Channels Count","default":1}},"type":"object","required":["client_id","tier"],"title":"SubscribeRequest"},"SubscriptionCreateRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"tier":{"type":"string","pattern":"^(starter|growth|premium|pro)$","title":"Tier"},"price_byn":{"type":"number","minimum":0.0,"title":"Price Byn"},"days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days","default":30},"as_trial":{"type":"boolean","title":"As Trial","default":false},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["client_id","tier","price_byn"],"title":"SubscriptionCreateRequest"},"SubscriptionOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"price_byn":{"type":"number","title":"Price Byn"},"current_period_start":{"type":"string","format":"date-time","title":"Current Period Start"},"current_period_end":{"type":"string","format":"date-time","title":"Current Period End"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"auto_renew":{"type":"boolean","title":"Auto Renew"}},"type":"object","required":["id","client_id","tier","status","price_byn","current_period_start","current_period_end","auto_renew"],"title":"SubscriptionOut"},"SubscriptionUpdateRequest":{"properties":{"tier":{"anyOf":[{"type":"string","pattern":"^(starter|growth|premium|pro)$"},{"type":"null"}],"title":"Tier"},"status":{"anyOf":[{"type":"string","pattern":"^(trial|active|past_due|cancelled|expired)$"},{"type":"null"}],"title":"Status"},"extend_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Extend Days"},"price_byn":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Byn"}},"type":"object","title":"SubscriptionUpdateRequest"},"TikTokConnectRequest":{"properties":{"pixel_code":{"type":"string","title":"Pixel Code","description":"TikTok Pixel Code"},"access_token":{"type":"string","title":"Access Token","description":"TikTok Events API Access Token"}},"type":"object","required":["pixel_code","access_token"],"title":"TikTokConnectRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse"},"TrackStats":{"properties":{"pageviews_today":{"type":"integer","title":"Pageviews Today"},"pageviews_7d":{"type":"integer","title":"Pageviews 7D"},"pageviews_30d":{"type":"integer","title":"Pageviews 30D"},"sessions_today":{"type":"integer","title":"Sessions Today"},"sessions_7d":{"type":"integer","title":"Sessions 7D"},"form_submits_30d":{"type":"integer","title":"Form Submits 30D"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"top_sources":{"items":{"type":"object"},"type":"array","title":"Top Sources","default":[]},"top_pages":{"items":{"type":"object"},"type":"array","title":"Top Pages","default":[]}},"type":"object","required":["pageviews_today","pageviews_7d","pageviews_30d","sessions_today","sessions_7d","form_submits_30d"],"title":"TrackStats"},"UpdateMessageRequest":{"properties":{"status":{"anyOf":[{"type":"string","pattern":"^(new|open|replied|closed)$"},{"type":"null"}],"title":"Status"},"category":{"anyOf":[{"type":"string","pattern":"^(general|billing|technical|feature|complaint)$"},{"type":"null"}],"title":"Category"},"priority":{"anyOf":[{"type":"string","pattern":"^(low|normal|high|urgent)$"},{"type":"null"}],"title":"Priority"}},"type":"object","title":"UpdateMessageRequest"},"UpdateProfileRequest":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"language":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Language"},"preferred_currency":{"anyOf":[{"type":"string","maxLength":8,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Preferred Currency"}},"type":"object","title":"UpdateProfileRequest"},"UserOut":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"role":{"type":"string","title":"Role"},"email_verified":{"type":"boolean","title":"Email Verified"},"two_factor_enabled":{"type":"boolean","title":"Two Factor Enabled"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","role","email_verified","two_factor_enabled","created_at"],"title":"UserOut","description":"Информация о пользователе для API."},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"role":{"type":"string","title":"Role"},"email_verified":{"type":"boolean","title":"Email Verified"},"two_factor_enabled":{"type":"boolean","title":"Two Factor Enabled","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"avatar_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Data"}},"type":"object","required":["id","email","full_name","role","email_verified","created_at"],"title":"UserResponse"},"UserUpdateAdmin":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UserUpdateAdmin"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCodeRequest":{"properties":{"code":{"type":"string","maxLength":16,"minLength":6,"title":"Code"}},"type":"object","required":["code"],"title":"VerifyCodeRequest"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","minLength":10,"title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VerifySetupRequest":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["code"],"title":"VerifySetupRequest"},"VerifySetupResponse":{"properties":{"status":{"type":"string","title":"Status"},"recovery_codes":{"items":{"type":"string"},"type":"array","title":"Recovery Codes","description":"10 одноразовых кодов — показываются 1 раз"}},"type":"object","required":["status","recovery_codes"],"title":"VerifySetupResponse"},"WidgetConfigIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"button_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Button Text"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"success_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Text"},"messengers":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Messengers"}},"type":"object","title":"WidgetConfigIn"},"WordPressConnectionInput":{"properties":{"wp_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Wp Url"},"wp_user":{"type":"string","maxLength":100,"minLength":1,"title":"Wp User"},"wp_app_password":{"type":"string","minLength":8,"title":"Wp App Password"}},"type":"object","required":["wp_url","wp_user","wp_app_password"],"title":"WordPressConnectionInput"},"src__routes__kb__ArticleOut":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"niche":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"is_public":{"type":"boolean","title":"Is Public"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"}},"type":"object","required":["id","type","title","tags","is_public"],"title":"ArticleOut"},"src__routes__seo__ArticleOut":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"slug":{"type":"string","title":"Slug"},"word_count":{"type":"integer","title":"Word Count"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"cms_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cms Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"generation_cost_usd":{"type":"number","title":"Generation Cost Usd"}},"type":"object","required":["id","title","slug","word_count","cover_image_url","cms_url","published_at","generation_cost_usd"],"title":"ArticleOut"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/auth/login"}}}}}}