{"openapi":"3.1.0","info":{"title":"Momentum Analyzer V2","description":"Clean, lean delivery API for multi-tenant analytics","version":"2.0.0"},"paths":{"/api/v3/public/coverage":{"get":{"tags":["public"],"summary":"Public Coverage","description":"Watchlist catalog: names, sectors, and free/paid flags. No prices.","operationId":"public_coverage_api_v3_public_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v3/account/mcp":{"get":{"tags":["public"],"summary":"Account Mcp","description":"Plan, trial, today's MCP calls, and how many symbols this user can query.","operationId":"account_mcp_api_v3_account_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/":{"get":{"summary":"Root","description":"Root endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v3/dashboard":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Dashboard","description":"Fetch the latest V3 Trade Setups for the dashboard.\n\nThis provides the 'Golden Record' of signals, including the novice-friendly\nexplanations and continuous conviction scores.\n\nArgs:\n    symbol: Filter by specific ticker\n    grade: Filter by setup grade (All, A+, A, B, C)\n    min_conviction: Filter by minimum conviction score (0-100). A+ and A grades generate briefs.\n    limit: Max number of signals to return\n    force_refresh: If True, trigger background ingestion (admin only)\n    current_user: Authenticated user\n    ops: Database operations","operationId":"get_v3_dashboard_api_v3_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"}},{"name":"grade","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"}},{"name":"regime","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Regime"}},{"name":"personality","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Personality"}},{"name":"min_conviction","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Min Conviction"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponseV3"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/dashboard/cards":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Dashboard Cards","description":"Card fields for the dashboard grid.\n\nSync on purpose: the database work runs in a worker thread so key-dates\nand sentiment are not stuck behind it on the event loop.","operationId":"get_v3_dashboard_cards_api_v3_dashboard_cards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardCardsResponseV3"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/setup/{symbol}":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Setup","description":"Fetch a detailed V3 Trade Setup for a specific symbol.","operationId":"get_v3_setup_api_v3_setup__symbol__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"target_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeSetupV3"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/chart/{symbol}":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Chart Indicators","description":"Fetch pre-calculated indicators for high-precision charting.\nThis ensures the 'lines on the chart' match the 'signals in the table'.\n\nArgs:\n    symbol: Stock ticker symbol\n    days: Days of history to fetch\n    timeframe: \"daily\" (1D) or \"weekly\" (1W)\n\nReturns row-oriented data: [{\"date\": \"2024-01-01\", \"indicator_name\": \"rsi_14\", \"value\": 55.2}, ...]\nFrontend adapter will convert to columnar format.","operationId":"get_v3_chart_indicators_api_v3_chart__symbol__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Days"}},{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","default":"daily","title":"Timeframe"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/chart/{symbol}/prices":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Chart Prices","description":"Fetch OHLCV price data for candlestick charting.\n\nReturns columnar arrays aligned with dates for LightweightCharts integration.","operationId":"get_v3_chart_prices_api_v3_chart__symbol__prices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/watchlist":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Watchlist","description":"Get user's current watchlist symbols.","operationId":"get_v3_watchlist_api_v3_watchlist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/watchlist/add":{"post":{"tags":["V3 Institutional Engine"],"summary":"Add V3 Watchlist","description":"Add a symbol to user's watchlist.\n\nArgs:\n    symbol: Stock ticker symbol (query parameter, kept for backward compatibility)\n    current_user: Authenticated user from JWT\n    ops: Database operations\n\nReturns:\n    {\"status\": \"success\"|\"already_exists\", \"symbol\": \"AAPL\"}","operationId":"add_v3_watchlist_api_v3_watchlist_add_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","description":"Ticker symbol (e.g., AAPL)","title":"Symbol"},"description":"Ticker symbol (e.g., AAPL)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/watchlist/add-bulk":{"post":{"tags":["V3 Institutional Engine"],"summary":"Add V3 Watchlist Bulk","description":"Bulk add multiple symbols to watchlist. Deduplicates and reports results.\n\nRequest body: {\"symbols\": [\"AAPL\", \"MSFT\", ...]}\nResponse: {\"added\": [...], \"already_existed\": [...], \"failed\": [...]}","operationId":"add_v3_watchlist_bulk_api_v3_watchlist_add_bulk_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/watchlist/{symbol}":{"delete":{"tags":["V3 Institutional Engine"],"summary":"Remove V3 Watchlist","description":"Remove a symbol from user's watchlist.","operationId":"remove_v3_watchlist_api_v3_watchlist__symbol__delete","security":[{"HTTPBearer":[]}],"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/v3/sync":{"post":{"tags":["V3 Institutional Engine"],"summary":"Sync V3 Watchlist","description":"Admin only: Manually trigger the institutional audit cycle.","operationId":"sync_v3_watchlist_api_v3_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbols","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbols"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/watchlist-stats":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Admin Watchlist Stats","description":"Admin only: Get global statistics on watchlist health.","operationId":"get_v3_admin_watchlist_stats_api_v3_admin_watchlist_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/admin/watchlists":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get V3 Admin Watchlists","description":"Admin only: List all user watchlists with duplicate detection.","operationId":"get_v3_admin_watchlists_api_v3_admin_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/admin/watchlists/{user_id}/deduplicate":{"post":{"tags":["V3 Institutional Engine"],"summary":"Deduplicate V3 Watchlist","description":"Admin only: Remove duplicate entries for a user's watchlist.","operationId":"deduplicate_v3_watchlist_api_v3_admin_watchlists__user_id__deduplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","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/v3/admin/users":{"get":{"tags":["V3 Institutional Engine"],"summary":"List V3 Users","description":"Admin only: List all users.","operationId":"list_v3_users_api_v3_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/admin/users/{user_id}/role":{"post":{"tags":["V3 Institutional Engine"],"summary":"Update V3 User Role","description":"Admin only: Update a user's role.","operationId":"update_v3_user_role_api_v3_admin_users__user_id__role_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"role","in":"query","required":true,"schema":{"type":"string","pattern":"^(admin|user)$","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/users/{user_id}/status":{"post":{"tags":["V3 Institutional Engine"],"summary":"Update V3 User Status","description":"Admin only: Update a user's status.","operationId":"update_v3_user_status_api_v3_admin_users__user_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","pattern":"^(active|disabled|pending)$","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/options-unusual/rankings":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get Universe Options Unusual Rankings","description":"Latest-session watchlist rankings of unusual options activity.\n\nOne session only: the newest options snapshot among the caller's allowed\nsymbols. A symbol with no snapshot that day is left out. Older sessions\nare not searched and are not returned.\n\nOne ranking item = one (symbol, dte_bucket) — the highest-scoring contract\nthat symbol has in that canonical bucket — with bucket-level volume/notional\nrollups. The symbol list is the caller's allowed watchlist (free plans only\nsee free_tier names). Off-watchlist symbols are excluded for every plan.\n\nResponse JSON:\n    {\n      \"anchor_date\": \"YYYY-MM-DD\" | null,   # the latest session used\n      \"rankings\": [\n        {\n          \"symbol\": str,\n          \"dte_bucket\": \"ST\" | \"MID\" | \"LT\",\n          \"unusual_score\": float,            # the bucket's top contract score\n          \"total_volume\": int,               # bucket call+put volume\n          \"total_notional\": float,\n          \"max_session_rvol\": float | null,\n          \"max_vol_to_oi\": float | null,\n          \"contract_count\": int,\n          \"top_strikes\": [                    # up to 5, by volume DESC\n            { \"strike\": float, \"option_type\": \"call\"|\"put\",\n              \"volume\": int, \"unusual_score\": float,\n              \"inferred_action\": str }\n          ]\n        }\n      ]\n    }","operationId":"get_universe_options_unusual_rankings_api_v3_options_unusual_rankings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bucket","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Canonical DTE bucket (ST, MID, or LT)","title":"Bucket"},"description":"Canonical DTE bucket (ST, MID, or LT)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Max rankings to return","default":20,"title":"Limit"},"description":"Max rankings to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Universe Options Unusual Rankings Api V3 Options Unusual Rankings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/dashboard/key-dates":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get Dashboard Key Dates","description":"Get upcoming key economic dates and recently-realized events.\n\nReturns:\n    KeyDatesResponse with:\n    - week: Current week's date range (Monday-Sunday ET)\n    - upcoming: Events from today through the next 21 days (realized_at IS NULL)\n    - realized: Recently realized events (past 2 trading days), sorted by date DESC, LIMIT 15\n\nEach event includes: date, event_name, category, sentiment, impact, market_reaction_pct, realized_at","operationId":"get_dashboard_key_dates_api_v3_dashboard_key_dates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyDatesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/dashboard/sentiment":{"get":{"tags":["V3 Institutional Engine"],"summary":"Get Dashboard Sentiment","description":"Get the latest Fed/Macro sentiment research snapshot.\n\nReturns {\"fed\": {...}} where the value is the dict shape produced by\nDatabaseOperations.get_latest_sentiment_snapshot (sentiment_label, score,\nrationale, headlines, research_date), or {\"fed\": null} if the Fed/Sector\nresearch batch job hasn't produced a snapshot yet — this is a normal,\nexpected state, not an error.","operationId":"get_dashboard_sentiment_api_v3_dashboard_sentiment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Dashboard Sentiment Api V3 Dashboard Sentiment Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/settings/admin/global":{"get":{"tags":["settings"],"summary":"Get All Global Settings","description":"Fetch all global configuration records (Admin only).\n\nReturns a list of {key, value, updated_at} dicts with all system-level settings.","operationId":"get_all_global_settings_api_v3_settings_admin_global_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/settings/admin/global/{key}":{"patch":{"tags":["settings"],"summary":"Update Global Setting","description":"Update a specific global config value (Admin only).\n\nArgs:\n    key: Setting key (e.g., 'aplus_chart_min', 'data_provider', 'ingestion_interval_seconds')\n    update: Payload with new 'value' field\n\nReturns:\n    {status: \"success\", message: \"...\"} on success\n\nRaises:\n    500: Database update failed","operationId":"update_global_setting_api_v3_settings_admin_global__key__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalSettingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/settings/user/preferences":{"get":{"tags":["settings"],"summary":"Get User Preferences","description":"Fetch personal settings_json for the current user.\n\nReturns:\n    Dict[str, Any]: User's settings object (e.g., {min_vol_oi: 2.5, ...})","operationId":"get_user_preferences_api_v3_settings_user_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["settings"],"summary":"Update User Preferences","description":"Update personal settings_json for the current user.\n\nArgs:\n    update: Payload with 'settings' dict to merge/replace\n\nReturns:\n    {status: \"success\"} on success\n\nRaises:\n    500: Database update failed","operationId":"update_user_preferences_api_v3_settings_user_preferences_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPreferencesUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authenticate with database credentials and return JWT tokens.","operationId":"login_api_v3_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","description":"Exchange a valid refresh token for a new access token.","operationId":"refresh_token_api_v3_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Update password for the currently authenticated user.","operationId":"change_password_api_v3_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/auth/accept-terms":{"post":{"tags":["auth"],"summary":"Accept Terms","description":"Mark the authenticated user as having accepted the terms & conditions.","operationId":"accept_terms_api_v3_auth_accept_terms_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Return the authenticated user's profile from the token payload.","operationId":"get_me_api_v3_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Register a free account. It is active immediately, with a short trial.","operationId":"register_api_v3_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email","description":"Verify a user's email address using the token sent via email.","operationId":"verify_email_api_v3_auth_verify_email_get","parameters":[{"name":"token","in":"query","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/v3/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Resend the verification email. Regenerates token if user exists and email not yet verified.\n\nReturns the same success message regardless of whether the email exists (prevents enumeration).","operationId":"resend_verification_api_v3_auth_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Resend Verification Api V3 Auth Resend Verification Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Email a one-hour reset link. The response does not say whether the address exists.","operationId":"forgot_password_api_v3_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Set a new password from a reset link. The token works once.","operationId":"reset_password_api_v3_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/facebook/data-deletion":{"post":{"tags":["auth"],"summary":"Facebook Data Deletion","description":"Facebook asked to drop its link. The Momentum Analyzer account stays.","operationId":"facebook_data_deletion_api_v3_auth_facebook_data_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v3/auth/facebook/deletion-status":{"get":{"tags":["auth"],"summary":"Facebook Deletion Status","operationId":"facebook_deletion_status_api_v3_auth_facebook_deletion_status_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/delete-account":{"post":{"tags":["auth"],"summary":"Delete Account","description":"Delete the signed-in account. Admin accounts stay.","operationId":"delete_account_api_v3_auth_delete_account_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/feedback":{"post":{"tags":["telemetry"],"summary":"Submit V3 Feedback","description":"Submit user feedback. The message is written to the API log.","operationId":"submit_v3_feedback_api_v3_feedback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/ticker/{symbol}/scan":{"get":{"tags":["ticker"],"summary":"Get Scan Symbol","description":"Get comprehensive scan data for a symbol (ticker deep-dive page data).\n\nReturns the same signal shape as dashboard but for a single symbol with\nadditional fundamentals data including PE ratio, market cap, ROE, debt ratio,\nbeta, and short interest.\n\nAuthorization: every caller is limited to the global watchlist. Free plans\nonly see symbols marked free_tier.","operationId":"get_scan_symbol_api_v3_ticker__symbol__scan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Scan Symbol Api V3 Ticker  Symbol  Scan Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/indicators":{"get":{"tags":["ticker"],"summary":"Get Ticker Indicators","description":"Get technical indicators (MACD, RSI, Williams %R, ATR) for a symbol from V3 Cache.\n\n`timeframe` selects the cache rows. It defaults to daily (`1D`). `1W`,\n`daily`, and `weekly` are also accepted. Daily and weekly values for the\nsame date are stored as separate rows and are not mixed.\n\nAuthorization: every caller is limited to the global watchlist. History is\ncapped by plan (free and trial 60 days, paid 252, admin 1825).","operationId":"get_ticker_indicators_api_v3_ticker__symbol__indicators_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days"}},{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","default":"1D","title":"Timeframe"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticker Indicators Api V3 Ticker  Symbol  Indicators Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/chart-image":{"get":{"tags":["ticker"],"summary":"Get Ticker Chart Image","description":"Rendered candlestick chart with indicators and tactical levels as a PNG image.\nThe single-timeframe ground truth text caption is returned in the X-Chart-Caption header.","operationId":"get_ticker_chart_image_api_v3_ticker__symbol__chart_image_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","pattern":"^(1D|1W|1d|1w|daily|weekly)$","default":"1D","title":"Timeframe"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","pattern":"^(6M|2Y|6m|2y)$","default":"6M","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/flow":{"get":{"tags":["ticker"],"summary":"Get Ticker Flow","description":"Get options flow breakdown by DTE bucket for today.\n\nReturns call vs put volume aggregated into DTE (Days To Expiration) buckets:\n0-7 days, 8-30 days, 31-90 days, 91+ days. Also computes net delta exposure\nand returns real S1/S2/S3 signal scores from the database.\n\nArgs:\n    symbol: Stock ticker symbol (e.g., AAPL)\n    current_user: Authenticated user from JWT token\n\nReturns:\n    dict with buckets (call/put volumes by DTE), net_delta, s1_score, s2_score, s3_score, s4_signal, s5_intent\n\nRaises:\n    HTTPException: 400 if symbol invalid","operationId":"get_ticker_flow_api_v3_ticker__symbol__flow_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticker Flow Api V3 Ticker  Symbol  Flow Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/fundamentals":{"get":{"tags":["ticker"],"summary":"Get Ticker Fundamentals","description":"Get comprehensive fundamentals data for a symbol (lazy-loaded).\n\nThis endpoint returns ONLY fundamentals data without chart/signal data,\nintended for lazy-loading when user expands the fundamentals panel.\n\nReturns 34+ fundamental fields organized by category.","operationId":"get_ticker_fundamentals_api_v3_ticker__symbol__fundamentals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticker Fundamentals Api V3 Ticker  Symbol  Fundamentals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/sentiment":{"get":{"tags":["ticker"],"summary":"Get Ticker Sentiment","description":"Get this ticker's sector and that sector's latest sentiment research snapshot.\n\n`sector`/`sentiment` are null (not 404) when the ticker has no sector on\nfile or its sector hasn't been researched yet — both are normal, expected\nstates, mirroring the graceful degradation in\nv2/services/sentiment_research.py::enrich_ticker_sentiment.","operationId":"get_ticker_sentiment_api_v3_ticker__symbol__sentiment_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticker Sentiment Api V3 Ticker  Symbol  Sentiment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/recompute":{"post":{"tags":["ticker"],"summary":"Recompute Ticker Signals","description":"Trigger single-symbol V2 continuous-conviction recalculation for today.","operationId":"recompute_ticker_signals_api_v3_ticker__symbol__recompute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recompute Ticker Signals Api V3 Ticker  Symbol  Recompute Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/trend-history":{"get":{"tags":["ticker"],"summary":"Get Trend History","description":"Return last N days of trend snapshots for the phase history strip.\nResponse: {symbol, history: [{date, phase, conviction_score,\n           weekly_uber_trend, daily_uber_trend, daily_st_trend}]}","operationId":"get_trend_history_api_v3_ticker__symbol__trend_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trend History Api V3 Ticker  Symbol  Trend History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/zones":{"get":{"tags":["ticker"],"summary":"Get Ticker Zones","description":"Get S/R zones for a ticker, ordered by display score.\nReturns top 3 supports, 3 resistances, 2 balance zones.","operationId":"get_ticker_zones_api_v3_ticker__symbol__zones_get","security":[{"HTTPBearer":[]}],"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/v3/ticker/{symbol}/unusual-volumes":{"get":{"tags":["ticker"],"summary":"Get Unusual Volumes","description":"Get option strikes with unusual volume for a symbol.\n\nReturns list of option strikes where today's volume exceeds the historical average\nby the specified multiplier (default 1.5x). This helps identify unusual options flow.\n\nArgs:\n    symbol: Stock ticker symbol (e.g., AAPL)\n    option_type: \"call\" or \"put\" (default \"call\")\n    multiplier: Volume threshold as multiple of average (default 1.5 = 50% above average)\n    current_user: Authenticated user from JWT token\n\nReturns:\n    dict with unusual_volumes array containing strikes with high activity","operationId":"get_unusual_volumes_api_v3_ticker__symbol__unusual_volumes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"option_type","in":"query","required":false,"schema":{"type":"string","description":"call, put, or all","default":"all","title":"Option Type"},"description":"call, put, or all"},{"name":"multiplier","in":"query","required":false,"schema":{"type":"number","description":"Volume multiple threshold (default 1.5x average)","default":1.5,"title":"Multiplier"},"description":"Volume multiple threshold (default 1.5x average)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Unusual Volumes Api V3 Ticker  Symbol  Unusual Volumes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/options-audit":{"get":{"tags":["ticker"],"summary":"Get Options Audit","description":"Last sessions of the options regime for the signal-audit strip.\n\nOne row per session. S1 is bucket volume versus the usual day, S2 is\nopen-interest exposure by side and regime, S3 is last versus VWAP.","operationId":"get_options_audit_api_v3_ticker__symbol__options_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Options Audit Api V3 Ticker  Symbol  Options Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/options-unusual":{"get":{"tags":["ticker"],"summary":"Get Options Unusual Session Summary","description":"Session-only DTE-bucket unusual-activity summary.\n\nSESSION-ONLY: parent summary over the same canonical unusual-activity\nselector used by bucket and strike details. Call/put volume is activity\ncomposition; net OI change is non-directional.\n\nResponse JSON (NEW session shape — frontend must match this):\n    {\n      \"symbol\": str,\n      \"underlying_price\": float,           # spot at the EOD anchor\n      \"anchor_date\": \"YYYY-MM-DD\" | null,\n      \"view\": \"combined\" | \"calls\" | \"puts\",\n      \"contracts\": [                       # flat, ranked by unusual_score DESC\n        { \"strike\": float, \"option_type\": \"call\"|\"put\", \"expiry\": \"YYYY-MM-DD\",\n          \"dte\": int, \"dte_bucket\": \"ST\"|\"MID\"|\"LT\",\n          \"volume\": int, \"open_interest\": int, \"prior_day_oi\": int|null,\n          \"prior_oi_date\": str|null, \"volume_to_prior_cleared_oi\": float|null,\n          \"premium\": float, \"estimated_notional\": float,\n          \"estimated_notional_basis\": \"volume * snapshot_last_price * 100\",\n          \"unusual_score\": float, \"contract_session_rvol\": float|null,\n          \"delta\": float, \"gamma\": float, \"theta\": float, \"vega\": float, \"iv\": float,\n          \"net_oi_change\": int|null, \"oi_change_as_of\": str|null,\n          \"directional_intent\": \"unknown\" }\n      ],\n      \"buckets_summary\": [                 # one per tenor, for section headers\n        { \"dte_bucket\": \"ST\"|\"MID\"|\"LT\", \"count\": int,\n          \"call_volume\": int, \"put_volume\": int,\n          \"estimated_total_notional\": float, \"call_volume_bias\": str }\n      ]\n    }\nThe frontend groups `contracts` by `dte_bucket` into ST/MID/LT sections and\nuses `buckets_summary` for the section headers. `view` filters call/put side.","operationId":"get_options_unusual_session_summary_api_v3_ticker__symbol__options_unusual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EOD anchor date (YYYY-MM-DD); defaults to latest","title":"Date"},"description":"EOD anchor date (YYYY-MM-DD); defaults to latest"},{"name":"view","in":"query","required":false,"schema":{"type":"string","description":"combined, calls, or puts","default":"combined","title":"View"},"description":"combined, calls, or puts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Options Unusual Session Summary Api V3 Ticker  Symbol  Options Unusual Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/options-unusual/{dte_bucket}":{"get":{"tags":["ticker"],"summary":"Get Options Unusual Bucket Detail","description":"Session-only strike ladder for one canonical DTE bucket (ST / MID / LT).\n\nSESSION-ONLY: served from db.get_session_unusual() filtered to `dte_bucket`.\nThe legacy interval-mode branch and the interval tables are gone.\n\nResponse JSON (NEW session shape — frontend must match this):\n    {\n      \"symbol\": str,\n      \"dte_bucket\": \"ST\" | \"MID\" | \"LT\",\n      \"underlying_price\": float,\n      \"anchor_date\": \"YYYY-MM-DD\" | null,\n      \"view\": \"combined\" | \"calls\" | \"puts\",\n      \"bucket_metrics\": {\n        \"dte_bucket\": str,\n        \"unusual_score\": float,        # max contract score in bucket\n        \"total_volume\": int,\n        \"call_volume\": int,\n        \"put_volume\": int,\n        \"call_put_ratio\": float,\n          \"estimated_total_notional\": float,\n          \"max_contract_session_rvol\": float | null,\n        \"max_volume_to_prior_cleared_oi\": float | null,\n        \"contract_count\": int\n      },\n      \"strike_ladder\": [               # one row per contract, score DESC\n        {\n          \"strike\": float,\n          \"option_type\": \"call\" | \"put\",\n          \"expiration_date\": \"YYYY-MM-DD\",\n          \"dte\": int,\n          \"volume\": int,\n          \"open_interest\": int,\n          \"prior_day_oi\": int | null,\n          \"prior_oi_date\": \"YYYY-MM-DD\" | null,\n          \"volume_to_prior_cleared_oi\": float | null,\n          \"contract_session_rvol\": float | null,\n          \"bucket_session_rvol\": float | null,\n          \"unusual_score\": float,\n          \"qualifies_on\": list,\n          \"score_components\": dict, \"score_weights_used\": dict, \"score_coverage\": str,\n          \"estimated_notional\": float,\n          \"estimated_notional_basis\": \"volume * snapshot_last_price * 100\",\n          \"premium\": float,           # snapshot last_price; not an execution print\n          \"delta\": float, \"gamma\": float, \"theta\": float, \"vega\": float, \"iv\": float,\n          \"net_oi_change\": int|null, \"oi_change_as_of\": \"YYYY-MM-DD\"|null,\n          \"directional_intent\": \"unknown\", \"distance_pct_spot\": float|null\n        }\n      ]\n    }\nUnder view=calls/puts the ladder is filtered to that side and re-sorted by\nthat side's volume; otherwise ordered by unusual_score DESC.","operationId":"get_options_unusual_bucket_detail_api_v3_ticker__symbol__options_unusual__dte_bucket__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"dte_bucket","in":"path","required":true,"schema":{"type":"string","title":"Dte Bucket"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EOD anchor date (YYYY-MM-DD); defaults to latest","title":"Date"},"description":"EOD anchor date (YYYY-MM-DD); defaults to latest"},{"name":"view","in":"query","required":false,"schema":{"type":"string","description":"combined, calls, or puts","default":"combined","title":"View"},"description":"combined, calls, or puts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Options Unusual Bucket Detail Api V3 Ticker  Symbol  Options Unusual  Dte Bucket  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/options-unusual/{dte_bucket}/strike/{strike}":{"get":{"tags":["ticker"],"summary":"Get Options Unusual Strike Detail","description":"Session-only per-contract detail for one strike inside a canonical DTE bucket.\n\nSESSION-ONLY: served from the canonical unusual-activity selector. Net OI\nchanges are non-directional and delayed; trade intent remains unknown.\n\nResponse JSON (NEW session shape — frontend must match this):\n    {\n      \"symbol\": str,\n      \"strike\": float,\n      \"dte_bucket\": \"ST\" | \"MID\" | \"LT\",\n      \"anchor_date\": \"YYYY-MM-DD\" | null,\n      \"contracts\": [                 # call/put legs at this strike in the bucket\n        {\n          \"expiration_date\": \"YYYY-MM-DD\",\n          \"option_type\": \"call\" | \"put\",\n          \"dte\": int,\n          \"premium\": float,          # = last_price (bid/ask are 0 in source)\n          \"volume\": int,\n          \"open_interest\": int,\n          \"prior_day_oi\": int | null,\n          \"prior_oi_date\": \"YYYY-MM-DD\" | null,\n          \"volume_to_prior_cleared_oi\": float | null,\n          \"contract_session_rvol\": float | null,\n          \"bucket_session_rvol\": float | null,\n          \"unusual_score\": float,\n          \"qualifies_on\": list,\n          \"estimated_notional\": float,\n          \"estimated_notional_basis\": \"volume * snapshot_last_price * 100\",\n          \"delta\": float, \"gamma\": float, \"theta\": float, \"vega\": float, \"iv\": float,\n          \"net_oi_change\": int | null, \"oi_change_as_of\": \"YYYY-MM-DD\" | null,\n          \"directional_intent\": \"unknown\"\n        }\n      ]\n    }","operationId":"get_options_unusual_strike_detail_api_v3_ticker__symbol__options_unusual__dte_bucket__strike__strike__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"dte_bucket","in":"path","required":true,"schema":{"type":"string","title":"Dte Bucket"}},{"name":"strike","in":"path","required":true,"schema":{"type":"number","title":"Strike"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EOD anchor date (YYYY-MM-DD); defaults to latest","title":"Date"},"description":"EOD anchor date (YYYY-MM-DD); defaults to latest"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Options Unusual Strike Detail Api V3 Ticker  Symbol  Options Unusual  Dte Bucket  Strike  Strike  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/signal-brief":{"get":{"tags":["ticker"],"summary":"Get Signal Brief","description":"Get the latest signal brief for a symbol, including outcome if resolved.","operationId":"get_signal_brief_api_v3_ticker__symbol__signal_brief_get","security":[{"HTTPBearer":[]}],"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/v3/ticker/{symbol}/signal-briefs":{"get":{"tags":["ticker"],"summary":"Get Signal Briefs","description":"Get signal brief history for a symbol.\n\nEach brief's positions are enriched with `unrealized_pnl_pct` computed\nserver-side against the latest scan price (STOCK positions only — option\nmids aren't surfaced here).","operationId":"get_signal_briefs_api_v3_ticker__symbol__signal_briefs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"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/v3/ticker/grade-strategies":{"get":{"tags":["ticker"],"summary":"Get Grade Strategies","description":"Enabled grade strategies. No performance block. No symbol, so the watchlist does not apply. The call still counts against the plan quota.","operationId":"get_grade_strategies_api_v3_ticker_grade_strategies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/ticker/{symbol}/stock-candidates":{"get":{"tags":["ticker"],"summary":"Get Stock Candidates","description":"Latest stock candidate in plain sentences. A candidate, not a trade.","operationId":"get_stock_candidates_api_v3_ticker__symbol__stock_candidates_get","security":[{"HTTPBearer":[]}],"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/v3/ticker/{symbol}/option-candidates":{"get":{"tags":["ticker"],"summary":"Get Option Candidates","description":"The four option-candidate slots for the latest session, including empty ones.","operationId":"get_option_candidates_api_v3_ticker__symbol__option_candidates_get","security":[{"HTTPBearer":[]}],"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/v3/ticker/{symbol}/strategy-trades":{"get":{"tags":["ticker"],"summary":"Get Strategy Trades","description":"Active and recent closed trades for the grade strategies on this symbol.\n\nBuy C, sell A is the first strategy. The fill is the price copied when the\ngrade changed. An open trade includes unrealized P&L against the latest\nstored setup price.","operationId":"get_strategy_trades_api_v3_ticker__symbol__strategy_trades_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"strategy_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id"}},{"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/v3/ticker/{symbol}/signal-briefs/closed-positions":{"get":{"tags":["ticker"],"summary":"Get Closed Positions","description":"Get last N closed/expired positions for a symbol.","operationId":"get_closed_positions_api_v3_ticker__symbol__signal_briefs_closed_positions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"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/v3/ticker/{symbol}/signal-brief/{brief_id}/outcome":{"post":{"tags":["ticker"],"summary":"Record Signal Brief Outcome","description":"Record the outcome of a signal brief.","operationId":"record_signal_brief_outcome_api_v3_ticker__symbol__signal_brief__brief_id__outcome_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"brief_id","in":"path","required":true,"schema":{"type":"string","title":"Brief Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Outcome Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/strategies/{strategy_id}":{"get":{"tags":["strategies"],"summary":"Get Strategy Book","description":"Open paper positions, recent closes, the record, and the next paper candidates.\n\nThis does not run the funnel and it does not place orders.","operationId":"get_strategy_book_api_v3_strategies__strategy_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Strategy Book Api V3 Strategies  Strategy Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/ticker/{symbol}/prices":{"get":{"summary":"Get Ticker Prices","description":"Get historical OHLCV data for a ticker (for price chart visualization).\n\nArgs:\n    symbol: Stock ticker symbol (e.g., AAPL)\n    days: Days of history requested. The plan cap is applied in SQL\n        (free and trial 60, paid 252, admin 1825). A larger value is clamped.\n    timeframe: Aggregation timeframe ('daily', 'weekly', 'monthly', 'quarterly')\n\nReturns:\n    dict with arrays: dates, open, high, low, close, volume (for LightweightCharts)","operationId":"get_ticker_prices_api_v3_ticker__symbol__prices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":365,"title":"Days"}},{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","default":"daily","title":"Timeframe"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Authorization Server","operationId":"oauth_authorization_server__well_known_oauth_authorization_server_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Oauth Authorization Server","operationId":"oauth_authorization_server__well_known_oauth_authorization_server_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"summary":"Oauth Protected Resource","operationId":"oauth_protected_resource__well_known_oauth_protected_resource_mcp_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Oauth Protected Resource","operationId":"oauth_protected_resource__well_known_oauth_protected_resource_mcp_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/consent":{"get":{"summary":"Mcp Consent Page","operationId":"mcp_consent_page_mcp_consent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Mcp Consent Submit","operationId":"mcp_consent_submit_mcp_consent_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_mcp_consent_submit_mcp_consent_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/connections":{"get":{"summary":"Mcp Connections","operationId":"mcp_connections_mcp_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/mcp/connections/{family_id}":{"delete":{"summary":"Mcp Revoke Connection","operationId":"mcp_revoke_connection_mcp_connections__family_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"family_id","in":"path","required":true,"schema":{"type":"string","title":"Family Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/watchlist/{symbol}/tier":{"post":{"summary":"Set Watchlist Tier","description":"Update only free_tier and instrument_kind for one global-watchlist symbol.","operationId":"set_watchlist_tier_api_v3_admin_watchlist__symbol__tier_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistTierUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/watchlist/tiers":{"get":{"summary":"List Watchlist Tiers","description":"Tier flags for the global watchlist. Does not return prices or briefs.","operationId":"list_watchlist_tiers_api_v3_admin_watchlist_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/admin/users/plans":{"get":{"summary":"List User Plans","description":"Plan and trial end for every user. No other user columns.","operationId":"list_user_plans_api_v3_admin_users_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v3/admin/users/{user_id}/plan":{"post":{"summary":"Set User Plan","description":"Set plan to paid, or to restricted free with trial_ends_at cleared.\n\nPaid updates only ``plan``. It does not clear ``trial_ends_at``.\nFree sets ``plan`` to free and ``trial_ends_at`` to NULL. That is a\nrestricted free account, not a new trial.","operationId":"set_user_plan_api_v3_admin_users__user_id__plan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPlanUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/egress/patterns":{"get":{"summary":"Egress Patterns","description":"Abuse patterns computed from egress metadata. No response bodies.","operationId":"egress_patterns_api_v3_admin_egress_patterns_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/egress/events":{"get":{"summary":"Egress Events","description":"Recent egress metadata for one user or all users. No response body.","operationId":"egress_events_api_v3_admin_egress_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/admin/users/{user_id}/mcp-connections":{"get":{"summary":"List User Mcp Connections","description":"List one user's MCP token families. No token hashes or secrets.","operationId":"list_user_mcp_connections_api_v3_admin_users__user_id__mcp_connections_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","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/v3/admin/users/{user_id}/mcp-connections/{family_id}/revoke":{"post":{"summary":"Revoke User Mcp Connection","description":"Revoke one user's MCP token family by setting revoked_at.","operationId":"revoke_user_mcp_connection_api_v3_admin_users__user_id__mcp_connections__family_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"family_id","in":"path","required":true,"schema":{"type":"string","title":"Family Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_mcp_consent_submit_mcp_consent_post":{"properties":{"request_id":{"type":"string","title":"Request Id"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["request_id","decision"],"title":"Body_mcp_consent_submit_mcp_consent_post"},"ChangePasswordRequest":{"properties":{"old_password":{"type":"string","title":"Old Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"ChangePasswordRequest","description":"Request to update user password."},"DashboardCardV3":{"properties":{"symbol":{"type":"string","title":"Symbol"},"company_name":{"type":"string","title":"Company Name"},"sector":{"type":"string","title":"Sector","default":"Unknown"},"setup_grade":{"type":"string","title":"Setup Grade"},"conviction_score":{"type":"number","title":"Conviction Score","default":0.0},"flow_score":{"type":"number","title":"Flow Score","default":0.0},"technical_pillar":{"type":"number","title":"Technical Pillar","default":0.0},"options_pillar":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Options Pillar"},"options_moving":{"type":"string","title":"Options Moving","default":"No read"},"fundamentals_pillar":{"type":"number","title":"Fundamentals Pillar","default":0.0},"price_pillar":{"type":"number","title":"Price Pillar","default":0.0},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Pct"},"change_abs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Abs"},"volume_participation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Volume Participation"},"opening_volume":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Opening Volume"},"flow_type":{"type":"string","title":"Flow Type","default":"mixed"},"summary":{"type":"string","title":"Summary","default":""},"regime":{"type":"string","title":"Regime","default":"NEUTRAL"},"personality":{"type":"string","title":"Personality","default":""},"weekly_trend":{"type":"string","title":"Weekly Trend","default":""},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["symbol","company_name","setup_grade"],"title":"DashboardCardV3","description":"One dashboard card. Scalars only — no trade-plan or factor documents."},"DashboardCardsResponseV3":{"properties":{"cards":{"items":{"$ref":"#/components/schemas/DashboardCardV3"},"type":"array","title":"Cards"},"username":{"type":"string","title":"Username"},"scan_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scan Time"},"options_last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Options Last Updated"}},"type":"object","required":["cards","username"],"title":"DashboardCardsResponseV3","description":"Card list for the dashboard grid."},"DashboardResponseV3":{"properties":{"signals":{"items":{"$ref":"#/components/schemas/TradeSetupV3"},"type":"array","title":"Signals"},"username":{"type":"string","title":"Username"},"scan_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scan Time"},"options_last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Options Last Updated"}},"type":"object","required":["signals","username"],"title":"DashboardResponseV3","description":"Consolidated V3 Dashboard response with metadata."},"DeleteAccountRequest":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"confirm_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirm Email"}},"type":"object","title":"DeleteAccountRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GlobalSettingUpdate":{"properties":{"value":{"title":"Value"}},"type":"object","required":["value"],"title":"GlobalSettingUpdate","description":"Update payload for a global setting."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"KeyDatesResponse":{"properties":{"week":{"$ref":"#/components/schemas/KeyDatesWeekInfo","description":"Current week date range in ET"},"upcoming":{"items":{"$ref":"#/components/schemas/KeyEconomicDate"},"type":"array","title":"Upcoming","description":"Events from today through the next 21 days (not yet realized)"},"realized":{"items":{"$ref":"#/components/schemas/KeyEconomicDate"},"type":"array","title":"Realized","description":"Recently realized events (past 2 trading days)"}},"type":"object","required":["week"],"title":"KeyDatesResponse","description":"Response model for dashboard key dates endpoint."},"KeyDatesWeekInfo":{"properties":{"start":{"type":"string","format":"date","title":"Start","description":"Monday of the week"},"end":{"type":"string","format":"date","title":"End","description":"Sunday of the week"}},"type":"object","required":["start","end"],"title":"KeyDatesWeekInfo","description":"Week date range information."},"KeyEconomicDate":{"properties":{"date":{"type":"string","format":"date","title":"Date","description":"Event date"},"event_name":{"type":"string","maxLength":200,"title":"Event Name","description":"Name of the economic event"},"category":{"type":"string","maxLength":50,"title":"Category","description":"Event category (Fed, Jobs, Inflation, etc.)"},"sentiment":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Sentiment","description":"Sentiment label (Bullish, Bearish, Neutral, etc.)"},"impact":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Impact","description":"Impact level (High, Medium, Low)"},"market_reaction_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Reaction Pct","description":"Market reaction percentage (e.g., SPY move)"},"realized_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Realized At","description":"When the event was realized/published"},"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["date","event_name","category","id","created_at"],"title":"KeyEconomicDate","description":"Full economic calendar event model with ID and metadata."},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest","description":"Login credentials."},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest","description":"Refresh token payload."},"RegisterRequest":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"type":"string","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["email","password","confirm_password"],"title":"RegisterRequest","description":"User registration request.\n\n``username`` may be omitted. The account then uses the email address as\nits username. An existing account is not renamed."},"RegisterResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"RegisterResponse","description":"Response from registration endpoint."},"ResendVerificationRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationRequest","description":"Request to resend verification email."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","minLength":20,"title":"Token"},"password":{"type":"string","minLength":8,"title":"Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["token","password","confirm_password"],"title":"ResetPasswordRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"has_accepted_terms":{"type":"boolean","title":"Has Accepted Terms","default":false}},"type":"object","required":["access_token","refresh_token"],"title":"TokenResponse","description":"JWT token pair returned on successful login."},"TradeSetupV3":{"properties":{"symbol":{"type":"string","maxLength":10,"minLength":1,"title":"Symbol"},"date":{"type":"string","format":"date","title":"Date"},"snapshot_time":{"type":"string","format":"date-time","title":"Snapshot Time"},"s1_score":{"type":"number","title":"S1 Score","default":0.0},"s2_score":{"type":"number","title":"S2 Score","default":0.0},"s3_score":{"type":"number","title":"S3 Score","default":0.0},"s4_score":{"type":"number","title":"S4 Score","default":0.0},"s5_score":{"type":"number","title":"S5 Score","default":0.0},"composite_score":{"type":"number","title":"Composite Score","default":0.0},"s4_signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S4 Signal","description":"S4 technical signal category"},"s5_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S5 Intent","description":"S5 dealer intent/sentiment"},"conviction_score":{"type":"number","title":"Conviction Score","default":0.0},"technical_score":{"type":"number","title":"Technical Score","default":0.0},"flow_score":{"type":"number","title":"Flow Score","default":0.0},"fundamentals_score":{"type":"number","title":"Fundamentals Score","default":0.0},"short_score":{"type":"number","title":"Short Score","default":0.0},"news_score":{"type":"number","title":"News Score","default":0.0},"context_score":{"type":"number","title":"Context Score","default":0.0},"technical_pillar":{"type":"number","title":"Technical Pillar","description":"30% weight: technical indicators + MTF + exhaustion","default":0.0},"options_pillar":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Options Pillar","description":"30% weight: mid/long options regime. Null when nothing qualifies."},"options_moving":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Options Moving","description":"Moving up, Moving down, In place, or No read"},"fundamentals_pillar":{"type":"number","title":"Fundamentals Pillar","description":"20% weight: valuation band scoring","default":0.0},"price_pillar":{"type":"number","title":"Price Pillar","description":"20% weight: phase conviction + breakout/change bonuses","default":0.0},"setup_grade":{"type":"string","title":"Setup Grade","description":"A+ | A | B | C (thresholds: ≥80/≥65/≥50)"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"entry_level":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Entry Level"},"stop_loss":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stop Loss"},"target_1":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target 1"},"target_2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target 2"},"star_price":{"type":"boolean","title":"Star Price","default":false},"star_options":{"type":"boolean","title":"Star Options","default":false},"star_technical":{"type":"boolean","title":"Star Technical","default":false},"star_fundamentals":{"type":"boolean","title":"Star Fundamentals","default":false},"stars_aligned":{"type":"integer","title":"Stars Aligned","default":0},"options_flow_score":{"type":"number","title":"Options Flow Score","default":0.0},"price_score":{"type":"number","title":"Price Score","default":0.0},"trade_plan_json":{"additionalProperties":true,"type":"object","title":"Trade Plan Json"},"explanation_json":{"additionalProperties":true,"type":"object","title":"Explanation Json"},"raw_factors_json":{"additionalProperties":true,"type":"object","title":"Raw Factors Json"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["symbol","date","setup_grade","id","created_at"],"title":"TradeSetupV3","description":"Full V3 Trade Setup model with ID and created_at."},"UserPlanUpdate":{"properties":{"plan":{"type":"string","enum":["free","paid"],"title":"Plan"}},"type":"object","required":["plan"],"title":"UserPlanUpdate"},"UserPreferencesUpdate":{"properties":{"settings":{"additionalProperties":true,"type":"object","title":"Settings"}},"type":"object","required":["settings"],"title":"UserPreferencesUpdate","description":"Update payload for user preferences."},"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"},"WatchlistResponse":{"properties":{"watchlist":{"items":{"type":"string"},"type":"array","title":"Watchlist"}},"type":"object","required":["watchlist"],"title":"WatchlistResponse","description":"Simple wrapper for watchlist symbols."},"WatchlistTierUpdate":{"properties":{"free_tier":{"type":"boolean","title":"Free Tier"},"instrument_kind":{"type":"string","enum":["stock","etf"],"title":"Instrument Kind"}},"type":"object","required":["free_tier","instrument_kind"],"title":"WatchlistTierUpdate"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}