{"openapi":"3.1.0","info":{"title":"TraderSpy Signals API","version":"1.0.0","description":"Read-only crypto futures market data: AI signals, smart-money positioning, prices, candles, derivatives, technical indicators, a screener and condition backtests. No account data, no trading. Every request counts as one call against the plan of the key’s account. A key can be restricted to IP addresses (for servers) or to websites (for web pages), and capped per day.","x-docs":"https://traderspy.app/api"},"servers":[{"url":"https://api.traderspy.app"}],"security":[{"bearerKey":[]},{"headerKey":[]}],"components":{"securitySchemes":{"bearerKey":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer tspy_…`. Never in the URL."},"headerKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The same key in its own header."}},"schemas":{"Condition":{"type":"object","additionalProperties":false,"required":["metric","op","value"],"properties":{"metric":{"type":"string","enum":["rsi","stochastic","cci","mfi","williamsR","adx","roc","macdHistogram","atrPct","volumeRatio","bbPercentB","bbWidthPct","priceVsEma","emaSpread","supertrend","changePct","price"]},"op":{"type":"string","enum":["lt","gt","crossAbove","crossBelow"]},"value":{"type":"number"},"period":{"type":"integer","minimum":2,"maximum":200},"period2":{"type":"integer","minimum":2,"maximum":200}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId"],"properties":{"code":{"type":"string","enum":["invalid_request","missing_api_key","invalid_api_key","plan_not_included","ip_not_allowed","origin_not_allowed","not_found","no_data","rate_limited","daily_limit_reached","key_daily_limit_reached","body_too_large","internal_error","service_unavailable"]},"message":{"type":"string"},"requestId":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"param":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"paths":{"/v1/signals":{"get":{"operationId":"signalsList","summary":"List AI signals","description":"Published AI signals, newest first, with entry, targets, stop and outcome so far. Same data as the MCP tool `get_signals`.","tags":["AI signals"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Signals per page.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","required":false,"description":"Signals to skip (pagination).","schema":{"type":"integer","minimum":0,"maximum":10000,"default":0}},{"name":"importance","in":"query","required":false,"description":"`high` = high only, `medium` = high + medium.","schema":{"type":"string","enum":["all","high","medium","low"],"default":"all"}},{"name":"coin","in":"query","required":false,"description":"Only signals on this coin (`BTC`, `ETHUSDT`).","schema":{"type":"string"}},{"name":"strategy","in":"query","required":false,"description":"Only signals of the AI strategy whose name contains these words, in order.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/signals/stats":{"get":{"operationId":"signalsStats","summary":"Signal statistics","description":"Totals, targets hit, stops and win rate over a period, overall and per strategy. Same data as the MCP tool `get_signal_stats`.","tags":["AI signals"],"parameters":[{"name":"period","in":"query","required":false,"description":"Signals published in this window.","schema":{"type":"string","enum":["4h","8h","24h","7d"],"default":"24h"}},{"name":"strategy","in":"query","required":false,"description":"One AI strategy, matched by part of its name.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/signals/{id}":{"get":{"operationId":"signalsGet","summary":"Get a signal","description":"One signal in full: indicator values, AI review, entry, resolution and the live price. Same data as the MCP tool `get_signal_details`.","tags":["AI signals"],"parameters":[{"name":"id","in":"path","required":true,"description":"The signal id (from the list).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/traders":{"get":{"operationId":"tradersList","summary":"Top traders","description":"Ranked smart-money traders across exchanges, with ROI, PnL and SmartScore. Same data as the MCP tool `get_top_traders`.","tags":["Smart money"],"parameters":[{"name":"source","in":"query","required":false,"description":"Exchange to read, or `all`.","schema":{"type":"string","enum":["all","binance","hyperliquid","bybit","okx"],"default":"all"}},{"name":"timeRange","in":"query","required":false,"description":"Performance window of the ranking.","schema":{"type":"string","enum":["24h","3D","7D","30D"],"default":"30D"}},{"name":"rankingType","in":"query","required":false,"description":"Which leaderboard snapshot to read.","schema":{"type":"string","enum":["ROI","PNL"],"default":"ROI"}},{"name":"sortBy","in":"query","required":false,"description":"Sort metric (defaults to the ranking type).","schema":{"type":"string","enum":["ROI","PNL","SCORE"]}},{"name":"order","in":"query","required":false,"description":"Sort direction.","schema":{"type":"string","enum":["DESC","ASC"],"default":"DESC"}},{"name":"limit","in":"query","required":false,"description":"Traders to return.","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/traders/elite":{"get":{"operationId":"tradersElite","summary":"Elite leaderboard","description":"The cross-exchange elite leaderboard by SmartScore, recalculated daily. Same data as the MCP tool `get_elite_leaderboard`.","tags":["Smart money"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/traders/{source}/{traderId}":{"get":{"operationId":"tradersGet","summary":"Trader profile","description":"One trader’s metrics and latest positions. Same data as the MCP tool `get_trader_profile`.","tags":["Smart money"],"parameters":[{"name":"source","in":"path","required":true,"description":"Exchange the trader is on.","schema":{"type":"string","enum":["binance","hyperliquid","bybit","okx"]}},{"name":"traderId","in":"path","required":true,"description":"The trader id (from the top traders list).","schema":{"type":"string"}},{"name":"timeRange","in":"query","required":false,"description":"Performance window of the ranking.","schema":{"type":"string","enum":["24h","3D","7D","30D"],"default":"30D"}},{"name":"rankingType","in":"query","required":false,"description":"Which leaderboard snapshot to read.","schema":{"type":"string","enum":["ROI","PNL"],"default":"ROI"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/traders/{source}/{traderId}/history":{"get":{"operationId":"tradersHistory","summary":"Trader history","description":"A trader’s closed positions, newest first. Same data as the MCP tool `get_trader_position_history`.","tags":["Smart money"],"parameters":[{"name":"source","in":"path","required":true,"description":"Exchange the trader is on.","schema":{"type":"string","enum":["binance","hyperliquid","bybit","okx"]}},{"name":"traderId","in":"path","required":true,"description":"The trader id.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"maximum":500,"default":1}},{"name":"limit","in":"query","required":false,"description":"Positions per page.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/positions":{"get":{"operationId":"positionsList","summary":"Smart-money positions","description":"Open and closed positions of the tracked traders, filterable by exchange and symbol. Same data as the MCP tool `get_positions`.","tags":["Smart money"],"parameters":[{"name":"status","in":"query","required":false,"description":"Position status.","schema":{"type":"string","enum":["all","open","closed"],"default":"all"}},{"name":"source","in":"query","required":false,"description":"Exchange to read, or `all`.","schema":{"type":"string","enum":["all","binance","hyperliquid","bybit","okx"],"default":"all"}},{"name":"symbol","in":"query","required":false,"description":"Only this coin (`BTC`, `ETHUSDT`).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Positions per page.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","required":false,"description":"Positions to skip.","schema":{"type":"integer","minimum":0,"maximum":10000,"default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/stats":{"get":{"operationId":"smartMoneyStats","summary":"Smart-money statistics","description":"Aggregate open positions, long/short split, PnL and win rate of closed positions. Same data as the MCP tool `get_market_stats`.","tags":["Smart money"],"parameters":[{"name":"source","in":"query","required":false,"description":"Exchange to read, or `all`.","schema":{"type":"string","enum":["all","binance","hyperliquid","bybit","okx"],"default":"all"}},{"name":"period","in":"query","required":false,"description":"Window for the closed-position statistics.","schema":{"type":"string","enum":["4h","8h","24h","7d"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/smart-money/exchanges":{"get":{"operationId":"smartMoneyExchanges","summary":"Tracked exchanges","description":"The exchanges smart-money tracking covers. Same data as the MCP tool `get_exchanges`.","tags":["Smart money"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market/prices":{"get":{"operationId":"marketPrices","summary":"Live prices","description":"Last price, 24h high/low, volume and change for up to 20 futures symbols. Same data as the MCP tool `get_price`.","tags":["Market data"],"parameters":[{"name":"symbols","in":"query","required":true,"description":"Comma-separated symbols; a bare `BTC` reads as `BTCUSDT`.","schema":{"type":"string","examples":["BTCUSDT,ETHUSDT"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market/candles":{"get":{"operationId":"marketCandles","summary":"Candles (OHLCV)","description":"OHLCV candles of a futures symbol, oldest first; the last one may still be open. Same data as the MCP tool `get_candles`.","tags":["Market data"],"parameters":[{"name":"symbol","in":"query","required":true,"description":"Trading pair.","schema":{"type":"string"}},{"name":"interval","in":"query","required":false,"description":"Candle timeframe.","schema":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"default":"1h"}},{"name":"limit","in":"query","required":false,"description":"Candles to return (newest N).","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market/symbols":{"get":{"operationId":"marketSymbols","summary":"Tracked symbols","description":"Every futures symbol TraderSpy keeps live candles for. Same data as the MCP tool `get_tracked_symbols`.","tags":["Market data"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market/derivatives":{"get":{"operationId":"marketDerivatives","summary":"Funding & open interest","description":"Funding rate, open interest and positioning for Binance USDⓈ-M perpetuals, with plain-language notes. Same data as the MCP tool `get_derivatives`.","tags":["Market data"],"parameters":[{"name":"symbols","in":"query","required":true,"description":"Up to 5 comma-separated symbols.","schema":{"type":"string","examples":["BTCUSDT,ETHUSDT"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/technicals":{"get":{"operationId":"technicalsGet","summary":"Technical indicators","description":"Up to 19 indicators with history, zones and crossovers, for up to 3 symbols × 3 timeframes, plus a bias summary. Same data as the MCP tool `get_technical_indicators`.","tags":["Analysis"],"parameters":[{"name":"symbol","in":"query","required":false,"description":"One trading pair (or use `symbols`).","schema":{"type":"string"}},{"name":"symbols","in":"query","required":false,"description":"Up to 3 pairs in one call; the answer then carries one entry per symbol in `data`.","schema":{"type":"string","examples":["BTCUSDT,ETHUSDT"]}},{"name":"interval","in":"query","required":false,"description":"Timeframe (ignored when `intervals` is given).","schema":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"default":"1h"}},{"name":"intervals","in":"query","required":false,"description":"Up to 3 timeframes in one call, with a multi-timeframe `confluence` verdict.","schema":{"type":"string","examples":["1h,4h,1d"]}},{"name":"indicators","in":"query","required":false,"description":"Indicators to compute (default: rsi, macd, ema, bollinger).","schema":{"type":"string","examples":["rsi,macd,levels"]}},{"name":"history","in":"query","required":false,"description":"Prior values per indicator in `series`.","schema":{"type":"integer","minimum":0,"maximum":20,"default":5}},{"name":"periods","in":"query","required":false,"description":"Period overrides as a JSON object, e.g. `{\"rsi\":7,\"ema\":[9,21,55]}`.","schema":{"type":"string","contentMediaType":"application/json"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/screener":{"post":{"operationId":"screenerRun","summary":"Screener","description":"Scan the most-traded symbols (or your own list) for up to 3 AND-ed conditions in one call. Same data as the MCP tool `screen_symbols`.","tags":["Analysis"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`body_too_large`: The JSON body is over 32 KB (a screener or backtest body is under 4 KB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"interval":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"description":"Timeframe to evaluate on.","default":"4h"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"maxItems":3,"description":"Up to 3 conditions, AND-ed: `{ \"metric\", \"op\", \"value\", \"period\"?, \"period2\"? }`. `lt`/`gt` compare the latest bar; `crossAbove`/`crossBelow` are one-bar events. Examples: RSI oversold `{\"metric\":\"rsi\",\"op\":\"lt\",\"value\":30}`; above the 200 EMA `{\"metric\":\"priceVsEma\",\"op\":\"gt\",\"value\":0,\"period\":200}`; golden cross `{\"metric\":\"emaSpread\",\"op\":\"crossAbove\",\"value\":0,\"period\":50,\"period2\":200}`."},"symbols":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Explicit symbols to scan; omit to scan the most-traded. Without conditions it is a comparison table."},"universe":{"type":"integer","minimum":5,"maximum":100,"description":"How many of the most-traded symbols to scan when `symbols` is omitted.","default":50},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return.","default":20},"sortBy":{"type":"string","enum":["volume","change24h","metric"],"description":"Default: `metric` with conditions, else `volume`."},"sortOrder":{"type":"string","enum":["desc","asc"],"description":"Sort direction.","default":"desc"}}},"example":{"interval":"4h","conditions":[{"metric":"rsi","op":"lt","value":35}],"universe":50,"limit":10}}}}}},"/v1/backtest":{"post":{"operationId":"backtestRun","summary":"Backtest a condition","description":"What price did after a condition on one symbol: occurrences, forward returns, win rate and the edge over the baseline. Same data as the MCP tool `backtest_condition`.","tags":["Analysis"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"`invalid_request`: A parameter is missing, unknown or out of range. `details` names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`missing_api_key`: No API key was sent. Send it as `Authorization: Bearer tspy_…` or `X-API-Key`. `invalid_api_key`: The key does not exist, was revoked, or its account is closed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`plan_not_included`: The account’s plan does not include API access. `ip_not_allowed`: The key only works from the IP addresses set on it; this request came from another one. `origin_not_allowed`: The key only works from the websites set on it; this request named another website, or none.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: No such endpoint, or the record (signal, trader) does not exist. `no_data`: TraderSpy has no data for that symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`body_too_large`: The JSON body is over 32 KB (a screener or backtest body is under 4 KB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: More than the per-minute limit. Wait `Retry-After` seconds. `daily_limit_reached`: The plan’s calls for this UTC day are used. Resets at 00:00 UTC. `key_daily_limit_reached`: The key’s own daily cap is used (the account may have calls left). Resets at 00:00 UTC.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Something failed on our side. Quote the `requestId` to support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: A data source did not answer in time. Retry after `Retry-After` seconds; the call was not counted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["symbol","conditions"],"properties":{"symbol":{"type":"string","description":"Trading pair (`BTCUSDT`, or a bare `BTC`)."},"interval":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"description":"Candle timeframe.","default":"4h"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"maxItems":3,"description":"Up to 3 conditions, AND-ed: `{ \"metric\", \"op\", \"value\", \"period\"?, \"period2\"? }`. `lt`/`gt` compare the latest bar; `crossAbove`/`crossBelow` are one-bar events. Examples: RSI oversold `{\"metric\":\"rsi\",\"op\":\"lt\",\"value\":30}`; above the 200 EMA `{\"metric\":\"priceVsEma\",\"op\":\"gt\",\"value\":0,\"period\":200}`; golden cross `{\"metric\":\"emaSpread\",\"op\":\"crossAbove\",\"value\":0,\"period\":50,\"period2\":200}`."},"horizons":{"type":"array","items":{"type":"integer","minimum":1,"maximum":200},"minItems":1,"maxItems":4,"description":"Bars ahead to measure returns over (default ≈ 4h / 1d / 3d for the interval)."}}},"example":{"symbol":"BTCUSDT","interval":"4h","conditions":[{"metric":"rsi","op":"lt","value":30}]}}}}}}}}