{"interface_version":"2","changes":[{"date":"2026-10-27","version":"2","breaking":false,"summary":"Trading costs in the decision: fees per venue, all-in ranking, venue \"best\", fees actually charged.","added":["compare_perp_quotes_across_venues: side, size_base / notional_usd, leverage; per venue maker_fee_bps, taker_fee_bps, fee_source, execution_7d, all_in_price, cost_bps, fee_usd, est_cost_usd, margin and permission fields; best_venue","preview_perp_order: est_fee_usd, fee_rate_bps, fee_source; venue \"best\" with venue_choice","/quality.json: by_venue (with median_fee_bps actually charged)","get_order_request_status: fee (estimated, then the amount the exchange charged)","get_my_trade_history: fees_usd, fees_settled, net_pnl","compare_perp_quotes_across_venues and preview_perp_order: hold_hours (funding at today's rate and the round trip's cost: total_cost_bps, est_funding_usd, est_total_cost_usd / est_round_trip_cost_usd)","compare_perp_quotes_across_venues: quality_bps, effective_price, effective_cost_bps; tradehub.json venue_ranking"],"changed":["compare_perp_quotes_across_venues with side ranks by all_in_price; with an account it includes the sandbox and venues the feed lacks","get_my_trade_history: pnl is before fees (net_pnl after)","compare_perp_quotes_across_venues ranks by effective_price (with hold_hours effective_cost_bps): measured execution quality counts as a cost"]},{"date":"2026-10-27","version":"2","breaking":false,"summary":"Try trading without signing up.","added":["POST /v1/trial: a sandbox API key for 24 hours (10,000 USDC of play money), no account needed"],"changed":["AUTH_REQUIRED hints point to the trial on the sandbox deployment"]},{"date":"2026-10-26","version":"2","breaking":false,"summary":"Exit management, trigger entries, price history and fewer calls to open a position.","added":["set_take_profit_levels","set_stop_loss_rule","get_price_candles","preview_perp_order: trigger_price, trigger_valid_hours (open at market when the price gets there)","preview_perp_order: stop_pct (the stop as a distance, instead of stop_loss)","size_position_by_risk: notional_usd (\"buy $200 worth\")","get_my_open_positions: liquidation_price, liquidation_distance_pct","preview_perp_order: est_fill_price, est_slippage_bps","error codes NOT_FILLED, TAKE_PROFIT_SIDE, TOO_MANY_TRIGGERS","/skills/tradehub-trading.zip (the agent skill, public)"],"changed":["market entries are protected: they fill within the price band or not at all (NOT_FILLED)","descriptions and errors say \"trading permissions\" (codes keep the MANDATE_ prefix)"]},{"date":"2026-10-20","version":"2","breaking":true,"summary":"Tool set v2 before the developer preview (no aliases: nobody outside used v1).","renamed":{"get_mandate":"get_my_trading_permissions","get_account":"get_my_account_balances","get_positions":"get_my_open_positions","get_open_orders":"get_my_open_orders","get_market":"get_perp_contract_rules","get_orderbook":"get_order_book","get_signals":"get_technical_indicators_15m","get_risk_status":"get_my_risk_limits_usage","get_trade_history":"get_my_trade_history","get_request_status":"get_order_request_status","preview_order":"preview_perp_order","submit_order":"execute_previewed_order","cancel_order":"cancel_open_order","close_position":"close_perp_position_reduce_only","kill_switch":"stop_all_trading_now"},"added":["compare_perp_quotes_across_venues","compare_funding_rates_across_venues","get_venue_health","size_position_by_risk","tighten_stop_loss (was REST only)","get_my_agent_performance","/mcp/public","/llms.txt","/.well-known/tradehub.json","/.well-known/tradehub-receipts.jwks","/docs/errors","/v1/errors","/changelog.json","/v1/hooks/tradingview (TradingView alerts)"],"changed":["preview_perp_order: size is now size_base (base coin)","errors: suggested_args, next_tool, human_action_url, docs_url","execute_previewed_order: wait_seconds; every execution returns a signed receipt","every tool: MCP annotations and an outputSchema","size_position_by_risk: the stop can be given as stop_pct with side; it reads equity, mark and contract rules itself","failures: never a bare 500; INTERNAL_ERROR and VENUE_UNAVAILABLE come with retry_after (REST: HTTP 503 + Retry-After); every retry-later code carries retry_after"]}]}