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
Proprietary Vol Surface
- ClickHouse-backed surface snapshots, per-expiry slices, constant-maturity term structure, and per-strike diagnostics
- Explicit margin filtering for inverse vs linear books and model filtering for SVI/SABR rows
- Live portfolio risk decomposition, scenario repricing, and spot x vol ladders
- Risk POST endpoints require X-API-Key authentication like GET endpoints; decompose includes greeks/PnL/buckets/position diagnostics, scenario includes shocked pricing/greeks, and ladder includes cells and PnL matrices
Predictions
- Prediction-market OHLCVT, ticker, trades, snapshots, and orderbook data
- Polymarket events, categories, instruments, and outcome metadata
Hyperliquid - HyperCore
- Wallet-attributed fills with fees, closed PnL, position direction, builder/deployer fees, hashes, and block numbers
- Liquidation fills with role, dedupe, backstop labels, aggregation, mark price, method, and closed PnL
- Sorted wallet flow rollups, marked wallet positions, wallet funding payments, and target-notional TWAP discovery
- Resting L4 orders with mark-distance filters, raw coin mappings, and deep HyperCore-derived L2 orderbook snapshots
Supported Exchanges
Binance, OKX, Deribit, Bybit, Hyperliquid (perpetuals, HIP-4 predictions, and HyperCore wallet/onchain data)
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
- Historical data corrections: /api/v1/changelog/data-corrections
- Data status and coverage: /api/v1/changelog/data-status
- Historical field semantics: /historical-data.html
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
Vol Surface
Proprietary volatility surface data from the Laevitas engine. These routes are backed by ClickHouse tables written by the fitter and live portfolio risk calculations. Use margin to select inverse or linear books; slice queries default to model=svi.
Vol Surface Catalog
GET /api/v1/vol-surface/catalog
Lists available (exchange, currency, margin, model) tuples with latest calibration time, index price, slice count, and forward-knot count.
Vol Surface Snapshots
GET /api/v1/vol-surface/snapshots
Returns surface-level calibration metadata: index price, forward curve JSON, slice counts, and calendar-arbitrage diagnostics. Omit start/end for latest snapshot mode; pass them for paginated history.
Vol Surface Slices
GET /api/v1/vol-surface/slices
Returns per-expiry fit rows with model parameters, ATM/wing metrics, fit diagnostics, spread-model coefficients, quote-quality counts, quality_tier, slice_source, and fallback age.
Vol Surface Term Structure
GET /api/v1/vol-surface/term-structure
Returns constant-maturity rows with ATM IV, total variance, skew, forward, term slope, forward vol, forward-tenor labels, and source.
Vol Surface Strikes
GET /api/v1/vol-surface/strikes
Returns per-strike IV diagnostics and greeks. This is the heaviest table; latest snapshot mode is broad, while historical scans require expiry or instrument.
Vol Surface Risk
POST /api/v1/vol-surface/risk/decomposePOST /api/v1/vol-surface/risk/scenarioPOST /api/v1/vol-surface/risk/ladder
Runs live portfolio risk decomposition, scenario repricing, and spot x parallel-vol ladder repricing through the proprietary vol-surface engine. These POST endpoints require API-key authentication like the GET data endpoints. The ladder grid is capped at 400 cells.
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
Hyperliquid - HyperCore
Hyperliquid - HyperCore REST
HyperCore data is exposed under /api/v1/hyperliquid/node/*. It is not folded into /perpetuals/* because the source schema contains wallet attribution, raw node coin identifiers, onchain hashes/blocks, fees, closed PnL, TWAP state, resting L4 orders, and deep HyperCore-derived L2 snapshots.
| Endpoint | Purpose | Required filters |
|---|---|---|
GET /api/v1/hyperliquid/node/fills |
Wallet-attributed fills with fees, closed PnL, builder/deployer fees, order ids, hash, and block number | wallet |
GET /api/v1/hyperliquid/node/prediction-fills |
HIP-4 prediction fills with condition/token ids and wallet attribution | condition_id, token_id, or instrument_name |
GET /api/v1/hyperliquid/node/liquidations |
Liquidation fills with liquidated user, liquidator, role, backstop flag, mark price, method, closed PnL, hash, and block number. dedupe=true returns one canonical row per event; resolution=5m|15m|1h|1d returns aggregate buckets. |
none, but use time/instrument/wallet filters for focused scans |
GET /api/v1/hyperliquid/node/wallet-flow |
1-minute wallet flow rollups with buy/sell/net volume, buy/sell/net/total notional, realized PnL, fees, sort_by, and min_notional |
wallet, instrument_name, instrument_name_raw, or currency |
GET /api/v1/hyperliquid/node/wallet-positions |
Latest wallet positions by instrument with labels, mark price, mark time, nullable entry price, and position notional | wallet, instrument_name, instrument_name_raw, or currency |
GET /api/v1/hyperliquid/node/funding-payments |
Wallet-level funding payments | wallet |
GET /api/v1/hyperliquid/node/twap-events |
TWAP lifecycle events and execution progress with computed target notional. Use min_target_notional for recent large-TWAP discovery. |
none; defaults to recent 24h when no wallet/twap_id is supplied |
GET /api/v1/hyperliquid/node/resting-orders |
Latest per-wallet resting orders from HyperCore-derived L4 state with mark price, distance_from_mark_pct, snapshot staleness meta, and max_distance_from_mark |
wallet, instrument_name, instrument_name_raw, or currency |
GET /api/v1/hyperliquid/node/instruments |
Raw Hyperliquid coin mapping (BTC, xyz:NVDA, @305, #40) to normalized instrument name, market type, currency, sizing, display name, deployer, and last-seen time |
none |
GET /api/v1/hyperliquid/node/l2-orderbook |
Deep HyperCore-derived L2 orderbook snapshot | instrument_name |
Common HyperCore filters: wallet, instrument_name, instrument_name_raw, currency, market_type (perp, perp_hip3, spot, prediction), start, end, limit, and cursor. Canonical timestamp companion fields use ISO 8601 Z format. Negative fee values are maker rebates.
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 |