Market Data
Real-time prices, OHLCV candles, tickers, trade history, and order book for 600+ trading pairs.
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:
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter 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:
| Field | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., "BTCUSDT") |
base_asset | string | Base currency (e.g., "BTC") |
quote_asset | string | Quote currency — always "USDT" on this platform |
status | string | "active" or "inactive" |
min_qty | string | Minimum order quantity in base asset |
step_size | string | Quantity increment (lot size) |
min_notional | string | Minimum 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:
| Parameter | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (case-insensitive, e.g., BTCUSDT) |
Example Request:
curl https://api.tradeready.io/api/v1/market/price/BTCUSDTfrom agentexchange import AgentExchangeClient
client = AgentExchangeClient(api_key="ak_live_...")
price = client.get_price("BTCUSDT")
print(price.price) # Decimal('64521.30000000')
print(price.timestamp) # datetime objectExample Response:
{
"symbol": "BTCUSDT",
"price": "64521.30000000",
"timestamp": "2026-03-19T10:00:00.123456Z"
}
Error Responses:
| Code | HTTP | Condition |
|---|---|---|
INVALID_SYMBOL | 400 | Symbol not found in active trading pairs |
PRICE_NOT_AVAILABLE | 503 | No 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:
| Parameter | Type | Required | Description |
|---|---|---|---|
symbols | string | No | Comma-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:
| Parameter | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., ETHUSDT) |
Example Request:
curl https://api.tradeready.io/api/v1/market/ticker/ETHUSDTfrom 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:
| Code | HTTP | Condition |
|---|---|---|
INVALID_SYMBOL | 400 | Symbol not found |
PRICE_NOT_AVAILABLE | 503 | No 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:
| Parameter | Type | Required | Description |
|---|---|---|---|
symbols | string | Yes | Comma-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:
| Parameter | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., BTCUSDT) |
Query Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
interval | string | No | "1h" | Candle interval: "1m", "5m", "1h", or "1d" |
limit | integer | No | 100 | Number of candles to return (1–1000) |
start_time | string | No | — | Start of time range (ISO-8601 UTC, inclusive) |
end_time | string | No | — | End 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:]) / 20Example 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:
| Code | HTTP | Condition |
|---|---|---|
INVALID_SYMBOL | 400 | Symbol 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:
| Parameter | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., BTCUSDT) |
Query Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 100 | Number 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:
| Code | HTTP | Condition |
|---|---|---|
INVALID_SYMBOL | 400 | Symbol 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:
| Parameter | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., BTCUSDT) |
Query Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
depth | integer | No | 10 | Number 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:
| Code | HTTP | Condition |
|---|---|---|
INVALID_SYMBOL | 400 | Symbol not found or invalid depth value |
PRICE_NOT_AVAILABLE | 503 | No 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.