{"openapi":"3.1.0","info":{"title":"Tickerio API","description":"Hedge fund-grade stock analysis API. LLM-ready with structured outputs.","version":"1.0.0"},"paths":{"/api/v1/paypal/paypal/activate":{"post":{"tags":["paypal"],"summary":"Activate Subscription","description":"Activate subscription after PayPal approval.","operationId":"activate_subscription_api_v1_paypal_paypal_activate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paypal/paypal/webhook":{"post":{"tags":["paypal"],"summary":"Paypal Webhook","description":"Handle PayPal webhook events.","operationId":"paypal_webhook_api_v1_paypal_paypal_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/paypal/paypal/status/{subscription_id}":{"get":{"tags":["paypal"],"summary":"Subscription Status","description":"Check subscription status.","operationId":"subscription_status_api_v1_paypal_paypal_status__subscription_id__get","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/explore/stocks":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Explore Stocks","description":"Compact Stocks Explore vertical slice for Unified Explore.\n\nInternal/dev only; deterministic small universe; cached provider-layer data; no Premium Data, no crawler, no AI.","operationId":"explore_stocks_api_v2_explore_stocks_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":4,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/explore/forex":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Explore Forex","description":"Compact Forex Explore vertical slice for Unified Explore.\n\nInternal/dev only; uses existing FX contract. No Premium Data, no paid users, no crawler, no AI.","operationId":"explore_forex_api_v2_explore_forex_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/screener/opportunities":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Screener Opportunities","operationId":"screener_opportunities_api_v2_screener_opportunities_get","parameters":[{"name":"asset_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fx":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Fx All","operationId":"fx_all_api_v2_fx_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/fx/major":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Fx Major","operationId":"fx_major_api_v2_fx_major_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/fx/ils":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Fx Ils","operationId":"fx_ils_api_v2_fx_ils_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/fx/{pair}/history":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Fx Pair History","operationId":"fx_pair_history_api_v2_fx__pair__history_get","parameters":[{"name":"pair","in":"path","required":true,"schema":{"type":"string","title":"Pair"}},{"name":"range","in":"query","required":false,"schema":{"type":"string","default":"1M","title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fx/{pair}":{"get":{"tags":["Sprint 17A-Lite"],"summary":"Fx Pair","operationId":"fx_pair_api_v2_fx__pair__get","parameters":[{"name":"pair","in":"path","required":true,"schema":{"type":"string","title":"Pair"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/tracks":{"get":{"summary":"Get Tracks","operationId":"get_tracks_api_v2_education_tracks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/glossary":{"get":{"summary":"Api Glossary Full","description":"Return the full glossary.","operationId":"api_glossary_full_api_v2_education_glossary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/quiz/{track_id}":{"get":{"summary":"Get Quiz","operationId":"get_quiz_api_v2_education_quiz__track_id__get","parameters":[{"name":"track_id","in":"path","required":true,"schema":{"type":"string","title":"Track Id"}},{"name":"index","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/trending/dimensions":{"get":{"summary":"Trending Dimensions","operationId":"trending_dimensions_api_v2_trending_dimensions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/basket/analyze":{"post":{"summary":"Analyze Basket","description":"Analyze a theme basket post. REQUIRES AUTHENTICATION.","operationId":"analyze_basket_api_v2_basket_analyze_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/intelligence/{ticker}":{"get":{"summary":"Portfolio Intelligence","operationId":"portfolio_intelligence_api_v2_portfolio_intelligence__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/user/preferences":{"get":{"summary":"Get Preferences","operationId":"get_preferences_api_v2_user_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/user/alert-types":{"get":{"summary":"Get Alert Types","operationId":"get_alert_types_api_v2_user_alert_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/theme-analysis":{"post":{"summary":"Create Theme Analysis","description":"Create async theme analysis job. REQUIRES AUTHENTICATION.","operationId":"create_theme_analysis_api_v2_theme_analysis_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/theme-analysis/{job_id}":{"get":{"summary":"Get Theme Analysis Status","description":"Get job status. REQUIRES AUTHENTICATION + OWNERSHIP.","operationId":"get_theme_analysis_status_api_v2_theme_analysis__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Theme Analysis","description":"Cancel or delete job. REQUIRES AUTHENTICATION + OWNERSHIP.","operationId":"delete_theme_analysis_api_v2_theme_analysis__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/theme-analysis/{job_id}/result":{"get":{"summary":"Get Theme Analysis Result","description":"Get job result. REQUIRES AUTHENTICATION + OWNERSHIP.","operationId":"get_theme_analysis_result_api_v2_theme_analysis__job_id__result_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-map":{"get":{"summary":"Api Market Map","description":"Public endpoint returning a full cached S&P 500 market map grouped by sector.\n\nThe base universe is cached and public. Personalized portfolio/watchlist overlay\nis added only when a valid session is already present; guests do not receive 401 noise.","operationId":"api_market_map_api_v2_market_map_get","parameters":[{"name":"universe","in":"query","required":false,"schema":{"type":"string","default":"sp500","title":"Universe"}},{"name":"metric","in":"query","required":false,"schema":{"type":"string","default":"market_cap","title":"Metric"}},{"name":"color","in":"query","required":false,"schema":{"type":"string","default":"change_percent","title":"Color"}},{"name":"sector","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Sector"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":600,"minimum":1,"default":500,"title":"Limit"}},{"name":"include_portfolio","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Portfolio"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/analyze":{"post":{"summary":"Analyze Portfolio","operationId":"analyze_portfolio_api_v2_portfolio_analyze_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/fit":{"post":{"summary":"Portfolio Fit","operationId":"portfolio_fit_api_v2_portfolio_fit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/options/{ticker}/expirations":{"get":{"tags":["Options V2"],"summary":"Get Options Expirations","description":"Return all available options expiration dates for a ticker.\n\nEach expiration includes: date, dte, type (weekly/monthly/quarterly/leaps/other),\naggregate call/put volume, OI, aggregate IV, expected move, liquidity grade,\nmax pain, and warnings.","operationId":"get_options_expirations_api_v2_options__ticker__expirations_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/options/{ticker}/chain":{"get":{"tags":["Options V2"],"summary":"Get Options Chain","description":"Return the options chain for a given ticker and expiration date.\n\nReturns call and put arrays with full contract records including Greeks,\nmoneyness, IV state, and liquidity metrics.","operationId":"get_options_chain_api_v2_options__ticker__chain_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"expiration","in":"query","required":true,"schema":{"type":"string","description":"Expiration date in YYYY-MM-DD format","title":"Expiration"},"description":"Expiration date in YYYY-MM-DD format"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/simulations":{"post":{"summary":"Store Simulation Endpoint","description":"Store a new simulation record. Returns the persisted snapshot as-is.","operationId":"store_simulation_endpoint_api_v2_simulations_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationStoreRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Simulations Endpoint","description":"List simulations, optionally filtered by user_id and/or ticker.\nReturns persisted snapshots as-is, ordered by created_at descending.","operationId":"list_simulations_endpoint_api_v2_simulations_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by user ID","title":"User Id"},"description":"Filter by user ID"},{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ticker symbol","title":"Ticker"},"description":"Filter by ticker symbol"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRecord"},"title":"Response List Simulations Endpoint Api V2 Simulations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/simulations/advanced/monte-carlo":{"get":{"summary":"Monte Carlo Simulation Endpoint","description":"Monte Carlo simulation — Pro plan or higher (advanced_simulations policy).\n\nDeterministic engine: runs a bounded set of GBM-style paths seeded with a\nfixed RNG so results are reproducible (Truth Gate: zero random jitter).","operationId":"monte_carlo_simulation_endpoint_api_v2_simulations_advanced_monte_carlo_get","parameters":[{"name":"ticker","in":"query","required":true,"schema":{"type":"string","description":"Stock ticker","title":"Ticker"},"description":"Stock ticker"},{"name":"amount","in":"query","required":false,"schema":{"type":"number","exclusiveMinimum":0,"default":1000.0,"title":"Amount"}},{"name":"horizon_months","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":12,"title":"Horizon Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/simulations/{simulation_id}":{"get":{"summary":"Get Simulation Endpoint","description":"Retrieve a single simulation by its ID. Returns persisted snapshot as-is.","operationId":"get_simulation_endpoint_api_v2_simulations__simulation_id__get","parameters":[{"name":"simulation_id","in":"path","required":true,"schema":{"type":"string","title":"Simulation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/report-runs":{"post":{"summary":"Store Report Endpoint","operationId":"store_report_endpoint_api_v2_report_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRunStoreRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRunRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Reports Endpoint","operationId":"list_reports_endpoint_api_v2_report_runs_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportRunRecord"},"title":"Response List Reports Endpoint Api V2 Report Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/report-runs/{run_id}":{"get":{"summary":"Get Report Endpoint","operationId":"get_report_endpoint_api_v2_report_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRunRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/continuity/telegram-link":{"post":{"tags":["Continuity"],"summary":"Create Telegram Link","operationId":"create_telegram_link_api_v2_continuity_telegram_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContinuityLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/continuity/consume/{token}":{"get":{"tags":["Continuity"],"summary":"Consume Telegram Link","operationId":"consume_telegram_link_api_v2_continuity_consume__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ops/live":{"get":{"tags":["Operations"],"summary":"Live","operationId":"live_api_v2_ops_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/ops/ready":{"get":{"tags":["Operations"],"summary":"Ready","operationId":"ready_api_v2_ops_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/ops/status":{"get":{"tags":["Operations"],"summary":"Operational Status","operationId":"operational_status_api_v2_ops_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/ops/metrics":{"get":{"tags":["Operations"],"summary":"Operational Metrics","description":"Prometheus-compatible metrics protected by a scrape token or admin session.","operationId":"operational_metrics_api_v2_ops_metrics_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/v2/report/v3/{ticker}":{"get":{"tags":["Report V3"],"summary":"Report V3 Json Api","description":"Canonical Report V3 JSON API (Plus plan or higher).\n\nReturns the full 21-section report payload with ticker metadata.","operationId":"report_v3_json_api_api_v2_report_v3__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9.\\-]{0,9}$","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/report/v3/":{"get":{"tags":["Report V3"],"summary":"Report V3 Json Api Empty","description":"Empty ticker → 422 (FastAPI validation error contract).","operationId":"report_v3_json_api_empty_api_v2_report_v3__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/report/classic/{ticker}":{"get":{"tags":["Report V3"],"summary":"Classic Report Json Api","description":"Classic report JSON API (backward-compatible surface).","operationId":"classic_report_json_api_api_v2_report_classic__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9.\\-]{0,9}$","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/report/v3/{ticker}":{"get":{"tags":["Report V3"],"summary":"Report V3 Deep Link","description":"Deep links from the frontend redirect to the canonical JSON API.","operationId":"report_v3_deep_link_report_v3__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/report/v3/{rest}":{"get":{"tags":["Report V3"],"summary":"Report V3 Json Api Catchall","description":"Any unmatched path under /api/v2/report/v3/ → 422.","operationId":"report_v3_json_api_catchall_api_v2_report_v3__rest__get","parameters":[{"name":"rest","in":"path","required":true,"schema":{"type":"string","title":"Rest"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/report/{rest}":{"get":{"tags":["Report V3"],"summary":"Report V2 Catchall","description":"Any unmatched path under /api/v2/report/ → 422.","operationId":"report_v2_catchall_api_v2_report__rest__get","parameters":[{"name":"rest","in":"path","required":true,"schema":{"type":"string","title":"Rest"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/availability":{"get":{"tags":["SEC EDGAR"],"summary":"Sec Availability","operationId":"sec_availability_api_v2_sec_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/sec/profile/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec Profile","operationId":"sec_profile_api_v2_sec_profile__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/filings/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec Filings","operationId":"sec_filings_api_v2_sec_filings__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/insider/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec Insider","operationId":"sec_insider_api_v2_sec_insider__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/13f/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec 13F","operationId":"sec_13f_api_v2_sec_13f__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/10k/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec 10K","operationId":"sec_10k_api_v2_sec_10k__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/10q/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec 10Q","operationId":"sec_10q_api_v2_sec_10q__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sec/insight/{ticker}":{"get":{"tags":["SEC EDGAR"],"summary":"Sec Insight","description":"Unified SEC enrichment — each section fails independently.","operationId":"sec_insight_api_v2_sec_insight__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/webhook":{"post":{"summary":"Stripe Webhook","description":"[⚠️ LEGACY] Stripe webhook endpoint — kept for backwards compatibility only.\nStripe is not used. Tickerio uses PayPal.me manual payment flow.\nReturns 200 to avoid nginx errors from old integrations.","operationId":"stripe_webhook_api_v1_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payments/plans":{"get":{"summary":"Get Plans","description":"Get available subscription plans.","operationId":"get_plans_api_v1_payments_plans_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"he","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payments/checkout":{"post":{"summary":"Create Payment Checkout","description":"Create checkout session with active provider.","operationId":"create_payment_checkout_api_v1_payments_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payments/webhook/{provider}":{"post":{"summary":"Payment Webhook","description":"Unified webhook endpoint for any payment provider.","operationId":"payment_webhook_api_v1_payments_webhook__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payments/status":{"get":{"summary":"Payment Provider Status","description":"Check if payment provider is configured.","operationId":"payment_provider_status_api_v1_payments_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payments/cancel":{"post":{"summary":"Cancel Subscription","description":"Cancel a subscription for the authenticated user only.","operationId":"cancel_subscription_api_v1_payments_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payments/portal/{customer_id}":{"get":{"summary":"Customer Portal","description":"Get customer portal URL for the authenticated user subscription management.","operationId":"customer_portal_api_v1_payments_portal__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify":{"get":{"summary":"Auth Verify","description":"Verify signed URL params and return a session hash for subsequent calls.\nEach signed URL can only be used ONCE — prevents link sharing.","operationId":"auth_verify_api_v1_auth_verify_get","parameters":[{"name":"tid","in":"query","required":true,"schema":{"type":"string","title":"Tid"}},{"name":"ts","in":"query","required":true,"schema":{"type":"string","title":"Ts"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"summary":"Auth Me","description":"Return current user info if authenticated.","operationId":"auth_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/auth/me":{"get":{"summary":"Api V2 Auth Me","description":"Return current user info in SPA-friendly format.","operationId":"api_v2_auth_me_api_v2_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/invite/{token}":{"get":{"summary":"Auth Invite","description":"Resolve an invite token → create session → set cookie → return clean redirect info.\n\nReturns session cookie config for the frontend to apply via redirect.\nThe frontend should redirect to /dash/ (no query params) after receiving the cookie.\n\nFlow:\n  GET /api/v1/auth/invite/{token}\n  → validate invite\n  → create session row\n  → set HttpOnly cookie\n  → redirect to /dash/  (or return cookie for SPA to apply)","operationId":"auth_invite_api_v1_auth_invite__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invite/{token}/info":{"get":{"summary":"Auth Invite Info","description":"Get basic info about an invite token without consuming it.","operationId":"auth_invite_info_api_v1_auth_invite__token__info_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["Auth"],"summary":"Web Register","description":"Register a new web user with email + password.","operationId":"web_register_api_v1_auth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Auth"],"summary":"Web Login","description":"Login with email + password, sets secure session cookie.","operationId":"web_login_api_v1_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/health":{"get":{"summary":"Health","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/analyze/{ticker}":{"get":{"summary":"Analyze Stock","description":"Full hedge-fund-style analysis. Returns markdown + structured JSON.","operationId":"analyze_stock_api_v1_analyze__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"he","title":"Lang"}},{"name":"user_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analyze/{ticker}/quick":{"get":{"summary":"Quick Analysis","description":"Quick summary — price, change, RSI, recommendation.\nEnforces plan limits on quick_analysis.","operationId":"quick_analysis_api_v1_analyze__ticker__quick_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ai-report/{ticker}":{"get":{"summary":"Ai Report V2","description":"Full AI Report v2 — structured, sectioned, complete.\nAggregates all available data sources into one report.\nNo buy/sell. Missing data is explicit.\nNOTE: Sync def — FastAPI runs sync handlers in a thread pool,\nkeeping the async event loop free for /health and other endpoints.","operationId":"ai_report_v2_api_v2_ai_report__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/research/institutional/{ticker}":{"get":{"tags":["Institutional Research"],"summary":"Institutional Research V2","description":"Institutional Research Engine v1 — Phase 1 + Phase 2 Decision Modules.\n\nPhase 1: Full research contract (backward compatible, default).\nPhase 2: Decision support modules via ?sections= parameter.\n\nInternal/dev only — no buy/sell, no Premium Data, no paid users, no broad beta.","operationId":"institutional_research_v2_api_v2_research_institutional__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"sections","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated Phase 2 sections: adapter,debate,normalization,scenarios,catalysts,risks,capital_allocation,classification","title":"Sections"},"description":"Comma-separated Phase 2 sections: adapter,debate,normalization,scenarios,catalysts,risks,capital_allocation,classification"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/intelligence/{ticker}":{"get":{"summary":"Intelligence Canonical Endpoint","description":"Canonical Intelligence response. Full mode is enforced server-side.","operationId":"intelligence_canonical_endpoint_api_v2_intelligence__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(preview|full)$","default":"preview","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/intelligence/{ticker}/setup-score":{"get":{"summary":"Setup Score Endpoint","description":"Setup Score — measures the overall investment setup.","operationId":"setup_score_endpoint_api_v2_intelligence__ticker__setup_score_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/intelligence/{ticker}/verdict":{"get":{"summary":"Verdict Endpoint","description":"Stock Verdict — deterministic, rule-based judgment.","operationId":"verdict_endpoint_api_v2_intelligence__ticker__verdict_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/intelligence/{ticker}/conflicts":{"get":{"summary":"Conflicts Endpoint","description":"Explicit conflicting signals from the central rules engine.","operationId":"conflicts_endpoint_api_v2_intelligence__ticker__conflicts_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/intelligence/{ticker}/data-quality":{"get":{"summary":"Data Quality Endpoint","description":"Canonical Intelligence data quality object.","operationId":"data_quality_endpoint_api_v2_intelligence__ticker__data_quality_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/full-report/{ticker}":{"get":{"summary":"Full Report V2","description":"Alias for /api/v2/ai-report/{ticker} — deterministic, rule-based.\nEnforces plan limits on full_reports.","operationId":"full_report_v2_api_v2_full_report__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-map/fixture/{fixture_name}":{"get":{"tags":["Market Map"],"summary":"Market Map V2 Fixture","description":"Market Map V2 — deterministic test fixture.","operationId":"market_map_v2_fixture_api_v2_market_map_fixture__fixture_name__get","parameters":[{"name":"fixture_name","in":"path","required":true,"schema":{"type":"string","title":"Fixture Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-map/validate":{"get":{"summary":"Market Map V2 Validate","description":"Market Map V2 — run validation tests and return result.","operationId":"market_map_v2_validate_api_v2_market_map_validate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/orchestrator/context":{"get":{"summary":"Orchestrator Context","description":"Sprint 16 Data Intelligence Orchestrator context endpoint.\n\nUser-specific contexts require auth. Generic stock/ETF/sector/lesson contexts\nare allowed for guests without private personalization.","operationId":"orchestrator_context_api_v2_orchestrator_context_get","parameters":[{"name":"entity_type","in":"query","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/community/forecast/{ticker}/summary":{"get":{"summary":"Community Forecast Summary","description":"Public community forecast aggregation for a ticker.","operationId":"community_forecast_summary_api_v2_community_forecast__ticker__summary_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/community/forecast/{ticker}":{"get":{"summary":"Community Forecast List","description":"Public list of recent community forecasts for a ticker.","operationId":"community_forecast_list_api_v2_community_forecast__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/community/forecast":{"post":{"summary":"Community Forecast Submit","description":"Submit a community forecast.\n\nLogged-in users are stored as members; guests are stored by a short one-way IP/UA hash.\nNo Telegram IDs, session hashes, or private user data are exposed.","operationId":"community_forecast_submit_api_v2_community_forecast_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityForecastCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/account/session":{"get":{"summary":"Account Session","description":"Return current session info with capabilities based on user role.","operationId":"account_session_api_v2_account_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/logout":{"post":{"summary":"Account Logout","description":"Invalidate current session and clear auth cookies.","operationId":"account_logout_api_v2_account_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/logout-all":{"post":{"summary":"Account Logout All","description":"Invalidate ALL sessions for the current user (every device).","operationId":"account_logout_all_api_v2_account_logout_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/sessions":{"get":{"summary":"Account Sessions","description":"List active sessions for the current user.","operationId":"account_sessions_api_v2_account_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/auth/guest":{"post":{"summary":"Api V2 Create Guest","description":"Create/resolve a guest identity so anonymous watchlist/history can later migrate.","operationId":"api_v2_create_guest_api_v2_auth_guest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/identities":{"get":{"summary":"Api V2 Account Identities","description":"Return masked linked identities for the authenticated user.","operationId":"api_v2_account_identities_api_v2_account_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/telegram/link-code":{"post":{"summary":"Account Telegram Link Code","description":"Generate a one-time link code for Telegram account linking.\nRequires authentication. Returns a code + deeplink valid for 10 minutes.","operationId":"account_telegram_link_code_api_v2_account_telegram_link_code_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/telegram/disconnect":{"post":{"summary":"Account Telegram Disconnect","description":"Unlink the current user's Telegram account.\nRequires authentication.","operationId":"account_telegram_disconnect_api_v2_account_telegram_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/onboarding":{"get":{"summary":"Account Onboarding Get","description":"Get current user's onboarding progress.","operationId":"account_onboarding_get_api_v2_account_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Account Onboarding Update","description":"Update onboarding progress. Accepts: onboarding_step, onboarding_completed, interests, currency, lang.","operationId":"account_onboarding_update_api_v2_account_onboarding_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/account/settings":{"get":{"summary":"Account Settings Get","description":"Get current user's settings.","operationId":"account_settings_get_api_v2_account_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Account Settings Update","description":"Update user settings. Merges provided fields only.\nRequires authentication.","operationId":"account_settings_update_api_v2_account_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/user/plan":{"get":{"summary":"User Plan Info","description":"Get current user's plan info, feature limits, and usage.","operationId":"user_plan_info_api_v2_user_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/account/export":{"get":{"summary":"Account Export","description":"Export all personal data for the authenticated user.\nReturns profile, settings, portfolio, watchlist, game progress, and Telegram link status.\nExcludes: session hashes, invite tokens, API keys, other users' info, audit logs.","operationId":"account_export_api_v2_account_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/investment-simulation":{"post":{"summary":"Investment Simulation","description":"Investment simulator — models ROI across multiple price targets.\n\nInput:\n- ticker (str, required)\n- investment_amount (float, > 0, required)\n- investment_currency (str, one of USD/ILS/EUR, default USD)\n- allow_fractional_shares (bool, default true)\n- scenario (str: analyst_low, analyst_mean, analyst_high, dcf_bear, dcf_base, dcf_bull, custom, default analyst_mean)\n- custom_target_price (float or null)\n- fee_amount (float, default 0)\n- tax_rate_pct (float or null)\n\nOutput:\n- ticker, current_price\n- scenario details\n- shares, pnl, return pct\n- scenario_table comparing all scenarios","operationId":"investment_simulation_api_v2_portfolio_investment_simulation_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/compare":{"get":{"summary":"Compare Stocks","description":"Compare multiple stocks side by side.","operationId":"compare_stocks_api_v1_compare_get","parameters":[{"name":"tickers","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated: AAPL,TSLA,NVDA","title":"Tickers"},"description":"Comma-separated: AAPL,TSLA,NVDA"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/quote/{ticker}":{"get":{"summary":"Get Quote","description":"Real-time quote data.","operationId":"get_quote_api_v1_quote__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/technicals/{ticker}":{"get":{"summary":"Get Technicals","description":"Technical indicators — RSI, MACD, Bollinger, MAs.","operationId":"get_technicals_api_v1_technicals__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chart/{ticker}":{"get":{"summary":"Get Chart","description":"Generate price chart as PNG. Returns image file.","operationId":"get_chart_api_v1_chart__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"1y","title":"Period"}},{"name":"indicators","in":"query","required":false,"schema":{"type":"string","default":"ma20,ma50,ma100,ma150,ma200","title":"Indicators"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/watchlist/{user_id}":{"get":{"summary":"Api Get Watchlist","operationId":"api_get_watchlist_api_v1_watchlist__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Api Add Watchlist","operationId":"api_add_watchlist_api_v1_watchlist__user_id__post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/watchlist/{user_id}/{ticker}":{"delete":{"summary":"Api Remove Watchlist","operationId":"api_remove_watchlist_api_v1_watchlist__user_id___ticker__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts":{"post":{"summary":"Api Create Alert","operationId":"api_create_alert_api_v1_alerts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/{user_id}":{"get":{"summary":"Api Get Alerts","operationId":"api_get_alerts_api_v1_alerts__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/alerts":{"get":{"summary":"Api V2 Get Alerts","description":"Session-based alerts for the authenticated user.","operationId":"api_v2_get_alerts_api_v2_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"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/alerts/{user_id}/{alert_id}":{"delete":{"summary":"Api Delete Alert","operationId":"api_delete_alert_api_v1_alerts__user_id___alert_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portfolio/{user_id}":{"get":{"summary":"Api Get Portfolio","operationId":"api_get_portfolio_api_v1_portfolio__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio":{"get":{"summary":"Api V2 Portfolio Overview","description":"Return enriched portfolio for the authenticated user: value, cost, P/L, weights.","operationId":"api_v2_portfolio_overview_api_v2_portfolio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/holding":{"post":{"summary":"Api V2 Add Holding","description":"Add or replace a holding for the current session user.","operationId":"api_v2_add_holding_api_v2_portfolio_holding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldingCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/holding/{ticker}":{"put":{"summary":"Api V2 Update Holding","description":"Update shares and/or average cost for one holding owned by the current session user.","operationId":"api_v2_update_holding_api_v2_portfolio_holding__ticker__put","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api V2 Delete Holding","description":"Delete one holding owned by the current session user.","operationId":"api_v2_delete_holding_api_v2_portfolio_holding__ticker__delete","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/watchlist":{"get":{"summary":"Api V2 Watchlist","description":"Return watchlist for the authenticated user.","operationId":"api_v2_watchlist_api_v2_watchlist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Api V2 Add Watchlist","description":"Add an asset to the authenticated user's watchlist.\n\nThe owner is always derived from the session; request bodies cannot select\nanother account.","operationId":"api_v2_add_watchlist_api_v2_watchlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistAdd"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/watchlist/{ticker}":{"delete":{"summary":"Api V2 Remove Watchlist","description":"Remove an asset owned by the current session from its watchlist.","operationId":"api_v2_remove_watchlist_api_v2_watchlist__ticker__delete","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/{user_id}/export.xlsx":{"get":{"summary":"Api Export Portfolio Xlsx","description":"Export portfolio as an Excel (.xlsx) file.","operationId":"api_export_portfolio_xlsx_api_v2_portfolio__user_id__export_xlsx_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/{user_id}/import/preview":{"post":{"summary":"Api Import Portfolio Preview","description":"Upload an Excel file and preview the import changes (upsert or replace).","operationId":"api_import_portfolio_preview_api_v2_portfolio__user_id__import_preview_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_import_portfolio_preview_api_v2_portfolio__user_id__import_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/{user_id}/import/confirm":{"post":{"summary":"Api Import Portfolio Confirm","description":"Confirm an import previously previewed via /import/preview.","operationId":"api_import_portfolio_confirm_api_v2_portfolio__user_id__import_confirm_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/portfolio/export.xlsx":{"get":{"summary":"Api Admin Export Portfolio Xlsx","description":"Admin-only: export any user's portfolio as an Excel file.","operationId":"api_admin_export_portfolio_xlsx_api_v2_admin_users__user_id__portfolio_export_xlsx_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/export.xlsx":{"get":{"summary":"Api Owner Export Portfolio Xlsx","description":"Export the authenticated user's portfolio as Excel. Resolves owner from auth.","operationId":"api_owner_export_portfolio_xlsx_api_v2_portfolio_export_xlsx_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/import/preview":{"post":{"summary":"Api Owner Import Portfolio Preview","description":"Upload Excel and preview import. Resolves owner from auth.","operationId":"api_owner_import_portfolio_preview_api_v2_portfolio_import_preview_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_owner_import_portfolio_preview_api_v2_portfolio_import_preview_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/v2/portfolio/import/confirm":{"post":{"summary":"Api Owner Import Portfolio Confirm","description":"Confirm an import previously previewed. Resolves owner from auth.","operationId":"api_owner_import_portfolio_confirm_api_v2_portfolio_import_confirm_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/daily-brief":{"get":{"tags":["Daily Brief"],"summary":"Api Get Daily Brief","description":"Get today's daily brief. Generates if missing.","operationId":"api_get_daily_brief_api_v2_daily_brief_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/daily-brief/generate":{"post":{"tags":["Daily Brief"],"summary":"Api Generate Daily Brief","description":"Force regenerate today's daily brief.","operationId":"api_generate_daily_brief_api_v2_daily_brief_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/daily-brief/history":{"get":{"tags":["Daily Brief"],"summary":"Api Get Daily Brief History","description":"Get recent daily briefs.","operationId":"api_get_daily_brief_history_api_v2_daily_brief_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/data-sources":{"get":{"tags":["Data Sources"],"summary":"Api Get Data Sources","description":"List all data sources from the Source Registry.\nPublic endpoint — shows generic source metadata only.\nNo secrets, no user data, no private symbols.","operationId":"api_get_data_sources_api_v2_data_sources_get","parameters":[{"name":"source_type","in":"query","required":false,"schema":{"type":"string","title":"Source Type"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/data-sources/health":{"get":{"tags":["Data Sources"],"summary":"Api Get Data Sources Health","description":"Get data source health summary.\nPublic — shows only generic source status, no secrets, no user data.","operationId":"api_get_data_sources_health_api_v2_data_sources_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/data-sources/refresh-policy":{"get":{"tags":["Data Sources"],"summary":"Api Get Refresh Policy","description":"Get the refresh/update policy for all data sources.\n\nReturns real TTLs from provider code, not invented values.\nPublic endpoint — no auth required.","operationId":"api_get_refresh_policy_api_v2_data_sources_refresh_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/data/quote/{symbol}":{"get":{"tags":["Data Sources"],"summary":"Api Get Data Quote","description":"Get a current market quote for any symbol.\nReturns price, change, change_pct, currency, source, last_updated.\nPublic — no auth required for basic quotes.","operationId":"api_get_data_quote_api_v2_data_quote__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/data/macro/snapshot":{"get":{"tags":["Data Sources"],"summary":"Api Get Macro Snapshot","description":"Get macro snapshot: rates, yields, inflation, unemployment.\nUses FRED if key available, marks unavailable otherwise.\nPublic — generic macro data.","operationId":"api_get_macro_snapshot_api_v2_data_macro_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/data/fx/{pair}":{"get":{"tags":["Data Sources"],"summary":"Api Get Fx Rate","description":"Get FX rate for a currency pair (e.g. USDILS, EURILS).\nOfficial Bank of Israel first, yfinance fallback labeled.\nPublic endpoint.","operationId":"api_get_fx_rate_api_v2_data_fx__pair__get","parameters":[{"name":"pair","in":"path","required":true,"schema":{"type":"string","title":"Pair"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/data/news":{"get":{"tags":["Data Sources"],"summary":"Api Get Data News","description":"Get market or asset-specific news.\nPublic endpoint — cached news with source labels.","operationId":"api_get_data_news_api_v2_data_news_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/data/etf/{symbol}":{"get":{"tags":["Data Sources"],"summary":"Api Get Etf Info","description":"Get ETF metadata for a known ETF symbol.\nPublic endpoint — static curated data, not real-time.\nSupported: VOO, SPY, QQQ, CSPX, VUAA, VWRA, IWDA, SCHD.","operationId":"api_get_etf_info_api_v2_data_etf__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/doctor":{"get":{"tags":["Portfolio Doctor"],"summary":"Api Get Portfolio Doctor","description":"Get portfolio health analysis.\nAuth required. Returns diagnostic analysis only, no buy/sell advice.","operationId":"api_get_portfolio_doctor_api_v2_portfolio_doctor_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/doctor/refresh":{"post":{"tags":["Portfolio Doctor"],"summary":"Api Refresh Portfolio Doctor","description":"Force refresh portfolio health analysis.\nIdentical to GET but explicitly regenerates with fresh data.","operationId":"api_refresh_portfolio_doctor_api_v2_portfolio_doctor_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/market-clock":{"get":{"summary":"Market Clock","description":"Get market clock for US and IL markets.\nPublic endpoint — no auth required.\nReturns trading session status, next event countdown, and time conversions.\nCached internally (30s TTL).","operationId":"market_clock_api_v2_market_clock_get","parameters":[{"name":"timezone","in":"query","required":false,"schema":{"type":"string","default":"Asia/Jerusalem","title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools":{"get":{"summary":"List Tools","description":"List all available tools in OpenAI function-calling format.","operationId":"list_tools_api_v1_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/search":{"get":{"tags":["Registry"],"summary":"Search Companies","description":"Search companies by name or ticker. Returns top 10 matches with sector info.","operationId":"search_companies_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Company name or ticker fragment","title":"Q"},"description":"Company name or ticker fragment"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/{ticker}":{"get":{"tags":["Registry"],"summary":"Registry Lookup","description":"Get company info + sector + analysis config for a ticker.","operationId":"registry_lookup_api_v1_registry__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sectors":{"get":{"tags":["Registry"],"summary":"Sectors Summary","description":"Get sector breakdown: count, top tickers, analysis config.","operationId":"sectors_summary_api_v1_sectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/israel":{"get":{"tags":["Israel Market"],"summary":"Israel Market","description":"Get Israeli stocks data: top IL tickers across sectors with live quotes.","operationId":"israel_market_api_v1_israel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/treemap":{"get":{"tags":["Market Map"],"summary":"Treemap Data","description":"Get treemap data: all stocks with market cap + change%, grouped by sector.","operationId":"treemap_data_api_v1_treemap_get","parameters":[{"name":"include_israel","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Israel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sp500":{"get":{"tags":["Registry"],"summary":"Sp500 List","description":"Get current S&P 500 constituents sorted by market cap.","operationId":"sp500_list_api_v1_sp500_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/registry/refresh":{"post":{"tags":["Registry"],"summary":"Refresh Registry","description":"Force refresh ticker registry from GitHub (daily data).","operationId":"refresh_registry_api_v1_registry_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/scanlist":{"post":{"tags":["Analysis"],"summary":"Scanlist Endpoint","description":"Batch analyze a list of tickers — returns per-ticker GEMS + portfolio summary.","operationId":"scanlist_endpoint_api_v1_scanlist_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Request Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gems/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Gems","description":"GEMS score breakdown for a ticker.","operationId":"api_gems_api_v1_gems__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flags/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Flags","description":"Red flags analysis for a ticker.","operationId":"api_flags_api_v1_flags__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deep/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Deep","description":"Deep narrative analysis (מניה ביום style).","operationId":"api_deep_api_v1_deep__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/screener":{"get":{"tags":["Analysis"],"summary":"Screener Endpoint","description":"First-class public screener endpoint with honest status/data quality.","operationId":"screener_endpoint_api_v2_screener_get","parameters":[{"name":"preset","in":"query","required":false,"schema":{"type":"string","description":"Screener preset/filter label","default":"default","title":"Preset"},"description":"Screener preset/filter label"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":2,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["System"],"summary":"Health Check","description":"Health check endpoint for monitoring.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/market/overview":{"get":{"tags":["Dashboard"],"summary":"Api Market Overview","description":"Market brief — sector performance, indices, movers.","operationId":"api_market_overview_api_v1_market_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/market/leaders":{"get":{"tags":["Dashboard"],"summary":"Api Market Leaders","description":"Top market movers / leaders.","operationId":"api_market_leaders_api_v1_market_leaders_get","parameters":[{"name":"sector","in":"query","required":false,"schema":{"type":"string","title":"Sector"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fibonacci/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Fibonacci","description":"Fibonacci levels + Support/Resistance for a ticker.","operationId":"api_fibonacci_api_v1_fibonacci__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"6mo","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signals/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Signals","description":"Trading signals + current technical indicators for a ticker.","operationId":"api_signals_api_v1_signals__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/news/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api News","description":"Stock news for a ticker.","operationId":"api_news_api_v1_news__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"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/market/news":{"get":{"tags":["Dashboard"],"summary":"Api Market News","description":"General market news from Finviz + RSS feeds.","operationId":"api_market_news_api_v1_market_news_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":15,"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/predictions/{user_id}":{"get":{"tags":["Dashboard"],"summary":"Api Predictions","description":"User predictions + accuracy stats.","operationId":"api_predictions_api_v1_predictions__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/backtest":{"post":{"tags":["Dashboard"],"summary":"Api Backtest","description":"Run a backtest strategy.","operationId":"api_backtest_api_v1_backtest_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compound":{"get":{"tags":["Dashboard"],"summary":"Api Compound","description":"Compound interest calculator.","operationId":"api_compound_api_v1_compound_get","parameters":[{"name":"initial","in":"query","required":false,"schema":{"type":"number","default":10000,"title":"Initial"}},{"name":"monthly","in":"query","required":false,"schema":{"type":"number","default":500,"title":"Monthly"}},{"name":"rate","in":"query","required":false,"schema":{"type":"number","default":8.0,"title":"Rate"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Years"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crypto/quote/{symbol}":{"get":{"tags":["Crypto"],"summary":"Crypto Quote","description":"Get real-time crypto quote. Supports shorthand (BTC, SOL) or full symbol (BTC-USD).","operationId":"crypto_quote_api_v1_crypto_quote__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crypto/portfolio":{"get":{"tags":["Crypto"],"summary":"Crypto Portfolio","description":"Calculate crypto portfolio value.\nQuery params: holdings=BTC:0.004383,SOL:0.25492,ETH:1.5\nReturns per-coin value + total portfolio value in USD.","operationId":"crypto_portfolio_api_v1_crypto_portfolio_get","parameters":[{"name":"holdings","in":"query","required":false,"schema":{"type":"string","default":"","title":"Holdings"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crypto/list":{"get":{"tags":["Crypto"],"summary":"Crypto List","description":"List all supported crypto shorthand symbols.","operationId":"crypto_list_api_v1_crypto_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/resolve/{query}":{"get":{"tags":["Dashboard"],"summary":"Resolve Ticker","description":"Resolve any query to a valid Yahoo Finance ticker.\nSupports: US tickers (AAPL), Israeli numbers (585018),\nIsraeli .TA (ICL.TA), crypto (BTC), company names (apple).","operationId":"resolve_ticker_api_v1_resolve__query__get","parameters":[{"name":"query","in":"path","required":true,"schema":{"type":"string","title":"Query"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/whatif/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Whatif","description":"What-if calculator: how much would X$ invested on date Y be worth today?","operationId":"api_whatif_api_v1_whatif__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"amount","in":"query","required":false,"schema":{"type":"number","default":10000,"title":"Amount"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"2024-01-01","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/portfolio/{user_id}/add":{"post":{"tags":["Portfolio"],"summary":"Api Add Holding","description":"Add a holding to portfolio.","operationId":"api_add_holding_api_v1_portfolio__user_id__add_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Holding"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portfolio/{user_id}/remove":{"delete":{"tags":["Portfolio"],"summary":"Api Remove Holding","description":"Remove a holding from portfolio.\n\nAccepts ticker from query param or JSON body (for frontend compatibility).","operationId":"api_remove_holding_api_v1_portfolio__user_id__remove_delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"ticker","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/personas":{"get":{"tags":["Dashboard"],"summary":"Api Personas","description":"List all investment personas.","operationId":"api_personas_api_v1_personas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/personas/{slug}/opinion/{ticker}":{"get":{"tags":["Dashboard"],"summary":"Api Persona Opinion","description":"Get a persona's opinion on a ticker.","operationId":"api_persona_opinion_api_v1_personas__slug__opinion__ticker__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analyze-post":{"post":{"tags":["Dashboard"],"summary":"Api Analyze Post","description":"Extract tickers from a social media post and analyze them.","operationId":"api_analyze_post_api_v1_analyze_post_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/web-register":{"post":{"tags":["Auth"],"summary":"Api Web Register","description":"Register a web-only dashboard account (no Telegram needed).","operationId":"api_web_register_api_v1_web_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/web-login":{"post":{"tags":["Auth"],"summary":"Api Web Login","description":"Login to web-only dashboard account.\nReturns a redirect to /dash/ with HttpOnly session cookie.","operationId":"api_web_login_api_v1_web_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/plans":{"get":{"tags":["Admin"],"summary":"Api Admin List Plans","description":"List all plans with labels, limits, and pricing info — admin only.","operationId":"api_admin_list_plans_api_v1_admin_plans_get","parameters":[{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/user/{target_id}/plan":{"post":{"tags":["Admin"],"summary":"Api Admin Set User Plan","description":"[Admin] Change a user's plan. Body: {\"plan\": \"pro\"}.","operationId":"api_admin_set_user_plan_api_v1_admin_user__target_id__plan_post","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/user/{target_id}/usage":{"get":{"tags":["Admin"],"summary":"Api Admin User Usage","description":"Get a specific user's usage stats — admin only.","operationId":"api_admin_user_usage_api_v1_admin_user__target_id__usage_get","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/usage":{"get":{"tags":["Admin"],"summary":"Api Admin Aggregate Usage","description":"Get aggregate usage stats across all users — admin only.","operationId":"api_admin_aggregate_usage_api_v1_admin_usage_get","parameters":[{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["Admin"],"summary":"Api Admin List Users","description":"List all users — admin only.","operationId":"api_admin_list_users_api_v1_admin_users_get","parameters":[{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/create":{"post":{"tags":["Admin"],"summary":"Api Admin Create User","description":"Admin creates a dashboard-only user.","operationId":"api_admin_create_user_api_v1_admin_users_create_post","parameters":[{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{target_id}/upgrade":{"post":{"tags":["Admin"],"summary":"Api Admin Upgrade User","description":"[Admin] Manually upgrade user plan (after PayPal.me payment received).","operationId":"api_admin_upgrade_user_api_v1_admin_users__target_id__upgrade_post","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{target_id}":{"delete":{"tags":["Admin"],"summary":"Api Admin Delete User","description":"Admin deletes a user and all their data.","operationId":"api_admin_delete_user_api_v1_admin_users__target_id__delete","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["Admin"],"summary":"Api Admin Stats","description":"Admin dashboard stats.","operationId":"api_admin_stats_api_v1_admin_stats_get","parameters":[{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{target_id}/activity":{"get":{"tags":["Admin"],"summary":"Api Admin User Activity","description":"Admin views a specific user's activity.","operationId":"api_admin_user_activity_api_v1_admin_users__target_id__activity_get","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/plan-health":{"get":{"tags":["Admin"],"summary":"Admin Plan Health","operationId":"admin_plan_health_api_v2_admin_plan_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/upgrade-requests":{"get":{"tags":["Admin"],"summary":"Admin Upgrade Requests","operationId":"admin_upgrade_requests_api_v2_admin_upgrade_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/upgrade-requests/{request_id}/approve":{"post":{"tags":["Admin"],"summary":"Admin Approve Upgrade","operationId":"admin_approve_upgrade_api_v2_admin_upgrade_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/upgrade-requests/{request_id}/reject":{"post":{"tags":["Admin"],"summary":"Admin Reject Upgrade","operationId":"admin_reject_upgrade_api_v2_admin_upgrade_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/user/upgrade-request":{"post":{"tags":["User"],"summary":"User Upgrade Request","operationId":"user_upgrade_request_api_v2_user_upgrade_request_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/user/upgrade-status":{"get":{"tags":["User"],"summary":"User Upgrade Status","operationId":"user_upgrade_status_api_v2_user_upgrade_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/options/{ticker}":{"get":{"tags":["Analysis"],"summary":"Api Options","description":"Legacy options endpoint; entitlement is still enforced server-side.","operationId":"api_options_api_v1_options__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chart-data/{ticker}":{"get":{"tags":["Analysis"],"summary":"Api Chart Data","description":"Get OHLCV data with computed indicators for interactive chart.","operationId":"api_chart_data_api_v1_chart_data__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"6mo","title":"Period"}},{"name":"interval","in":"query","required":false,"schema":{"type":"string","default":"1d","title":"Interval"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users":{"get":{"tags":["Admin V2"],"summary":"Api V2 Admin List Users","description":"List all users with portfolio count, watchlist count, invite status, settings.","operationId":"api_v2_admin_list_users_api_v2_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/users/{user_id}":{"get":{"tags":["Admin V2"],"summary":"Api V2 Admin User Detail","description":"Detailed user info including portfolio, watchlist, alerts, settings.","operationId":"api_v2_admin_user_detail_api_v2_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/plan":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Change Plan","description":"Change a user's plan.","operationId":"api_v2_admin_change_plan_api_v2_admin_users__user_id__plan_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/disable":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Toggle Disable","description":"Toggle is_active for a user.","operationId":"api_v2_admin_toggle_disable_api_v2_admin_users__user_id__disable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/reset-invite":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Reset Invite","operationId":"api_v2_admin_reset_invite_api_v2_admin_users__user_id__reset_invite_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"invite_only","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/security-reset":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Security Reset","operationId":"api_v2_admin_security_reset_api_v2_admin_users__user_id__security_reset_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/create":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Create User","description":"Admin creates a new dashboard user with settings.","operationId":"api_v2_admin_create_user_api_v2_admin_users_create_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/telegram-link":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Telegram Link","description":"Link a Telegram account to a user.","operationId":"api_v2_admin_telegram_link_api_v2_admin_users__user_id__telegram_link_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/telegram-unlink":{"post":{"tags":["Admin V2"],"summary":"Api V2 Admin Telegram Unlink","description":"Unlink a Telegram account from a user.","operationId":"api_v2_admin_telegram_unlink_api_v2_admin_users__user_id__telegram_unlink_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/users/{user_id}/usage":{"get":{"tags":["Admin V2"],"summary":"Api V2 Admin User Usage","description":"Usage summary from user_usage_events.","operationId":"api_v2_admin_user_usage_api_v2_admin_users__user_id__usage_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/logs/recent":{"get":{"tags":["Admin V2"],"summary":"Api V2 Admin Logs Recent","description":"Read sanitized app logs from journalctl.","operationId":"api_v2_admin_logs_recent_api_v2_admin_logs_recent_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Lines"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/system/health":{"get":{"tags":["Admin V2"],"summary":"Api V2 Admin System Health","description":"System health info.","operationId":"api_v2_admin_system_health_api_v2_admin_system_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/dashboard":{"get":{"tags":["Dashboard V2"],"summary":"Api V2 Dashboard","description":"V2 Dashboard Aggregator — cache-based, NO blocking calls.\nComposes from core/news/opportunities/personal caches only.\nNever calls MarketScanner, yfinance, or any heavy external API.","operationId":"api_v2_dashboard_api_v2_dashboard_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dashboard/core":{"get":{"tags":["Dashboard V2"],"summary":"Api V2 Dashboard Core","description":"Dashboard Core — fast market snapshot with stale cache fallback.\nNO yfinance calls in request path — cache warmer handles data refresh.\nFresh cache → instant, stale cache → stale data, cold → partial fallback.","operationId":"api_v2_dashboard_core_api_v2_dashboard_core_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/dashboard/news":{"get":{"tags":["Dashboard V2"],"summary":"Api V2 Dashboard News","description":"Dashboard News — market news articles from cache only. No blocking calls.","operationId":"api_v2_dashboard_news_api_v2_dashboard_news_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/dashboard/opportunities":{"get":{"tags":["Dashboard V2"],"summary":"Api V2 Dashboard Opportunities","description":"Dashboard Opportunities — top picks with GEMS scores. Cache-only, no blocking calls.","operationId":"api_v2_dashboard_opportunities_api_v2_dashboard_opportunities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/dashboard/personal":{"get":{"tags":["Dashboard V2"],"summary":"Api V2 Dashboard Personal","description":"Dashboard Personal — portfolio, watchlist, alerts. User-specific, per-user cache 60s.","operationId":"api_v2_dashboard_personal_api_v2_dashboard_personal_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"User Id"}},{"name":"tid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tid"}},{"name":"sh","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/dashboard/refresh/all":{"post":{"tags":["Internal"],"summary":"Api Internal Dashboard Refresh All","description":"Refresh all dashboard caches — internal only.\nProtected by X-Tickerio-Internal-Token header matching TICKERIO_INTERNAL_TOKEN env var.\nRuns heavy calls (MarketScanner, yfinance, finviz, GEMS) in executor.\nOld cache remains if refresh fails.","operationId":"api_internal_dashboard_refresh_all_api_internal_dashboard_refresh_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/glossary/{term}":{"get":{"summary":"Api Glossary Term","description":"Return a single glossary term by lookup.","operationId":"api_glossary_term_api_v2_education_glossary__term__get","parameters":[{"name":"term","in":"path","required":true,"schema":{"type":"string","title":"Term"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/categories":{"get":{"summary":"Api Education Categories","description":"Return all education categories.","operationId":"api_education_categories_api_v2_education_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/lessons":{"get":{"summary":"Api Education Lessons","description":"Return all lessons, optionally filtered by category.","operationId":"api_education_lessons_api_v2_education_lessons_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/lessons/{lesson_id}":{"get":{"summary":"Api Education Lesson","description":"Return a single lesson by ID with full content.","operationId":"api_education_lesson_api_v2_education_lessons__lesson_id__get","parameters":[{"name":"lesson_id","in":"path","required":true,"schema":{"type":"string","title":"Lesson Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/search":{"get":{"summary":"Api Education Search","description":"Search lessons and glossary terms by keyword.","operationId":"api_education_search_api_v2_education_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/gems/{ticker}/explain":{"get":{"summary":"Api Gems Explain","description":"Return a detailed GEMS (Growth, Earnings, Moat, Safety) breakdown with drilldown metadata.","operationId":"api_gems_explain_api_v2_gems__ticker__explain_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/daily-brief/run":{"post":{"summary":"Run Daily Brief","description":"Protected internal endpoint to run daily brief for all users.\n\nRequires X-Internal-Token header matching TICKERIO_INTERNAL_TOKEN env var.\nUseful for cron jobs (APScheduler, crontab, etc.).\n\nReturns summary: users processed, portfolios sent, watchlists sent.","operationId":"run_daily_brief_api_internal_daily_brief_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/daily-brief":{"get":{"summary":"Get Portfolio Brief","description":"Get the portfolio brief for a user (for testing/debugging).","operationId":"get_portfolio_brief_api_v2_portfolio_daily_brief_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/watchlist/daily-brief":{"get":{"summary":"Get Watchlist Brief","description":"Get the watchlist brief for a user (for testing/debugging).","operationId":"get_watchlist_brief_api_v2_watchlist_daily_brief_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/game/question":{"get":{"summary":"Get Game Question","description":"Get a random game question.","operationId":"get_game_question_api_v2_education_game_question_get","parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(up_down|duel)$","title":"Mode"}},{"name":"difficulty","in":"query","required":false,"schema":{"type":"string","pattern":"^(beginner|intermediate|advanced)$","title":"Difficulty"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/game/answer":{"post":{"summary":"Submit Game Answer","description":"Submit an answer to a game question and get results.","operationId":"submit_game_answer_api_v2_education_game_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameAnswerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/game/stats":{"get":{"summary":"Get Game Stats","description":"Get user's game stats.","operationId":"get_game_stats_api_v2_education_game_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/simulator/types":{"get":{"summary":"Get Simulator Types","description":"Get all available question types and difficulties.","operationId":"get_simulator_types_api_v2_education_simulator_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/simulator/question":{"get":{"summary":"Get Simulator Question","description":"Get a random simulator question.","operationId":"get_simulator_question_api_v2_education_simulator_question_get","parameters":[{"name":"question_type","in":"query","required":false,"schema":{"type":"string","title":"Question Type"}},{"name":"difficulty","in":"query","required":false,"schema":{"type":"string","pattern":"^(beginner|intermediate|advanced)$","title":"Difficulty"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/simulator/answer":{"post":{"summary":"Submit Simulator Answer","description":"Submit an answer to a simulator question.","operationId":"submit_simulator_answer_api_v2_education_simulator_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimAnswerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/simulator/stats":{"get":{"summary":"Get Simulator Stats","description":"Get user's simulator stats plus privacy-safe gamification/leaderboard data.","operationId":"get_simulator_stats_api_v2_education_simulator_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/portfolio-snapshots/open":{"post":{"summary":"Internal Portfolio Snapshot Open","description":"Take an opening snapshot of a user's portfolio. Requires internal token.","operationId":"internal_portfolio_snapshot_open_api_internal_portfolio_snapshots_open_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/portfolio-snapshots/current":{"post":{"summary":"Internal Portfolio Snapshot Current","description":"Update current portfolio values. Requires internal token.","operationId":"internal_portfolio_snapshot_current_api_internal_portfolio_snapshots_current_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/portfolio-snapshots/close":{"post":{"summary":"Internal Portfolio Snapshot Close","description":"Finalize the close snapshot of a user's portfolio. Requires internal token.","operationId":"internal_portfolio_snapshot_close_api_internal_portfolio_snapshots_close_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/portfolio/{user_id}/today":{"get":{"summary":"Get Portfolio Today","description":"Get today's portfolio session data for a user. Protected by require_owner.","operationId":"get_portfolio_today_api_v2_portfolio__user_id__today_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/portfolio/today":{"get":{"summary":"Get My Portfolio Today","description":"Get today's portfolio session data for the authenticated user.","operationId":"get_my_portfolio_today_api_v2_portfolio_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/home-widgets":{"get":{"summary":"Get Home Widgets","description":"Get user's home widgets with data.","operationId":"get_home_widgets_api_v2_home_widgets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Add Home Widget","description":"Add a widget to home.","operationId":"add_home_widget_api_v2_home_widgets_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/home-widgets/{widget_id}":{"patch":{"summary":"Update Home Widget","description":"Update widget settings/position/size/visibility.","operationId":"update_home_widget_api_v2_home_widgets__widget_id__patch","parameters":[{"name":"widget_id","in":"path","required":true,"schema":{"type":"integer","title":"Widget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Home Widget","description":"Remove widget from home.","operationId":"delete_home_widget_api_v2_home_widgets__widget_id__delete","parameters":[{"name":"widget_id","in":"path","required":true,"schema":{"type":"integer","title":"Widget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/home-widgets/reset":{"post":{"summary":"Reset Home Widgets","description":"Reset home to defaults.","operationId":"reset_home_widgets_api_v2_home_widgets_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/modules":{"get":{"summary":"Get Module Registry Api","description":"Return the complete module registry with statuses and features.\nThe frontend sidebar is rendered from this registry.\nUse it to determine which modules are available vs planned.","operationId":"get_module_registry_api_api_v2_modules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/widget-registry":{"get":{"summary":"Get Widget Registry","description":"Return available widget catalog.","operationId":"get_widget_registry_api_v2_widget_registry_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/market-data/{asset_type}/{symbol}":{"get":{"summary":"Get Asset Market Data","description":"Get live market data for any asset type (FX, commodity, bond, rate).","operationId":"get_asset_market_data_api_v2_market_data__asset_type___symbol__get","parameters":[{"name":"asset_type","in":"path","required":true,"schema":{"type":"string","title":"Asset Type"}},{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-data/overview":{"get":{"summary":"Get Market Overview","description":"Get ALL market items organized by category. Cached for 60 seconds.","operationId":"get_market_overview_api_v2_market_data_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/market-data/asset":{"get":{"summary":"Get Market Asset","description":"Get normalized data for a single market asset.\n\nQuery params:\n    type: One of 'fx', 'commodities', 'indices', 'bond_yields', 'interest_rates'\n    symbol: Asset symbol (e.g. 'USDILS', 'GOLD', 'US10Y')","operationId":"get_market_asset_api_v2_market_data_asset_get","parameters":[{"name":"type","in":"query","required":true,"schema":{"type":"string","title":"Type"}},{"name":"symbol","in":"query","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/personal-market-board":{"get":{"summary":"Get Personal Market Board","description":"Get the user's personal market board.\n\nIf authenticated: returns the user's custom layout + all market data.\nIf guest: returns the default public layout.","operationId":"get_personal_market_board_api_v2_personal_market_board_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/asset-universe":{"get":{"summary":"Get Asset Universe","description":"Search the add-asset catalog across stocks, ETFs, FX, commodities, crypto and indices.","operationId":"get_asset_universe_api_v2_asset_universe_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"asset_type","in":"query","required":false,"schema":{"type":"string","title":"Asset Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":80,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/tracked-assets":{"get":{"summary":"Get User Tracked Assets","description":"Get tracked assets for the authenticated user.","operationId":"get_user_tracked_assets_api_v2_tracked_assets_get","parameters":[{"name":"asset_type","in":"query","required":false,"schema":{"type":"string","title":"Asset Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add User Tracked Asset","description":"Add a tracked asset.","operationId":"add_user_tracked_asset_api_v2_tracked_assets_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/tracked-assets/{asset_id}":{"delete":{"summary":"Delete User Tracked Asset","description":"Delete a tracked asset.","operationId":"delete_user_tracked_asset_api_v2_tracked_assets__asset_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/smart-alerts":{"get":{"summary":"Get Smart Alerts","description":"Get smart alerts for the authenticated user.","operationId":"get_smart_alerts_api_v2_smart_alerts_get","parameters":[{"name":"asset_type","in":"query","required":false,"schema":{"type":"string","title":"Asset Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Smart Alert Endpoint","description":"Create a smart alert.","operationId":"add_smart_alert_endpoint_api_v2_smart_alerts_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/smart-alerts/{alert_id}":{"patch":{"summary":"Update Smart Alert Endpoint","description":"Update a smart alert.","operationId":"update_smart_alert_endpoint_api_v2_smart_alerts__alert_id__patch","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Smart Alert Endpoint","description":"Delete a smart alert.","operationId":"delete_smart_alert_endpoint_api_v2_smart_alerts__alert_id__delete","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/smart-alerts/check":{"post":{"summary":"Check Smart Alerts Endpoint","description":"Check all active alerts for the authenticated user.","operationId":"check_smart_alerts_endpoint_api_v2_smart_alerts_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/notifications":{"get":{"summary":"Get Notifications Endpoint","description":"Get notifications for the authenticated user.","operationId":"get_notifications_endpoint_api_v2_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/smart-alerts/health":{"get":{"summary":"Smart Alerts Health","operationId":"smart_alerts_health_api_v2_smart_alerts_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/notifications/{notification_id}/read":{"post":{"summary":"Mark Notification Read Endpoint","description":"Mark a notification as read.","operationId":"mark_notification_read_endpoint_api_v2_notifications__notification_id__read_post","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/smart-alerts/{alert_id}/events":{"get":{"summary":"Get Alert Events Endpoint","description":"Get triggered events for a specific alert.","operationId":"get_alert_events_endpoint_api_v2_smart_alerts__alert_id__events_get","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/game/session":{"get":{"summary":"Game Session","description":"Get today's game session (3 questions). Creates one if not exists.","operationId":"game_session_api_v2_game_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/session/summary":{"get":{"summary":"Game Session Summary","description":"Get the summary for today's completed session.","operationId":"game_session_summary_api_v2_game_session_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/profile":{"get":{"summary":"Game Profile","description":"Get the authenticated user's gamification profile + badges.","operationId":"game_profile_api_v2_game_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/daily":{"get":{"summary":"Game Daily","description":"Get today's daily question (without correct_answer).","operationId":"game_daily_api_v2_game_daily_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/answer":{"post":{"summary":"Game Answer","description":"Submit an answer to a game question. Awards XP. Rate-limited to 50/day.","operationId":"game_answer_api_v2_game_answer_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/history":{"get":{"summary":"Game History","description":"Get the last 50 game attempts for the authenticated user.","operationId":"game_history_api_v2_game_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/game/leaderboard":{"get":{"summary":"Game Leaderboard","description":"Public leaderboard — top 20 users by XP. No auth required.","operationId":"game_leaderboard_api_v2_game_leaderboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/financials/{ticker}":{"get":{"summary":"Get Financials V2","description":"Return comprehensive financial data for a ticker.\nUses yfinance via StockDataFetcher. Missing fields are null.\nCached for 1 hour.","operationId":"get_financials_v2_api_v2_financials__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chart/{ticker}":{"get":{"summary":"Get Chart Data V2","description":"Return OHLCV price data with technical indicators.\nFetches cached daily data from yfinance and slices it by requested period.\nComputes SMA, RSI, MACD, Bollinger Bands plus a deterministic technical summary.","operationId":"get_chart_data_v2_api_v2_chart__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(1m|3m|6m|1y|2y)$","default":"1y","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/search":{"get":{"tags":["Mobile App"],"summary":"Mobile Search","description":"Unified search across stocks AND market items (FX, commodities, indices, yields, rates).","operationId":"mobile_search_api_v2_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query for stocks & market items","title":"Q"},"description":"Search query for stocks & market items"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chart-data":{"get":{"tags":["Mobile App"],"summary":"Mobile Chart Data","description":"Chart data with timeframes for mobile chart view.\nRange-to-period mapping:\n  1D→1d/5m, 5D→5d/15m, 1M→1mo/1h, 3M→3mo/1d, YTD→6mo/1d, 1Y→1y/1d, 5Y→5y/1wk, ALL→max/1mo","operationId":"mobile_chart_data_api_v2_chart_data_get","parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","description":"Symbol (ticker or market asset)","title":"Symbol"},"description":"Symbol (ticker or market asset)"},{"name":"range","in":"query","required":false,"schema":{"type":"string","description":"Chart range: 1D, 5D, 1M, 3M, YTD, 1Y, 5Y, ALL","title":"Range"},"description":"Chart range: 1D, 5D, 1M, 3M, YTD, 1Y, 5Y, ALL"},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Yahoo Finance period (1d, 5d, 1mo, 3mo, 6mo, 1y, 5y, max)","title":"Period"},"description":"Yahoo Finance period (1d, 5d, 1mo, 3mo, 6mo, 1y, 5y, max)"},{"name":"interval","in":"query","required":false,"schema":{"type":"string","description":"Yahoo Finance interval (1m, 5m, 15m, 1h, 1d, 1wk, 1mo)","title":"Interval"},"description":"Yahoo Finance interval (1m, 5m, 15m, 1h, 1d, 1wk, 1mo)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/economic-calendar":{"get":{"tags":["Mobile App"],"summary":"Mobile Economic Calendar","description":"Economic calendar — currently unavailable.","operationId":"mobile_economic_calendar_api_v2_economic_calendar_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/news":{"get":{"tags":["Mobile App"],"summary":"Mobile News","description":"Market news — uses existing news endpoint if available, else unavailable state.","operationId":"mobile_news_api_v2_news_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string","description":"Optional ticker symbol to filter news by","title":"Symbol"},"description":"Optional ticker symbol to filter news by"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/mobile/full-report/{symbol}":{"get":{"tags":["Mobile App"],"summary":"Mobile Full Report","description":"Full structured report for mobile SPA — 12 sections, safe wording, no buy/sell/trading advice.","operationId":"mobile_full_report_api_v2_mobile_full_report__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mobile":{"get":{"tags":["Mobile App"],"summary":"Mobile Redirect","description":"Redirect to the mobile SPA.","operationId":"mobile_redirect_mobile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/explore/intelligence":{"get":{"tags":["Intelligence Map"],"summary":"Explore Intelligence Endpoint","description":"Rule-based Explore buckets. No AI, no trading recommendation.","operationId":"explore_intelligence_endpoint_api_v2_explore_intelligence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/explore/sectors":{"get":{"tags":["Intelligence Map"],"summary":"Explore Sectors Endpoint","description":"List sector intelligence playbooks.","operationId":"explore_sectors_endpoint_api_v2_explore_sectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/explore/sectors/{sector}":{"get":{"tags":["Intelligence Map"],"summary":"Explore Sector Detail Endpoint","description":"Return one sector playbook.","operationId":"explore_sector_detail_endpoint_api_v2_explore_sectors__sector__get","parameters":[{"name":"sector","in":"path","required":true,"schema":{"type":"string","title":"Sector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/stocks/{ticker}/tickerio-insight":{"get":{"tags":["Intelligence Map"],"summary":"Stock Tickerio Insight Endpoint","description":"Tickerio Insight layer for stock analysis — deterministic and educational.","operationId":"stock_tickerio_insight_endpoint_api_v2_stocks__ticker__tickerio_insight_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/curriculum":{"get":{"tags":["Education"],"summary":"Education Curriculum Endpoint","operationId":"education_curriculum_endpoint_api_v2_education_curriculum_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/education/indicators":{"get":{"tags":["Education"],"summary":"Education Indicators Endpoint","operationId":"education_indicators_endpoint_api_v2_education_indicators_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/education/indicators/{indicator_id}":{"get":{"tags":["Education"],"summary":"Education Indicator Detail Endpoint","operationId":"education_indicator_detail_endpoint_api_v2_education_indicators__indicator_id__get","parameters":[{"name":"indicator_id","in":"path","required":true,"schema":{"type":"string","title":"Indicator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/personalization/recommendations":{"get":{"tags":["Personalization"],"summary":"Personalization Recommendations Endpoint","description":"Rule-based personal recommendations for the authenticated user.","operationId":"personalization_recommendations_endpoint_api_v2_personalization_recommendations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/user/activity":{"get":{"tags":["Personalization"],"summary":"User Activity Endpoint","description":"Privacy-safe user activity history for the authenticated user.","operationId":"user_activity_endpoint_api_v2_user_activity_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"event_type","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Event Type"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Personalization"],"summary":"User Activity Post Endpoint","description":"Privacy-safe activity tracking for authenticated users only.","operationId":"user_activity_post_endpoint_api_v2_user_activity_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/reports/{ticker}":{"get":{"tags":["Reports V2"],"summary":"Cpi Report V2","description":"CPI-powered full company report.","operationId":"cpi_report_v2_api_v2_reports__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"version","in":"query","required":false,"schema":{"type":"integer","default":2,"title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/reports/{ticker}/changes":{"get":{"tags":["Reports V2"],"summary":"Cpi Report Changes","description":"What Changed for a ticker.","operationId":"cpi_report_changes_api_v2_reports__ticker__changes_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/product-intelligence/{ticker}":{"get":{"tags":["Intelligence V3"],"summary":"Product Intelligence V3 Endpoint","description":"V3 product intelligence, competitors, differentiation, catalysts.","operationId":"product_intelligence_v3_endpoint_api_v3_product_intelligence__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/decision/{ticker}":{"get":{"tags":["Decision Engine"],"summary":"Decision Endpoint","description":"Canonical decision brief: simulator, Why Yes/No, scenarios, metric validation.","operationId":"decision_endpoint_api_v2_decision__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"amount","in":"query","required":false,"schema":{"type":"number","description":"Investment amount for simulation","default":100.0,"title":"Amount"},"description":"Investment amount for simulation"},{"name":"currency","in":"query","required":false,"schema":{"type":"string","description":"Currency for simulation","default":"USD","title":"Currency"},"description":"Currency for simulation"},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","description":"Horizon in months","default":12,"title":"Horizon"},"description":"Horizon in months"},{"name":"fractional","in":"query","required":false,"schema":{"type":"boolean","description":"Allow fractional shares","default":true,"title":"Fractional"},"description":"Allow fractional shares"},{"name":"purchase_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Override purchase price","title":"Purchase Price"},"description":"Override purchase price"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/ingest/{ticker}":{"post":{"tags":["Administration"],"summary":"Admin Ingest","description":"Trigger CPI.1E ingestion for a ticker (admin authorized).","operationId":"admin_ingest_api_v2_admin_ingest__ticker__post","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/ingestion/status":{"get":{"tags":["Administration"],"summary":"Admin Ingestion Status","description":"Return ingestion pipeline status (admin authorized).","operationId":"admin_ingestion_status_api_v2_admin_ingestion_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/users":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Users","operationId":"admin_rbac_users_api_v2_admin_rbac_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/server":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Server","operationId":"admin_rbac_server_api_v2_admin_rbac_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/stats":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Stats","operationId":"admin_rbac_stats_api_v2_admin_rbac_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/security":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Security","operationId":"admin_rbac_security_api_v2_admin_rbac_security_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/backups":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Backups","operationId":"admin_rbac_backups_api_v2_admin_rbac_backups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Admin RBAC"],"summary":"Admin Rbac Create Backup","operationId":"admin_rbac_create_backup_api_v2_admin_rbac_backups_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/rbac/audit":{"get":{"tags":["Admin RBAC"],"summary":"Admin Rbac Audit","operationId":"admin_rbac_audit_api_v2_admin_rbac_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/versions":{"get":{"tags":["Report QA"],"summary":"Report Qa Versions","operationId":"report_qa_versions_api_v2_admin_report_qa_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/generate":{"get":{"tags":["Report QA"],"summary":"Report Qa Generate","operationId":"report_qa_generate_api_v2_admin_report_qa_generate_get","parameters":[{"name":"ticker","in":"query","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"version","in":"query","required":false,"schema":{"type":"string","default":"production","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/report-qa/compare":{"get":{"tags":["Report QA"],"summary":"Report Qa Compare","operationId":"report_qa_compare_api_v2_admin_report_qa_compare_get","parameters":[{"name":"ticker","in":"query","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/report-qa/telegram-preview":{"get":{"tags":["Report QA"],"summary":"Report Qa Telegram Preview","operationId":"report_qa_telegram_preview_api_v2_admin_report_qa_telegram_preview_get","parameters":[{"name":"ticker","in":"query","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"short","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/admin/report-qa/telegram-send":{"post":{"tags":["Report QA"],"summary":"Report Qa Telegram Send","operationId":"report_qa_telegram_send_api_v2_admin_report_qa_telegram_send_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/run":{"post":{"tags":["Report QA"],"summary":"Report Qa Create Run","operationId":"report_qa_create_run_api_v2_admin_report_qa_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/runs":{"get":{"tags":["Report QA"],"summary":"Report Qa List Runs","operationId":"report_qa_list_runs_api_v2_admin_report_qa_runs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/approve":{"post":{"tags":["Report QA"],"summary":"Report Qa Approve","operationId":"report_qa_approve_api_v2_admin_report_qa_approve_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/reject":{"post":{"tags":["Report QA"],"summary":"Report Qa Reject","operationId":"report_qa_reject_api_v2_admin_report_qa_reject_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/admin/report-qa/feature-flags":{"get":{"tags":["Report QA"],"summary":"Report Qa Flags","operationId":"report_qa_flags_api_v2_admin_report_qa_feature_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Report QA"],"summary":"Report Qa Update Flag","operationId":"report_qa_update_flag_api_v2_admin_report_qa_feature_flags_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/candidate/report/{ticker}":{"get":{"tags":["Candidate"],"summary":"Candidate Report Web","description":"Candidate report endpoint. Validates access via admin key or role.","operationId":"candidate_report_web_api_v2_candidate_report__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"full","title":"Mode"}},{"name":"language","in":"query","required":false,"schema":{"type":"string","default":"he","title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/candidate/compare/{ticker}":{"get":{"tags":["Candidate"],"summary":"Candidate Compare Web","operationId":"candidate_compare_web_api_v2_candidate_compare__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/candidate/telegram-preview/{ticker}":{"get":{"tags":["Candidate"],"summary":"Candidate Telegram Preview","operationId":"candidate_telegram_preview_api_v2_candidate_telegram_preview__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"short","title":"Mode"}},{"name":"language","in":"query","required":false,"schema":{"type":"string","default":"he","title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/candidate/access-check":{"get":{"tags":["Candidate"],"summary":"Candidate Access Check","description":"Check if current user has candidate report access.","operationId":"candidate_access_check_api_v2_candidate_access_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/telegram/report-new":{"post":{"tags":["Telegram Candidate"],"summary":"Telegram Report New","description":"Handle /report_new TICKER [quick|full|changed] [he|en].","operationId":"telegram_report_new_api_v2_telegram_report_new_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/telegram/report-compare":{"post":{"tags":["Telegram Candidate"],"summary":"Telegram Report Compare","description":"Handle /report_compare TICKER.","operationId":"telegram_report_compare_api_v2_telegram_report_compare_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/telegram/file":{"post":{"tags":["Telegram Full Report"],"summary":"Telegram File Command","description":"Handle /file TICKER [he|en|candidate|current|compare].","operationId":"telegram_file_command_api_v2_telegram_file_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ActivateRequest":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id"},"plan":{"type":"string","title":"Plan"},"paypal_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paypal Email"},"telegram_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Telegram Id"}},"type":"object","required":["subscription_id","plan"],"title":"ActivateRequest"},"AlertCreate":{"properties":{"user_id":{"type":"integer","title":"User Id"},"ticker":{"type":"string","pattern":"^[A-Z]{1,5}(\\.[A-Z]{1,2})?$","title":"Ticker"},"type":{"type":"string","pattern":"^(price|rsi|volume_spike|pct_change)$","title":"Type","default":"price"},"threshold":{"type":"number","title":"Threshold"},"direction":{"type":"string","pattern":"^(above|below|any)$","title":"Direction","default":"any"}},"type":"object","required":["user_id","ticker","threshold"],"title":"AlertCreate"},"Body_api_import_portfolio_preview_api_v2_portfolio__user_id__import_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"mode":{"type":"string","title":"Mode","default":"upsert"}},"type":"object","required":["file"],"title":"Body_api_import_portfolio_preview_api_v2_portfolio__user_id__import_preview_post"},"Body_api_owner_import_portfolio_preview_api_v2_portfolio_import_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"mode":{"type":"string","title":"Mode","default":"upsert"}},"type":"object","required":["file"],"title":"Body_api_owner_import_portfolio_preview_api_v2_portfolio_import_preview_post"},"CommunityForecastCreate":{"properties":{"ticker":{"type":"string","pattern":"^[A-Z]{1,5}(\\.[A-Z]{1,2})?$","title":"Ticker"},"direction":{"type":"string","pattern":"^(up|down|flat|unsure)$","title":"Direction"},"horizon":{"type":"string","pattern":"^(1W|1M|3M|6M|1Y)$","title":"Horizon","default":"3M"},"target_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Price"},"confidence":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Confidence","default":50},"explanation":{"type":"string","maxLength":900,"minLength":20,"title":"Explanation"},"thesis_tags":{"items":{"type":"string"},"type":"array","title":"Thesis Tags"}},"type":"object","required":["ticker","direction","explanation"],"title":"CommunityForecastCreate"},"ContinuityLinkRequest":{"properties":{"target_path":{"type":"string","maxLength":300,"title":"Target Path","default":"/dash/"},"ticker":{"anyOf":[{"type":"string","maxLength":12,"pattern":"^[A-Za-z0-9.^=-]+$"},{"type":"null"}],"title":"Ticker"},"report_run_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Report Run Id"}},"type":"object","title":"ContinuityLinkRequest"},"GameAnswerRequest":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"selected_answer":{"type":"string","title":"Selected Answer"}},"type":"object","required":["question_id","selected_answer"],"title":"GameAnswerRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HoldingCreate":{"properties":{"ticker":{"type":"string","pattern":"^[A-Z]{1,5}(\\.[A-Z]{1,2})?$","title":"Ticker"},"shares":{"type":"number","exclusiveMinimum":0.0,"title":"Shares"},"avg_cost":{"type":"number","exclusiveMinimum":0.0,"title":"Avg Cost"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["ticker","shares","avg_cost"],"title":"HoldingCreate"},"HoldingUpdate":{"properties":{"shares":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shares"},"avg_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Cost"}},"type":"object","title":"HoldingUpdate"},"ReportRunRecord":{"properties":{"report_run_id":{"type":"string","title":"Report Run Id"},"user_id":{"type":"integer","title":"User Id"},"ticker":{"type":"string","title":"Ticker"},"report_type":{"type":"string","title":"Report Type"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"generated_at":{"type":"string","title":"Generated At"},"decision_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Decision Snapshot"},"simulation_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Simulation Snapshot"},"portfolio_context_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Portfolio Context Snapshot"},"source_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Snapshot"},"surface":{"type":"string","title":"Surface"}},"type":"object","required":["report_run_id","user_id","ticker","report_type","generated_at","surface"],"title":"ReportRunRecord"},"ReportRunStoreRequest":{"properties":{"report_run_id":{"type":"string","title":"Report Run Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id","description":"Optional owner assertion; the authenticated session remains authoritative"},"ticker":{"type":"string","maxLength":10,"minLength":1,"title":"Ticker"},"report_type":{"type":"string","title":"Report Type","default":"v3"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"decision_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Decision Snapshot"},"simulation_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Simulation Snapshot"},"portfolio_context_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Portfolio Context Snapshot"},"source_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Snapshot"},"surface":{"type":"string","title":"Surface","default":"web"}},"type":"object","required":["ticker"],"title":"ReportRunStoreRequest"},"SimAnswerRequest":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"selected_answer":{"type":"string","title":"Selected Answer"}},"type":"object","required":["question_id","selected_answer"],"title":"SimAnswerRequest"},"SimulationRecord":{"properties":{"simulation_id":{"type":"string","title":"Simulation Id"},"user_id":{"type":"integer","title":"User Id"},"ticker":{"type":"string","title":"Ticker"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"horizon_months":{"type":"integer","title":"Horizon Months"},"purchase_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Purchase Price"},"scenario_version":{"type":"string","title":"Scenario Version"},"inputs_snapshot":{"additionalProperties":true,"type":"object","title":"Inputs Snapshot"},"results_snapshot":{"additionalProperties":true,"type":"object","title":"Results Snapshot"},"created_at":{"type":"string","title":"Created At"},"surface":{"type":"string","title":"Surface"}},"type":"object","required":["simulation_id","user_id","ticker","amount","currency","horizon_months","scenario_version","inputs_snapshot","results_snapshot","created_at","surface"],"title":"SimulationRecord","description":"Response model for a single simulation record."},"SimulationStoreRequest":{"properties":{"simulation_id":{"type":"string","title":"Simulation Id","description":"Unique simulation ID. Auto-generated if not provided."},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id","description":"Optional owner assertion; the authenticated session remains authoritative"},"ticker":{"type":"string","maxLength":10,"minLength":1,"title":"Ticker","description":"Stock ticker (e.g., NVDA)"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount","description":"Investment amount"},"currency":{"type":"string","maxLength":5,"minLength":1,"title":"Currency","description":"Currency code","default":"USD"},"horizon_months":{"type":"integer","exclusiveMinimum":0.0,"title":"Horizon Months","description":"Investment horizon in months"},"purchase_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Purchase Price","description":"Purchase price (null if not purchased)"},"scenario_version":{"type":"string","title":"Scenario Version","description":"Simulation scenario version","default":"v2.0"},"inputs_snapshot":{"additionalProperties":true,"type":"object","title":"Inputs Snapshot","description":"Full inputs snapshot as dict"},"results_snapshot":{"additionalProperties":true,"type":"object","title":"Results Snapshot","description":"Full results snapshot as dict"},"surface":{"type":"string","title":"Surface","description":"Originating surface: web or telegram","default":"web"}},"type":"object","required":["ticker","amount","horizon_months","inputs_snapshot","results_snapshot"],"title":"SimulationStoreRequest","description":"Request body for POST /api/v2/simulations."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WatchlistAdd":{"properties":{"ticker":{"type":"string","pattern":"^[A-Z]{1,5}(\\.[A-Z]{1,2})?$","title":"Ticker"}},"type":"object","required":["ticker"],"title":"WatchlistAdd"}}}}