{"openapi":"3.1.0","info":{"title":"audit-api","description":"detail.web audit API: движок аудита (SEO/GEO), скоринг, PDF, SaaS-кабинет и биллинг. Endpoint /audit запускает SiteAuditor.","version":"0.1.0"},"paths":{"/audit/estimate":{"post":{"tags":["audit"],"summary":"Пред-оценка размера сайта (по sitemap) перед deep-аудитом","description":"Дешёвая прикидка (1-6 запросов): сколько страниц на сайте по sitemap и хватит ли кредитов на полный обход. Ничего не списывает. Оценка по sitemap может врать — реальный аудит обходит сайт по ссылкам и стопается по бюджету.","operationId":"post_audit_estimate_audit_estimate_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteEstimateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audit":{"post":{"tags":["audit"],"summary":"Аудит одного сайта","description":"Принимает URL и запускает аудит через существующий `SiteAuditor` из `src/`. Возвращает score (0..100, выше = больше проблем = теплее лид), список issues и структурированные signals.","operationId":"post_audit_audit_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditResponse"}}}},"503":{"description":"Сайт недоступен или превышен timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Превышен rate-limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audit/diff":{"post":{"tags":["audit"],"summary":"Дифф аудита: что изменилось с прошлой проверки (PRO)","description":"Прогоняет свежий аудит и сравнивает с предыдущим снапшотом того же URL для владельца ключа: дельта score/health, какие проверки ухудшились/улучшились. Stateful — требует PRO-ключ (без него available=false + upsell).","operationId":"post_audit_diff_audit_diff_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditDiffRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditDiffResponse"}}}},"503":{"description":"Сайт недоступен или timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Превышен rate-limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audit/public":{"post":{"tags":["audit"],"summary":"Публичный аудит (для landing-формы)","description":"Публичный endpoint для лендинг-формы `DETAILWEB/apps/audit-web/`. Вход: URL + опц. email/phone. Выход: score + top-3 точек роста. Полный PDF отдаётся через отдельный email-флоу (после warm-up Brevo). Rate-limit: 3 запроса/IP/24h + 20 запросов/email/24h. Капча (Cloudflare Turnstile) — если TURNSTILE_SECRET задан в .env.","operationId":"post_public_audit_audit_public_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAuditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAuditResponse"}}}},"400":{"description":"Некорректный URL или капча.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-limit (3/IP/24h или 20/email/24h).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Сайт недоступен.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/config":{"get":{"tags":["billing"],"summary":"Состояние биллинга","operationId":"get_billing_config_billing_config_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout":{"post":{"tags":["billing"],"summary":"Создать оплату ЮKassa","operationId":"post_checkout_billing_checkout_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"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/guest-checkout":{"post":{"tags":["billing"],"summary":"Оформление по e-mail без регистрации (создаёт аккаунт)","description":"Гостевая оплата подписки: по e-mail создаём аккаунт (если новый),\nлогиним по выданному JWT и сразу ведём на оплату. Если e-mail уже занят —\n409: фронт предложит войти (оплатить из кабинета).","operationId":"post_guest_checkout_billing_guest_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestCheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/payments":{"get":{"tags":["billing"],"summary":"История платежей","operationId":"list_payments_billing_payments_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PaymentOut"},"title":"Response List Payments Billing Payments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/payments/{external_id}/cancel":{"post":{"tags":["billing"],"summary":"Отменить свой ожидающий платёж","operationId":"cancel_pending_payment_billing_payments__external_id__cancel_post","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Pending Payment Billing Payments  External Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription":{"get":{"tags":["billing"],"summary":"Текущая активная подписка (статус авто-продления)","operationId":"get_subscription_billing_subscription_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionOut"},{"type":"null"}],"title":"Response Get Subscription Billing Subscription Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription/auto-renew":{"post":{"tags":["billing"],"summary":"Включить/выключить авто-продление подписки","operationId":"update_auto_renew_billing_subscription_auto_renew_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRenewUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionOut"},{"type":"null"}],"title":"Response Update Auto Renew Billing Subscription Auto Renew Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/admin/payments":{"get":{"tags":["billing"],"summary":"Все платежи всех пользователей (admin)","operationId":"admin_list_payments_billing_admin_payments_get","parameters":[{"name":"payment_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminPaymentOut"},"title":"Response Admin List Payments Billing Admin Payments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/yookassa/webhook":{"post":{"tags":["billing"],"summary":"Вебхук ЮKassa (публичный)","description":"Принять уведомление ЮKassa. Всегда отвечает 200 (иначе ЮKassa ретраит),\nкроме случая запрещённого IP. Реальная активация — после перепроверки\nстатуса платежа в API ЮKassa (идемпотентно).","operationId":"yookassa_webhook_billing_yookassa_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/lead/audit":{"post":{"tags":["lead"],"summary":"Запустить аудит и вернуть полный SiteAudit","description":"Гоняет аудит сайта движком и возвращает ПОЛНЫЙ сериализованный SiteAudit (SiteAudit.to_dict()), пригодный для сохранения в CRM leadgen. В отличие от публичного `POST /audit` — без gating/тарификации, отдаёт сырые сигналы целиком.","operationId":"post_lead_audit_lead_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lead/enrich":{"post":{"tags":["lead"],"summary":"Обогащение SiteAudit: translated issues + growth opportunities","description":"Принимает сериализованный SiteAudit и возвращает доменное обогащение для холодного письма/PDF: переведённые issue (strict/painful + severity/category) и точки роста (growth opportunities с привязкой к пакетам услуг). Плюс AUDIT_CHECKS_COUNT (число проверок движка). Чистая трансформация.","operationId":"post_lead_enrich_lead_enrich_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lead/offer-packages":{"get":{"tags":["lead"],"summary":"Каталог пакетов услуг (offer packages)","description":"Отдаёт каталог offer-пакетов (id → пакет) из offer_packages.yaml движка.","operationId":"get_offer_packages_lead_offer_packages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferPackagesResponse"}}}}}}},"/pricing/plans":{"get":{"tags":["pricing"],"summary":"Список тарифных планов (заглушка)","operationId":"get_plans_pricing_plans_get","responses":{"501":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/pricing/checkout":{"post":{"tags":["pricing"],"summary":"Создание сессии оплаты (заглушка)","operationId":"post_checkout_pricing_checkout_post","responses":{"501":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/auth/login":{"post":{"tags":["saas-auth"],"summary":"Логин по email+паролю","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/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["saas-auth"],"summary":"Регистрация (Фаза 2)","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"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/me":{"get":{"tags":["saas-auth"],"summary":"Текущий пользователь","operationId":"me_auth_me_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot-password":{"post":{"tags":["saas-auth"],"summary":"Запросить сброс пароля","description":"Отправляет письмо со ссылкой на сброс. Всегда отвечает ok=True, чтобы не\nраскрывать, существует ли аккаунт (защита от перебора e-mail).","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":{"$ref":"#/components/schemas/SimpleOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["saas-auth"],"summary":"Установить новый пароль","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":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites":{"get":{"tags":["saas"],"summary":"Список сайтов","operationId":"list_sites_sites_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(own|all)$","default":"own","title":"Scope"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteOut"},"title":"Response List Sites Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Добавить сайт","operationId":"create_site_sites_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}":{"get":{"tags":["saas"],"summary":"Один сайт","operationId":"get_site_sites__site_id__get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["saas"],"summary":"Изменить сайт","operationId":"update_site_sites__site_id__patch","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas"],"summary":"Удалить сайт","operationId":"delete_site_sites__site_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/estimate":{"get":{"tags":["saas"],"summary":"Пред-оценка размера сайта перед deep-аудитом (по sitemap)","description":"Прикидка перед запуском: сколько страниц на сайте (по sitemap) и хватит ли\nкредитов на полный обход. Ничего не списывает; оценка по sitemap может врать —\nреальный аудит обходит по ссылкам и стопается по бюджету.","operationId":"get_site_estimate_sites__site_id__estimate_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(ru|en)$","default":"ru","title":"Lang"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/runs":{"get":{"tags":["saas"],"summary":"История прогонов сайта","operationId":"site_runs_sites__site_id__runs_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunOut"},"title":"Response Site Runs Sites  Site Id  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas"],"summary":"Очистить всю историю прогонов сайта","description":"Удалить все прогоны сайта одной кнопкой (кроме ещё выполняющихся).","operationId":"clear_site_runs_sites__site_id__runs_delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"integer"},"title":"Response Clear Site Runs Sites  Site Id  Runs Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/diff":{"get":{"tags":["saas"],"summary":"Diff двух последних прогонов","operationId":"site_diff_sites__site_id__diff_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/monitor":{"get":{"tags":["saas"],"summary":"Настройки авто-мониторинга сайта","operationId":"get_monitor_sites__site_id__monitor_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMonitorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["saas"],"summary":"Включить/настроить авто-мониторинг (PRO+)","operationId":"update_monitor_sites__site_id__monitor_put","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMonitorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/ignored-checks":{"get":{"tags":["saas"],"summary":"Игнорируемые проверки сайта","operationId":"get_ignored_checks_sites__site_id__ignored_checks_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnoredChecksOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Игнорировать проверку (скрыть проблему)","operationId":"add_ignored_check_sites__site_id__ignored_checks_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnoreCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnoredChecksOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites/{site_id}/ignored-checks/{check_id}":{"delete":{"tags":["saas"],"summary":"Вернуть проверку (снять игнор)","operationId":"remove_ignored_check_sites__site_id__ignored_checks__check_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnoredChecksOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/groups":{"get":{"tags":["saas"],"summary":"Список групп (папок)","operationId":"list_groups_groups_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupOut"},"title":"Response List Groups Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Создать группу","operationId":"create_group_groups_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/groups/{group_id}":{"patch":{"tags":["saas"],"summary":"Переименовать/перекрасить группу","operationId":"update_group_groups__group_id__patch","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas"],"summary":"Удалить группу (сайты остаются)","operationId":"delete_group_groups__group_id__delete","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits":{"post":{"tags":["saas"],"summary":"Запустить аудит","operationId":"start_audit_audits_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunStartRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["saas"],"summary":"Недавние прогоны","operationId":"list_audits_audits_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(own|all)$","default":"own","title":"Scope"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Фильтр по пользователю (только admin).","title":"User Id"},"description":"Фильтр по пользователю (только admin)."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunOut"},"title":"Response List Audits Audits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/bulk":{"post":{"tags":["saas"],"summary":"Массовый аудит списка доменов (Business+)","description":"Поставить в очередь single-page аудит для списка доменов разом.\n\nКаждый домен проверяется по главной (single-page, без PSI/W3C), тратит обычные\nкредиты (5/сайт) и общий дневной лимит аудитов. Отсутствующие сайты заводятся\nв кабинете (если `create_missing`). Падение по одному домену не валит весь\nбатч — он помечается ошибкой в `items`.","operationId":"start_bulk_audit_audits_bulk_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAuditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/cancel":{"post":{"tags":["saas"],"summary":"Остановить прогон","description":"Остановить выполняющийся аудит и получить результат «как есть».\n\nКооперативная остановка: движок дочитает текущую страницу и выйдет с\nчастичным результатом. Кредиты пересчитываются по факту обойдённого —\nнеизрасходованный резерв возвращается на баланс (см. runner._settle_credits).\nПраво — как на просмотр прогона (владелец/команда/админ).","operationId":"cancel_audit_run_audits__run_uid__cancel_post","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}":{"delete":{"tags":["saas"],"summary":"Удалить прогон","operationId":"delete_audit_run_audits__run_uid__delete","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["saas"],"summary":"Детали прогона","operationId":"get_audit_audits__run_uid__get","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/playbook.md":{"get":{"tags":["saas"],"summary":"Экспорт плана работ «от А до Я» (Markdown)","description":"Markdown-план работ: проблемы аудита по приоритету (эффект ↓, усилия ↑),\nс шагами, сниппетами и способом проверки. Экспорт — фича платных тарифов;\nwhite-label применяется, если владелец сайта на тарифе с white-label.","operationId":"export_playbook_audits__run_uid__playbook_md_get","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"cms","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(wordpress|bitrix|tilda)$"},{"type":"null"}],"description":"CMS для подмешивания инструкций «где кликать».","title":"Cms"},"description":"CMS для подмешивания инструкций «где кликать»."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/recheck":{"post":{"tags":["saas"],"summary":"Точечная перепроверка части прогона (W3C / PSI / чекер)","operationId":"recheck_audit_audits__run_uid__recheck_post","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/stream":{"get":{"tags":["saas"],"summary":"SSE-прогресс прогона","operationId":"stream_audit_audits__run_uid__stream_get","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/share":{"get":{"tags":["saas"],"summary":"Статус публичной ссылки","operationId":"get_share_audits__run_uid__share_get","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Создать публичную ссылку","operationId":"create_share_audits__run_uid__share_post","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas"],"summary":"Отозвать публичную ссылку","operationId":"revoke_share_audits__run_uid__share_delete","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audits/{run_uid}/share/extend":{"post":{"tags":["saas"],"summary":"Продлить публичную ссылку (+30 дней)","operationId":"extend_share_audits__run_uid__share_extend_post","parameters":[{"name":"run_uid","in":"path","required":true,"schema":{"type":"string","title":"Run Uid"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/report/{token}":{"get":{"tags":["saas"],"summary":"Публичный read-only отчёт (без авторизации)","description":"Без авторизации. Отдаёт прогон по токену публичной ссылки, если она жива.\n\nИгнорируемые владельцем проверки вырезаются из раскладки. Истёкшие/отозванные\nссылки → 404 (плюс ленивая чистка просроченных при обращении).","operationId":"public_report_public_report__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account":{"get":{"tags":["saas"],"summary":"Аккаунт и использование","operationId":"get_account_account_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/promo":{"put":{"tags":["saas"],"summary":"Согласие на маркетинговые письма","description":"Подписаться/отписаться от маркетинговых писем из кабинета. Транзакционные\nписьма (оплата, безопасность, мониторинг) приходят всегда, независимо от флага.","operationId":"update_promo_prefs_account_promo_put","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoPrefsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/promo/unsubscribe":{"post":{"tags":["saas"],"summary":"Отписка (one-click, публичная)","description":"One-click отписка (RFC 8058): почтовый клиент POST-ит сюда без участия\nпользователя. Публичный эндпоинт, аутентификация по токену из письма.","operationId":"promo_unsubscribe_post_promo_unsubscribe_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":8,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["saas"],"summary":"Отписка по ссылке (публичная)","description":"Отписка переходом по видимой ссылке из письма (публичный эндпоинт).","operationId":"promo_unsubscribe_get_promo_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":8,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/brand":{"get":{"tags":["saas"],"summary":"White-label профиль отчётов","operationId":"get_brand_account_brand_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportBrandOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["saas"],"summary":"Сохранить white-label профиль","operationId":"update_brand_account_brand_put","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportBrandUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportBrandOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/password":{"post":{"tags":["saas"],"summary":"Сменить/задать пароль","operationId":"change_password_account_password_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/email/request-code":{"post":{"tags":["saas"],"summary":"Запросить код смены email","operationId":"request_email_change_account_email_request_code_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/email/confirm":{"post":{"tags":["saas"],"summary":"Подтвердить смену email","operationId":"confirm_email_change_account_email_confirm_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/api-keys":{"get":{"tags":["saas"],"summary":"Список API-ключей","operationId":"list_api_keys_account_api_keys_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyOut"},"title":"Response List Api Keys Account Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Создать API-ключ (полный ключ виден один раз)","operationId":"create_api_key_account_api_keys_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/api-keys/{key_id}":{"delete":{"tags":["saas"],"summary":"Отозвать API-ключ","operationId":"revoke_api_key_account_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["saas"],"summary":"Список пользователей (admin)","operationId":"admin_list_users_admin_users_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response Admin List Users Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Создать пользователя (admin)","operationId":"admin_create_user_admin_users_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAdminCreate"}}}},"responses":{"201":{"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}":{"patch":{"tags":["saas"],"summary":"Изменить пользователя (admin)","operationId":"admin_update_user_admin_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAdminUpdate"}}}},"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"}}}}}}},"/account/credits/ledger":{"get":{"tags":["saas"],"summary":"История движения кредитов (свои)","operationId":"account_credit_ledger_account_credits_ledger_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditLedgerEntryOut"},"title":"Response Account Credit Ledger Account Credits Ledger Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/credits/ledger":{"get":{"tags":["saas"],"summary":"История движения кредитов пользователя (admin)","operationId":"admin_credit_ledger_admin_users__user_id__credits_ledger_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditLedgerEntryOut"},"title":"Response Admin Credit Ledger Admin Users  User Id  Credits Ledger Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/credits":{"get":{"tags":["saas"],"summary":"Баланс кредитов пользователя (admin)","operationId":"admin_get_credits_admin_users__user_id__credits_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["saas"],"summary":"Задать кредиты пользователя (admin)","operationId":"admin_set_credits_admin_users__user_id__credits_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreditsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/credits/usage":{"get":{"tags":["saas"],"summary":"Сводка расхода кредитов (admin)","description":"Прозрачный учёт кредитов для админа: сколько списано/возвращено/начислено\nпо всем пользователям (или одному), с разбивкой по причинам. Возврат за\nостановленные/неполные аудиты виден отдельной строкой (reason=audit_refund_*).","operationId":"admin_credits_usage_admin_credits_usage_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-граница created_at (включительно).","title":"Since"},"description":"ISO-граница created_at (включительно)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-граница created_at (включительно).","title":"Until"},"description":"ISO-граница created_at (включительно)."},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Фильтр по пользователю (None = все).","title":"User Id"},"description":"Фильтр по пользователю (None = все)."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditUsageSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["saas"],"summary":"Настройки кабинета (admin)","operationId":"admin_get_settings_admin_settings_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["saas"],"summary":"Изменить настройки (admin)","operationId":"admin_update_settings_admin_settings_put","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blacklist":{"get":{"tags":["saas"],"summary":"Чёрный список сайтов (admin)","operationId":"admin_list_blacklist_admin_blacklist_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlacklistEntryOut"},"title":"Response Admin List Blacklist Admin Blacklist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["saas"],"summary":"Добавить домен в чёрный список (admin)","operationId":"admin_add_blacklist_admin_blacklist_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blacklist/{entry_id}":{"delete":{"tags":["saas"],"summary":"Убрать домен из чёрного списка (admin)","operationId":"admin_delete_blacklist_admin_blacklist__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams":{"post":{"tags":["saas-teams"],"summary":"Создать команду","operationId":"create_team_teams_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["saas-teams"],"summary":"Мои команды","operationId":"list_teams_teams_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamOut"},"title":"Response List Teams Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}":{"get":{"tags":["saas-teams"],"summary":"Команда","operationId":"get_team_teams__team_id__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas-teams"],"summary":"Удалить команду (владелец)","operationId":"delete_team_teams__team_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/sites":{"get":{"tags":["saas-teams"],"summary":"Сайты команды","operationId":"team_sites_teams__team_id__sites_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteOut"},"title":"Response Team Sites Teams  Team Id  Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/members":{"get":{"tags":["saas-teams"],"summary":"Участники","operationId":"list_members_teams__team_id__members_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberOut"},"title":"Response List Members Teams  Team Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/members/{member_user_id}":{"patch":{"tags":["saas-teams"],"summary":"Изменить права участника","operationId":"update_member_teams__team_id__members__member_user_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"member_user_id","in":"path","required":true,"schema":{"type":"integer","title":"Member User Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberPermsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["saas-teams"],"summary":"Исключить участника","operationId":"kick_member_teams__team_id__members__member_user_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"member_user_id","in":"path","required":true,"schema":{"type":"integer","title":"Member User Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/members/me":{"delete":{"tags":["saas-teams"],"summary":"Покинуть команду","operationId":"leave_team_teams__team_id__members_me_delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/invites":{"post":{"tags":["saas-teams"],"summary":"Создать приглашение","operationId":"create_invite_teams__team_id__invites_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["saas-teams"],"summary":"Активные приглашения","operationId":"list_invites_teams__team_id__invites_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InviteOut"},"title":"Response List Invites Teams  Team Id  Invites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teams/{team_id}/invites/{invite_id}":{"delete":{"tags":["saas-teams"],"summary":"Отозвать приглашение","operationId":"revoke_invite_teams__team_id__invites__invite_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invites/{token}":{"get":{"tags":["saas-teams"],"summary":"Превью приглашения","operationId":"preview_invite_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePreviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invites/{token}/accept":{"post":{"tags":["saas-teams"],"summary":"Принять приглашение","operationId":"accept_invite_invites__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checks":{"get":{"tags":["tools"],"summary":"Реестр проверок движка (free/pro)","operationId":"get_checks_checks_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(ru|en)$","default":"ru","title":"Lang"}},{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checks/{check_id}":{"get":{"tags":["tools"],"summary":"Подробное объяснение одной проверки (explain_issue)","operationId":"get_check_explain_checks__check_id__get","parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(ru|en)$","default":"ru","title":"Lang"}},{"name":"cms","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(wordpress|bitrix|tilda)$"},{"type":"null"}],"description":"Подмешать CMS-инструкцию.","title":"Cms"},"description":"Подмешать CMS-инструкцию."},{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/robots":{"post":{"tags":["tools"],"summary":"Валидация robots.txt (по содержимому)","operationId":"post_validate_robots_tools_robots_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RobotsValidateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RobotsValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/sitemap":{"post":{"tags":["tools"],"summary":"Проверка sitemap.xml (по URL, с SSRF-защитой)","operationId":"post_check_sitemap_tools_sitemap_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/jsonld":{"post":{"tags":["tools"],"summary":"Генерация JSON-LD schema.org","operationId":"post_build_jsonld_tools_jsonld_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonLdBuildRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonLdBuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/meta":{"post":{"tags":["tools"],"summary":"Генерация meta-тегов (title/description/OG/Twitter)","operationId":"post_build_meta_tools_meta_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaBuildRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaBuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Описание API","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RootResponse"}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health check","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}}},"components":{"schemas":{"AccountOut":{"properties":{"user":{"$ref":"#/components/schemas/UserOut"},"usage":{"$ref":"#/components/schemas/AccountUsage"},"credits":{"$ref":"#/components/schemas/CreditBalanceOut"},"can_topup":{"type":"boolean","title":"Can Topup","default":false},"payments":{"items":{"$ref":"#/components/schemas/PaymentOut"},"type":"array","title":"Payments"},"billing_enabled":{"type":"boolean","title":"Billing Enabled","default":false}},"type":"object","required":["user","usage"],"title":"AccountOut"},"AccountUsage":{"properties":{"sites_used":{"type":"integer","title":"Sites Used","default":0},"sites_max":{"type":"integer","title":"Sites Max","default":0},"audits_today":{"type":"integer","title":"Audits Today","default":0},"audits_per_day":{"type":"integer","title":"Audits Per Day","default":0},"max_crawl_pages":{"type":"integer","title":"Max Crawl Pages","default":0},"history_days":{"type":"integer","title":"History Days","default":0},"teams_count":{"type":"integer","title":"Teams Count","default":0}},"type":"object","title":"AccountUsage"},"AdminCreditsUpdate":{"properties":{"sub":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":0.0},{"type":"null"}],"title":"Sub"},"topup":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":0.0},{"type":"null"}],"title":"Topup"}},"type":"object","title":"AdminCreditsUpdate","description":"Админ задаёт точные значения бакетов кредитов пользователя."},"AdminPaymentOut":{"properties":{"id":{"type":"string","title":"Id"},"date":{"type":"string","title":"Date"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"description":{"type":"string","title":"Description"},"receipt_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Url"},"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},"type":"object","required":["id","date","amount","currency","status","description","user_id","email"],"title":"AdminPaymentOut","description":"Платёж для админ-обзора: + кто заплатил и детали заказа."},"ApiKeyCreate":{"properties":{"label":{"type":"string","maxLength":120,"title":"Label","description":"Метка для опознания ключа (напр. «MCP ноутбук»).","default":""}},"type":"object","title":"ApiKeyCreate"},"ApiKeyCreatedOut":{"properties":{"id":{"type":"integer","title":"Id"},"prefix":{"type":"string","title":"Prefix"},"label":{"type":"string","title":"Label","default":""},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked":{"type":"boolean","title":"Revoked","default":false},"key":{"type":"string","title":"Key","description":"Полный API-ключ. Показывается один раз — сохраните его."}},"type":"object","required":["id","prefix","created_at","key"],"title":"ApiKeyCreatedOut","description":"Ответ при создании: единственный момент, когда виден полный ключ."},"ApiKeyOut":{"properties":{"id":{"type":"integer","title":"Id"},"prefix":{"type":"string","title":"Prefix"},"label":{"type":"string","title":"Label","default":""},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked":{"type":"boolean","title":"Revoked","default":false}},"type":"object","required":["id","prefix","created_at"],"title":"ApiKeyOut","description":"Безопасная выдача ключа в списке — без самого секрета."},"AuditCheck":{"properties":{"id":{"type":"string","title":"Id","description":"Стабильный слаг проверки (языконезависимый)."},"category":{"type":"string","title":"Category","description":"Слаг категории (security, seo, geo, …)."},"tier":{"type":"string","enum":["free","pro"],"title":"Tier","description":"free или pro."},"status":{"type":"string","enum":["pass","warn","fail","skip"],"title":"Status","description":"Результат проверки."},"title":{"type":"string","title":"Title","description":"Человекочитаемый заголовок (ru/en по параметру lang)."},"fix":{"anyOf":[{"$ref":"#/components/schemas/AuditFix"},{"type":"null"}],"description":"Как исправить (warn/fail). PRO — полный плейбук."}},"type":"object","required":["id","category","tier","status","title"],"title":"AuditCheck","description":"Одна проверка в структурной раскладке (tier-gated)."},"AuditCheckSummary":{"properties":{"shown":{"type":"integer","title":"Shown","description":"Сколько проверок попало в ответ (видимые).","default":0},"passed":{"type":"integer","title":"Passed","description":"Пройдено (среди видимых).","default":0},"warnings":{"type":"integer","title":"Warnings","description":"Предупреждения (среди видимых).","default":0},"critical":{"type":"integer","title":"Critical","description":"Критичных (среди видимых).","default":0},"skipped":{"type":"integer","title":"Skipped","description":"Неприменимо / нет данных (среди видимых).","default":0},"pro_hidden":{"type":"integer","title":"Pro Hidden","description":"Скрыто PRO-проверок (free).","default":0},"pro_problems_hidden":{"type":"integer","title":"Pro Problems Hidden","description":"Скрытых PRO-проверок с проблемой.","default":0}},"type":"object","title":"AuditCheckSummary","description":"Сводка по проверкам. Для free отражает, сколько PRO-находок скрыто."},"AuditDiffChange":{"properties":{"id":{"type":"string","title":"Id","description":"Слаг проверки."},"title":{"type":"string","title":"Title","description":"Заголовок проверки (по lang)."},"category":{"type":"string","title":"Category","description":"Слаг категории."},"from":{"type":"string","enum":["pass","warn","fail","skip","absent"],"title":"From","description":"Статус в прошлом прогоне (absent = не было)."},"to":{"type":"string","enum":["pass","warn","fail","skip","absent"],"title":"To","description":"Статус сейчас (absent = пропала)."}},"type":"object","required":["id","title","category","from","to"],"title":"AuditDiffChange","description":"Одна изменившаяся проверка между двумя прогонами."},"AuditDiffRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"Полный URL сайта."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык заголовков: ru или en.","default":"ru"}},"type":"object","required":["url"],"title":"AuditDiffRequest","description":"Запрос диффа: текущий аудит vs предыдущий снапшот того же URL."},"AuditDiffResponse":{"properties":{"url":{"type":"string","title":"Url"},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","default":"ru"},"available":{"type":"boolean","title":"Available","description":"True если дифф доступен (есть PRO-ключ)."},"first_run":{"type":"boolean","title":"First Run","description":"True если предыдущего снапшота не было.","default":false},"current":{"anyOf":[{"$ref":"#/components/schemas/AuditDiffSnapshot"},{"type":"null"}],"description":"Текущий прогон."},"previous":{"anyOf":[{"$ref":"#/components/schemas/AuditDiffSnapshot"},{"type":"null"}],"description":"Предыдущий прогон."},"score_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Delta","description":"current.score − previous.score."},"health_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Delta","description":"current.health − previous.health (выше = лучше)."},"worsened":{"items":{"$ref":"#/components/schemas/AuditDiffChange"},"type":"array","title":"Worsened","description":"Проверки, ставшие хуже."},"improved":{"items":{"$ref":"#/components/schemas/AuditDiffChange"},"type":"array","title":"Improved","description":"Проверки, ставшие лучше."},"unchanged":{"type":"integer","title":"Unchanged","description":"Сколько проверок без изменений.","default":0},"upsell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upsell","description":"Подсказка про PRO (если available=False)."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Короткое резюме диффа для человека."}},"type":"object","required":["url","available"],"title":"AuditDiffResponse","description":"Ответ POST /audit/diff — что изменилось с прошлой проверки.\n\n`available=False` — у вызова нет PRO-ключа (дифф — stateful PRO-функция,\nнужен аккаунт). `first_run=True` — это первый сохранённый прогон, сравнивать\nне с чем (предыдущего снапшота нет)."},"AuditDiffSnapshot":{"properties":{"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score","description":"0..100, выше = больше проблем."},"health":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Health","description":"Здоровье 0..100."},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"Буквенная оценка A–F."},"audited_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Audited At","description":"Когда снят прогон."}},"type":"object","title":"AuditDiffSnapshot","description":"Краткая сводка прогона (текущего или предыдущего)."},"AuditFix":{"properties":{"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Короткий совет (1-2 предложения)."},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","description":"Шаги исправления по порядку."},"where":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Where","description":"Где именно меняется (файл/тег/раздел панели)."},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet","description":"Готовый код для вставки."},"snippet_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet Lang","description":"Язык сниппета (html/nginx/bash/…)."},"verify":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify","description":"Как проверить, что починилось."},"effort":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Effort","description":"Трудозатраты."},"impact":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Impact","description":"Влияние на SEO/здоровье."},"cms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cms","description":"CMS, под которую дана подсказка (если запрошена)."},"cms_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cms Hint","description":"Инструкция под конкретную CMS."},"cms_hints":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Cms Hints","description":"Подсказки по всем поддержанным CMS."}},"type":"object","title":"AuditFix","description":"Fix-плейбук «от А до Я»: пошаговая инструкция по исправлению проблемы.\n\n`summary` — короткий совет (виден всем). Остальные поля (steps/where/\nsnippet/verify/effort/impact) — детальный план; в публичном /audit отдаётся\nтолько PRO-вызову, free видит summary + upsell. `cms_hint`/`cms_hints` —\nинструкция «где кликать» под конкретную CMS (wordpress/bitrix/tilda)."},"AuditGeo":{"properties":{"score":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score","description":"GEO-готовность 0..100 (выше = лучше)."},"ai_crawlers_blocked":{"items":{"type":"string"},"type":"array","title":"Ai Crawlers Blocked","description":"Имена ИИ-ботов, явно закрытых в robots.txt."},"has_llmstxt":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Llmstxt"},"llmstxt_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Llmstxt Valid"},"qa_blocks_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Qa Blocks Present"},"has_faq_schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Faq Schema"},"citability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Citability Score"},"citable_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Citable Blocks"},"strong_answer_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strong Answer Blocks"},"org_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Org Present"},"org_has_sameas":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Org Has Sameas"}},"type":"object","title":"AuditGeo","description":"GEO-срез (Generative Engine Optimization — видимость в ИИ-поиске).\n\nPRO-блок: отдаётся только при валидном PRO-ключе. Без ключа `geo=None`."},"AuditRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"Полный URL (Uniform Resource Locator — адрес ресурса) сайта компании.","examples":["https://example.com"]},"depth":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Depth","description":"Глубина: 1=single, 2=deep(8 стр.), 3=deep(20 стр.). Deep — только PRO.","default":1},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык заголовков проверок и подсказок: ru (по умолчанию) или en.","default":"ru"}},"type":"object","required":["url"],"title":"AuditRequest","description":"Запрос на аудит одного сайта.\n\n`depth` управляет multi-page обходом (SiteCrawler):\n  - 1 = single-page (по умолчанию),\n  - 2 = single + deep-crawl 8 страниц,\n  - 3 = single + deep-crawl 20 страниц.\nДля deep-crawl общий timeout автоматически поднимается до 120с."},"AuditResponse":{"properties":{"url":{"type":"string","title":"Url"},"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score","description":"0..100, выше = больше проблем = лид теплее."},"health":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Health","description":"Здоровье 0..100 (выше = лучше; = 100 - score)."},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"Буквенная оценка A–F по health."},"grade_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade Label","description":"Человекочитаемая подпись оценки."},"issues":{"items":{"type":"string"},"type":"array","title":"Issues","description":"Заголовки видимых проблем (warn/fail), tier-gated."},"signals":{"$ref":"#/components/schemas/AuditSignals"},"audited_at":{"type":"string","format":"date-time","title":"Audited At"},"render_seconds":{"type":"number","minimum":0.0,"title":"Render Seconds","description":"Сколько заняла обработка (без сетевых ретраев)."},"request_id":{"type":"string","title":"Request Id","description":"UUID этого запроса для корреляции в логах."},"plan":{"type":"string","enum":["free","pro"],"title":"Plan","description":"Режим: free или pro.","default":"free"},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык заголовков проверок.","default":"ru"},"depth_used":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Depth Used","description":"Применённая глубина обхода.","default":1},"checks":{"items":{"$ref":"#/components/schemas/AuditCheck"},"type":"array","title":"Checks","description":"Проверки (tier-gated)."},"summary":{"$ref":"#/components/schemas/AuditCheckSummary"},"geo":{"anyOf":[{"$ref":"#/components/schemas/AuditGeo"},{"type":"null"}],"description":"GEO-срез (PRO). Без ключа — null."},"upsell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upsell","description":"Подсказка про PRO (только для free)."}},"type":"object","required":["url","score","signals","audited_at","render_seconds","request_id"],"title":"AuditResponse","description":"Ответ POST /audit. Самодостаточный — фронт может сразу отрендерить отчёт."},"AuditRunRequest":{"properties":{"url":{"type":"string","title":"Url","description":"URL сайта для аудита."},"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id","description":"Опц. id компании для трассировки в CRM leadgen."},"crawl_pages":{"type":"integer","title":"Crawl Pages","description":"0 = single-page, >0 = deep-crawl до N страниц.","default":0}},"type":"object","required":["url"],"title":"AuditRunRequest"},"AuditRunResponse":{"properties":{"audit":{"additionalProperties":true,"type":"object","title":"Audit"}},"type":"object","required":["audit"],"title":"AuditRunResponse"},"AuditSignals":{"properties":{"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"page_size_kb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size Kb"},"has_viewport_meta":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Viewport Meta"},"has_title":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Title"},"title_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Title Length"},"has_description":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Description"},"description_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Description Length"},"has_h1":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has H1"},"h1_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"H1 Count"},"ssl_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ssl Valid"},"ssl_expires":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssl Expires"},"has_robots_txt":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Robots Txt"},"has_sitemap_xml":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Sitemap Xml"},"has_jsonld":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Jsonld"},"jsonld_types":{"items":{"type":"string"},"type":"array","title":"Jsonld Types"},"has_canonical":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Canonical"},"has_open_graph":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Open Graph"},"has_breadcrumbs":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Breadcrumbs"},"meta_robots_noindex":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Meta Robots Noindex"},"has_custom_404":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Custom 404"},"http_redirects_to_https":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Http Redirects To Https"},"images_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Images Total"},"images_without_alt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Images Without Alt"},"images_oversized":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Images Oversized"},"has_analytics":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Analytics"},"analytics_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analytics Provider"},"has_chat_widget":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Chat Widget"},"chat_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Provider"},"has_favicon":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Favicon"}},"type":"object","title":"AuditSignals","description":"Срез сигналов из `SiteAudit` — что нашли на сайте.\n\nВсе поля Optional, потому что часть проверок не запускается, если сайт\nнедоступен (например, SSL-проверка пропускается при connection-error)."},"AutoRenewUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"AutoRenewUpdate","description":"Включить/выключить авто-продление активной подписки."},"BillingConfigOut":{"properties":{"configured":{"type":"boolean","title":"Configured","default":false},"test_mode":{"type":"boolean","title":"Test Mode","default":false},"can_topup":{"type":"boolean","title":"Can Topup","default":false},"tiers":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Tiers"},"topups":{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array","title":"Topups"}},"type":"object","title":"BillingConfigOut"},"BlacklistCreate":{"properties":{"pattern":{"type":"string","maxLength":255,"minLength":1,"title":"Pattern"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","required":["pattern"],"title":"BlacklistCreate"},"BlacklistEntryOut":{"properties":{"id":{"type":"integer","title":"Id"},"pattern":{"type":"string","title":"Pattern"},"reason":{"type":"string","title":"Reason","default":""},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","pattern"],"title":"BlacklistEntryOut"},"BulkAuditItem":{"properties":{"url":{"type":"string","title":"Url"},"status":{"type":"string","title":"Status"},"site_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Site Id"},"run_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Uid"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["url","status"],"title":"BulkAuditItem","description":"Результат постановки одного домена в очередь bulk-аудита."},"BulkAuditRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Urls"},"create_missing":{"type":"boolean","title":"Create Missing","default":true}},"type":"object","required":["urls"],"title":"BulkAuditRequest","description":"Массовый single-page аудит списка доменов (Business+).\n\n`urls` — сырые строки (по одной на домен): можно с/без схемы, лишние пробелы\nи дубли отсекаются на бэкенде. `create_missing` — заводить ли отсутствующие\nсайты в кабинете (иначе незнакомый домен пропускается)."},"BulkAuditResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BulkAuditItem"},"type":"array","title":"Items"},"queued":{"type":"integer","title":"Queued","default":0},"failed":{"type":"integer","title":"Failed","default":0},"skipped":{"type":"integer","title":"Skipped","default":0}},"type":"object","required":["items"],"title":"BulkAuditResponse"},"CheckCategoryOut":{"properties":{"category":{"type":"string","title":"Category"},"label":{"type":"string","title":"Label"},"free_count":{"type":"integer","title":"Free Count"},"pro_count":{"type":"integer","title":"Pro Count"},"checks":{"items":{"$ref":"#/components/schemas/CheckItem"},"type":"array","title":"Checks"}},"type":"object","required":["category","label","free_count","pro_count","checks"],"title":"CheckCategoryOut"},"CheckItem":{"properties":{"id":{"type":"string","title":"Id"},"tier":{"type":"string","enum":["free","pro"],"title":"Tier"},"title":{"type":"string","title":"Title"}},"type":"object","required":["id","tier","title"],"title":"CheckItem"},"CheckoutRequest":{"properties":{"kind":{"type":"string","enum":["subscription","topup"],"title":"Kind"},"tier":{"anyOf":[{"type":"string","pattern":"^(pro|pro_plus|business)$"},{"type":"null"}],"title":"Tier"},"period":{"type":"string","enum":["month","year"],"title":"Period","default":"month"},"package_index":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Package Index"},"auto_renew":{"type":"boolean","title":"Auto Renew","default":false}},"type":"object","required":["kind"],"title":"CheckoutRequest"},"CheckoutResponse":{"properties":{"payment_id":{"type":"string","title":"Payment Id"},"confirmation_url":{"type":"string","title":"Confirmation Url"},"amount":{"type":"number","title":"Amount"},"description":{"type":"string","title":"Description"},"test_mode":{"type":"boolean","title":"Test Mode","default":false}},"type":"object","required":["payment_id","confirmation_url","amount","description"],"title":"CheckoutResponse"},"ChecksResponse":{"properties":{"lang":{"type":"string","enum":["ru","en"],"title":"Lang","default":"ru"},"total":{"type":"integer","title":"Total"},"free_count":{"type":"integer","title":"Free Count"},"pro_count":{"type":"integer","title":"Pro Count"},"categories":{"items":{"$ref":"#/components/schemas/CheckCategoryOut"},"type":"array","title":"Categories"}},"type":"object","required":["total","free_count","pro_count","categories"],"title":"ChecksResponse","description":"Реестр проверок движка (для list_checks / маркетинга прозрачности)."},"CreditBalanceOut":{"properties":{"sub":{"type":"integer","title":"Sub","default":0},"topup":{"type":"integer","title":"Topup","default":0},"total":{"type":"integer","title":"Total","default":0},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"unlimited":{"type":"boolean","title":"Unlimited","default":false},"monthly":{"type":"integer","title":"Monthly","default":0}},"type":"object","title":"CreditBalanceOut","description":"Баланс кредитов кабинета (модель 2026-06)."},"CreditLedgerEntryOut":{"properties":{"id":{"type":"integer","title":"Id"},"delta":{"type":"integer","title":"Delta"},"bucket":{"type":"string","title":"Bucket"},"reason":{"type":"string","title":"Reason"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"balance_after":{"type":"integer","title":"Balance After"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","delta","bucket","reason","balance_after","created_at"],"title":"CreditLedgerEntryOut","description":"Строка истории движения кредитов (списание/начисление/докупка)."},"CreditUsageReasonOut":{"properties":{"reason":{"type":"string","title":"Reason"},"bucket":{"type":"string","title":"Bucket"},"total":{"type":"integer","title":"Total"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["reason","bucket","total","count"],"title":"CreditUsageReasonOut","description":"Одна строка разбивки расхода кредитов по причине+корзине."},"CreditUsageSummaryOut":{"properties":{"spent_total":{"type":"integer","title":"Spent Total","default":0},"refunded_total":{"type":"integer","title":"Refunded Total","default":0},"net_spent":{"type":"integer","title":"Net Spent","default":0},"granted_total":{"type":"integer","title":"Granted Total","default":0},"by_reason":{"items":{"$ref":"#/components/schemas/CreditUsageReasonOut"},"type":"array","title":"By Reason"},"entries":{"type":"integer","title":"Entries","default":0}},"type":"object","title":"CreditUsageSummaryOut","description":"Прозрачная сводка движения кредитов (admin /admin/credits/usage)."},"DiffOut":{"properties":{"site_id":{"type":"integer","title":"Site Id"},"has_previous":{"type":"boolean","title":"Has Previous"},"new":{"items":{"type":"string"},"type":"array","title":"New"},"resolved":{"items":{"type":"string"},"type":"array","title":"Resolved"},"unchanged":{"items":{"type":"string"},"type":"array","title":"Unchanged"},"speed_new":{"items":{"type":"string"},"type":"array","title":"Speed New"},"speed_resolved":{"items":{"type":"string"},"type":"array","title":"Speed Resolved"},"w3c_new":{"items":{"type":"string"},"type":"array","title":"W3C New"},"w3c_resolved":{"items":{"type":"string"},"type":"array","title":"W3C Resolved"},"prev_ran_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Ran At"},"current_run_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Run Uid"},"previous_run_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Run Uid"}},"type":"object","required":["site_id","has_previous"],"title":"DiffOut"},"EmailChangeConfirmIn":{"properties":{"code":{"type":"string","maxLength":12,"minLength":4,"title":"Code"}},"type":"object","required":["code"],"title":"EmailChangeConfirmIn"},"EmailChangeRequestIn":{"properties":{"new_email":{"type":"string","format":"email","title":"New Email"}},"type":"object","required":["new_email"],"title":"EmailChangeRequestIn"},"EnrichRequest":{"properties":{"audit":{"additionalProperties":true,"type":"object","title":"Audit","description":"Сериализованный SiteAudit (SiteAudit.to_dict())."}},"type":"object","required":["audit"],"title":"EnrichRequest"},"EnrichResponse":{"properties":{"audit_checks_count":{"type":"integer","title":"Audit Checks Count"},"translated":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Translated"},"growth":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Growth"}},"type":"object","required":["audit_checks_count","translated","growth"],"title":"EnrichResponse"},"ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail"},"code":{"type":"string","title":"Code"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","required":["detail","code"],"title":"ErrorResponse","description":"Унифицированный формат ошибок для не-200 ответов."},"ExplainResponse":{"properties":{"id":{"type":"string","title":"Id"},"found":{"type":"boolean","title":"Found"},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","default":"ru"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"tier":{"anyOf":[{"type":"string","enum":["free","pro"]},{"type":"null"}],"title":"Tier"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"why":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fix"},"fix_playbook":{"anyOf":[{"$ref":"#/components/schemas/AuditFix"},{"type":"null"}]},"advice_lang":{"anyOf":[{"type":"string","enum":["ru","en"]},{"type":"null"}],"title":"Advice Lang"}},"type":"object","required":["id","found"],"title":"ExplainResponse","description":"Подробное объяснение одной проверки (для explain_issue)."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Запрос ссылки на сброс пароля (публичный, по e-mail)."},"GroupCreate":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"color":{"type":"string","maxLength":32,"title":"Color","description":"HEX/эмодзи-метка, опционально.","default":""}},"type":"object","required":["name"],"title":"GroupCreate"},"GroupOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"type":"string","title":"Color","default":""},"sites_count":{"type":"integer","title":"Sites Count","default":0},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","name","created_at"],"title":"GroupOut"},"GroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Color"}},"type":"object","title":"GroupUpdate"},"GuestCheckoutRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"tier":{"type":"string","pattern":"^(pro|pro_plus|business)$","title":"Tier"},"period":{"type":"string","enum":["month","year"],"title":"Period","default":"month"},"auto_renew":{"type":"boolean","title":"Auto Renew","default":false}},"type":"object","required":["email","tier"],"title":"GuestCheckoutRequest","description":"Гостевое оформление: по e-mail без предварительной регистрации.\nТолько подписка (докупка кредитов требует активного PRO+/Business)."},"GuestCheckoutResponse":{"properties":{"payment_id":{"type":"string","title":"Payment Id"},"confirmation_url":{"type":"string","title":"Confirmation Url"},"amount":{"type":"number","title":"Amount"},"description":{"type":"string","title":"Description"},"test_mode":{"type":"boolean","title":"Test Mode","default":false},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"is_new":{"type":"boolean","title":"Is New","default":false}},"type":"object","required":["payment_id","confirmation_url","amount","description"],"title":"GuestCheckoutResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"version":{"type":"string","title":"Version"},"uptime_seconds":{"type":"number","title":"Uptime Seconds"}},"type":"object","required":["version","uptime_seconds"],"title":"HealthResponse"},"IgnoreCheckRequest":{"properties":{"check_id":{"type":"string","maxLength":80,"minLength":1,"title":"Check Id"}},"type":"object","required":["check_id"],"title":"IgnoreCheckRequest"},"IgnoredChecksOut":{"properties":{"check_ids":{"items":{"type":"string"},"type":"array","title":"Check Ids"}},"type":"object","title":"IgnoredChecksOut"},"InviteCreate":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"expires_in_days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Expires In Days","default":14}},"type":"object","title":"InviteCreate"},"InviteOut":{"properties":{"id":{"type":"integer","title":"Id"},"token":{"type":"string","title":"Token"},"team_id":{"type":"integer","title":"Team Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"accepted":{"type":"boolean","title":"Accepted","default":false},"accepted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accepted At"}},"type":"object","required":["id","token","team_id","created_at"],"title":"InviteOut"},"InvitePreviewOut":{"properties":{"valid":{"type":"boolean","title":"Valid"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"already_member":{"type":"boolean","title":"Already Member","default":false}},"type":"object","required":["valid"],"title":"InvitePreviewOut"},"JsonLdBuildRequest":{"properties":{"type":{"type":"string","title":"Type","description":"Organization | LocalBusiness | Article | Product | FAQPage | BreadcrumbList | WebSite."},"fields":{"additionalProperties":true,"type":"object","title":"Fields","description":"Поля схемы (только переданные попадут в вывод)."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык сообщений.","default":"ru"}},"type":"object","required":["type"],"title":"JsonLdBuildRequest","description":"Запрос генерации JSON-LD schema.org."},"JsonLdBuildResponse":{"properties":{"jsonld":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Jsonld","description":"Сгенерированный JSON-LD объект."},"script":{"type":"string","title":"Script","description":"Готовый <script type=application/ld+json> блок.","default":""},"issues":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Issues"}},"type":"object","title":"JsonLdBuildResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MemberOut":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"can_add_sites":{"type":"boolean","title":"Can Add Sites"},"can_delete_sites":{"type":"boolean","title":"Can Delete Sites"},"can_invite":{"type":"boolean","title":"Can Invite"},"can_manage_members":{"type":"boolean","title":"Can Manage Members"},"joined_at":{"type":"string","title":"Joined At"}},"type":"object","required":["user_id","email","role","can_add_sites","can_delete_sites","can_invite","can_manage_members","joined_at"],"title":"MemberOut"},"MemberPerms":{"properties":{"can_add_sites":{"type":"boolean","title":"Can Add Sites","default":true},"can_delete_sites":{"type":"boolean","title":"Can Delete Sites","default":false},"can_invite":{"type":"boolean","title":"Can Invite","default":false},"can_manage_members":{"type":"boolean","title":"Can Manage Members","default":false}},"type":"object","title":"MemberPerms"},"MemberPermsUpdate":{"properties":{"can_add_sites":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Add Sites"},"can_delete_sites":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Delete Sites"},"can_invite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Invite"},"can_manage_members":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Manage Members"}},"type":"object","title":"MemberPermsUpdate"},"MetaBuildRequest":{"properties":{"fields":{"additionalProperties":true,"type":"object","title":"Fields","description":"title, description, url, image, site_name, type, twitter_card, locale."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык сообщений.","default":"ru"}},"type":"object","title":"MetaBuildRequest","description":"Запрос генерации meta-тегов."},"MetaBuildResponse":{"properties":{"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Список тегов по строкам."},"html_head":{"type":"string","title":"Html Head","description":"Готовый блок <head>-тегов.","default":""},"checks":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Checks","description":"{field, status, message}."}},"type":"object","title":"MetaBuildResponse"},"OfferPackagesResponse":{"properties":{"packages":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Packages"}},"type":"object","required":["packages"],"title":"OfferPackagesResponse"},"PasswordChangeRequest":{"properties":{"current_password":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Current Password"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["new_password"],"title":"PasswordChangeRequest"},"PaymentOut":{"properties":{"id":{"type":"string","title":"Id"},"date":{"type":"string","title":"Date"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"description":{"type":"string","title":"Description"},"receipt_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Url"},"confirmation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Url"}},"type":"object","required":["id","date","amount","currency","status","description"],"title":"PaymentOut"},"PromoPrefsUpdate":{"properties":{"opt_out":{"type":"boolean","title":"Opt Out"}},"type":"object","required":["opt_out"],"title":"PromoPrefsUpdate","description":"Согласие на маркетинговые письма (из кабинета)."},"PublicAuditRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"URL сайта посетителя."},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email для выдачи полного PDF. Если пусто — отдадим только preview."},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone","description":"Опц. телефон. Без строгой валидации: формат РФ свободный."},"captcha_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Token","description":"Cloudflare Turnstile token. Обязателен если задан TURNSTILE_SECRET."},"utm_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Utm Campaign"}},"type":"object","required":["url"],"title":"PublicAuditRequest","description":"Запрос от публичной landing-формы (Track B — DETAILWEB/apps/audit-web/).\n\nОтличия от `AuditRequest`:\n  - `email` и `phone` опциональные — дают посетителю, чтобы получить полный\n    PDF. Без них показываем только preview-срез (score + top-3 точек роста).\n  - `captcha_token` — Cloudflare Turnstile (бесплатная капча). В dev-режиме\n    сервер может быть сконфигурирован игнорировать поле (`TURNSTILE_SECRET`\n    не задан в .env).\n  - `utm_*` трекаем источники трафика (Habr / TG / VC)."},"PublicAuditResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"url":{"type":"string","title":"Url"},"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score"},"total_issues":{"type":"integer","minimum":0.0,"title":"Total Issues","description":"Сколько всего проблем нашли."},"top_growth":{"items":{"$ref":"#/components/schemas/PublicGrowthItem"},"type":"array","title":"Top Growth","description":"Топ-3 точек роста. Полный список — в PDF."},"teaser":{"type":"string","title":"Teaser","description":"Маркетинговая фраза: «нашли X проблем, вот три самых острых»."},"full_pdf_available":{"type":"boolean","title":"Full Pdf Available","description":"true если email был передан и PDF можно запросить (через email-gate)."},"email_captured":{"type":"boolean","title":"Email Captured","description":"true если email сохранён в CRM как лид."},"audited_at":{"type":"string","format":"date-time","title":"Audited At"}},"type":"object","required":["request_id","url","score","total_issues","teaser","full_pdf_available","email_captured","audited_at"],"title":"PublicAuditResponse","description":"Ответ публичного аудита — превью-срез, без полной выгрузки signals.\n\nЛогика сокрытия деталей:\n  - Полный список `issues` не отдаётся (конкурент может сделать из этого\n    бесплатный сканер). Показываем только `score` + топ-3 точки роста\n    с человекочитаемыми headline'ами.\n  - Полный PDF — только после `claim` (email обязателен). Ссылка отдаётся\n    через async email (Track A / Brevo) или прямая ссылка с токеном через\n    `full_pdf_url`, если email присутствовал в запросе."},"PublicGrowthItem":{"properties":{"kind":{"type":"string","title":"Kind","description":"Тип проблемы (слаг), напр. 'sitemap', 'ssl', 'title'."},"headline":{"type":"string","title":"Headline","description":"Заголовок точки роста (human text)."},"business_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Value","description":"Короткая формулировка, что это даёт бизнесу."}},"type":"object","required":["kind","headline"],"title":"PublicGrowthItem","description":"Одна точка роста — выдаётся в превью без полной детализации PDF."},"PublicReportOut":{"properties":{"run_uid":{"type":"string","title":"Run Uid"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url"},"site_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Label"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"started_at":{"type":"string","title":"Started At"},"expires_at":{"type":"string","title":"Expires At"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"checklist":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Checklist"},"brand":{"anyOf":[{"$ref":"#/components/schemas/ReportBrandOut"},{"type":"null"}]}},"type":"object","required":["run_uid","started_at","expires_at"],"title":"PublicReportOut","description":"Read-only выдача публичной ссылки (без owner-инфо и run-метаданных)."},"RecheckRequest":{"properties":{"kind":{"type":"string","enum":["w3c","psi","audit"],"title":"Kind"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url"}},"type":"object","required":["kind"],"title":"RecheckRequest","description":"Точечная перепроверка одной части завершённого прогона.\n\nkind: \"w3c\" — перевалидировать HTML/CSS конкретного URL/файла;\n      \"psi\" — заново снять PageSpeed для URL;\n      \"audit\" — пере-сканировать страницу и обновить проверки чекера.\nurl: какой URL/файл; по умолчанию — главная страница прогона."},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"ReportBrandOut":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url"},"footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Text"},"hide_detailweb":{"type":"boolean","title":"Hide Detailweb","default":false},"enabled":{"type":"boolean","title":"Enabled","default":false}},"type":"object","title":"ReportBrandOut","description":"White-label профиль отчётов (бренд агентства вместо detail.web)."},"ReportBrandUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Company Name"},"logo_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string","pattern":"^#?[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Accent Color"},"site_url":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Site Url"},"footer_text":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Footer Text"},"hide_detailweb":{"type":"boolean","title":"Hide Detailweb","default":false}},"type":"object","title":"ReportBrandUpdate","description":"Сохранение white-label профиля (только поля бренда)."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":8,"title":"Token"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest","description":"Установка нового пароля по токену из письма (публичный)."},"RobotsValidateRequest":{"properties":{"content":{"type":"string","maxLength":200000,"title":"Content","description":"Сырое содержимое robots.txt."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык сообщений: ru или en.","default":"ru"}},"type":"object","required":["content"],"title":"RobotsValidateRequest","description":"Запрос валидации содержимого robots.txt (без фетча)."},"RobotsValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"False, если есть критичные ошибки (severity=fail)."},"issues":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Issues","description":"Список {severity, message}."},"sitemaps":{"items":{"type":"string"},"type":"array","title":"Sitemaps","description":"Найденные Sitemap: директивы."},"user_agents":{"items":{"type":"string"},"type":"array","title":"User Agents","description":"Объявленные User-agent."},"rules_count":{"type":"integer","title":"Rules Count","description":"Кол-во Allow/Disallow правил.","default":0},"ai_crawlers_blocked":{"items":{"type":"string"},"type":"array","title":"Ai Crawlers Blocked","description":"Явно заблокированные ИИ-краулеры."},"blocks_assets":{"type":"boolean","title":"Blocks Assets","description":"Закрывает ли CSS/JS от рендер-ботов.","default":false},"blocks_assets_examples":{"items":{"type":"string"},"type":"array","title":"Blocks Assets Examples"},"disallow_all_star":{"type":"boolean","title":"Disallow All Star","description":"Есть Disallow: / для User-agent: *.","default":false}},"type":"object","required":["valid"],"title":"RobotsValidateResponse"},"RootResponse":{"properties":{"name":{"type":"string","title":"Name","default":"leadgen-api"},"version":{"type":"string","title":"Version"},"description":{"type":"string","title":"Description"},"docs_url":{"type":"string","title":"Docs Url","default":"/docs"},"openapi_url":{"type":"string","title":"Openapi Url","default":"/openapi.json"}},"type":"object","required":["version","description"],"title":"RootResponse"},"RunDetailOut":{"properties":{"id":{"type":"integer","title":"Id"},"run_uid":{"type":"string","title":"Run Uid"},"site_id":{"type":"integer","title":"Site Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"type":"string","title":"Status"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"health":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health"},"total_issues":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Issues"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"type":"string","title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url"},"site_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Label"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"depth":{"type":"string","title":"Depth","default":"single"},"crawl_pages":{"type":"integer","title":"Crawl Pages","default":0},"progress":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Progress"},"progress_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress At"},"recheck":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recheck"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"credits_reserved":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Reserved"},"credits_charged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Charged"},"credits_refunded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Refunded"},"credits_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Cost"},"credits_breakdown":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Credits Breakdown"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"checklist":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Checklist"},"ignored_check_ids":{"items":{"type":"string"},"type":"array","title":"Ignored Check Ids"},"partial":{"type":"boolean","title":"Partial","default":false}},"type":"object","required":["id","run_uid","site_id","user_id","status","started_at"],"title":"RunDetailOut"},"RunOut":{"properties":{"id":{"type":"integer","title":"Id"},"run_uid":{"type":"string","title":"Run Uid"},"site_id":{"type":"integer","title":"Site Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"type":"string","title":"Status"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"health":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health"},"total_issues":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Issues"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"type":"string","title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url"},"site_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Label"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"depth":{"type":"string","title":"Depth","default":"single"},"crawl_pages":{"type":"integer","title":"Crawl Pages","default":0},"progress":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Progress"},"progress_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress At"},"recheck":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recheck"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"credits_reserved":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Reserved"},"credits_charged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Charged"},"credits_refunded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Refunded"},"credits_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Cost"},"credits_breakdown":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Credits Breakdown"}},"type":"object","required":["id","run_uid","site_id","user_id","status","started_at"],"title":"RunOut"},"RunStartRequest":{"properties":{"site_id":{"type":"integer","title":"Site Id"},"crawl_pages":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Crawl Pages","description":"Переопределить crawl_pages сайта на этот прогон."}},"type":"object","required":["site_id"],"title":"RunStartRequest"},"SettingsOut":{"properties":{"psi_configured":{"type":"boolean","title":"Psi Configured","default":false},"psi_key_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Psi Key Masked"},"psi_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Psi Source"},"request_delay":{"type":"number","title":"Request Delay","default":0.5},"max_concurrent":{"type":"integer","title":"Max Concurrent","default":2}},"type":"object","title":"SettingsOut","description":"Безопасная выдача настроек (без самого ключа)."},"SettingsUpdate":{"properties":{"google_psi_api_key":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Google Psi Api Key"},"request_delay":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Request Delay"},"max_concurrent":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":1.0},{"type":"null"}],"title":"Max Concurrent"}},"type":"object","title":"SettingsUpdate"},"ShareOut":{"properties":{"active":{"type":"boolean","title":"Active","default":false},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"expired":{"type":"boolean","title":"Expired","default":false},"can_extend":{"type":"boolean","title":"Can Extend","default":false}},"type":"object","title":"ShareOut","description":"Состояние публичной ссылки прогона."},"SimpleOk":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"detail":{"type":"string","title":"Detail","default":""}},"type":"object","title":"SimpleOk"},"SiteCreateRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"label":{"type":"string","maxLength":200,"title":"Label","default":""},"crawl_pages":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Crawl Pages","description":"0 = single-page; >0 = deep-crawl.","default":0},"psi":{"type":"boolean","title":"Psi","default":false},"psi_urls":{"items":{"type":"string"},"type":"array","maxItems":4,"title":"Psi Urls","description":"Доп. страницы для замера скорости (PSI), помимо главной. Пути или URL."},"validate_w3c":{"type":"boolean","title":"Validate W3C","default":false},"w3c_urls":{"items":{"type":"string"},"type":"array","maxItems":4,"title":"W3C Urls","description":"Доп. страницы для W3C-валидации HTML/CSS, помимо главной. Пути или URL."},"w3c_all_pages":{"type":"boolean","title":"W3C All Pages","description":"W3C на всех страницах обхода: HTML по каждой странице, CSS-файлы с дедупом (игнорирует w3c_urls).","default":false},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Если задан — сайт командный."},"group_ids":{"items":{"type":"integer"},"type":"array","title":"Group Ids","description":"Личные папки сайта (только для личных сайтов; 1 сайт → N папок)."}},"type":"object","required":["url"],"title":"SiteCreateRequest"},"SiteEstimateRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"URL сайта (берётся origin → /sitemap.xml + robots)."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык сообщения.","default":"ru"}},"type":"object","required":["url"],"title":"SiteEstimateRequest","description":"Запрос пред-оценки размера сайта (по sitemap) перед deep-аудитом."},"SiteEstimateResponse":{"properties":{"estimated_pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Pages","description":"≈ число страниц по sitemap (None — не определено)."},"estimate_exact":{"type":"boolean","title":"Estimate Exact","description":"True — посчитано точно; False — экстраполяция по сэмплу под-карт.","default":false},"estimate_source":{"type":"string","title":"Estimate Source","description":"urlset | sitemapindex | none.","default":"none"},"sitemap_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sitemap Url","description":"Откуда взята оценка."},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance","description":"Баланс кредитов (None — без ключа/безлимит)."},"unlimited":{"type":"boolean","title":"Unlimited","description":"Безлимитный тариф (admin/staff/enterprise).","default":false},"affordable_pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Affordable Pages","description":"На сколько страниц хватит кредитов (None — безлимит/без ключа)."},"enough":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enough","description":"Хватит ли кредитов на полный обход (None — неизвестно)."},"message":{"type":"string","title":"Message","description":"Готовое человекочитаемое предупреждение."}},"type":"object","required":["message"],"title":"SiteEstimateResponse","description":"Пред-оценка размера сайта + хватит ли кредитов на полный обход.\n\n⚠️ `estimated_pages` — оценка по sitemap (может врать/отсутствовать).\nРеальный аудит обходит сайт по ссылкам и стопается по бюджету кредитов."},"SiteMonitorOut":{"properties":{"site_id":{"type":"integer","title":"Site Id"},"enabled":{"type":"boolean","title":"Enabled","default":false},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency"},"threshold":{"type":"integer","title":"Threshold","default":7},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"available":{"type":"boolean","title":"Available","default":false},"last_checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Checked At"},"last_health":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Health"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"}},"type":"object","required":["site_id"],"title":"SiteMonitorOut","description":"Настройки и состояние авто-мониторинга сайта (для кабинета)."},"SiteMonitorUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"threshold":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Threshold"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":4},{"type":"null"}],"title":"Channels"}},"type":"object","title":"SiteMonitorUpdate","description":"Включение/настройка авто-мониторинга сайта."},"SiteOut":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"url":{"type":"string","title":"Url"},"label":{"type":"string","title":"Label"},"depth":{"type":"string","title":"Depth"},"crawl_pages":{"type":"integer","title":"Crawl Pages"},"psi":{"type":"boolean","title":"Psi"},"psi_urls":{"items":{"type":"string"},"type":"array","title":"Psi Urls"},"validate_w3c":{"type":"boolean","title":"Validate W3C","default":false},"w3c_urls":{"items":{"type":"string"},"type":"array","title":"W3C Urls"},"w3c_all_pages":{"type":"boolean","title":"W3C All Pages","default":false},"created_at":{"type":"string","title":"Created At"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"group_ids":{"items":{"type":"integer"},"type":"array","title":"Group Ids"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"last_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Score"},"last_health":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Health"},"last_run_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Run At"},"runs_count":{"type":"integer","title":"Runs Count","default":0}},"type":"object","required":["id","user_id","url","label","depth","crawl_pages","psi","created_at"],"title":"SiteOut"},"SiteUpdateRequest":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Label"},"crawl_pages":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Crawl Pages"},"psi":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Psi"},"psi_urls":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":4},{"type":"null"}],"title":"Psi Urls"},"validate_w3c":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Validate W3C"},"w3c_urls":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":4},{"type":"null"}],"title":"W3C Urls"},"w3c_all_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"W3C All Pages"},"group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Group Ids","description":"Полный новый набор папок сайта."},"set_groups":{"type":"boolean","title":"Set Groups","description":"True — применить group_ids (в т.ч. [] = убрать из всех папок).","default":false}},"type":"object","title":"SiteUpdateRequest"},"SitemapCheckRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"URL sitemap.xml (или sitemap_index.xml)."},"lang":{"type":"string","enum":["ru","en"],"title":"Lang","description":"Язык сообщений.","default":"ru"}},"type":"object","required":["url"],"title":"SitemapCheckRequest","description":"Запрос проверки sitemap по URL (фетч с SSRF-защитой)."},"SitemapCheckResponse":{"properties":{"found":{"type":"boolean","title":"Found","description":"Удалось ли загрузить и распознать sitemap."},"fetched_url":{"type":"string","title":"Fetched Url","description":"Финальный URL после редиректов."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"urlset | sitemapindex | None."},"url_count":{"type":"integer","title":"Url Count","description":"Кол-во <loc> в urlset.","default":0},"sitemap_count":{"type":"integer","title":"Sitemap Count","description":"Кол-во под-карт в sitemapindex.","default":0},"sub_sitemaps":{"items":{"type":"string"},"type":"array","title":"Sub Sitemaps","description":"Первые под-карты (до 50)."},"https":{"type":"boolean","title":"Https","description":"Отдаётся ли по https.","default":false},"issues":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Issues","description":"{severity, message}."}},"type":"object","required":["found","fetched_url"],"title":"SitemapCheckResponse"},"SubscriptionOut":{"properties":{"tier":{"type":"string","title":"Tier"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"status":{"type":"string","title":"Status"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End"},"auto_renew":{"type":"boolean","title":"Auto Renew","default":false},"next_charge_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Charge At"},"payment_method_saved":{"type":"boolean","title":"Payment Method Saved","default":false}},"type":"object","required":["tier","status"],"title":"SubscriptionOut","description":"Текущая активная подписка для кабинета (статус авто-продления)."},"TeamCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"TeamCreate"},"TeamOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"owner_id":{"type":"integer","title":"Owner Id"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"created_at":{"type":"string","title":"Created At"},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"my_role":{"type":"string","title":"My Role","default":"member"},"my_perms":{"$ref":"#/components/schemas/MemberPerms"},"members_count":{"type":"integer","title":"Members Count","default":0},"sites_count":{"type":"integer","title":"Sites Count","default":0},"limits":{"additionalProperties":{"type":"integer"},"type":"object","title":"Limits"}},"type":"object","required":["id","name","owner_id","created_at"],"title":"TeamOut"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserOut"}},"type":"object","required":["access_token","user"],"title":"TokenResponse"},"UnsubscribeOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"opt_out":{"type":"boolean","title":"Opt Out","default":true}},"type":"object","required":["ok"],"title":"UnsubscribeOut","description":"Результат отписки по публичному токену."},"UserAdminCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"role":{"type":"string","pattern":"^(client|staff|admin)$","title":"Role","default":"client"},"tier":{"type":"string","pattern":"^(free|pro|pro_plus|business|enterprise)$","title":"Tier","default":"free"}},"type":"object","required":["email","password"],"title":"UserAdminCreate"},"UserAdminUpdate":{"properties":{"role":{"anyOf":[{"type":"string","pattern":"^(client|staff|admin)$"},{"type":"null"}],"title":"Role"},"tier":{"anyOf":[{"type":"string","pattern":"^(free|pro|pro_plus|business|enterprise)$"},{"type":"null"}],"title":"Tier"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UserAdminUpdate"},"UserOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"tier":{"type":"string","title":"Tier"},"is_active":{"type":"boolean","title":"Is Active"},"trial_ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trial Ends At"},"created_at":{"type":"string","title":"Created At"},"must_set_password":{"type":"boolean","title":"Must Set Password","default":false},"promo_opt_out":{"type":"boolean","title":"Promo Opt Out","default":false},"limits":{"additionalProperties":{"type":"integer"},"type":"object","title":"Limits"},"is_primary_admin":{"type":"boolean","title":"Is Primary Admin","default":false}},"type":"object","required":["id","email","role","tier","is_active","created_at"],"title":"UserOut"},"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"}}}}