<!-- Generated from TradeReady.io docs. Visit https://tradeready.io/docs for the full experience. -->

---
title: Market Data
description: 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.

> **Info:**
> 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:**

```bash
curl "https://api.tradeready.io/api/v1/market/pairs?status=active"
```
**Python SDK:**

```python
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:**

```json
{
  "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:**

```bash
curl https://api.tradeready.io/api/v1/market/price/BTCUSDT
```
**Python SDK:**

```python
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:**

```json
{
  "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:**

**curl:**

```bash
# 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"
```
**Python SDK:**

```python
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:**

```json
{
  "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:**

```bash
curl https://api.tradeready.io/api/v1/market/ticker/ETHUSDT
```
**Python SDK:**

```python
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:**

```json
{
  "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:**

```bash
curl "https://api.tradeready.io/api/v1/market/tickers?symbols=BTCUSDT,ETHUSDT,SOLUSDT"
```
**Python SDK:**

```python
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:**

```json
{
  "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) |

> **Info:**
> 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:**

**curl:**

```bash
# 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"
```
**Python SDK:**

```python
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:**

```json
{
  "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:**

```bash
curl "https://api.tradeready.io/api/v1/market/trades/BTCUSDT?limit=50"
```
**Python SDK:**

```python
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:**

```json
{
  "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.

> **Warning:**
> 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:**

```bash
curl "https://api.tradeready.io/api/v1/market/orderbook/BTCUSDT?depth=5"
```
**Python SDK:**

```python
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:**

```json
{
  "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:

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

See the [WebSocket reference](/docs/websocket) for connection details, available channels, and message formats.
