{"openapi":"3.1.0","info":{"title":"TV -> Deribit Bridge","version":"0.1.0"},"paths":{"/deribit/summary":{"get":{"tags":["deribit"],"summary":"Deribit Summary","description":"Which environments have keys configured (no exchange calls, no secrets returned).","operationId":"deribit_summary_deribit_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Deribit Summary Deribit Summary Get"}}}}}}},"/deribit/{env}/status":{"get":{"tags":["deribit"],"summary":"Deribit Status For Env","operationId":"deribit_status_for_env_deribit__env__status_get","parameters":[{"name":"env","in":"path","required":true,"schema":{"$ref":"#/components/schemas/DeribitEnv"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deribit Status For Env Deribit  Env  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deribit/{env}/balance":{"get":{"tags":["deribit"],"summary":"Deribit Balance For Env","operationId":"deribit_balance_for_env_deribit__env__balance_get","parameters":[{"name":"env","in":"path","required":true,"schema":{"$ref":"#/components/schemas/DeribitEnv"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deribit Balance For Env Deribit  Env  Balance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deribit/{env}/positions":{"get":{"tags":["deribit"],"summary":"Deribit Positions For Env","operationId":"deribit_positions_for_env_deribit__env__positions_get","parameters":[{"name":"env","in":"path","required":true,"schema":{"$ref":"#/components/schemas/DeribitEnv"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deribit Positions For Env Deribit  Env  Positions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies":{"get":{"tags":["strategies"],"summary":"List Strategies","operationId":"list_strategies_strategies_get","parameters":[{"name":"include_portfolio","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Portfolio"}},{"name":"portfolio_env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"testnet or live; defaults to executor_deribit_env. Used when include_portfolio=true.","title":"Portfolio Env"},"description":"testnet or live; defaults to executor_deribit_env. Used when include_portfolio=true."},{"name":"activity_env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter stats/history by env (testnet/live).","title":"Activity Env"},"description":"Filter stats/history by env (testnet/live)."},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"When activity_env is set, include only strategies with signals/orders in that env.","default":false,"title":"Active Only"},"description":"When activity_env is set, include only strategies with signals/orders in that env."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Strategies Strategies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/provision_testnet":{"post":{"tags":["strategies"],"summary":"Provision Testnet For Strategy","description":"Requires **main** testnet API key with subaccount + transfer permission.\nCreates a new Deribit subaccount and transfers ~allocation_usd worth of BTC from the main wallet.","operationId":"provision_testnet_for_strategy_strategies__strategy_id__provision_testnet_post","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionTestnetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Provision Testnet For Strategy Strategies  Strategy Id  Provision Testnet Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}":{"get":{"tags":["strategies"],"summary":"Strategy Detail","operationId":"strategy_detail_strategies__strategy_id__get","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"signal_limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Signal Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Strategy Detail Strategies  Strategy Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["strategies"],"summary":"Patch Strategy","operationId":"patch_strategy_strategies__strategy_id__patch","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StrategyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Strategy Strategies  Strategy Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/local_history":{"delete":{"tags":["strategies"],"summary":"Delete Strategy Local History","description":"Remove this strategy's rows from the local SQLite log only (signals, orders, portfolio snapshots).\nDoes not change Deribit balances or positions. Use after fixing isolation so old main-wallet\nexecution rows do not appear in the UI.","operationId":"delete_strategy_local_history_strategies__strategy_id__local_history_delete","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 Delete Strategy Local History Strategies  Strategy Id  Local History Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/fund_to_usd":{"post":{"tags":["strategies"],"summary":"Fund Strategy To Usd","description":"Move BTC so the subaccount wallet is ~target_usd (mark-to-market via btc_usd index), set\n``target_notional_usd`` to that value, and optionally clear local logs for a clean analytics start.\nRequires flat BTC-PERP on the subaccount (no open position).","operationId":"fund_strategy_to_usd_strategies__strategy_id__fund_to_usd_post","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundToUsdBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fund Strategy To Usd Strategies  Strategy Id  Fund To Usd Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/close_all_positions":{"post":{"tags":["strategies"],"summary":"Close All Positions For Strategy","description":"Flatten **all** non-zero positions reported by the exchange for this strategy's wallet\n(subaccount OAuth or per-strategy API keys), using **reduce-only** market orders — same\nmechanism as an ``exit`` signal. By default only symbols mapped in the bridge (e.g. BTC\nperp) are closed; set ``only_mapped_symbols`` false to attempt every row (use with care).","operationId":"close_all_positions_for_strategy_strategies__strategy_id__close_all_positions_post","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseAllPositionsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close All Positions For Strategy Strategies  Strategy Id  Close All Positions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/sync_orders":{"post":{"tags":["strategies"],"summary":"Sync Strategy Orders","operationId":"sync_strategy_orders_strategies__strategy_id__sync_orders_post","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Strategy Orders Strategies  Strategy Id  Sync Orders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/reconciliation":{"get":{"tags":["strategies"],"summary":"Strategy Reconciliation","description":"Compare Deribit user trades (CCXT) in the window vs local ``order_records`` for this strategy.\nUseful to spot missing fills, manual/UI orders, or sync gaps.","operationId":"strategy_reconciliation_strategies__strategy_id__reconciliation_get","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"trade_limit","in":"query","required":false,"schema":{"type":"integer","maximum":2500,"minimum":50,"default":400,"title":"Trade Limit"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Strategy Reconciliation Strategies  Strategy Id  Reconciliation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/analytics":{"get":{"tags":["strategies"],"summary":"Strategy Analytics","operationId":"strategy_analytics_strategies__strategy_id__analytics_get","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"points","in":"query","required":false,"schema":{"type":"integer","default":240,"title":"Points"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Strategy Analytics Strategies  Strategy Id  Analytics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/strategies/{strategy_id}/intent_alignment":{"get":{"tags":["strategies"],"summary":"Strategy Intent Alignment","operationId":"strategy_intent_alignment_strategies__strategy_id__intent_alignment_get","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":10,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Strategy Intent Alignment Strategies  Strategy Id  Intent Alignment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/controls/trading_halts":{"get":{"tags":["controls"],"summary":"List Trading Halts","operationId":"list_trading_halts_controls_trading_halts_get","parameters":[{"name":"env","in":"query","required":true,"schema":{"type":"string","title":"Env"}},{"name":"strategy_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Trading Halts Controls Trading Halts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/controls/trading_halts/set_mode":{"post":{"tags":["controls"],"summary":"Set Mode","operationId":"set_mode_controls_trading_halts_set_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradingModeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Mode Controls Trading Halts Set Mode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/controls/trading_halts/flatten_and_pause":{"post":{"tags":["controls"],"summary":"Flatten And Pause","operationId":"flatten_and_pause_controls_trading_halts_flatten_and_pause_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlattenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Flatten And Pause Controls Trading Halts Flatten And Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/monitor/summary":{"get":{"summary":"Monitor Summary","description":"Lightweight ops JSON for external uptime checks (UptimeRobot, etc.).\nRequires MONITOR_TOKEN in .env and matching ?token= or Authorization: Bearer.","operationId":"monitor_summary_monitor_summary_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Monitor Summary Monitor Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ui":{"get":{"summary":"Ui","operationId":"ui_ui_get","parameters":[{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/strategies":{"get":{"summary":"Ui Strategies","operationId":"ui_strategies_ui_strategies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ui/strategies/{strategy_id}":{"get":{"summary":"Ui Strategy One","operationId":"ui_strategy_one_ui_strategies__strategy_id__get","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"string","title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhook/tradingview":{"post":{"summary":"Tradingview Webhook","operationId":"tradingview_webhook_webhook_tradingview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradingViewSignal"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signals":{"get":{"summary":"List Signals","operationId":"list_signals_signals_get","parameters":[{"name":"strategy_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Signals Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/orders":{"get":{"summary":"List Orders","operationId":"list_orders_orders_get","parameters":[{"name":"strategy_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Orders Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/events":{"get":{"summary":"List Events","operationId":"list_events_events_get","parameters":[{"name":"strategy_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id"}},{"name":"env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Events Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CloseAllPositionsBody":{"properties":{"confirm":{"type":"boolean","title":"Confirm","description":"Must be true to execute reduce-only market closes","default":false},"env":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env","description":"testnet or live; defaults to executor_deribit_env"},"only_mapped_symbols":{"type":"boolean","title":"Only Mapped Symbols","description":"If true, only CCXT symbols listed in the bridge map (e.g. BTC-PERPETUAL) are closed.","default":true}},"type":"object","title":"CloseAllPositionsBody"},"DeribitEnv":{"type":"string","enum":["testnet","live"],"title":"DeribitEnv"},"FlattenBody":{"properties":{"env":{"type":"string","title":"Env","description":"testnet or live"},"strategy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id","description":"Optional strategy scope. Null => all known strategies in env."},"only_mapped_symbols":{"type":"boolean","title":"Only Mapped Symbols","default":true},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"}},"type":"object","required":["env"],"title":"FlattenBody"},"FundToUsdBody":{"properties":{"target_usd":{"type":"number","maximum":1000000.0,"minimum":1.0,"title":"Target Usd","description":"Target wallet equity in USD (index mark)","default":20.0},"clear_local_history":{"type":"boolean","title":"Clear Local History","description":"Delete signals, order_records, portfolio_snapshots for this strategy in SQLite after funding.","default":true},"env":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env","description":"testnet or live; defaults to executor_deribit_env"}},"type":"object","title":"FundToUsdBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ProvisionTestnetBody":{"properties":{"allocation_usd":{"type":"number","maximum":1000000.0,"minimum":1.0,"title":"Allocation Usd","description":"Approximate USD to transfer as BTC","default":20.0}},"type":"object","title":"ProvisionTestnetBody"},"StrategyUpdate":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"deribit_subaccount_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deribit Subaccount Label","description":"Deribit subaccount username/label for isolation"},"deribit_subaccount_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deribit Subaccount Id","description":"Deribit subaccount uid (usually set by provision)"},"target_notional_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Target Notional Usd","description":"Planning: USD notional cap / sizing hint"},"max_risk_fraction":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Max Risk Fraction","description":"Optional cap on effective risk_fraction from TradingView for this strategy"},"max_order_usd":{"anyOf":[{"type":"number","minimum":1.0},{"type":"null"}],"title":"Max Order Usd","description":"Optional cap on USD notional per order for this strategy (after global sizing)"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"StrategyUpdate"},"TradingModeBody":{"properties":{"env":{"type":"string","title":"Env","description":"testnet or live"},"mode":{"type":"string","title":"Mode","description":"normal, pause_entries, or hard_stop"},"strategy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Id","description":"Optional strategy scope. Null means global for env."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"}},"type":"object","required":["env","mode"],"title":"TradingModeBody"},"TradingViewSignal":{"properties":{"strategy_id":{"type":"string","title":"Strategy Id","description":"Unique ID for the strategy on our side"},"signal":{"type":"string","enum":["entry_long","entry_short","exit","flip_long","flip_short"],"title":"Signal","description":"Type of signal generated by the strategy"},"symbol":{"type":"string","title":"Symbol","example":"BTC-PERPETUAL"},"timeframe":{"type":"string","title":"Timeframe","example":"1m"},"risk_fraction":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Risk Fraction","description":"Optional suggestion: fraction of subaccount equity to risk"},"bar_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Bar Time","description":"Time of the bar on TradingView side"},"bar_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bar Id","description":"Optional bar index to help deduplication"},"uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uuid","description":"Optional unique identifier from TradingView (e.g. strategy.order.id)"},"intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent Id","description":"Optional logical intent id (stable id for a planned trade decision)"},"signal_seq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Signal Seq","description":"Optional strategy-side increasing sequence number for alignment checks"},"expected_position_after":{"anyOf":[{"type":"string","enum":["long","short","flat"]},{"type":"null"}],"title":"Expected Position After","description":"Optional expected resulting position after this signal (long/short/flat)"},"entry_order_type":{"anyOf":[{"type":"string","enum":["market","limit"]},{"type":"null"}],"title":"Entry Order Type","description":"Optional entry execution preference from TradingView (market/limit). Exit remains reduce-only market."},"entry_limit_price":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Entry Limit Price","description":"Optional explicit limit price for entry when entry_order_type='limit'."},"limit_fallback_to_market":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Limit Fallback To Market","description":"Optional: if limit not filled within timeout, fallback to market entry."},"limit_timeout_seconds":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Limit Timeout Seconds","description":"Optional timeout (seconds) before fallback-to-market for limit entries."},"order_notional_usd":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Order Notional Usd","description":"Optional explicit entry notional (USD) from strategy intent. If set, this overrides risk_fraction sizing base."},"target_position_notional_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Target Position Notional Usd","description":"Optional target absolute position size (USD notional) after signal. Enables pyramiding-style adds/reduces toward target."},"allow_pyramiding":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Pyramiding","description":"Optional hint that same-direction adds are allowed for this signal (used with target_position_notional_usd)."}},"type":"object","required":["strategy_id","signal","symbol","timeframe"],"title":"TradingViewSignal"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}