Laevitas API V2 v1.8.0
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
WebSocket Streaming API
For real-time data streams, see the WebSocket Documentation.
Available channels:
| Description | Channel |
|---|---|
| Live trades | trades.{market}.{exchange}.{instrument} |
| OHLC ticker | ohlc.ticker.{market}.{exchange}.{instrument}.{timeframe} |
| OHLC VT | ohlc.vt.{market}.{exchange}.{instrument}.{timeframe} |
| variable | Examples |
|---|---|
| market | perpetuals, futures, options |
| exchange | supported exchange (e.g., binance, okx, deribit, bybit, hyperliquid) |
| instrument | instrument name (e.g., BTC-PERPETUAL, ETH-30JUN23-2000-C) |
| timeframe | 1m, 5m, 15m, 1h, 4h, 1d |
Authentication
All requests require an API key in the header:
http
X-API-Key: your-api-key-here
Quick Start
curl -X GET "https://apiv2.laevitas.ch/futures/ohlcvt?exchange=deribit&instrument_name=BTC-PERPETUAL" -H "X-API-Key: your-api-key-here"
Python Example: Fetch Metadata and OHLCVT Data
This example shows how to fetch metadata first to get data availability, then query OHLCVT data for BTC-PERPETUAL on Deribit:
import requests
from datetime import datetime
API_KEY = "your-api-key-here"
BASE_URL = "https://apiv2.laevitas.ch"
HEADERS = {"X-API-Key": API_KEY}
# Step 1: Fetch metadata to get start date and data availability
metadata_response = requests.get(
f"{BASE_URL}/perpetuals/metadata",
headers=HEADERS,
params={
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"limit": 100
}
)
metadata = metadata_response.json()
print(f"Instrument: {metadata['instrument_name']}")
print(f"Exchange: {metadata['exchange']}")
print(f"Data available from: {metadata['start_date']}")
print(f"Data available until: {metadata['end_date']}")
print(f"Total records: {metadata['total_count']:,}")
print(f"Total pages (limit=100): {metadata['total_pages']:,}")
# Step 2: Fetch OHLCVT data using the start date from metadata
ohlcvt_response = requests.get(
f"{BASE_URL}/perpetuals/ohlcvt",
headers=HEADERS,
params={
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"resolution": "1h",
"start": metadata['start_date'],
"limit": 100
}
)
ohlcvt_data = ohlcvt_response.json()
print(f"\nFetched {len(ohlcvt_data['data'])} OHLCVT records")
print(f"First record timestamp: {ohlcvt_data['data'][0]['minute']}")
# Step 3: Paginate through data using cursor
next_cursor = ohlcvt_data['meta']['next_cursor']
if next_cursor:
next_page_response = requests.get(
f"{BASE_URL}/perpetuals/ohlcvt",
headers=HEADERS,
params={
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"resolution": "1h",
"start": metadata['start_date'],
"cursor": next_cursor,
"limit": 100
}
)
next_page_data = next_page_response.json()
print(f"Next page has {len(next_page_data['data'])} records")
Available Data
Perpetuals
- OHLCVT candlestick data with volume breakdown
- Mark and index reference prices
- Open interest tracking
- Funding rates and carry metrics
- Trade-by-trade data
- Best bid/ask snapshots
- Metadata endpoint for data availability
Futures
- OHLCVT candlestick data with volume breakdown
- Mark and index reference prices
- Open interest tracking
- Trade-by-trade data
- Best bid/ask snapshots
- Metadata endpoint for data availability
Options
- Options OHLC with Greeks and IV
- Volatility surface data
- Options flow and volume
- Open interest by strike/expiry
- Metadata endpoint for data availability
Supported Exchanges
Binance, OKX, Deribit, Bybit, Hyperliquid (futures only)
Response Format
All endpoints return paginated JSON responses with cursor-based navigation for large datasets.
Rate Limiting
Default: 240 requests per 60 seconds per API key
Support
- Email: [email protected]
- WebSocket API: /websocket
- Changelog: /api/v1/changelog
Base URLs:
Authentication
- API Key (X-API-Key)
- Parameter Name: X-API-Key, in: header. API key for authentication. Contact support to obtain a key.
Futures
Futures market data, reference prices, and analytics
Futures Catalog
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/catalog',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/catalog', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/catalog \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/catalog
Returns a list of available futures instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Filter by exchange (e.g., deribit, binance, okx, bybit, hyperliquid) |
Example responses
200 Response
[
{
"instrument_name": "BNBUSD_251226",
"exchange": "binance"
},
{
"instrument_name": "BNBUSD_260327",
"exchange": "binance"
},
{
"instrument_name": "BTC-25DEC26",
"exchange": "deribit"
}
]
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Metadata
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/metadata?exchange=deribit&instrument_name=BTC-25DEC26',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/metadata', params={
'exchange': 'deribit', 'instrument_name': 'BTC-25DEC26'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/metadata?exchange=deribit&instrument_name=BTC-25DEC26 \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/metadata
Returns metadata for a specific futures instrument including data availability, total record count, and pagination information.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name |
| limit | query | number | false | Number of records per page for pagination calculation |
| instrument_name | query | string | true | Instrument name |
Example responses
200 Response
{
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"start_date": "2020-01-01T00:00:00.000Z",
"end_date": "2025-11-21T23:59:00.000Z",
"total_count": 1500000,
"total_pages": 15000
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Metadata successfully retrieved | MetadataResponseEntity |
| 400 | Bad Request | Bad Request - Invalid parameters or no data found | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures OHLCVT Market Data
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/ohlcvt',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/ohlcvt', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/ohlcvt \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/ohlcvt
Retrieves Open, High, Low, Close, Volume, and Trade statistics for futures and perpetual contracts.
Key Features: - Historical trade-based OHLC candlestick data - Buy/sell volume breakdown - Trade count statistics - Liquidation and block trade volume tracking - Mark and index price references - Support for multiple resolutions (1m, 5m, 1h) - Filter by instrument type (perpetual vs dated futures)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"open": 109307.5,
"high": 109307.5,
"low": 109307.5,
"close": 109307.5,
"vwap": 109307.5,
"volume": 5830,
"buy_volume": 0,
"sell_volume": 5830,
"trades_count": 2,
"buy_trades_count": 0,
"sell_trades_count": 2,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 109224.93,
"index_price": 103721.05,
"days_to_expiry": 324.9166666666667
},
{
"date": "2025-11-04 11:01:00",
"open": 109139.43,
"high": 109139.43,
"low": 109139.43,
"close": 109139.43,
"vwap": 109139.43,
"volume": 0,
"buy_volume": 0,
"sell_volume": 0,
"trades_count": 0,
"buy_trades_count": 0,
"sell_trades_count": 0,
"liquidation_short_volume": 3200,
"liquidation_long_volume": 5800,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 109139.43,
"index_price": 103641.58,
"days_to_expiry": 324.91597222222225
},
{
"date": "2025-11-04 11:02:00",
"open": 109183.39,
"high": 109183.39,
"low": 109183.39,
"close": 109183.39,
"vwap": 109183.39,
"volume": 0,
"buy_volume": 0,
"sell_volume": 0,
"trades_count": 0,
"buy_trades_count": 0,
"sell_trades_count": 0,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": 50000,
"block_trade_sell_volume": 35000,
"mark_price": 109183.39,
"index_price": 103686.12,
"days_to_expiry": 324.91527777777776
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OHLCVT data successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Level 1
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/level1',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/level1', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/level1 \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/level1
Returns level 1 order book data for futures instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"bid_price_open": 109295,
"bid_price_high": 109347.5,
"bid_price_low": 109120,
"bid_price_close": 109182.5,
"ask_price_open": 109330,
"ask_price_high": 109367.5,
"ask_price_low": 109207.5,
"ask_price_close": 109225,
"bid_size_open": 5730,
"bid_size_high": 48510,
"bid_size_low": 320,
"bid_size_close": 40000,
"ask_size_open": 700,
"ask_size_high": 59890,
"ask_size_low": 490,
"ask_size_close": 40000,
"bid_ask_spread_open": 35,
"bid_ask_spread_high": 192.5,
"bid_ask_spread_low": 2.5,
"bid_ask_spread_close": 42.5,
"total_liquidity_open": 40700,
"total_liquidity_high": 99890,
"total_liquidity_low": 1110,
"total_liquidity_close": 80000,
"total_liquidity_avg": 23645.138121546963
},
{
"date": "2025-11-04 11:01:00",
"bid_price_open": 109187.5,
"bid_price_high": 109242.5,
"bid_price_low": 109110,
"bid_price_close": 109125,
"ask_price_open": 109215,
"ask_price_high": 109315,
"ask_price_low": 109135,
"ask_price_close": 109135,
"bid_size_open": 7460,
"bid_size_high": 45000,
"bid_size_low": 40,
"bid_size_close": 3520,
"ask_size_open": 6980,
"ask_size_high": 135000,
"ask_size_low": 700,
"ask_size_close": 700,
"bid_ask_spread_open": 27.5,
"bid_ask_spread_high": 112.5,
"bid_ask_spread_low": 5,
"bid_ask_spread_close": 10,
"total_liquidity_open": 7250,
"total_liquidity_high": 148430,
"total_liquidity_low": 740,
"total_liquidity_close": 4220,
"total_liquidity_avg": 21844.923547400613
},
{
"date": "2025-11-04 11:02:00",
"bid_price_open": 109125,
"bid_price_high": 109260,
"bid_price_low": 109110,
"bid_price_close": 109162.5,
"ask_price_open": 109135,
"ask_price_high": 109330,
"ask_price_low": 109135,
"ask_price_close": 109182.5,
"bid_size_open": 4370,
"bid_size_high": 45000,
"bid_size_low": 40,
"bid_size_close": 4550,
"ask_size_open": 700,
"ask_size_high": 90000,
"ask_size_low": 670,
"ask_size_close": 700,
"bid_ask_spread_open": 10,
"bid_ask_spread_high": 165,
"bid_ask_spread_low": 5,
"bid_ask_spread_close": 20,
"total_liquidity_open": 6200,
"total_liquidity_high": 103430,
"total_liquidity_low": 1220,
"total_liquidity_close": 5250,
"total_liquidity_avg": 21753.742038216562
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures L2 Orderbook
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/orderbook',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/orderbook', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/orderbook \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/orderbook
Returns aggregated L2 orderbook depth metrics for futures instruments.
Key Features: - Bid/ask liquidity at 4 depth levels (10, 20, 50, 100 levels) - Order book imbalance metrics (OHLC + average) per depth - Microprice (liquidity-weighted mid-price) - Snapshot count per time bucket - Support for multiple resolutions (1m, 5m, 15m, 1h, 4h, 1d)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2026-01-22 07:20:00",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"instrument_type": "future",
"maturity": "25DEC26",
"days_to_expiry": 64.7,
"bid_liq_10_open": 12.5,
"bid_liq_10_high": 18.2,
"bid_liq_10_low": 8.1,
"bid_liq_10_close": 14.3,
"bid_liq_10_avg": 13.1,
"bid_liq_20_open": 25.8,
"bid_liq_20_high": 35,
"bid_liq_20_low": 18.5,
"bid_liq_20_close": 28.1,
"bid_liq_20_avg": 26.4,
"bid_liq_50_open": 65.2,
"bid_liq_50_high": 82,
"bid_liq_50_low": 50.3,
"bid_liq_50_close": 70.5,
"bid_liq_50_avg": 66.8,
"bid_liq_100_open": 120.5,
"bid_liq_100_high": 155,
"bid_liq_100_low": 95.2,
"bid_liq_100_close": 130.8,
"bid_liq_100_avg": 124.3,
"ask_liq_10_open": 15.3,
"ask_liq_10_high": 22.1,
"ask_liq_10_low": 10.5,
"ask_liq_10_close": 17.8,
"ask_liq_10_avg": 16.2,
"ask_liq_20_open": 30.1,
"ask_liq_20_high": 42,
"ask_liq_20_low": 22.5,
"ask_liq_20_close": 33.5,
"ask_liq_20_avg": 31,
"ask_liq_50_open": 78.5,
"ask_liq_50_high": 95,
"ask_liq_50_low": 60.2,
"ask_liq_50_close": 82.1,
"ask_liq_50_avg": 77.5,
"ask_liq_100_open": 145.2,
"ask_liq_100_high": 180,
"ask_liq_100_low": 110.5,
"ask_liq_100_close": 152.3,
"ask_liq_100_avg": 142.1,
"imbalance_10_open": -0.1,
"imbalance_10_high": 0.25,
"imbalance_10_low": -0.35,
"imbalance_10_close": -0.11,
"imbalance_10_avg": -0.09,
"imbalance_20_open": -0.08,
"imbalance_20_high": 0.2,
"imbalance_20_low": -0.3,
"imbalance_20_close": -0.09,
"imbalance_20_avg": -0.07,
"imbalance_50_open": -0.09,
"imbalance_50_high": 0.15,
"imbalance_50_low": -0.25,
"imbalance_50_close": -0.08,
"imbalance_50_avg": -0.06,
"imbalance_100_open": -0.09,
"imbalance_100_high": 0.12,
"imbalance_100_low": -0.2,
"imbalance_100_close": -0.08,
"imbalance_100_avg": -0.06,
"microprice_open": 105250.5,
"microprice_high": 105320,
"microprice_low": 105180,
"microprice_close": 105290.2,
"microprice_avg": 105260.8,
"snapshot_count": 60
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI2LTAxLTIyIDA3OjIxOjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | L2 orderbook data successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures L2 Orderbook Raw Snapshots
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/orderbook-raw',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/orderbook-raw', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/orderbook-raw \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/orderbook-raw
Returns raw L2 orderbook snapshots for futures instruments with full bid/ask arrays.
Key Features: - Full bid/ask price levels (up to 100 levels each) - Pre-computed liquidity at 4 depth levels (10, 20, 50, 100) - Order book imbalance per depth - Microprice (liquidity-weighted mid-price) - Individual snapshots (not aggregated) — 30-day data retention
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26). Either instrument_name or currency is required. |
| currency | query | string | false | Base currency (e.g. BTC, ETH). Returns trades across ALL dated futures for this currency. Either currency or instrument_name is required. |
| direction | query | string | false | Filter by trade direction (aggressor side) |
| block_only | query | boolean | false | If true, only return trades with a block_trade_id (block trades). |
| min_amount | query | number | false | Minimum trade amount (in contracts). Filters out dust trades. |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values (e.g. calendar_spread). |
| maturity | query | string | false | Filter by maturity date (e.g. 25DEC26). Only for dated futures. |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to ASC for instrument mode, DESC for currency mode. |
| top_n | query | number | false | Return top N trades by the sort field (DESC). Overrides limit and sort_dir. No pagination cursor returned. |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_CALENDAR_SPREAD |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | COMBO_ROLL_BACK |
| strategy | COMBO_ROLL_FORWARD |
| strategy | COVERED_CALL_WITH_FUTURE |
| strategy | Closed COMBO_CALENDAR_SPREAD |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | Opened COMBO_CALENDAR_SPREAD |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | SHORT_FUTURE |
| sort | timestamp |
| sort | amount |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"timestamp": 1769066457868,
"date": "2026-01-22T07:20:57.000Z",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"instrument_type": "future",
"maturity": "25DEC26",
"days_to_expiry": 64.7,
"margin_type": "inverse",
"multiplier": 1,
"depth": 100,
"bids": [
{
"price": 105250,
"size": 1.5
},
{
"price": 105249.5,
"size": 0.8
}
],
"asks": [
{
"price": 105250.5,
"size": 2.1
},
{
"price": 105251,
"size": 1.2
}
],
"bid_liquidity_10": 12.5,
"ask_liquidity_10": 15.3,
"bid_liquidity_20": 25.8,
"ask_liquidity_20": 30.1,
"bid_liquidity_50": 65.2,
"ask_liquidity_50": 78.5,
"bid_liquidity_100": 120.5,
"ask_liquidity_100": 145.2,
"imbalance_10": -0.1,
"imbalance_20": -0.08,
"imbalance_50": -0.09,
"imbalance_100": -0.09,
"microprice": 105250.3
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOjE3NjkwNjY0NTc4Njh9"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Raw L2 orderbook snapshots successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Volume Stats
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/volume',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/volume', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/volume \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/volume
Returns rolling 24h volume metrics (base and USD) for futures instruments filtered by currency with optional aggregation and interval bucketing.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"volume_24h": 29.54344186,
"volume_usd_24h": 3297310
},
{
"date": "2025-11-04 11:01:00",
"volume_24h": 29.54264721,
"volume_usd_24h": 3297220
},
{
"date": "2025-11-04 11:02:00",
"volume_24h": 29.54264721,
"volume_usd_24h": 3297220
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successfully retrieved futures volume data | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Trades Summary
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/trades/summary', params={
'exchange': 'deribit', 'currency': 'BTC', 'group_by': 'exchange'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/trades/summary
Returns aggregated trade statistics for dated futures grouped by a chosen axis. One compact call replaces scanning individual trades. Returns grouped stats: trade_count, volume, buy/sell_volume, net_oi_change, block stats, avg_price, vwap. Group by: exchange, instrument_name, maturity, direction, or strategy.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | true | Exchange name (e.g., deribit, binance) |
| currency | query | string | true | Base currency (e.g. BTC, ETH) |
| group_by | query | string | true | Axis to group results by |
| direction | query | string | false | Filter by trade direction |
| block_only | query | boolean | false | If true, only include block trades. |
| min_amount | query | number | false | Minimum trade amount (in contracts). |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values. |
| maturity | query | string | false | Filter by maturity date (e.g. 25DEC26). |
Enumerated Values
| Parameter | Value |
|---|---|
| group_by | exchange |
| group_by | instrument_name |
| group_by | maturity |
| group_by | direction |
| group_by | strategy |
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_CALENDAR_SPREAD |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | COMBO_ROLL_BACK |
| strategy | COMBO_ROLL_FORWARD |
| strategy | COVERED_CALL_WITH_FUTURE |
| strategy | Closed COMBO_CALENDAR_SPREAD |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | Opened COMBO_CALENDAR_SPREAD |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | SHORT_FUTURE |
Example responses
200 Response
{
"data": [
{
"group_key": "25DEC26",
"trade_count": 150,
"volume": 1234.5,
"buy_volume": 700.2,
"sell_volume": 534.3,
"net_oi_change": 120.5,
"block_trade_count": 5,
"block_trade_volume": 200,
"avg_price": 95000,
"vwap": 95100
}
],
"metadata": {
"group_by": "maturity",
"total_trades": 150,
"total_volume": 1234.5
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Trade History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/trades',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/trades', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/trades \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/trades
Returns futures trades with full trade details. Supports two modes: (1) instrument mode — provide instrument_name for a single dated future, (2) currency mode — provide currency (e.g. BTC) for ALL dated futures trades across all instruments. Additional filters: direction, block_only, min_amount, strategy, maturity, sort, sort_dir. Use top_n for quick top-trades scanning.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26). Either instrument_name or currency is required. |
| currency | query | string | false | Base currency (e.g. BTC, ETH). Returns trades across ALL dated futures for this currency. Either currency or instrument_name is required. |
| direction | query | string | false | Filter by trade direction (aggressor side) |
| block_only | query | boolean | false | If true, only return trades with a block_trade_id (block trades). |
| min_amount | query | number | false | Minimum trade amount (in contracts). Filters out dust trades. |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values (e.g. calendar_spread). |
| maturity | query | string | false | Filter by maturity date (e.g. 25DEC26). Only for dated futures. |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to ASC for instrument mode, DESC for currency mode. |
| top_n | query | number | false | Return top N trades by the sort field (DESC). Overrides limit and sort_dir. No pagination cursor returned. |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_CALENDAR_SPREAD |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | COMBO_ROLL_BACK |
| strategy | COMBO_ROLL_FORWARD |
| strategy | COVERED_CALL_WITH_FUTURE |
| strategy | Closed COMBO_CALENDAR_SPREAD |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | Opened COMBO_CALENDAR_SPREAD |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | SHORT_FUTURE |
| sort | timestamp |
| sort | amount |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"instrument_name": "BTC-25DEC26",
"date": "2025-11-04T11:01:55.040Z",
"timestamp": 1758876115040,
"trade_id": "386518052",
"block_trade_id": "",
"combo_id": "BTC-FS-25SEP26_26JUN26",
"combo_trade_id": "386518051",
"strategy": "COMBO_CALENDAR_SPREAD",
"direction": "sell",
"tick_direction": 2,
"amount": 23750,
"price": 117287.5,
"index_price": 109621.72,
"oi_change": null,
"open_interest": 1095380,
"oi_before": 1095380,
"maturity": "25SEP26",
"days_to_expiry": 363.9709,
"basis": 7665.779999999999
},
{
"instrument_name": "BTC-25DEC26",
"date": "2025-11-04T11:01:55.040Z",
"timestamp": 1758885173562,
"trade_id": "386539875",
"block_trade_id": "",
"combo_id": "BTC-FS-25SEP26_26JUN26",
"combo_trade_id": "386539874",
"strategy": "COMBO_CALENDAR_SPREAD",
"direction": "buy",
"tick_direction": 2,
"amount": 50000,
"price": 116762.5,
"index_price": 108916.75,
"oi_change": 50000,
"open_interest": 2985210,
"oi_before": 2935210,
"maturity": "25SEP26",
"days_to_expiry": 363.866,
"basis": 7845.75
},
{
"instrument_name": "BTC-25DEC26",
"date": "2025-11-04T11:01:55.040Z",
"timestamp": 1758885174875,
"trade_id": "386539878",
"block_trade_id": "",
"combo_id": "BTC-FS-25SEP26_26JUN26",
"combo_trade_id": "386539877",
"strategy": "COMBO_CALENDAR_SPREAD",
"direction": "sell",
"tick_direction": 0,
"amount": 50000,
"price": 116797,
"index_price": 108913.27,
"oi_change": 50000,
"open_interest": 3035210,
"oi_before": 2985210,
"maturity": "25SEP26",
"days_to_expiry": 363.866,
"basis": 7883.729999999996
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOiIxNzU4ODk5MjAxMDY0IiwidHJhZGVfaWQiOiIzODY2MjA5ODgifQ=="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Open Interest
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/open-interest',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/open-interest', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/open-interest \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/open-interest
Aggregates open interest across the selected instrument or currency using the requested resolution.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"oi_open": 559.1289933303566,
"oi_high": 559.7229134379199,
"oi_low": 559.0182983385522,
"oi_close": 559.6348745657242
},
{
"date": "2025-11-04 11:01:00",
"oi_open": 559.666130831103,
"oi_high": 560.0817095526673,
"oi_low": 559.5719114785235,
"oi_close": 560.0732934009276
},
{
"date": "2025-11-04 11:02:00",
"oi_open": 560.0728315462629,
"oi_high": 560.0728315462629,
"oi_low": 559.4456693812764,
"oi_close": 559.8441531321868
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Ticker History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/ticker-history',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/ticker-history', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/ticker-history \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/ticker-history
Returns historical ticker data for futures instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price": 109224.93,
"index_price": 103721.05,
"bid_price": 109182.5,
"ask_price": 109225,
"bid_ask_spread": 42.5,
"bid_size": 40000,
"ask_size": 40000,
"oi": 559.6348745657242,
"volume_usd_24h": 3297310,
"days_to_expiry": 324.9166666666667
},
{
"date": "2025-11-04 11:01:00",
"mark_price": 109139.43,
"index_price": 103641.58,
"bid_price": 109125,
"ask_price": 109135,
"bid_ask_spread": 10,
"bid_size": 3520,
"ask_size": 700,
"oi": 560.0732934009276,
"volume_usd_24h": 3297220,
"days_to_expiry": 324.91597222222225
},
{
"date": "2025-11-04 11:02:00",
"mark_price": 109184.1,
"index_price": 103686.53,
"bid_price": 109162.5,
"ask_price": 109182.5,
"bid_ask_spread": 20,
"bid_size": 4550,
"ask_size": 700,
"oi": 559.8441531321868,
"volume_usd_24h": 3297220,
"days_to_expiry": 324.91527777777776
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Carry
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/carry',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/carry', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/carry \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/carry
Returns carry/basis data (mark price minus index price) for dated futures instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"timestamp": 1733788800000,
"minute": "2024-12-10T00:00:00.000Z",
"basis_open": 5503.88,
"basis_high": 5519.17,
"basis_low": 5497.57,
"basis_close": 5503.88
},
{
"timestamp": 1733788860000,
"minute": "2024-12-10T00:01:00.000Z",
"basis_open": 5503.88,
"basis_high": 5534.09,
"basis_low": 5497.65,
"basis_close": 5497.57
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI0LTEyLTEwIDAwOjAxOjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Reference Prices
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/reference-price',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/reference-price', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/reference-price \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/reference-price
Returns reference price data for futures instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price_open": 109334.18,
"mark_price_high": 109355.83,
"mark_price_low": 109207.75,
"mark_price_close": 109224.93,
"index_price_open": 103814.31,
"index_price_high": 103834.66,
"index_price_low": 103703.62,
"index_price_close": 103721.05,
"underlying_price": 19321.37
},
{
"date": "2025-11-04 11:01:00",
"mark_price_open": 109218.83,
"mark_price_high": 109237.22,
"mark_price_low": 109137.79,
"mark_price_close": 109139.43,
"index_price_open": 103715.64,
"index_price_high": 103732.25,
"index_price_low": 103639.67,
"index_price_close": 103641.58,
"underlying_price": 19321.37
},
{
"date": "2025-11-04 11:02:00",
"mark_price_open": 109139.52,
"mark_price_high": 109261.87,
"mark_price_low": 109139.52,
"mark_price_close": 109184.1,
"index_price_open": 103641.87,
"index_price_high": 103755.75,
"index_price_low": 103641.87,
"index_price_close": 103686.53,
"underlying_price": 19321.37
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Snapshot
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/snapshot?exchange=deribit',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/snapshot', params={
'exchange': 'deribit'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/snapshot?exchange=deribit \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/snapshot
Returns a snapshot of all futures instruments for a given exchange at a single minute. If no date is provided, returns the latest available snapshot. Currency is optional.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
| currency | query | string | false | Base currency filter (e.g., BTC, ETH) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"mark_price": 109224.93,
"index_price": 103721.05,
"bid_price": 109182.5,
"ask_price": 109225,
"bid_ask_spread": 42.5,
"bid_size": 40000,
"ask_size": 40000,
"oi": 559.63,
"volume_usd_24h": 3297310,
"days_to_expiry": 324.92
},
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "ETH-25DEC26",
"currency": "ETH",
"mark_price": 3212.45,
"index_price": 3180.12,
"bid_price": 3210,
"ask_price": 3215,
"bid_ask_spread": 5,
"bid_size": 500,
"ask_size": 600,
"oi": 12450.5,
"volume_usd_24h": 8540000,
"days_to_expiry": 143.92
}
],
"meta": {
"minute": "2025-11-04 11:00:00"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Futures Liquidation History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/futures/liquidations',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/futures/liquidations', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/futures/liquidations \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/futures/liquidations
Returns individual forced liquidation events for dated futures. Supports filtering by direction, position side, and minimum USD amount. Data available for binance, bybit, and okx exchanges.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit, hyperliquid) |
| instrument_name | query | string | false | Full futures instrument identifier (e.g., BTC-25DEC26, ETH-25DEC26) |
| direction | query | string | false | Filter by liquidation order direction (buy = short squeeze, sell = long liquidation) |
| position_side | query | string | false | Filter by position side being liquidated |
| min_amount_usd | query | number | false | Minimum liquidation value in USD. Filters out small liquidations. |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to DESC (newest/largest first). |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| position_side | long |
| position_side | short |
| sort | timestamp |
| sort | amount_usd |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"instrument_name": "BTCUSD_250627",
"timestamp": 1772104946628,
"date": "2026-02-26T18:22:26.628Z",
"exchange": "binance",
"currency": "BTC",
"direction": "sell",
"position_side": "long",
"category": "forced",
"price": 68187.4,
"amount": 0.075,
"amount_base": 0.075,
"amount_usd": 5114.05,
"mark_price": 68187.5,
"index_price": 68222.5,
"margin_type": "linear",
"maturity": "250627",
"days_to_expiry": 121.2,
"trade_id": null,
"order_id": null
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOjE3NzIxMDQ5NDYwMDB9"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options
Options market data, Greeks, and volatility analytics
Options Catalog
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/catalog',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/catalog', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/catalog \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/catalog
Returns a list of available options instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Filter by exchange (e.g., deribit, binance, okx, bybit, hyperliquid) |
Example responses
200 Response
[
{
"instrument_name": "AVAX_USDC-22NOV25-12-C",
"exchange": "deribit"
},
{
"instrument_name": "AVAX_USDC-22NOV25-12-P",
"exchange": "deribit"
},
{
"instrument_name": "AVAX_USDC-22NOV25-12d4-C",
"exchange": "deribit"
}
]
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Metadata
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/metadata?exchange=deribit&instrument_name=BTC-27FEB26-80000-C',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/metadata', params={
'exchange': 'deribit', 'instrument_name': 'BTC-27FEB26-80000-C'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/metadata?exchange=deribit&instrument_name=BTC-27FEB26-80000-C \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/metadata
Returns metadata for a specific options instrument including data availability, total record count, and pagination information.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name |
| limit | query | number | false | Number of records per page for pagination calculation |
| instrument_name | query | string | true | Instrument name |
Example responses
200 Response
{
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"start_date": "2020-01-01T00:00:00.000Z",
"end_date": "2025-11-21T23:59:00.000Z",
"total_count": 1500000,
"total_pages": 15000
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Metadata successfully retrieved | MetadataResponseEntity |
| 400 | Bad Request | Bad Request - Invalid parameters or no data found | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options OHLC Market Data
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/ohlcvt',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/ohlcvt', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/ohlcvt \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/ohlcvt
Returns open, high, low, close, volume, and trade statistics for a specific option instrument aggregated by the requested resolution.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"open": 0.2157,
"high": 0.2157,
"low": 0.2157,
"close": 0.2157,
"vwap": 0.2157,
"volume": 0,
"buy_volume": 0,
"sell_volume": 0,
"trades_count": 0,
"buy_trades_count": 0,
"sell_trades_count": 0,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 0.2157,
"index_price": 103722.83,
"days_to_expiry": 324.9166666666667
},
{
"date": "2025-11-04 11:01:00",
"open": 0.2154,
"high": 0.2154,
"low": 0.2154,
"close": 0.2154,
"vwap": 0.2154,
"volume": 0,
"buy_volume": 0,
"sell_volume": 0,
"trades_count": 0,
"buy_trades_count": 0,
"sell_trades_count": 0,
"liquidation_short_volume": 120,
"liquidation_long_volume": 280,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 0.2154,
"index_price": 103639.67,
"days_to_expiry": 324.91597222222225
},
{
"date": "2025-11-04 11:02:00",
"open": 0.2156,
"high": 0.2156,
"low": 0.2156,
"close": 0.2156,
"vwap": 0.2156,
"volume": 0,
"buy_volume": 0,
"sell_volume": 0,
"trades_count": 0,
"buy_trades_count": 0,
"sell_trades_count": 0,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": 5000,
"block_trade_sell_volume": 3500,
"mark_price": 0.2156,
"index_price": 103695.66,
"days_to_expiry": 324.91527777777776
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OHLCVT data successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Volume Stats
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/volume',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/volume', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/volume \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/volume
Returns rolling 24h volume metrics (base and USD) for options instruments filtered by currency with optional aggregation and interval bucketing.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"volume_24h": 1.2,
"volume_usd_24h": 29521.78
},
{
"date": "2025-11-04 11:01:00",
"volume_24h": 1.2,
"volume_usd_24h": 29521.78
},
{
"date": "2025-11-04 11:02:00",
"volume_24h": 1.2,
"volume_usd_24h": 29521.78
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successfully retrieved options volume data | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Trades Summary
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/trades/summary', params={
'exchange': 'deribit', 'currency': 'BTC', 'group_by': 'exchange'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/trades/summary
Returns aggregated trade statistics for options grouped by a chosen axis. One compact call replaces scanning individual trades. Returns grouped stats: trade_count, volume, buy/sell_volume, premium_usd, buy/sell_premium_usd, notional, net_oi_change, net_delta/gamma/vega, block_trade_count. Group by: exchange, instrument_name, strike, maturity, option_type, direction, or strategy.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | true | Exchange name (e.g., deribit) |
| currency | query | string | true | Base currency (e.g. BTC, ETH) |
| group_by | query | string | true | Axis to group results by |
| min_premium_usd | query | number | false | Minimum premium in USD. Filters dust trades. |
| min_notional | query | number | false | Minimum notional value in USD. |
| direction | query | string | false | Filter by trade direction |
| block_only | query | boolean | false | If true, only include block trades. |
| opening_only | query | boolean | false | If true, only include opening trades (strategy starts with Opened). |
| option_type | query | string | false | Filter by option type: C (call) or P (put) |
| maturity | query | string | false | Filter by maturity date (e.g. 25DEC26) |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values. |
Enumerated Values
| Parameter | Value |
|---|---|
| group_by | exchange |
| group_by | instrument_name |
| group_by | strike |
| group_by | maturity |
| group_by | option_type |
| group_by | direction |
| group_by | strategy |
| direction | buy |
| direction | sell |
| option_type | C |
| option_type | P |
| strategy | BEAR_CALL_SPREAD |
| strategy | BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | BEAR_PUT_SPREAD |
| strategy | BOX_SPREAD |
| strategy | BULL_CALL_SPREAD |
| strategy | BULL_DIAGONAL_SPREAD (Calls) |
| strategy | BULL_DIAGONAL_SPREAD (Puts) |
| strategy | BULL_PUT_SPREAD |
| strategy | CALL_CALENDAR |
| strategy | CALL_ROLL_BACK/DOWN |
| strategy | CALL_ROLL_BACK/UP |
| strategy | CALL_ROLL_FORWARD/UP |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_CALL_BUTTERFLY |
| strategy | COMBO_CALL_CALENDAR |
| strategy | COMBO_CALL_DIAGONAL |
| strategy | COMBO_CALL_LADDER |
| strategy | COMBO_CALL_RATIO_SPREAD_1X2 |
| strategy | COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | COMBO_CALL_SPREAD |
| strategy | COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | COMBO_IRON_CONDOR |
| strategy | COMBO_PUT_BUTTERFLY |
| strategy | COMBO_PUT_CALENDAR |
| strategy | COMBO_PUT_DIAGONAL |
| strategy | COMBO_PUT_RATIO_SPREAD_1X2 |
| strategy | COMBO_PUT_RATIO_SPREAD_1X3 |
| strategy | COMBO_PUT_RATIO_SPREAD_2X3 |
| strategy | COMBO_PUT_SPREAD |
| strategy | COMBO_RISK_REVERSAL |
| strategy | COMBO_RISK_REVERSAL_ITM |
| strategy | COMBO_STRADDLE |
| strategy | COMBO_STRANGLE |
| strategy | COVERED_CALL_WITH_FUTURE |
| strategy | CUSTOM_STRATEGY |
| strategy | Close_CALL/Open_PUT |
| strategy | Closed BEAR_CALL_SPREAD |
| strategy | Closed BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | Closed BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | Closed BEAR_PUT_SPREAD |
| strategy | Closed BULL_CALL_SPREAD |
| strategy | Closed BULL_DIAGONAL_SPREAD (Calls) |
| strategy | Closed BULL_DIAGONAL_SPREAD (Puts) |
| strategy | Closed BULL_PUT_SPREAD |
| strategy | Closed COMBO_CALL_LADDER |
| strategy | Closed COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | Closed COMBO_CALL_SPREAD |
| strategy | Closed COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | Closed COMBO_IRON_CONDOR |
| strategy | Closed COMBO_PUT_SPREAD |
| strategy | Closed COMBO_STRANGLE |
| strategy | Closed LONG_CALL |
| strategy | Closed LONG_PUT |
| strategy | Closed LONG_RATIO_CALL_SPREAD |
| strategy | Closed LONG_RISK_REVERSAL |
| strategy | Closed LONG_STRADDLE |
| strategy | Closed REVERSE_CALL_CALENDAR |
| strategy | Closed REVERSE_PUT_CALENDAR |
| strategy | Closed SHORT_CALL |
| strategy | Closed SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | Closed SHORT_PUT |
| strategy | Closed SHORT_RATIO_PUT_SPREAD |
| strategy | Closed SHORT_STRADDLE |
| strategy | Closed SHORT_STRANGLE |
| strategy | HEDGED_OPTIONS_STRATEGY |
| strategy | LONG_CALL |
| strategy | LONG_CALL_BUTTERFLY |
| strategy | LONG_IRON_CONDOR |
| strategy | LONG_PUT |
| strategy | LONG_PUT_BUTTERFLY |
| strategy | LONG_PUT_LADDER |
| strategy | LONG_RATIO_CALL_SPREAD |
| strategy | LONG_RATIO_PUT_SPREAD |
| strategy | LONG_RISK_REVERSAL |
| strategy | LONG_STRADDLE |
| strategy | LONG_STRANGLE |
| strategy | Opened BEAR_CALL_SPREAD |
| strategy | Opened BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | Opened BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | Opened BEAR_PUT_SPREAD |
| strategy | Opened BULL_CALL_SPREAD |
| strategy | Opened BULL_DIAGONAL_SPREAD (Calls) |
| strategy | Opened BULL_DIAGONAL_SPREAD (Puts) |
| strategy | Opened BULL_PUT_SPREAD |
| strategy | Opened CALL_CALENDAR |
| strategy | Opened COLLAR_WITH_FUTURE |
| strategy | Opened COMBO_CALL_BUTTERFLY |
| strategy | Opened COMBO_CALL_CALENDAR |
| strategy | Opened COMBO_CALL_DIAGONAL |
| strategy | Opened COMBO_CALL_LADDER |
| strategy | Opened COMBO_CALL_RATIO_SPREAD_1X2 |
| strategy | Opened COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | Opened COMBO_CALL_SPREAD |
| strategy | Opened COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | Opened COMBO_IRON_CONDOR |
| strategy | Opened COMBO_PUT_CALENDAR |
| strategy | Opened COMBO_PUT_DIAGONAL |
| strategy | Opened COMBO_PUT_RATIO_SPREAD_1X2 |
| strategy | Opened COMBO_PUT_RATIO_SPREAD_1X3 |
| strategy | Opened COMBO_PUT_SPREAD |
| strategy | Opened COMBO_RISK_REVERSAL |
| strategy | Opened COMBO_STRADDLE |
| strategy | Opened COMBO_STRANGLE |
| strategy | Opened LONG_CALL |
| strategy | Opened LONG_CALL_BUTTERFLY |
| strategy | Opened LONG_PUT |
| strategy | Opened LONG_PUT_BUTTERFLY |
| strategy | Opened LONG_RATIO_CALL_SPREAD |
| strategy | Opened LONG_STRADDLE |
| strategy | Opened LONG_STRANGLE |
| strategy | Opened PUT_CALENDAR |
| strategy | Opened REVERSE_CALL_CALENDAR |
| strategy | Opened REVERSE_PUT_CALENDAR |
| strategy | Opened SHORT_CALL |
| strategy | Opened SHORT_CALL_BUTTERFLY |
| strategy | Opened SHORT_PUT |
| strategy | Opened SHORT_RATIO_CALL_SPREAD |
| strategy | Opened SHORT_RISK_REVERSAL |
| strategy | Opened SHORT_STRADDLE |
| strategy | Opened SHORT_STRANGLE |
| strategy | PROTECTIVE_PUT_WITH_FUTURE |
| strategy | PUT_CALENDAR |
| strategy | PUT_ROLL_BACK/UP |
| strategy | PUT_ROLL_FORWARD/DOWN |
| strategy | PUT_ROLL_FORWARD/UP |
| strategy | REVERSE_CALL_CALENDAR |
| strategy | REVERSE_PUT_CALENDAR |
| strategy | ROLL_BACK |
| strategy | ROLL_DOWN |
| strategy | ROLL_FORWARD |
| strategy | ROLL_UP |
| strategy | SHORT_CALL |
| strategy | SHORT_CALL_CONDOR |
| strategy | SHORT_COLLAR_WITH_FUTURE |
| strategy | SHORT_IRON_CONDOR |
| strategy | SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | SHORT_PUT |
| strategy | SHORT_PUT_BUTTERFLY |
| strategy | SHORT_PUT_CONDOR |
| strategy | SHORT_RATIO_CALL_SPREAD |
| strategy | SHORT_RATIO_PUT_SPREAD |
| strategy | SHORT_RISK_REVERSAL |
| strategy | SHORT_STRADDLE |
| strategy | SHORT_STRANGLE |
Example responses
200 Response
{
"data": [
{
"group_key": "100000",
"trade_count": 85,
"volume": 500.2,
"buy_volume": 300.1,
"sell_volume": 200.1,
"premium_usd": 1250000,
"buy_premium_usd": 750000,
"sell_premium_usd": 500000,
"notional": 47500000,
"net_oi_change": 120.5,
"net_delta": 45.2,
"net_gamma": 0.003,
"net_vega": 12500,
"block_trade_count": 3
}
],
"metadata": {
"group_by": "strike",
"total_trades": 85,
"total_volume": 500.2
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Trade History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/trades',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/trades', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/trades \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/trades
Returns options trades with full trade details and Greeks. Supports two modes: (1) instrument mode — provide instrument_name for a single option, (2) currency mode — provide currency (e.g. BTC) for ALL options trades across all instruments. Additional filters: min_premium_usd, min_notional, direction, strategy, block_only, opening_only, option_type, maturity, sort, sort_dir.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C). Either instrument_name or currency is required. |
| currency | query | string | false | Base currency (e.g. BTC, ETH). Returns trades across ALL instruments for this currency. Either currency or instrument_name is required. |
| min_premium_usd | query | number | false | Minimum premium in USD. Filters out dust trades. |
| min_notional | query | number | false | Minimum notional value in USD. |
| direction | query | string | false | Filter by trade direction (aggressor side) |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values (e.g. SHORT_CALL,LONG_PUT). |
| block_only | query | boolean | false | If true, only return trades with a block_trade_id (block trades). |
| opening_only | query | boolean | false | If true, only return trades where strategy starts with "Opened" (new positions). |
| option_type | query | string | false | Filter by option type: C (call) or P (put) |
| maturity | query | string | false | Filter by maturity date (e.g. 25DEC26) |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to DESC for currency-level queries (newest/largest first), ASC for instrument-level queries. |
| top_n | query | number | false | Return top N trades by the sort field (DESC). Overrides limit and sort_dir. No pagination cursor returned. |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| strategy | BEAR_CALL_SPREAD |
| strategy | BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | BEAR_PUT_SPREAD |
| strategy | BOX_SPREAD |
| strategy | BULL_CALL_SPREAD |
| strategy | BULL_DIAGONAL_SPREAD (Calls) |
| strategy | BULL_DIAGONAL_SPREAD (Puts) |
| strategy | BULL_PUT_SPREAD |
| strategy | CALL_CALENDAR |
| strategy | CALL_ROLL_BACK/DOWN |
| strategy | CALL_ROLL_BACK/UP |
| strategy | CALL_ROLL_FORWARD/UP |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_CALL_BUTTERFLY |
| strategy | COMBO_CALL_CALENDAR |
| strategy | COMBO_CALL_DIAGONAL |
| strategy | COMBO_CALL_LADDER |
| strategy | COMBO_CALL_RATIO_SPREAD_1X2 |
| strategy | COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | COMBO_CALL_SPREAD |
| strategy | COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | COMBO_IRON_CONDOR |
| strategy | COMBO_PUT_BUTTERFLY |
| strategy | COMBO_PUT_CALENDAR |
| strategy | COMBO_PUT_DIAGONAL |
| strategy | COMBO_PUT_RATIO_SPREAD_1X2 |
| strategy | COMBO_PUT_RATIO_SPREAD_1X3 |
| strategy | COMBO_PUT_RATIO_SPREAD_2X3 |
| strategy | COMBO_PUT_SPREAD |
| strategy | COMBO_RISK_REVERSAL |
| strategy | COMBO_RISK_REVERSAL_ITM |
| strategy | COMBO_STRADDLE |
| strategy | COMBO_STRANGLE |
| strategy | COVERED_CALL_WITH_FUTURE |
| strategy | CUSTOM_STRATEGY |
| strategy | Close_CALL/Open_PUT |
| strategy | Closed BEAR_CALL_SPREAD |
| strategy | Closed BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | Closed BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | Closed BEAR_PUT_SPREAD |
| strategy | Closed BULL_CALL_SPREAD |
| strategy | Closed BULL_DIAGONAL_SPREAD (Calls) |
| strategy | Closed BULL_DIAGONAL_SPREAD (Puts) |
| strategy | Closed BULL_PUT_SPREAD |
| strategy | Closed COMBO_CALL_LADDER |
| strategy | Closed COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | Closed COMBO_CALL_SPREAD |
| strategy | Closed COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | Closed COMBO_IRON_CONDOR |
| strategy | Closed COMBO_PUT_SPREAD |
| strategy | Closed COMBO_STRANGLE |
| strategy | Closed LONG_CALL |
| strategy | Closed LONG_PUT |
| strategy | Closed LONG_RATIO_CALL_SPREAD |
| strategy | Closed LONG_RISK_REVERSAL |
| strategy | Closed LONG_STRADDLE |
| strategy | Closed REVERSE_CALL_CALENDAR |
| strategy | Closed REVERSE_PUT_CALENDAR |
| strategy | Closed SHORT_CALL |
| strategy | Closed SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | Closed SHORT_PUT |
| strategy | Closed SHORT_RATIO_PUT_SPREAD |
| strategy | Closed SHORT_STRADDLE |
| strategy | Closed SHORT_STRANGLE |
| strategy | HEDGED_OPTIONS_STRATEGY |
| strategy | LONG_CALL |
| strategy | LONG_CALL_BUTTERFLY |
| strategy | LONG_IRON_CONDOR |
| strategy | LONG_PUT |
| strategy | LONG_PUT_BUTTERFLY |
| strategy | LONG_PUT_LADDER |
| strategy | LONG_RATIO_CALL_SPREAD |
| strategy | LONG_RATIO_PUT_SPREAD |
| strategy | LONG_RISK_REVERSAL |
| strategy | LONG_STRADDLE |
| strategy | LONG_STRANGLE |
| strategy | Opened BEAR_CALL_SPREAD |
| strategy | Opened BEAR_DIAGONAL_SPREAD (Calls) |
| strategy | Opened BEAR_DIAGONAL_SPREAD (Puts) |
| strategy | Opened BEAR_PUT_SPREAD |
| strategy | Opened BULL_CALL_SPREAD |
| strategy | Opened BULL_DIAGONAL_SPREAD (Calls) |
| strategy | Opened BULL_DIAGONAL_SPREAD (Puts) |
| strategy | Opened BULL_PUT_SPREAD |
| strategy | Opened CALL_CALENDAR |
| strategy | Opened COLLAR_WITH_FUTURE |
| strategy | Opened COMBO_CALL_BUTTERFLY |
| strategy | Opened COMBO_CALL_CALENDAR |
| strategy | Opened COMBO_CALL_DIAGONAL |
| strategy | Opened COMBO_CALL_LADDER |
| strategy | Opened COMBO_CALL_RATIO_SPREAD_1X2 |
| strategy | Opened COMBO_CALL_RATIO_SPREAD_1X3 |
| strategy | Opened COMBO_CALL_SPREAD |
| strategy | Opened COMBO_DIAGONAL_STRADDLE_CALENDAR |
| strategy | Opened COMBO_IRON_CONDOR |
| strategy | Opened COMBO_PUT_CALENDAR |
| strategy | Opened COMBO_PUT_DIAGONAL |
| strategy | Opened COMBO_PUT_RATIO_SPREAD_1X2 |
| strategy | Opened COMBO_PUT_RATIO_SPREAD_1X3 |
| strategy | Opened COMBO_PUT_SPREAD |
| strategy | Opened COMBO_RISK_REVERSAL |
| strategy | Opened COMBO_STRADDLE |
| strategy | Opened COMBO_STRANGLE |
| strategy | Opened LONG_CALL |
| strategy | Opened LONG_CALL_BUTTERFLY |
| strategy | Opened LONG_PUT |
| strategy | Opened LONG_PUT_BUTTERFLY |
| strategy | Opened LONG_RATIO_CALL_SPREAD |
| strategy | Opened LONG_STRADDLE |
| strategy | Opened LONG_STRANGLE |
| strategy | Opened PUT_CALENDAR |
| strategy | Opened REVERSE_CALL_CALENDAR |
| strategy | Opened REVERSE_PUT_CALENDAR |
| strategy | Opened SHORT_CALL |
| strategy | Opened SHORT_CALL_BUTTERFLY |
| strategy | Opened SHORT_PUT |
| strategy | Opened SHORT_RATIO_CALL_SPREAD |
| strategy | Opened SHORT_RISK_REVERSAL |
| strategy | Opened SHORT_STRADDLE |
| strategy | Opened SHORT_STRANGLE |
| strategy | PROTECTIVE_PUT_WITH_FUTURE |
| strategy | PUT_CALENDAR |
| strategy | PUT_ROLL_BACK/UP |
| strategy | PUT_ROLL_FORWARD/DOWN |
| strategy | PUT_ROLL_FORWARD/UP |
| strategy | REVERSE_CALL_CALENDAR |
| strategy | REVERSE_PUT_CALENDAR |
| strategy | ROLL_BACK |
| strategy | ROLL_DOWN |
| strategy | ROLL_FORWARD |
| strategy | ROLL_UP |
| strategy | SHORT_CALL |
| strategy | SHORT_CALL_CONDOR |
| strategy | SHORT_COLLAR_WITH_FUTURE |
| strategy | SHORT_IRON_CONDOR |
| strategy | SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| strategy | SHORT_PUT |
| strategy | SHORT_PUT_BUTTERFLY |
| strategy | SHORT_PUT_CONDOR |
| strategy | SHORT_RATIO_CALL_SPREAD |
| strategy | SHORT_RATIO_PUT_SPREAD |
| strategy | SHORT_RISK_REVERSAL |
| strategy | SHORT_STRADDLE |
| strategy | SHORT_STRANGLE |
| option_type | C |
| option_type | P |
| sort | timestamp |
| sort | premium_usd |
| sort | notional |
| sort | amount |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"instrument_name": "BTC-25SEP26-100000-C",
"timestamp": 1759220633312,
"trade_id": "387076415",
"date": "2025-10-11 12:45:49",
"block_trade_id": "",
"combo_id": "",
"combo_trade_id": "",
"strategy": "Opened SHORT_CALL",
"direction": "sell",
"tick_direction": 1,
"amount": 0.1,
"price": 0.267,
"index_price": 113610.41,
"oi_change": 0.1,
"open_interest": 0.1,
"oi_before": null,
"maturity": "25SEP26",
"days_to_expiry": 359.9834,
"iv": 44.95,
"mark_price": 0.2669,
"ask_price": 0.269,
"bid_price": 0.267,
"ask_size": 2.8,
"bid_size": 9.7,
"bid_iv_change": 0,
"ask_iv_change": 0,
"bid_price_change": -0.002,
"ask_price_change": 0,
"bid_size_change": 0,
"ask_size_change": 0,
"premium": 0.0267,
"premium_usd": 3033.4,
"notional": 11361.04,
"delta": -0.0694643,
"gamma": -6.9e-7,
"vega": -39.54125,
"theta": 2.468719,
"strike": 100000,
"option_type": "C"
},
{
"instrument_name": "BTC-25SEP26-100000-C",
"timestamp": 1760189549998,
"date": "2025-10-11 12:45:49",
"trade_id": "390187993",
"block_trade_id": "",
"combo_id": "",
"combo_trade_id": "",
"strategy": "Opened SHORT_CALL",
"direction": "sell",
"tick_direction": 2,
"amount": 0.1,
"price": 0.261,
"index_price": 112021.37,
"oi_change": 0.1,
"open_interest": 0.2,
"oi_before": 0.1,
"maturity": "25SEP26",
"days_to_expiry": 348.7691,
"iv": 46.9,
"mark_price": 0.2604,
"ask_price": 0.2675,
"bid_price": 0.261,
"ask_size": 27.1,
"bid_size": 18.1,
"bid_iv_change": 0,
"ask_iv_change": 0,
"bid_price_change": -0.0035,
"ask_price_change": 0,
"bid_size_change": 0,
"ask_size_change": 0,
"premium": 0.0261,
"premium_usd": 2923.76,
"notional": 11202.14,
"delta": -0.0683262,
"gamma": -7e-7,
"vega": -38.99059,
"theta": 2.621582,
"strike": 100000,
"option_type": "C"
},
{
"instrument_name": "BTC-25SEP26-100000-C",
"timestamp": 1760461299893,
"trade_id": "391006860",
"date": "2025-10-11 12:45:49",
"block_trade_id": "",
"combo_id": "",
"combo_trade_id": "",
"strategy": "Opened SHORT_CALL",
"direction": "sell",
"tick_direction": 2,
"amount": 0.1,
"price": 0.2595,
"index_price": 111949.78,
"oi_change": 0.1,
"open_interest": 0.3,
"oi_before": 0.2,
"maturity": "25SEP26",
"days_to_expiry": 345.6238,
"iv": 47.14,
"mark_price": 0.2587,
"ask_price": 0.261,
"bid_price": 0.2595,
"ask_size": 2.2,
"bid_size": 2.2,
"bid_iv_change": 0,
"ask_iv_change": 0,
"bid_price_change": -0.0035,
"ask_price_change": 0,
"bid_size_change": 0,
"ask_size_change": 0,
"premium": 0.026,
"premium_usd": 2905.1,
"notional": 11194.98,
"delta": -0.0682762,
"gamma": -7e-7,
"vega": -38.81525,
"theta": 2.647056,
"strike": 100000,
"option_type": "C"
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOjE3NjM0Mzk0NTc1NTksInRyYWRlX2lkIjoiMzk4OTU3NDk3In0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Enumerated Values
| Property | Value |
|---|---|
| direction | buy |
| direction | sell |
Options Flow Summary
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/flow?exchange=deribit¤cy=BTC',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/flow', params={
'exchange': 'deribit', 'currency': 'BTC'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/flow?exchange=deribit¤cy=BTC \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/flow
Returns an aggregated flow summary for a currency including total trades, premium breakdowns (call/put, buy/sell), net Greeks (delta, gamma, vega), opening/closing counts, block trade stats, most active strikes, and notable trades. One call returns everything pre-computed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | true | Exchange name (e.g., deribit) |
| currency | query | string | true | Base currency (e.g. BTC, ETH). Required. |
| resolution | query | string | false | Time bucket resolution for aggregation. |
| min_premium_usd | query | number | false | Minimum premium_usd per trade to include in aggregation. Filters dust before aggregating. |
| top_n | query | number | false | Number of notable trades to return. Default 10. |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"summary": {
"total_trades": 0,
"total_premium_usd": 0,
"total_notional_usd": 0,
"call_premium_usd": 0,
"put_premium_usd": 0,
"buy_premium_usd": 0,
"sell_premium_usd": 0,
"net_delta": 0,
"net_gamma": 0,
"net_vega": 0,
"opening_trades": 0,
"closing_trades": 0,
"net_oi_change": 0,
"block_trade_count": 0,
"block_trade_premium_usd": 0,
"most_active_strikes": [
{
"instrument_name": "string",
"trade_count": 0,
"premium_usd": 0,
"net_oi_change": 0
}
]
},
"notable_trades": [
{
"instrument_name": "BTC-25DEC26",
"timestamp": 1234567890123,
"date": "2023-06-15T14:30:00.000Z",
"trade_id": "trade_123456",
"block_trade_id": "block_123",
"combo_id": "combo_123",
"combo_trade_id": "combo_trade_123",
"strategy": "strategy_1",
"direction": "buy",
"tick_direction": 1,
"amount": 1.5,
"price": 45000.5,
"index_price": 45010,
"oi_change": 100,
"open_interest": 10000,
"oi_before": 9900
}
]
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Flow summary successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » summary | OptionsFlowSummaryEntity | false | none | none |
| »» total_trades | number | true | none | Total number of trades in window |
| »» total_premium_usd | number | true | none | Total premium across all trades in USD |
| »» total_notional_usd | number | true | none | Total notional across all trades in USD |
| »» call_premium_usd | number | true | none | Total premium for call options in USD |
| »» put_premium_usd | number | true | none | Total premium for put options in USD |
| »» buy_premium_usd | number | true | none | Total premium for buy-side trades in USD |
| »» sell_premium_usd | number | true | none | Total premium for sell-side trades in USD |
| »» net_delta | number | true | none | Net delta across all trades |
| »» net_gamma | number | true | none | Net gamma across all trades |
| »» net_vega | number | true | none | Net vega across all trades |
| »» opening_trades | number | true | none | Number of opening trades (strategy starts with Opened) |
| »» closing_trades | number | true | none | Number of closing trades (strategy starts with Closed) |
| »» net_oi_change | number | true | none | Net open interest change |
| »» block_trade_count | number | true | none | Number of block trades |
| »» block_trade_premium_usd | number | true | none | Block trade premium in USD |
| »» most_active_strikes | [OptionsFlowActiveStrikeEntity] | true | none | Most active instruments by premium |
| »»» instrument_name | string | true | none | Instrument name |
| »»» trade_count | number | true | none | Number of trades on this instrument |
| »»» premium_usd | number | true | none | Total premium in USD |
| »»» net_oi_change | number | true | none | Net open interest change |
| » notable_trades | [OptionsTradeEntity] | false | none | none |
| »» instrument_name | string | true | none | Instrument identifier |
| »» timestamp | number | true | none | Unix timestamp in milliseconds |
| »» date | string | true | none | ISO 8601 formatted date string |
| »» trade_id | string | true | none | Unique trade identifier |
| »» block_trade_id | string | false | none | Block trade identifier if applicable |
| »» combo_id | string | false | none | Combo trade identifier if applicable |
| »» combo_trade_id | string | false | none | Combo trade ID if part of combo |
| »» strategy | string | false | none | Trading strategy identifier |
| »» direction | string | true | none | Trade direction |
| »» tick_direction | object¦null | false | none | Tick direction indicator |
| »» amount | number | true | none | Trade amount/size |
| »» price | number | true | none | Trade execution price |
| »» index_price | object¦null | false | none | Index price at time of trade |
| »» oi_change | object¦null | false | none | Change in open interest |
| »» open_interest | object¦null | false | none | Open interest after trade |
| »» oi_before | object¦null | false | none | Open interest before trade |
Enumerated Values
| Property | Value |
|---|---|
| direction | buy |
| direction | sell |
Options Open Interest
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/open-interest',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/open-interest', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/open-interest \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/open-interest
Aggregates open interest across the selected instrument or currency using the requested resolution.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"oi_open": 2.6,
"oi_high": 2.6,
"oi_low": 2.6,
"oi_close": 2.6
},
{
"date": "2025-11-04 11:01:00",
"oi_open": 2.6,
"oi_high": 2.6,
"oi_low": 2.6,
"oi_close": 2.6
},
{
"date": "2025-11-04 11:02:00",
"oi_open": 2.6,
"oi_high": 2.6,
"oi_low": 2.6,
"oi_close": 2.6
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Level 1
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/level1',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/level1', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/level1 \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/level1
Returns level 1 order book data for options instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"bid_price_open": 0.212,
"bid_price_high": 0.212,
"bid_price_low": 0.2115,
"bid_price_close": 0.2115,
"ask_price_open": 0.2195,
"ask_price_high": 0.22,
"ask_price_low": 0.2195,
"ask_price_close": 0.22,
"bid_size_open": 19.3,
"bid_size_high": 19.3,
"bid_size_low": 19.3,
"bid_size_close": 19.3,
"ask_size_open": 19.4,
"ask_size_high": 31.3,
"ask_size_low": 12,
"ask_size_close": 31.3,
"bid_ask_spread_open": 0.007500000000000007,
"bid_ask_spread_high": 0.008500000000000008,
"bid_ask_spread_low": 0.007500000000000007,
"bid_ask_spread_close": 0.008500000000000008,
"total_liquidity_open": 38.7,
"total_liquidity_high": 50.6,
"total_liquidity_low": 31.3,
"total_liquidity_close": 50.6,
"total_liquidity_avg": 43.16666666666667
},
{
"date": "2025-11-04 11:01:00",
"bid_price_open": 0.2115,
"bid_price_high": 0.2115,
"bid_price_low": 0.2115,
"bid_price_close": 0.2115,
"ask_price_open": 0.22,
"ask_price_high": 0.22,
"ask_price_low": 0.22,
"ask_price_close": 0.22,
"bid_size_open": 19.3,
"bid_size_high": 19.3,
"bid_size_low": 19.3,
"bid_size_close": 19.3,
"ask_size_open": 31.3,
"ask_size_high": 31.3,
"ask_size_low": 31.3,
"ask_size_close": 31.3,
"bid_ask_spread_open": 0.008500000000000008,
"bid_ask_spread_high": 0.008500000000000008,
"bid_ask_spread_low": 0.008500000000000008,
"bid_ask_spread_close": 0.008500000000000008,
"total_liquidity_open": 50.6,
"total_liquidity_high": 50.6,
"total_liquidity_low": 50.6,
"total_liquidity_close": 50.6,
"total_liquidity_avg": 50.600000000000016
},
{
"date": "2025-11-04 11:02:00",
"bid_price_open": 0.211,
"bid_price_high": 0.214,
"bid_price_low": 0.211,
"bid_price_close": 0.214,
"ask_price_open": 0.22,
"ask_price_high": 0.22,
"ask_price_low": 0.219,
"ask_price_close": 0.219,
"bid_size_open": 19.3,
"bid_size_high": 19.3,
"bid_size_low": 0.3,
"bid_size_close": 0.3,
"ask_size_open": 31.3,
"ask_size_high": 31.3,
"ask_size_low": 19.3,
"ask_size_close": 19.6,
"bid_ask_spread_open": 0.009000000000000008,
"bid_ask_spread_high": 0.009000000000000008,
"bid_ask_spread_low": 0.0050000000000000044,
"bid_ask_spread_close": 0.0050000000000000044,
"total_liquidity_open": 50.6,
"total_liquidity_high": 50.6,
"total_liquidity_low": 19.6,
"total_liquidity_close": 19.900000000000002,
"total_liquidity_avg": 26.576190476190483
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Volatility & Greeks
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/volatility',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/volatility', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/volatility \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/volatility
Returns implied volatility and Greeks data for options instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"strike": 100000,
"maturity": "25SEP26",
"days_to_expiry": 324.9166666666667,
"underlying_price": 109227.13,
"mark_iv_open": 47.62,
"mark_iv_high": 47.62,
"mark_iv_low": 47.62,
"mark_iv_close": 47.62,
"bid_iv_open": 46.42,
"bid_iv_high": 46.53,
"bid_iv_low": 46.36,
"bid_iv_close": 46.4,
"ask_iv_open": 48.6,
"ask_iv_high": 48.89,
"ask_iv_low": 48.57,
"ask_iv_close": 48.87,
"iv_spread_open": 2.1799999999999997,
"iv_spread_high": 2.47,
"iv_spread_low": 2.17,
"iv_spread_close": 2.469999999999999,
"iv_spread_avg": 2.3077777777777784,
"delta": 0.66315,
"gamma": 0.00001,
"theta": -27.57357,
"vega": 376.24963,
"rho": 435.06539
},
{
"date": "2025-11-04 11:01:00",
"strike": 100000,
"maturity": "25SEP26",
"days_to_expiry": 324.91597222222225,
"underlying_price": 109138.04,
"mark_iv_open": 47.62,
"mark_iv_high": 47.62,
"mark_iv_low": 47.62,
"mark_iv_close": 47.62,
"bid_iv_open": 46.45,
"bid_iv_high": 46.51,
"bid_iv_low": 46.39,
"bid_iv_close": 46.51,
"ask_iv_open": 48.92,
"ask_iv_high": 48.98,
"ask_iv_low": 48.86,
"ask_iv_close": 48.98,
"iv_spread_open": 2.469999999999999,
"iv_spread_high": 2.47,
"iv_spread_low": 2.46,
"iv_spread_close": 2.469999999999999,
"iv_spread_avg": 2.4662499999999987,
"delta": 0.66249,
"gamma": 0.00001,
"theta": -27.57106,
"vega": 376.22951,
"rho": 434.42588
},
{
"date": "2025-11-04 11:02:00",
"strike": 100000,
"maturity": "25SEP26",
"days_to_expiry": 324.91527777777776,
"underlying_price": 109194.74,
"mark_iv_open": 47.62,
"mark_iv_high": 47.62,
"mark_iv_low": 47.62,
"mark_iv_close": 47.62,
"bid_iv_open": 46.51,
"bid_iv_high": 47.17,
"bid_iv_low": 46.24,
"bid_iv_close": 47.17,
"ask_iv_open": 48.97,
"ask_iv_high": 48.97,
"ask_iv_low": 48.54,
"ask_iv_close": 48.62,
"iv_spread_open": 2.460000000000001,
"iv_spread_high": 2.47,
"iv_spread_low": 1.45,
"iv_spread_close": 1.4499999999999957,
"iv_spread_avg": 1.8576190476190468,
"delta": 0.66291,
"gamma": 0.00001,
"theta": -27.57346,
"vega": 376.24168,
"rho": 434.82764
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjQwOjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Ticker History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/ticker-history',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/ticker-history', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/ticker-history \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/ticker-history
Returns historical ticker data for options instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price": 0.2157,
"index_price": 103722.83,
"bid_price": 0.2115,
"ask_price": 0.22,
"bid_ask_spread": 0.008500000000000008,
"bid_size": 19.3,
"ask_size": 31.3,
"oi": 2.6,
"volume_usd_24h": 29521.78,
"bid_iv": 46.4,
"ask_iv": 48.87,
"mark_iv": 47.62,
"iv_spread": 2.469999999999999
},
{
"date": "2025-11-04 11:01:00",
"mark_price": 0.2154,
"index_price": 103639.67,
"bid_price": 0.2115,
"ask_price": 0.22,
"bid_ask_spread": 0.008500000000000008,
"bid_size": 19.3,
"ask_size": 31.3,
"oi": 2.6,
"volume_usd_24h": 29521.78,
"bid_iv": 46.51,
"ask_iv": 48.98,
"mark_iv": 47.62,
"iv_spread": 2.469999999999999
},
{
"date": "2025-11-04 11:02:00",
"mark_price": 0.2156,
"index_price": 103695.66,
"bid_price": 0.214,
"ask_price": 0.219,
"bid_ask_spread": 0.0050000000000000044,
"bid_size": 0.3,
"ask_size": 19.6,
"oi": 2.6,
"volume_usd_24h": 29521.78,
"bid_iv": 47.17,
"ask_iv": 48.62,
"mark_iv": 47.62,
"iv_spread": 1.4499999999999957
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Reference Prices
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/reference-price',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/reference-price', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/reference-price \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/reference-price
Returns reference price data for options instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full options instrument identifier (e.g., BTC-27FEB26-80000-C, ETH-25DEC26-4000-P) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price_open": 0.2162,
"mark_price_high": 0.2162,
"mark_price_low": 0.2156,
"mark_price_close": 0.2157,
"underlying_price": 109227.13,
"days_to_expiry": 324.9166666666667,
"index_price": 103722.83
},
{
"date": "2025-11-04 11:01:00",
"mark_price_open": 0.2156,
"mark_price_high": 0.2157,
"mark_price_low": 0.2154,
"mark_price_close": 0.2154,
"underlying_price": 109138.04,
"days_to_expiry": 324.91597222222225,
"index_price": 103639.67
},
{
"date": "2025-11-04 11:02:00",
"mark_price_open": 0.2153,
"mark_price_high": 0.2158,
"mark_price_low": 0.2153,
"mark_price_close": 0.2156,
"underlying_price": 109194.74,
"days_to_expiry": 324.91527777777776,
"index_price": 103695.66
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Options Snapshot
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/snapshot?exchange=deribit¤cy=BTC',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/snapshot', params={
'exchange': 'deribit', 'currency': 'BTC'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/snapshot?exchange=deribit¤cy=BTC \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/snapshot
Returns a snapshot of all options instruments for a given exchange and currency at a single minute. If no date is provided, returns the latest available snapshot. Currency is required due to the large dataset size.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
| currency | query | string | true | Base currency (e.g., BTC, ETH). Required for options due to large dataset size. |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "BTC-27FEB26-80000-C",
"currency": "BTC",
"mark_price": 0.2157,
"index_price": 103722.83,
"bid_price": 0.2115,
"ask_price": 0.22,
"bid_ask_spread": 0.0085,
"bid_size": 19.3,
"ask_size": 31.3,
"oi": 2.6,
"volume_usd_24h": 29521.78,
"bid_iv": 46.4,
"ask_iv": 48.87,
"mark_iv": 47.62,
"iv_spread": 2.47
},
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "BTC-27FEB26-80000-C",
"currency": "BTC",
"mark_price": 0.0542,
"index_price": 103722.83,
"bid_price": 0.053,
"ask_price": 0.0555,
"bid_ask_spread": 0.0025,
"bid_size": 10.1,
"ask_size": 15.4,
"oi": 5.2,
"volume_usd_24h": 12340.5,
"bid_iv": 52.1,
"ask_iv": 54.3,
"mark_iv": 53.15,
"iv_spread": 2.2
}
],
"meta": {
"minute": "2025-11-04 11:00:00"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Vol Surface By Expiry
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/vol-surface/by-expiry?exchange=deribit¤cy=BTC',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/vol-surface/by-expiry', params={
'exchange': 'deribit', 'currency': 'BTC'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/vol-surface/by-expiry?exchange=deribit¤cy=BTC \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/vol-surface/by-expiry
Returns ATM IV, 25-delta skew, and 25-delta butterfly across all real expiries for a given exchange and currency at a single point in time. If no date is provided, returns the latest available snapshot. Uses delta-proximity to find ATM (delta closest to 0.5) and 25-delta options.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| currency | query | string | true | Base currency (e.g., BTC, ETH). Required for vol-surface queries. |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04T11:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "29NOV25",
"days_to_expiry": 25.5,
"underlying_price": 103722.83,
"atm_iv": 47.62,
"call_25d_iv": 43.8,
"put_25d_iv": 52.1,
"skew_25d": 8.3,
"butterfly_25d": 0.33
},
{
"date": "2025-11-04T11:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "27DEC25",
"days_to_expiry": 53.5,
"underlying_price": 103722.83,
"atm_iv": 52.1,
"call_25d_iv": 48.5,
"put_25d_iv": 56.8,
"skew_25d": 8.3,
"butterfly_25d": 0.55
},
{
"date": "2025-11-04T11:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "28MAR26",
"days_to_expiry": 144.5,
"underlying_price": 103722.83,
"atm_iv": 55.3,
"call_25d_iv": 51.2,
"put_25d_iv": 60.1,
"skew_25d": 8.9,
"butterfly_25d": 0.35
}
],
"meta": {
"date": "2025-11-04T11:00:00.000Z",
"next_date": "2025-11-04T11:01:00.000Z"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Vol Surface By Tenor
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/vol-surface/by-tenor?exchange=deribit¤cy=BTC',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/vol-surface/by-tenor', params={
'exchange': 'deribit', 'currency': 'BTC'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/vol-surface/by-tenor?exchange=deribit¤cy=BTC \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/vol-surface/by-tenor
Returns ATM IV, 25-delta skew, and 25-delta butterfly interpolated to fixed constant-maturity tenors (1d, 7d, 14d, 30d, 60d, 90d, 180d, 365d). Uses linear interpolation in total variance space. Flat extrapolation at edges.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| currency | query | string | true | Base currency (e.g., BTC, ETH). Required for vol-surface queries. |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"tenor": 1,
"atm_iv": 43.74,
"call_25d_iv": 41.2,
"put_25d_iv": 46.8,
"skew_25d": 5.6,
"butterfly_25d": 0.26
},
{
"tenor": 7,
"atm_iv": 40.43,
"call_25d_iv": 38.1,
"put_25d_iv": 43.9,
"skew_25d": 5.8,
"butterfly_25d": 0.57
},
{
"tenor": 14,
"atm_iv": 38.66,
"call_25d_iv": 36.5,
"put_25d_iv": 41.8,
"skew_25d": 5.3,
"butterfly_25d": 0.49
},
{
"tenor": 30,
"atm_iv": 38.55,
"call_25d_iv": 36.2,
"put_25d_iv": 41.9,
"skew_25d": 5.7,
"butterfly_25d": 0.5
},
{
"tenor": 60,
"atm_iv": 39.92,
"call_25d_iv": 37.4,
"put_25d_iv": 43.1,
"skew_25d": 5.7,
"butterfly_25d": 0.33
},
{
"tenor": 90,
"atm_iv": 41.3,
"call_25d_iv": 38.8,
"put_25d_iv": 44.5,
"skew_25d": 5.7,
"butterfly_25d": 0.35
},
{
"tenor": 180,
"atm_iv": 44.78,
"call_25d_iv": 42.1,
"put_25d_iv": 48.2,
"skew_25d": 6.1,
"butterfly_25d": 0.37
},
{
"tenor": 365,
"atm_iv": 47.15,
"call_25d_iv": 44.3,
"put_25d_iv": 50.8,
"skew_25d": 6.5,
"butterfly_25d": 0.4
}
],
"meta": {
"date": "2025-11-04T11:00:00.000Z",
"next_date": "2025-11-04T11:01:00.000Z"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Vol Surface By Time
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/options/vol-surface/by-time?exchange=deribit¤cy=BTC&maturity=25DEC26',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/options/vol-surface/by-time', params={
'exchange': 'deribit', 'currency': 'BTC', 'maturity': '25DEC26'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/options/vol-surface/by-time?exchange=deribit¤cy=BTC&maturity=25DEC26 \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/options/vol-surface/by-time
Returns a paginated time-series of ATM IV, 25-delta skew, and 25-delta butterfly for the specified exchange and currency. Filter by maturity to track one expiry across time. Uses cursor-based pagination.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| currency | query | string | true | Base currency (e.g., BTC, ETH). Required for vol-surface queries. |
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| maturity | query | string | true | Maturity to query (e.g., 25DEC26). Required for vol-surface history due to large dataset size. |
| resolution | query | string | false | Time resolution for aggregation. Default 1m. |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04T10:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "29NOV25",
"days_to_expiry": 25.54,
"underlying_price": 103500,
"atm_iv": 47.2,
"call_25d_iv": 43.5,
"put_25d_iv": 51.8,
"skew_25d": 8.3,
"butterfly_25d": 0.45
},
{
"date": "2025-11-04T10:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "27DEC25",
"days_to_expiry": 53.54,
"underlying_price": 103500,
"atm_iv": 51.9,
"call_25d_iv": 48.2,
"put_25d_iv": 56.5,
"skew_25d": 8.3,
"butterfly_25d": 0.45
},
{
"date": "2025-11-04T11:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "29NOV25",
"days_to_expiry": 25.5,
"underlying_price": 103722.83,
"atm_iv": 47.62,
"call_25d_iv": 43.8,
"put_25d_iv": 52.1,
"skew_25d": 8.3,
"butterfly_25d": 0.33
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDExOjAwOjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals
Perpetuals Catalog
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/catalog',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/catalog', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/catalog \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/catalog
Returns a list of available perpetual instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Filter by exchange (e.g., deribit, binance, okx, bybit, hyperliquid) |
Example responses
200 Response
[
{
"instrument_name": "0G-USDT-SWAP",
"exchange": "okx"
},
{
"instrument_name": "0GUSDT",
"exchange": "binance"
},
{
"instrument_name": "1000000BOBUSDT",
"exchange": "binance"
}
]
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Metadata
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/metadata?exchange=deribit&instrument_name=BTC-PERPETUAL',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/metadata', params={
'exchange': 'deribit', 'instrument_name': 'BTC-PERPETUAL'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/metadata?exchange=deribit&instrument_name=BTC-PERPETUAL \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/metadata
Returns metadata for a specific perpetual instrument including data availability, total record count, and pagination information.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name |
| limit | query | number | false | Number of records per page for pagination calculation |
| instrument_name | query | string | true | Instrument name |
Example responses
200 Response
{
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"start_date": "2020-01-01T00:00:00.000Z",
"end_date": "2025-11-21T23:59:00.000Z",
"total_count": 1500000,
"total_pages": 15000
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Metadata successfully retrieved | MetadataResponseEntity |
| 400 | Bad Request | Bad Request - Invalid parameters or no data found | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals OHLCVT Market Data
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/ohlcvt',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/ohlcvt', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/ohlcvt \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/ohlcvt
Retrieves Open, High, Low, Close, Volume, and Trade statistics for perpetual contracts.
Key Features: - Historical trade-based OHLC candlestick data - Buy/sell volume breakdown - Trade count statistics - Liquidation and block trade volume tracking - Mark and index price references - Support for multiple resolutions (1m, 5m, 1h)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"open": 103796,
"high": 103820,
"low": 103658.5,
"close": 103673,
"vwap": 103699.66571160624,
"volume": 6184600,
"buy_volume": 1253540,
"sell_volume": 4931060,
"trades_count": 419,
"buy_trades_count": 54,
"sell_trades_count": 365,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 103690.42,
"index_price": 103715.64
},
{
"date": "2025-11-04 11:01:00",
"open": 103673,
"high": 103721,
"low": 103620.5,
"close": 103620.5,
"vwap": 103672.90218204964,
"volume": 2230930,
"buy_volume": 325270,
"sell_volume": 1905660,
"trades_count": 204,
"buy_trades_count": 35,
"sell_trades_count": 169,
"liquidation_short_volume": 15430,
"liquidation_long_volume": 28950,
"block_trade_buy_volume": null,
"block_trade_sell_volume": null,
"mark_price": 103619.18,
"index_price": 103641.58
},
{
"date": "2025-11-04 11:02:00",
"open": 103610,
"high": 103745,
"low": 103610,
"close": 103672.5,
"vwap": 103706.1497721229,
"volume": 3613790,
"buy_volume": 1379460,
"sell_volume": 2234330,
"trades_count": 231,
"buy_trades_count": 70,
"sell_trades_count": 161,
"liquidation_short_volume": null,
"liquidation_long_volume": null,
"block_trade_buy_volume": 250000,
"block_trade_sell_volume": 180000,
"mark_price": 103662.33,
"index_price": 103686.53
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OHLCVT data successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Level 1
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/level1',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/level1', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/level1 \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/level1
Returns level 1 order book data for perpetual instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"bid_price_open": 103795.5,
"bid_price_high": 103819.5,
"bid_price_low": 103658.5,
"bid_price_close": 103673,
"ask_price_open": 103796,
"ask_price_high": 103820,
"ask_price_low": 103666,
"ask_price_close": 103673.5,
"bid_size_open": 141100,
"bid_size_high": 315370,
"bid_size_low": 20,
"bid_size_close": 175500,
"ask_size_open": 160120,
"ask_size_high": 859690,
"ask_size_low": 20,
"ask_size_close": 199550,
"bid_ask_spread_open": 0.5,
"bid_ask_spread_high": 34.5,
"bid_ask_spread_low": 0.5,
"bid_ask_spread_close": 0.5,
"total_liquidity_open": 244470,
"total_liquidity_high": 870680,
"total_liquidity_low": 140,
"total_liquidity_close": 375050,
"total_liquidity_avg": 346298.3168859649
},
{
"date": "2025-11-04 11:01:00",
"bid_price_open": 103673,
"bid_price_high": 103726,
"bid_price_low": 103609.5,
"bid_price_close": 103609.5,
"ask_price_open": 103673.5,
"ask_price_high": 103726.5,
"ask_price_low": 103610,
"ask_price_close": 103610,
"bid_size_open": 173630,
"bid_size_high": 429090,
"bid_size_low": 140,
"bid_size_close": 208530,
"ask_size_open": 175750,
"ask_size_high": 824410,
"ask_size_low": 40,
"ask_size_close": 176980,
"bid_ask_spread_open": 0.5,
"bid_ask_spread_high": 39.5,
"bid_ask_spread_low": 0.5,
"bid_ask_spread_close": 0.5,
"total_liquidity_open": 260070,
"total_liquidity_high": 1014770,
"total_liquidity_low": 13470,
"total_liquidity_close": 385510,
"total_liquidity_avg": 441197.5935828877
},
{
"date": "2025-11-04 11:02:00",
"bid_price_open": 103609.5,
"bid_price_high": 103744.5,
"bid_price_low": 103609.5,
"bid_price_close": 103655,
"ask_price_open": 103610,
"ask_price_high": 103745,
"ask_price_low": 103610,
"ask_price_close": 103655.5,
"bid_size_open": 182250,
"bid_size_high": 581540,
"bid_size_low": 20,
"bid_size_close": 133120,
"ask_size_open": 196980,
"ask_size_high": 565090,
"ask_size_low": 20,
"ask_size_close": 320250,
"bid_ask_spread_open": 0.5,
"bid_ask_spread_high": 32,
"bid_ask_spread_low": 0.5,
"bid_ask_spread_close": 0.5,
"total_liquidity_open": 461780,
"total_liquidity_high": 768070,
"total_liquidity_low": 1820,
"total_liquidity_close": 453370,
"total_liquidity_avg": 317816.1932938856
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals L2 Orderbook
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/orderbook',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/orderbook', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/orderbook \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/orderbook
Returns aggregated L2 orderbook depth metrics for perpetual instruments.
Key Features: - Bid/ask liquidity at 4 depth levels (10, 20, 50, 100 levels) - Order book imbalance metrics (OHLC + average) per depth - Microprice (liquidity-weighted mid-price) - Snapshot count per time bucket - Support for multiple resolutions (1m, 5m, 15m, 1h, 4h, 1d)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2026-01-22 07:20:00",
"exchange": "bybit",
"instrument_name": "BTCUSDT",
"currency": "BTC",
"bid_liq_10_open": 0.301,
"bid_liq_10_high": 0.55,
"bid_liq_10_low": 0.15,
"bid_liq_10_close": 0.42,
"bid_liq_10_avg": 0.35,
"bid_liq_20_open": 0.359,
"bid_liq_20_high": 0.8,
"bid_liq_20_low": 0.2,
"bid_liq_20_close": 0.5,
"bid_liq_20_avg": 0.45,
"bid_liq_50_open": 7.831,
"bid_liq_50_high": 10.5,
"bid_liq_50_low": 5.2,
"bid_liq_50_close": 8.1,
"bid_liq_50_avg": 7.5,
"bid_liq_100_open": 12.891,
"bid_liq_100_high": 18,
"bid_liq_100_low": 9,
"bid_liq_100_close": 14.5,
"bid_liq_100_avg": 13.2,
"ask_liq_10_open": 5.375,
"ask_liq_10_high": 6.2,
"ask_liq_10_low": 4.1,
"ask_liq_10_close": 5.1,
"ask_liq_10_avg": 5,
"ask_liq_20_open": 6.398,
"ask_liq_20_high": 8,
"ask_liq_20_low": 4.5,
"ask_liq_20_close": 6,
"ask_liq_20_avg": 5.8,
"ask_liq_50_open": 18.966,
"ask_liq_50_high": 22,
"ask_liq_50_low": 15,
"ask_liq_50_close": 19.5,
"ask_liq_50_avg": 18.2,
"ask_liq_100_open": 40.834,
"ask_liq_100_high": 50,
"ask_liq_100_low": 30,
"ask_liq_100_close": 42,
"ask_liq_100_avg": 39.5,
"imbalance_10_open": -0.894,
"imbalance_10_high": -0.5,
"imbalance_10_low": -0.95,
"imbalance_10_close": -0.82,
"imbalance_10_avg": -0.78,
"imbalance_20_open": -0.894,
"imbalance_20_high": -0.5,
"imbalance_20_low": -0.95,
"imbalance_20_close": -0.82,
"imbalance_20_avg": -0.78,
"imbalance_50_open": -0.416,
"imbalance_50_high": -0.1,
"imbalance_50_low": -0.6,
"imbalance_50_close": -0.35,
"imbalance_50_avg": -0.38,
"imbalance_100_open": -0.52,
"imbalance_100_high": -0.2,
"imbalance_100_low": -0.7,
"imbalance_100_close": -0.45,
"imbalance_100_avg": -0.48,
"microprice_open": 89967.9,
"microprice_high": 89975,
"microprice_low": 89960,
"microprice_close": 89970.5,
"microprice_avg": 89968.2,
"snapshot_count": 60
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI2LTAxLTIyIDA3OjIxOjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | L2 orderbook data successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals L2 Orderbook Raw Snapshots
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/orderbook-raw',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/orderbook-raw', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/orderbook-raw \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/orderbook-raw
Returns raw L2 orderbook snapshots for perpetual instruments with full bid/ask arrays.
Key Features: - Full bid/ask price levels (up to 100 levels each) - Pre-computed liquidity at 4 depth levels (10, 20, 50, 100) - Order book imbalance per depth - Microprice (liquidity-weighted mid-price) - Individual snapshots (not aggregated) — 30-day data retention
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance) |
| instrument_name | query | string | false | Full perpetual instrument identifier (e.g., BTC-PERPETUAL). Either instrument_name or currency is required. |
| currency | query | string | false | Base currency (e.g. BTC, ETH). Returns trades across ALL perpetuals for this currency. Either currency or instrument_name is required. |
| direction | query | string | false | Filter by trade direction (aggressor side) |
| block_only | query | boolean | false | If true, only return trades with a block_trade_id (block trades). |
| min_amount | query | number | false | Minimum trade amount (in contracts). Filters out dust trades. |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values (e.g. calendar_spread). |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to ASC for instrument mode, DESC for currency mode. |
| top_n | query | number | false | Return top N trades by the sort field (DESC). Overrides limit and sort_dir. No pagination cursor returned. |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed LONG_PERP |
| strategy | Closed SHORT_PERP |
| strategy | HEDGED_OPTIONS_STRATEGY |
| strategy | LONG_PERP |
| strategy | Opened COLLAR_WITH_FUTURE |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | Opened LONG_PERP |
| strategy | Opened SHORT_PERP |
| strategy | PROTECTIVE_PUT_WITH_FUTURE |
| strategy | SHORT_COLLAR_WITH_FUTURE |
| strategy | SHORT_PERP |
| strategy | SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| sort | timestamp |
| sort | amount |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"timestamp": 1769066457868,
"date": "2026-01-22T07:20:57.000Z",
"exchange": "bybit",
"instrument_name": "BTCUSDT",
"currency": "BTC",
"margin_type": "linear",
"multiplier": 1,
"depth": 100,
"bids": [
{
"price": 89967.9,
"size": 0.169
},
{
"price": 89967.8,
"size": 0.002
}
],
"asks": [
{
"price": 89968,
"size": 3.085
},
{
"price": 89968.2,
"size": 0.002
}
],
"bid_liquidity_10": 0.301,
"ask_liquidity_10": 5.375,
"bid_liquidity_20": 0.359,
"ask_liquidity_20": 6.398,
"bid_liquidity_50": 7.831,
"ask_liquidity_50": 18.966,
"bid_liquidity_100": 12.891,
"ask_liquidity_100": 40.834,
"imbalance_10": -0.894,
"imbalance_20": -0.894,
"imbalance_50": -0.416,
"imbalance_100": -0.52,
"microprice": 89967.905
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOjE3NjkwNjY0NTc4Njh9"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Raw L2 orderbook snapshots successfully retrieved | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Volume Stats
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/volume',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/volume', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/volume \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/volume
Returns rolling 24h volume metrics (base and USD) for perpetual instruments filtered by currency with optional aggregation and interval bucketing.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"volume_24h": 13306.97626536,
"volume_usd_24h": 1408049640
},
{
"date": "2025-11-04 11:01:00",
"volume_24h": 13325.84296037,
"volume_usd_24h": 1409996050
},
{
"date": "2025-11-04 11:02:00",
"volume_24h": 13359.76934158,
"volume_usd_24h": 1413511150
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successfully retrieved perpetuals volume data | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Trades Summary
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/trades/summary', params={
'exchange': 'deribit', 'currency': 'BTC', 'group_by': 'exchange'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/trades/summary?exchange=deribit¤cy=BTC&group_by=exchange \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/trades/summary
Returns aggregated trade statistics for perpetual swaps grouped by a chosen axis. One compact call replaces scanning individual trades. Returns grouped stats: trade_count, volume, buy/sell_volume, net_oi_change, block stats, avg_price, vwap. Group by: exchange, instrument_name, direction, or strategy.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | true | Exchange name (e.g., deribit, binance) |
| currency | query | string | true | Base currency (e.g. BTC, ETH) |
| group_by | query | string | true | Axis to group results by |
| direction | query | string | false | Filter by trade direction |
| block_only | query | boolean | false | If true, only include block trades. |
| min_amount | query | number | false | Minimum trade amount (in contracts). |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values. |
Enumerated Values
| Parameter | Value |
|---|---|
| group_by | exchange |
| group_by | instrument_name |
| group_by | direction |
| group_by | strategy |
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed LONG_PERP |
| strategy | Closed SHORT_PERP |
| strategy | HEDGED_OPTIONS_STRATEGY |
| strategy | LONG_PERP |
| strategy | Opened COLLAR_WITH_FUTURE |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | Opened LONG_PERP |
| strategy | Opened SHORT_PERP |
| strategy | PROTECTIVE_PUT_WITH_FUTURE |
| strategy | SHORT_COLLAR_WITH_FUTURE |
| strategy | SHORT_PERP |
| strategy | SHORT_PROTECTIVE_PUT_WITH_FUTURE |
Example responses
200 Response
{
"data": [
{
"group_key": "BTC-PERPETUAL",
"trade_count": 5000,
"volume": 12345.6,
"buy_volume": 6500.3,
"sell_volume": 5845.3,
"net_oi_change": 450.2,
"block_trade_count": 12,
"block_trade_volume": 800,
"avg_price": 95000,
"vwap": 95050
}
],
"metadata": {
"group_by": "instrument_name",
"total_trades": 5000,
"total_volume": 12345.6
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Trade History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/trades',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/trades', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/trades \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/trades
Returns perpetual trades with full trade details. Supports two modes: (1) instrument mode — provide instrument_name for a single perpetual, (2) currency mode — provide currency (e.g. BTC) for ALL perpetual trades across all instruments. Additional filters: direction, block_only, min_amount, strategy, sort, sort_dir. Use top_n for quick top-trades scanning.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance) |
| instrument_name | query | string | false | Full perpetual instrument identifier (e.g., BTC-PERPETUAL). Either instrument_name or currency is required. |
| currency | query | string | false | Base currency (e.g. BTC, ETH). Returns trades across ALL perpetuals for this currency. Either currency or instrument_name is required. |
| direction | query | string | false | Filter by trade direction (aggressor side) |
| block_only | query | boolean | false | If true, only return trades with a block_trade_id (block trades). |
| min_amount | query | number | false | Minimum trade amount (in contracts). Filters out dust trades. |
| strategy | query | string | false | Filter by strategy label. Accepts comma-separated values (e.g. calendar_spread). |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to ASC for instrument mode, DESC for currency mode. |
| top_n | query | number | false | Return top N trades by the sort field (DESC). Overrides limit and sort_dir. No pagination cursor returned. |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| strategy | COLLAR_WITH_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_FUTURE |
| strategy | COMBO_HEDGE_ROLL_TO_PERP |
| strategy | COMBO_PERP_VS_FUTURE |
| strategy | Closed COMBO_PERP_VS_FUTURE_UNWIND |
| strategy | Closed LONG_PERP |
| strategy | Closed SHORT_PERP |
| strategy | HEDGED_OPTIONS_STRATEGY |
| strategy | LONG_PERP |
| strategy | Opened COLLAR_WITH_FUTURE |
| strategy | Opened COMBO_PERP_VS_FUTURE_SPREAD |
| strategy | Opened LONG_PERP |
| strategy | Opened SHORT_PERP |
| strategy | PROTECTIVE_PUT_WITH_FUTURE |
| strategy | SHORT_COLLAR_WITH_FUTURE |
| strategy | SHORT_PERP |
| strategy | SHORT_PROTECTIVE_PUT_WITH_FUTURE |
| sort | timestamp |
| sort | amount |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"instrument_name": "BTC-PERPETUAL",
"timestamp": 1748936294661,
"date": "2025-11-04 11:00:00",
"trade_id": "369968310",
"block_trade_id": "",
"combo_id": "BTC-FS-6JUN25_PERP",
"combo_trade_id": "369968308",
"strategy": "COMBO_PERP_VS_FUTURE",
"direction": "buy",
"tick_direction": 0,
"amount": 500,
"price": 105306.5,
"index_price": 105306.68,
"oi_change": null,
"open_interest": 968197530,
"oi_before": 968197530,
"maturity": "PERPETUAL",
"basis": -0.17999999999301508,
"funding": 0.00001299
},
{
"instrument_name": "BTC-PERPETUAL",
"timestamp": 1748936295702,
"date": "2025-11-04 11:00:00",
"trade_id": "369968315",
"block_trade_id": "",
"combo_id": "BTC-FS-6JUN25_PERP",
"combo_trade_id": "369968313",
"strategy": "COMBO_PERP_VS_FUTURE",
"direction": "buy",
"tick_direction": 0,
"amount": 150,
"price": 105308,
"index_price": 105308.34,
"oi_change": null,
"open_interest": 968197530,
"oi_before": 968197530,
"maturity": "PERPETUAL",
"basis": -0.33999999999650754,
"funding": 0.00001299
},
{
"instrument_name": "BTC-PERPETUAL",
"timestamp": 1748936320292,
"date": "2025-11-04 11:00:00",
"trade_id": "369968340",
"block_trade_id": "",
"combo_id": "BTC-FS-6JUN25_PERP",
"combo_trade_id": "369968338",
"strategy": "COMBO_PERP_VS_FUTURE",
"direction": "buy",
"tick_direction": 0,
"amount": 500,
"price": 105307.5,
"index_price": 105310.39,
"oi_change": null,
"open_interest": 968194400,
"oi_before": 968194400,
"maturity": "PERPETUAL",
"basis": -2.889999999999418,
"funding": 0.00001299
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOiIxNzQ4OTk0NTQ5NDUyIiwidHJhZGVfaWQiOiIzNzAwNDk3NTEifQ=="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Open Interest
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/open-interest',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/open-interest', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/open-interest \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/open-interest
Aggregates open interest across the selected perpetual instrument or currency using the requested resolution.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"oi_open": 14483.836684775828,
"oi_high": 14494.975017789338,
"oi_low": 14480.302050051028,
"oi_close": 14484.75799403648
},
{
"date": "2025-11-04 11:01:00",
"oi_open": 14484.75799403648,
"oi_high": 14495.570477778463,
"oi_low": 14484.624753264488,
"oi_close": 14495.303282654815
},
{
"date": "2025-11-04 11:02:00",
"oi_open": 14495.306080458478,
"oi_high": 14495.349446553402,
"oi_low": 14470.044024835908,
"oi_close": 14479.21911460026
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Ticker History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/ticker-history',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/ticker-history', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/ticker-history \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/ticker-history
Returns historical ticker data for perpetual instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price": 103690.42,
"index_price": 103715.64,
"bid_price": 103673,
"ask_price": 103673.5,
"bid_ask_spread": 0.5,
"bid_size": 175500,
"ask_size": 199550,
"oi": 14484.75799403648,
"volume_usd_24h": 1408049640,
"funding_rate": 5,
"next_funding_time": 155
},
{
"date": "2025-11-04 11:01:00",
"mark_price": 103619.18,
"index_price": 103641.58,
"bid_price": 103609.5,
"ask_price": 103610,
"bid_ask_spread": 0.5,
"bid_size": 208530,
"ask_size": 176980,
"oi": 14495.303282654815,
"volume_usd_24h": 1409996050,
"funding_rate": 5,
"next_funding_time": 155
},
{
"date": "2025-11-04 11:02:00",
"mark_price": 103662.33,
"index_price": 103686.53,
"bid_price": 103655,
"ask_price": 103655.5,
"bid_ask_spread": 0.5,
"bid_size": 133120,
"ask_size": 320250,
"oi": 14479.21911460026,
"volume_usd_24h": 1413511150,
"funding_rate": 5,
"next_funding_time": 155
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Carry
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/carry',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/carry', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/carry \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/carry
Returns carry data including funding rates and basis for perpetual instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"timestamp": 1762250400000,
"minute": "2025-11-04 11:00:00",
"funding_rate_open": 0,
"funding_rate_high": 0,
"funding_rate_low": 0,
"funding_rate_close": 0,
"funding_8h_open": -0.00004634,
"funding_8h_high": -0.00004628,
"funding_8h_low": -0.00004634,
"funding_8h_close": -0.00004628,
"basis_open": -19.69999999999709,
"basis_high": -18.820000000006985,
"basis_low": -23.330000000001746,
"basis_close": -25.220000000001164
},
{
"timestamp": 1762250460000,
"minute": "2025-11-04 11:01:00",
"funding_rate_open": 0,
"funding_rate_high": 0,
"funding_rate_low": -0.00001633,
"funding_rate_close": 0,
"funding_8h_open": -0.00004628,
"funding_8h_high": -0.00004627,
"funding_8h_low": -0.00004628,
"funding_8h_close": -0.00004627,
"basis_open": -25.220000000001164,
"basis_high": -23.020000000004075,
"basis_low": -22.39999999999418,
"basis_close": -22.40000000000873
},
{
"timestamp": 1762250520000,
"minute": "2025-11-04 11:02:00",
"funding_rate_open": 0,
"funding_rate_high": 0,
"funding_rate_low": 0,
"funding_rate_close": 0,
"funding_8h_open": -0.00004626,
"funding_8h_high": -0.00004626,
"funding_8h_low": -0.00004626,
"funding_8h_close": -0.00004626,
"basis_open": -22.70999999999185,
"basis_high": -17.830000000001746,
"basis_low": -22.729999999995925,
"basis_close": -24.19999999999709
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Reference Prices
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/reference-price',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/reference-price', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/reference-price \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/reference-price
Returns reference price data for perpetual instruments.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"mark_price_open": 103794.61,
"mark_price_high": 103815.84,
"mark_price_low": 103680.29,
"mark_price_close": 103690.42,
"index_price_open": 103814.31,
"index_price_high": 103834.66,
"index_price_low": 103703.62,
"index_price_close": 103715.64,
"underlying_price": 19321.37
},
{
"date": "2025-11-04 11:01:00",
"mark_price_open": 103690.42,
"mark_price_high": 103709.23,
"mark_price_low": 103617.27,
"mark_price_close": 103619.18,
"index_price_open": 103715.64,
"index_price_high": 103732.25,
"index_price_low": 103639.67,
"index_price_close": 103641.58,
"underlying_price": 19321.37
},
{
"date": "2025-11-04 11:02:00",
"mark_price_open": 103619.16,
"mark_price_high": 103737.92,
"mark_price_low": 103618.85,
"mark_price_close": 103662.33,
"index_price_open": 103641.87,
"index_price_high": 103755.75,
"index_price_low": 103641.58,
"index_price_close": 103686.53,
"underlying_price": 19321.37
}
],
"meta": {
"next_cursor": "eyJtaW51dGUiOiIyMDI1LTExLTA0IDEyOjM5OjAwIn0="
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Snapshot
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/snapshot?exchange=deribit',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/snapshot', params={
'exchange': 'deribit'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/snapshot?exchange=deribit \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/snapshot
Returns a snapshot of all perpetual instruments for a given exchange at a single minute. If no date is provided, returns the latest available snapshot. Currency is optional.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | true | Exchange name (e.g., deribit, binance, okx, bybit). Required. |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
| currency | query | string | false | Base currency filter (e.g., BTC, ETH) |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"data": [
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"currency": "BTC",
"mark_price": 103690.42,
"index_price": 103715.64,
"bid_price": 103673,
"ask_price": 103673.5,
"bid_ask_spread": 0.5,
"bid_size": 175500,
"ask_size": 199550,
"oi": 14484.76,
"volume_usd_24h": 1408049640,
"funding_rate": 5,
"next_funding_time": 1733788800000
},
{
"date": "2025-11-04 11:00:00",
"exchange": "deribit",
"instrument_name": "ETH-PERPETUAL",
"currency": "ETH",
"mark_price": 3180.25,
"index_price": 3182.1,
"bid_price": 3179.5,
"ask_price": 3180,
"bid_ask_spread": 0.5,
"bid_size": 50000,
"ask_size": 60000,
"oi": 48200.3,
"volume_usd_24h": 520400000,
"funding_rate": 3.2,
"next_funding_time": 1733788800000
}
],
"meta": {
"minute": "2025-11-04 11:00:00"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Perpetuals Liquidation History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/perpetuals/liquidations',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/perpetuals/liquidations', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/perpetuals/liquidations \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/perpetuals/liquidations
Returns individual forced liquidation events for perpetual swaps. Supports filtering by direction, position side, and minimum USD amount. Data available for binance, bybit, and okx exchanges.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name (e.g., deribit, binance, okx, bybit) |
| instrument_name | query | string | false | Full instrument identifier (e.g., BTC-PERPETUAL, BTC-29MAR24-70000-C) |
| direction | query | string | false | Filter by liquidation order direction (buy = short squeeze, sell = long liquidation) |
| position_side | query | string | false | Filter by position side being liquidated |
| min_amount_usd | query | number | false | Minimum liquidation value in USD. Filters out small liquidations. |
| sort | query | string | false | Sort field. Default: timestamp. |
| sort_dir | query | string | false | Sort direction. Defaults to DESC (newest/largest first). |
Enumerated Values
| Parameter | Value |
|---|---|
| direction | buy |
| direction | sell |
| position_side | long |
| position_side | short |
| sort | timestamp |
| sort | amount_usd |
| sort | price |
| sort_dir | ASC |
| sort_dir | DESC |
Example responses
200 Response
{
"data": [
{
"instrument_name": "BTCUSDT",
"timestamp": 1772104946628,
"date": "2026-02-26T18:22:26.628Z",
"exchange": "binance",
"currency": "BTC",
"direction": "sell",
"position_side": "long",
"category": "forced",
"price": 68187.4,
"amount": 0.075,
"amount_base": 0.075,
"amount_usd": 5114.05,
"mark_price": 68187.5,
"index_price": 68222.5,
"margin_type": "linear",
"maturity": null,
"days_to_expiry": null,
"trade_id": null,
"order_id": null
},
{
"instrument_name": "ENSOUSDT",
"timestamp": 1772104947089,
"date": "2026-02-26T18:22:27.089Z",
"exchange": "binance",
"currency": "ENSO",
"direction": "sell",
"position_side": "long",
"category": "forced",
"price": 1.5442,
"amount": 21.7,
"amount_base": 21.7,
"amount_usd": 33.51,
"mark_price": 1.5444,
"index_price": 1.6229,
"margin_type": "linear",
"maturity": null,
"days_to_expiry": null,
"trade_id": null,
"order_id": null
}
],
"meta": {
"next_cursor": "eyJ0aW1lc3RhbXAiOjE3NzIxMDQ5NDYwMDB9"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | Inline |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions
Predictions Catalog
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/catalog',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/catalog', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/catalog \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/catalog
Returns a list of available prediction market instruments. Supports filtering by exchange, category, event_slug, and keyword search.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Filter by exchange |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug (parent event grouping) |
| keyword | query | string | false | Keyword search to filter instruments by name (case-insensitive partial match) |
Example responses
200 Response
{
"success": true,
"data": [
{
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"exchange": "polymarket"
},
{
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-NO",
"exchange": "polymarket"
}
]
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions Categories
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/categories',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/categories', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/categories \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/categories
Returns a list of all prediction market categories with instrument counts.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Filter by exchange |
Example responses
200 Response
[
{
"category": "crypto",
"count": 45
},
{
"category": "politics",
"count": 32
},
{
"category": "sports",
"count": 18
}
]
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions Metadata
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/metadata?instrument_name=will-bitcoin-reach-250000-by-december-31-2026-YES',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/metadata', params={
'instrument_name': 'will-bitcoin-reach-250000-by-december-31-2026-YES'
}, headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/metadata?instrument_name=will-bitcoin-reach-250000-by-december-31-2026-YES \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/metadata
Returns metadata for a specific prediction instrument including data availability, total record count, and pagination information.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Exchange name |
| limit | query | number | false | Number of records per page for pagination calculation |
| instrument_name | query | string | true | Instrument name |
Example responses
200 Response
{
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"start_date": "2020-01-01T00:00:00.000Z",
"end_date": "2025-11-21T23:59:00.000Z",
"total_count": 1500000,
"total_pages": 15000
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Metadata successfully retrieved | MetadataResponseEntity |
| 400 | Bad Request | Bad Request - Invalid parameters or no data found | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions OHLCVT Market Data
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/ohlcvt',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/ohlcvt', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/ohlcvt \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/ohlcvt
Retrieves Open, High, Low, Close, Volume, Trades data for prediction market instruments. Prices represent probabilities (0.0-1.0).
Key Features: - Historical probability-based OHLC candlestick data - Buy/sell volume breakdown - Trade count statistics - Support for multiple resolutions (1m, 5m, 15m, 1h, 4h, 1d)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name |
| instrument_name | query | string | false | Full prediction instrument identifier (e.g., will-bitcoin-reach-250000-by-december-31-2026-YES) |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug (parent event grouping) |
| outcome | query | string | false | Filter by outcome side |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
| outcome | YES |
| outcome | NO |
Example responses
200 Response
{
"success": true,
"data": [
{
"date": "2026-02-20 12:00:00",
"exchange": "polymarket",
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"condition_id": "0xabc...",
"token_id": "12345",
"category": "crypto",
"event_slug": "will-bitcoin-reach-250000-by-december-31-2026",
"open": 0.35,
"high": 0.38,
"low": 0.33,
"close": 0.37,
"vwap": 0.355,
"volume": 1250.5,
"buy_volume": 750.3,
"sell_volume": 500.2,
"trades_count": 85,
"buy_trades_count": 50,
"sell_trades_count": 35,
"last_probability": 0.37
}
],
"meta": {
"next_cursor": null
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OHLCVT data successfully retrieved | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions Ticker History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/ticker-history',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/ticker-history', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/ticker-history \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/ticker-history
Returns historical ticker data for prediction instruments including probability OHLC, bid/ask spread, and liquidity metrics.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name |
| instrument_name | query | string | false | Full prediction instrument identifier (e.g., will-bitcoin-reach-250000-by-december-31-2026-YES) |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug (parent event grouping) |
| outcome | query | string | false | Filter by outcome side |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
| outcome | YES |
| outcome | NO |
Example responses
200 Response
{
"success": true,
"data": [
{
"date": "2026-02-20 12:00:00",
"exchange": "polymarket",
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"probability": 0.37,
"probability_open": 0.35,
"probability_high": 0.38,
"probability_low": 0.33,
"complement_probability": 0.63,
"bid_price": 0.36,
"ask_price": 0.38,
"bid_ask_spread": 0.02,
"total_liquidity": 5000
}
],
"meta": {
"next_cursor": null
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions Trade History
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/trades',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/trades', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/trades \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/trades
Returns individual prediction market trades with price (probability), size, side, and outcome information. Supports cursor-based pagination.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| exchange | query | string | false | Exchange name |
| instrument_name | query | string | false | Full prediction instrument identifier (e.g., will-bitcoin-reach-250000-by-december-31-2026-YES) |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug (parent event grouping) |
| outcome | query | string | false | Filter by outcome side |
Enumerated Values
| Parameter | Value |
|---|---|
| outcome | YES |
| outcome | NO |
Example responses
200 Response
{
"success": true,
"data": [
{
"timestamp": 1771523261437,
"date": "2026-02-20T12:34:21.437Z",
"exchange": "polymarket",
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"outcome": "YES",
"category": "crypto",
"price": 0.37,
"size": 100,
"side": "buy",
"fee_rate_bps": 0,
"trade_hash": "abc123def456"
}
],
"meta": {
"next_cursor": null
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions L2 Orderbook Raw Snapshots
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/orderbook-raw',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/orderbook-raw', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/orderbook-raw \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/orderbook-raw
Returns raw L2 orderbook snapshots for prediction instruments with full bid/ask arrays.
Key Features: - Full bid/ask price levels - Pre-computed liquidity at 3 depth levels (10, 20, 50) - Order book imbalance per depth - Microprice (liquidity-weighted mid-price)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start | query | string(date-time) | false | Start date in ISO 8601 format (UTC) |
| end | query | string(date-time) | false | End date in ISO 8601 format (UTC) |
| limit | query | number | false | Maximum number of records to return (1-1000) |
| cursor | query | string | false | Pagination cursor for fetching the next page of results. Use the value returned in meta.next_cursor from the previous response. |
| resolution | query | string | false | Time resolution for bucketing results |
| exchange | query | string | false | Exchange name |
| instrument_name | query | string | false | Full prediction instrument identifier (e.g., will-bitcoin-reach-250000-by-december-31-2026-YES) |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug (parent event grouping) |
| outcome | query | string | false | Filter by outcome side |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
| outcome | YES |
| outcome | NO |
Example responses
200 Response
{
"success": true,
"data": [
{
"timestamp": 1771523261437,
"date": "2026-02-20T12:34:21.437Z",
"exchange": "polymarket",
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"bids": [
{
"price": 0.36,
"size": 500
},
{
"price": 0.35,
"size": 300
}
],
"asks": [
{
"price": 0.38,
"size": 400
},
{
"price": 0.39,
"size": 250
}
],
"depth": 20,
"bid_liquidity_10": 2500,
"ask_liquidity_10": 2000,
"microprice": 0.371
}
],
"meta": {
"next_cursor": null
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Raw L2 orderbook snapshots successfully retrieved | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
Predictions Snapshot
Code samples
const headers = {
'Accept':'application/json',
'X-API-Key':'API_KEY'
};
fetch('/api/v1/predictions/snapshot',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'X-API-Key': 'API_KEY'
}
r = requests.get('/api/v1/predictions/snapshot', headers = headers)
print(r.json())
# You can also use wget
curl -X GET /api/v1/predictions/snapshot \
-H 'Accept: application/json' \
-H 'X-API-Key: API_KEY'
GET /api/v1/predictions/snapshot
Returns a snapshot of all prediction instruments for a given exchange at a single minute. If no date is provided, returns the latest available snapshot. Category and event_slug are optional filters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| exchange | query | string | false | Exchange name |
| date | query | string(date-time) | false | Exact date/time for the snapshot in ISO 8601 format (UTC). If omitted, returns the latest available snapshot. |
| resolution | query | string | false | Time resolution for the snapshot. At 1m (default), returns raw minute-level data. At higher resolutions (5m, 1h, etc.), data is aggregated into the specified bucket. |
| category | query | string | false | Filter by market category (e.g., crypto, politics, sports) |
| event_slug | query | string | false | Filter by event slug |
Enumerated Values
| Parameter | Value |
|---|---|
| resolution | 1m |
| resolution | 5m |
| resolution | 15m |
| resolution | 1h |
| resolution | 4h |
| resolution | 1d |
Example responses
200 Response
{
"success": true,
"data": [
{
"date": "2026-02-20 12:00:00",
"exchange": "polymarket",
"instrument_name": "will-bitcoin-reach-250000-by-december-31-2026-YES",
"probability": 0.37,
"bid_price": 0.36,
"ask_price": 0.38,
"total_liquidity": 5000
}
],
"meta": {
"date": "2026-02-20T12:00:00.000Z",
"next_date": "2026-02-20T12:01:00.000Z"
}
}
400 Response
{
"statusCode": 400,
"message": [
"exchange must be a string",
"instrument_name must be a string",
"resolution must be one of: 1m, 5m, 1h",
"start must be a valid ISO 8601 date string"
],
"error": "Bad Request"
}
401 Response
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized"
}
429 Response
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
| 400 | Bad Request | Bad Request - Invalid parameters | None |
| 401 | Unauthorized | Unauthorized - Invalid or missing API key | None |
| 429 | Too Many Requests | Too Many Requests - Rate limit exceeded | None |
Response Schema
McpEndpoint
McpEndpointController_handlePost
Code samples
fetch('/api/v1/mcp',
{
method: 'POST'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.post('/api/v1/mcp')
print(r.json())
# You can also use wget
curl -X POST /api/v1/mcp
POST /api/v1/mcp
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | none | None |
McpEndpointController_handleGet
Code samples
fetch('/api/v1/mcp',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/api/v1/mcp')
print(r.json())
# You can also use wget
curl -X GET /api/v1/mcp
GET /api/v1/mcp
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
McpEndpointController_handleDelete
Code samples
fetch('/api/v1/mcp',
{
method: 'DELETE'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.delete('/api/v1/mcp')
print(r.json())
# You can also use wget
curl -X DELETE /api/v1/mcp
DELETE /api/v1/mcp
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
OAuthLogin
OAuthLoginController_showLoginPage
Code samples
fetch('/oauth/login',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/oauth/login')
print(r.json())
# You can also use wget
curl -X GET /oauth/login
GET /oauth/login
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
OAuthLoginController_handleLogin
Code samples
fetch('/oauth/login',
{
method: 'POST'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.post('/oauth/login')
print(r.json())
# You can also use wget
curl -X POST /oauth/login
POST /oauth/login
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | none | None |
McpOAuth
McpOAuthController_getProtectedResourceMetadata
Code samples
fetch('/.well-known/oauth-protected-resource',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/.well-known/oauth-protected-resource')
print(r.json())
# You can also use wget
curl -X GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-protected-resource
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
McpOAuthController_getAuthorizationServerMetadata
Code samples
fetch('/.well-known/oauth-authorization-server',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/.well-known/oauth-authorization-server')
print(r.json())
# You can also use wget
curl -X GET /.well-known/oauth-authorization-server
GET /.well-known/oauth-authorization-server
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
McpOAuthController_registerClient
Code samples
fetch('/oauth/register',
{
method: 'POST'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.post('/oauth/register')
print(r.json())
# You can also use wget
curl -X POST /oauth/register
POST /oauth/register
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | none | None |
McpOAuthController_authorize
Code samples
fetch('/oauth/authorize',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/oauth/authorize')
print(r.json())
# You can also use wget
curl -X GET /oauth/authorize
GET /oauth/authorize
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
McpOAuthController_handleProviderCallback
Code samples
fetch('/oauth/callback',
{
method: 'GET'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.get('/oauth/callback')
print(r.json())
# You can also use wget
curl -X GET /oauth/callback
GET /oauth/callback
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
McpOAuthController_exchangeToken
Code samples
fetch('/oauth/token',
{
method: 'POST'
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
r = requests.post('/oauth/token')
print(r.json())
# You can also use wget
curl -X POST /oauth/token
POST /oauth/token
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | none | None |
Schemas
PaginationMetaEntity
{
"next_cursor": "eyJpZCI6MTIzNDU2NzgsInRzIjoxNjQwOTk1MjAwfQ=="
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| next_cursor | string¦null | true | none | Pagination cursor for fetching the next page of results. Pass this value as the cursor parameter in the next request. Null indicates no more pages. |
PaginatedResponse
{
"data": [
[]
],
"meta": {
"next_cursor": "eyJpZCI6MTIzNDU2NzgsInRzIjoxNjQwOTk1MjAwfQ=="
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [array] | true | none | none |
| meta | PaginationMetaEntity | true | none | none |
OptionsOhlcvtEntity
{
"date": "2024-12-10T00:00:00.000Z",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"open": 42150.5,
"high": 42890.75,
"low": 41920.25,
"close": 42500,
"vwap": 42350.5,
"volume": 2700.8,
"buy_volume": 1500.5,
"sell_volume": 1200.3,
"trades_count": 270,
"buy_trades_count": 150,
"sell_trades_count": 120,
"liquidation_short_volume": 50.25,
"liquidation_long_volume": 75.5,
"block_trade_buy_volume": 100,
"block_trade_sell_volume": 150,
"mark_price": 42500.5,
"index_price": 42505,
"days_to_expiry": 90.5
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| exchange | string | false | none | Exchange name |
| instrument_name | string | false | none | Instrument name |
| currency | string | false | none | Base currency |
| open | number | true | none | Opening trade price in the time bucket |
| high | number | true | none | Highest trade price in the time bucket |
| low | number | true | none | Lowest trade price in the time bucket |
| close | number | true | none | Closing trade price in the time bucket |
| vwap | number | true | none | Volume Weighted Average Price (VWAP) |
| volume | number | true | none | Total volume (buy + sell) |
| buy_volume | number | true | none | Buy-side volume (direction = buy) |
| sell_volume | number | true | none | Sell-side volume (direction = sell) |
| trades_count | number | true | none | Total number of trades (buy + sell) |
| buy_trades_count | number | true | none | Number of buy trades |
| sell_trades_count | number | true | none | Number of sell trades |
| liquidation_short_volume | number¦null | false | none | Volume from short liquidations (forced buy orders) |
| liquidation_long_volume | number¦null | false | none | Volume from long liquidations (forced sell orders) |
| block_trade_buy_volume | number¦null | false | none | Volume from block trade buys |
| block_trade_sell_volume | number¦null | false | none | Volume from block trade sells |
| mark_price | number¦null | false | none | Mark price at bar close (for reference) |
| index_price | number¦null | false | none | Index price at bar close (for reference) |
| days_to_expiry | number¦null | false | none | Days until expiry (NULL for PERPETUAL) |
BaseVolumeDataEntity
{
"date": "2024-12-10T00:00:00.000Z",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"volume_24h": 1500.25,
"volume_usd_24h": 95000000.5,
"buy_volume": 750.12,
"sell_volume": 680.5,
"volume": 1430.62,
"buy_trades_count": 245,
"sell_trades_count": 198,
"trades_count": 443
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| exchange | string | false | none | Exchange name |
| instrument_name | string | false | none | Instrument name |
| currency | string | false | none | Base currency |
| volume_24h | number | true | none | 24-hour rolling volume (base currency) |
| volume_usd_24h | number¦null | false | none | 24-hour rolling volume in USD terms |
| buy_volume | number¦null | false | none | Buy volume in the resolution bucket |
| sell_volume | number¦null | false | none | Sell volume in the resolution bucket |
| volume | number¦null | false | none | Total volume (buy + sell) in the resolution bucket |
| buy_trades_count | number¦null | false | none | Number of buy trades in the resolution bucket |
| sell_trades_count | number¦null | false | none | Number of sell trades in the resolution bucket |
| trades_count | number¦null | false | none | Total number of trades in the resolution bucket |
OptionsTradeEntity
{
"instrument_name": "BTC-25DEC26",
"timestamp": 1234567890123,
"date": "2023-06-15T14:30:00.000Z",
"trade_id": "trade_123456",
"block_trade_id": "block_123",
"combo_id": "combo_123",
"combo_trade_id": "combo_trade_123",
"strategy": "strategy_1",
"direction": "buy",
"tick_direction": 1,
"amount": 1.5,
"price": 45000.5,
"index_price": 45010,
"oi_change": 100,
"open_interest": 10000,
"oi_before": 9900
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| instrument_name | string | true | none | Instrument identifier |
| timestamp | number | true | none | Unix timestamp in milliseconds |
| date | string | true | none | ISO 8601 formatted date string |
| trade_id | string | true | none | Unique trade identifier |
| block_trade_id | string | false | none | Block trade identifier if applicable |
| combo_id | string | false | none | Combo trade identifier if applicable |
| combo_trade_id | string | false | none | Combo trade ID if part of combo |
| strategy | string | false | none | Trading strategy identifier |
| direction | string | true | none | Trade direction |
| tick_direction | object¦null | false | none | Tick direction indicator |
| amount | number | true | none | Trade amount/size |
| price | number | true | none | Trade execution price |
| index_price | object¦null | false | none | Index price at time of trade |
| oi_change | object¦null | false | none | Change in open interest |
| open_interest | object¦null | false | none | Open interest after trade |
| oi_before | object¦null | false | none | Open interest before trade |
Enumerated Values
| Property | Value |
|---|---|
| direction | buy |
| direction | sell |
BaseOpenInterestEntity
{
"date": "2024-12-10T00:00:00.000Z",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"oi_open": 22000.1,
"oi_high": 22500.3,
"oi_low": 21950,
"oi_close": 22350.5
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| exchange | string | false | none | Exchange name |
| instrument_name | string | false | none | Instrument name |
| currency | string | false | none | Base currency |
| oi_open | number | true | none | Open interest at time bucket start (base units) |
| oi_high | number | true | none | Highest open interest during time bucket (base units) |
| oi_low | number | true | none | Lowest open interest during time bucket (base units) |
| oi_close | number | true | none | Open interest at time bucket end (base units) |
OptionsFlowBucketEntity
{
"date": "2024-12-10T00:00:00.000Z",
"trade_count": 0,
"buy_count": 0,
"sell_count": 0,
"total_amount": 0,
"buy_amount": 0,
"sell_amount": 0,
"total_premium_usd": 0,
"buy_premium_usd": 0,
"sell_premium_usd": 0,
"total_notional": 0,
"buy_notional": 0,
"sell_notional": 0,
"call_premium_usd": 0,
"put_premium_usd": 0,
"call_count": 0,
"put_count": 0,
"block_trade_count": 0,
"block_premium_usd": 0,
"net_oi_change": 0,
"avg_iv": {},
"avg_abs_delta": {}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| trade_count | number | true | none | Total number of trades in bucket |
| buy_count | number | true | none | Number of buy trades |
| sell_count | number | true | none | Number of sell trades |
| total_amount | number | true | none | Total trade amount (contracts) |
| buy_amount | number | true | none | Buy side amount (contracts) |
| sell_amount | number | true | none | Sell side amount (contracts) |
| total_premium_usd | number | true | none | Total premium in USD |
| buy_premium_usd | number | true | none | Buy side premium in USD |
| sell_premium_usd | number | true | none | Sell side premium in USD |
| total_notional | number | true | none | Total notional in USD |
| buy_notional | number | true | none | Buy side notional in USD |
| sell_notional | number | true | none | Sell side notional in USD |
| call_premium_usd | number | true | none | Call option premium in USD |
| put_premium_usd | number | true | none | Put option premium in USD |
| call_count | number | true | none | Number of call option trades |
| put_count | number | true | none | Number of put option trades |
| block_trade_count | number | true | none | Number of block trades |
| block_premium_usd | number | true | none | Block trade premium in USD |
| net_oi_change | number | true | none | Net open interest change |
| avg_iv | object¦null | true | none | Average implied volatility |
| avg_abs_delta | object¦null | true | none | Average absolute delta |
OptionsFlowActiveStrikeEntity
{
"instrument_name": "string",
"trade_count": 0,
"premium_usd": 0,
"net_oi_change": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| instrument_name | string | true | none | Instrument name |
| trade_count | number | true | none | Number of trades on this instrument |
| premium_usd | number | true | none | Total premium in USD |
| net_oi_change | number | true | none | Net open interest change |
OptionsFlowSummaryEntity
{
"total_trades": 0,
"total_premium_usd": 0,
"total_notional_usd": 0,
"call_premium_usd": 0,
"put_premium_usd": 0,
"buy_premium_usd": 0,
"sell_premium_usd": 0,
"net_delta": 0,
"net_gamma": 0,
"net_vega": 0,
"opening_trades": 0,
"closing_trades": 0,
"net_oi_change": 0,
"block_trade_count": 0,
"block_trade_premium_usd": 0,
"most_active_strikes": [
{
"instrument_name": "string",
"trade_count": 0,
"premium_usd": 0,
"net_oi_change": 0
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_trades | number | true | none | Total number of trades in window |
| total_premium_usd | number | true | none | Total premium across all trades in USD |
| total_notional_usd | number | true | none | Total notional across all trades in USD |
| call_premium_usd | number | true | none | Total premium for call options in USD |
| put_premium_usd | number | true | none | Total premium for put options in USD |
| buy_premium_usd | number | true | none | Total premium for buy-side trades in USD |
| sell_premium_usd | number | true | none | Total premium for sell-side trades in USD |
| net_delta | number | true | none | Net delta across all trades |
| net_gamma | number | true | none | Net gamma across all trades |
| net_vega | number | true | none | Net vega across all trades |
| opening_trades | number | true | none | Number of opening trades (strategy starts with Opened) |
| closing_trades | number | true | none | Number of closing trades (strategy starts with Closed) |
| net_oi_change | number | true | none | Net open interest change |
| block_trade_count | number | true | none | Number of block trades |
| block_trade_premium_usd | number | true | none | Block trade premium in USD |
| most_active_strikes | [OptionsFlowActiveStrikeEntity] | true | none | Most active instruments by premium |
MetadataResponseEntity
{
"exchange": "deribit",
"instrument_name": "BTC-PERPETUAL",
"start_date": "2020-01-01T00:00:00.000Z",
"end_date": "2025-11-21T23:59:00.000Z",
"total_count": 1500000,
"total_pages": 15000
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exchange | string | true | none | Exchange name |
| instrument_name | string | true | none | Instrument name |
| start_date | string | true | none | Start date of available data (ISO 8601 format) |
| end_date | string | true | none | End date of available data (ISO 8601 format) |
| total_count | number | true | none | Total count of records available |
| total_pages | number | true | none | Total number of pages based on the provided limit |
FuturesOhlcvtEntity
{
"date": "2024-12-10T00:00:00.000Z",
"exchange": "deribit",
"instrument_name": "BTC-25DEC26",
"currency": "BTC",
"open": 42150.5,
"high": 42890.75,
"low": 41920.25,
"close": 42500,
"vwap": 42350.5,
"volume": 2700.8,
"buy_volume": 1500.5,
"sell_volume": 1200.3,
"trades_count": 270,
"buy_trades_count": 150,
"sell_trades_count": 120,
"liquidation_short_volume": 50.25,
"liquidation_long_volume": 75.5,
"block_trade_buy_volume": 100,
"block_trade_sell_volume": 150,
"mark_price": 42500.5,
"index_price": 42505,
"days_to_expiry": 90.5
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| exchange | string | false | none | Exchange name |
| instrument_name | string | false | none | Instrument name |
| currency | string | false | none | Base currency |
| open | number | true | none | Opening trade price in the time bucket |
| high | number | true | none | Highest trade price in the time bucket |
| low | number | true | none | Lowest trade price in the time bucket |
| close | number | true | none | Closing trade price in the time bucket |
| vwap | number | true | none | Volume Weighted Average Price (VWAP) |
| volume | number | true | none | Total volume (buy + sell) |
| buy_volume | number | true | none | Buy-side volume (direction = buy) |
| sell_volume | number | true | none | Sell-side volume (direction = sell) |
| trades_count | number | true | none | Total number of trades (buy + sell) |
| buy_trades_count | number | true | none | Number of buy trades |
| sell_trades_count | number | true | none | Number of sell trades |
| liquidation_short_volume | number¦null | false | none | Volume from short liquidations (forced buy orders) |
| liquidation_long_volume | number¦null | false | none | Volume from long liquidations (forced sell orders) |
| block_trade_buy_volume | number¦null | false | none | Volume from block trade buys |
| block_trade_sell_volume | number¦null | false | none | Volume from block trade sells |
| mark_price | number¦null | false | none | Mark price at bar close (for reference) |
| index_price | number¦null | false | none | Index price at bar close (for reference) |
| days_to_expiry | number¦null | false | none | Days until expiry (NULL for PERPETUAL) |
VolSurfaceEntity
{
"date": "2024-12-10T00:00:00.000Z",
"exchange": "deribit",
"currency": "BTC",
"maturity": "25DEC26",
"days_to_expiry": 25.5,
"underlying_price": 103722.83,
"atm_iv": 47.62,
"call_25d_iv": 43.8,
"put_25d_iv": 52.1,
"skew_25d": 8.3,
"butterfly_25d": 0.33
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string(date-time) | true | none | Date in ISO 8601 format (UTC) |
| exchange | string | true | none | Exchange name |
| currency | string | true | none | Base currency |
| maturity | string | true | none | Maturity date string |
| days_to_expiry | number | true | none | Days until expiry |
| underlying_price | number | true | none | Underlying asset price |
| atm_iv | number¦null | false | none | At-the-money implied volatility (call with delta closest to 0.5) |
| call_25d_iv | number¦null | false | none | 25-delta call implied volatility |
| put_25d_iv | number¦null | false | none | 25-delta put implied volatility |
| skew_25d | number¦null | false | none | 25-delta skew (put_25d_iv - call_25d_iv) |
| butterfly_25d | number¦null | false | none | 25-delta butterfly ((call_25d_iv + put_25d_iv) / 2 - atm_iv) |
TermStructureEntity
{
"tenor": 30,
"atm_iv": 38.55,
"call_25d_iv": 36.2,
"put_25d_iv": 41.9,
"skew_25d": 5.7,
"butterfly_25d": 0.5
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tenor | number | true | none | Constant-maturity tenor in days |
| atm_iv | number¦null | false | none | Interpolated ATM implied volatility at this tenor |
| call_25d_iv | number¦null | false | none | Interpolated 25-delta call implied volatility at this tenor |
| put_25d_iv | number¦null | false | none | Interpolated 25-delta put implied volatility at this tenor |
| skew_25d | number¦null | false | none | 25-delta skew (put_25d_iv - call_25d_iv) |
| butterfly_25d | number¦null | false | none | 25-delta butterfly ((call_25d_iv + put_25d_iv) / 2 - atm_iv) |
ErrorResponseDto
{
"statusCode": 400,
"message": [
"symbol must be a string",
"exchange is required"
],
"error": "Bad Request",
"timestamp": "2024-01-01T12:00:00Z",
"path": "/api/v1/ohlc/price"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| statusCode | number | true | none | HTTP status code |
| message | any | true | none | Error message(s). Can be a string or array of validation errors |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | string | true | none | Error type identifier |
| timestamp | string(date-time) | false | none | Timestamp when the error occurred |
| path | string | false | none | API request path that caused the error |
UnauthorizedErrorDto
{
"statusCode": 401,
"message": "Invalid API key",
"error": "Unauthorized",
"timestamp": "2024-01-01T12:00:00Z",
"path": "/api/v1/ohlc/price"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| statusCode | number | true | none | HTTP 401 status code |
| message | any | true | none | Unauthorized error message |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | string | true | none | Error type |
| timestamp | string(date-time) | false | none | Timestamp when the error occurred |
| path | string | false | none | API request path that caused the error |
RateLimitErrorDto
{
"statusCode": 429,
"message": "Rate limit exceeded. Please retry after 60 seconds",
"error": "Too Many Requests",
"timestamp": "2024-01-01T12:00:00Z",
"path": "/api/v1/ohlc/price",
"retryAfter": 60,
"limit": 1000,
"remaining": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| statusCode | number | true | none | HTTP 429 status code |
| message | any | true | none | Rate limit error message |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | string | true | none | Error type |
| timestamp | string(date-time) | false | none | Timestamp when the error occurred |
| path | string | false | none | API request path that caused the error |
| retryAfter | number | false | none | Number of seconds to wait before retrying |
| limit | number | false | none | Current rate limit quota |
| remaining | number | false | none | Number of requests remaining in current window |
ValidationErrorDto
{
"statusCode": 400,
"message": [
"symbol must be a string",
"interval must be one of: 1m, 5m, 15m, 30m, 1h, 4h, 6h, 1d"
],
"error": "Bad Request",
"timestamp": "2024-01-01T12:00:00Z",
"path": "/api/v1/ohlc/price"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| statusCode | number | true | none | HTTP 400 status code |
| message | [oneOf] | true | none | Validation error messages |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | string | true | none | Error type |
| timestamp | string(date-time) | false | none | Timestamp when the error occurred |
| path | string | false | none | API request path that caused the error |
ServerErrorDto
{
"statusCode": 500,
"message": "An unexpected error occurred. Please try again later.",
"error": "Internal Server Error",
"timestamp": "2024-01-01T12:00:00Z",
"path": "/api/v1/ohlc/price",
"errorId": "ERR-123456-ABCD"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| statusCode | number | true | none | HTTP 500 status code |
| message | any | true | none | Internal server error message |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | string | true | none | Error type |
| timestamp | string(date-time) | false | none | Timestamp when the error occurred |
| path | string | false | none | API request path that caused the error |
| errorId | string | false | none | Error tracking ID for support reference |