TradeReady.io
REST API

Market Data

Real-time prices, OHLCV candles, tickers, trade history, and order book for 600+ trading pairs.

Download .md

Market Data

All market data endpoints are public — no API key required. Prices are sourced from real Binance market data via a WebSocket feed. Current prices are served from a Redis cache for sub-millisecond latency. Historical candles come from TimescaleDB continuous aggregates.

Rate limit for market data: 1,200 requests per minute. This is a separate, higher limit from authenticated endpoints because agents often need to poll many pairs simultaneously.


List Trading Pairs

GET /api/v1/market/pairs

List all available trading pairs with exchange filter rules. Use this to discover valid symbols before placing orders, and to check the minimum order quantity for each pair.

Authentication: None — public endpoint

Query Parameters:

ParameterTypeRequiredDescription
statusstringNoFilter by status: "active" or "inactive"

Example Request:

curl "https://api.tradeready.io/api/v1/market/pairs?status=active"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
pairs = client.get_pairs()
for pair in pairs.pairs:
    print(pair.symbol, pair.min_qty, pair.step_size)

Example Response:

{
  "pairs": [
    {
      "symbol": "BTCUSDT",
      "base_asset": "BTC",
      "quote_asset": "USDT",
      "status": "active",
      "min_qty": "0.00001000",
      "step_size": "0.00001000",
      "min_notional": "1.00000000"
    },
    {
      "symbol": "ETHUSDT",
      "base_asset": "ETH",
      "quote_asset": "USDT",
      "status": "active",
      "min_qty": "0.00010000",
      "step_size": "0.00010000",
      "min_notional": "1.00000000"
    }
  ],
  "total": 647
}

Pair Object Fields:

FieldTypeDescription
symbolstringTrading pair symbol (e.g., "BTCUSDT")
base_assetstringBase currency (e.g., "BTC")
quote_assetstringQuote currency — always "USDT" on this platform
statusstring"active" or "inactive"
min_qtystringMinimum order quantity in base asset
step_sizestringQuantity increment (lot size)
min_notionalstringMinimum order value in USDT

Get Current Price

GET /api/v1/market/price/{symbol}

Get the current live price for a single trading pair from the Redis cache. This is the fastest way to get a price — typical latency is under 1 ms.

Authentication: None — public endpoint

Path Parameters:

ParameterTypeDescription
symbolstringTrading pair symbol (case-insensitive, e.g., BTCUSDT)

Example Request:

curl https://api.tradeready.io/api/v1/market/price/BTCUSDT
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
price = client.get_price("BTCUSDT")
print(price.price)       # Decimal('64521.30000000')
print(price.timestamp)   # datetime object

Example Response:

{
  "symbol": "BTCUSDT",
  "price": "64521.30000000",
  "timestamp": "2026-03-19T10:00:00.123456Z"
}

Error Responses:

CodeHTTPCondition
INVALID_SYMBOL400Symbol not found in active trading pairs
PRICE_NOT_AVAILABLE503No live price in cache yet — retry in a few seconds

Get All Prices

GET /api/v1/market/prices

Get current prices for all pairs (or a filtered subset) in a single call. Use this for scanning opportunities across many pairs without making hundreds of individual requests.

Authentication: None — public endpoint

Query Parameters:

ParameterTypeRequiredDescription
symbolsstringNoComma-separated list of symbols (e.g., BTCUSDT,ETHUSDT,SOLUSDT). Omit to return all.

Example Request:

# All 600+ prices
curl https://api.tradeready.io/api/v1/market/prices

# Filtered to specific pairs
curl "https://api.tradeready.io/api/v1/market/prices?symbols=BTCUSDT,ETHUSDT,SOLUSDT"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")

# All prices
all_prices = client.get_all_prices()
btc_price = all_prices.prices["BTCUSDT"]

# Scan for biggest movers (combine with ticker data)
for symbol, price in all_prices.prices.items():
    print(symbol, price)

Example Response:

{
  "prices": {
    "BTCUSDT": "64521.30000000",
    "ETHUSDT": "3421.50000000",
    "SOLUSDT": "142.80000000"
  },
  "timestamp": "2026-03-19T10:00:00Z",
  "count": 3
}

Get 24h Ticker

GET /api/v1/market/ticker/{symbol}

Get 24-hour rolling OHLCV statistics for a single symbol. Useful for checking momentum: high volume with positive change_pct often signals a strong trend.

Authentication: None — public endpoint

Path Parameters:

ParameterTypeDescription
symbolstringTrading pair symbol (e.g., ETHUSDT)

Example Request:

curl https://api.tradeready.io/api/v1/market/ticker/ETHUSDT
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
ticker = client.get_ticker("ETHUSDT")
print(ticker.change_pct)    # "1.23000000"
print(ticker.volume)        # "185432.12000000"

Example Response:

{
  "symbol": "ETHUSDT",
  "open": "3380.00000000",
  "high": "3450.00000000",
  "low": "3360.00000000",
  "close": "3421.50000000",
  "volume": "185432.12000000",
  "quote_volume": "634226157.18000000",
  "change": "41.50000000",
  "change_pct": "1.23000000",
  "trade_count": 892341,
  "timestamp": "2026-03-19T10:00:00Z"
}

Error Responses:

CodeHTTPCondition
INVALID_SYMBOL400Symbol not found
PRICE_NOT_AVAILABLE503No ticker data in cache yet

Get Batch Tickers

GET /api/v1/market/tickers

Get 24-hour ticker statistics for multiple symbols in one call. Accepts up to 100 symbols per request.

Authentication: None — public endpoint

Query Parameters:

ParameterTypeRequiredDescription
symbolsstringYesComma-separated list of symbols (max 100)

Example Request:

curl "https://api.tradeready.io/api/v1/market/tickers?symbols=BTCUSDT,ETHUSDT,SOLUSDT"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
# Use individual get_ticker() calls or the raw HTTP client for batch
import httpx
response = httpx.get(
    "https://api.tradeready.io/api/v1/market/tickers",
    params={"symbols": "BTCUSDT,ETHUSDT,SOLUSDT"},
)
tickers = response.json()

Example Response:

{
  "BTCUSDT": {
    "symbol": "BTCUSDT",
    "open": "63800.00000000",
    "high": "64800.00000000",
    "low": "63600.00000000",
    "close": "64521.30000000",
    "volume": "12345.67800000",
    "change_pct": "1.13000000",
    "trade_count": 2341890
  },
  "ETHUSDT": {
    "symbol": "ETHUSDT",
    "open": "3380.00000000",
    "high": "3450.00000000",
    "low": "3360.00000000",
    "close": "3421.50000000",
    "volume": "185432.12000000",
    "change_pct": "1.23000000",
    "trade_count": 892341
  }
}

Get Historical Candles

GET /api/v1/market/candles/{symbol}

Get historical OHLCV candle data from TimescaleDB continuous aggregates. Candles are returned oldest-first.

Authentication: None — public endpoint

Path Parameters:

ParameterTypeDescription
symbolstringTrading pair symbol (e.g., BTCUSDT)

Query Parameters:

ParameterTypeRequiredDefaultDescription
intervalstringNo"1h"Candle interval: "1m", "5m", "1h", or "1d"
limitintegerNo100Number of candles to return (1–1000)
start_timestringNoStart of time range (ISO-8601 UTC, inclusive)
end_timestringNoEnd of time range (ISO-8601 UTC, inclusive)

When computing indicators like SMA or RSI, request more candles than you need for the lookback window. For RSI-14, request at least 28 candles to get stable values.

Example Request:

# Last 24 hourly candles
curl "https://api.tradeready.io/api/v1/market/candles/BTCUSDT?interval=1h&limit=24"

# Daily candles for a specific date range
curl "https://api.tradeready.io/api/v1/market/candles/BTCUSDT?interval=1d&start_time=2026-01-01T00:00:00Z&end_time=2026-03-01T00:00:00Z"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
candles = client.get_candles("BTCUSDT", interval="1h", limit=50)

for candle in candles.candles:
    print(candle.time, candle.open, candle.close, candle.volume)

# Compute a simple moving average from closing prices
closes = [float(c.close) for c in candles.candles]
sma_20 = sum(closes[-20:]) / 20

Example Response:

{
  "symbol": "BTCUSDT",
  "interval": "1h",
  "candles": [
    {
      "time": "2026-03-18T09:00:00Z",
      "open": "64200.00000000",
      "high": "64600.00000000",
      "low": "64100.00000000",
      "close": "64521.30000000",
      "volume": "1234.56700000",
      "trade_count": 18432
    },
    {
      "time": "2026-03-18T10:00:00Z",
      "open": "64521.30000000",
      "high": "64750.00000000",
      "low": "64400.00000000",
      "close": "64680.00000000",
      "volume": "987.12300000",
      "trade_count": 14201
    }
  ],
  "count": 24
}

Error Responses:

CodeHTTPCondition
INVALID_SYMBOL400Symbol not found or unsupported interval

Get Recent Trades

GET /api/v1/market/trades/{symbol}

Get recent public trade ticks from the platform's tick history. Trades are returned newest-first.

Authentication: None — public endpoint

Path Parameters:

ParameterTypeDescription
symbolstringTrading pair symbol (e.g., BTCUSDT)

Query Parameters:

ParameterTypeRequiredDefaultDescription
limitintegerNo100Number of trades to return (1–500)

Example Request:

curl "https://api.tradeready.io/api/v1/market/trades/BTCUSDT?limit=50"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
trades = client.get_recent_trades("BTCUSDT", limit=50)

for trade in trades.trades:
    side = "SELL" if trade.is_buyer_maker else "BUY"
    print(f"{side} {trade.quantity} @ {trade.price}")

Example Response:

{
  "symbol": "BTCUSDT",
  "trades": [
    {
      "trade_id": 3123456789,
      "price": "64521.30000000",
      "quantity": "0.01200000",
      "time": "2026-03-19T10:00:00.543Z",
      "is_buyer_maker": false
    },
    {
      "trade_id": 3123456788,
      "price": "64518.70000000",
      "quantity": "0.05000000",
      "time": "2026-03-19T09:59:59.891Z",
      "is_buyer_maker": true
    }
  ]
}

Error Responses:

CodeHTTPCondition
INVALID_SYMBOL400Symbol not found

Get Order Book

GET /api/v1/market/orderbook/{symbol}

Get a simulated order book snapshot generated from the current mid-price. Quantities are synthetic — this does not reflect real Binance liquidity.

The order book is a simulation. It generates synthetic bid/ask levels around the current mid-price using a deterministic algorithm. It is useful for testing order book parsing logic, but should not be used to estimate real market impact or liquidity.

Authentication: None — public endpoint

Path Parameters:

ParameterTypeDescription
symbolstringTrading pair symbol (e.g., BTCUSDT)

Query Parameters:

ParameterTypeRequiredDefaultDescription
depthintegerNo10Number of levels per side: 5, 10, or 20

Example Request:

curl "https://api.tradeready.io/api/v1/market/orderbook/BTCUSDT?depth=5"
from agentexchange import AgentExchangeClient

client = AgentExchangeClient(api_key="ak_live_...")
book = client.get_orderbook("BTCUSDT", depth=5)

best_bid = book.bids[0]   # [price_str, qty_str]
best_ask = book.asks[0]
spread = float(best_ask[0]) - float(best_bid[0])
print(f"Spread: {spread:.2f} USDT")

Example Response:

{
  "symbol": "BTCUSDT",
  "bids": [
    ["64514.87", "1.234"],
    ["64508.44", "2.891"],
    ["64501.92", "0.543"],
    ["64495.10", "4.120"],
    ["64488.67", "1.876"]
  ],
  "asks": [
    ["64527.73", "0.987"],
    ["64534.16", "3.456"],
    ["64540.88", "1.230"],
    ["64547.21", "2.100"],
    ["64553.94", "0.678"]
  ],
  "timestamp": "2026-03-19T10:00:00Z"
}

Bids are sorted highest-price first. Asks are sorted lowest-price first. Each entry is a [price, quantity] string pair.

Error Responses:

CodeHTTPCondition
INVALID_SYMBOL400Symbol not found or invalid depth value
PRICE_NOT_AVAILABLE503No live price in cache yet

Real-Time Prices via WebSocket

For latency-sensitive agents that need continuous price feeds, use the WebSocket API instead of polling:

{"action": "subscribe", "channel": "ticker", "symbol": "BTCUSDT"}

See the WebSocket reference for connection details, available channels, and message formats.

On this page