{"openapi":"3.1.0","info":{"title":"HAR Consent Analyser","description":"ePrivacy / GDPR consent compliance — C1 HAR + C2 Playwright + C3 AI","version":"3.0.0"},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/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"}}}},"/sitemap.xml":{"get":{"summary":"Sitemap Xml","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/auth/login":{"get":{"summary":"Auth Login","description":"Redirect to Google's OAuth consent screen.","operationId":"auth_login_auth_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/callback":{"get":{"summary":"Auth Callback","description":"Handle Google's OAuth callback — exchange code for user info.","operationId":"auth_callback_auth_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/welcome":{"get":{"summary":"Auth Welcome","description":"Post-login landing page — fires a Google Ads conversion event for\nthe successful sign-in, then auto-redirects to the home page.\n\nMust only render for users who just completed OAuth — otherwise anyone\ncould hit this URL and inflate the conversion count. The session's\n`user` must be present.","operationId":"auth_welcome_auth_welcome_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/auth/logout":{"get":{"summary":"Auth Logout","description":"Clear the session and redirect to home.","operationId":"auth_logout_auth_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/analyse/har":{"post":{"summary":"Analyse Har Html","operationId":"analyse_har_html_analyse_har_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_har_html_analyse_har_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/har/json":{"post":{"summary":"Analyse Har Json","operationId":"analyse_har_json_analyse_har_json_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_har_json_analyse_har_json_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/url":{"post":{"summary":"Analyse Url Html","description":"Start the analysis as an asyncio background task and redirect immediately\nto a progress page. This allows the user to see live status and cancel\nthe run without being blocked on the HTTP connection.","operationId":"analyse_url_html_analyse_url_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_analyse_url_html_analyse_url_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/url/json":{"post":{"summary":"Analyse Url Json","operationId":"analyse_url_json_analyse_url_json_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_analyse_url_json_analyse_url_json_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch":{"get":{"summary":"Batch Form","operationId":"batch_form_batch_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/analyse/batch":{"post":{"summary":"Analyse Batch","operationId":"analyse_batch_analyse_batch_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_batch_analyse_batch_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}":{"get":{"summary":"Batch View","operationId":"batch_view_batch__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}/status":{"get":{"summary":"Batch Status","operationId":"batch_status_batch__batch_id__status_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}/cancel":{"post":{"summary":"Batch Cancel","operationId":"batch_cancel_batch__batch_id__cancel_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}/results.csv":{"get":{"summary":"Batch Results Csv","operationId":"batch_results_csv_batch__batch_id__results_csv_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}/item/{idx}/manual":{"get":{"summary":"Manual Evidence Form","operationId":"manual_evidence_form_batch__batch_id__item__idx__manual_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"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":"Manual Evidence Submit","operationId":"manual_evidence_submit_batch__batch_id__item__idx__manual_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manual":{"get":{"summary":"Manual Scan Form","operationId":"manual_scan_form_manual_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Manual Scan Submit","description":"A manual scan of any site, from evidence gathered by hand — for sites that\naren't in a batch. Scored like a normal scan and stored as a run owned by\nthe signed-in admin.","operationId":"manual_scan_submit_manual_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/batch/{batch_id}/item/{idx}/import":{"post":{"summary":"Batch Item Import","description":"Import a report from local_scan.py — the same automated scan, run in a\nvisible browser on an admin's own computer for a site that blocked the\nserver. Admin session or admin API token (Bearer). Body:\n{\"report\": <report JSON>, \"log\": [<log entries>]}. The AI step runs here,\nif the batch has it on, then the batch row is replaced.","operationId":"batch_item_import_batch__batch_id__item__idx__import_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch/{batch_id}/item/{idx}/url":{"get":{"summary":"Batch Item Url Form","operationId":"batch_item_url_form_batch__batch_id__item__idx__url_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"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":"Batch Item Set Url","description":"Correct a batch row's URL (e.g. the uploaded CSV had a stale domain). The\nrow's previous result is cleared — it was for the old address — and the\noriginal URL is kept in url_history. Optionally rescans on the server.","operationId":"batch_item_set_url_batch__batch_id__item__idx__url_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_batch_item_set_url_batch__batch_id__item__idx__url_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manual/snippet.js":{"get":{"summary":"Manual Snippet","operationId":"manual_snippet_manual_snippet_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/batches":{"get":{"summary":"Batches Page","operationId":"batches_page_batches_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/batches.json":{"get":{"summary":"Batches Json","operationId":"batches_json_batches_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/runs/{run_id}/progress":{"get":{"summary":"Run Progress Page","description":"Live progress page — polls /status every 2s and shows an Interrupt button.","operationId":"run_progress_page_runs__run_id__progress_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/status":{"get":{"summary":"Run Status","description":"Polled by the progress page — returns current run state as JSON.","operationId":"run_status_runs__run_id__status_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/cancel":{"post":{"summary":"Cancel Run","description":"Cancel an in-flight run, clean up its data, and return JSON.","operationId":"cancel_run_runs__run_id__cancel_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs":{"get":{"summary":"Runs Page","description":"Human-readable run history page with download links. Signed-in users only;\nindividual reports at /runs/{run_id} stay reachable by link.","operationId":"runs_page_runs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/runs/{run_id}":{"get":{"summary":"View Run","description":"Re-render the HTML report for a stored run.","operationId":"view_run_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/report.json":{"get":{"summary":"Download Run Report","description":"Download the full C2 report JSON (for upload to C3 analysis).","operationId":"download_run_report_runs__run_id__report_json_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/log.json":{"get":{"summary":"Download Run Log","description":"Download the raw run log as JSON.","operationId":"download_run_log_runs__run_id__log_json_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs":{"get":{"summary":"List Logs","operationId":"list_logs_logs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logs/{run_id}":{"get":{"summary":"Get Log","description":"Raw JSON log — kept for backwards compatibility and the log panel link.","operationId":"get_log_logs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/definitions":{"get":{"summary":"Definitions Page","description":"Render a page explaining what each result status means.","operationId":"definitions_page_definitions_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/disclaimer":{"get":{"summary":"Disclaimer Page","description":"Render the legal disclaimer page.","operationId":"disclaimer_page_disclaimer_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/cookie-policy":{"get":{"summary":"Cookie Policy Page","description":"Render the cookie policy page with Cookiebot declaration.","operationId":"cookie_policy_page_cookie_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy-policy":{"get":{"summary":"Privacy Policy Page","description":"Render the Waivern privacy policy page.","operationId":"privacy_policy_page_privacy_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/runs/{run_id}/policy":{"post":{"summary":"Rerun Policy","description":"Re-run the cookie policy check using a manually supplied URL.\nUsed when the automatic discovery failed or the page needs a consent click.","operationId":"rerun_policy_runs__run_id__policy_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_rerun_policy_runs__run_id__policy_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/c3":{"post":{"summary":"Analyse C3 Html","operationId":"analyse_c3_html_analyse_c3_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_c3_html_analyse_c3_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/c3/json":{"post":{"summary":"Analyse C3 Json","operationId":"analyse_c3_json_analyse_c3_json_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_c3_json_analyse_c3_json_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyse/c3/report":{"post":{"summary":"Analyse C3 Report","description":"Generate a downloadable Word document compliance report.","operationId":"analyse_c3_report_analyse_c3_report_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyse_c3_report_analyse_c3_report_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/c3":{"get":{"summary":"View Run C3","description":"Serve (or generate and cache) the C3 AI-enhanced HTML report for a stored run.\nResults are cached in C3_HTML_DIR so the AI is only called once per run.","operationId":"view_run_c3_runs__run_id__c3_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/c3/report":{"get":{"summary":"Download Run C3 Report","description":"Serve (or generate) the Word document for a stored run.\nReturns cached file instantly if already generated; otherwise runs full C3 + docx pipeline.","operationId":"download_run_c3_report_runs__run_id__c3_report_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runs/{run_id}/download.docx":{"get":{"summary":"Download Run Docx","description":"Download the Word report previously generated for a run (if available).","operationId":"download_run_docx_runs__run_id__download_docx_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"summary":"Admin Page","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/delete":{"post":{"summary":"Admin Delete","operationId":"admin_delete_admin_delete_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/cleanup":{"post":{"summary":"Admin Cleanup","operationId":"admin_cleanup_admin_cleanup_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/reset-browsers":{"post":{"summary":"Admin Reset Browsers","description":"Force-release all browser semaphore slots.\n\nUse when scans are stuck on 'Waiting for a free browser slot' because\none or more browser processes hung or were killed without releasing the lock.","operationId":"admin_reset_browsers_admin_reset_browsers_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/tokens":{"get":{"summary":"Tokens Page","description":"Show the user's API tokens and scan credit balance.","operationId":"tokens_page_account_tokens_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/tokens/create":{"post":{"summary":"Create Token","description":"Generate a new API token for the current user.","operationId":"create_token_account_tokens_create_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/tokens/revoke":{"post":{"summary":"Revoke Token","description":"Revoke an existing API token.","operationId":"revoke_token_account_tokens_revoke_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/paywall":{"get":{"summary":"Billing Paywall","description":"Show the paywall to logged-in users who've exhausted their free scans.","operationId":"billing_paywall_billing_paywall_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/must-login":{"get":{"summary":"Billing Must Login","description":"Prompt anonymous users who've used up their free scans to log in.","operationId":"billing_must_login_billing_must_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/checkout":{"post":{"summary":"Billing Checkout","description":"Create a Stripe Checkout Session and redirect the user to Stripe.","operationId":"billing_checkout_billing_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/success":{"get":{"summary":"Billing Success","description":"Verify Stripe payment and credit the user's account.","operationId":"billing_success_billing_success_get","parameters":[{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/cancel":{"get":{"summary":"Billing Cancel","operationId":"billing_cancel_billing_cancel_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/success/mcp":{"get":{"summary":"Billing Success Mcp","description":"Success page for MCP-initiated payments — no web session required.\n\nThe webhook handles crediting; this endpoint also tries to credit as a\nbelt-and-braces fallback in case the webhook fires after the user lands here.","operationId":"billing_success_mcp_billing_success_mcp_get","parameters":[{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/webhook":{"post":{"summary":"Billing Webhook","description":"Stripe webhook — server-side confirmation of completed payments.","operationId":"billing_webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"summary":"Mcp Server Card","operationId":"mcp_server_card__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/about":{"get":{"summary":"Mcp About","description":"Documentation page explaining the MCP endpoint.","operationId":"mcp_about_mcp_about_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_analyse_batch_analyse_batch_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"mode":{"type":"string","title":"Mode","default":"gdpr"},"region":{"type":"string","title":"Region","default":"eu"},"ai_mode":{"type":"string","title":"Ai Mode","default":""},"url_column":{"type":"string","title":"Url Column","default":""}},"type":"object","required":["file"],"title":"Body_analyse_batch_analyse_batch_post"},"Body_analyse_c3_html_analyse_c3_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyse_c3_html_analyse_c3_post"},"Body_analyse_c3_json_analyse_c3_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyse_c3_json_analyse_c3_json_post"},"Body_analyse_c3_report_analyse_c3_report_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyse_c3_report_analyse_c3_report_post"},"Body_analyse_har_html_analyse_har_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyse_har_html_analyse_har_post"},"Body_analyse_har_json_analyse_har_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyse_har_json_analyse_har_json_post"},"Body_analyse_url_html_analyse_url_post":{"properties":{"url":{"type":"string","title":"Url"},"mode":{"type":"string","title":"Mode","default":"gdpr"},"ai_mode":{"type":"string","title":"Ai Mode","default":"ai"},"region":{"type":"string","title":"Region","default":"eu"},"login_username":{"type":"string","title":"Login Username","default":""},"login_password":{"type":"string","title":"Login Password","default":""},"login_url":{"type":"string","title":"Login Url","default":""}},"type":"object","required":["url"],"title":"Body_analyse_url_html_analyse_url_post"},"Body_analyse_url_json_analyse_url_json_post":{"properties":{"url":{"type":"string","title":"Url"},"mode":{"type":"string","title":"Mode","default":"gdpr"}},"type":"object","required":["url"],"title":"Body_analyse_url_json_analyse_url_json_post"},"Body_batch_item_set_url_batch__batch_id__item__idx__url_post":{"properties":{"url":{"type":"string","title":"Url"},"rescan":{"type":"string","title":"Rescan","default":""}},"type":"object","required":["url"],"title":"Body_batch_item_set_url_batch__batch_id__item__idx__url_post"},"Body_rerun_policy_runs__run_id__policy_post":{"properties":{"policy_url":{"type":"string","title":"Policy Url"}},"type":"object","required":["policy_url"],"title":"Body_rerun_policy_runs__run_id__policy_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"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}