{"openapi":"3.1.0","info":{"title":"RaportAgent — Automatyczne Badania Rynkowe AI","version":"0.1.0"},"paths":{"/stats":{"get":{"summary":"Stats Page","description":"Owner-only funnel dashboard.","operationId":"stats_page_stats_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/run-logs":{"get":{"summary":"Run Logs Page","description":"Owner-only engine diagnostics.","operationId":"run_logs_page_run_logs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/internal/alert":{"post":{"summary":"Internal Alert","description":"Token-gated hook so host-side cron jobs can raise an owner alert via the app's email path.","operationId":"internal_alert_internal_alert_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/newsletter/send":{"post":{"summary":"Internal Newsletter Send","description":"Admin-token hook to generate + broadcast the Niche Radar digest on demand.","operationId":"internal_newsletter_send_internal_newsletter_send_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/inbox-feed":{"get":{"summary":"Inbox Feed Read","description":"Read relayed inbox items (default: only unhandled). ?all=1 includes handled ones.","operationId":"inbox_feed_read_internal_inbox_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Inbox Feed Push","description":"Relay target for the Gmail assistant: store one classified inbox item (customer question or\ninfra/expiration alert) so the operator/agent can review it in one place.","operationId":"inbox_feed_push_internal_inbox_feed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/inbox-feed/handled":{"post":{"summary":"Inbox Feed Handled","description":"Mark items handled (body {ids:[...]}) or ?all=1 to clear the whole open queue.","operationId":"inbox_feed_handled_internal_inbox_feed_handled_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/newsletter/unsubscribe":{"get":{"summary":"Newsletter Unsubscribe","description":"One-click unsubscribe from Niche Radar emails (signed link from the email footer).","operationId":"newsletter_unsubscribe_api_newsletter_unsubscribe_get","parameters":[{"name":"u","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"U"}},{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/testimonials":{"get":{"summary":"Public Testimonials","description":"Owner-approved testimonials for the landing page (public).","operationId":"public_testimonials_api_testimonials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/review":{"post":{"summary":"Submit Review","description":"Logged-in user leaves a one-line review (stored as 'pending' until the owner approves).","operationId":"submit_review_api_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reviews":{"get":{"summary":"Reviews Admin","description":"Owner-only testimonial moderation page.","operationId":"reviews_admin_reviews_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/reviews/{rid}/{action}":{"post":{"summary":"Reviews Moderate","description":"POST + SameSite=Strict admin cookie = CSRF-safe moderation action.","operationId":"reviews_moderate_reviews__rid___action__post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"summary":"Auth Register","operationId":"auth_register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify":{"get":{"summary":"Auth Verify","description":"Legacy path for old clickable-link tokens — see db.verify_email_token(). New signups get a\n6-digit code (auth_verify_code below), never a link.","operationId":"auth_verify_api_auth_verify_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify-code":{"post":{"summary":"Auth Verify Code","operationId":"auth_verify_code_api_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/resend-verification":{"post":{"summary":"Auth Resend Verification","operationId":"auth_resend_verification_api_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/login":{"post":{"summary":"Auth Login","operationId":"auth_login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/forgot":{"post":{"summary":"Auth Forgot","operationId":"auth_forgot_api_auth_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset":{"post":{"summary":"Auth Reset","operationId":"auth_reset_api_auth_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/change-password":{"post":{"summary":"Auth Change Password","operationId":"auth_change_password_api_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"summary":"Auth Logout","operationId":"auth_logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"summary":"Auth Me","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/packs":{"get":{"summary":"Billing Packs","operationId":"billing_packs_api_billing_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/checkout":{"post":{"summary":"Billing Checkout","operationId":"billing_checkout_api_billing_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/builder":{"get":{"summary":"Billing Builder","description":"Component rates + presets for the plan configurator. Public: the pricing page renders\nstraight from this, so the UI can never show a price the server would not charge.","operationId":"billing_builder_api_billing_builder_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/quote-payg":{"post":{"summary":"Billing Quote Payg","description":"Price N one-off credits. Public and cheap — the slider calls it on every step.","operationId":"billing_quote_payg_api_billing_quote_payg_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/quote":{"post":{"summary":"Billing Quote","description":"Price one configuration. The configurator calls this on every change instead of doing the\narithmetic client-side — a total computed in the browser is a total the customer can edit.","operationId":"billing_quote_api_billing_quote_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/subscribe-custom":{"post":{"summary":"Billing Subscribe Custom","description":"Checkout for a configured subscription. Uses inline recurring price_data, so an arbitrary\ncombination never needs a pre-created Stripe Price — which is what makes a configurator\npossible at all (the combinations are effectively unbounded).","operationId":"billing_subscribe_custom_api_billing_subscribe_custom_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/subscribe":{"post":{"summary":"Billing Subscribe","operationId":"billing_subscribe_api_billing_subscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/portal":{"post":{"summary":"Billing Portal","description":"Self-service subscription management (cancel/upgrade/update card) via Stripe's hosted\nBilling Portal. Added 2026-07-26 — before this, cancelling a subscription required emailing\nsupport and a manual action in the Stripe dashboard.","operationId":"billing_portal_api_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/webhook":{"post":{"summary":"Billing Webhook","operationId":"billing_webhook_api_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/txns":{"get":{"summary":"Billing Txns","operationId":"billing_txns_api_billing_txns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/invoices":{"get":{"summary":"Billing Invoices","operationId":"billing_invoices_api_billing_invoices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/invoice/{invoice_id}":{"get":{"summary":"Billing Invoice Html","operationId":"billing_invoice_html_api_billing_invoice__invoice_id__get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/billing":{"post":{"summary":"Account Billing","operationId":"account_billing_api_account_billing_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/brand":{"post":{"summary":"Account Brand","operationId":"account_brand_api_account_brand_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/referral":{"get":{"summary":"Account Referral","description":"The user's shareable referral link + conversion stats. Referrer earns credits when a\nreferred user makes their first purchase.","operationId":"account_referral_api_account_referral_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/export":{"get":{"summary":"Account Export","operationId":"account_export_api_account_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/delete":{"post":{"summary":"Account Delete","operationId":"account_delete_api_account_delete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/notion":{"get":{"summary":"Get Notion Cfg","operationId":"get_notion_cfg_api_account_notion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Notion Cfg","description":"Save/clear the account's Notion token + database id. Optional {test:true} creates a test page.","operationId":"set_notion_cfg_api_account_notion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/slack":{"get":{"summary":"Get Slack","operationId":"get_slack_api_account_slack_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Slack","description":"Save (or clear) the account's Slack Incoming Webhook. Optional {test:true} posts a test message.","operationId":"set_slack_api_account_slack_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/discord":{"get":{"summary":"Get Discord","operationId":"get_discord_api_account_discord_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Discord","description":"Save (or clear) the account's Discord channel webhook. Optional {test:true} posts a test message.","operationId":"set_discord_api_account_discord_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/teams":{"get":{"summary":"Get Teams","operationId":"get_teams_api_account_teams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Teams","description":"Save (or clear) the account's Microsoft Teams webhook. Optional {test:true} posts a test card.","operationId":"set_teams_api_account_teams_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/hubspot":{"get":{"summary":"Get Hubspot","operationId":"get_hubspot_api_account_hubspot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Hubspot","description":"Save (or clear) the account's HubSpot private-app token. Optional {test:true} logs a test note.","operationId":"set_hubspot_api_account_hubspot_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/domain":{"get":{"summary":"Get Domain","operationId":"get_domain_api_account_domain_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Domain","description":"Register (or clear with an empty value) the agency's white-label domain. Verification is a\nseparate step; setting a new domain always resets verified to 0.","operationId":"set_domain_api_account_domain_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/domain/verify":{"post":{"summary":"Verify Domain","description":"Confirm the domain now resolves to our server (client added the CNAME). On success the domain\nbecomes eligible for an on-demand TLS cert and tenant-branded rendering.","operationId":"verify_domain_api_account_domain_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/webhook":{"get":{"summary":"Get Webhook Cfg","operationId":"get_webhook_cfg_api_account_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Webhook Cfg","description":"Save/clear the account's generic outgoing webhook. A signing secret is auto-created on first\nsave. Optional {test:true} POSTs a sample report.completed event.","operationId":"set_webhook_cfg_api_account_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/scope":{"post":{"summary":"Scope Research","description":"Copilot pre-validation: multi-turn conversation that pins the niche BEFORE charging a credit.","operationId":"scope_research_api_scope_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/polish-brief":{"post":{"summary":"Polish Brief Endpoint","description":"Clean up a dictated (voice) research brief with a cheap LLM call. Optional convenience for the\nVoice-to-Report flow — on any failure the frontend keeps the raw text, so this never blocks.","operationId":"polish_brief_endpoint_api_polish_brief_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/chat":{"post":{"summary":"Chat Assistant","description":"Public landing-page assistant: answers visitor questions about the product with a cheap,\ngrounded LLM call. No login required (pre-sales help) but rate-limited to bound cost/abuse.\nOn any failure returns {\"ok\": False} so the widget shows a graceful fallback.","operationId":"chat_assistant_api_chat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/transcribe":{"post":{"summary":"Transcribe Endpoint","description":"Server-side speech-to-text (Groq Whisper) for the Voice-to-Report flow in browsers without the\nWeb Speech API (Firefox/Safari). Audio is transcribed in-memory and never stored.","operationId":"transcribe_endpoint_api_transcribe_post","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"","title":"Lang"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_endpoint_api_transcribe_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/drilldown/status":{"post":{"summary":"Drilldown Status","description":"How many free drill-downs remain for a given report (for the UI button label).","operationId":"drilldown_status_api_drilldown_status_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/drilldown":{"post":{"summary":"Drilldown Endpoint","description":"Focused deep-dive on ONE thread of a finished report. Free (per-report allowance), no credit charged.","operationId":"drilldown_endpoint_api_drilldown_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sample-drilldown":{"post":{"summary":"Sample Drilldown","description":"Public drill-down on a sample report — no login, no credits, limited per IP/day.","operationId":"sample_drilldown_api_sample_drilldown_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/context/extract":{"post":{"summary":"Context Extract","description":"Parse uploaded files to text for RAG context. In-memory only — nothing stored on disk.","operationId":"context_extract_api_context_extract_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_context_extract_api_context_extract_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research":{"post":{"summary":"Start Research","operationId":"start_research_api_research_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/{job_id}/stream":{"get":{"summary":"Stream Research","operationId":"stream_research_api_research__job_id__stream_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/{filename}":{"get":{"summary":"Download Report","operationId":"download_report_api_download__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/pptx/{filename}":{"get":{"summary":"Export Pptx","description":"Export a report to PowerPoint (.pptx). White-labeled to the user's brand when set.","operationId":"export_pptx_api_export_pptx__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/docx/{filename}":{"get":{"summary":"Export Docx","description":"Export a report to editable Word (.docx). White-labeled to the user's brand when set.","operationId":"export_docx_api_export_docx__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/pdf/{filename}":{"get":{"summary":"Export Pdf","description":"Export a report to a print-ready PDF file. White-labeled to the user's brand when set.","operationId":"export_pdf_api_export_pdf__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{filename}":{"post":{"summary":"Share Report","description":"Owner creates (or reuses) a public read-only share link for their report.","operationId":"share_report_api_share__filename__post","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/{filename}/publish":{"post":{"summary":"Publish Report Public","description":"Owner opts a report into an SEO-indexable public page at /r/{slug}. Idempotent.","operationId":"publish_report_public_api_reports__filename__publish_post","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/{filename}/unpublish":{"post":{"summary":"Unpublish Report Public","description":"Owner removes a report from public listing (the /r/{slug} page 404s afterwards).","operationId":"unpublish_report_public_api_reports__filename__unpublish_post","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/{filename}/audit":{"get":{"summary":"Report Audit","description":"Provenance / audit trail for a report (AI models, agents, sources, SHA-256). Owner-scoped.","operationId":"report_audit_api_reports__filename__audit_get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/{filename}/public-status":{"get":{"summary":"Public Status","description":"Whether the owner's report is currently published, plus its public URL if so.","operationId":"public_status_api_reports__filename__public_status_get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared/{token}":{"get":{"summary":"Get Shared","description":"Public read-only report markdown via a share token (no auth, no credit).","operationId":"get_shared_api_shared__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports":{"get":{"summary":"List Reports","operationId":"list_reports_api_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/monitors":{"get":{"summary":"List Monitors Route","operationId":"list_monitors_route_api_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Monitor Route","operationId":"create_monitor_route_api_monitors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/monitors/{mid}/delete":{"post":{"summary":"Delete Monitor Route","operationId":"delete_monitor_route_api_monitors__mid__delete_post","parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"integer","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports":{"post":{"summary":"Api Create Report","operationId":"api_create_report_v1_reports_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"summary":"Api List Reports","operationId":"api_list_reports_v1_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{rid}/status":{"get":{"summary":"Api Report Status","operationId":"api_report_status_v1_reports__rid__status_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{rid}/audit":{"get":{"summary":"Api Report Audit","description":"Provenance / audit trail (models, agents, sources, SHA-256) for compliance use.","operationId":"api_report_audit_v1_reports__rid__audit_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{rid}":{"get":{"summary":"Api Get Report","operationId":"api_get_report_v1_reports__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Cancel Report","operationId":"api_cancel_report_v1_reports__rid__delete","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{rid}/sources":{"get":{"summary":"Api Report Sources","operationId":"api_report_sources_v1_reports__rid__sources_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{rid}/download":{"get":{"summary":"Api Download Report","operationId":"api_download_report_v1_reports__rid__download_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"markdown","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account":{"get":{"summary":"Api Account","operationId":"api_account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/usage":{"get":{"summary":"Api Usage","description":"Consumption for the current billing window — the foundation for usage-based/metered billing.\nDefault window is the current UTC calendar month; pass ?days=N for a rolling N-day window\n(max 366). Pure read from api_reports — does not affect credits and never charges.","operationId":"api_usage_v1_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/api-keys":{"get":{"summary":"List Keys","operationId":"list_keys_api_account_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Key","operationId":"create_key_api_account_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/api-keys/{key_id}/revoke":{"post":{"summary":"Revoke Key","operationId":"revoke_key_api_account_api_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/ai-optout":{"get":{"summary":"Get Ai Optout","operationId":"get_ai_optout_api_account_ai_optout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Ai Optout","description":"Record the EU AI Act training / internal-use opt-out preference for the logged-in user.\n2026-08-25: this now actually gates behavior (excluded from the sample gallery / quality-eval\ntesting, and from any future training-eligible fallback provider — see can_use_report_internally\nin db.py and MarketResearchOrchestrator.run in orchestrator.py), not just a stored flag.","operationId":"set_ai_optout_api_account_ai_optout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/api-keys/{key_id}/webhook":{"post":{"summary":"Set Key Webhook","operationId":"set_key_webhook_api_account_api_keys__key_id__webhook_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team":{"get":{"summary":"Get Team","description":"The caller's org view: as a member (whose pool you draw from) or as an owner (your roster).","operationId":"get_team_api_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/team/members":{"post":{"summary":"Add Member","description":"Owner invites an existing user (by email) into their team. Enforces plan seats.","operationId":"add_member_api_team_members_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/team/members/{member_id}/role":{"post":{"summary":"Change Role","description":"Owner changes a member's role (admin/editor/viewer).","operationId":"change_role_api_team_members__member_id__role_post","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/members/{member_id}/remove":{"post":{"summary":"Remove Member","description":"Owner removes a member from their team (member reverts to billing their own credits).","operationId":"remove_member_api_team_members__member_id__remove_post","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/samples":{"get":{"summary":"List Samples","description":"Public list of curated sample reports for the landing gallery (no auth).","operationId":"list_samples_api_samples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sample/{slug}":{"get":{"summary":"Get Sample","description":"Public read-only sample report markdown (no auth, no credit).","operationId":"get_sample_api_sample__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sample/{slug}":{"get":{"summary":"Sample Page Html","description":"Server-rendered, crawlable sample report page (SEO + proof + CTA, no auth).","operationId":"sample_page_html_sample__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brief-check":{"get":{"summary":"Brief Check Form","operationId":"brief_check_form_brief_check_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Brief Check Run","operationId":"brief_check_run_brief_check_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/market-size":{"get":{"summary":"Market Size Form","operationId":"market_size_form_market_size_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Market Size Run","operationId":"market_size_run_market_size_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/report-abuse":{"get":{"summary":"Report Abuse Form","operationId":"report_abuse_form_report_abuse_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Report Abuse Submit","operationId":"report_abuse_submit_report_abuse_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/r/{slug}":{"get":{"summary":"Public Report Html","description":"Server-rendered, crawlable public report page (opt-in by the owner). No auth, no credits.","operationId":"public_report_html_r__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/{slug}":{"get":{"summary":"Embed Report Html","description":"Iframe-embeddable version of a published report (opt-in via publish). Same content gate as\n/r/{slug}; framing is allowed for this path only (see Caddyfile /embed/* header exception).","operationId":"embed_report_html_embed__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ev":{"post":{"summary":"Track Event","description":"Anonymous, cookieless funnel event (pageview/start/pricing_view). Best-effort, never errors out.","operationId":"track_event_api_ev_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Page Terms","operationId":"page_terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Page Privacy","operationId":"page_privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/regulamin":{"get":{"summary":"Page Regulamin","operationId":"page_regulamin_regulamin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/polityka-prywatnosci":{"get":{"summary":"Page Polityka","operationId":"page_polityka_polityka_prywatnosci_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":{"application/json":{"schema":{}}}}}}},"/.well-known/security.txt":{"get":{"summary":"Security Txt Well Known","operationId":"security_txt_well_known__well_known_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/security.txt":{"get":{"summary":"Security Txt Legacy","operationId":"security_txt_legacy_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"AI-SEO: a concise, LLM-friendly site description (llmstxt.org) so assistants like ChatGPT/\nPerplexity can understand and cite RaportAgent accurately. Sample reports are listed dynamically.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/raportagent-vs-chatgpt":{"get":{"summary":"Vs Chatgpt","description":"Indexable comparison page (SEO + AI-SEO): RaportAgent vs ChatGPT/Perplexity for market research.","operationId":"vs_chatgpt_raportagent_vs_chatgpt_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/ai-transparency":{"get":{"summary":"Ai Transparency","description":"EU AI Act (art. 50/53) transparency notice: models, data sources, labelling, training opt-out.","operationId":"ai_transparency_ai_transparency_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api-docs":{"get":{"summary":"Api Docs","description":"Public developer documentation for the REST API (v1).","operationId":"api_docs_api_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/contact":{"get":{"summary":"Contact Page Get","operationId":"contact_page_get_contact_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/contact":{"post":{"summary":"Contact Submit","description":"No-JS contact form handler: validate, email the operator, redirect back with a status.","operationId":"contact_submit_api_contact_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cookie-policy":{"get":{"summary":"Cookie Policy","operationId":"cookie_policy_cookie_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy-policy":{"get":{"summary":"Privacy Policy Alias","operationId":"privacy_policy_alias_privacy_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms-of-service":{"get":{"summary":"Terms Of Service Alias","operationId":"terms_of_service_alias_terms_of_service_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public-stats":{"get":{"summary":"Public Stats","description":"Honest, real counters for the landing page (never fabricated). Quality ratios come from\nrun_metrics (all-time window) — deliberately ratios/averages, not the raw run count, which\nstays too small right now to publish next to competitors quoting five-figure volume.","operationId":"public_stats_api_public_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/niches":{"get":{"summary":"Niches Hub","description":"Indexable hub linking every free sample report (SEO + AI-SEO): one internal-link home for the\nwhole sample cluster, so crawlers and LLMs see the full topic graph instead of orphan pages.","operationId":"niches_hub_niches_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare":{"get":{"summary":"Compare Page","description":"Side-by-side comparison of two sample market reports.","operationId":"compare_page_compare_get","parameters":[{"name":"a","in":"query","required":false,"schema":{"type":"string","default":"","title":"A"}},{"name":"b","in":"query","required":false,"schema":{"type":"string","default":"","title":"B"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alternatives":{"get":{"summary":"Alternatives Hub","description":"Full index of every /alternatives/* page — gives the ~40 pages outside the footer's curated\nsubset a real inbound link instead of only being reachable via sitemap.xml.","operationId":"alternatives_hub_alternatives_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for":{"get":{"summary":"For Hub","description":"Full index of every /for/* page — same rationale as alternatives_hub().","operationId":"for_hub_for_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/alternatives/{slug}":{"get":{"summary":"Alternatives Page","description":"Programmatic SEO/GEO: honest comparison vs a competitor/option (converts 5–15% vs generic).","operationId":"alternatives_page_alternatives__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/for/{slug}":{"get":{"summary":"Usecase Page","description":"Programmatic SEO/GEO: ICP/use-case landing (founders, agencies, ecommerce…).","operationId":"usecase_page_for__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/market-research/{slug}":{"get":{"summary":"Market Research Page","description":"Programmatic SEO/GEO: informational market landing seeded from a real sourced sample.","operationId":"market_research_page_market_research__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/battlecards":{"get":{"summary":"Battlecards Page","description":"Standalone product landing for competitor Battlecards (premium head-to-head comparison).","operationId":"battlecards_page_battlecards_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/due-diligence":{"get":{"summary":"Due Diligence Page","description":"Sales-led product landing for Investor Due Diligence (scoped, link-checked engagement).","operationId":"due_diligence_page_due_diligence_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pitch-deck":{"get":{"summary":"Pitch Deck Page","description":"Product landing for Report-to-Deck (market report → editable ~10-slide pitch deck).","operationId":"pitch_deck_page_pitch_deck_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/mcp":{"get":{"summary":"Mcp Page","description":"Product landing for the RaportAgent MCP server — targets developers/agent-builders.","operationId":"mcp_page_mcp_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap Xml","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/manifest.webmanifest":{"get":{"summary":"Web Manifest","operationId":"web_manifest_manifest_webmanifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og.png":{"get":{"summary":"Og Image","operationId":"og_image_og_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"summary":"Healthz","description":"Lekki healthcheck dla orkiestracji (docker/Caddy). Bez auth, bez I/O bazy.\nDeliberately trivial — a full disk must NOT trigger a container restart loop.","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readyz":{"get":{"summary":"Readyz","description":"Deeper health for monitoring: disk, database, search backend, active jobs.\n503 when the database is down or disk is below the threshold (real \"don't take traffic\" signals).","operationId":"readyz_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/internal/tls-check":{"get":{"summary":"Tls Check","description":"Caddy on-demand-TLS gate (`ask`): only let Caddy obtain a certificate for a white-label domain\nthat is registered AND verified. Prevents arbitrary hosts from minting certs against our server.","operationId":"tls_check_internal_tls_check_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"type":"string","default":"","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2":{"get":{"summary":"Home V2","description":"Prototype of the redesigned site (dark editorial). Served from templates/v2.html so the live\nSPA at / stays untouched while the redesign is reviewed. Promote by swapping into / once approved.","operationId":"home_v2_v2_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_context_extract_api_context_extract_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_context_extract_api_context_extract_post"},"Body_transcribe_endpoint_api_transcribe_post":{"properties":{"audio":{"type":"string","contentMediaType":"application/octet-stream","title":"Audio"}},"type":"object","required":["audio"],"title":"Body_transcribe_endpoint_api_transcribe_post"},"ChangePasswordBody":{"properties":{"old_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Password","default":""},"new_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Password","default":""}},"type":"object","title":"ChangePasswordBody"},"ForgotBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""}},"type":"object","title":"ForgotBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","default":""}},"type":"object","title":"LoginBody"},"RegisterBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","default":""},"tos_accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tos Accepted","default":false},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref","default":""}},"type":"object","title":"RegisterBody"},"ResearchBody":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","default":""},"user_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Context","default":""},"enabled_agents":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Enabled Agents"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","default":"deep"},"notify_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Email"},"consent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Consent","default":false},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template","default":""}},"type":"object","title":"ResearchBody"},"ResetBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","default":""},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","default":""}},"type":"object","title":"ResetBody"},"ReviewBody":{"properties":{"quote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote","default":""},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":""},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","default":""}},"type":"object","title":"ReviewBody"},"ScopeBody":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","default":""},"messages":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Messages"},"enabled_agents":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Enabled Agents"}},"type":"object","title":"ScopeBody"},"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"},"VerifyCodeBody":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","default":""}},"type":"object","title":"VerifyCodeBody"}}}}