{"openapi":"3.1.0","info":{"title":"EmailValidator","description":"Professional Email Validation Service","version":"0.1.0"},"paths":{"/api/validate-single":{"post":{"tags":["api"],"summary":"Validate Single","description":"Validate a single email address","operationId":"validate_single_api_validate_single_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailValidationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/validate-bulk":{"post":{"tags":["api"],"summary":"Validate Bulk","description":"Validate multiple email addresses","operationId":"validate_bulk_api_validate_bulk_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_validate_bulk_api_validate_bulk_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"tags":["api"],"summary":"Health Check","description":"Health check endpoint","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/validate-bulk-batch":{"post":{"tags":["api"],"summary":"Validate Bulk Batch","description":"Validate a batch of email addresses to avoid timeouts","operationId":"validate_bulk_batch_api_validate_bulk_batch_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_validate_bulk_batch_api_validate_bulk_batch_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spf-check/{domain}":{"get":{"tags":["api"],"summary":"Check Spf Record","description":"Check SPF record for a domain","operationId":"check_spf_record_api_spf_check__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/domain-check/{domain}":{"get":{"tags":["api"],"summary":"Domain Check","description":"Полная проверка почтовой конфигурации домена (MX, SPF, DKIM, DMARC, MTA-STS,\nTLS-RPT, DNSSEC, BIMI). Бесплатно, без аккаунта, IP rate-limit. `only=<секция>`\nвозвращает одну секцию (для спиц-страниц). См. src/validation/domain_checker.py.","operationId":"domain_check_api_domain_check__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"dkim_selector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dkim Selector"}},{"name":"only","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bulk/jobs":{"post":{"tags":["bulk"],"summary":"Create Bulk Job","description":"Create an async bulk job from an uploaded file (or pasted addresses).","operationId":"create_bulk_job_api_bulk_jobs_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_bulk_job_api_bulk_jobs_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["bulk"],"summary":"List Bulk Jobs","description":"List the caller's recent bulk jobs (newest first).","operationId":"list_bulk_jobs_api_bulk_jobs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bulk/jobs/{job_id}":{"get":{"tags":["bulk"],"summary":"Get Bulk Job","description":"Status / progress for one job.","operationId":"get_bulk_job_api_bulk_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bulk/jobs/{job_id}/results":{"get":{"tags":["bulk"],"summary":"Get Bulk Job Results","description":"Paginated results for a job, ordered by original position.","operationId":"get_bulk_job_results_api_bulk_jobs__job_id__results_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bulk/jobs/{job_id}/cancel":{"post":{"tags":["bulk"],"summary":"Cancel Bulk Job","description":"Cancel a queued/processing job. Results already computed are kept.","operationId":"cancel_bulk_job_api_bulk_jobs__job_id__cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bulk/jobs/{job_id}/download":{"get":{"tags":["bulk"],"summary":"Download Bulk Job","description":"Stream the whole result set as CSV (email,status,disposable,reason,flags).","operationId":"download_bulk_job_api_bulk_jobs__job_id__download_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bonus/{code}/state":{"get":{"tags":["bonus"],"summary":"Bonus State","description":"Public campaign state: tiers, live counters, timer. Drives the page + polling.\n\nEngagement-anchored: the first real human page view (this JS call, which crawlers\ndon't run) starts a countdown. For a single first_visit campaign that starts the 1h\nclaim window; for a dual campaign it starts the teaser countdown (the main drop is\nposted by the admin once the teaser elapses). `preview=1` never triggers either.","operationId":"bonus_state_api_bonus__code__state_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"preview","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Preview"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bonus/history":{"get":{"tags":["bonus"],"summary":"Bonus History","description":"Public log of past drops (trust signal). Uses the durable DB mirror of counters\n(Redis counts expire), no personal data. Only drops that actually had winners, so\nempty/test drops never pollute the log.","operationId":"bonus_history_api_bonus_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bonus/{code}/my-result":{"get":{"tags":["bonus"],"summary":"Bonus My Result","description":"What the signed-in caller won in this campaign (idempotent on re-clicks).","operationId":"bonus_my_result_api_bonus__code__my_result_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify":{"get":{"tags":["auth"],"summary":"Verify","operationId":"verify_api_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/resend":{"post":{"tags":["auth"],"summary":"Resend","operationId":"resend_api_auth_resend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/google/login":{"get":{"tags":["auth"],"summary":"Google Login","operationId":"google_login_api_auth_google_login_get","parameters":[{"name":"campaign","in":"query","required":false,"schema":{"type":"string","default":"","title":"Campaign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"get":{"tags":["auth"],"summary":"Google Callback","operationId":"google_callback_api_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/forgot":{"post":{"tags":["auth"],"summary":"Forgot","operationId":"forgot_api_auth_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset":{"post":{"tags":["auth"],"summary":"Reset","operationId":"reset_api_auth_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["auth"],"summary":"Delete Account","description":"Permanently delete the account. Cancels any active Stripe subscription first,\nthen removes the user (API keys + subscription row cascade). Stripe keeps its\nown invoice history for tax; our PII is erased.","operationId":"delete_account_api_auth_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/session":{"get":{"tags":["auth"],"summary":"Session","description":"Sign-in probe for the frontend (nav, pricing). Returns 200 always - no 401\nconsole noise for anonymous visitors. Mirrors /me's fields when signed in.","operationId":"session_api_auth_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/keys":{"post":{"tags":["auth"],"summary":"Create Key","description":"Create a new API key. Existing keys are revoked (one active key for MVP).\nThe plaintext is returned once and never stored. Ключ выдаётся любому\nподтверждённому аккаунту, включая Free: планы различают объём и частоту, а не\nсамо наличие API.","operationId":"create_key_api_auth_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/usage":{"get":{"tags":["auth"],"summary":"Usage","description":"Дневная история тарифицируемых проверок (Valid/Not Valid) для графика в кабинете.","operationId":"usage_api_auth_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/checkout":{"post":{"tags":["billing"],"summary":"Checkout","operationId":"checkout_api_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/portal":{"post":{"tags":["billing"],"summary":"Portal","operationId":"portal_api_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/stats":{"get":{"tags":["admin"],"summary":"Stats","description":"Сводка дашборда за выбранный период.","operationId":"stats_api_admin_stats_get","parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string","default":"7d","title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"Список пользователей (последние сверху) с состоянием и текущим расходом квоты.","operationId":"list_users_api_admin_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"delete":{"tags":["admin"],"summary":"Delete User","description":"Delete an account (for cleaning up test / duplicate registrations). The\nsuper-admin's own account is protected. Related rows cascade or null out per FK.","operationId":"delete_user_api_admin_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/credit-override":{"post":{"tags":["admin"],"summary":"Set Credit Override","description":"Выставить/снять кастомную месячную квоту для аккаунта (для «избранных» free).\nАккаунт остаётся на своём тарифе - SES для free НЕ включается (кап по цене $0).","operationId":"set_credit_override_api_admin_users__user_id__credit_override_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditOverrideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/filter":{"get":{"tags":["admin"],"summary":"Get Filter","operationId":"get_filter_api_admin_filter_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Set Filter","operationId":"set_filter_api_admin_filter_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/settings":{"get":{"tags":["admin-bonus"],"summary":"Get Bonus Settings","operationId":"get_bonus_settings_api_admin_bonus_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin-bonus"],"summary":"Update Bonus Settings","operationId":"update_bonus_settings_api_admin_bonus_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns":{"get":{"tags":["admin-bonus"],"summary":"List Campaigns","operationId":"list_campaigns_api_admin_bonus_campaigns_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-bonus"],"summary":"Create Campaign","operationId":"create_campaign_api_admin_bonus_campaigns_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}":{"get":{"tags":["admin-bonus"],"summary":"Campaign Detail","operationId":"campaign_detail_api_admin_bonus_campaigns__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}/arm":{"post":{"tags":["admin-bonus"],"summary":"Arm","operationId":"arm_api_admin_bonus_campaigns__cid__arm_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}/activate":{"post":{"tags":["admin-bonus"],"summary":"Activate","operationId":"activate_api_admin_bonus_campaigns__cid__activate_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}/end":{"post":{"tags":["admin-bonus"],"summary":"End","operationId":"end_api_admin_bonus_campaigns__cid__end_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}/relaunch":{"post":{"tags":["admin-bonus"],"summary":"Relaunch","description":"Reset an ended/canceled drop that got zero registrations back to draft (same link).\nRefuses if anyone actually registered/won - those drops stay as durable history.","operationId":"relaunch_api_admin_bonus_campaigns__cid__relaunch_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/registrations":{"get":{"tags":["admin-bonus"],"summary":"Recent Registrations","operationId":"recent_registrations_api_admin_bonus_registrations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/grants/{gid}/clawback":{"post":{"tags":["admin-bonus"],"summary":"Clawback Grant","description":"Revoke a specific grant (fraud). Clears the user's live balance if it came from\nthis grant. Grand once-per-lifetime is intentionally NOT reset.","operationId":"clawback_grant_api_admin_bonus_grants__gid__clawback_post","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","title":"Gid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/templates":{"get":{"tags":["admin-bonus"],"summary":"Get Post Templates","operationId":"get_post_templates_api_admin_bonus_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin-bonus"],"summary":"Update Post Template","operationId":"update_post_template_api_admin_bonus_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bonus/campaigns/{cid}/posts":{"get":{"tags":["admin-bonus"],"summary":"Campaign Posts","description":"Ready-to-post text per network for this campaign (variables substituted) plus\na composer link where supported. Assisted posting - admin copies and posts.","operationId":"campaign_posts_api_admin_bonus_campaigns__cid__posts_get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/rules":{"get":{"tags":["admin-hygiene"],"summary":"List Rules","operationId":"list_rules_api_admin_hygiene_rules_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-hygiene"],"summary":"Create Rule","operationId":"create_rule_api_admin_hygiene_rules_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/meta":{"get":{"tags":["admin-hygiene"],"summary":"Rule Meta","description":"Словари для интерфейса плюс разбивка по тегам - чтобы админ видел объём.","operationId":"rule_meta_api_admin_hygiene_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/hygiene/rules/{rule_id}":{"patch":{"tags":["admin-hygiene"],"summary":"Update Rule","operationId":"update_rule_api_admin_hygiene_rules__rule_id__patch","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-hygiene"],"summary":"Delete Rule","operationId":"delete_rule_api_admin_hygiene_rules__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/rules/bulk":{"post":{"tags":["admin-hygiene"],"summary":"Create Rules Bulk","operationId":"create_rules_bulk_api_admin_hygiene_rules_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRulesIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/sources":{"get":{"tags":["admin-hygiene"],"summary":"List Sources","operationId":"list_sources_api_admin_hygiene_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin-hygiene"],"summary":"Create Source","operationId":"create_source_api_admin_hygiene_sources_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/builtin":{"get":{"tags":["admin-hygiene"],"summary":"Builtin Lists","description":"Встроенные списки, которые живут не в таблице правил. Сейчас один: база\nодноразовых доменов в файле. Показываем здесь, чтобы «когда обновлялось в\nпоследний раз» было видно в одном месте со всеми остальными списками - именно\nотсутствие такого экрана позволило прошлому механизму умереть незамеченным.","operationId":"builtin_lists_api_admin_hygiene_builtin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/hygiene/builtin/disposable/refresh":{"post":{"tags":["admin-hygiene"],"summary":"Refresh Builtin Disposable","description":"Обновить базу одноразовых доменов прямо сейчас, не дожидаясь крона.","operationId":"refresh_builtin_disposable_api_admin_hygiene_builtin_disposable_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/hygiene/sources/{source_id}":{"delete":{"tags":["admin-hygiene"],"summary":"Delete Source","operationId":"delete_source_api_admin_hygiene_sources__source_id__delete","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"keep_rules","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Keep Rules"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/sources/{source_id}/sync":{"post":{"tags":["admin-hygiene"],"summary":"Sync Source","description":"dry_run=true по умолчанию: сначала показываем, что изменится, и только по\nвторому нажатию применяем. Импорт на тысячи доменов вслепую - это как раз то,\nпосле чего никто не может объяснить, откуда взялась пометка.","operationId":"sync_source_api_admin_hygiene_sources__source_id__sync_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hygiene/events":{"get":{"tags":["admin-hygiene"],"summary":"List Events","operationId":"list_events_api_admin_hygiene_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/suppression":{"get":{"tags":["suppression"],"summary":"List Entries","operationId":"list_entries_api_account_suppression_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["suppression"],"summary":"Add Entries","operationId":"add_entries_api_account_suppression_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["suppression"],"summary":"Clear All","description":"Полная очистка списка. confirm=true обязателен: список мог собираться годами,\nа восстановить его нам не из чего.","operationId":"clear_all_api_account_suppression_delete","parameters":[{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Confirm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/suppression/{entry_id}":{"delete":{"tags":["suppression"],"summary":"Delete Entry","operationId":"delete_entry_api_account_suppression__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/suppression/export":{"get":{"tags":["suppression"],"summary":"Export Entries","description":"Выгрузка списка в CSV. Список принадлежит клиенту - он должен иметь\nвозможность забрать его целиком и уйти.","operationId":"export_entries_api_account_suppression_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhook/stripe":{"post":{"tags":["webhook"],"summary":"Stripe Webhook","description":"Stripe billing webhook: verifies signature and applies subscription changes.","operationId":"stripe_webhook_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhook/deploy":{"post":{"tags":["webhook"],"summary":"Webhook Deploy","description":"GitHub webhook endpoint for automatic deployment","operationId":"webhook_deploy_webhook_deploy_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp":{"get":{"tags":["mcp"],"summary":"Mcp No Stream","description":"No server-initiated stream: this server is stateless and answers on POST.","operationId":"mcp_no_stream_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp No Session","description":"No sessions to terminate - the server keeps no per-client state.","operationId":"mcp_no_session_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/static/images/{filename}":{"get":{"summary":"Serve Image","description":"Serve images with proper MIME types","operationId":"serve_image_static_images__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/static/css/{filename}":{"get":{"summary":"Serve Css","description":"Serve CSS files with proper MIME types","operationId":"serve_css_static_css__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/static/js/{filename}":{"get":{"summary":"Serve Js","description":"Serve JS files with proper MIME types","operationId":"serve_js_static_js__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","description":"Serve robots.txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ads.txt":{"get":{"summary":"Ads Txt","description":"Serve ads.txt","operationId":"ads_txt_ads_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap Xml","description":"sitemap.xml from the page registry, lastmod = last commit of each template.","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/28198c157a101b57860094b02519ba1d.txt":{"get":{"summary":"Indexnow Key","description":"IndexNow ownership proof (the key is public by design).","operationId":"indexnow_key_28198c157a101b57860094b02519ba1d_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"Serve llms.txt (machine-readable summary for AI assistants)","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","description":"Serve favicon at web root (browsers request it automatically)","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/appspecific/com.chrome.devtools.json":{"get":{"summary":"Chrome Devtools","description":"Serve Chrome DevTools configuration","operationId":"chrome_devtools__well_known_appspecific_com_chrome_devtools_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/appspecific/{path}":{"get":{"summary":"Well Known Appspecific","description":"Handle other .well-known/appspecific requests","operationId":"well_known_appspecific__well_known_appspecific__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Read Root","description":"Serve main page","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/emailchecker.html":{"get":{"summary":"Email Checker","description":"Serve single email checker page","operationId":"email_checker_emailchecker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/email-syntax-checker.html":{"get":{"summary":"Email Syntax Checker","description":"Serve email syntax / format checker page (client-side check)","operationId":"email_syntax_checker_email_syntax_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bulk-email-checker.html":{"get":{"summary":"Bulk Email Checker","description":"Serve bulk email checker page","operationId":"bulk_email_checker_bulk_email_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api-docs.html":{"get":{"summary":"Api Docs","description":"Serve API documentation page","operationId":"api_docs_api_docs_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chrome-extension-demo.html":{"get":{"summary":"Chrome Extension Demo","description":"Serve Chrome Extension demo page","operationId":"chrome_extension_demo_chrome_extension_demo_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacy-policy.html":{"get":{"summary":"Privacy Policy","description":"Serve privacy policy page","operationId":"privacy_policy_privacy_policy_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms-of-service.html":{"get":{"summary":"Terms Of Service","description":"Serve terms of service page","operationId":"terms_of_service_terms_of_service_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cookie-policy.html":{"get":{"summary":"Cookie Policy","description":"Serve cookie policy page","operationId":"cookie_policy_cookie_policy_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contact-us.html":{"get":{"summary":"Contact Us","description":"Serve contact us page","operationId":"contact_us_contact_us_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bonus":{"get":{"summary":"Bonus History Page","operationId":"bonus_history_page_bonus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bonus/{code}":{"get":{"summary":"Bonus Page","operationId":"bonus_page_bonus__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bonus/{code}/result":{"get":{"summary":"Bonus Result Page","operationId":"bonus_result_page_bonus__code__result_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domain-checker":{"get":{"summary":"Domain Checker Redirect","description":"Slashless form -> hub. Explicit and relative: the automatic slash redirect builds\nan absolute URL from the proxied request and pointed to http://.","operationId":"domain_checker_redirect_domain_checker_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/":{"get":{"summary":"Domain Checker Hub","description":"Domain checker hub: full domain email-config check + links to focused tools.","operationId":"domain_checker_hub_domain_checker__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/spf-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_spf_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/dkim-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_dkim_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/dmarc-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_dmarc_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/mx-lookup.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_mx_lookup_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/mta-sts-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_mta_sts_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/tls-rpt-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_tls_rpt_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/dnssec-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_dnssec_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker/bimi-checker.html":{"get":{"summary":" Serve","operationId":"_serve_domain_checker_bimi_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/domain-checker.html":{"get":{"summary":" Redirect","operationId":"_redirect_domain_checker_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/spf-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_spf_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dkim-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_dkim_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dmarc-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_dmarc_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mx-lookup.html":{"get":{"summary":" Redirect","operationId":"_redirect_mx_lookup_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mta-sts-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_mta_sts_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tls-rpt-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_tls_rpt_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dnssec-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_dnssec_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bimi-check.html":{"get":{"summary":" Redirect","operationId":"_redirect_bimi_check_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pricing.html":{"get":{"summary":"Pricing Page","description":"Public pricing page. Canonical URL is /pricing.html to match the rest of the\nsite's content pages (emailchecker.html, api-docs.html, ...).","operationId":"pricing_page_pricing_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pricing":{"get":{"summary":"Pricing Redirect","description":"Legacy clean URL -> canonical .html (301, preserves old links/backlinks).","operationId":"pricing_redirect_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations/":{"get":{"summary":"Integrations Page","description":"Integrations hub: plugins, SDKs and marketplace listings. Canonical URL uses a\ntrailing slash to match the other directory-style hub (/domain-checker/).","operationId":"integrations_page_integrations__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations":{"get":{"summary":"Integrations Redirect","description":"Redirect the slashless form to the canonical trailing-slash URL.","operationId":"integrations_redirect_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations/{slug}/":{"get":{"summary":"Integration Subpage","operationId":"integration_subpage_integrations__slug___get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/{slug}":{"get":{"summary":"Integration Subpage Redirect","description":"Redirect the slashless sub-page form to the canonical trailing-slash URL.","operationId":"integration_subpage_redirect_integrations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login Page","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/register":{"get":{"summary":"Register Page","operationId":"register_page_register_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account":{"get":{"summary":"Account Page","description":"Account dashboard (fetches /api/auth/me client-side).","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/reset-password":{"get":{"summary":"Reset Password Page","operationId":"reset_password_page_reset_password_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/":{"get":{"summary":"Admin Page","operationId":"admin_page_admin__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin":{"get":{"summary":"Admin Page","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/bonus/":{"get":{"summary":"Admin Bonus Page","operationId":"admin_bonus_page_admin_bonus__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/bonus":{"get":{"summary":"Admin Bonus Page","operationId":"admin_bonus_page_admin_bonus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/hygiene/":{"get":{"summary":"Admin Hygiene Page","operationId":"admin_hygiene_page_admin_hygiene__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/hygiene":{"get":{"summary":"Admin Hygiene Page","operationId":"admin_hygiene_page_admin_hygiene_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/login":{"post":{"summary":"Admin Login Honeypot","description":"Honeypot. Never authenticates. Records only the attempt count + a small\nforensic tail (IP, submitted username, time). The password is neither read\ninto storage nor logged. Always returns a generic failure.","operationId":"admin_login_honeypot_admin_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AddIn":{"properties":{"values":{"type":"string","title":"Values"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["values"],"title":"AddIn","description":"values: адреса и/или домены, по одному на строку либо через запятую.\nДомен можно писать как example.com или @example.com."},"Body_create_bulk_job_api_bulk_jobs_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"emails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emails"}},"type":"object","title":"Body_create_bulk_job_api_bulk_jobs_post"},"Body_validate_bulk_api_validate_bulk_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"emails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emails"}},"type":"object","title":"Body_validate_bulk_api_validate_bulk_post"},"Body_validate_bulk_batch_api_validate_bulk_batch_post":{"properties":{"batch_start":{"type":"integer","title":"Batch Start","default":0},"batch_size":{"type":"integer","title":"Batch Size","default":20},"total_emails":{"type":"integer","title":"Total Emails","default":0},"file_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Content"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type","default":"txt"}},"type":"object","title":"Body_validate_bulk_batch_api_validate_bulk_batch_post"},"BulkRulesIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"domain"},"action":{"type":"string","title":"Action","default":"flag"},"tag":{"type":"string","title":"Tag","default":"role"},"values":{"type":"string","title":"Values"}},"type":"object","required":["values"],"title":"BulkRulesIn","description":"Вставка списком: по значению на строку. Для ручного переноса своего списка."},"BulkValidationResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ValidationResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"batch_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Batch Info"}},"type":"object","required":["results","total"],"title":"BulkValidationResponse","description":"Response model for bulk validation"},"CampaignIn":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"networks":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Networks"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"campaign_type":{"type":"string","title":"Campaign Type","default":"dual"},"activation_mode":{"type":"string","title":"Activation Mode","default":"manual"}},"type":"object","title":"CampaignIn"},"CheckoutIn":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CheckoutIn"},"CreditOverrideIn":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value"}},"type":"object","title":"CreditOverrideIn"},"EmailIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"EmailIn"},"EmailValidationRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"EmailValidationRequest","description":"Request model for single email validation"},"FilterIn":{"properties":{"range":{"type":"string","title":"Range","default":"7d"}},"type":"object","title":"FilterIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"RegisterIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterIn"},"ResetIn":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"ResetIn"},"RuleIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"domain"},"value":{"type":"string","title":"Value"},"action":{"type":"string","title":"Action","default":"flag"},"tag":{"type":"string","title":"Tag","default":"role"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["value"],"title":"RuleIn"},"RulePatch":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"RulePatch"},"SettingsIn":{"properties":{"grand_amount":{"type":"integer","title":"Grand Amount"},"grand_slots":{"type":"integer","title":"Grand Slots"},"secondary_amount":{"type":"integer","title":"Secondary Amount"},"secondary_slots":{"type":"integer","title":"Secondary Slots"},"consolation_amount":{"type":"integer","title":"Consolation Amount"},"consolation_slots":{"type":"integer","title":"Consolation Slots"},"link_duration_seconds":{"type":"integer","title":"Link Duration Seconds"},"teaser_duration_seconds":{"type":"integer","title":"Teaser Duration Seconds","default":3600},"daily_throughput_cap":{"type":"integer","title":"Daily Throughput Cap","default":0}},"type":"object","required":["grand_amount","grand_slots","secondary_amount","secondary_slots","consolation_amount","consolation_slots","link_duration_seconds"],"title":"SettingsIn"},"SourceIn":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"format":{"type":"string","title":"Format","default":"lines"},"kind":{"type":"string","title":"Kind","default":"domain"},"action":{"type":"string","title":"Action","default":"flag"},"tag":{"type":"string","title":"Tag","default":"disposable"},"license_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Note"},"interval_days":{"type":"integer","title":"Interval Days","default":7},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","url"],"title":"SourceIn"},"TemplateIn":{"properties":{"network":{"type":"string","title":"Network"},"role":{"type":"string","title":"Role"},"body":{"type":"string","title":"Body"}},"type":"object","required":["network","role","body"],"title":"TemplateIn"},"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"},"ValidationFlag":{"properties":{"tag":{"type":"string","title":"Tag"},"label":{"type":"string","title":"Label"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"source":{"type":"string","title":"Source","default":"builtin"}},"type":"object","required":["tag","label"],"title":"ValidationFlag","description":"Пометка о свойстве адреса. `source` обязателен: пометка, происхождение\nкоторой нельзя предъявить, - это догадка, а догадок мы не показываем."},"ValidationResult":{"properties":{"email":{"type":"string","title":"Email"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid"},"formatValid":{"type":"boolean","title":"Formatvalid"},"mxValid":{"type":"boolean","title":"Mxvalid"},"smtpValid":{"type":"boolean","title":"Smtpvalid"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details"},"mx_servers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mx Servers"},"smtp_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Message"},"is_disposable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Disposable"},"flags":{"items":{"$ref":"#/components/schemas/ValidationFlag"},"type":"array","title":"Flags"}},"type":"object","required":["email","formatValid","mxValid","smtpValid","status"],"title":"ValidationResult","description":"Result model for email validation"}}}}