{"openapi":"3.1.0","info":{"title":"TedScout","version":"0.1.0"},"paths":{"/signup":{"get":{"summary":"Signup Get","operationId":"signup_get_signup_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"starter","title":"Plan"}}],"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":"Signup Post","operationId":"signup_post_signup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_post_signup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup_legacy":{"post":{"summary":"Signup Post Legacy","operationId":"signup_post_legacy_signup_legacy_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_post_legacy_signup_legacy_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"}}}}}}},"/signup/success":{"get":{"summary":"Signup Success","operationId":"signup_success_signup_success_get","parameters":[{"name":"uid","in":"query","required":true,"schema":{"type":"string","title":"Uid"}}],"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 Get","operationId":"login_get_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/dashboard","title":"Next"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"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":"Login Post","operationId":"login_post_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_post_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"get":{"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/signup/pending":{"get":{"summary":"Signup Pending","operationId":"signup_pending_signup_pending_get","parameters":[{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify":{"get":{"summary":"Verify Email","operationId":"verify_email_verify_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"}}}}}}},"/verify/resend":{"post":{"summary":"Verify Resend","operationId":"verify_resend_verify_resend_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_resend_verify_resend_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup/free":{"get":{"summary":"Free Signup Get","operationId":"free_signup_get_signup_free_get","parameters":[{"name":"prefill","in":"query","required":false,"schema":{"type":"string","default":"","title":"Prefill"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/magic/request":{"post":{"summary":"Magic Request","operationId":"magic_request_magic_request_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_magic_request_magic_request_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/magic/verify":{"get":{"summary":"Magic Verify","operationId":"magic_verify_magic_verify_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"}}}}}}},"/app":{"get":{"summary":"Portal Chat","description":"Chat UI — session required.","operationId":"portal_chat_app_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/app/chat":{"post":{"summary":"Portal Chat Post","description":"SSE streaming chat endpoint.","operationId":"portal_chat_post_app_chat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app/chat/clear":{"post":{"summary":"Portal Chat Clear","description":"Clear the session history for the current user.","operationId":"portal_chat_clear_app_chat_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app/history":{"get":{"summary":"Portal History","description":"Return the last 10 unique user messages for the sidebar.","operationId":"portal_history_app_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/intelligence/leads":{"get":{"summary":"Intelligence Leads","description":"Subcontractor leads — direct DB query.","operationId":"intelligence_leads_api_intelligence_leads_get","parameters":[{"name":"cpv_prefix","in":"query","required":false,"schema":{"type":"string","default":"72","title":"Cpv Prefix"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Days Back"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"","title":"Country"}},{"name":"min_value","in":"query","required":false,"schema":{"type":"string","default":"","title":"Min Value"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/intelligence/benchmark":{"get":{"summary":"Intelligence Benchmark","description":"Price benchmark — direct DB query.","operationId":"intelligence_benchmark_api_intelligence_benchmark_get","parameters":[{"name":"cpv_prefix","in":"query","required":false,"schema":{"type":"string","default":"72","title":"Cpv Prefix"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/intelligence/deadlines":{"get":{"summary":"Intelligence Deadlines","description":"Upcoming deadlines from watchlist matches — direct DB query.","operationId":"intelligence_deadlines_api_intelligence_deadlines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/pipeline":{"get":{"summary":"Pipeline Get","description":"Pipeline list — direct DB query, no AI cost.","operationId":"pipeline_get_api_pipeline_get","parameters":[{"name":"stage","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage"}},{"name":"client_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Client Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/update":{"post":{"summary":"Pipeline Update","description":"Pipeline stage/note update — direct DB write.","operationId":"pipeline_update_api_pipeline_update_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/profile":{"get":{"summary":"Profile Get","description":"Get all company profiles for the current user.","operationId":"profile_get_api_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/profile/save":{"post":{"summary":"Profile Save","description":"Save or update a company profile.","operationId":"profile_save_api_profile_save_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/profile/delete":{"post":{"summary":"Profile Delete","description":"Delete a company profile.","operationId":"profile_delete_api_profile_delete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/profile/set_default":{"post":{"summary":"Profile Set Default","description":"Set a profile as the default.","operationId":"profile_set_default_api_profile_set_default_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/user/morning-brief":{"get":{"summary":"Get Morning Brief Setting","description":"Return whether the daily morning brief email is enabled for this user.","operationId":"get_morning_brief_setting_api_user_morning_brief_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Set Morning Brief Setting","description":"Enable or disable the daily morning brief email for this user.","operationId":"set_morning_brief_setting_api_user_morning_brief_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/search":{"get":{"summary":"Search Get","description":"Search tenders — direct handler call, no AI cost.","operationId":"search_get_api_search_get","parameters":[{"name":"keywords","in":"query","required":false,"schema":{"type":"string","default":"","title":"Keywords"}},{"name":"countries","in":"query","required":false,"schema":{"type":"string","default":"","title":"Countries"}},{"name":"cpv_codes","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cpv Codes"}},{"name":"value_min_eur","in":"query","required":false,"schema":{"type":"string","default":"","title":"Value Min Eur"}},{"name":"value_max_eur","in":"query","required":false,"schema":{"type":"string","default":"","title":"Value Max Eur"}},{"name":"deadline_within_days","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Deadline Within Days"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cpv-suggest":{"get":{"summary":"Cpv Suggest","description":"Suggest CPV codes from free-text keywords. Splits q on commas (the\nKeywords field allows multiple comma-separated terms), looks up\neach term separately via handle_list_cpv_codes, merges and dedupes\nby bare code, then buckets results into \"direct\" (specific codes)\nand \"category\" (broad division/group-level codes, 4+ trailing\nzeros on the bare 8-digit code) so the UI can show them as two\nlabelled groups rather than one undifferentiated list.","operationId":"cpv_suggest_api_cpv_suggest_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assess":{"post":{"summary":"Assess Tender","description":"Run GO/NO GO qualification on a tender against a selected profile.","operationId":"assess_tender_api_assess_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/bid-outline":{"post":{"summary":"Bid Outline","description":"Generate a bid outline for a tender against a selected profile.","operationId":"bid_outline_api_bid_outline_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/pipeline/assessment":{"get":{"summary":"Pipeline Assessment","description":"Return the stored GO/NO GO assessment for a pipeline entry, no AI cost.","operationId":"pipeline_assessment_api_pipeline_assessment_get","parameters":[{"name":"tender_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tender Id"}},{"name":"client_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Client Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/outline":{"get":{"summary":"Pipeline Outline","description":"Return the stored bid outline for a pipeline entry, no AI cost.","operationId":"pipeline_outline_api_pipeline_outline_get","parameters":[{"name":"tender_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tender Id"}},{"name":"client_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Client Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/today":{"get":{"summary":"Today Digest","description":"Daily digest — new watchlist matches, urgent pipeline deadlines, bids awaiting result. No AI cost.","operationId":"today_digest_api_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/buyer-intelligence":{"get":{"summary":"Buyer Intelligence","description":"Buyer intelligence — direct DB query, no AI cost.","operationId":"buyer_intelligence_api_buyer_intelligence_get","parameters":[{"name":"buyer_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Buyer Name"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"","title":"Country"}},{"name":"cpv_prefix","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cpv Prefix"}},{"name":"exact","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exact"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watchlists":{"get":{"summary":"Watchlists List","description":"List the user's watchlists.","operationId":"watchlists_list_api_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/watchlists/save":{"post":{"summary":"Watchlists Save","description":"Create a new watchlist.","operationId":"watchlists_save_api_watchlists_save_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/watchlists/delete":{"post":{"summary":"Watchlists Delete","description":"Delete a watchlist.","operationId":"watchlists_delete_api_watchlists_delete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app/conversations":{"get":{"summary":"List Conversations","operationId":"list_conversations_app_conversations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Conversation","operationId":"create_conversation_app_conversations_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app/conversations/{conv_id}":{"get":{"summary":"Get Conversation","operationId":"get_conversation_app_conversations__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Conversation","operationId":"update_conversation_app_conversations__conv_id__patch","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Conversation","operationId":"delete_conversation_app_conversations__conv_id__delete","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/app/projects":{"get":{"summary":"List Projects","operationId":"list_projects_app_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Project","operationId":"create_project_app_projects_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app/projects/{project_id}":{"patch":{"summary":"Update Project","operationId":"update_project_app_projects__project_id__patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Project","operationId":"delete_project_app_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/unsubscribe":{"get":{"summary":"Unsubscribe Get","operationId":"unsubscribe_get_unsubscribe_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":"Unsubscribe Post","operationId":"unsubscribe_post_unsubscribe_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pricing":{"get":{"summary":"Pricing Redirect","description":"Redirect legacy /pricing to homepage pricing section.","operationId":"pricing_redirect_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/checkout":{"post":{"summary":"Billing Checkout","description":"Create a Creem checkout session for the given plan/interval.","operationId":"billing_checkout_billing_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/creem":{"post":{"summary":"Creem Webhook","description":"Handle Creem webhook events.","operationId":"creem_webhook_webhooks_creem_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/success":{"get":{"summary":"Billing Success","description":"Post-payment success page — Creem appends checkout_id, subscription_id etc as query params.","operationId":"billing_success_billing_success_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/portal":{"get":{"summary":"Billing Portal","description":"Redirect user to Creem customer billing portal.","operationId":"billing_portal_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/blog":{"get":{"summary":"Blog Index","description":"Blog index page.","operationId":"blog_index_blog_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/blog/{slug}":{"get":{"summary":"Blog Article","description":"Serve a blog article by slug.","operationId":"blog_article_blog__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"}}}}}}},"/report":{"get":{"summary":"Report Page","description":"Weekly tender report opt-in landing page.","operationId":"report_page_report_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/report/subscribe":{"post":{"summary":"Report Subscribe","description":"Handle report signup:\n1. Add contact to Brevo list for their sector\n2. Store subscriber in local DB\n3. Send PDF report via email immediately","operationId":"report_subscribe_report_subscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard":{"get":{"summary":"Dashboard Get","description":"Redirect to /app — dashboard has been migrated.","operationId":"dashboard_get_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/keys/rotate":{"post":{"summary":"Rotate Key","description":"Rotate the user's API key.","operationId":"rotate_key_keys_rotate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/me":{"get":{"summary":"Dashboard Me","operationId":"dashboard_me_api_dashboard_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/stats":{"get":{"summary":"Dashboard Stats","operationId":"dashboard_stats_api_dashboard_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/profile":{"get":{"summary":"Dashboard Profile Get","operationId":"dashboard_profile_get_api_dashboard_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Dashboard Profile Post","operationId":"dashboard_profile_post_api_dashboard_profile_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/watchlists":{"get":{"summary":"Dashboard Watchlists","operationId":"dashboard_watchlists_api_dashboard_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/usage":{"get":{"summary":"Dashboard Usage","operationId":"dashboard_usage_api_dashboard_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/password":{"post":{"summary":"Dashboard Password","operationId":"dashboard_password_api_dashboard_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/reveal-key":{"get":{"summary":"Dashboard Reveal Key","operationId":"dashboard_reveal_key_api_dashboard_reveal_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/oauth-clients":{"get":{"summary":"Dashboard Oauth Clients Get","operationId":"dashboard_oauth_clients_get_api_dashboard_oauth_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Dashboard Oauth Clients Create","operationId":"dashboard_oauth_clients_create_api_dashboard_oauth_clients_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/oauth-clients/{client_id}":{"delete":{"summary":"Dashboard Oauth Clients Delete","operationId":"dashboard_oauth_clients_delete_api_dashboard_oauth_clients__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client 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 Dashboard","description":"Admin dashboard — session cookie + admin email guard.","operationId":"admin_dashboard_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/api/stats":{"get":{"summary":"Admin Stats","description":"JSON stats endpoint for admin dashboard.","operationId":"admin_stats_admin_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"summary":"Authorize","operationId":"authorize_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":false,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":false,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"tenders:read","title":"Scope"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code_challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge Method"}}],"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":"Authorize Post","operationId":"authorize_post_oauth_authorize_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_post_oauth_authorize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/token":{"post":{"summary":"Token Exchange","operationId":"token_exchange_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_exchange_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Marketing Page","operationId":"marketing_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Privacy Policy","operationId":"privacy_policy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"summary":"Terms Of Service","operationId":"terms_of_service_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs":{"get":{"summary":"Documentation","operationId":"documentation_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/manifest":{"get":{"summary":"Mcp Manifest","operationId":"mcp_manifest_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sectors":{"get":{"summary":"Sector Examples","description":"Return cached sector tender examples for homepage carousel.","operationId":"sector_examples_api_sectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Metadata","operationId":"oauth_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp/server-card":{"get":{"summary":"Mcp Server Card","description":"MCP Server Card — SEP-1649 / Smithery. Served from static file.","operationId":"mcp_server_card__well_known_mcp_server_card_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"summary":"Mcp Server Card","description":"MCP Server Card — SEP-1649 / Smithery. Served from static file.","operationId":"mcp_server_card__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/claude-client":{"get":{"summary":"Claude Client Metadata","description":"Client ID Metadata Document (CIMD) for Claude.","operationId":"claude_client_metadata_oauth_claude_client_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"summary":"Dynamic Client Registration","description":"Dynamic Client Registration (RFC 7591).\nUsed by Smithery and other MCP clients that require DCR.","operationId":"dynamic_client_registration_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/demo":{"get":{"summary":"Demo Search","description":"Returns cached live search results for homepage prompt demo.\nSupported q values: nl_software, it_subcon\nRate limited: 5 requests per IP per hour.\nCache TTL: 4 hours.","operationId":"demo_search_api_demo_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"nl_software","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_authorize_post_oauth_authorize_post":{"properties":{"action":{"type":"string","title":"Action"},"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"scope":{"type":"string","title":"Scope","default":"tenders:read"},"state":{"type":"string","title":"State","default":""},"code_challenge":{"type":"string","title":"Code Challenge","default":""},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":""}},"type":"object","required":["action","email","password","client_id","redirect_uri"],"title":"Body_authorize_post_oauth_authorize_post"},"Body_login_post_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"type":"string","title":"Next","default":"/dashboard"}},"type":"object","required":["email","password"],"title":"Body_login_post_login_post"},"Body_magic_request_magic_request_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_magic_request_magic_request_post"},"Body_signup_post_legacy_signup_legacy_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"company":{"type":"string","title":"Company","default":""},"plan":{"type":"string","title":"Plan","default":"starter"}},"type":"object","required":["email","password"],"title":"Body_signup_post_legacy_signup_legacy_post"},"Body_signup_post_signup_post":{"properties":{"email":{"type":"string","title":"Email","default":""}},"type":"object","title":"Body_signup_post_signup_post"},"Body_token_exchange_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""},"client_secret":{"type":"string","title":"Client Secret","default":""}},"type":"object","required":["grant_type"],"title":"Body_token_exchange_oauth_token_post"},"Body_verify_resend_verify_resend_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_verify_resend_verify_resend_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"}}}}