{"openapi":"3.1.0","info":{"title":"VeilScan","version":"0.1.0"},"paths":{"/ref/{code}":{"get":{"summary":"Referral Redirect","description":"Record affiliate click and redirect to /register with referral cookie set.","operationId":"referral_redirect_ref__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"}}}}}}},"/":{"get":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pricing":{"get":{"summary":"Pricing","operationId":"pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"summary":"Terms","operationId":"terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/aup":{"get":{"summary":"Aup","operationId":"aup_aup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/engagement":{"get":{"summary":"Engagement","operationId":"engagement_engagement_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/security":{"get":{"summary":"Security Page","operationId":"security_page_security_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/about":{"get":{"summary":"About","operationId":"about_about_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/contact":{"get":{"summary":"Contact","operationId":"contact_contact_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/verify/{token}":{"get":{"summary":"Verify Report","description":"Public report verification — shows safe summary only, no sensitive findings.","operationId":"verify_report_verify__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login","operationId":"login_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Login Post","operationId":"login_post_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_post_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/register":{"get":{"summary":"Register","operationId":"register_register_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Register Post","operationId":"register_post_register_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_register_post_register_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify-email":{"get":{"summary":"Verify Email Page","operationId":"verify_email_page_verify_email_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Verify Email Post","operationId":"verify_email_post_verify_email_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_email_post_verify_email_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify-email/resend":{"post":{"summary":"Resend Verify Email","operationId":"resend_verify_email_verify_email_resend_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_resend_verify_email_verify_email_resend_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"get":{"summary":"Logout","description":"Clear the session cookie and redirect to /login.","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/forgot-password":{"get":{"summary":"Forgot Password Page","operationId":"forgot_password_page_forgot_password_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Forgot Password Post","operationId":"forgot_password_post_forgot_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_password_post_forgot_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset-password":{"get":{"summary":"Reset Password Page","operationId":"reset_password_page_reset_password_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Reset Password Post","operationId":"reset_password_post_reset_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_reset_password_post_reset_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog":{"get":{"summary":"Blog Index","operationId":"blog_index_blog_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/what-is-an-external-attack-surface-scan":{"get":{"summary":"Blog Eass","operationId":"blog_eass_blog_what_is_an_external_attack_surface_scan_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/vulnerability-scanner-vs-penetration-testing":{"get":{"summary":"Blog Vuln Vs Pentest","operationId":"blog_vuln_vs_pentest_blog_vulnerability_scanner_vs_penetration_testing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/how-proof-backed-security-scanning-reduces-false-positives":{"get":{"summary":"Blog Proof Backed","operationId":"blog_proof_backed_blog_how_proof_backed_security_scanning_reduces_false_positives_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/penetration-testing-vs-vulnerability-assessment":{"get":{"summary":"Blog Pen Test Vs Vuln Assessment","operationId":"blog_pen_test_vs_vuln_assessment_blog_penetration_testing_vs_vulnerability_assessment_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/vulnerability-testing-vs-penetration-testing":{"get":{"summary":"Blog Vuln Testing Vs Pen Testing","operationId":"blog_vuln_testing_vs_pen_testing_blog_vulnerability_testing_vs_penetration_testing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/nessus-va-scan-explained":{"get":{"summary":"Blog Nessus Va Scan","operationId":"blog_nessus_va_scan_blog_nessus_va_scan_explained_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/pentest-grade-vulnerability-assessment":{"get":{"summary":"Blog Pentest Grade Va","operationId":"blog_pentest_grade_va_blog_pentest_grade_vulnerability_assessment_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/vapt-soc-2-compliance":{"get":{"summary":"Blog Vapt Soc2 Compliance","operationId":"blog_vapt_soc2_compliance_blog_vapt_soc_2_compliance_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/vulnerability-analysis-and-prioritization":{"get":{"summary":"Blog Vuln Analysis Prioritization","operationId":"blog_vuln_analysis_prioritization_blog_vulnerability_analysis_and_prioritization_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/what-is-a-vulnerability-assessment":{"get":{"summary":"Blog What Is Vuln Assessment","operationId":"blog_what_is_vuln_assessment_blog_what_is_a_vulnerability_assessment_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/vulnerability-scanning-tools":{"get":{"summary":"Blog Vuln Scanning Tools","operationId":"blog_vuln_scanning_tools_blog_vulnerability_scanning_tools_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/scan-website-for-vulnerabilities":{"get":{"summary":"Blog Scan Website Vulns","operationId":"blog_scan_website_vulns_blog_scan_website_for_vulnerabilities_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/website-vulnerability-scanner":{"get":{"summary":"Blog Website Vuln Scanner","operationId":"blog_website_vuln_scanner_blog_website_vulnerability_scanner_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/free-scan":{"get":{"summary":"Free Scan Page","operationId":"free_scan_page_free_scan_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sample-report":{"get":{"summary":"Sample Report","operationId":"sample_report_sample_report_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features":{"get":{"summary":"Features Hub","operationId":"features_hub_features_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/faq":{"get":{"summary":"Faq Page","operationId":"faq_page_faq_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs":{"get":{"summary":"Docs Page","operationId":"docs_page_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases":{"get":{"summary":"Use Cases Hub","operationId":"use_cases_hub_use_cases_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare":{"get":{"summary":"Compare Hub","operationId":"compare_hub_compare_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary":{"get":{"summary":"Glossary Hub","operationId":"glossary_hub_glossary_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/proof-based-findings":{"get":{"summary":"Feature Proof Based","operationId":"feature_proof_based_features_proof_based_findings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/attack-path-analysis":{"get":{"summary":"Feature Attack Path","operationId":"feature_attack_path_features_attack_path_analysis_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/business-impact-score":{"get":{"summary":"Feature Bis","operationId":"feature_bis_features_business_impact_score_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/compliance-mapping":{"get":{"summary":"Feature Compliance","operationId":"feature_compliance_features_compliance_mapping_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/asset-discovery":{"get":{"summary":"Feature Asset Discovery","operationId":"feature_asset_discovery_features_asset_discovery_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/continuous-monitoring":{"get":{"summary":"Feature Continuous","operationId":"feature_continuous_features_continuous_monitoring_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/pdf-reports":{"get":{"summary":"Feature Pdf Reports","operationId":"feature_pdf_reports_features_pdf_reports_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/slack-alerts":{"get":{"summary":"Feature Slack","operationId":"feature_slack_features_slack_alerts_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/tls-email-security-checks":{"get":{"summary":"Feature Tls Email","operationId":"feature_tls_email_features_tls_email_security_checks_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/features/cloud-misconfiguration-detection":{"get":{"summary":"Feature Cloud","operationId":"feature_cloud_features_cloud_misconfiguration_detection_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases/startups":{"get":{"summary":"Use Case Startups","operationId":"use_case_startups_use_cases_startups_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases/saas":{"get":{"summary":"Use Case Saas","operationId":"use_case_saas_use_cases_saas_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases/fintech":{"get":{"summary":"Use Case Fintech","operationId":"use_case_fintech_use_cases_fintech_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases/between-pentests":{"get":{"summary":"Use Case Between Pentests","operationId":"use_case_between_pentests_use_cases_between_pentests_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/veilscan-vs-intruder":{"get":{"summary":"Compare Intruder","operationId":"compare_intruder_compare_veilscan_vs_intruder_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/veilscan-vs-detectify":{"get":{"summary":"Compare Detectify","operationId":"compare_detectify_compare_veilscan_vs_detectify_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/veilscan-vs-pentest-tools":{"get":{"summary":"Compare Pentest Tools","operationId":"compare_pentest_tools_compare_veilscan_vs_pentest_tools_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/veilscan-vs-manual-pentest":{"get":{"summary":"Compare Manual Pentest","operationId":"compare_manual_pentest_compare_veilscan_vs_manual_pentest_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/best-attack-surface-management-tools-startups":{"get":{"summary":"Compare Best Asm","operationId":"compare_best_asm_compare_best_attack_surface_management_tools_startups_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/what-is-external-attack-surface-management":{"get":{"summary":"Concept Easm","operationId":"concept_easm_what_is_external_attack_surface_management_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/what-is-proof-based-vulnerability-scanning":{"get":{"summary":"Concept Proof Based","operationId":"concept_proof_based_what_is_proof_based_vulnerability_scanning_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/what-is-attack-path-analysis":{"get":{"summary":"Concept Attack Path","operationId":"concept_attack_path_what_is_attack_path_analysis_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/what-is-business-impact-scoring":{"get":{"summary":"Concept Bis","operationId":"concept_bis_what_is_business_impact_scoring_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/what-is-continuous-vulnerability-monitoring":{"get":{"summary":"Concept Continuous","operationId":"concept_continuous_what_is_continuous_vulnerability_monitoring_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/easm":{"get":{"summary":"Glossary Easm","operationId":"glossary_easm_glossary_easm_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/attack-surface":{"get":{"summary":"Glossary Attack Surface","operationId":"glossary_attack_surface_glossary_attack_surface_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/external-attack-surface":{"get":{"summary":"Glossary External Attack Surface","operationId":"glossary_external_attack_surface_glossary_external_attack_surface_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/exposed-admin-panel":{"get":{"summary":"Glossary Exposed Admin","operationId":"glossary_exposed_admin_glossary_exposed_admin_panel_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/subdomain-takeover":{"get":{"summary":"Glossary Subdomain Takeover","operationId":"glossary_subdomain_takeover_glossary_subdomain_takeover_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/dangling-cname":{"get":{"summary":"Glossary Dangling Cname","operationId":"glossary_dangling_cname_glossary_dangling_cname_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/public-s3-bucket":{"get":{"summary":"Glossary Public S3","operationId":"glossary_public_s3_glossary_public_s3_bucket_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/exposed-env-file":{"get":{"summary":"Glossary Exposed Env","operationId":"glossary_exposed_env_glossary_exposed_env_file_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/tls-misconfiguration":{"get":{"summary":"Glossary Tls Misc","operationId":"glossary_tls_misc_glossary_tls_misconfiguration_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/dmarc":{"get":{"summary":"Glossary Dmarc","operationId":"glossary_dmarc_glossary_dmarc_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/spf-record":{"get":{"summary":"Glossary Spf","operationId":"glossary_spf_glossary_spf_record_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/dkim":{"get":{"summary":"Glossary Dkim","operationId":"glossary_dkim_glossary_dkim_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/cvss-score":{"get":{"summary":"Glossary Cvss","operationId":"glossary_cvss_glossary_cvss_score_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/business-impact-score":{"get":{"summary":"Glossary Bis","operationId":"glossary_bis_glossary_business_impact_score_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/false-positive-vulnerability":{"get":{"summary":"Glossary False Positive","operationId":"glossary_false_positive_glossary_false_positive_vulnerability_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/verified-exploitability":{"get":{"summary":"Glossary Verified Exploitability","operationId":"glossary_verified_exploitability_glossary_verified_exploitability_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/attack-path":{"get":{"summary":"Glossary Attack Path","operationId":"glossary_attack_path_glossary_attack_path_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/asset-discovery":{"get":{"summary":"Glossary Asset Discovery Page","operationId":"glossary_asset_discovery_page_glossary_asset_discovery_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/glossary/continuous-monitoring":{"get":{"summary":"Glossary Continuous Monitoring","operationId":"glossary_continuous_monitoring_glossary_continuous_monitoring_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/roe":{"get":{"summary":"Roe Page","operationId":"roe_page_roe_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Roe Post","operationId":"roe_post_roe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_roe_post_roe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/upgrade-preview":{"get":{"summary":"Upgrade Preview","description":"Return a prorated charge preview for the given upgrade plan.\n\nCalls Dodo's POST /subscriptions/{id}/change-plan/preview to get the real\nprorated amount Dodo will charge — not a manual estimate.\n\nResponse shape (same as before for template JS compatibility):\n  { prorated_amount_cents, currency, period_end_str,\n    new_plan_price_cents, is_dev? }","operationId":"upgrade_preview_dashboard_billing_upgrade_preview_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/upgrade":{"post":{"summary":"Upgrade Subscription","description":"Immediate plan upgrade using Dodo Payments dedicated change-plan flow.\n\nUses POST /subscriptions/{id}/change-plan (not PATCH /subscriptions/{id}).\nproration_billing_mode=prorated_immediately tells Dodo to charge only the price\nright now, generating a real invoice.  Next renewal bills the full new amount.\n\nDowngrades are rejected — use schedule_downgrade instead.\nDev bypass: updates DB plan only, no Dodo API call.","operationId":"upgrade_subscription_dashboard_billing_upgrade_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_upgrade_subscription_dashboard_billing_upgrade_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/schedule-downgrade":{"post":{"summary":"Schedule Downgrade","description":"Schedule a downgrade for the next billing cycle.\nThe current plan stays active until current_period_end; the new plan applies after.\nDoes NOT apply the downgrade immediately — business rule is next-cycle only.","operationId":"schedule_downgrade_dashboard_billing_schedule_downgrade_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_schedule_downgrade_dashboard_billing_schedule_downgrade_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/cancel-downgrade":{"post":{"summary":"Cancel Downgrade","description":"Cancel a previously scheduled downgrade. Plan remains unchanged.","operationId":"cancel_downgrade_dashboard_billing_cancel_downgrade_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_cancel_downgrade_dashboard_billing_cancel_downgrade_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/portal":{"get":{"summary":"Billing Portal","description":"Open the Dodo Customer Portal for the authenticated customer.\n\nCalls POST /customers/{dodo_customer_id}/customer-portal/session and\nredirects to the returned hosted portal URL.  The portal lets customers\nupdate their payment method, download invoices, and manage their\nsubscription directly within Dodo's hosted interface.\n\nreturn_url is set to /dashboard/billing so Dodo returns the customer\nhere after they finish in the portal.","operationId":"billing_portal_dashboard_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/billing/cancel-subscription":{"post":{"summary":"Cancel Subscription Route","description":"Customer-initiated end-of-period cancellation via Dodo Payments.\n\nCalls Dodo PATCH /subscriptions/{id} with cancel_at_next_billing_period=True\nso Dodo does not renew.  Access remains active until current_period_end.\nThe subscription.cancelled webhook fires at that point and deactivates the account.\n\nIn dev-bypass mode the DB flag is set and access continues until\ncurrent_period_end with no external API call.","operationId":"cancel_subscription_route_dashboard_billing_cancel_subscription_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_cancel_subscription_route_dashboard_billing_cancel_subscription_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing/undo-cancel":{"post":{"summary":"Undo Cancel Subscription","description":"Reverse a scheduled end-of-period cancellation.\nAttempts to reactivate the Dodo subscription; clears the DB cancel flag.","operationId":"undo_cancel_subscription_dashboard_billing_undo_cancel_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_undo_cancel_subscription_dashboard_billing_undo_cancel_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/scans":{"get":{"summary":"Scans","operationId":"scans_dashboard_scans_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/scans/{scan_id}/progress":{"get":{"summary":"Scan Progress","operationId":"scan_progress_dashboard_scans__scan_id__progress_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/scans/{scan_id}/progress.json":{"get":{"summary":"Scan Progress Json","description":"Real step progress for the progress page (FP2). No internal error text.","operationId":"scan_progress_json_dashboard_scans__scan_id__progress_json_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/findings":{"get":{"summary":"Findings","operationId":"findings_dashboard_findings_get","parameters":[{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},{"name":"secret_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/reports":{"get":{"summary":"Reports","description":"Single-scan report with ?scan_id=, otherwise the portfolio overview (FP3).","operationId":"reports_dashboard_reports_get","parameters":[{"name":"scan_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/billing":{"get":{"summary":"Billing","operationId":"billing_dashboard_billing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/settings":{"get":{"summary":"Settings","operationId":"settings_dashboard_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/scans/trigger":{"post":{"summary":"Trigger Scan","description":"Queue a scan for the authenticated customer.\n\nManual dashboard scans are always restricted to one selected verified\ndomain. Scheduled scans handle recurring per-domain coverage separately.","operationId":"trigger_scan_dashboard_scans_trigger_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_trigger_scan_dashboard_scans_trigger_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/consent/domain":{"post":{"summary":"Consent Domain Post","description":"Sign a new versioned authorization for one verified domain.\n\nEvery option defaults to off.  Unknown or malformed input fails closed\n(no record is written) except the rate limit, which is clamped.","operationId":"consent_domain_post_dashboard_consent_domain_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_consent_domain_post_dashboard_consent_domain_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/consent/revoke":{"post":{"summary":"Consent Revoke Post","operationId":"consent_revoke_post_dashboard_consent_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_consent_revoke_post_dashboard_consent_revoke_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/consent/emergency-stop":{"post":{"summary":"Consent Emergency Stop Post","description":"Stop active and side-effect testing on every domain of the account.\n\nRunning scans see the stop before their next active step (graph re-check).","operationId":"consent_emergency_stop_post_dashboard_consent_emergency_stop_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_consent_emergency_stop_post_dashboard_consent_emergency_stop_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/settings/slack":{"post":{"summary":"Save Slack","description":"Save or clear the Slack incoming webhook URL for the authenticated customer.\n\nAccepts:\n- Valid https://hooks.slack.com/services/... URL → saves it\n- Empty string → clears the webhook (disables Slack alerts)","operationId":"save_slack_dashboard_settings_slack_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_save_slack_dashboard_settings_slack_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/settings/slack/test":{"post":{"summary":"Test Slack","description":"Send a test message to the customer's saved Slack webhook URL.\nReturns JSON so the frontend can show a success or error toast without a page reload.","operationId":"test_slack_dashboard_settings_slack_test_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_test_slack_dashboard_settings_slack_test_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/domains/verify":{"post":{"summary":"Verify Domain","description":"Probe DNS TXT (then HTTPS file) to verify domain ownership.\nOn success, marks the domain as verified in the DB.\nOn failure, redirects with instructions still visible.\n\nThe probe is intentionally synchronous here — it completes in under 6 s\nbecause both DNS and HTTP timeouts are kept short.  For MVP scale this is\nacceptable; a background task can replace it later.","operationId":"verify_domain_dashboard_domains_verify_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_domain_dashboard_domains_verify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/domains/add":{"post":{"summary":"Add Domain","description":"Add a domain to this customer's scannable domain list.\n\nValidates:\n- Authenticated customer\n- Basic domain format (no URL prefix, valid labels)\n- Customer has not reached their plan domain limit\n\nDomains are added as unverified. Use POST /dashboard/domains/verify to confirm\nownership via DNS TXT or HTTPS file before the domain can be scanned.","operationId":"add_domain_dashboard_domains_add_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_add_domain_dashboard_domains_add_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/domains/remove":{"post":{"summary":"Remove Domain","description":"Remove a domain from this customer's scannable domain list.\n\nOwnership is enforced by filtering on both customer_id and domain —\na customer cannot remove another customer's domain.\n\nNote: removing a domain does not affect scans already in progress\n(the scan's domain list is snapshotted at trigger time).","operationId":"remove_domain_dashboard_domains_remove_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_remove_domain_dashboard_domains_remove_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/scans/{scan_id}/export/csv":{"get":{"summary":"Export Compliance Csv","operationId":"export_compliance_csv_dashboard_scans__scan_id__export_csv_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/scans/{scan_id}/export/json":{"get":{"summary":"Export Compliance Json","operationId":"export_compliance_json_dashboard_scans__scan_id__export_json_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google/login":{"get":{"summary":"Google Login","operationId":"google_login_auth_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"summary":"Google Callback","operationId":"google_callback_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"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/stripe":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_webhooks_stripe_post","parameters":[{"name":"stripe-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/dodo":{"post":{"summary":"Dodo Webhook","description":"Receive and verify Dodo (Svix) webhook events.","operationId":"dodo_webhook_webhooks_dodo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portal/{customer_id}":{"get":{"summary":"Portal","description":"Magic link entry point — DISABLED FOR LAUNCH.\nReturns 410 Gone. No session is created, no DB is read.\nTo re-enable: remove the _MAGIC_LINK_DISABLED guard below.","operationId":"portal_portal__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}},{"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"}}}}}}},"/portal/request-link":{"post":{"summary":"Request Magic Link","description":"Magic link request — DISABLED FOR LAUNCH.\nReturns 410 Gone. No token is created, no email is sent.\nTo re-enable: remove the _MAGIC_LINK_DISABLED guard below.","operationId":"request_magic_link_portal_request_link_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_request_magic_link_portal_request_link_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout":{"post":{"summary":"Create Checkout","description":"Create a Dodo Payments subscription checkout session and redirect to it.\n\nThe internal customer_id and plan name are stored in Dodo subscription metadata\nso the webhook handler can identify the customer without fragile email matching.\nDodo identifiers are stored as pending checkout state only. Active plan\nchanges happen exclusively in signed webhook handlers.","operationId":"create_checkout_billing_checkout_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_create_checkout_billing_checkout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/success":{"get":{"summary":"Checkout Success","description":"Dodo redirects here after a successful payment.\n\nReturn page only. Active plan changes are applied exclusively by signed Dodo\nwebhooks, so a forged/cached success redirect cannot grant access.","operationId":"checkout_success_billing_success_get","parameters":[{"name":"subscription_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subscription Id"}},{"name":"payment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/cancel":{"get":{"summary":"Checkout Cancel","description":"User abandoned checkout — return to dashboard with a neutral message.","operationId":"checkout_cancel_billing_cancel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/affiliate":{"get":{"summary":"Affiliate Index","operationId":"affiliate_index_dashboard_affiliate_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/affiliate/enroll":{"post":{"summary":"Affiliate Enroll","operationId":"affiliate_enroll_dashboard_affiliate_enroll_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_affiliate_enroll_dashboard_affiliate_enroll_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/affiliate/referrals":{"get":{"summary":"Affiliate Referrals","operationId":"affiliate_referrals_dashboard_affiliate_referrals_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/affiliate/earnings":{"get":{"summary":"Affiliate Earnings","operationId":"affiliate_earnings_dashboard_affiliate_earnings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/affiliate/withdraw":{"get":{"summary":"Affiliate Withdraw","operationId":"affiliate_withdraw_dashboard_affiliate_withdraw_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Affiliate Withdraw Post","operationId":"affiliate_withdraw_post_dashboard_affiliate_withdraw_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_affiliate_withdraw_post_dashboard_affiliate_withdraw_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/affiliate/payout-setup":{"post":{"summary":"Affiliate Payout Setup","operationId":"affiliate_payout_setup_dashboard_affiliate_payout_setup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_affiliate_payout_setup_dashboard_affiliate_payout_setup_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/login":{"get":{"summary":"Admin Login Page","operationId":"admin_login_page_admin_login_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Login","operationId":"admin_login_admin_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_login_admin_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/logout":{"get":{"summary":"Admin Logout","operationId":"admin_logout_admin_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin":{"get":{"summary":"Admin Index","operationId":"admin_index_admin_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers":{"get":{"summary":"Admin Customers","operationId":"admin_customers_admin_customers_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}":{"get":{"summary":"Admin Customer Detail","operationId":"admin_customer_detail_admin_customers__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}},{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/affiliate/create":{"post":{"summary":"Admin Customer Affiliate Create","operationId":"admin_customer_affiliate_create_admin_customers__customer_id__affiliate_create_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_customer_affiliate_create_admin_customers__customer_id__affiliate_create_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/affiliate/set-status":{"post":{"summary":"Admin Customer Affiliate Set Status","operationId":"admin_customer_affiliate_set_status_admin_customers__customer_id__affiliate_set_status_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_customer_affiliate_set_status_admin_customers__customer_id__affiliate_set_status_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/reset-free-scan-domain":{"post":{"summary":"Admin Reset Free Scan Domain","description":"Remove a domain from the free_scan_domains block-list (support reset).","operationId":"admin_reset_free_scan_domain_admin_customers__customer_id__reset_free_scan_domain_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_reset_free_scan_domain_admin_customers__customer_id__reset_free_scan_domain_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/set-email-verified":{"post":{"summary":"Admin Set Email Verified","operationId":"admin_set_email_verified_admin_customers__customer_id__set_email_verified_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_email_verified_admin_customers__customer_id__set_email_verified_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/set-active":{"post":{"summary":"Admin Set Active","description":"Legacy toggle kept for backwards compatibility. Prefer /suspend and /reactivate.","operationId":"admin_set_active_admin_customers__customer_id__set_active_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_active_admin_customers__customer_id__set_active_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/suspend":{"post":{"summary":"Admin Suspend","description":"Suspend portal access without cancelling the Stripe subscription.\nThe customer cannot log in but their subscription remains active in Stripe.\nUse /reactivate to restore access.","operationId":"admin_suspend_admin_customers__customer_id__suspend_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_suspend_admin_customers__customer_id__suspend_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/reactivate":{"post":{"summary":"Admin Reactivate","description":"Restore portal access for a suspended or inactive account.\nDoes not create a new Stripe subscription — use this after manually resolving\na payment issue or to undo a suspension.","operationId":"admin_reactivate_admin_customers__customer_id__reactivate_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_reactivate_admin_customers__customer_id__reactivate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/payment-retry":{"post":{"summary":"Admin Set Payment Retry","description":"Restore billing-only access so the customer can retry payment.","operationId":"admin_set_payment_retry_admin_customers__customer_id__payment_retry_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_payment_retry_admin_customers__customer_id__payment_retry_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/cancel-subscription":{"post":{"summary":"Admin Cancel Subscription","description":"Cancel a customer's subscription.\n\ncancel_in_provider=true  — cancels in the active payment provider (Dodo or Stripe)\n                           before marking the DB row inactive.  Use when you want to\n                           stop the next billing cycle immediately.\ncancel_in_provider=false — only updates the DB (e.g. the webhook has already\n                           fired, or you are cleaning up a dev/test account).\n\nDodo cancellation: DELETE /subscriptions/{dodo_subscription_id}.  Errors are\nlogged but do not block the DB cancel — the row is always marked inactive so\nthe customer loses portal access even if the provider API is temporarily down.\nThe operator must verify in the Dodo dashboard that billing stopped.","operationId":"admin_cancel_subscription_admin_customers__customer_id__cancel_subscription_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_cancel_subscription_admin_customers__customer_id__cancel_subscription_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/delete":{"post":{"summary":"Admin Delete Customer","description":"Anonymize a customer account locally after explicit two-step confirmation.\n\nCancels any live Dodo subscription before wiping the row so the customer\nis not charged after deletion.  If the Dodo cancel fails the deletion is\naborted — the admin must cancel billing manually before retrying.","operationId":"admin_delete_customer_admin_customers__customer_id__delete_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_delete_customer_admin_customers__customer_id__delete_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/set-plan":{"post":{"summary":"Admin Set Plan","operationId":"admin_set_plan_admin_customers__customer_id__set_plan_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_plan_admin_customers__customer_id__set_plan_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/update-email":{"post":{"summary":"Admin Update Email","operationId":"admin_update_email_admin_customers__customer_id__update_email_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_update_email_admin_customers__customer_id__update_email_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/reset-password":{"post":{"summary":"Admin Reset Password","operationId":"admin_reset_password_admin_customers__customer_id__reset_password_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_reset_password_admin_customers__customer_id__reset_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/set-domain-status":{"post":{"summary":"Admin Set Domain Status","operationId":"admin_set_domain_status_admin_customers__customer_id__set_domain_status_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_domain_status_admin_customers__customer_id__set_domain_status_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/scans":{"get":{"summary":"Admin Scans","operationId":"admin_scans_admin_scans_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/scans/trigger/{customer_id}":{"post":{"summary":"Admin Trigger Scan","operationId":"admin_trigger_scan_admin_scans_trigger__customer_id__post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_trigger_scan_admin_scans_trigger__customer_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/scans/{scan_id}":{"get":{"summary":"Admin Scan Detail","operationId":"admin_scan_detail_admin_scans__scan_id__get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}},{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/domains":{"get":{"summary":"Admin Domains","operationId":"admin_domains_admin_domains_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/billing":{"get":{"summary":"Admin Billing","operationId":"admin_billing_admin_billing_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"summary":"Admin Settings","operationId":"admin_settings_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/settings/toggle-registration":{"post":{"summary":"Admin Toggle Registration","operationId":"admin_toggle_registration_admin_settings_toggle_registration_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_toggle_registration_admin_settings_toggle_registration_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/maintenance/enable":{"post":{"summary":"Admin Maintenance Enable","operationId":"admin_maintenance_enable_admin_settings_maintenance_enable_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_maintenance_enable_admin_settings_maintenance_enable_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/maintenance/disable":{"post":{"summary":"Admin Maintenance Disable","operationId":"admin_maintenance_disable_admin_settings_maintenance_disable_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_maintenance_disable_admin_settings_maintenance_disable_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/audit":{"get":{"summary":"Admin Audit","operationId":"admin_audit_admin_audit_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/add-by-email":{"post":{"summary":"Admin Affiliate Add By Email","operationId":"admin_affiliate_add_by_email_admin_affiliates_add_by_email_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_add_by_email_admin_affiliates_add_by_email_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates":{"get":{"summary":"Admin Affiliates","operationId":"admin_affiliates_admin_affiliates_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/{affiliate_id}/set-commission":{"post":{"summary":"Admin Affiliate Set Commission","operationId":"admin_affiliate_set_commission_admin_affiliates__affiliate_id__set_commission_post","parameters":[{"name":"affiliate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliate Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_set_commission_admin_affiliates__affiliate_id__set_commission_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/{affiliate_id}/approve":{"post":{"summary":"Admin Affiliate Approve","operationId":"admin_affiliate_approve_admin_affiliates__affiliate_id__approve_post","parameters":[{"name":"affiliate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliate Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_approve_admin_affiliates__affiliate_id__approve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/{affiliate_id}/suspend":{"post":{"summary":"Admin Affiliate Suspend","operationId":"admin_affiliate_suspend_admin_affiliates__affiliate_id__suspend_post","parameters":[{"name":"affiliate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliate Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_suspend_admin_affiliates__affiliate_id__suspend_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/{affiliate_id}/revoke":{"post":{"summary":"Admin Affiliate Revoke","operationId":"admin_affiliate_revoke_admin_affiliates__affiliate_id__revoke_post","parameters":[{"name":"affiliate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliate Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_revoke_admin_affiliates__affiliate_id__revoke_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/withdrawals":{"get":{"summary":"Admin Affiliate Withdrawals","operationId":"admin_affiliate_withdrawals_admin_affiliates_withdrawals_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/withdrawals/{withdrawal_id}/complete":{"post":{"summary":"Admin Withdrawal Complete","operationId":"admin_withdrawal_complete_admin_affiliates_withdrawals__withdrawal_id__complete_post","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Withdrawal Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_withdrawal_complete_admin_affiliates_withdrawals__withdrawal_id__complete_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliates/withdrawals/{withdrawal_id}/reject":{"post":{"summary":"Admin Withdrawal Reject","operationId":"admin_withdrawal_reject_admin_affiliates_withdrawals__withdrawal_id__reject_post","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Withdrawal Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_withdrawal_reject_admin_affiliates_withdrawals__withdrawal_id__reject_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/affiliate-settings":{"get":{"summary":"Admin Affiliate Settings","operationId":"admin_affiliate_settings_admin_affiliate_settings_get","parameters":[{"name":"flash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Affiliate Settings Post","operationId":"admin_affiliate_settings_post_admin_affiliate_settings_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_affiliate_settings_post_admin_affiliate_settings_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}},"head":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}},"head":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"summary":"Llms Full Txt","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}},"head":{"summary":"Llms Full Txt","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/{key}.txt":{"get":{"summary":"Indexnow Key File","description":"Serve the IndexNow key verification file at /{key}.txt.","operationId":"indexnow_key_file__key__txt_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"summary":"Indexnow Key File","description":"Serve the IndexNow key verification file at /{key}.txt.","operationId":"indexnow_key_file__key__txt_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap Xml","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Sitemap Xml","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/reports/{scan_id}/pdf":{"get":{"summary":"Download Report","description":"Download a scan PDF — proxied through the app.\n\nThe PDF bytes are fetched from S3/MinIO by the app container (which can\nreach internal hostnames like minio:9000) and streamed to the browser as\nan attachment.  This avoids the broken-redirect problem where presigned\nURLs embed the internal Docker hostname and are unreachable from browsers.\n\nAuth: requires a valid session cookie; the session customer must own the\nreport.  This prevents unauthenticated access and cross-customer leakage.\n\nFallback: if pdf_s3_key is a legacy local-disk path (starts with\n'reports/') the file is served directly from disk for dev rows created\nbefore the MinIO upload was wired up.","operationId":"download_report_reports__scan_id__pdf_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scans/{scan_id}/status":{"get":{"summary":"Get Scan Status","description":"Return the current status of a single scan by scan ID.","operationId":"get_scan_status_scans__scan_id__status_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports/{scan_id}":{"get":{"summary":"Get Report","description":"Return JSON report data for a scan.","operationId":"get_report_reports__scan_id__get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/findings/{scan_id}":{"get":{"summary":"Get Findings","description":"Return paginated findings for a scan.","operationId":"get_findings_findings__scan_id__get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/findings/{finding_id}/screenshot":{"get":{"summary":"Get Finding Screenshot","description":"Stream browser verification screenshot from MinIO for a verified XSS finding.","operationId":"get_finding_screenshot_api_findings__finding_id__screenshot_get","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Finding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scans/{customer_id}":{"get":{"summary":"List Scans","operationId":"list_scans_scans__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Trigger Scan","description":"Internal endpoint — manually trigger a single-domain scan for a customer.","operationId":"trigger_scan_scans__customer_id__post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Customer Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_trigger_scan_scans__customer_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_add_domain_dashboard_domains_add_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_add_domain_dashboard_domains_add_post"},"Body_admin_affiliate_add_by_email_admin_affiliates_add_by_email_post":{"properties":{"email":{"type":"string","title":"Email"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["email"],"title":"Body_admin_affiliate_add_by_email_admin_affiliates_add_by_email_post"},"Body_admin_affiliate_approve_admin_affiliates__affiliate_id__approve_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_affiliate_approve_admin_affiliates__affiliate_id__approve_post"},"Body_admin_affiliate_revoke_admin_affiliates__affiliate_id__revoke_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_affiliate_revoke_admin_affiliates__affiliate_id__revoke_post"},"Body_admin_affiliate_set_commission_admin_affiliates__affiliate_id__set_commission_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""},"custom_commission_rate":{"type":"string","title":"Custom Commission Rate","default":""}},"type":"object","title":"Body_admin_affiliate_set_commission_admin_affiliates__affiliate_id__set_commission_post"},"Body_admin_affiliate_settings_post_admin_affiliate_settings_post":{"properties":{"is_global_enabled":{"type":"string","title":"Is Global Enabled","default":"off"},"commission_rate":{"type":"number","title":"Commission Rate","default":15.0},"min_withdrawal":{"type":"number","title":"Min Withdrawal","default":50.0},"cookie_days":{"type":"integer","title":"Cookie Days","default":30},"hold_days":{"type":"integer","title":"Hold Days","default":7},"allow_paypal":{"type":"string","title":"Allow Paypal","default":"off"},"allow_wise":{"type":"string","title":"Allow Wise","default":"off"},"allow_crypto":{"type":"string","title":"Allow Crypto","default":"off"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_affiliate_settings_post_admin_affiliate_settings_post"},"Body_admin_affiliate_suspend_admin_affiliates__affiliate_id__suspend_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_affiliate_suspend_admin_affiliates__affiliate_id__suspend_post"},"Body_admin_cancel_subscription_admin_customers__customer_id__cancel_subscription_post":{"properties":{"cancel_in_provider":{"type":"string","title":"Cancel In Provider","default":"false"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_cancel_subscription_admin_customers__customer_id__cancel_subscription_post"},"Body_admin_customer_affiliate_create_admin_customers__customer_id__affiliate_create_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_customer_affiliate_create_admin_customers__customer_id__affiliate_create_post"},"Body_admin_customer_affiliate_set_status_admin_customers__customer_id__affiliate_set_status_post":{"properties":{"status":{"type":"string","title":"Status"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["status"],"title":"Body_admin_customer_affiliate_set_status_admin_customers__customer_id__affiliate_set_status_post"},"Body_admin_delete_customer_admin_customers__customer_id__delete_post":{"properties":{"confirm_delete":{"type":"string","title":"Confirm Delete","default":"false"},"confirm_email":{"type":"string","title":"Confirm Email","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_delete_customer_admin_customers__customer_id__delete_post"},"Body_admin_login_admin_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"totp_code":{"type":"string","title":"Totp Code","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""},"recaptcha_token":{"type":"string","title":"Recaptcha Token","default":""}},"type":"object","required":["email","password"],"title":"Body_admin_login_admin_login_post"},"Body_admin_maintenance_disable_admin_settings_maintenance_disable_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_maintenance_disable_admin_settings_maintenance_disable_post"},"Body_admin_maintenance_enable_admin_settings_maintenance_enable_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_maintenance_enable_admin_settings_maintenance_enable_post"},"Body_admin_reactivate_admin_customers__customer_id__reactivate_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_reactivate_admin_customers__customer_id__reactivate_post"},"Body_admin_reset_free_scan_domain_admin_customers__customer_id__reset_free_scan_domain_post":{"properties":{"domain":{"type":"string","title":"Domain"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["domain"],"title":"Body_admin_reset_free_scan_domain_admin_customers__customer_id__reset_free_scan_domain_post"},"Body_admin_reset_password_admin_customers__customer_id__reset_password_post":{"properties":{"new_password":{"type":"string","title":"New Password"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["new_password"],"title":"Body_admin_reset_password_admin_customers__customer_id__reset_password_post"},"Body_admin_set_active_admin_customers__customer_id__set_active_post":{"properties":{"is_active":{"type":"string","title":"Is Active"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["is_active"],"title":"Body_admin_set_active_admin_customers__customer_id__set_active_post"},"Body_admin_set_domain_status_admin_customers__customer_id__set_domain_status_post":{"properties":{"domain":{"type":"string","title":"Domain"},"status":{"type":"string","title":"Status"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["domain","status"],"title":"Body_admin_set_domain_status_admin_customers__customer_id__set_domain_status_post"},"Body_admin_set_email_verified_admin_customers__customer_id__set_email_verified_post":{"properties":{"verified":{"type":"string","title":"Verified"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["verified"],"title":"Body_admin_set_email_verified_admin_customers__customer_id__set_email_verified_post"},"Body_admin_set_payment_retry_admin_customers__customer_id__payment_retry_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_set_payment_retry_admin_customers__customer_id__payment_retry_post"},"Body_admin_set_plan_admin_customers__customer_id__set_plan_post":{"properties":{"plan":{"type":"string","title":"Plan"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["plan"],"title":"Body_admin_set_plan_admin_customers__customer_id__set_plan_post"},"Body_admin_suspend_admin_customers__customer_id__suspend_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_suspend_admin_customers__customer_id__suspend_post"},"Body_admin_toggle_registration_admin_settings_toggle_registration_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_toggle_registration_admin_settings_toggle_registration_post"},"Body_admin_trigger_scan_admin_scans_trigger__customer_id__post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_trigger_scan_admin_scans_trigger__customer_id__post"},"Body_admin_update_email_admin_customers__customer_id__update_email_post":{"properties":{"email":{"type":"string","title":"Email"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["email"],"title":"Body_admin_update_email_admin_customers__customer_id__update_email_post"},"Body_admin_withdrawal_complete_admin_affiliates_withdrawals__withdrawal_id__complete_post":{"properties":{"admin_note":{"type":"string","title":"Admin Note","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_withdrawal_complete_admin_affiliates_withdrawals__withdrawal_id__complete_post"},"Body_admin_withdrawal_reject_admin_affiliates_withdrawals__withdrawal_id__reject_post":{"properties":{"admin_note":{"type":"string","title":"Admin Note","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_admin_withdrawal_reject_admin_affiliates_withdrawals__withdrawal_id__reject_post"},"Body_affiliate_enroll_dashboard_affiliate_enroll_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_affiliate_enroll_dashboard_affiliate_enroll_post"},"Body_affiliate_payout_setup_dashboard_affiliate_payout_setup_post":{"properties":{"payout_method":{"type":"string","title":"Payout Method"},"payout_detail":{"type":"string","title":"Payout Detail","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["payout_method"],"title":"Body_affiliate_payout_setup_dashboard_affiliate_payout_setup_post"},"Body_affiliate_withdraw_post_dashboard_affiliate_withdraw_post":{"properties":{"amount":{"type":"number","title":"Amount"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["amount"],"title":"Body_affiliate_withdraw_post_dashboard_affiliate_withdraw_post"},"Body_cancel_downgrade_dashboard_billing_cancel_downgrade_post":{"properties":{"confirm_password":{"type":"string","title":"Confirm Password","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_cancel_downgrade_dashboard_billing_cancel_downgrade_post"},"Body_cancel_subscription_route_dashboard_billing_cancel_subscription_post":{"properties":{"confirm_password":{"type":"string","title":"Confirm Password","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_cancel_subscription_route_dashboard_billing_cancel_subscription_post"},"Body_consent_domain_post_dashboard_consent_domain_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"active":{"type":"string","title":"Active","default":""},"intrusive":{"type":"string","title":"Intrusive","default":""},"side_effects":{"type":"string","title":"Side Effects","default":""},"confirm":{"type":"string","title":"Confirm","default":""},"signature":{"type":"string","title":"Signature","default":""},"expiry_days":{"type":"string","title":"Expiry Days","default":""},"rate_limit_rps":{"type":"string","title":"Rate Limit Rps","default":""},"window_days":{"type":"string","title":"Window Days","default":""},"window_start":{"type":"string","title":"Window Start","default":""},"window_end":{"type":"string","title":"Window End","default":""},"excluded_hosts":{"type":"string","title":"Excluded Hosts","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_consent_domain_post_dashboard_consent_domain_post"},"Body_consent_emergency_stop_post_dashboard_consent_emergency_stop_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_consent_emergency_stop_post_dashboard_consent_emergency_stop_post"},"Body_consent_revoke_post_dashboard_consent_revoke_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_consent_revoke_post_dashboard_consent_revoke_post"},"Body_create_checkout_billing_checkout_post":{"properties":{"plan":{"type":"string","title":"Plan"},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["plan"],"title":"Body_create_checkout_billing_checkout_post"},"Body_forgot_password_post_forgot_password_post":{"properties":{"email":{"type":"string","title":"Email","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_forgot_password_post_forgot_password_post"},"Body_login_post_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"csrf_token":{"type":"string","title":"Csrf Token","default":""},"recaptcha_token":{"type":"string","title":"Recaptcha Token","default":""}},"type":"object","required":["email","password"],"title":"Body_login_post_login_post"},"Body_register_post_register_post":{"properties":{"company_name":{"type":"string","title":"Company Name"},"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"},"plan":{"type":"string","title":"Plan","default":"free"},"csrf_token":{"type":"string","title":"Csrf Token","default":""},"recaptcha_token":{"type":"string","title":"Recaptcha Token","default":""}},"type":"object","required":["company_name","email","password","password_confirm"],"title":"Body_register_post_register_post"},"Body_remove_domain_dashboard_domains_remove_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_remove_domain_dashboard_domains_remove_post"},"Body_request_magic_link_portal_request_link_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_request_magic_link_portal_request_link_post"},"Body_resend_verify_email_verify_email_resend_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_resend_verify_email_verify_email_resend_post"},"Body_reset_password_post_reset_password_post":{"properties":{"token":{"type":"string","title":"Token","default":""},"password":{"type":"string","title":"Password","default":""},"password_confirm":{"type":"string","title":"Password Confirm","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_reset_password_post_reset_password_post"},"Body_roe_post_roe_post":{"properties":{"signature":{"type":"string","title":"Signature"},"authorized":{"type":"string","title":"Authorized","default":""},"active_testing":{"type":"string","title":"Active Testing","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["signature"],"title":"Body_roe_post_roe_post"},"Body_save_slack_dashboard_settings_slack_post":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_save_slack_dashboard_settings_slack_post"},"Body_schedule_downgrade_dashboard_billing_schedule_downgrade_post":{"properties":{"plan":{"type":"string","title":"Plan"},"confirm_password":{"type":"string","title":"Confirm Password","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","required":["plan"],"title":"Body_schedule_downgrade_dashboard_billing_schedule_downgrade_post"},"Body_test_slack_dashboard_settings_slack_test_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_test_slack_dashboard_settings_slack_test_post"},"Body_trigger_scan_dashboard_scans_trigger_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_trigger_scan_dashboard_scans_trigger_post"},"Body_trigger_scan_scans__customer_id__post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"browser_verify":{"type":"boolean","title":"Browser Verify","default":false},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_trigger_scan_scans__customer_id__post"},"Body_undo_cancel_subscription_dashboard_billing_undo_cancel_post":{"properties":{"confirm_password":{"type":"string","title":"Confirm Password","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_undo_cancel_subscription_dashboard_billing_undo_cancel_post"},"Body_upgrade_subscription_dashboard_billing_upgrade_post":{"properties":{"plan":{"type":"string","title":"Plan"},"confirm_password":{"type":"string","title":"Confirm Password","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""},"discount_code":{"type":"string","title":"Discount Code","default":""}},"type":"object","required":["plan"],"title":"Body_upgrade_subscription_dashboard_billing_upgrade_post"},"Body_verify_domain_dashboard_domains_verify_post":{"properties":{"domain":{"type":"string","title":"Domain","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_verify_domain_dashboard_domains_verify_post"},"Body_verify_email_post_verify_email_post":{"properties":{"code":{"type":"string","title":"Code","default":""},"csrf_token":{"type":"string","title":"Csrf Token","default":""}},"type":"object","title":"Body_verify_email_post_verify_email_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}