{"openapi":"3.1.0","info":{"title":"PolyCap API","description":"Backtest API with wallet-based pay-per-use pricing","version":"1.0.0"},"paths":{"/v1/backtest":{"post":{"tags":["Backtest"],"summary":"Run backtest","operationId":"run_backtest_v1_backtest_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestRequest"}}}},"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"}}}}}}}},"components":{"schemas":{"BacktestRequest":{"properties":{"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"trigger_start":{"type":"string","title":"Trigger Start","description":"Trigger window start offset (MM:SS)","default":"13:00"},"trigger_end":{"type":"string","title":"Trigger End","description":"Trigger window end offset (MM:SS)","default":"15:00"},"min_share_price":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Share Price","description":"Minimum share price filter (0-1). Applies to the token price for the chosen direction (price_down when buy_down, price_up when buy_up).","default":0.7},"max_share_price":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Max Share Price","description":"Maximum share price filter (0-1). Applies to the token price for the chosen direction (price_down when buy_down, price_up when buy_up).","default":0.95},"min_coin_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Coin Change","description":"Min coin price change from market open (USD). Takes priority over min_btc_change."},"max_coin_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Coin Change","description":"Max coin price change (USD). Takes priority over max_btc_change."},"min_btc_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Btc Change","description":"(Legacy alias for min_coin_change)"},"max_btc_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Btc Change","description":"(Legacy alias for max_coin_change)"},"direction":{"type":"string","title":"Direction","description":"'buy_down' or 'buy_up'","default":"buy_down"},"order_type":{"type":"string","enum":["market","limit"],"title":"Order Type","description":"Order type: 'market' (best available price) or 'limit' (capped at limit_price)","default":"limit"},"limit_price":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Limit Price","description":"Maximum entry price (required when order_type is 'limit')"},"duration_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":1.0},{"type":"null"}],"title":"Duration Seconds","description":"How long the limit order stays open in seconds (required for limit orders, ignored for market orders)"},"single_trade_buy_amount":{"type":"number","exclusiveMinimum":0.0,"title":"Single Trade Buy Amount","description":"USD per round","default":5.0},"number_of_rounds":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Number Of Rounds","description":"Max total trade triggers across all markets. Backtest stops when this limit is reached.","default":10000},"take_profit_pct":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Take Profit Pct","description":"Take profit percentage (e.g. 15 = +15%)"},"stop_loss_pct":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Stop Loss Pct","description":"Stop loss percentage (e.g. 50 = -50%)"},"take_profit":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Take Profit","description":"Absolute take profit price (0-1). Exit when token price reaches this value."},"stop_loss":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Stop Loss","description":"Absolute stop loss price (0-1). Exit when token price drops to this value."},"max_slippage_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Max Slippage Pct","description":"Maximum allowed slippage percentage (e.g. 10 = reject if slippage > 10%)"},"coin":{"type":"string","enum":["btc","eth","sol"],"title":"Coin","description":"Coin symbol: btc, eth, or sol","default":"btc"},"num_markets":{"type":"integer","enum":[10,100,1000],"title":"Num Markets","description":"Number of markets to test (10, 100, or 1000)","default":10},"market_type":{"type":"string","title":"Market Type","description":"Market type to backtest: 5m, 15m, 1hr, 4hr, 24hr","default":"15m"}},"type":"object","title":"BacktestRequest"},"BacktestResponse":{"properties":{"settings":{"$ref":"#/components/schemas/BacktestSettings"},"summary":{"$ref":"#/components/schemas/BacktestSummary"},"equity_curve":{"items":{"$ref":"#/components/schemas/EquityPoint"},"type":"array","title":"Equity Curve"},"trades":{"items":{"$ref":"#/components/schemas/TradeDetail"},"type":"array","title":"Trades"}},"type":"object","required":["settings","summary","equity_curve","trades"],"title":"BacktestResponse"},"BacktestSettings":{"properties":{"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"trigger_start":{"type":"string","title":"Trigger Start"},"trigger_end":{"type":"string","title":"Trigger End"},"min_share_price":{"type":"number","title":"Min Share Price"},"max_share_price":{"type":"number","title":"Max Share Price"},"min_coin_change":{"type":"number","title":"Min Coin Change"},"max_coin_change":{"type":"number","title":"Max Coin Change"},"min_btc_change":{"type":"number","title":"Min Btc Change"},"max_btc_change":{"type":"number","title":"Max Btc Change"},"direction":{"type":"string","title":"Direction"},"order_type":{"type":"string","title":"Order Type"},"limit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Limit Price"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"single_trade_buy_amount":{"type":"number","title":"Single Trade Buy Amount"},"number_of_rounds":{"type":"integer","title":"Number Of Rounds"},"take_profit_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Take Profit Pct"},"stop_loss_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stop Loss Pct"},"take_profit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Take Profit"},"stop_loss":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stop Loss"},"max_slippage_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Slippage Pct"},"coin":{"type":"string","title":"Coin"},"num_markets":{"type":"integer","title":"Num Markets"},"market_type":{"type":"string","title":"Market Type"}},"type":"object","required":["tag","trigger_start","trigger_end","min_share_price","max_share_price","min_coin_change","max_coin_change","min_btc_change","max_btc_change","direction","order_type","limit_price","duration_seconds","single_trade_buy_amount","number_of_rounds","take_profit_pct","stop_loss_pct","take_profit","stop_loss","max_slippage_pct","coin","num_markets","market_type"],"title":"BacktestSettings"},"BacktestSummary":{"properties":{"total_trades":{"type":"integer","title":"Total Trades"},"total_volume":{"type":"number","title":"Total Volume"},"total_capital_used":{"type":"number","title":"Total Capital Used"},"win_rate_pct":{"type":"number","title":"Win Rate Pct"},"pnl_absolute":{"type":"number","title":"Pnl Absolute"},"pnl_pct":{"type":"number","title":"Pnl Pct"},"avg_buy_price":{"type":"number","title":"Avg Buy Price"},"avg_sell_price":{"type":"number","title":"Avg Sell Price"},"max_drawdown_pct":{"type":"number","title":"Max Drawdown Pct"},"drawdown":{"type":"number","title":"Drawdown"},"fees_impact":{"type":"number","title":"Fees Impact"},"markets_tested":{"type":"integer","title":"Markets Tested"},"markets_won":{"type":"integer","title":"Markets Won"},"markets_lost":{"type":"integer","title":"Markets Lost"},"trigger_rate_abs":{"type":"integer","title":"Trigger Rate Abs"},"trigger_rate_pct":{"type":"number","title":"Trigger Rate Pct"},"max_consecutive_losses":{"type":"integer","title":"Max Consecutive Losses"},"cost_charged":{"type":"number","title":"Cost Charged"}},"type":"object","required":["total_trades","total_volume","total_capital_used","win_rate_pct","pnl_absolute","pnl_pct","avg_buy_price","avg_sell_price","max_drawdown_pct","drawdown","fees_impact","markets_tested","markets_won","markets_lost","trigger_rate_abs","trigger_rate_pct","max_consecutive_losses","cost_charged"],"title":"BacktestSummary"},"EquityPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"portfolio_value":{"type":"number","title":"Portfolio Value"}},"type":"object","required":["timestamp","portfolio_value"],"title":"EquityPoint"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"TradeDetail":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"price":{"type":"number","title":"Price"},"size":{"type":"number","title":"Size"},"portfolio_value":{"type":"number","title":"Portfolio Value"},"prediction":{"type":"string","title":"Prediction"},"coin_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coin Price"}},"type":"object","required":["timestamp","market","side","price","size","portfolio_value","prediction"],"title":"TradeDetail"},"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"}}}}