{"openapi":"3.1.0","info":{"title":"VoxOdds","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Category"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/market/{market_id}":{"get":{"summary":"Market Detail","operationId":"market_detail_market__market_id__get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/market/{market_id}/insight":{"post":{"summary":"Submit Insight","operationId":"submit_insight_market__market_id__insight_post","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_submit_insight_market__market_id__insight_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insight/{insight_id}/vote":{"post":{"summary":"Vote Insight","operationId":"vote_insight_insight__insight_id__vote_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_vote_insight_insight__insight_id__vote_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"summary":"Auth Login","description":"Exchange Firebase ID token for a session cookie.","operationId":"auth_login_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/logout":{"post":{"summary":"Auth Logout","operationId":"auth_logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/set-username":{"post":{"summary":"Set Username","operationId":"set_username_set_username_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_set_username_set_username_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/{user_id}":{"get":{"summary":"User Profile","operationId":"user_profile_user__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leaderboard":{"get":{"summary":"Leaderboard","operationId":"leaderboard_leaderboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/p/{handle}":{"get":{"summary":"Public Portfolio","description":"Public anonymous paper portfolio page keyed by a P-{hex} pseudonym handle.","operationId":"public_portfolio_p__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/compare":{"get":{"summary":"Compare Odds","operationId":"compare_odds_compare_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/edge":{"get":{"summary":"Edge Dashboard","operationId":"edge_dashboard_edge_get","parameters":[{"name":"min_edge","in":"query","required":false,"schema":{"type":"number","maximum":25,"minimum":0,"default":1.0,"title":"Min Edge"}},{"name":"include_risky","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Risky"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/backtest":{"get":{"summary":"Backtest Dashboard","operationId":"backtest_dashboard_backtest_get","parameters":[{"name":"lookback","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":6,"title":"Lookback"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":12,"title":"Horizon"}},{"name":"min_move","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":5.0,"title":"Min Move"}},{"name":"min_vol","in":"query","required":false,"schema":{"type":"number","maximum":1000000,"minimum":0,"default":1000,"title":"Min Vol"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies":{"get":{"summary":"Strategies Dashboard","operationId":"strategies_dashboard_strategies_get","parameters":[{"name":"lookback","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":1,"title":"Lookback"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":1,"title":"Horizon"}},{"name":"min_move","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":2.0,"title":"Min Move"}},{"name":"min_vol","in":"query","required":false,"schema":{"type":"number","maximum":1000000,"minimum":0,"default":1000,"title":"Min Vol"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/investment-insights":{"get":{"summary":"Investment Insights Dashboard","operationId":"investment_insights_dashboard_investment_insights_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/research-desk":{"get":{"summary":"Research Desk Page","operationId":"research_desk_page_research_desk_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/watchlist":{"get":{"summary":"Watchlist Page","operationId":"watchlist_page_watchlist_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/paper-trades":{"get":{"summary":"Paper Trades Page","operationId":"paper_trades_page_paper_trades_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/investment-insights/{insight_id}":{"get":{"summary":"Investment Insight Detail","operationId":"investment_insight_detail_investment_insights__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ga/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_ga__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cy/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_cy__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gl/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_gl__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pl/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_pl__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/yue/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_yue__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/eu/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_eu__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ca/{section_slug}/{insight_slug}":{"get":{"summary":"Localized Investment Insight Slug Detail","operationId":"localized_investment_insight_slug_detail_ca__section_slug___insight_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}},{"name":"insight_slug","in":"path","required":true,"schema":{"type":"string","title":"Insight Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ga/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_ga__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cy/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_cy__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gl/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_gl__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pl/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_pl__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/yue/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_yue__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/eu/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_eu__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ca/{section_slug}":{"get":{"summary":"Localized Investment Hub","operationId":"localized_investment_hub_ca__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{locale}/investment-insights/{insight_id}":{"get":{"summary":"Localized Investment Insight Detail","operationId":"localized_investment_insight_detail__locale__investment_insights__insight_id__get","parameters":[{"name":"locale","in":"path","required":true,"schema":{"type":"string","title":"Locale"}},{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/survey/{survey_id}":{"get":{"summary":"Survey Page","description":"Survey voting page — only accessible with valid source + token.","operationId":"survey_page_survey__survey_id__get","parameters":[{"name":"survey_id","in":"path","required":true,"schema":{"type":"string","title":"Survey Id"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"","title":"Src"}},{"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"}}}}}}},"/survey/{survey_id}/vote":{"post":{"summary":"Survey Vote","description":"Submit a vote to an exploratory community survey.","operationId":"survey_vote_survey__survey_id__vote_post","parameters":[{"name":"survey_id","in":"path","required":true,"schema":{"type":"string","title":"Survey Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_survey_vote_survey__survey_id__vote_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/survey/{survey_id}/results":{"get":{"summary":"Survey Results Page","description":"Survey results page — always public.","operationId":"survey_results_page_survey__survey_id__results_get","parameters":[{"name":"survey_id","in":"path","required":true,"schema":{"type":"string","title":"Survey 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/surveys/create":{"post":{"summary":"Api Create Survey","description":"Create a new exploratory community survey (admin only for now).","operationId":"api_create_survey_api_surveys_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/c/{category_slug}":{"get":{"summary":"Category Page","description":"Dedicated category landing page for SEO.","operationId":"category_page_c__category_slug__get","parameters":[{"name":"category_slug","in":"path","required":true,"schema":{"type":"string","title":"Category 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":{"get":{"summary":"Api Docs","operationId":"api_docs_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/partners":{"get":{"summary":"Partners Page","description":"Public partner and media page for affiliate, API, and sponsorship inquiries.","operationId":"partners_page_partners_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/guide/{slug}":{"get":{"summary":"Guide Page","description":"Evergreen SEO content pages.","operationId":"guide_page_guide__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"}}}}}}},"/tools/calculator":{"get":{"summary":"Odds Calculator","operationId":"odds_calculator_tools_calculator_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/newsletter":{"post":{"summary":"Newsletter Signup","operationId":"newsletter_signup_api_newsletter_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_newsletter_signup_api_newsletter_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/router-alerts":{"post":{"summary":"Router Alert Signup","description":"Create an opt-in alert pinned to a fresh executable Router quote.","operationId":"router_alert_signup_api_router_alerts_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_router_alert_signup_api_router_alerts_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/unsubscribe/{email_hash}":{"get":{"summary":"Unsubscribe Confirm","description":"Confirmation page only — NO DB write on GET. Prevents email-scanner /\nlink-prefetch (which issue GET, never POST) from unsubscribing users and\nwriting to Firestore. The actual write happens on POST below.","operationId":"unsubscribe_confirm_unsubscribe__email_hash__get","parameters":[{"name":"email_hash","in":"path","required":true,"schema":{"type":"string","title":"Email Hash"}}],"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 Digest","description":"One-click unsubscribe (RFC 8058 POST). Always returns success to avoid enumeration.","operationId":"unsubscribe_digest_unsubscribe__email_hash__post","parameters":[{"name":"email_hash","in":"path","required":true,"schema":{"type":"string","title":"Email Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track/pageview":{"post":{"summary":"Track Pageview","description":"Privacy-light pageview tracking: no raw IP storage and no tracking cookies.","operationId":"track_pageview_api_track_pageview_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/track/event":{"post":{"summary":"Track Engagement Event","description":"Privacy-light CTA funnel tracking: impressions, clicks, and submits.","operationId":"track_engagement_event_api_track_event_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/go/polymarket/{slug}":{"get":{"summary":"Go Polymarket","operationId":"go_polymarket_go_polymarket__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/polymarket":{"get":{"summary":"Go Polymarket","operationId":"go_polymarket_go_polymarket_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/kalshi/{ticker}":{"get":{"summary":"Go Kalshi","operationId":"go_kalshi_go_kalshi__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/kalshi":{"get":{"summary":"Go Kalshi","operationId":"go_kalshi_go_kalshi_get","parameters":[{"name":"ticker","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticker"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/book/{book_id}":{"get":{"summary":"Go Book","description":"Outbound click to any sportsbook, measured whether or not it pays us.\n\nOne route for every book instead of a hand-written /go/<name> per venue:\nadding a bookmaker is a registry row, and monetizing one is an environment\nvariable (VOX_BOOK_<ID>_URL) — neither needs a deploy.\n\nA book with no affiliate link still redirects to its homepage. Sending a\nuser to a dead end because we have no commission would make the comparison\na sales funnel instead of a comparison, and the click telemetry is worth\nhaving either way: it tells us which programs are worth applying to.","operationId":"go_book_go_book__book_id__get","parameters":[{"name":"book_id","in":"path","required":true,"schema":{"type":"string","title":"Book Id"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/internal":{"get":{"summary":"Go Internal","operationId":"go_internal_go_internal_get","parameters":[{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"/","title":"To"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"site","title":"Src"}},{"name":"target","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quickvote/{market_id}":{"post":{"summary":"Quick Vote","description":"Instant one-click poll — no login needed.\nUses fingerprint to prevent duplicates. Results show immediately.","operationId":"quick_vote_api_quickvote__market_id__post","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_quick_vote_api_quickvote__market_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"For AI crawlers — structured description of the site.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms-full.txt":{"get":{"summary":"Llms Full Txt","description":"Expanded AI crawler index with example prompts and endpoint contracts.","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ai.txt":{"get":{"summary":"Ai Txt","description":"Short alias for agents that look for simple AI-readable site summaries.","operationId":"ai_txt_ai_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp-registry-auth":{"get":{"summary":"Mcp Registry Auth","description":"Domain verification for the official MCP registry (public key only).\n\nThis pubkey is derived from the private key in Secret Manager\n`mcp-registry-voxodds-ed25519` (v1). The previous hardcoded value came from a\ndifferent keypair whose private half was never stored — re-paired 2026-07-23.","operationId":"mcp_registry_auth__well_known_mcp_registry_auth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/did.json":{"get":{"summary":"Well Known Did","description":"did:web:voxodds.com — service DID of the Bluesky feed generator.","operationId":"well_known_did__well_known_did_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/xrpc/app.bsky.feed.describeFeedGenerator":{"get":{"summary":"Bsky Describe Feed Generator","operationId":"bsky_describe_feed_generator_xrpc_app_bsky_feed_describeFeedGenerator_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/xrpc/app.bsky.feed.getFeedSkeleton":{"get":{"summary":"Bsky Get Feed Skeleton","description":"Public, non-personalised skeleton for the \"Prediction Markets\" feed.","operationId":"bsky_get_feed_skeleton_xrpc_app_bsky_feed_getFeedSkeleton_get","parameters":[{"name":"feed","in":"query","required":false,"schema":{"type":"string","default":"","title":"Feed"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/bsky-feed-ingest":{"post":{"summary":"Api Internal Bsky Feed Ingest","description":"Cloud Scheduler: refresh the Bluesky \"Prediction Markets\" feed index.","operationId":"api_internal_bsky_feed_ingest_api_internal_bsky_feed_ingest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp.json":{"get":{"summary":"Well Known Mcp","description":"MCP server discovery manifest.","operationId":"well_known_mcp__well_known_mcp_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/odds/{slug}":{"get":{"summary":"Seo Market Page","description":"SEO-friendly market page with clean URLs.\nThese pages are designed to rank for queries like\n\"will france win world cup odds\" or \"fed rate cut probability\"","operationId":"seo_market_page_odds__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/v1/markets":{"get":{"summary":"Api Markets","description":"Public API — returns live prediction market data as JSON.","operationId":"api_markets_api_v1_markets_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"execution","in":"query","required":false,"schema":{"type":"string","default":"live","title":"Execution"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/market/{market_id}":{"get":{"summary":"Api Market Detail","description":"Public API — single market with history and community data.","operationId":"api_market_detail_api_v1_market__market_id__get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trending":{"get":{"summary":"Api Trending","description":"Top movers — markets with biggest price changes.","operationId":"api_trending_api_v1_trending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/edges":{"get":{"summary":"Api Edges","description":"Ranked market signals: spreads, closing watches, and integrity risk.","operationId":"api_edges_api_v1_edges_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"min_edge","in":"query","required":false,"schema":{"type":"number","maximum":25,"minimum":0,"default":1.0,"title":"Min Edge"}},{"name":"include_risky","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Risky"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/backtest":{"get":{"summary":"Api Backtest","description":"Backtest simple price-action signals against stored hourly snapshots.","operationId":"api_backtest_api_v1_backtest_get","parameters":[{"name":"lookback","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":6,"title":"Lookback"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":12,"title":"Horizon"}},{"name":"min_move","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":5.0,"title":"Min Move"}},{"name":"min_vol","in":"query","required":false,"schema":{"type":"number","maximum":1000000,"minimum":0,"default":1000,"title":"Min Vol"}},{"name":"limit_docs","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":500,"default":5000,"title":"Limit Docs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/strategies":{"get":{"summary":"Api Strategies","description":"Current strategy playbook built from backtests and Edge signals.","operationId":"api_strategies_api_v1_strategies_get","parameters":[{"name":"lookback","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":1,"title":"Lookback"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":1,"title":"Horizon"}},{"name":"min_move","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":2.0,"title":"Min Move"}},{"name":"min_vol","in":"query","required":false,"schema":{"type":"number","maximum":1000000,"minimum":0,"default":1000,"title":"Min Vol"}},{"name":"limit_docs","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":500,"default":5000,"title":"Limit Docs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/investment-insights":{"get":{"summary":"Api Investment Insights","description":"Public research notes for investment-style prediction-market insights.","operationId":"api_investment_insights_api_v1_investment_insights_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/research-desk":{"get":{"summary":"Api Research Desk","description":"Public Research Desk: active theses, demand queue, watched setups, and recent thesis changes.","operationId":"api_research_desk_api_v1_research_desk_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":6,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/investment-insights/{insight_id}":{"get":{"summary":"Api Investment Insight Detail","description":"Single public investment insight with tracker state and source links.","operationId":"api_investment_insight_detail_api_v1_investment_insights__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/world-cup":{"get":{"summary":"World Cup Hub Page","description":"World Cup 2026 odds hub — SEO landing + email capture.","operationId":"world_cup_hub_page_world_cup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/world-cup/brief":{"get":{"summary":"World Cup Brief Page","description":"AI and creator-ready World Cup market brief.","operationId":"world_cup_brief_page_world_cup_brief_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/world-cup/brief.md":{"get":{"summary":"World Cup Brief Markdown","operationId":"world_cup_brief_markdown_world_cup_brief_md_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/world-cup/brief":{"get":{"summary":"Api World Cup Brief","description":"AI-ready World Cup 2026 odds brief with citeable markdown and source links.","operationId":"api_world_cup_brief_api_v1_world_cup_brief_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/world-cup/matchday":{"get":{"summary":"World Cup Matchday Page","description":"Daily World Cup match market brief with share assets.","operationId":"world_cup_matchday_page_world_cup_matchday_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/world-cup/matchday.md":{"get":{"summary":"World Cup Matchday Markdown","operationId":"world_cup_matchday_markdown_world_cup_matchday_md_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/world-cup/matchday.svg":{"get":{"summary":"World Cup Matchday Svg","operationId":"world_cup_matchday_svg_world_cup_matchday_svg_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/world-cup/matchday":{"get":{"summary":"Api World Cup Matchday","description":"AI-ready daily World Cup matchday brief with share-card links.","operationId":"api_world_cup_matchday_api_v1_world_cup_matchday_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/world-cup":{"get":{"summary":"Embed World Cup Widget","description":"Embeddable World Cup winner odds widget (must register before /embed/{market_id}).","operationId":"embed_world_cup_widget_embed_world_cup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/embed/world-cup/code":{"get":{"summary":"Embed World Cup Code","operationId":"embed_world_cup_code_embed_world_cup_code_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/embed/{market_id}":{"get":{"summary":"Embed Widget","description":"Embeddable odds widget for external sites.","operationId":"embed_widget_embed__market_id__get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/{market_id}/code":{"get":{"summary":"Embed Code","description":"Show embed code for a market widget.","operationId":"embed_code_embed__market_id__code_get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/insight/{insight_id}":{"get":{"summary":"Embed Investment Insight Widget","description":"Embeddable investment insight thesis widget for external sites.","operationId":"embed_investment_insight_widget_embed_insight__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/insight/{insight_id}/code":{"get":{"summary":"Embed Investment Insight Code","description":"Show embed code for an investment insight thesis widget.","operationId":"embed_investment_insight_code_embed_insight__insight_id__code_get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/trending":{"get":{"summary":"Trending Page","description":"Shows markets sorted by activity and price movement.","operationId":"trending_page_trending_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/v1/odds/{slug}":{"get":{"summary":"Api Odds By Slug","description":"Get odds for a market by slug. Returns rich data with affiliate links.\nAI chatbots: use this to answer prediction market questions.","operationId":"api_odds_by_slug_api_v1_odds__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"}}}}}}},"/api/v1/markdown/{market_id}":{"get":{"summary":"Api Markdown","description":"Returns a ready-to-paste markdown summary of a market.\nIncludes affiliate links. Perfect for AI chatbot responses.","operationId":"api_markdown_api_v1_markdown__market_id__get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/answer":{"get":{"summary":"Api Answer","description":"AI-friendly endpoint: ask a question, get a structured answer with odds.\nExample: /api/v1/answer?q=will france win the world cup","operationId":"api_answer_api_v1_answer_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Natural language question about prediction markets","title":"Q"},"description":"Natural language question about prediction markets"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bet-check":{"get":{"summary":"Api Bet Check","description":"Pre-bet check: is this price any good, and who pays more for the same bet?\n\nResolves the event conservatively, then uses any available prediction-market\nor configured sportsbook reference. Ambiguous events receive no verdict.","operationId":"api_bet_check_api_v1_bet_check_get","parameters":[{"name":"event","in":"query","required":true,"schema":{"type":"string","description":"The event, e.g. 'Arsenal vs Chelsea' or 'Trump wins 2028'","title":"Event"},"description":"The event, e.g. 'Arsenal vs Chelsea' or 'Trump wins 2028'"},{"name":"side","in":"query","required":true,"schema":{"type":"string","description":"The side you want to back","title":"Side"},"description":"The side you want to back"},{"name":"odds","in":"query","required":false,"schema":{"type":"string","description":"Odds your book offers — decimal (2.10), american (+110) or fractional (11/10)","default":"","title":"Odds"},"description":"Odds your book offers — decimal (2.10), american (+110) or fractional (11/10)"},{"name":"sport","in":"query","required":false,"schema":{"type":"string","description":"Odds-feed sport key; 'upcoming' scans all sports","default":"upcoming","title":"Sport"},"description":"Odds-feed sport key; 'upcoming' scans all sports"},{"name":"src","in":"query","required":false,"schema":{"type":"string","description":"Click attribution source","default":"api","title":"Src"},"description":"Click attribution source"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sportsbooks":{"get":{"summary":"Api Sportsbooks","description":"Every bookmaker we can price, and which of them can actually earn today.\n\nPublic on purpose: the split between 'books compared' and 'books that pay\nus' is the disclosure that makes the comparison trustworthy.","operationId":"api_sportsbooks_api_v1_sportsbooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/search":{"get":{"summary":"Api Search","description":"Live cross-platform search across the FULL Polymarket + Kalshi catalog.","operationId":"api_search_api_v1_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query","default":"","title":"Q"},"description":"Search query"},{"name":"platform","in":"query","required":false,"schema":{"type":"string","description":"all | polymarket | kalshi","default":"all","title":"Platform"},"description":"all | polymarket | kalshi"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/executable-quote":{"get":{"summary":"Api Executable Quote","description":"Walk a venue's public order book for an all-in cash-sized buy quote.\n\nApplies the current public taker-fee formula; exact venue rounding may vary\nwith actual counterparty fills. Never compares contracts or labels arbitrage.","operationId":"api_executable_quote_api_v1_executable_quote_get","parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"polymarket or kalshi","title":"Platform"},"description":"polymarket or kalshi"},{"name":"market_id","in":"query","required":true,"schema":{"type":"string","description":"Polymarket market id or Kalshi ticker","title":"Market Id"},"description":"Polymarket market id or Kalshi ticker"},{"name":"side","in":"query","required":false,"schema":{"type":"string","description":"Outcome to buy","default":"Yes","title":"Side"},"description":"Outcome to buy"},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"description":"All-in cash budget including estimated taker fees","default":100.0,"title":"Amount Usd"},"description":"All-in cash budget including estimated taker fees"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compare-executable":{"get":{"summary":"Api Compare Executable","description":"Compare net fills only when the two rule sets are explicitly verified equivalent.","operationId":"api_compare_executable_api_v1_compare_executable_get","parameters":[{"name":"polymarket_id","in":"query","required":true,"schema":{"type":"string","title":"Polymarket Id"}},{"name":"kalshi_ticker","in":"query","required":true,"schema":{"type":"string","title":"Kalshi Ticker"}},{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"Yes","title":"Side"}},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/executable-opportunities":{"get":{"summary":"Api Executable Opportunities","description":"Rank both sides of every fingerprint-pinned equivalent contract pair.","operationId":"api_executable_opportunities_api_v1_executable_opportunities_get","parameters":[{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}},{"name":"family","in":"query","required":false,"schema":{"type":"string","default":"","title":"Family"}},{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"","title":"Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/router-feature":{"get":{"summary":"Api Router Feature","description":"One rotating priority quote for contextual modules on existing pages.\n\nThis intentionally quotes one reviewed pair instead of scanning the full\nregistry, so a cold page view cannot fan out across every venue/order book.","operationId":"api_router_feature_api_v1_router_feature_get","parameters":[{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Variant"}},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/arbitrage-candidates":{"get":{"summary":"Api Arbitrage Candidates","description":"Find unfilled, size-matched opposite-side coverage on reviewed pairs.","operationId":"api_arbitrage_candidates_api_v1_arbitrage_candidates_get","parameters":[{"name":"max_capital_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Max Capital Usd"}},{"name":"family","in":"query","required":false,"schema":{"type":"string","default":"","title":"Family"}},{"name":"polymarket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Polymarket Id"}},{"name":"kalshi_ticker","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kalshi Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sportsbook-arbitrage":{"get":{"summary":"Api Sportsbook Arbitrage","description":"Find cent-rounded 2-way/3-way surebet candidates in the live odds feed.","operationId":"api_sportsbook_arbitrage_api_v1_sportsbook_arbitrage_get","parameters":[{"name":"sport_key","in":"query","required":false,"schema":{"type":"string","default":"upcoming","title":"Sport Key"}},{"name":"capital_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Capital Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arbitrage":{"get":{"summary":"Arbitrage Candidates Page","operationId":"arbitrage_candidates_page_arbitrage_get","parameters":[{"name":"max_capital_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Max Capital Usd"}},{"name":"family","in":"query","required":false,"schema":{"type":"string","default":"","title":"Family"}},{"name":"sport_key","in":"query","required":false,"schema":{"type":"string","default":"upcoming","title":"Sport Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/outcomes":{"get":{"summary":"Outcome Router Page","operationId":"outcome_router_page_outcomes_get","parameters":[{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}},{"name":"family","in":"query","required":false,"schema":{"type":"string","default":"","title":"Family"}},{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"","title":"Side"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/polymarket-vs-kalshi":{"get":{"summary":"Polymarket Vs Kalshi Page","operationId":"polymarket_vs_kalshi_page_polymarket_vs_kalshi_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/polymarket-vs-kalshi/{family_slug}":{"get":{"summary":"Polymarket Vs Kalshi Family Page","operationId":"polymarket_vs_kalshi_family_page_polymarket_vs_kalshi__family_slug__get","parameters":[{"name":"family_slug","in":"path","required":true,"schema":{"type":"string","title":"Family Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/outcomes/{outcome_slug}":{"get":{"summary":"Outcome Landing Page","description":"Crawlable, exact-contract landing page for a reviewed Router outcome.","operationId":"outcome_landing_page_outcomes__outcome_slug__get","parameters":[{"name":"outcome_slug","in":"path","required":true,"schema":{"type":"string","title":"Outcome Slug"}},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/opportunities/{opportunity_id}":{"get":{"summary":"Executable Opportunity Page","description":"Stable, shareable page for one reviewed outcome side at a live budget.","operationId":"executable_opportunity_page_opportunities__opportunity_id__get","parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/execution-compare":{"get":{"summary":"Execution Compare Page","description":"Human-readable all-in comparison with fail-closed rule equivalence.","operationId":"execution_compare_page_execution_compare_get","parameters":[{"name":"polymarket_id","in":"query","required":true,"schema":{"type":"string","title":"Polymarket Id"}},{"name":"kalshi_ticker","in":"query","required":true,"schema":{"type":"string","title":"Kalshi Ticker"}},{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"Yes","title":"Side"}},{"name":"amount_usd","in":"query","required":false,"schema":{"type":"number","maximum":100000,"exclusiveMinimum":0,"default":100.0,"title":"Amount Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search":{"get":{"summary":"Search Page","operationId":"search_page_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openapi.json":{"get":{"summary":"Openapi Spec","description":"OpenAPI 3.0 spec for AI tool discovery.","operationId":"openapi_spec_api_openapi_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/ai-plugin.json":{"get":{"summary":"Ai Plugin","description":"OpenAI ChatGPT plugin manifest — makes VoxOdds discoverable by AI.","operationId":"ai_plugin__well_known_ai_plugin_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/screener":{"get":{"summary":"Screener","description":"Prediction market screener — filter and sort like a stock screener.","operationId":"screener_screener_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"setup","title":"Sort"}},{"name":"cat","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cat"}},{"name":"min_vol","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Min Vol"}},{"name":"max_odds","in":"query","required":false,"schema":{"type":"number","default":100,"title":"Max Odds"}},{"name":"min_odds","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Min Odds"}},{"name":"ending","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ending"}},{"name":"execution","in":"query","required":false,"schema":{"type":"string","default":"live","title":"Execution"}},{"name":"strategy","in":"query","required":false,"schema":{"type":"string","default":"","title":"Strategy"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ending-soon":{"get":{"summary":"Ending Soon","description":"Markets resolving within 7 days — time-sensitive opportunities.","operationId":"ending_soon_ending_soon_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/report/today":{"get":{"summary":"Daily Report","description":"AI-generated daily market report — fresh SEO content every day.","operationId":"daily_report_report_today_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/report/{date}":{"get":{"summary":"Past Report","description":"View a past daily report.","operationId":"past_report_report__date__get","parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/og/{market_id}.svg":{"get":{"summary":"Og Image","description":"Generate dynamic SVG OG image for social sharing.","operationId":"og_image_og__market_id__svg_get","parameters":[{"name":"market_id","in":"path","required":true,"schema":{"type":"string","title":"Market Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/digest":{"post":{"summary":"Generate Digest","description":"Generate a weekly digest email using Gemini — top markets, impacts, and edge.","operationId":"generate_digest_api_digest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/monetization":{"get":{"summary":"Internal Monetization","description":"Internal dashboard for revenue and retention signals.","operationId":"internal_monetization_internal_monetization_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/internal/monetization":{"get":{"summary":"Api Internal Monetization","description":"Internal JSON metrics for scripts/dashboards.","operationId":"api_internal_monetization_api_internal_monetization_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/digest-preview":{"post":{"summary":"Internal Digest Preview","description":"Generate and store a weekly digest draft. Does not send email.","operationId":"internal_digest_preview_internal_digest_preview_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/email-queue":{"post":{"summary":"Internal Email Queue","description":"Create a draft email queue from the latest digest. Does not send email.","operationId":"internal_email_queue_internal_email_queue_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/email-send":{"post":{"summary":"Internal Email Send","description":"Preview or send an email job. Real sends require confirm=SEND.","operationId":"internal_email_send_internal_email_send_post","parameters":[{"name":"job_id","in":"query","required":false,"schema":{"type":"string","default":"latest","title":"Job Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirm"}},{"name":"max_recipients","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Max Recipients"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/investment-insight-alerts":{"post":{"summary":"Internal Investment Insight Alerts","description":"Evaluate investment insight alert changes from the dashboard. Never sends email.","operationId":"internal_investment_insight_alerts_internal_investment_insight_alerts_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/equivalence-review-refresh":{"post":{"summary":"Internal Equivalence Review Refresh","description":"Refresh the review-only candidate queue, then return to the dashboard.","operationId":"internal_equivalence_review_refresh_internal_equivalence_review_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/digest-preview":{"post":{"summary":"Api Internal Digest Preview","description":"Generate a digest draft for automation. Does not send email.","operationId":"api_internal_digest_preview_api_internal_digest_preview_post","parameters":[{"name":"save","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Save"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Digest Preview","description":"Generate a digest draft for automation. Does not send email.","operationId":"api_internal_digest_preview_api_internal_digest_preview_get","parameters":[{"name":"save","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Save"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/email-queue":{"post":{"summary":"Api Internal Email Queue","description":"Create a digest email job for automation. Does not send email.","operationId":"api_internal_email_queue_api_internal_email_queue_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/email-send":{"post":{"summary":"Api Internal Email Send","description":"Preview or send an email job. Real sends require confirm=SEND.","operationId":"api_internal_email_send_api_internal_email_send_post","parameters":[{"name":"job_id","in":"query","required":false,"schema":{"type":"string","default":"latest","title":"Job Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirm"}},{"name":"max_recipients","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Max Recipients"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/investment-insight-alerts":{"post":{"summary":"Api Internal Investment Insight Alerts","description":"Evaluate insight tracker changes and queue follower alerts only on state changes.","operationId":"api_internal_investment_insight_alerts_api_internal_investment_insight_alerts_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"max_recipients","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Max Recipients"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Investment Insight Alerts","description":"Evaluate insight tracker changes and queue follower alerts only on state changes.","operationId":"api_internal_investment_insight_alerts_api_internal_investment_insight_alerts_get","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"max_recipients","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Max Recipients"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/insight-threshold-alerts":{"post":{"summary":"Api Internal Insight Threshold Alerts","description":"Per-recipient threshold-cross watchlist alerts. Real sends require dry_run=false AND send=true.","operationId":"api_internal_insight_threshold_alerts_api_internal_insight_threshold_alerts_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"threshold_pp","in":"query","required":false,"schema":{"type":"number","default":5.0,"title":"Threshold Pp"}},{"name":"cooldown_hours","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Cooldown Hours"}},{"name":"max_jobs","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Max Jobs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Insight Threshold Alerts","description":"Per-recipient threshold-cross watchlist alerts. Real sends require dry_run=false AND send=true.","operationId":"api_internal_insight_threshold_alerts_api_internal_insight_threshold_alerts_get","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"threshold_pp","in":"query","required":false,"schema":{"type":"number","default":5.0,"title":"Threshold Pp"}},{"name":"cooldown_hours","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Cooldown Hours"}},{"name":"max_jobs","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Max Jobs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/router-price-alerts":{"post":{"summary":"Api Internal Router Price Alerts","description":"Evaluate opted-in Router watches and optionally deliver crossed alerts.","operationId":"api_internal_router_price_alerts_api_internal_router_price_alerts_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"cooldown_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Cooldown Hours"}},{"name":"max_jobs","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Max Jobs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Router Price Alerts","description":"Evaluate opted-in Router watches and optionally deliver crossed alerts.","operationId":"api_internal_router_price_alerts_api_internal_router_price_alerts_get","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"send","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Send"}},{"name":"cooldown_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Cooldown Hours"}},{"name":"max_jobs","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Max Jobs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/edge-snapshot":{"post":{"summary":"Api Internal Edge Snapshot","description":"Persist current Edge Engine signals and Strategy Playbook for future reads.","operationId":"api_internal_edge_snapshot_api_internal_edge_snapshot_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/investment-insights/generate":{"post":{"summary":"Api Internal Generate Investment Insights","description":"Generate investment insights from Edge Engine candidates.","operationId":"api_internal_generate_investment_insights_api_internal_investment_insights_generate_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"default":3,"title":"Limit"}},{"name":"translate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Translate"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/investment-insights-generate":{"post":{"summary":"Internal Generate Investment Insights","description":"Internal dashboard action for the Edge-to-insights generator.","operationId":"internal_generate_investment_insights_internal_investment_insights_generate_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"default":3,"title":"Limit"}},{"name":"translate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Translate"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/strategy-playbook":{"post":{"summary":"Api Internal Strategy Playbook","description":"Persist the latest Strategy Playbook for fast public reads.","operationId":"api_internal_strategy_playbook_api_internal_strategy_playbook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/social-publish":{"post":{"summary":"Api Internal Social Publish","description":"Head of Live Distribution — draft + (optionally) publish the live World Cup\nmatchday slate to owned channels.\n\nSafe by default: dry_run=True returns drafts only. Real posting requires\ndry_run=false AND confirm=SEND, and even then only Bluesky/Telegram/IndexNow\nauto-fire — X/Reddit are always saved as drafts for human review. The Gemini\npolish step routes through the Cost/Kill Warden and falls back to deterministic\ncopy when paused/over-budget.","operationId":"api_internal_social_publish_api_internal_social_publish_post","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}},{"name":"channels","in":"query","required":false,"schema":{"type":"string","default":"bluesky,mastodon,telegram,indexnow","title":"Channels"}},{"name":"polish","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Polish"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/gemini-usage":{"post":{"summary":"Api Internal Gemini Usage","description":"Cost/Kill Warden — today's guarded Gemini token/cost line. ?persist=true also\nwrites the snapshot to gemini_usage_daily for a cross-instance view.","operationId":"api_internal_gemini_usage_api_internal_gemini_usage_post","parameters":[{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Persist"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Gemini Usage","description":"Cost/Kill Warden — today's guarded Gemini token/cost line. ?persist=true also\nwrites the snapshot to gemini_usage_daily for a cross-instance view.","operationId":"api_internal_gemini_usage_api_internal_gemini_usage_get","parameters":[{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Persist"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/affiliate-warden":{"post":{"summary":"Api Internal Affiliate Warden","description":"Head of Revenue Activation — audit outbound-link attribution across all surfaces\nand (optionally) stage a referral-code flip. Staging never auto-applies: it returns\nand stores the exact `gcloud run services update` command for a human to run.","operationId":"api_internal_affiliate_warden_api_internal_affiliate_warden_post","parameters":[{"name":"stage_platform","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Platform"}},{"name":"stage_code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Code"}},{"name":"stage_expected","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Expected"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Affiliate Warden","description":"Head of Revenue Activation — audit outbound-link attribution across all surfaces\nand (optionally) stage a referral-code flip. Staging never auto-applies: it returns\nand stores the exact `gcloud run services update` command for a human to run.","operationId":"api_internal_affiliate_warden_api_internal_affiliate_warden_get","parameters":[{"name":"stage_platform","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Platform"}},{"name":"stage_code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Code"}},{"name":"stage_expected","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage Expected"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/canary":{"post":{"summary":"Api Internal Canary","description":"Daily self-test of the public surface from the outside (trending non-empty,\nMCP tools, scoreboard, flagship pages, affiliate attribution). Failures land in\nthe owner's digest — regressions must not wait for a human to notice.","operationId":"api_internal_canary_api_internal_canary_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/equivalence-review":{"post":{"summary":"Api Internal Equivalence Review","description":"Review-only discovery queue; it has no code path to approve a contract.","operationId":"api_internal_equivalence_review_api_internal_equivalence_review_post","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Internal Equivalence Review","description":"Review-only discovery queue; it has no code path to approve a contract.","operationId":"api_internal_equivalence_review_api_internal_equivalence_review_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/analytics-snapshot":{"get":{"summary":"Api Internal Analytics Snapshot","description":"Attribution Analyst — write today's compact KPI snapshot to metrics_daily\nwith DoD/WoW deltas. The KPI history that lets the fleet (and the owner) steer\non trends; get_monetization_metrics alone has no memory.","operationId":"api_internal_analytics_snapshot_api_internal_analytics_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Api Internal Analytics Snapshot","description":"Attribution Analyst — write today's compact KPI snapshot to metrics_daily\nwith DoD/WoW deltas. The KPI history that lets the fleet (and the owner) steer\non trends; get_monetization_metrics alone has no memory.","operationId":"api_internal_analytics_snapshot_api_internal_analytics_snapshot_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/scoreboard-build":{"post":{"summary":"Api Internal Scoreboard Build","description":"AI-vs-Market Scoreboard — score unscored ledger receipts of resolved markets\nand recompute the public rollup. Deterministic; no LLM in the numbers.","operationId":"api_internal_scoreboard_build_api_internal_scoreboard_build_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/scoreboard":{"get":{"summary":"Api Scoreboard","description":"Public audited AI-vs-market track record (rollup + recent scored receipts).","operationId":"api_scoreboard_api_v1_scoreboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/scoreboard":{"get":{"summary":"Scoreboard Page","description":"Public AI-vs-Market Scoreboard page — the citable, audited track record.","operationId":"scoreboard_page_scoreboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/bet-check":{"get":{"summary":"Bet Check Page","description":"The pre-bet check, for humans — the surface that earns the last click.\n\nRenders only when an event AND a side are given; with an event alone there\nis nothing to price, and guessing a side would put a verdict on screen that\nthe visitor never asked for.","operationId":"bet_check_page_bet_check_get","parameters":[{"name":"event","in":"query","required":false,"schema":{"type":"string","default":"","title":"Event"}},{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"","title":"Side"}},{"name":"odds","in":"query","required":false,"schema":{"type":"string","default":"","title":"Odds"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forecasters":{"get":{"summary":"Forecasters Page","description":"Neutral-scorekeeper landing: how any AI agent joins via MCP + the external\nforecaster leaderboard (ext-* models from the audited rollup).","operationId":"forecasters_page_forecasters_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/research/ai-vs-market":{"get":{"summary":"Research Ai Vs Market","description":"Flagship research piece: the live AI-vs-market experiment, rendered from the\naudited rollup — narrative + tables + downloadable dataset. Updates nightly with\nthe scoreboard build; no LLM at render time.","operationId":"research_ai_vs_market_research_ai_vs_market_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/v1/scoreboard/dataset.csv":{"get":{"summary":"Scoreboard Dataset Csv","description":"Full scored-forecast dataset as CSV (CC BY 4.0) — one row per receipt,\nincluding unscorable ones with their reason. Reproducibility is the product.","operationId":"scoreboard_dataset_csv_api_v1_scoreboard_dataset_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sync-markets":{"post":{"summary":"Api Sync Markets","operationId":"api_sync_markets_api_sync_markets_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pulse":{"get":{"summary":"News Pulse","description":"Breaking news analyzed for prediction market impact.","operationId":"news_pulse_pulse_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/v1/activity":{"get":{"summary":"Activity Feed","description":"Live activity feed — recent votes, insights, news impacts.","operationId":"activity_feed_api_v1_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/activity":{"get":{"summary":"Activity Page","description":"Live activity feed page.","operationId":"activity_page_activity_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/webhook/telegram":{"post":{"summary":"Telegram Webhook","description":"Telegram bot webhook — receives messages and responds with odds.","operationId":"telegram_webhook_webhook_telegram_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/feed.xml":{"get":{"summary":"Rss Feed","description":"RSS feed of active prediction markets — for news readers and aggregators.","operationId":"rss_feed_feed_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/research-desk/feed.xml":{"get":{"summary":"Research Desk Feed","description":"RSS feed for active research theses and recent thesis-change events.","operationId":"research_desk_feed_research_desk_feed_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cli/voxodds":{"get":{"summary":"Cli Download","operationId":"cli_download_cli_voxodds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cli/install.sh":{"get":{"summary":"Cli Install Script","operationId":"cli_install_script_cli_install_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/voxodds2026.txt":{"get":{"summary":"Indexnow Key","operationId":"indexnow_key_voxodds2026_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_newsletter_signup_api_newsletter_post":{"properties":{"email":{"type":"string","title":"Email"},"source":{"type":"string","title":"Source","default":"footer"},"path":{"type":"string","title":"Path","default":""},"insight_id":{"type":"string","title":"Insight Id","default":""},"insight_title":{"type":"string","title":"Insight Title","default":""},"followed_insight_ids":{"type":"string","title":"Followed Insight Ids","default":""},"followed_insight_titles":{"type":"string","title":"Followed Insight Titles","default":""},"followed_market_ids":{"type":"string","title":"Followed Market Ids","default":""},"followed_market_titles":{"type":"string","title":"Followed Market Titles","default":""},"paper_positions":{"type":"string","title":"Paper Positions","default":""},"digest":{"type":"string","title":"Digest","default":"weekly"},"alerts":{"type":"string","title":"Alerts","default":""},"public_portfolio":{"type":"string","title":"Public Portfolio","default":""},"utm_source":{"type":"string","title":"Utm Source","default":""},"utm_medium":{"type":"string","title":"Utm Medium","default":""},"utm_campaign":{"type":"string","title":"Utm Campaign","default":""},"utm_content":{"type":"string","title":"Utm Content","default":""},"utm_term":{"type":"string","title":"Utm Term","default":""},"ref":{"type":"string","title":"Ref","default":""}},"type":"object","required":["email"],"title":"Body_newsletter_signup_api_newsletter_post"},"Body_quick_vote_api_quickvote__market_id__post":{"properties":{"outcome":{"type":"string","title":"Outcome"}},"type":"object","required":["outcome"],"title":"Body_quick_vote_api_quickvote__market_id__post"},"Body_router_alert_signup_api_router_alerts_post":{"properties":{"email":{"type":"string","title":"Email"},"opportunity_id":{"type":"string","title":"Opportunity Id"},"amount_usd":{"type":"number","title":"Amount Usd","default":100.0},"threshold_pct":{"type":"number","title":"Threshold Pct","default":5.0},"path":{"type":"string","title":"Path","default":""}},"type":"object","required":["email","opportunity_id"],"title":"Body_router_alert_signup_api_router_alerts_post"},"Body_set_username_set_username_post":{"properties":{"username":{"type":"string","title":"Username"}},"type":"object","required":["username"],"title":"Body_set_username_set_username_post"},"Body_submit_insight_market__market_id__insight_post":{"properties":{"content":{"type":"string","title":"Content"},"prediction":{"type":"string","title":"Prediction","default":""},"confidence":{"type":"integer","title":"Confidence","default":50}},"type":"object","required":["content"],"title":"Body_submit_insight_market__market_id__insight_post"},"Body_survey_vote_survey__survey_id__vote_post":{"properties":{"option":{"type":"string","title":"Option"},"source_id":{"type":"string","title":"Source Id","default":""},"token":{"type":"string","title":"Token","default":""}},"type":"object","required":["option"],"title":"Body_survey_vote_survey__survey_id__vote_post"},"Body_vote_insight_insight__insight_id__vote_post":{"properties":{"direction":{"type":"string","title":"Direction"}},"type":"object","required":["direction"],"title":"Body_vote_insight_insight__insight_id__vote_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}