{"openapi":"3.1.0","info":{"title":"FILTRIX Public API","description":"Historical pattern statistics over Trade-Ideas alerts. Authenticate with `X-API-Key: flt_...` or `Authorization: Bearer flt_...`. Start with GET /api/v1/meta and GET /api/v1/filters. Daily quota per tier, reset at midnight America/New_York.","version":"1.2.0"},"servers":[{"url":"https://filtrix.net"}],"paths":{"/api/v1/backtest":{"post":{"tags":["public-api-v1"],"summary":"Backtest a filter set","description":"Run a historical backtest with the given filters.\nReturns summary statistics, each labeled with its definition and unit,\nplus up to `sample_limit` example events.\n\nRuns the SYNC backtest in a threadpool rather than awaiting the async\nvariant directly: the heavy pandas crunch + per-(symbol,date) sync\npsycopg2 split-adjustment lookups are CPU/IO-blocking, and running them\non the event loop froze the uvicorn worker under parallel load (gunicorn\nSIGABRT'd workers that missed the 120s heartbeat — incident 2026-06-05).\nOffloading keeps the loop responsive and bounds concurrency to the\nthreadpool size, which the psycopg2 pool (maxconn=50) can absorb.","operationId":"api_backtest_api_v1_backtest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screen":{"post":{"tags":["public-api-v1"],"summary":"List matching historical events","description":"Screen historical trading data with filters.\nReturns matching events with limited columns.","operationId":"api_screen_api_v1_screen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ticker/{symbol}":{"get":{"tags":["public-api-v1"],"summary":"Ticker metadata","description":"Get ticker metadata (name, sector, market cap, etc.).","operationId":"api_ticker_info_api_v1_ticker__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TickerInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/filters":{"get":{"tags":["public-api-v1"],"summary":"Search filter columns (no auth)","description":"List filter columns: raw column name (use it verbatim in filters), Trade-Ideas\ncode, display name, description, operators and value type. `q` ranks by\nrelevance; no params returns every column sorted by name.\nNo authentication required (discovery endpoint).","operationId":"api_list_filters_api_v1_filters_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Keywords to search column name, Trade-Ideas code, display name and description","title":"Q"},"description":"Keywords to search column name, Trade-Ideas code, display name and description"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only columns of this value_type (number, string, date, time, enum)","title":"Type"},"description":"Only columns of this value_type (number, string, date, time, enum)"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Max columns to return","title":"Limit"},"description":"Max columns to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v1/account":{"get":{"tags":["public-api-v1"],"summary":"Your tier, quota and capabilities (free)","description":"Report the caller's tier and remaining daily quota.\nUses get_api_user (NOT check_api_rate_limit) so checking your quota\ndoes not itself consume quota.","operationId":"api_account_api_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meta":{"get":{"tags":["public-api-v1"],"summary":"Definitions, limits and quotas (free)","description":"What the API offers: outcome definitions and units, operators, limits,\ntier quotas and which endpoints are free, dataset coverage, doc links.\nDoes not count against the daily quota.","operationId":"api_meta_api_v1_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/coverage":{"get":{"tags":["public-api-v1"],"summary":"Historical data coverage","description":"First/last historical event date and event counts, dataset-wide or for one ticker.","operationId":"api_coverage_api_v1_coverage_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Ticker; omit for dataset-wide coverage","title":"Symbol"},"description":"Ticker; omit for dataset-wide coverage"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ticker/{symbol}/overview":{"get":{"tags":["public-api-v1"],"summary":"Ticker snapshot: price, moves, 52-week range, fundamentals","description":"Snapshot of one ticker now: last close and its date, 1d/5d/20d moves,\n52-week high/low and distance, market cap, sector, TTM fundamentals.","operationId":"api_ticker_overview_api_v1_ticker__symbol__overview_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ticker/{symbol}/gap-stats":{"get":{"tags":["public-api-v1"],"summary":"How this ticker's past gaps resolved","description":"How this ticker's own past gap days (and the next day) resolved. Free tier:\n3 distinct tickers per day, same quota as the app.","operationId":"api_ticker_gap_stats_api_v1_ticker__symbol__gap_stats_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"gap_threshold","in":"query","required":false,"schema":{"type":"number","maximum":1000,"minimum":0,"description":"Minimum absolute gap, percent (10 = 10%)","default":10.0,"title":"Gap Threshold"},"description":"Minimum absolute gap, percent (10 = 10%)"},{"name":"direction","in":"query","required":false,"schema":{"type":"string","pattern":"^(up|down)$","default":"up","title":"Direction"}},{"name":"stat","in":"query","required":false,"schema":{"type":"string","pattern":"^(avg|median)$","default":"avg","title":"Stat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ticker/{symbol}/daily":{"get":{"tags":["public-api-v1"],"summary":"Daily OHLCV bars","description":"Daily OHLCV bars, oldest first (split-adjusted eod_metrics, freshened with today's bar).","operationId":"api_ticker_daily_api_v1_ticker__symbol__daily_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Number of most recent daily bars","default":250,"title":"Limit"},"description":"Number of most recent daily bars"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/premarket/gappers":{"get":{"tags":["public-api-v1"],"summary":"Today's premarket gappers (free)","description":"Today's premarket gappers with each one's historical cohort stats\n(same snapshot as https://filtrix.net/premarket-movers). Free.","operationId":"api_premarket_gappers_api_v1_premarket_gappers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/premarket/sample-edge":{"get":{"tags":["public-api-v1"],"summary":"Sample backtest: gap up >= 10% (free)","description":"The canonical sample backtest (gap up >= 10% since 2019). Free.","operationId":"api_premarket_sample_edge_api_v1_premarket_sample_edge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/runs":{"post":{"tags":["public-api-v1"],"summary":"Save a backtest as a named run (background job)","description":"Runs the backtest and stores it as a run (its events and outcome rows), like\nsaving in the app's Context tab. Returns a job id; the finished job's result has\nrun_id. Counts against the plan's saved-run limit.","operationId":"api_save_run_api_v1_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSaveRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["public-api-v1"],"summary":"Your saved runs","operationId":"api_list_runs_api_v1_runs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/runs/{run_id}":{"get":{"tags":["public-api-v1"],"summary":"One saved run: filters, summary, share link","operationId":"api_get_run_api_v1_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["public-api-v1"],"summary":"Delete a saved run","operationId":"api_delete_run_api_v1_runs__run_id__delete","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/runs/{run_id}/rows":{"get":{"tags":["public-api-v1"],"summary":"The run's outcome rows, paged","operationId":"api_run_rows_api_v1_runs__run_id__rows_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/runs/{run_id}/trade-context":{"get":{"tags":["public-api-v1"],"summary":"Daily and minute bars around one event of a run","description":"For a (symbol, date) that is one of your run's events: daily bars up to that\ndate ({t, o, h, l, c, v}) and that day's minute bars ({ts in ns since epoch UTC,\no, h, l, c, v}). Prices are not split-adjusted, as in the app.","operationId":"api_trade_context_api_v1_runs__run_id__trade_context_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}},{"name":"symbol","in":"query","required":true,"schema":{"type":"string","description":"Ticker of one of the run's events","title":"Symbol"},"description":"Ticker of one of the run's events"},{"name":"date","in":"query","required":true,"schema":{"type":"string","description":"Event date, YYYY-MM-DD","title":"Date"},"description":"Event date, YYYY-MM-DD"},{"name":"daily_lookback","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"How many daily bars up to the date","default":120,"title":"Daily Lookback"},"description":"How many daily bars up to the date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/runs/{run_id}/share":{"post":{"tags":["public-api-v1"],"summary":"Create (or return) the run's public share link","operationId":"api_share_run_api_v1_runs__run_id__share_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["public-api-v1"],"summary":"Turn the run's share link off","operationId":"api_unshare_run_api_v1_runs__run_id__share_delete","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["public-api-v1"],"summary":"Status and result of a background job (free)","description":"Poll until status is completed, failed or cancelled. Does not count against the quota.","operationId":"api_get_job_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/simulations":{"post":{"tags":["public-api-v1"],"summary":"Simulate an intraday entry/exit strategy (background job)","description":"Loads minute bars for the run's events and simulates the strategy on each.\nThe finished job's result has summary (win_rate, profit_factor, avg_pnl in USD per\nshare, ...), n_trades and up to 200 trades with pnl_pct. Uses the plan's daily\nsimulation quota; a filters-based simulation also saves a run.","operationId":"api_simulate_api_v1_simulations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}/cancel":{"post":{"tags":["public-api-v1"],"summary":"Cancel a running background job","operationId":"api_cancel_job_api_v1_jobs__job_id__cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/status":{"get":{"tags":["public-api-v1"],"summary":"Scanner session, data freshness and whether you may use it (free)","operationId":"api_scanner_status_api_v1_scanner_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/columns":{"get":{"tags":["public-api-v1"],"summary":"Scanner columns, optionally searched with q","operationId":"api_scanner_columns_api_v1_scanner_columns_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/query":{"post":{"tags":["public-api-v1"],"summary":"Run filters over the live market now","description":"Rows of the current live snapshot that match the filters (or one of your windows),\nwith symbol plus the requested fields, the filter columns and the sort column.","operationId":"api_scanner_query_api_v1_scanner_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/monitors":{"get":{"tags":["public-api-v1"],"summary":"Your scanner windows (saved filter sets)","operationId":"api_list_monitors_api_v1_scanner_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["public-api-v1"],"summary":"Create or update a scanner window","description":"Without id creates a window (max 20 per account); with id updates yours.\nchannel_telegram turns its Telegram alerts on or off; is_running starts or stops it.","operationId":"api_put_monitor_api_v1_scanner_monitors_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpsert"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/monitors/{monitor_id}":{"delete":{"tags":["public-api-v1"],"summary":"Delete a scanner window","operationId":"api_delete_monitor_api_v1_scanner_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/matches":{"get":{"tags":["public-api-v1"],"summary":"What each of your running windows matches now","operationId":"api_scanner_matches_api_v1_scanner_matches_get","parameters":[{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Fields"}},{"name":"rows_per_window","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Rows Per Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scanner/chart":{"get":{"tags":["public-api-v1"],"summary":"Today's minute bars and recent daily bars of one scanner symbol","operationId":"api_scanner_chart_api_v1_scanner_chart_get","parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":12,"title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/meta":{"get":{"tags":["public-api-v1"],"summary":"Paper trading status for you: enabled, can start, account, feed (free)","operationId":"api_paper_meta_api_v1_paper_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/catalog":{"get":{"tags":["public-api-v1"],"summary":"Strategy building blocks: filters, entries, stops, targets, sizing","operationId":"api_paper_catalog_api_v1_paper_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/validate":{"post":{"tags":["public-api-v1"],"summary":"Check a strategy spec without saving it","operationId":"api_paper_validate_api_v1_paper_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/account":{"get":{"tags":["public-api-v1"],"summary":"Your paper account: version, summary, runs, open positions and orders","operationId":"api_paper_account_api_v1_paper_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["public-api-v1"],"summary":"Open your paper account","operationId":"api_paper_create_account_api_v1_paper_account_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/account/limits":{"patch":{"tags":["public-api-v1"],"summary":"Change the account's risk limits","operationId":"api_paper_limits_api_v1_paper_account_limits_patch","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LimitsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/account/reset":{"post":{"tags":["public-api-v1"],"summary":"Start a new epoch with fresh capital (closes everything)","operationId":"api_paper_reset_api_v1_paper_account_reset_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/account/close-all":{"post":{"tags":["public-api-v1"],"summary":"Close every open paper position and run","operationId":"api_paper_close_all_api_v1_paper_account_close_all_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/strategies":{"post":{"tags":["public-api-v1"],"summary":"Save a new strategy draft","operationId":"api_paper_create_strategy_api_v1_paper_strategies_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/strategies/{strategy_id}":{"patch":{"tags":["public-api-v1"],"summary":"Edit a strategy draft","operationId":"api_paper_edit_strategy_api_v1_paper_strategies__strategy_id__patch","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"integer","title":"Strategy Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["public-api-v1"],"summary":"Archive a strategy","operationId":"api_paper_archive_api_v1_paper_strategies__strategy_id__delete","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"integer","title":"Strategy Id"}},{"name":"draft_version","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Draft Version"}},{"name":"expected_version","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Expected Version"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/strategies/{strategy_id}/start":{"post":{"tags":["public-api-v1"],"summary":"Start a run of a strategy on the live feed","operationId":"api_paper_start_api_v1_paper_strategies__strategy_id__start_post","parameters":[{"name":"strategy_id","in":"path","required":true,"schema":{"type":"integer","title":"Strategy Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/runs/{run_id}/{action}":{"post":{"tags":["public-api-v1"],"summary":"Pause, resume or close a run","operationId":"api_paper_run_action_api_v1_paper_runs__run_id___action__post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice","title":"Idempotency-Key"},"description":"Required on every write; a retry with the same key and body replays the first answer instead of acting twice"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paper/{kind}":{"get":{"tags":["public-api-v1"],"summary":"A page of strategies, orders, positions, trades, events or epochs","operationId":"api_paper_page_api_v1_paper__kind__get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Limit"}},{"name":"epoch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Epoch Id"}},{"name":"run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccountCreate":{"properties":{"capital":{"type":"string","title":"Capital","default":"100000"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"additionalProperties":false,"type":"object","required":["limits"],"title":"AccountCreate"},"AccountResponse":{"properties":{"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier"},"is_admin":{"type":"boolean","title":"Is Admin"},"daily_limit":{"type":"integer","title":"Daily Limit"},"used_today":{"type":"integer","title":"Used Today"},"remaining":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Remaining"},"resets_at_utc":{"type":"string","title":"Resets At Utc"},"capabilities":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Capabilities"},"credential":{"additionalProperties":true,"type":"object","title":"Credential"}},"type":"object","required":["email","tier","is_admin","daily_limit","used_today","remaining","resets_at_utc"],"title":"AccountResponse"},"BacktestRequest":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array","title":"Filters"},"outcome":{"type":"string","enum":["day_return","day_close_position","reg_pct","hi_to_cl_pct","lo_to_cl_pct"],"title":"Outcome","description":"Outcome to analyse. Definitions and units: GET /api/v1/meta.","default":"day_close_position"},"flat_threshold":{"type":"number","title":"Flat Threshold","description":"Half-width of the 'flat' zone for long/short/flat_pct, as a fraction (0.002 = 0.2%). Ignored for day_close_position.","default":0.002},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date","description":"Start date filter (YYYY-MM-DD)"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date","description":"End date filter (YYYY-MM-DD)"},"threshold":{"type":"number","title":"Threshold","description":"In the outcome's unit (see outcome_unit / GET /api/v1/meta): fraction for day_return (0.05 = 5%), 0..1 for day_close_position, percent for reg_pct (5 = 5%). prob_le_threshold and bucket prob are the share of events with outcome <= threshold.","default":0.0},"pos_min":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Pos Min","description":"day_close_position only: below this = short (default 0.5)"},"pos_max":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Pos Max","description":"day_close_position only: above this = long (default 0.8)"},"sample_limit":{"type":"integer","maximum":20.0,"minimum":0.0,"title":"Sample Limit","description":"Return up to this many example events","default":0}},"type":"object","required":["filters"],"title":"BacktestRequest"},"BacktestResponse":{"properties":{"n":{"type":"integer","title":"N"},"summary":{"$ref":"#/components/schemas/BacktestSummary"},"buckets":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Buckets"},"filters_used":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Filters Used"},"outcome":{"type":"string","title":"Outcome","default":"day_close_position"},"outcome_unit":{"type":"string","title":"Outcome Unit","default":"position_0_1"},"outcome_definition":{"type":"string","title":"Outcome Definition","default":""},"threshold":{"type":"number","title":"Threshold","default":0.0},"prob_le_threshold":{"type":"number","title":"Prob Le Threshold","default":0.0},"bucket_prob_definition":{"type":"string","title":"Bucket Prob Definition","default":""},"direction_rule":{"additionalProperties":{"type":"string"},"type":"object","title":"Direction Rule"},"total_matched":{"type":"integer","title":"Total Matched","default":0},"samples":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Samples"}},"type":"object","required":["n","summary","buckets","filters_used"],"title":"BacktestResponse"},"BacktestSummary":{"properties":{"n":{"type":"integer","title":"N"},"mean":{"type":"number","title":"Mean"},"median":{"type":"number","title":"Median"},"p05":{"type":"number","title":"P05"},"p25":{"type":"number","title":"P25"},"p75":{"type":"number","title":"P75"},"p95":{"type":"number","title":"P95"},"long_pct":{"type":"number","title":"Long Pct"},"short_pct":{"type":"number","title":"Short Pct"},"flat_pct":{"type":"number","title":"Flat Pct"},"close_up_pct":{"type":"number","title":"Close Up Pct"},"close_down_pct":{"type":"number","title":"Close Down Pct"}},"type":"object","required":["n","mean","median","p05","p25","p75","p95","long_pct","short_pct","flat_pct","close_up_pct","close_down_pct"],"title":"BacktestSummary"},"DraftBody":{"properties":{"spec":{"additionalProperties":true,"type":"object","title":"Spec"},"account_version":{"type":"integer","minimum":1.0,"title":"Account Version"},"draft_version":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Draft Version"},"source_monitor_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Source Monitor Id"}},"additionalProperties":false,"type":"object","required":["spec","account_version"],"title":"DraftBody"},"EntrySpec":{"properties":{"type":{"type":"string","enum":["open_at_0930","green_to_red","red_to_green","bar_break"],"title":"Type","description":"open_at_0930: buy/short at the open; green_to_red / red_to_green: first color flip; bar_break: break of the first bar's range"},"within_minutes":{"anyOf":[{"type":"integer","maximum":390.0,"minimum":1.0},{"type":"null"}],"title":"Within Minutes","description":"Look for the entry only this many minutes after the open"}},"type":"object","required":["type"],"title":"EntrySpec"},"ExitSpec":{"properties":{"type":{"type":"string","enum":["close_1600","hold_minutes","stop_loss_take_profit"],"title":"Type"},"hold_minutes":{"anyOf":[{"type":"integer","maximum":390.0,"minimum":1.0},{"type":"null"}],"title":"Hold Minutes","description":"Required for hold_minutes"},"sl_pct":{"anyOf":[{"type":"number","exclusiveMaximum":1.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Sl Pct","description":"Stop loss as a fraction (0.02 = 2%); required for stop_loss_take_profit"},"tp_pct":{"anyOf":[{"type":"number","exclusiveMaximum":10.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Tp Pct","description":"Take profit as a fraction (0.05 = 5%); required for stop_loss_take_profit"}},"type":"object","required":["type"],"title":"ExitSpec"},"FilterCondition":{"properties":{"column":{"type":"string","title":"Column"},"operator":{"type":"string","title":"Operator"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"value_type":{"type":"string","title":"Value Type","default":"string"}},"type":"object","required":["column","operator"],"title":"FilterCondition"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LimitsBody":{"properties":{"expected_version":{"type":"integer","minimum":1.0,"title":"Expected Version"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"additionalProperties":false,"type":"object","required":["expected_version","limits"],"title":"LimitsBody"},"MonitorUpsert":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"filters":{"anyOf":[{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array"},{"type":"null"}],"title":"Filters"},"channel_telegram":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Channel Telegram"},"is_running":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Running"}},"type":"object","title":"MonitorUpsert"},"ResetBody":{"properties":{"expected_version":{"type":"integer","minimum":1.0,"title":"Expected Version"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"},"capital":{"type":"string","title":"Capital"}},"additionalProperties":false,"type":"object","required":["expected_version","limits","capital"],"title":"ResetBody"},"RunSaveRequest":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array","title":"Filters"},"outcome":{"type":"string","enum":["day_return","day_close_position","reg_pct","hi_to_cl_pct","lo_to_cl_pct"],"title":"Outcome","description":"Outcome to analyse. Definitions and units: GET /api/v1/meta.","default":"day_close_position"},"flat_threshold":{"type":"number","title":"Flat Threshold","description":"Half-width of the 'flat' zone for long/short/flat_pct, as a fraction (0.002 = 0.2%). Ignored for day_close_position.","default":0.002},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date","description":"Start date filter (YYYY-MM-DD)"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date","description":"End date filter (YYYY-MM-DD)"},"threshold":{"type":"number","title":"Threshold","description":"In the outcome's unit (see outcome_unit / GET /api/v1/meta): fraction for day_return (0.05 = 5%), 0..1 for day_close_position, percent for reg_pct (5 = 5%). prob_le_threshold and bucket prob are the share of events with outcome <= threshold.","default":0.0},"pos_min":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Pos Min","description":"day_close_position only: below this = short (default 0.5)"},"pos_max":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Pos Max","description":"day_close_position only: above this = long (default 0.8)"},"sample_limit":{"type":"integer","maximum":20.0,"minimum":0.0,"title":"Sample Limit","description":"Return up to this many example events","default":0},"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name","description":"Name shown in the app's Context runs"},"row_filter":{"type":"string","enum":["all","positive","negative","neutral","nonzero"],"title":"Row Filter","description":"Which outcome rows to keep in the run","default":"all"}},"type":"object","required":["filters"],"title":"RunSaveRequest"},"ScannerQuery":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array","maxItems":20,"title":"Filters","description":"AND-joined; columns from GET /api/v1/scanner/columns"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id","description":"Use the filters of one of your scanner windows"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":30},{"type":"null"}],"title":"Fields","description":"Columns to return per row (default: symbol, price, gap, change, volume)"},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":25},"offset":{"type":"integer","minimum":0.0,"title":"Offset","default":0},"order_by":{"type":"string","title":"Order By","default":"symbol"},"order_direction":{"type":"string","title":"Order Direction","description":"ASC or DESC","default":"ASC"}},"type":"object","title":"ScannerQuery"},"ScreenRequest":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array","title":"Filters"},"limit":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Limit","default":50},"offset":{"type":"integer","minimum":0.0,"title":"Offset","default":0},"fields":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Fields","description":"Extra raw filter columns to return per row under `fields` (max 20)"}},"type":"object","required":["filters"],"title":"ScreenRequest"},"ScreenResponse":{"properties":{"total":{"type":"integer","title":"Total"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results"}},"type":"object","required":["total","results"],"title":"ScreenResponse"},"SimulationRequest":{"properties":{"run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Id","description":"Simulate the events of one of your saved runs"},"filters":{"anyOf":[{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array"},{"type":"null"}],"title":"Filters","description":"Or: filters for a new run (saved first)"},"outcome":{"type":"string","title":"Outcome","description":"Outcome for the run saved from filters","default":"day_close_position"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"strategy":{"$ref":"#/components/schemas/StrategySpec"},"side":{"type":"string","enum":["long","short"],"title":"Side","default":"long"},"bar_minutes":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Bar Minutes","description":"Bar size the strategy reads, in minutes","default":1},"limit_pairs":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Limit Pairs","description":"How many of the run's events to simulate","default":200}},"type":"object","required":["strategy"],"title":"SimulationRequest"},"StartBody":{"properties":{"account_version":{"type":"integer","minimum":1.0,"title":"Account Version"},"draft_version":{"type":"integer","minimum":1.0,"title":"Draft Version"}},"additionalProperties":false,"type":"object","required":["account_version","draft_version"],"title":"StartBody"},"StrategySpec":{"properties":{"entry":{"$ref":"#/components/schemas/EntrySpec"},"exit":{"$ref":"#/components/schemas/ExitSpec"}},"type":"object","required":["entry","exit"],"title":"StrategySpec"},"TickerInfoResponse":{"properties":{"symbol":{"type":"string","title":"Symbol"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"sic_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sic Code"},"sic_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sic Description"},"market_cap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap"},"primary_exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Exchange"},"employees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employees"},"list_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"List Date"}},"type":"object","required":["symbol"],"title":"TickerInfoResponse"},"ValidateBody":{"properties":{"spec":{"additionalProperties":true,"type":"object","title":"Spec"}},"additionalProperties":false,"type":"object","required":["spec"],"title":"ValidateBody"},"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"},"VersionBody":{"properties":{"expected_version":{"type":"integer","minimum":1.0,"title":"Expected Version"}},"additionalProperties":false,"type":"object","required":["expected_version"],"title":"VersionBody"}},"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerKey":{"type":"http","scheme":"bearer","description":"API key flt_... as a bearer token"}}},"security":[{"ApiKeyHeader":[]},{"BearerKey":[]}]}