Interactive API reference
Every route of the API, generated from its OpenAPI contract: parameters with their default and ceiling, every field of the response with its type and its unit, and a real response captured in production. Nothing on this page is written by hand, so it cannot drift from the API.
The same contract, for your tools: openapi.json (OpenAPI 3.1, for SDK generators and Swagger UI), a Postman collection, and llms-full.txt, the whole reference in one text file for AI agents.
#System
Health, per-feed freshness, the list of served symbols and what each symbol supports. /v1/health is the only route that needs no key.
GET /v1/healthno key
Service health. Liveness of the API and its database. No key needed, counted for nobody.
Example: request and real response
curl "https://api.bytnode.com/v1/health"{
"status": "ok",
"timestamp": 1790790231487,
"database": "connected"
}GET /v1/status
Freshness of every feed. One row per public feed with its age and staleness threshold (1.5 × the feed's expected interval). Use it to tell 'no event' from 'feed down'. Not counted in your quota.
12 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
feeds_checked | integer | null | count | Public feeds checked. |
feeds_stale | integer | null | count | Feeds older than their threshold. |
feeds_in_error | integer | null | count | Feeds that could not be checked. |
max_age_seconds | number | null | seconds | Age of the oldest feed. |
feeds | object[] | One row per public feed. | |
feeds[].feed | string | Feed name. | |
feeds[].family | string | Data family the feed belongs to. | |
feeds[].age_seconds | number | null | seconds | Age of the latest row of the feed. |
feeds[].expected_interval_seconds | integer | null | seconds | Maximum legitimate age of the feed. |
feeds[].threshold_seconds | integer | null | seconds | Age above which the feed is stale (1.5 × expected_interval_seconds). |
feeds[].is_stale | boolean | Whether the feed is stale. | |
feeds[].stale_venues | integer | null | count | Venues lagging on this feed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/status"{
"status": "ok",
"timestamp": 1790790110622,
"data": {
"feeds_checked": 67,
"feeds_stale": 0,
"feeds_in_error": 0,
"max_age_seconds": 150111.5,
"feeds": [
{
"feed": "klines_futures_1m",
"family": "prix-volume",
"age_seconds": 111.2,
"expected_interval_seconds": 120,
"threshold_seconds": 180,
"is_stale": false,
"stale_venues": 0
},
{
"feed": "klines_1m",
"family": "prix-volume",
"age_seconds": 111.2,
"expected_interval_seconds": 180,
"threshold_seconds": 270,
"is_stale": false,
"stale_venues": 0
},
{
"feed": "klines_multi",
"family": "prix-volume",
"age_seconds": 411.2,
"expected_interval_seconds": 660,
"threshold_seconds": 990,
"is_stale": false,
"stale_venues": null
}
]
}
}GET /v1/symbols
List the served trading pairs. The 22 served pairs: 20 USDT-margined perpetual markets (BTC, ETH, SOL, XRP, DOGE, BNB, TRX, SUI, HYPE, XLM, XMR, LINK, ADA, LTC, UNI, GRAM, AVAX, HBAR, NEAR, TAO) plus two spot-only stablecoin pairs (USDCUSDT, USDTUSDC).
3 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].base_asset | string | Base asset of the pair. | |
[].name | string | Name. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/symbols"{
"status": "ok",
"timestamp": 1790790232799,
"data_type": "symbols",
"data": [
{
"symbol": "ADAUSDT",
"base_asset": "ADA",
"name": "Cardano"
},
{
"symbol": "AVAXUSDT",
"base_asset": "AVAX",
"name": "Avalanche"
},
{
"symbol": "BNBUSDT",
"base_asset": "BNB",
"name": "BNB"
}
]
}GET /v1/symbols/{symbol}/capabilities
What a symbol supports. Which raw feeds were active over the last 24 h, and which derived metrics are available, blocked (with the missing feeds) or not applicable (stablecoins have no futures).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
15 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
symbol | string | Trading pair, e.g. BTCUSDT. | |
asset_class | string | crypto or stablecoin (spot only, no futures metrics). | |
feeds_active_last_24h | object | Per raw feed: whether it received data in the last 24 h. | |
feeds_active_last_24h.futures_klines | boolean | ||
feeds_active_last_24h.spot_ticks | boolean | ||
feeds_active_last_24h.futures_ticks | boolean | ||
feeds_active_last_24h.oi_snapshots | boolean | ||
feeds_active_last_24h.funding_rates | boolean | ||
feeds_active_last_24h.liquidations | boolean | ||
feeds_active_last_24h.trades_raw | boolean | ||
feeds_active_last_24h.klines_multi | boolean | ||
feeds_active_last_24h.spot_klines | boolean | ||
feeds_active_last_24h.spot_klines_multi | boolean | ||
computed_metrics_available | string[] | Derived metrics available for the symbol. | |
computed_metrics_blocked | object | Derived metrics unavailable, with the missing feeds. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/symbols/BTCUSDT/capabilities"{
"status": "ok",
"timestamp": 1790790233542,
"data_type": "symbol_capabilities",
"symbol": "BTCUSDT",
"data": {
"symbol": "BTCUSDT",
"asset_class": "crypto",
"feeds_active_last_24h": {
"futures_klines": true,
"spot_ticks": true,
"futures_ticks": true,
"oi_snapshots": true,
"funding_rates": true,
"liquidations": true,
"trades_raw": true,
"klines_multi": true,
"spot_klines": true,
"spot_klines_multi": true
},
"computed_metrics_available": [
"basis",
"buysell_ratio",
"funding_cumulative_24h"
],
"computed_metrics_blocked": {}
}
}#Snapshot
One request, up to 61 fields for one symbol: the fastest way to fill a dashboard or give an AI agent full market context. Each field is name=depth (funding_rate_8h=1, klines_1h=24, or true for depth 1); multi-timeframe fields are name@tf=depth (cvd@1h=24). Call it with only symbol to list the fields your plan includes.
GET /v1/snapshot
Many fields for one symbol in one request. Up to 61 fields for one symbol in a single call: prices, flow, derivatives, liquidations, macro, on-chain, options. Each query key is a field and its value a depth: funding_rate_8h=1 (or =true), klines_1h=24. Multi-timeframe fields take @tf: cvd@1h=24. Call it with only symbol to get available_fields (fields without a timeframe), available_multi_tf_fields, timeframes and max_depth. An empty field carries unavailable (not_applicable, no_api_key or no_data) so 'no measure' is never mistaken for 'nothing happened'. Response: data is an object keyed by field name, plus coverage (venues per multi-venue metric) and partial (true if a field failed).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. Alone, it returns the catalogue of the fields your plan includes. |
basis | integer | true | — | Futures-spot basis (N latest minutes). Same content as /v1/basis. Value: depth N, or true for 1. |
btc_fees | integer | true | — | Recommended Bitcoin fees. Same content as /v1/btc/fees. Value: depth N, or true for 1. |
btc_mempool | integer | true | — | Bitcoin mempool. Same content as /v1/btc/mempool. Value: depth N, or true for 1. |
btc_mining | integer | true | — | Mining pool concentration. Same content as /v1/btc/mining. Value: depth N, or true for 1. |
btc_network | integer | true | — | Bitcoin network state. Same content as /v1/btc/network. Value: depth N, or true for 1. |
buysell_ratio | integer | true | — | Buy/sell volume ratio. Same content as /v1/buysell/ratio. Value: depth N, or true for 1. |
eth_defi | integer | true | — | Ethereum DeFi. Same content as /v1/eth/defi. Value: depth N, or true for 1. |
eth_deflation | integer | true | — | ETH deflation. Same content as /v1/eth/deflation. Value: depth N, or true for 1. |
eth_gas | integer | true | — | Ethereum gas. Same content as /v1/eth/gas. Value: depth N, or true for 1. |
eth_gas_momentum | integer | true | — | Gas momentum. Same content as /v1/eth/gas-momentum. Value: depth N, or true for 1. |
eth_ratio | integer | true | — | ETH/BTC ratio. Same content as /v1/eth/ratio. Value: depth N, or true for 1. |
eth_squeeze | integer | true | — | ETH supply squeeze index. Same content as /v1/eth/squeeze. Value: depth N, or true for 1. |
eth_staking | integer | true | — | ETH staking. Same content as /v1/eth/staking. Value: depth N, or true for 1. |
eth_supply | integer | true | — | ETH supply and burn. Same content as /v1/eth/supply. Value: depth N, or true for 1. |
fear_greed | integer | true | — | Crypto Fear & Greed Index. Same content as /v1/fear-greed. Value: depth N, or true for 1. |
funding_cumulative | integer | true | — | Funding summed over 24 h. Same content as /v1/funding/cumulative. Value: depth N, or true for 1. |
funding_next | integer | true | — | Next funding forecast. Same content as /v1/funding/next. Value: depth N, or true for 1. |
funding_rate_8h | integer | true | — | Latest settled funding window. Same content as /v1/funding/rate. Value: depth N, or true for 1. |
futures_ticks | integer | true | — | Individual futures trades (N trades), bounded by your plan's tick window. Same content as /v1/raw/futures-ticks. Value: depth N, or true for 1. |
global_market | integer | true | — | Total crypto market cap and dominance. Same content as /v1/global. Value: depth N, or true for 1. |
heatmap | integer | true | — | Liquidation heatmap clusters. Same content as /v1/heatmap/clusters. Value: depth N, or true for 1. |
klines_15m | integer | true | — | 15-minute OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_1d | integer | true | — | Daily OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_1h | integer | true | — | 1-hour OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_1m | integer | true | — | 1-minute OHLCV candles (N candles). Same content as /v1/raw/klines. Value: depth N, or true for 1. |
klines_1w | integer | true | — | Weekly OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_30m | integer | true | — | 30-minute OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_4h | integer | true | — | 4-hour OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
klines_5m | integer | true | — | 5-minute OHLCV candles (N candles). Same content as /v1/raw/klines/{interval}. Value: depth N, or true for 1. |
liq_cumulative | integer | true | — | Liquidations long/short USD (N latest minutes). Same content as /v1/liquidations/cumulative. Value: depth N, or true for 1. |
liq_ratio | integer | true | — | Big vs small liquidations. Same content as /v1/liquidations/ratio. Value: depth N, or true for 1. |
liquidations | integer | true | — | Individual liquidations over the last N minutes. Same content as /v1/raw/liquidations. Value: depth N, or true for 1. |
macro | integer | true | — | Latest value of every FRED series. Same content as /v1/macro. Value: depth N, or true for 1. |
macro_correlations | integer | true | — | BTC correlation with DXY, S&P 500, gold, VIX. Same content as /v1/macro/correlations. Value: depth N, or true for 1. |
macro_momentum | integer | true | — | Macro momentum score. Same content as /v1/macro/momentum. Value: depth N, or true for 1. |
macro_risk | integer | true | — | Risk-on / risk-off score. Same content as /v1/macro/risk. Value: depth N, or true for 1. |
net_liquidity | integer | true | — | US net liquidity. Same content as /v1/macro/net-liquidity. Value: depth N, or true for 1. |
oi_delta | integer | true | — | Open interest change (N latest minutes). Same content as /v1/oi/delta. Value: depth N, or true for 1. |
oi_history | integer | true | — | Total open interest per minute (N minutes). Same content as /v1/raw/oi. Value: depth N, or true for 1. |
oi_snapshots | integer | true | — | Latest total open interest. Same content as /v1/raw/oi. Value: depth N, or true for 1. |
onchain_active_addresses | integer | true | — | Bitcoin active addresses. Same content as /v1/onchain/active-addresses. Value: depth N, or true for 1. |
onchain_miner_stress | integer | true | — | Bitcoin miner stress. Same content as /v1/onchain/miner-stress. Value: depth N, or true for 1. |
onchain_mvrv | integer | true | — | Bitcoin MVRV. Same content as /v1/onchain/mvrv. Value: depth N, or true for 1. |
onchain_nvt | integer | true | — | Bitcoin NVT. Same content as /v1/onchain/nvt. Value: depth N, or true for 1. |
options | integer | true | — | Options market summary for the symbol's asset. Same content as /v1/options/summary. Value: depth N, or true for 1. |
orderbook | integer | true | — | Latest aggregated order book. Same content as /v1/raw/orderbook. Value: depth N, or true for 1. |
price_change | integer | true | — | Price change over 1m to 1w, in percent. Same content as /v1/price-change. Value: depth N, or true for 1. |
spot_ticks | integer | true | — | Individual spot trades (N trades), bounded by your plan's tick window. Same content as /v1/raw/spot-ticks. Value: depth N, or true for 1. |
taker_combined | integer | true | — | Taker buy/sell volume per minute (N minutes). Same content as /v1/raw/taker-combined. Value: depth N, or true for 1. |
tokenomics | integer | true | — | Supply, market cap, FDV. Same content as /v1/tokenomics. Value: depth N, or true for 1. |
trade_size | integer | true | — | Average trade size. Same content as /v1/trades/avg-size. Value: depth N, or true for 1. |
trades_raw | integer | true | — | Trades aggregated per second (N seconds). Same content as /v1/raw/trades. Value: depth N, or true for 1. |
vwap | integer | true | — | Intraday VWAP (N latest minutes). Same content as /v1/vwap. Value: depth N, or true for 1. |
Plus 55 multi-timeframe fields, named field@tf (cvd@1h, trade@5m…).
27 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
funding_rate_8h | object | ||
funding_rate_8h.time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
funding_rate_8h.bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
funding_rate_8h.rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Settled funding rate, normalised to an 8-hour period, open-interest weighted across venues. |
funding_rate_8h.apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
funding_rate_8h.exchange_count | integer | null | count | Number of venues in the weighted average. |
basis | object[] | ||
basis[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
basis[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
basis[].basis_value | number | null | quote currency (USDT for BTCUSDT) | Futures price - spot price. |
basis[].basis_pct | number | null | percent (58.5 = 58.5 %) | (futures - spot) / spot, in percent. Positive = contango. |
basis[].futures_price | number | null | quote currency (USDT for BTCUSDT) | Perpetual futures price, open-interest weighted across venues. |
basis[].spot_price | number | null | quote currency (USDT for BTCUSDT) | Spot price across venues. |
fear_greed | object | ||
fear_greed.time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
fear_greed.timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
fear_greed.value | integer | null | dimensionless score | Value of the series. |
fear_greed.value_classification | string | Label published by alternative.me: Extreme Fear, Fear, Neutral, Greed or Extreme Greed. | |
cvd@1h | object[] | ||
cvd@1h[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
cvd@1h[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
cvd@1h[].symbol | string | Trading pair, e.g. BTCUSDT. | |
cvd@1h[].cvd_series | number | null[] | base asset quantity (BTC for BTCUSDT) | Cumulative volume delta inside the bucket, one point per minute, starting from 0 at the bucket start. |
cvd@1h[].net_delta | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume - taker sell volume over the bucket, base asset units. |
cvd@1h[].taker_buy_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume over the bucket. |
cvd@1h[].taker_sell_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume over the bucket. |
cvd@1h[].points_count | integer | null | count | Number of one-minute points in cvd_series. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/snapshot?symbol=BTCUSDT&funding_rate_8h=1&basis=1&fear_greed=1&cvd@1h=2"{
"status": "ok",
"timestamp": 1790790234258,
"data_type": "snapshot",
"partial": false,
"data": {
"funding_rate_8h": {
"time": "2026-09-30T08:00:00.000Z",
"bucket": "2026-09-30T08:00:00.000Z",
"rate": 0.00006287020093464952,
"apr_pct": 6.884287002344122
},
"basis": [
{
"time": "2026-09-30T17:43:37.309Z",
"timestamp": "2026-09-30T17:43:37.309Z",
"basis_value": -38.03961943906421,
"basis_pct": -0.04526350810118282,
"futures_price": 84002.17394512612,
"spot_price": 84040.21356456519
}
],
"fear_greed": {
"time": "2026-09-30T00:00:00.000Z",
"timestamp": "2026-09-30T00:00:00.000Z",
"value": 71,
"value_classification": "Greed"
},
"cvd@1h": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
45.888329999999726,
69.2295500000001,
200.21975000000012
],
"net_delta": -707.4313099999853,
"taker_buy_volume": 8806.463150000012,
"taker_sell_volume": 9513.894459999998,
"points_count": 60
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
-662.8237799999529,
-701.9267099999539,
-770.6161599999542
],
"net_delta": -959.671869999996,
"taker_buy_volume": 14950.27055999998,
"taker_sell_volume": 15909.942429999976,
"points_count": 60
}
]
},
"coverage": {
"funding_rate_8h": {
"status": "available",
"effect": "weighted",
"count_field": "exchange_count"
},
"basis": {
"status": "unavailable",
"reason": "pre_aggregated"
},
"cvd@1h": {
"status": "unavailable",
"reason": "pre_aggregated"
}
}
}#Market: prices & volumes
OHLCV candles, individual trades, price change and the aggregated order book. Volumes are aggregated across venues (spot and perpetual futures); OHLC comes from one reference spot market per symbol.
GET /v1/orderbook/aggregated
Order book statistics per bucket. Average, min and max of bid/ask liquidity and imbalance over the latest closed bucket. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
15 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].bid_total_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average bid liquidity over the bucket. |
[].bid_total_min | number | null | base asset quantity (BTC for BTCUSDT) | Minimum bid liquidity over the bucket. |
[].bid_total_max | number | null | base asset quantity (BTC for BTCUSDT) | Maximum bid liquidity over the bucket. |
[].ask_total_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average ask liquidity over the bucket. |
[].ask_total_min | number | null | base asset quantity (BTC for BTCUSDT) | Minimum ask liquidity over the bucket. |
[].ask_total_max | number | null | base asset quantity (BTC for BTCUSDT) | Maximum ask liquidity over the bucket. |
[].imbalance_avg | number | null | fraction from -1 to 1 | Average book imbalance over the bucket. |
[].imbalance_min | number | null | fraction from -1 to 1 | Minimum book imbalance over the bucket. |
[].imbalance_max | number | null | fraction from -1 to 1 | Maximum book imbalance over the bucket. |
[].imbalance_std | number | null | fraction | Standard deviation of the imbalance over the bucket (how unstable the book was). |
[].samples_count | integer | null | count | Number of order book snapshots averaged in the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/orderbook/aggregated?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790253648,
"data_type": "orderbook_aggregated_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"bid_total_avg": 77.31108677777776,
"bid_total_min": 15.91023,
"bid_total_max": 167.77567,
"ask_total_avg": 60.23020433333331,
"ask_total_min": 13.96013,
"ask_total_max": 195.13757,
"imbalance_avg": 0.1101654001703496,
"imbalance_min": -0.7572062426851045,
"imbalance_max": 0.8213553258747318,
"imbalance_std": 0.33307667708489624,
"samples_count": 360,
"is_closed": true
}
]
}GET /v1/orderbook/aggregated/history
Order book statistics history. Same as /v1/orderbook/aggregated, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
15 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].bid_total_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average bid liquidity over the bucket. |
[].bid_total_min | number | null | base asset quantity (BTC for BTCUSDT) | Minimum bid liquidity over the bucket. |
[].bid_total_max | number | null | base asset quantity (BTC for BTCUSDT) | Maximum bid liquidity over the bucket. |
[].ask_total_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average ask liquidity over the bucket. |
[].ask_total_min | number | null | base asset quantity (BTC for BTCUSDT) | Minimum ask liquidity over the bucket. |
[].ask_total_max | number | null | base asset quantity (BTC for BTCUSDT) | Maximum ask liquidity over the bucket. |
[].imbalance_avg | number | null | fraction from -1 to 1 | Average book imbalance over the bucket. |
[].imbalance_min | number | null | fraction from -1 to 1 | Minimum book imbalance over the bucket. |
[].imbalance_max | number | null | fraction from -1 to 1 | Maximum book imbalance over the bucket. |
[].imbalance_std | number | null | fraction | Standard deviation of the imbalance over the bucket (how unstable the book was). |
[].samples_count | integer | null | count | Number of order book snapshots averaged in the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/orderbook/aggregated/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790254338,
"data_type": "orderbook_aggregated_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"bid_total_avg": 77.31108677777776,
"bid_total_min": 15.91023,
"bid_total_max": 167.77567,
"ask_total_avg": 60.23020433333331,
"ask_total_min": 13.96013,
"ask_total_max": 195.13757,
"imbalance_avg": 0.1101654001703496,
"imbalance_min": -0.7572062426851045,
"imbalance_max": 0.8213553258747318,
"imbalance_std": 0.33307667708489624,
"samples_count": 360,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"bid_total_avg": 97.48639438888884,
"bid_total_min": 18.47669,
"bid_total_max": 637.77143,
"ask_total_avg": 60.95369705555554,
"ask_total_min": 17.22111,
"ask_total_max": 184.00522,
"imbalance_avg": 0.18011210536554623,
"imbalance_min": -0.6685603180787127,
"imbalance_max": 0.920172262040769,
"imbalance_std": 0.34668077416820864,
"samples_count": 360,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"symbol": "BTCUSDT",
"bid_total_avg": 76.40199952777775,
"bid_total_min": 15.42072,
"bid_total_max": 589.87834,
"ask_total_avg": 69.66592174999997,
"ask_total_min": 15.17512,
"ask_total_max": 199.04109,
"imbalance_avg": 0.0009829514470542126,
"imbalance_min": -0.8204603241070808,
"imbalance_max": 0.8587994759285994,
"imbalance_std": 0.3888677188193186,
"samples_count": 360,
"is_closed": true
}
]
}GET /v1/price-change
Price change over 1m to 1w. Rolling price change in percent over eight windows, from the latest price. Spot-based for stablecoins.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
13 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
symbol | string | Trading pair, e.g. BTCUSDT. | |
price | number | null | quote currency (USDT for BTCUSDT) | Price. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
changes | object | percent (58.5 = 58.5 %) | Price change over each window, keyed by window (1m … 1w), in percent. |
changes.1m | number | null | ||
changes.5m | number | null | ||
changes.15m | number | null | ||
changes.30m | number | null | ||
changes.1h | number | null | ||
changes.4h | number | null | ||
changes.1d | number | null | ||
changes.1w | number | null |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/price-change?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790241839,
"data_type": "price_change",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:42:00.000Z",
"symbol": "BTCUSDT",
"price": 84038,
"timestamp": "2026-09-30T17:42:00.000Z",
"changes": {
"1m": 0.01874503479733047,
"5m": 0.13617127553449587,
"15m": -0.10699171417461883,
"30m": -0.3125685782578008,
"1h": -0.3084296187335405,
"4h": -0.588380795309514,
"1d": 1.0557960557960555,
"1w": -0.11648995477678913
}
}
}GET /v1/raw/futures-ticks
Individual futures trades. Raw perpetual futures executions across venues, most recent first. Kept 72 hours.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–10000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].side | string | Trades: buy or sell (aggressor side). Liquidations: long or short (the position liquidated). | |
[].price | number | null | quote currency (USDT for BTCUSDT) | Price. |
[].quantity | number | null | base asset quantity (BTC for BTCUSDT) | Quantity traded or liquidated, in base asset units. |
[].usd_value | number | null | USD | Notional value: price × quantity. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/futures-ticks?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790238775,
"data_type": "raw_futures_ticks",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:43:58.119Z",
"timestamp": "2026-09-30T17:43:58.119Z",
"side": "sell",
"price": 84009.1,
"quantity": 0.012,
"usd_value": 1008.1092
},
{
"time": "2026-09-30T17:43:58.119Z",
"timestamp": "2026-09-30T17:43:58.119Z",
"side": "sell",
"price": 84009.1,
"quantity": 0.002,
"usd_value": 168.0182
},
{
"time": "2026-09-30T17:43:58.119Z",
"timestamp": "2026-09-30T17:43:58.119Z",
"side": "sell",
"price": 84009.1,
"quantity": 0.002,
"usd_value": 168.0182
}
]
}GET /v1/raw/klines
1-minute OHLCV candles. OHLC from one reference SPOT market per symbol; volume, taker buy and taker sell AGGREGATED across venues, spot and futures. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 60 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].open | number | null | quote currency (USDT for BTCUSDT) | Opening price of the candle. |
[].high | number | null | quote currency (USDT for BTCUSDT) | Highest price of the candle. |
[].low | number | null | quote currency (USDT for BTCUSDT) | Lowest price of the candle. |
[].close | number | null | quote currency (USDT for BTCUSDT) | Closing price of the candle (last price for the open candle). |
[].volume | number | null | base asset quantity (BTC for BTCUSDT) | Volume traded, AGGREGATED across venues (spot + perpetual futures), in base asset units. |
[].taker_buy | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) buy volume, aggregated across venues. |
[].taker_sell | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) sell volume, aggregated across venues. |
[].volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/klines?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790235511,
"data_type": "raw_klines",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:42:00.000Z",
"timestamp": "2026-09-30T17:42:00.000Z",
"open": 84022.24,
"high": 84038.01,
"low": 84010,
"close": 84038,
"volume": 38.62342667000003,
"taker_buy": 20.54720392,
"taker_sell": 18.076222750000024,
"volume_estimated": false
},
{
"time": "2026-09-30T17:41:00.000Z",
"timestamp": "2026-09-30T17:41:00.000Z",
"open": 84014.86,
"high": 84022.25,
"low": 84004,
"close": 84022.25,
"volume": 20.711201289999988,
"taker_buy": 13.07271575999999,
"taker_sell": 7.638485529999997,
"volume_estimated": false
},
{
"time": "2026-09-30T17:40:00.000Z",
"timestamp": "2026-09-30T17:40:00.000Z",
"open": 84008.01,
"high": 84014.87,
"low": 83982,
"close": 84014.86,
"volume": 22.87509986999998,
"taker_buy": 13.033891349999983,
"taker_sell": 9.841208519999991,
"volume_estimated": false
}
]
}GET /v1/raw/klines/{interval}
OHLCV candles for an interval. Same as /v1/raw/klines for 5m to 1w. The last candle is the one in progress. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
interval required | string | — | Candle interval in the path: 1m, 5m, 15m, 30m, 1h, 4h, 1d or 1w. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].open | number | null | quote currency (USDT for BTCUSDT) | Opening price of the candle. |
[].high | number | null | quote currency (USDT for BTCUSDT) | Highest price of the candle. |
[].low | number | null | quote currency (USDT for BTCUSDT) | Lowest price of the candle. |
[].close | number | null | quote currency (USDT for BTCUSDT) | Closing price of the candle (last price for the open candle). |
[].volume | number | null | base asset quantity (BTC for BTCUSDT) | Volume traded, AGGREGATED across venues (spot + perpetual futures), in base asset units. |
[].taker_buy | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) buy volume, aggregated across venues. |
[].taker_sell | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) sell volume, aggregated across venues. |
[].volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/klines/1h?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790236326,
"data_type": "raw_klines_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"open": 84134.43,
"high": 84490.01,
"low": 84134.43,
"close": 84349.44,
"volume": 2280.227277129998,
"taker_buy": 1170.2562601299987,
"taker_sell": 1109.9710169999994,
"volume_estimated": false
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"open": 83800.01,
"high": 84295.71,
"low": 83694,
"close": 84134.43,
"volume": 3350.4473884966005,
"taker_buy": 1741.3496878,
"taker_sell": 1609.097700696601,
"volume_estimated": false
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"open": 84637.74,
"high": 84644.83,
"low": 83373,
"close": 83800.01,
"volume": 6771.307420519992,
"taker_buy": 3160.2593737299967,
"taker_sell": 3611.0480467899943,
"volume_estimated": false
}
]
}GET /v1/raw/oi
Total open interest per minute. Open interest summed across futures venues, per minute. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–1000 | 30 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
3 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].oi_total | number | null | base asset quantity (BTC for BTCUSDT) | Total open interest across venues, base asset units. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/oi?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790240616,
"data_type": "raw_oi",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:44:00.000Z",
"timestamp": "2026-09-30T17:44:00.000Z",
"oi_total": 344631.13178000005
},
{
"time": "2026-09-30T17:43:00.000Z",
"timestamp": "2026-09-30T17:43:00.000Z",
"oi_total": 344631.13178000005
},
{
"time": "2026-09-30T17:42:00.000Z",
"timestamp": "2026-09-30T17:42:00.000Z",
"oi_total": 344689.02418000007
}
]
}GET /v1/raw/orderbook
Aggregated order book, latest. Bid and ask liquidity and imbalance from the latest book of each venue (a venue silent for 30 s is not summed).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
bid_total | number | null | base asset quantity (BTC for BTCUSDT) | Resting bid liquidity summed over the top of book of each venue, base asset units. |
ask_total | number | null | base asset quantity (BTC for BTCUSDT) | Resting ask liquidity summed over the top of book of each venue, base asset units. |
imbalance | number | null | fraction from -1 to 1 | (bid_total - ask_total) / (bid_total + ask_total) across venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/orderbook?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790239392,
"data_type": "raw_orderbook",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:58.138Z",
"timestamp": "2026-09-30T17:43:58.138Z",
"bid_total": 64.76607000000001,
"ask_total": 69.16233,
"imbalance": -0.0328254500165759
}
}GET /v1/raw/spot-ticks
Individual spot trades. Raw spot executions across venues, most recent first. Kept 72 hours.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–10000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].side | string | Trades: buy or sell (aggressor side). Liquidations: long or short (the position liquidated). | |
[].price | number | null | quote currency (USDT for BTCUSDT) | Price. |
[].quantity | number | null | base asset quantity (BTC for BTCUSDT) | Quantity traded or liquidated, in base asset units. |
[].usd_value | number | null | USD | Notional value: price × quantity. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/spot-ticks?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790238168,
"data_type": "raw_spot_ticks",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:43:57.861Z",
"timestamp": "2026-09-30T17:43:57.861Z",
"side": "buy",
"price": 84038.1,
"quantity": 0.00002379,
"usd_value": 1.999266399
},
{
"time": "2026-09-30T17:43:57.657Z",
"timestamp": "2026-09-30T17:43:57.657Z",
"side": "sell",
"price": 84046,
"quantity": 0.00497,
"usd_value": 417.70861999999994
},
{
"time": "2026-09-30T17:43:57.609Z",
"timestamp": "2026-09-30T17:43:57.609Z",
"side": "buy",
"price": 84038.1,
"quantity": 0.00058779,
"usd_value": 49.39675479900001
}
]
}GET /v1/raw/taker-combined
Taker buy/sell volume per minute. Aggressive buy and sell volume per minute, aggregated across venues. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–1000 | 30 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].taker_buy | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) buy volume, aggregated across venues. |
[].taker_sell | number | null | base asset quantity (BTC for BTCUSDT) | Aggressive (taker) sell volume, aggregated across venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/taker-combined?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790240002,
"data_type": "raw_taker_combined",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:42:00.000Z",
"timestamp": "2026-09-30T17:42:00.000Z",
"taker_buy": 55.96537000000028,
"taker_sell": 76.6487100000001
},
{
"time": "2026-09-30T17:41:00.000Z",
"timestamp": "2026-09-30T17:41:00.000Z",
"taker_buy": 63.93851000000009,
"taker_sell": 42.53864
},
{
"time": "2026-09-30T17:40:00.000Z",
"timestamp": "2026-09-30T17:40:00.000Z",
"taker_buy": 109.69762000000009,
"taker_sell": 100.76166000000012
}
]
}GET /v1/raw/trades
Trades aggregated per second. Every trade of every venue summed per second: volume, trade count, taker buy and sell. Kept 72 hours. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–1000 | 60 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].total_volume | number | null | base asset quantity (BTC for BTCUSDT) | Total traded volume over the period, base asset units. |
[].trade_count | integer | null | count | Number of trades. |
[].taker_buy_vol | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume. |
[].taker_sell_vol | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/trades?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790236947,
"data_type": "raw_trades",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:43:55.000Z",
"timestamp": "2026-09-30T17:43:55.000Z",
"total_volume": 1.04198,
"trade_count": 34,
"taker_buy_vol": 0.8699800000000001,
"taker_sell_vol": 0.172
},
{
"time": "2026-09-30T17:43:54.000Z",
"timestamp": "2026-09-30T17:43:54.000Z",
"total_volume": 0.11987,
"trade_count": 9,
"taker_buy_vol": 0.11257,
"taker_sell_vol": 0.0073
},
{
"time": "2026-09-30T17:43:53.000Z",
"timestamp": "2026-09-30T17:43:53.000Z",
"total_volume": 0.6443000000000001,
"trade_count": 9,
"taker_buy_vol": 0.6309000000000001,
"taker_sell_vol": 0.0134
}
]
}GET /v1/raw/trades/large
Large individual trades. Individual trades above min_usd (default 100,000 USD), all venues, spot and futures. The venue is not disclosed (aggregation-only contract). Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
min_usd | number | 100000 | Minimum notional in USD (default 100000, minimum 1000). |
limit | integer · 1–1000 | 50 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].side | string | Trades: buy or sell (aggressor side). Liquidations: long or short (the position liquidated). | |
[].price | number | null | quote currency (USDT for BTCUSDT) | Price. |
[].quantity | number | null | base asset quantity (BTC for BTCUSDT) | Quantity traded or liquidated, in base asset units. |
[].usd_value | number | null | USD | Notional value: price × quantity. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/trades/large?symbol=BTCUSDT&min_usd=100000&limit=3"{
"status": "ok",
"timestamp": 1790790237569,
"data_type": "raw_trades_large",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:43:33.084Z",
"timestamp": "2026-09-30T17:43:33.084Z",
"side": "sell",
"price": 84012.5,
"quantity": 1.2113,
"usd_value": 101764.34125
},
{
"time": "2026-09-30T17:43:17.525Z",
"timestamp": "2026-09-30T17:43:17.525Z",
"side": "sell",
"price": 84015.1,
"quantity": 1.1906,
"usd_value": 100028.37806000002
},
{
"time": "2026-09-30T17:43:03.938Z",
"timestamp": "2026-09-30T17:43:03.938Z",
"side": "sell",
"price": 84027.2,
"quantity": 2.9764,
"usd_value": 250098.55808
}
]
}#Order flow
Who is buying and who is selling: trade candles (spot, futures, combined), CVD, VWAP, buy/sell ratio, average trade size and inter-venue spread. Every bucketed series says whether the value is final (is_closed).
GET /v1/buysell/ratio
Buy/sell volume ratio. Taker buy share of volume over the last 5 minutes, all venues. Above 0.5 = buyers dominate.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
buy_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume over the window. |
sell_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume over the window. |
buy_ratio | number | null | fraction (0.585 = 58.5 %) | buy_volume / (buy_volume + sell_volume). Above 0.5 = buyers dominate. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/buysell/ratio?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790256317,
"data_type": "buysell_ratio",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:35.160Z",
"timestamp": "2026-09-30T17:43:35.160Z",
"buy_volume": 414.7831900000006,
"sell_volume": 361.0590300000007,
"buy_ratio": 0.5346231222116269
}
}GET /v1/buysell/ratio/history
Buy/sell ratio history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].buy_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume over the window. |
[].sell_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume over the window. |
[].buy_ratio | number | null | fraction (0.585 = 58.5 %) | buy_volume / (buy_volume + sell_volume). Above 0.5 = buyers dominate. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/buysell/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790256928,
"data_type": "buysell_ratio_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"buy_volume": 227.26665000000023,
"sell_volume": 291.9107799999998,
"buy_ratio": 0.4377437016089089,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"buy_volume": 344.0962499999999,
"sell_volume": 576.9466400000017,
"buy_ratio": 0.37359416563109166,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"buy_volume": 2437.820319999956,
"sell_volume": 1621.1675800000216,
"buy_ratio": 0.6005980751999703,
"points": 60,
"is_closed": true
}
]
}GET /v1/cvd
Cumulative volume delta per bucket. Net taker delta of the latest closed bucket, with its minute-by-minute path (cvd_series), aggregated across venues. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].cvd_series | number | null[] | base asset quantity (BTC for BTCUSDT) | Cumulative volume delta inside the bucket, one point per minute, starting from 0 at the bucket start. |
[].net_delta | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume - taker sell volume over the bucket, base asset units. |
[].taker_buy_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume over the bucket. |
[].taker_sell_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume over the bucket. |
[].points_count | integer | null | count | Number of one-minute points in cvd_series. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790252033,
"data_type": "cvd_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
45.888329999999726,
69.2295500000001,
200.21975000000012
],
"net_delta": -707.4313099999853,
"taker_buy_volume": 8806.463150000012,
"taker_sell_volume": 9513.894459999998,
"points_count": 60,
"is_closed": true
}
]
}GET /v1/cvd/history
Cumulative volume delta history. Same as /v1/cvd, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].cvd_series | number | null[] | base asset quantity (BTC for BTCUSDT) | Cumulative volume delta inside the bucket, one point per minute, starting from 0 at the bucket start. |
[].net_delta | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume - taker sell volume over the bucket, base asset units. |
[].taker_buy_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker buy volume over the bucket. |
[].taker_sell_volume | number | null | base asset quantity (BTC for BTCUSDT) | Taker sell volume over the bucket. |
[].points_count | integer | null | count | Number of one-minute points in cvd_series. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/cvd/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790252625,
"data_type": "cvd_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
45.888329999999726,
69.2295500000001,
200.21975000000012
],
"net_delta": -707.4313099999853,
"taker_buy_volume": 8806.463150000012,
"taker_sell_volume": 9513.894459999998,
"points_count": 60,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
-662.8237799999529,
-701.9267099999539,
-770.6161599999542
],
"net_delta": -959.671869999996,
"taker_buy_volume": 14950.27055999998,
"taker_sell_volume": 15909.942429999976,
"points_count": 60,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"symbol": "BTCUSDT",
"cvd_series": [
-304.04254000000515,
-636.4162500000092,
-977.9060600000169
],
"net_delta": -1580.8624099997996,
"taker_buy_volume": 36766.47983999995,
"taker_sell_volume": 38347.34224999975,
"points_count": 60,
"is_closed": true
}
]
}GET /v1/spread/interexchange
Inter-venue price spread. Each venue's premium versus the volume-weighted reference price over the bucket, and the widest gap between two venues. The only route that names venues. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
19 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
timeframe | string | Bucket size of the row. | |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). | |
ref_price | number | null | quote currency (USDT for BTCUSDT) | Reference price: the volume-weighted average price across venues over the bucket. |
weighting | string | How venues are combined: oi (open-interest weighted) or volume (volume weighted). | |
max_spread_bps | number | null | basis points (1 bp = 0.01 %) | Gap between the highest and the lowest venue price, relative to ref_price. |
max_spread_pct | number | null | percent (58.5 = 58.5 %) | Same gap as max_spread_bps, in percent. |
high | object | quote currency (USDT for BTCUSDT) | Venue with the highest price over the bucket, and that price ({exchange, price}). |
high.exchange | string | Venue name (this route is the only one that names venues). | |
high.price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
low | object | quote currency (USDT for BTCUSDT) | Venue with the lowest price over the bucket, and that price ({exchange, price}). |
low.exchange | string | Venue name (this route is the only one that names venues). | |
low.price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
venue_count | integer | null | count | Number of venues that contributed to the value. |
venues | object[] | Per-venue prices and premiums ([{exchange, price, premium_bps}]). | |
venues[].exchange | string | Venue name (this route is the only one that names venues). | |
venues[].price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
venues[].premium_bps | number | null | basis points (1 bp = 0.01 %) | Venue price premium (positive) or discount (negative) versus ref_price. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/spread/interexchange?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790255032,
"data_type": "spread_interexchange_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"timeframe": "1h",
"is_closed": true,
"ref_price": 84302.13575805252,
"weighting": "volume",
"max_spread_bps": 7.265255263451655,
"max_spread_pct": 0.07265255263451655,
"high": {
"exchange": "venue_a",
"price": 84339.01594956248
},
"low": {
"exchange": "venue_b",
"price": 84277.76829600884
},
"venues": [
{
"exchange": "venue_a",
"price": 84339.01594956248,
"premium_bps": 4.374763602171059
},
{
"exchange": "venue_c",
"price": 84311.22011829651,
"premium_bps": 1.077595503636774
},
{
"exchange": "venue_d",
"price": 84308.69709339853,
"premium_bps": 0.7783118763251422
}
]
}
}GET /v1/spread/interexchange/history
Inter-venue spread history. Same as /v1/spread/interexchange, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–500 | 30 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
19 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].timeframe | string | Bucket size of the row. | |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). | |
[].ref_price | number | null | quote currency (USDT for BTCUSDT) | Reference price: the volume-weighted average price across venues over the bucket. |
[].weighting | string | How venues are combined: oi (open-interest weighted) or volume (volume weighted). | |
[].max_spread_bps | number | null | basis points (1 bp = 0.01 %) | Gap between the highest and the lowest venue price, relative to ref_price. |
[].max_spread_pct | number | null | percent (58.5 = 58.5 %) | Same gap as max_spread_bps, in percent. |
[].high | object | quote currency (USDT for BTCUSDT) | Venue with the highest price over the bucket, and that price ({exchange, price}). |
[].high.exchange | string | Venue name (this route is the only one that names venues). | |
[].high.price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
[].low | object | quote currency (USDT for BTCUSDT) | Venue with the lowest price over the bucket, and that price ({exchange, price}). |
[].low.exchange | string | Venue name (this route is the only one that names venues). | |
[].low.price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
[].venue_count | integer | null | count | Number of venues that contributed to the value. |
[].venues | object[] | Per-venue prices and premiums ([{exchange, price, premium_bps}]). | |
[].venues[].exchange | string | Venue name (this route is the only one that names venues). | |
[].venues[].price | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted price of the venue over the bucket. |
[].venues[].premium_bps | number | null | basis points (1 bp = 0.01 %) | Venue price premium (positive) or discount (negative) versus ref_price. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/spread/interexchange/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790255706,
"data_type": "spread_interexchange_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"timeframe": "1h",
"is_closed": true,
"ref_price": 84302.13575805252,
"weighting": "volume",
"max_spread_bps": 7.265255263451655,
"max_spread_pct": 0.07265255263451655,
"high": {
"exchange": "venue_a",
"price": 84339.01594956248
},
"low": {
"exchange": "venue_b",
"price": 84277.76829600884
},
"venues": [
{
"exchange": "venue_a",
"price": 84339.01594956248,
"premium_bps": 4.374763602171059
},
{
"exchange": "venue_c",
"price": 84311.22011829651,
"premium_bps": 1.077595503636774
},
{
"exchange": "venue_d",
"price": 84308.69709339853,
"premium_bps": 0.7783118763251422
}
]
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"timeframe": "1h",
"is_closed": true,
"ref_price": 83977.32824027882,
"weighting": "volume",
"max_spread_bps": 7.230792694184376,
"max_spread_pct": 0.07230792694184376,
"high": {
"exchange": "venue_e",
"price": 84006.19755398165
},
"low": {
"exchange": "venue_f",
"price": 83945.47528882996
},
"venues": [
{
"exchange": "venue_e",
"price": 84006.19755398165,
"premium_bps": 3.43775091536961
},
{
"exchange": "venue_a",
"price": 84003.38969198865,
"premium_bps": 3.1033913862157356
},
{
"exchange": "venue_c",
"price": 83991.16097920474,
"premium_bps": 1.6471992162387497
}
]
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"timeframe": "1h",
"is_closed": true,
"ref_price": 83845.17999729452,
"weighting": "volume",
"max_spread_bps": 10.780061118052815,
"max_spread_pct": 0.10780061118052814,
"high": {
"exchange": "venue_b",
"price": 83915.2046517969
},
"low": {
"exchange": "venue_f",
"price": 83824.8190353144
},
"venues": [
{
"exchange": "venue_b",
"price": 83915.2046517969,
"premium_bps": 8.351661300583206
},
{
"exchange": "venue_c",
"price": 83863.89622905052,
"premium_bps": 2.2322370536509726
},
{
"exchange": "venue_a",
"price": 83862.72855779529,
"premium_bps": 2.0929718919247287
}
]
}
]
}GET /v1/trades
Trade candle, spot + futures combined. Trade count, volumes buy/sell, delta, average size and rate for the latest closed bucket, all venues, spot and futures. Volumes are in BASE ASSET units (BTC for BTCUSDT). Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
symbol | string | Trading pair, e.g. BTCUSDT. | |
exchange | string | Always combined: the value aggregates every venue. | |
trades_count | integer | null | count | Number of trades in the bucket, all venues. |
trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
trades_count_sell | integer | null | count | Number of seller-initiated trades. |
trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790243344,
"data_type": "trades_candle_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 675268,
"trades_count_buy": 351422,
"trades_count_sell": 323846,
"trade_count_dom": 27576,
"trades_avg": 0.030507578690431175,
"trade_avg_buy": 0.028389836265600935,
"trade_avg_sell": 0.03280565023807613,
"trade_volume": 20600.79164713008,
"trade_volume_buy": 9976.813040130011,
"trade_volume_sell": 10623.978607,
"volume_delta": -647.1655668699896,
"trade_rate": 187.57444444444445,
"volume_estimated": false,
"is_closed": true
}
}GET /v1/trades/avg-size
Average trade size. Average trade size over the latest minute written, all venues (null if no trade in the last day).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
avg_size | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units. |
total_volume | number | null | base asset quantity (BTC for BTCUSDT) | Total traded volume over the period, base asset units. |
trade_count | integer | null | count | Number of trades. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/avg-size?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790248079,
"data_type": "trade_size_avg",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:35.306Z",
"avg_size": 0.02829312860266349,
"total_volume": 142.34273000000002,
"trade_count": 5031,
"timestamp": "2026-09-30T17:43:35.306Z"
}
}GET /v1/trades/avg-size/history
Average trade size history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].avg_size | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units. |
[].total_volume | number | null | base asset quantity (BTC for BTCUSDT) | Total traded volume over the period, base asset units. |
[].trade_count | integer | null | count | Number of trades. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/avg-size/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790248705,
"data_type": "trade_size_avg_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"avg_size": 0.04530373758231661,
"total_volume": 17749.09831,
"trade_count": 391780,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"avg_size": 0.04430684004913295,
"total_volume": 29181.415299999993,
"trade_count": 658621,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"avg_size": 0.05038130838811356,
"total_volume": 73782.87194000004,
"trade_count": 1464489,
"points": 60,
"is_closed": true
}
]
}GET /v1/trades/future
Trade candle, futures only. Same as /v1/trades, perpetual futures only. Stablecoins have no futures: data: null with unavailable. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
symbol | string | Trading pair, e.g. BTCUSDT. | |
exchange | string | Always combined: the value aggregates every venue. | |
trades_count | integer | null | count | Number of trades in the bucket, all venues. |
trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
trades_count_sell | integer | null | count | Number of seller-initiated trades. |
trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/future?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790246706,
"data_type": "trades_candle_future_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 405045,
"trades_count_buy": 202872,
"trades_count_sell": 202173,
"trade_count_dom": 699,
"trades_avg": 0.04523093574788008,
"trade_avg_buy": 0.04340942456327149,
"trade_avg_sell": 0.04705874468895452,
"trade_volume": 18320.564370000087,
"trade_volume_buy": 8806.556780000014,
"trade_volume_sell": 9514.00759,
"volume_delta": -707.4508099999875,
"trade_rate": 112.5125,
"volume_estimated": false,
"is_closed": true
}
}GET /v1/trades/future/history
Trade candles history, futures only. Same as /v1/trades/future, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].exchange | string | Always combined: the value aggregates every venue. | |
[].trades_count | integer | null | count | Number of trades in the bucket, all venues. |
[].trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
[].trades_count_sell | integer | null | count | Number of seller-initiated trades. |
[].trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
[].trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
[].trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
[].trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
[].trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
[].trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
[].trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
[].volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
[].trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
[].volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/future/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790247486,
"data_type": "trades_candle_future_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 405045,
"trades_count_buy": 202872,
"trades_count_sell": 202173,
"trade_count_dom": 699,
"trades_avg": 0.04523093574788008,
"trade_avg_buy": 0.04340942456327149,
"trade_avg_sell": 0.04705874468895452,
"trade_volume": 18320.564370000087,
"trade_volume_buy": 8806.556780000014,
"trade_volume_sell": 9514.00759,
"volume_delta": -707.4508099999875,
"trade_rate": 112.5125,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 685554,
"trades_count_buy": 352098,
"trades_count_sell": 333456,
"trade_count_dom": 18642,
"trades_avg": 0.04501438543134438,
"trade_avg_buy": 0.04245970854705205,
"trade_avg_sell": 0.04771188261719679,
"trade_volume": 30859.791989999867,
"trade_volume_buy": 14949.978459999931,
"trade_volume_sell": 15909.813529999974,
"volume_delta": -959.835070000041,
"trade_rate": 190.43166666666667,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 1488875,
"trades_count_buy": 747321,
"trades_count_sell": 741554,
"trade_count_dom": 5767,
"trades_avg": 0.05044640762992069,
"trade_avg_buy": 0.04919763092432828,
"trade_avg_sell": 0.0517048959617233,
"trade_volume": 75108.39515999817,
"trade_volume_buy": 36766.422739999936,
"trade_volume_sell": 38341.97241999976,
"volume_delta": -1575.5496799998218,
"trade_rate": 413.5763888888889,
"volume_estimated": false,
"is_closed": true
}
]
}GET /v1/trades/history
Trade candles history, combined. Same as /v1/trades, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].exchange | string | Always combined: the value aggregates every venue. | |
[].trades_count | integer | null | count | Number of trades in the bucket, all venues. |
[].trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
[].trades_count_sell | integer | null | count | Number of seller-initiated trades. |
[].trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
[].trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
[].trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
[].trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
[].trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
[].trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
[].trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
[].volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
[].trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
[].volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790244370,
"data_type": "trades_candle_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 675268,
"trades_count_buy": 351422,
"trades_count_sell": 323846,
"trade_count_dom": 27576,
"trades_avg": 0.030507578690431175,
"trade_avg_buy": 0.028389836265600935,
"trade_avg_sell": 0.03280565023807613,
"trade_volume": 20600.79164713008,
"trade_volume_buy": 9976.813040130011,
"trade_volume_sell": 10623.978607,
"volume_delta": -647.1655668699896,
"trade_rate": 187.57444444444445,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 1086360,
"trades_count_buy": 577625,
"trades_count_sell": 508735,
"trade_count_dom": 68890,
"trades_avg": 0.03149070232565307,
"trade_avg_buy": 0.02889647807452921,
"trade_avg_sell": 0.03443622166883854,
"trade_volume": 34210.239378496466,
"trade_volume_buy": 16691.328147799934,
"trade_volume_sell": 17518.911230696576,
"volume_delta": -827.5830828966427,
"trade_rate": 301.76666666666665,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 2179719,
"trades_count_buy": 1079687,
"trades_count_sell": 1100032,
"trade_count_dom": -20345,
"trades_avg": 0.037564338605351515,
"trade_avg_buy": 0.03697986741873333,
"trade_avg_sell": 0.038138000046171155,
"trade_volume": 81879.7025805182,
"trade_volume_buy": 39926.682113729934,
"trade_volume_sell": 41953.02046678975,
"volume_delta": -2026.3383530598148,
"trade_rate": 605.4775,
"volume_estimated": false,
"is_closed": true
}
]
}GET /v1/trades/spot
Trade candle, spot only. Same as /v1/trades, spot venues only. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
symbol | string | Trading pair, e.g. BTCUSDT. | |
exchange | string | Always combined: the value aggregates every venue. | |
trades_count | integer | null | count | Number of trades in the bucket, all venues. |
trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
trades_count_sell | integer | null | count | Number of seller-initiated trades. |
trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/spot?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790245158,
"data_type": "trades_candle_spot_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 270223,
"trades_count_buy": 148550,
"trades_count_sell": 121673,
"trade_count_dom": 26877,
"trades_avg": 0.008438316786987017,
"trade_avg_buy": 0.00787786105775832,
"trade_avg_sell": 0.0091225745810492,
"trade_volume": 2280.2272771299927,
"trade_volume_buy": 1170.2562601299985,
"trade_volume_sell": 1109.9710169999994,
"volume_delta": 60.28524312999912,
"trade_rate": 75.06194444444445,
"volume_estimated": false,
"is_closed": true
}
}GET /v1/trades/spot/history
Trade candles history, spot only. Same as /v1/trades/spot, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
18 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].symbol | string | Trading pair, e.g. BTCUSDT. | |
[].exchange | string | Always combined: the value aggregates every venue. | |
[].trades_count | integer | null | count | Number of trades in the bucket, all venues. |
[].trades_count_buy | integer | null | count | Number of buyer-initiated trades. |
[].trades_count_sell | integer | null | count | Number of seller-initiated trades. |
[].trade_count_dom | integer | null | count | trades_count_buy - trades_count_sell. Positive = more buy trades. |
[].trades_avg | number | null | base asset quantity (BTC for BTCUSDT) | Average trade size, base asset units (NOT dollars: multiply by the price for a notional). |
[].trade_avg_buy | number | null | base asset quantity (BTC for BTCUSDT) | Average size of buy trades, base asset units. |
[].trade_avg_sell | number | null | base asset quantity (BTC for BTCUSDT) | Average size of sell trades, base asset units. |
[].trade_volume | number | null | base asset quantity (BTC for BTCUSDT) | Traded volume in the bucket, base asset units (BTC for BTCUSDT, NOT dollars). |
[].trade_volume_buy | number | null | base asset quantity (BTC for BTCUSDT) | Buyer-initiated volume, base asset units. |
[].trade_volume_sell | number | null | base asset quantity (BTC for BTCUSDT) | Seller-initiated volume, base asset units. |
[].volume_delta | number | null | base asset quantity (BTC for BTCUSDT) | trade_volume_buy - trade_volume_sell, base asset units. Positive = net buying. |
[].trade_rate | number | null | trades per second | Average number of trades per second over the bucket. |
[].volume_estimated | boolean | true when the aggregated volume of this candle was reconstructed (history before full multi-venue coverage); false = measured. | |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790245928,
"data_type": "trades_candle_spot_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 270223,
"trades_count_buy": 148550,
"trades_count_sell": 121673,
"trade_count_dom": 26877,
"trades_avg": 0.008438316786987017,
"trade_avg_buy": 0.00787786105775832,
"trade_avg_sell": 0.0091225745810492,
"trade_volume": 2280.2272771299927,
"trade_volume_buy": 1170.2562601299985,
"trade_volume_sell": 1109.9710169999994,
"volume_delta": 60.28524312999912,
"trade_rate": 75.06194444444445,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 400806,
"trades_count_buy": 225527,
"trades_count_sell": 175279,
"trade_count_dom": 50248,
"trades_avg": 0.008359274533057393,
"trade_avg_buy": 0.007721247069308773,
"trade_avg_sell": 0.009180208129305851,
"trade_volume": 3350.4473884966014,
"trade_volume_buy": 1741.3496877999996,
"trade_volume_sell": 1609.097700696601,
"volume_delta": 132.25198710339896,
"trade_rate": 111.335,
"volume_estimated": false,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"symbol": "BTCUSDT",
"exchange": "combined",
"trades_count": 690844,
"trades_count_buy": 332366,
"trades_count_sell": 358478,
"trade_count_dom": -26112,
"trades_avg": 0.009801499934167531,
"trade_avg_buy": 0.009508371415036423,
"trade_avg_sell": 0.010073276593793746,
"trade_volume": 6771.307420520034,
"trade_volume_buy": 3160.2593737299967,
"trade_volume_sell": 3611.0480467899943,
"volume_delta": -450.7886730599976,
"trade_rate": 191.9011111111111,
"volume_estimated": false,
"is_closed": true
}
]
}GET /v1/vwap
Intraday VWAP. Volume-weighted average price since 00:00 UTC, across venues.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
vwap | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted average price. |
cumulative_volume | number | null | base asset quantity (BTC for BTCUSDT) | Volume accumulated since 00:00 UTC used by the intraday VWAP. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790249449,
"data_type": "vwap",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:35.012Z",
"vwap": 84134.93151031101,
"cumulative_volume": 481654.8924199963,
"timestamp": "2026-09-30T17:43:35.012Z"
}
}GET /v1/vwap/history
Intraday VWAP history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].vwap | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted average price. |
[].cumulative_volume | number | null | base asset quantity (BTC for BTCUSDT) | Volume accumulated since 00:00 UTC used by the intraday VWAP. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790250061,
"data_type": "vwap_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"vwap": 84136.1012346141,
"cumulative_volume": 467094.5892599979,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"vwap": 84129.33791306509,
"cumulative_volume": 448732.8932999992,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"vwap": 84140.64956432498,
"cumulative_volume": 417838.5442400001,
"points": 60,
"is_closed": true
}
]
}GET /v1/vwap/window
VWAP per bucket. Volume-weighted average price of each closed bucket (not cumulative, unlike /v1/vwap). Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].vwap | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted average price. |
[].total_volume | number | null | base asset quantity (BTC for BTCUSDT) | Total traded volume over the period, base asset units. |
[].trade_count | integer | null | count | Number of trades. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/window?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790250780,
"data_type": "vwap_window_1h",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"vwap": 84302.13575805251,
"total_volume": 18320.35761,
"trade_count": 404455,
"is_closed": true
}
]
}GET /v1/vwap/window/history
VWAP per bucket history. Same as /v1/vwap/window, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].vwap | number | null | quote currency (USDT for BTCUSDT) | Volume-weighted average price. |
[].total_volume | number | null | base asset quantity (BTC for BTCUSDT) | Total traded volume over the period, base asset units. |
[].trade_count | integer | null | count | Number of trades. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/window/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790251421,
"data_type": "vwap_window_1h_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"vwap": 84302.13575805251,
"total_volume": 18320.35761,
"trade_count": 404455,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"vwap": 83977.32824027885,
"total_volume": 30860.212989999996,
"trade_count": 685071,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"vwap": 83845.17999729452,
"total_volume": 75113.8220900001,
"trade_count": 1488572,
"is_closed": true
}
]
}#Derivatives
Perpetual futures positioning, aggregated across venues: funding (settled, estimated, cumulative), basis, open interest, long/short account ratio.
GET /v1/basis
Futures-spot basis. Perpetual futures price versus spot, OI-weighted across venues (each venue weighted by its latest open interest within 10 minutes).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
basis_value | number | null | quote currency (USDT for BTCUSDT) | Futures price - spot price. |
basis_pct | number | null | percent (58.5 = 58.5 %) | (futures - spot) / spot, in percent. Positive = contango. |
futures_price | number | null | quote currency (USDT for BTCUSDT) | Perpetual futures price, open-interest weighted across venues. |
spot_price | number | null | quote currency (USDT for BTCUSDT) | Spot price across venues. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/basis?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790261142,
"data_type": "basis",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:37.309Z",
"basis_value": -38.03961943906421,
"basis_pct": -0.04526350810118282,
"futures_price": 84002.17394512612,
"spot_price": 84040.21356456519,
"timestamp": "2026-09-30T17:43:37.309Z"
}
}GET /v1/basis/history
Basis history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].basis_value | number | null | quote currency (USDT for BTCUSDT) | Futures price - spot price. |
[].basis_pct | number | null | percent (58.5 = 58.5 %) | (futures - spot) / spot, in percent. Positive = contango. |
[].futures_price | number | null | quote currency (USDT for BTCUSDT) | Perpetual futures price, open-interest weighted across venues. |
[].spot_price | number | null | quote currency (USDT for BTCUSDT) | Spot price across venues. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/basis/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790261798,
"data_type": "basis_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"basis_value": -33.981449109710006,
"basis_pct": -0.04029417463246244,
"futures_price": 84298.40975007898,
"spot_price": 84332.39119918869,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"basis_value": -35.702638083532776,
"basis_pct": -0.04243001848673969,
"futures_price": 84107.74754775809,
"spot_price": 84143.45018584162,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"basis_value": -42.805161758335856,
"basis_pct": -0.05107252133261064,
"futures_price": 83768.58660190101,
"spot_price": 83811.39176365935,
"points": 60,
"is_closed": true
}
]
}GET /v1/funding/cumulative
Funding over the last 24 h. Sum of the last three settled 8-hour windows, and its annualised rate.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
cumulative_rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Sum of the last three settled 8-hour funding rates (24 h). |
apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
window_count | integer | null | count | Number of 8-hour funding windows summed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/cumulative?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790259660,
"data_type": "funding_cumulative_24h",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T08:00:00.000Z",
"timestamp": "2026-09-30T08:00:00.000Z",
"cumulative_rate": 0.0001554701434771935,
"apr_pct": 5.674660236917563,
"window_count": 3
}
}GET /v1/funding/cumulative/history
Cumulative funding history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].cumulative_rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Sum of the last three settled 8-hour funding rates (24 h). |
[].apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
[].window_count | integer | null | count | Number of 8-hour funding windows summed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/cumulative/history?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790260359,
"data_type": "funding_cumulative_24h_history",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T08:00:00.000Z",
"timestamp": "2026-09-30T08:00:00.000Z",
"cumulative_rate": 0.0001554701434771935,
"apr_pct": 5.674660236917563,
"window_count": 3
},
{
"time": "2026-09-30T00:00:00.000Z",
"timestamp": "2026-09-30T00:00:00.000Z",
"cumulative_rate": 0.00011811682942642308,
"apr_pct": 4.311264274064443,
"window_count": 3
},
{
"time": "2026-09-29T16:00:00.000Z",
"timestamp": "2026-09-29T16:00:00.000Z",
"cumulative_rate": 0.00014946293667145142,
"apr_pct": 5.455397188507977,
"window_count": 3
}
]
}GET /v1/funding/next
Next funding forecast. Each venue's forecast of its next settlement, normalised to 8 h and OI-weighted.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
estimated_rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Venue forecast of the NEXT funding settlement, normalised to 8 h, OI-weighted. |
settlement_at | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Instant of the next funding settlement. |
is_past | boolean | true if the forecast settlement instant is already past (the next forecast is not published yet). | |
exchange_count | integer | null | count | Number of venues in the weighted average. |
apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/next?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790258997,
"data_type": "funding_next_estimated",
"symbol": "BTCUSDT",
"data": {
"time": "2026-10-01T00:00:00.000Z",
"estimated_rate": 0.00005850917027312007,
"settlement_at": "2026-10-01T00:00:00.000Z",
"is_past": false,
"apr_pct": 6.406754144906649
}
}GET /v1/funding/rate
Latest settled funding rate. The last fully settled 8-hour funding window, normalised to 8 h and weighted by the open interest of each venue at that time. ?live=1 for the window in progress.
| Parameter | Type | Default | Description |
|---|---|---|---|
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Settled funding rate, normalised to an 8-hour period, open-interest weighted across venues. |
apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
exchange_count | integer | null | count | Number of venues in the weighted average. |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790257566,
"data_type": "funding_rate_8h",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T08:00:00.000Z",
"bucket": "2026-09-30T08:00:00.000Z",
"rate": 0.00006287020093464953,
"apr_pct": 6.884287002344124,
"is_closed": true
}
}GET /v1/funding/rate/history
Settled funding history. One row per settled 8-hour window. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].rate | number | null | rate per 8 h, fraction (0.0001 = 0.01 % per 8 h) | Settled funding rate, normalised to an 8-hour period, open-interest weighted across venues. |
[].exchange_count | integer | null | count | Number of venues in the weighted average. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). | |
[].apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/rate/history?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790258225,
"data_type": "funding_rate_8h_history",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T08:00:00.000Z",
"bucket": "2026-09-30T08:00:00.000Z",
"rate": 0.00006287020093464953,
"is_closed": true,
"apr_pct": 6.884287002344124
},
{
"time": "2026-09-30T00:00:00.000Z",
"bucket": "2026-09-30T00:00:00.000Z",
"rate": 0.0000189458991289909,
"is_closed": true,
"apr_pct": 2.0745759546245033
},
{
"time": "2026-09-29T16:00:00.000Z",
"bucket": "2026-09-29T16:00:00.000Z",
"rate": 0.00007365404341355308,
"is_closed": true,
"apr_pct": 8.065117753784062
}
]
}GET /v1/ls-ratio
Long/short account ratio. Share of accounts long, composite across venues weighted by open interest. Accounts, not volume. No 1m timeframe. Bucketed: is_closed says whether the value is final. Add ?live=1 for the open period.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | 5m, 15m, 30m, 1h, 4h or 1d — no 1m: no venue publishes a 1-minute account ratio. |
live | boolean | false | 1 or true to return the CURRENT, still-open period computed on the fly (is_closed: false). Default: the last closed period only. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
timeframe | string | Bucket size of the row. | |
part_long | number | null | fraction (0.585 = 58.5 %) | Share of ACCOUNTS long (0.57 = 57 % of accounts are long). Accounts, not volume. |
ratio | number | null | longs / shorts | Long ACCOUNTS / short accounts (1.35 = 35 % more long accounts). Composite across venues, OI-weighted. |
venue_count | integer | null | count | Number of venues that contributed to the value. |
weighting | string | How venues are combined: oi (open-interest weighted) or volume (volume weighted). | |
is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/ls-ratio?symbol=BTCUSDT&timeframe=1h"{
"status": "ok",
"timestamp": 1790790263708,
"data_type": "ls_ratio_composite",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"timeframe": "1h",
"part_long": 0.5744708637730429,
"ratio": 1.3500153452868322,
"weighting": "oi",
"is_closed": true
}
}GET /v1/ls-ratio/history
Long/short ratio history. Same as /v1/ls-ratio, one row per closed bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe required | string | — | 5m, 15m, 30m, 1h, 4h or 1d — no 1m: no venue publishes a 1-minute account ratio. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–500 | 30 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].timeframe | string | Bucket size of the row. | |
[].part_long | number | null | fraction (0.585 = 58.5 %) | Share of ACCOUNTS long (0.57 = 57 % of accounts are long). Accounts, not volume. |
[].ratio | number | null | longs / shorts | Long ACCOUNTS / short accounts (1.35 = 35 % more long accounts). Composite across venues, OI-weighted. |
[].venue_count | integer | null | count | Number of venues that contributed to the value. |
[].weighting | string | How venues are combined: oi (open-interest weighted) or volume (volume weighted). | |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/ls-ratio/history?symbol=BTCUSDT&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790264321,
"data_type": "ls_ratio_composite_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"timeframe": "1h",
"part_long": 0.5744708637730429,
"ratio": 1.3500153452868322,
"weighting": "oi",
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"timeframe": "1h",
"part_long": 0.5750662788177455,
"ratio": 1.3533081752556395,
"weighting": "oi",
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"timeframe": "1h",
"part_long": 0.5595834191896681,
"ratio": 1.270577547648362,
"weighting": "oi",
"is_closed": true
}
]
}GET /v1/oi/delta
Open interest change. Change of total open interest over the last minute, summed across venues.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
oi_current | number | null | base asset quantity (BTC for BTCUSDT) | Total open interest across venues at the end of the window, base asset units. |
oi_previous | number | null | base asset quantity (BTC for BTCUSDT) | Total open interest at the start of the window. |
delta | number | null | base asset quantity (BTC for BTCUSDT) | oi_current - oi_previous, base asset units. |
delta_pct | number | null | percent (58.5 = 58.5 %) | Relative open interest change in percent. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/oi/delta?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790262526,
"data_type": "oi_delta",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:35.091Z",
"oi_current": 343643.70848000003,
"oi_previous": 343637.2931800001,
"delta": 6.415299999987383,
"delta_pct": 0.0018668811934142136,
"timestamp": "2026-09-30T17:43:35.091Z"
}
}GET /v1/oi/delta/history
Open interest change history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].oi_current | number | null | base asset quantity (BTC for BTCUSDT) | Total open interest across venues at the end of the window, base asset units. |
[].oi_previous | number | null | base asset quantity (BTC for BTCUSDT) | Total open interest at the start of the window. |
[].delta | number | null | base asset quantity (BTC for BTCUSDT) | oi_current - oi_previous, base asset units. |
[].delta_pct | number | null | percent (58.5 = 58.5 %) | Relative open interest change in percent. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/oi/delta/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790263127,
"data_type": "oi_delta_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"oi_current": 343164.8987600001,
"oi_previous": 342873.06846000004,
"delta": 291.83030000008876,
"delta_pct": 0.08511321735207501,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"oi_current": 342842.7449000001,
"oi_previous": 341557.2792000001,
"delta": 1285.4657000000009,
"delta_pct": 0.3763543564379114,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"oi_current": 339753.7792000002,
"oi_previous": 340456.93278000003,
"delta": -703.1535799998092,
"delta_pct": -0.20653231357582025,
"points": 60,
"is_closed": true
}
]
}#Liquidations
Forced liquidations across venues: individual events, cumulative long/short USD, big vs small liquidations, and the liquidation heatmap clusters the price is drawn to.
GET /v1/heatmap/clusters
Liquidation heatmap clusters. The most attractive cluster of estimated liquidation levels above and below the price, projected from open interest changes and the leverage mix. attraction = density / distance²: compare attraction_up and attraction_down to see where the price has a mechanical reason to go. Not a prediction.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
density_up | number | null | dimensionless score | Estimated liquidation density of the most attractive cluster ABOVE the price (short positions). |
dist_up | number | null | fraction (0.585 = 58.5 %) | Distance from the price to the cluster above, as a fraction of the price (0.037 = 3.7 % higher). |
density_down | number | null | dimensionless score | Estimated liquidation density of the most attractive cluster BELOW the price (long positions). |
dist_down | number | null | fraction (0.585 = 58.5 %) | Distance from the price to the cluster below, as a fraction of the price. |
attraction_up | number | null | dimensionless score | density_up / dist_up²: how strongly the cluster above pulls the price. |
attraction_down | number | null | dimensionless score | density_down / dist_down²: how strongly the cluster below pulls the price. Compare with attraction_up. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/heatmap/clusters?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790267332,
"data_type": "heatmap_clusters",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:36.237Z",
"timestamp": "2026-09-30T17:43:36.237Z",
"density_up": 4.381205519726549,
"dist_up": 0.037029277745770736,
"density_down": 2.042372012549034,
"dist_down": 0.010584555024925809,
"attraction_up": 3195.2374936721594,
"attraction_down": 18230.12474934765
}
}GET /v1/heatmap/clusters/history
Liquidation clusters history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].density_up | number | null | dimensionless score | Estimated liquidation density of the most attractive cluster ABOVE the price (short positions). |
[].dist_up | number | null | fraction (0.585 = 58.5 %) | Distance from the price to the cluster above, as a fraction of the price (0.037 = 3.7 % higher). |
[].density_down | number | null | dimensionless score | Estimated liquidation density of the most attractive cluster BELOW the price (long positions). |
[].dist_down | number | null | fraction (0.585 = 58.5 %) | Distance from the price to the cluster below, as a fraction of the price. |
[].attraction_up | number | null | dimensionless score | density_up / dist_up²: how strongly the cluster above pulls the price. |
[].attraction_down | number | null | dimensionless score | density_down / dist_down²: how strongly the cluster below pulls the price. Compare with attraction_up. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/heatmap/clusters/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790267954,
"data_type": "heatmap_clusters_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"density_up": 5.737933611896139,
"dist_up": 0.033453183218485505,
"density_down": 1.4432528637559463,
"dist_down": 0.019690414816624865,
"attraction_up": 5127.204277653998,
"attraction_down": 3722.482776012855,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"density_up": 7.878246185746095,
"dist_up": 0.03577046128165891,
"density_down": 5.790287854911657,
"dist_down": 0.03175910965589645,
"attraction_up": 6157.160385641724,
"attraction_down": 5740.682353844244,
"points": 59,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"density_up": 8.122598498500858,
"dist_up": 0.03999665749467288,
"density_down": 1.652863877001746,
"dist_down": 0.011573424695145608,
"attraction_up": 5077.4726000692,
"attraction_down": 12339.947386970793,
"points": 60,
"is_closed": true
}
]
}GET /v1/liquidations/cumulative
Liquidations over the last 5 minutes. Longs and shorts liquidated, USD, all venues.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
long_usd | number | null | USD | Long positions liquidated, USD. |
short_usd | number | null | USD | Short positions liquidated, USD. |
total_usd | number | null | USD | Total, USD. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/cumulative?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790264918,
"data_type": "liquidations_cumulative",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:43:37.551Z",
"timestamp": "2026-09-30T17:43:37.551Z",
"long_usd": 0,
"short_usd": 24959.6376,
"total_usd": 24959.6376
}
}GET /v1/liquidations/cumulative/history
Cumulative liquidations history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].long_usd | number | null | USD | Long positions liquidated, USD. |
[].short_usd | number | null | USD | Short positions liquidated, USD. |
[].total_usd | number | null | USD | Total, USD. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/cumulative/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790265502,
"data_type": "liquidations_cumulative_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"long_usd": 0,
"short_usd": 0,
"total_usd": 0,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"long_usd": 0,
"short_usd": 0,
"total_usd": 0,
"points": 60,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"long_usd": 0,
"short_usd": 298657.3881799999,
"total_usd": 298657.3881799999,
"points": 60,
"is_closed": true
}
]
}GET /v1/liquidations/ratio
Big vs small liquidations. Liquidations of 100,000 USD or more versus smaller ones over the latest minute with liquidations: counts, USD and ratio. A high ratio = large positions are being flushed.
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
big_count | integer | null | count | Liquidations of 100,000 USD or more. |
big_usd | number | null | USD | Notional of liquidations of 100,000 USD or more. |
small_count | integer | null | count | Liquidations below 100,000 USD. |
small_usd | number | null | USD | Notional of liquidations below 100,000 USD. |
ratio | number | null | big / small | big_usd / small_usd: how much of the liquidated notional comes from liquidations of 100,000 USD or more. null when small_usd is 0. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/ratio?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790266098,
"data_type": "liquidation_ratio",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:42:37.587Z",
"big_count": 0,
"big_usd": 0,
"small_count": 1,
"small_usd": 24959.6376,
"ratio": 0,
"timestamp": "2026-09-30T17:42:37.587Z"
}
}GET /v1/liquidations/ratio/history
Big vs small liquidations history. Per minute, or per bucket with timeframe. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
timeframe | string | any | null | — | Optional. With it, rows are aggregated per bucket and carry is_closed; without it, one row per minute. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].big_count | integer | null | count | Liquidations of 100,000 USD or more. |
[].big_usd | number | null | USD | Notional of liquidations of 100,000 USD or more. |
[].small_count | integer | null | count | Liquidations below 100,000 USD. |
[].small_usd | number | null | USD | Notional of liquidations below 100,000 USD. |
[].ratio | number | null | big / small | big_usd / small_usd: how much of the liquidated notional comes from liquidations of 100,000 USD or more. null when small_usd is 0. |
[].points | integer | null | count | Number of one-minute source points inside the bucket. |
[].is_closed | boolean | true = the bucket is final and will never change; false = provisional (only with ?live=1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h"{
"status": "ok",
"timestamp": 1790790266714,
"data_type": "liquidation_ratio_history",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"timestamp": "2026-09-30T16:00:00.000Z",
"big_count": 3,
"big_usd": 686762.855,
"small_count": 48,
"small_usd": 233046.83456,
"ratio": 2.946887720215684,
"points": 16,
"is_closed": true
},
{
"time": "2026-09-30T15:00:00.000Z",
"timestamp": "2026-09-30T15:00:00.000Z",
"big_count": 1,
"big_usd": 103179.4957,
"small_count": 89,
"small_usd": 782962.43066,
"ratio": 0.13178090245406107,
"points": 19,
"is_closed": true
},
{
"time": "2026-09-30T14:00:00.000Z",
"timestamp": "2026-09-30T14:00:00.000Z",
"big_count": 14,
"big_usd": 3831670.98218,
"small_count": 338,
"small_usd": 3095117.8715999993,
"ratio": 1.2379725558559245,
"points": 32,
"is_closed": true
}
]
}GET /v1/raw/liquidations
Individual liquidations. Forced liquidations across futures venues. Without min_usd, limit is a look-back in minutes; with it, a number of events. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer · 1–1000 | 30 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
min_usd | number | any | null | — | Optional minimum notional in USD. With it, limit counts events; without it, limit is a look-back in minutes. |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].side | string | long (a long position was liquidated: forced sell) or short (forced buy). | |
[].price | number | null | quote currency (USDT for BTCUSDT) | Price. |
[].quantity | number | null | base asset quantity (BTC for BTCUSDT) | Quantity traded or liquidated, in base asset units. |
[].usd_value | number | null | USD | Notional value: price × quantity. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/liquidations?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790241222,
"data_type": "raw_liquidations",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-30T17:42:05.086Z",
"timestamp": "2026-09-30T17:42:05.086Z",
"side": "short",
"price": 84323.1,
"quantity": 0.296,
"usd_value": 24959.6376
},
{
"time": "2026-09-30T17:37:48.302Z",
"timestamp": "2026-09-30T17:37:48.302Z",
"side": "long",
"price": 83608.9,
"quantity": 0.041,
"usd_value": 3427.9649
},
{
"time": "2026-09-30T17:37:48.103Z",
"timestamp": "2026-09-30T17:37:48.103Z",
"side": "long",
"price": 83870.8,
"quantity": 0.0602,
"usd_value": 5049.0221599999995
}
]
}#Tokenomics & sentiment
Supply, market cap and FDV derived from the live price; total crypto market cap and dominance; the Crypto Fear & Greed Index.
GET /v1/fear-greed
Crypto Fear & Greed Index. Daily index from 0 (extreme fear) to 100 (extreme greed).
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
value | integer | null | score from 0 to 100 | Crypto Fear & Greed Index (alternative.me). 0 = extreme fear, 100 = extreme greed. |
value_classification | string | Label published by alternative.me: Extreme Fear, Fear, Neutral, Greed or Extreme Greed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/fear-greed"{
"status": "ok",
"timestamp": 1790790270960,
"data_type": "fear_greed",
"data": {
"time": "2026-09-30T00:00:00.000Z",
"timestamp": "2026-09-30T00:00:00.000Z",
"value": 71,
"value_classification": "Greed"
}
}GET /v1/fear-greed/history
Fear & Greed history. One point per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].value | integer | null | score from 0 to 100 | Crypto Fear & Greed Index (alternative.me). 0 = extreme fear, 100 = extreme greed. |
[].value_classification | string | Label published by alternative.me: Extreme Fear, Fear, Neutral, Greed or Extreme Greed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/fear-greed/history?limit=3"{
"status": "ok",
"timestamp": 1790790271571,
"data_type": "fear_greed_history",
"data": [
{
"time": "2026-09-30T00:00:00.000Z",
"timestamp": "2026-09-30T00:00:00.000Z",
"value": 71,
"value_classification": "Greed"
},
{
"time": "2026-09-29T00:00:00.000Z",
"timestamp": "2026-09-29T00:00:00.000Z",
"value": 73,
"value_classification": "Greed"
},
{
"time": "2026-09-28T00:00:00.000Z",
"timestamp": "2026-09-28T00:00:00.000Z",
"value": 74,
"value_classification": "Greed"
}
]
}GET /v1/global
Total crypto market. Total market capitalisation, 24 h volume and dominance of BTC, ETH and the rest.
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
total_market_cap_usd | number | null | USD | Total crypto market capitalisation. |
total_volume_usd | number | null | USD | Total crypto trading volume over 24 h. |
btc_dominance_pct | number | null | percent (58.5 = 58.5 %) | Bitcoin share of the total market cap. |
eth_dominance_pct | number | null | percent (58.5 = 58.5 %) | Ether share of the total market cap. |
others_dominance_pct | number | null | percent (58.5 = 58.5 %) | Share of every other asset. |
active_cryptocurrencies | integer | null | count | Number of tracked crypto assets. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/global"{
"status": "ok",
"timestamp": 1790790269775,
"data_type": "global_market",
"data": {
"time": "2026-09-30T17:42:59.999Z",
"timestamp": "2026-09-30T17:42:59.999Z",
"total_market_cap_usd": 2874833696756.3394,
"total_volume_usd": 97265311262.98,
"btc_dominance_pct": 58.690500129705,
"eth_dominance_pct": 11.376752459757,
"others_dominance_pct": 29.932747410538,
"active_cryptocurrencies": 8167
}
}GET /v1/global/history
Total crypto market history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].total_market_cap_usd | number | null | USD | Total crypto market capitalisation. |
[].total_volume_usd | number | null | USD | Total crypto trading volume over 24 h. |
[].btc_dominance_pct | number | null | percent (58.5 = 58.5 %) | Bitcoin share of the total market cap. |
[].eth_dominance_pct | number | null | percent (58.5 = 58.5 %) | Ether share of the total market cap. |
[].others_dominance_pct | number | null | percent (58.5 = 58.5 %) | Share of every other asset. |
[].active_cryptocurrencies | integer | null | count | Number of tracked crypto assets. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/global/history?limit=3"{
"status": "ok",
"timestamp": 1790790270360,
"data_type": "global_market_history",
"data": [
{
"time": "2026-09-30T17:42:59.999Z",
"timestamp": "2026-09-30T17:42:59.999Z",
"total_market_cap_usd": 2874833696756.3394,
"total_volume_usd": 97265311262.98,
"btc_dominance_pct": 58.690500129705,
"eth_dominance_pct": 11.376752459757,
"others_dominance_pct": 29.932747410538,
"active_cryptocurrencies": 8167
},
{
"time": "2026-09-30T17:37:59.999Z",
"timestamp": "2026-09-30T17:37:59.999Z",
"total_market_cap_usd": 2874319286069.3374,
"total_volume_usd": 97035286246.96,
"btc_dominance_pct": 58.670416397566,
"eth_dominance_pct": 11.373890924843,
"others_dominance_pct": 29.955692677591,
"active_cryptocurrencies": 8167
},
{
"time": "2026-09-30T17:32:59.999Z",
"timestamp": "2026-09-30T17:32:59.999Z",
"total_market_cap_usd": 2878731860046.837,
"total_volume_usd": 97035651300.5,
"btc_dominance_pct": 58.666193931145,
"eth_dominance_pct": 11.376852170647,
"others_dominance_pct": 29.956953898208,
"active_cryptocurrencies": 8167
}
]
}GET /v1/tokenomics
Supply, market cap and FDV. Circulating, total and max supply, with market cap and FDV derived from the latest price at request time (pegged at 1 for stablecoins, FDV null).
| Parameter | Type | Default | Description |
|---|---|---|---|
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
symbol | string | Trading pair, e.g. BTCUSDT. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
circulating_supply | number | null | coins | Coins in circulation. |
total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
max_supply | number | null | coins | Hard cap on supply. null = no cap. |
price | number | null | USD | Latest price used for market_cap and fdv. |
market_cap | number | null | USD | circulating_supply × current price, derived at request time. |
fdv | number | null | USD | Fully diluted valuation: max_supply (or total_supply if uncapped) × price. null for stablecoins. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/tokenomics?symbol=BTCUSDT"{
"status": "ok",
"timestamp": 1790790268578,
"data_type": "tokenomics",
"symbol": "BTCUSDT",
"data": {
"time": "2026-09-30T17:33:15.926Z",
"symbol": "BTCUSDT",
"timestamp": "2026-09-30T17:33:15.926Z",
"circulating_supply": 20090909,
"total_supply": 20090909,
"max_supply": 21000000,
"price": 84046.01,
"market_cap": 1688560738723.0898,
"fdv": 1764966210000
}
}GET /v1/tokenomics/history
Supply and market cap history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–1000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
symbol required | string | — | Trading pair, e.g. BTCUSDT. Required. The 22 served pairs: GET /v1/symbols. An unknown pair returns 400 invalid_symbol with the accepted list. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].price | number | null | USD | Daily closing price used for the derived values. |
[].circulating_supply | number | null | coins | Coins in circulation. |
[].total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
[].max_supply | number | null | coins | Hard cap on supply. null = no cap. |
[].market_cap | number | null | USD | circulating_supply × current price, derived at request time. |
[].fdv | number | null | USD | Fully diluted valuation: max_supply (or total_supply if uncapped) × price. null for stablecoins. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/tokenomics/history?symbol=BTCUSDT&limit=3"{
"status": "ok",
"timestamp": 1790790269174,
"data_type": "tokenomics_history",
"symbol": "BTCUSDT",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"bucket": "2026-09-29T00:00:00.000Z",
"price": 83663.66,
"circulating_supply": 20090909,
"total_supply": 20090909,
"max_supply": 21000000,
"market_cap": 1680878979666.9402,
"fdv": 1756936860000
},
{
"time": "2026-09-28T00:00:00.000Z",
"bucket": "2026-09-28T00:00:00.000Z",
"price": 83461.1,
"circulating_supply": 20090662,
"total_supply": 20090662,
"max_supply": 21000000,
"market_cap": 1676788750248.2002,
"fdv": 1752683100000.0002
},
{
"time": "2026-09-27T00:00:00.000Z",
"bucket": "2026-09-27T00:00:00.000Z",
"price": 84432.9,
"circulating_supply": 20090284,
"total_supply": 20090284,
"max_supply": 21000000,
"market_cap": 1696280939943.6,
"fdv": 1773090899999.9998
}
]
}#Macro
Daily FRED series (rates, inflation, liquidity, commodities), intraday macro candles (DXY, EUR/USD, gold, oil, US yields, VIX...), and derived crypto-macro signals: net liquidity, BTC correlations, macro momentum, risk-on/risk-off score.
GET /v1/macro
Latest macro values. Latest value of one FRED series, or of every active series when series is omitted (then data is a list).
| Parameter | Type | Default | Description |
|---|---|---|---|
series | string | any | null | — | FRED series id (e.g. DGS10). Omit to get the latest value of EVERY active series. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
series_id | string | Series identifier. | |
category | string | Series category. | |
label | string | Human-readable name. | |
frequency | string | Publication frequency of the source (daily, weekly, monthly). | |
units | string | Unit of value as published by the source. | |
date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
value | number | null | see `units` | Latest value of the series, in the unit given by units. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro?series=DGS10"{
"status": "ok",
"timestamp": 1790790272185,
"data_type": "macro",
"data": {
"time": "2026-09-28",
"series_id": "DGS10",
"category": "rates",
"label": "Treasury 10Y",
"frequency": "daily",
"units": "%",
"date": "2026-09-28",
"value": 5.24
}
}GET /v1/macro/correlations
BTC correlation with macro. Rolling Pearson correlation of BTC daily returns with the dollar index, the S&P 500, gold and the VIX, over 30 and 90 days.
31 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
asset | string | Asset, e.g. BTC. | |
method | string | How the value is computed. | |
correlations | object | dimensionless ratio | Pearson correlation from -1 to 1, per macro series and window, with n = number of common days. |
correlations.dxy | object | index points | US Dollar Index. |
correlations.dxy.30d | object | ||
correlations.dxy.30d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.dxy.30d.n | integer | null | count | Number of days used. |
correlations.dxy.90d | object | ||
correlations.dxy.90d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.dxy.90d.n | integer | null | count | Number of days used. |
correlations.sp500 | object | index points | S&P 500. |
correlations.sp500.30d | object | ||
correlations.sp500.30d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.sp500.30d.n | integer | null | count | Number of days used. |
correlations.sp500.90d | object | ||
correlations.sp500.90d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.sp500.90d.n | integer | null | count | Number of days used. |
correlations.gold | object | USD per troy ounce | Gold price. |
correlations.gold.30d | object | ||
correlations.gold.30d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.gold.30d.n | integer | null | count | Number of days used. |
correlations.gold.90d | object | ||
correlations.gold.90d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.gold.90d.n | integer | null | count | Number of days used. |
correlations.vix | object | index points | CBOE Volatility Index. |
correlations.vix.30d | object | ||
correlations.vix.30d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.vix.30d.n | integer | null | count | Number of days used. |
correlations.vix.90d | object | ||
correlations.vix.90d.correlation | number | null | from -1 to 1 | Pearson correlation of daily returns. |
correlations.vix.90d.n | integer | null | count | Number of days used. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/correlations"{
"status": "ok",
"timestamp": 1790790274029,
"data_type": "macro_correlations",
"data": {
"asset": "BTC",
"method": "Pearson correlation of daily returns (common dates), rolling window",
"correlations": {
"dxy": {
"30d": {
"correlation": -0.2916,
"n": 19
},
"90d": {
"correlation": -0.3964,
"n": 60
}
},
"sp500": {
"30d": {
"correlation": 0.6678,
"n": 21
},
"90d": {
"correlation": 0.3802,
"n": 62
}
},
"gold": {
"30d": {
"correlation": 0.452,
"n": 30
},
"90d": {
"correlation": 0.5598,
"n": 90
}
},
"vix": {
"30d": {
"correlation": -0.3265,
"n": 22
},
"90d": {
"correlation": -0.3002,
"n": 64
}
}
}
}
}GET /v1/macro/history
Macro series history. Values of one series at its native frequency. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 100 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
series required | string | — | FRED series id, e.g. DGS10, CPIAUCSL, WALCL. The list: GET /v1/macro/series. |
3 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].value | number | null | see the series `units` | Value of the series on date. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/history?series=DGS10&limit=3"{
"status": "ok",
"timestamp": 1790790273427,
"data_type": "macro_history",
"data": [
{
"time": "2026-09-28",
"date": "2026-09-28",
"value": 5.24
},
{
"time": "2026-09-25",
"date": "2026-09-25",
"value": 5.17
},
{
"time": "2026-09-24",
"date": "2026-09-24",
"value": 5.18
}
]
}GET /v1/macro/intraday/history
Intraday macro candles. OHLCV candles of one instrument. data is an object {series, timeframe, candles}, candles most recent first.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 500 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
series required | string | — | The series_id returned by GET /v1/macro/intraday/series (e.g. EURUSD, DXY_ICE, VIX_CBOE). The instrument_code column is NOT accepted. |
timeframe | string | 1h | Candle size. Optional, default 1h. Each series serves only the timeframes listed in its catalogue entry; others return 400 timeframe_not_served. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
series | string | Series identifier. | |
timeframe | string | Bucket size of the row. | |
candles | object[] | OHLCV candles, most recent first. | |
candles[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
candles[].open | number | null | series unit | Open. |
candles[].high | number | null | series unit | High. |
candles[].low | number | null | series unit | Low. |
candles[].close | number | null | series unit | Close. |
candles[].volume | number | null | see `volume_kind` | Volume reported by the source for this instrument (not the whole market). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/intraday/history?series=EURUSD&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790277694,
"data_type": "macro_intraday_history",
"timeframe": "1h",
"data": {
"series": "EURUSD",
"timeframe": "1h",
"candles": [
{
"time": "2026-09-28T23:00:00.000Z",
"open": 1.13714,
"high": 1.13719,
"low": 1.13698,
"close": 1.13708,
"volume": 1074.929991543293
},
{
"time": "2026-09-28T22:00:00.000Z",
"open": 1.13673,
"high": 1.1374,
"low": 1.13665,
"close": 1.13715,
"volume": 1763.1900064647198
},
{
"time": "2026-09-28T21:00:00.000Z",
"open": 1.13702,
"high": 1.13702,
"low": 1.13643,
"close": 1.13673,
"volume": 2544.100001811981
}
]
}
}GET /v1/macro/intraday/series
Intraday macro instruments. Instruments with intraday candles (FX, dollar index, gold, oil, US yields, VIX...), the timeframes each serves, their history depth and last candle.
16 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].series_id | string | Series identifier. | |
[].source | string | Upstream source. | |
[].instrument_code | string | Code of the instrument at the source (informative; use series_id in requests). | |
[].category | string | Series category. | |
[].label | string | Human-readable name. | |
[].units | string | Unit of value as published by the source. | |
[].volume_kind | string | What volume measures for this instrument (broker = the source's own flow, not the whole market). | |
[].timeframes | string[] | Timeframes natively collected for the series. | |
[].depth_start | date | calendar date (YYYY-MM-DD) | First day of available history. |
[].last_candle | object | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Last candle available, per timeframe. |
[].last_candle.1m | date-time | ||
[].last_candle.5m | date-time | ||
[].last_candle.15m | date-time | ||
[].last_candle.1h | date-time | ||
[].last_candle.4h | date-time | ||
[].last_candle.1d | date-time |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/intraday/series"{
"status": "ok",
"timestamp": 1790790277084,
"data_type": "macro_intraday_series",
"data": [
{
"series_id": "DXY_ICE",
"source": "dukascopy",
"instrument_code": "DOLLARIDXUSD",
"category": "fx",
"label": "ICE Dollar Index",
"units": "Index",
"volume_kind": "broker",
"timeframes": [
"1m",
"5m",
"15m"
],
"depth_start": "2017-12-01",
"last_candle": {
"1m": "2026-09-28T20:59:00.000Z",
"5m": "2026-09-28T20:55:00.000Z",
"15m": "2026-09-28T20:45:00.000Z",
"1h": "2026-09-28T20:00:00.000Z",
"4h": "2026-09-28T20:00:00.000Z",
"1d": "2026-09-28T00:00:00.000Z"
}
},
{
"series_id": "EURUSD",
"source": "dukascopy",
"instrument_code": "EURUSD",
"category": "fx",
"label": "EUR/USD",
"units": "USD per EUR",
"volume_kind": "broker",
"timeframes": [
"1m",
"5m",
"15m"
],
"depth_start": "2003-05-04",
"last_candle": {
"1m": "2026-09-28T23:59:00.000Z",
"5m": "2026-09-28T23:55:00.000Z",
"15m": "2026-09-28T23:45:00.000Z",
"1h": "2026-09-28T23:00:00.000Z",
"4h": "2026-09-28T20:00:00.000Z",
"1d": "2026-09-28T00:00:00.000Z"
}
},
{
"series_id": "IXIC",
"source": "yahoo",
"instrument_code": "^IXIC",
"category": "equities",
"label": "NASDAQ Composite",
"units": "Index",
"volume_kind": "none",
"timeframes": [
"1d"
],
"depth_start": "2016-01-01",
"last_candle": {
"1d": "2026-09-29T00:00:00.000Z"
}
}
]
}GET /v1/macro/momentum
Macro momentum score. A -100 to +100 score of macro tailwind for crypto (money supply, Fed balance sheet, dollar) over 30 and 90 days, with each input's contribution.
13 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
scale | string | Reading scale of the score. | |
30d | object | ||
30d.score | number | null | score from -100 to +100 | Macro momentum for crypto: positive = macro tailwind (weaker dollar, growing liquidity). |
30d.components | object[] | The inputs of the score and their contributions. | |
30d.components[].metric | string | Input name. | |
30d.components[].roc_pct | number | null | percent (58.5 = 58.5 %) | Rate of change of the input over the window. |
30d.components[].contribution | number | null | dimensionless score | Contribution of the input to the score. |
90d | object | ||
90d.score | number | null | score from -100 to +100 | Macro momentum for crypto: positive = macro tailwind (weaker dollar, growing liquidity). |
90d.components | object[] | The inputs of the score and their contributions. | |
90d.components[].metric | string | Input name. | |
90d.components[].roc_pct | number | null | percent (58.5 = 58.5 %) | Rate of change of the input over the window. |
90d.components[].contribution | number | null | dimensionless score | Contribution of the input to the score. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/momentum"{
"status": "ok",
"timestamp": 1790790274648,
"data_type": "macro_momentum",
"data": {
"scale": "-100 (bearish) .. +100 (bullish crypto)",
"30d": {
"score": 3.2,
"components": [
{
"metric": "dxy",
"roc_pct": 1.591,
"contribution": -63.6
},
{
"metric": "m2",
"roc_pct": 0.538,
"contribution": 71.7
},
{
"metric": "fed_balance_sheet",
"roc_pct": 0.03,
"contribution": 1.5
}
]
},
"90d": {
"score": 28.1,
"components": [
{
"metric": "dxy",
"roc_pct": -0.46,
"contribution": 9.2
},
{
"metric": "m2",
"roc_pct": 1.43,
"contribution": 71.5
},
{
"metric": "fed_balance_sheet",
"roc_pct": 0.179,
"contribution": 3.6
}
]
}
}
}GET /v1/macro/net-liquidity
US net liquidity. Fed balance sheet minus Treasury General Account minus overnight reverse repo, with its components.
20 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
net_liquidity_musd | number | null | millions of USD | Fed balance sheet (WALCL) - Treasury General Account (TGA) - overnight reverse repo (ON RRP). |
net_liquidity_usd | integer | null | USD | Same as net_liquidity_musd, in USD. |
unit | string | Unit of the value. | |
formula | string | Formula used. | |
components | object | The inputs of the score and their contributions. | |
components.walcl | object | ||
components.walcl.time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
components.walcl.value | number | null | dimensionless score | Value of the series. |
components.walcl.unit | string | Unit of the value. | |
components.walcl.date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
components.tga | object | ||
components.tga.time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
components.tga.value | number | null | dimensionless score | Value of the series. |
components.tga.unit | string | Unit of the value. | |
components.tga.date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
components.rrp | object | ||
components.rrp.time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
components.rrp.value | number | null | dimensionless score | Value of the series. |
components.rrp.unit | string | Unit of the value. | |
components.rrp.date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/net-liquidity"{
"status": "ok",
"timestamp": 1790790275860,
"data_type": "macro_net_liquidity",
"data": {
"net_liquidity_musd": 5759174,
"net_liquidity_usd": 5759174000000,
"unit": "USD (millions)",
"formula": "WALCL - TGA(WTREGEN) - ON_RRP(RRPONTSYD x 1000)",
"components": {
"walcl": {
"time": "2026-09-23",
"value": 6747704,
"unit": "Millions of $",
"date": "2026-09-23"
},
"tga": {
"time": "2026-09-23",
"value": 977084,
"unit": "Millions of $",
"date": "2026-09-23"
},
"rrp": {
"time": "2026-09-29",
"value": 11.446,
"unit": "Billions of $",
"date": "2026-09-29"
}
}
}
}GET /v1/macro/net-liquidity/history
Net liquidity history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 180 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].walcl_musd | number | null | millions of USD | Fed total assets (WALCL). |
[].tga_musd | number | null | millions of USD | Treasury General Account (WTREGEN). |
[].rrp_busd | number | null | billions of USD | Overnight reverse repo (RRPONTSYD). |
[].net_liquidity_musd | number | null | millions of USD | Fed balance sheet (WALCL) - Treasury General Account (TGA) - overnight reverse repo (ON RRP). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/net-liquidity/history?limit=3"{
"status": "ok",
"timestamp": 1790790276451,
"data_type": "macro_net_liquidity_history",
"data": [
{
"time": "2026-09-29",
"date": "2026-09-29",
"walcl_musd": 6747704,
"tga_musd": 977084,
"rrp_busd": 11.446,
"net_liquidity_musd": 5759174
},
{
"time": "2026-09-28",
"date": "2026-09-28",
"walcl_musd": 6747704,
"tga_musd": 977084,
"rrp_busd": 0.851,
"net_liquidity_musd": 5769769
},
{
"time": "2026-09-25",
"date": "2026-09-25",
"walcl_musd": 6747704,
"tga_musd": 977084,
"rrp_busd": 0.576,
"net_liquidity_musd": 5770044
}
]
}GET /v1/macro/risk
Risk-on / risk-off score. Five signals (VIX, dollar trend, 10Y-2Y curve, S&P 500 vs its 50-day average, gold trend) and the share that are risk-on, from 0 to 100.
30 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
score | number | null | score from 0 to 100 | Share of risk-on signals × 100. |
regime | string | Regime of the value. | |
risk_on_signals | integer | null | count | Signals currently risk-on. |
available_signals | integer | null | count | Signals that could be evaluated (data available). |
total_signals | integer | null | count | Signals in the model. |
signals | object | Each signal: its condition and whether it is risk_on. | |
signals.vix | object | index points | CBOE Volatility Index. |
signals.vix.condition | string | Rule of the signal. | |
signals.vix.risk_on | boolean | Whether the signal is risk-on now. | |
signals.dxy | object | index points | US Dollar Index. |
signals.dxy.condition | string | Rule of the signal. | |
signals.dxy.risk_on | boolean | Whether the signal is risk-on now. | |
signals.yield_curve | object | ||
signals.yield_curve.condition | string | Rule of the signal. | |
signals.yield_curve.risk_on | boolean | Whether the signal is risk-on now. | |
signals.sp500 | object | index points | S&P 500. |
signals.sp500.condition | string | Rule of the signal. | |
signals.sp500.risk_on | boolean | Whether the signal is risk-on now. | |
signals.gold | object | USD per troy ounce | Gold price. |
signals.gold.condition | string | Rule of the signal. | |
signals.gold.risk_on | boolean | Whether the signal is risk-on now. | |
context | object | The raw inputs used by the signals. | |
context.vix | number | null | index points | CBOE Volatility Index. |
context.dxy | number | null | index points | US Dollar Index. |
context.dxy_7d_ago | number | null | index points | US Dollar Index seven days earlier. |
context.yield_curve_10y2y | number | null | percentage points | 10-year minus 2-year US Treasury yield. |
context.sp500 | number | null | index points | S&P 500. |
context.sp500_sma50 | number | null | index points | 50-day simple moving average of the S&P 500. |
context.gold | number | null | USD per troy ounce | Gold price. |
context.gold_7d_ago | number | null | USD per troy ounce | Gold price seven days earlier. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/risk"{
"status": "ok",
"timestamp": 1790790275261,
"data_type": "macro_risk",
"data": {
"score": 80,
"regime": "risk-on",
"risk_on_signals": 4,
"available_signals": 5,
"total_signals": 5,
"signals": {
"vix": {
"condition": "VIX < 20",
"risk_on": true
},
"dxy": {
"condition": "DXY down over 7 days",
"risk_on": false
},
"yield_curve": {
"condition": "10Y-2Y curve positive",
"risk_on": true
},
"sp500": {
"condition": "S&P 500 > SMA50",
"risk_on": true
},
"gold": {
"condition": "Gold down over 7 days",
"risk_on": true
}
},
"context": {
"vix": 16.04,
"dxy": 120.33,
"dxy_7d_ago": 119.5133,
"yield_curve_10y2y": 0.37,
"sp500": 7670.84,
"sp500_sma50": 7645.157000000002,
"gold": 4189.247701690536,
"gold_7d_ago": 4356.842288234995
}
}
}GET /v1/macro/series
Macro series catalogue. Every active FRED series with its category, unit, frequency and latest value.
| Parameter | Type | Default | Description |
|---|---|---|---|
category | string | any | null | — | Filter by category, e.g. rates, inflation, liquidity, commodities. |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].series_id | string | Series identifier. | |
[].category | string | Series category. | |
[].label | string | Human-readable name. | |
[].frequency | string | Publication frequency of the source (daily, weekly, monthly). | |
[].units | string | Unit of value as published by the source. | |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].value | number | null | dimensionless score | Value of the series. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/series"{
"status": "ok",
"timestamp": 1790790272807,
"data_type": "macro_series",
"data": [
{
"time": "2026-09-29",
"series_id": "DCOILWTICO",
"category": "commodities",
"label": "WTI Crude Oil",
"frequency": "daily",
"units": "USD per barrel",
"date": "2026-09-29",
"value": 96.16
},
{
"time": "2026-09-29",
"series_id": "GOLD_USD",
"category": "commodities",
"label": "Gold (PAXG proxy, USD/oz)",
"frequency": "daily",
"units": "USD per troy ounce",
"date": "2026-09-29",
"value": 4189.247701690536
},
{
"time": "2026-08-01",
"series_id": "PAYEMS",
"category": "employment",
"label": "Nonfarm Payrolls",
"frequency": "monthly",
"units": "Thousands of persons",
"date": "2026-08-01",
"value": 159075
}
]
}#ETF
Spot BTC and ETH ETF fundamentals per issuer, anchored on SEC EDGAR filings: shares, NAV, net assets and coins held.
GET /v1/etf/fundamentals
ETF fundamentals per issuer. Latest SEC EDGAR anchor per spot ETF: shares outstanding, NAV, net assets and coins held. data is a list, one row per issuer.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
13 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].ticker | string | ETF ticker. | |
[].issuer | string | ETF issuer. | |
[].period_end | date | calendar date (YYYY-MM-DD) | End of the reporting period of the filing. |
[].balance_date | date | calendar date (YYYY-MM-DD) | Date of the balance sheet the holdings come from. |
[].shares_outstanding | number | null | shares | ETF shares outstanding. |
[].nav_per_share | number | null | USD | Net asset value per share. |
[].net_assets_usd | number | null | USD | Net assets (AUM). |
[].form | string | SEC form type of the filing (10-Q, 10-K...). | |
[].filed | date | calendar date (YYYY-MM-DD) | Filing date at the SEC. |
[].filing_url | string | Link to the filing on SEC EDGAR. | |
[].btc_holdings | number | null | BTC | BTC held by the fund. |
[].holdings_estimated | boolean | true if the holdings are derived from net assets / price rather than read in the filing. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/etf/fundamentals?asset=BTC"{
"status": "ok",
"timestamp": 1790790278319,
"data_type": "etf_fundamentals",
"data": [
{
"time": "2026-08-03",
"ticker": "ARKB",
"issuer": "Ark/21Shares",
"period_end": "2026-08-03",
"balance_date": "2026-06-30",
"shares_outstanding": 101190000,
"nav_per_share": 19.47,
"net_assets_usd": 1889240000,
"form": "10-Q",
"filed": "2026-08-06",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1869699/000121390026086191/",
"btc_holdings": 32178.228,
"holdings_estimated": false
},
{
"time": "2026-08-02",
"ticker": "BITB",
"issuer": "Bitwise",
"period_end": "2026-08-02",
"balance_date": "2026-06-30",
"shares_outstanding": 68160000,
"nav_per_share": 31.87,
"net_assets_usd": 2125612000,
"form": "10-Q",
"filed": "2026-08-07",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1763415/000119312526340183/",
"btc_holdings": 36269.90004334071,
"holdings_estimated": true
},
{
"time": "2026-07-30",
"ticker": "BRRR",
"issuer": "CoinShares/Valkyrie",
"period_end": "2026-07-30",
"balance_date": "2026-06-30",
"shares_outstanding": 20895000,
"nav_per_share": 16.46,
"net_assets_usd": 342354115,
"form": "10-Q",
"filed": "2026-08-12",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1841175/000199937126017701/",
"btc_holdings": 5841.682080490876,
"holdings_estimated": true
}
]
}GET /v1/etf/fundamentals/history
ETF fundamentals history. One row per filing and issuer. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
ticker | string | any | null | — | ETF ticker (e.g. IBIT, FBTC). Omit for every issuer. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–2000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
13 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].period_end | date | calendar date (YYYY-MM-DD) | End of the reporting period of the filing. |
[].ticker | string | ETF ticker. | |
[].issuer | string | ETF issuer. | |
[].balance_date | date | calendar date (YYYY-MM-DD) | Date of the balance sheet the holdings come from. |
[].shares_outstanding | number | null | shares | ETF shares outstanding. |
[].nav_per_share | number | null | USD | Net asset value per share. |
[].net_assets_usd | number | null | USD | Net assets (AUM). |
[].form | string | SEC form type of the filing (10-Q, 10-K...). | |
[].filed | date | calendar date (YYYY-MM-DD) | Filing date at the SEC. |
[].filing_url | string | Link to the filing on SEC EDGAR. | |
[].btc_holdings | number | null | BTC | BTC held by the fund. |
[].holdings_estimated | boolean | true if the holdings are derived from net assets / price rather than read in the filing. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/etf/fundamentals/history?asset=BTC&limit=3"{
"status": "ok",
"timestamp": 1790790278974,
"data_type": "etf_fundamentals_history",
"data": [
{
"time": "2026-08-03",
"period_end": "2026-08-03",
"ticker": "ARKB",
"issuer": "Ark/21Shares",
"balance_date": "2026-06-30",
"shares_outstanding": 101190000,
"nav_per_share": 19.47,
"net_assets_usd": 1889240000,
"form": "10-Q",
"filed": "2026-08-06",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1869699/000121390026086191/",
"btc_holdings": 32178.228,
"holdings_estimated": false
},
{
"time": "2026-08-03",
"period_end": "2026-08-03",
"ticker": "EZBC",
"issuer": "Franklin",
"balance_date": "2026-06-30",
"shares_outstanding": 9750000,
"nav_per_share": 34.15,
"net_assets_usd": 334694929,
"form": "10-Q",
"filed": "2026-08-14",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1992870/000114036126033208/",
"btc_holdings": 5664.0163,
"holdings_estimated": false
},
{
"time": "2026-08-02",
"period_end": "2026-08-02",
"ticker": "BITB",
"issuer": "Bitwise",
"balance_date": "2026-06-30",
"shares_outstanding": 68160000,
"nav_per_share": 31.87,
"net_assets_usd": 2125612000,
"form": "10-Q",
"filed": "2026-08-07",
"filing_url": "https://www.sec.gov/Archives/edgar/data/1763415/000119312526340183/",
"btc_holdings": 36269.90004334071,
"holdings_estimated": true
}
]
}#Options
BTC and ETH options aggregated across venues: open interest and volume (calls/puts, USD), put/call ratio, ATM implied volatility, max pain, per-expiry and per-strike views, OI-weighted greeks.
GET /v1/options/expiry
Per-expiry breakdown. Every active expiry: open interest, put/call ratio, max pain, top call and put strikes, ATM IV. data is a list.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].expiry | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (YYYY-MM-DD) as the expiry parameter. |
[].dte_days | number | null | days | Days to expiry (fractional). |
[].oi_call_usd | number | null | USD | Call open interest, USD. |
[].oi_put_usd | number | null | USD | Put open interest, USD. |
[].pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
[].max_pain_strike | number | null | USD | Strike at which option holders lose the most at expiry (max pain). |
[].top_call_strike | number | null | USD | Strike with the largest call open interest. |
[].top_put_strike | number | null | USD | Strike with the largest put open interest. |
[].iv_atm_pct | number | null | percent (58.5 = 58.5 %) | At-the-money implied volatility, annualised, in percent (55.2 = 55.2 %). |
[].pc_signal | string | bullish (pc_ratio < 0.7), neutral, or bearish (pc_ratio > 1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/expiry?asset=BTC"{
"status": "ok",
"timestamp": 1790790290993,
"data_type": "options_expiry",
"data": [
{
"expiry": "2026-10-01T08:00:00.000Z",
"dte_days": 0.5940510870949074,
"oi_call_usd": 531258085.63308895,
"oi_put_usd": 544784366.8505492,
"pc_ratio": 1.0254608477183764,
"max_pain_strike": 84250,
"top_call_strike": 86000,
"top_put_strike": 84000,
"iv_atm_pct": 25.480000000000008,
"pc_signal": "bearish"
},
{
"expiry": "2026-10-02T08:00:00.000Z",
"dte_days": 1.5940510870949074,
"oi_call_usd": 1568143091.45589,
"oi_put_usd": 1781056523.5065172,
"pc_ratio": 1.1357742371921906,
"max_pain_strike": 83000,
"top_call_strike": 88000,
"top_put_strike": 80000,
"iv_atm_pct": 30.361844316640266,
"pc_signal": "bearish"
},
{
"expiry": "2026-10-03T08:00:00.000Z",
"dte_days": 2.5940510870949076,
"oi_call_usd": 95288683.02928346,
"oi_put_usd": 137632591.88934326,
"pc_ratio": 1.4443750035567913,
"max_pain_strike": 84000,
"top_call_strike": 88000,
"top_put_strike": 80000,
"iv_atm_pct": 32.22453280787994,
"pc_signal": "bearish"
}
]
}GET /v1/options/greeks
Aggregated greeks. Delta, gamma, theta and vega of open options, recomputed under one convention and OI-weighted, so they add up across venues.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
delta | number | null | delta | Aggregated delta of open options, OI-weighted (per unit of underlying). |
gamma | number | null | delta per USD | Change of delta for a 1 USD move of the underlying, OI-weighted. |
theta | number | null | USD per day | Time decay per day, OI-weighted. |
vega | number | null | USD per volatility point | Value change for +1 point of implied volatility, OI-weighted. |
coverage | object | sources_active (venues contributing) and oi_coverage_ratio (share of open interest covered, 1.0 = all). | |
coverage.sources_active | integer | null | count | Options venues contributing. |
coverage.oi_coverage_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/greeks?asset=BTC"{
"status": "ok",
"timestamp": 1790790291610,
"data_type": "options_greeks",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"delta": 0.15602129324574576,
"gamma": 0.00002933199298487753,
"theta": -34.25528485415759,
"vega": 66.41197461414434,
"coverage": {
"sources_active": 4,
"oi_coverage_ratio": 1
}
}
}GET /v1/options/iv
ATM implied volatility. At-the-money implied volatility aggregated across venues, in percent.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
iv_atm_pct | number | null | percent (58.5 = 58.5 %) | At-the-money implied volatility, annualised, in percent (55.2 = 55.2 %). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv?asset=BTC"{
"status": "ok",
"timestamp": 1790790286693,
"data_type": "options_iv",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"iv_atm_pct": 25.480000000000008
}
}GET /v1/options/iv/history
ATM IV history. Per bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
3 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].iv_atm_pct | number | null | percent (58.5 = 58.5 %) | At-the-money implied volatility, annualised, in percent (55.2 = 55.2 %). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv/history?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790287320,
"data_type": "options_iv_history",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"iv_atm_pct": 27.51548080302511
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"iv_atm_pct": 26.369999999999997
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"iv_atm_pct": 26.03711032017726
}
]
}GET /v1/options/iv/klines
ATM IV candles. OHLC of the ATM implied volatility per bucket, in percent. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].open | number | null | percent (58.5 = 58.5 %) | ATM IV at the start of the bucket. |
[].high | number | null | percent (58.5 = 58.5 %) | Highest ATM IV. |
[].low | number | null | percent (58.5 = 58.5 %) | Lowest ATM IV. |
[].close | number | null | percent (58.5 = 58.5 %) | ATM IV at the end of the bucket. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv/klines?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790287966,
"data_type": "options_iv_klines",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"open": 26.39,
"high": 28.03013588929368,
"low": 25.781574454476548,
"close": 27.51548080302511
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"open": 26.354976068960383,
"high": 26.686715563252683,
"low": 24.998494883192603,
"close": 26.369999999999997
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"open": 30.58,
"high": 30.9,
"low": 25.872897675979168,
"close": 26.03711032017726
}
]
}GET /v1/options/max-pain
Max pain per expiry. Max pain strike of every active expiry, with days to expiry, put/call ratio and open interest. data is a list.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].expiry | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (YYYY-MM-DD) as the expiry parameter. |
[].dte_days | number | null | days | Days to expiry (fractional). |
[].max_pain_strike | number | null | USD | Strike at which option holders lose the most at expiry (max pain). |
[].pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
[].oi_call_usd | number | null | USD | Call open interest, USD. |
[].oi_put_usd | number | null | USD | Put open interest, USD. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/max-pain?asset=BTC"{
"status": "ok",
"timestamp": 1790790289076,
"data_type": "options_max_pain",
"data": [
{
"expiry": "2026-10-01T08:00:00.000Z",
"dte_days": 0.5940510870949074,
"max_pain_strike": 84250,
"pc_ratio": 1.0254608477183764,
"oi_call_usd": 531258085.63308895,
"oi_put_usd": 544784366.8505492
},
{
"expiry": "2026-10-02T08:00:00.000Z",
"dte_days": 1.5940510870949074,
"max_pain_strike": 83000,
"pc_ratio": 1.1357742371921906,
"oi_call_usd": 1568143091.45589,
"oi_put_usd": 1781056523.5065172
},
{
"expiry": "2026-10-03T08:00:00.000Z",
"dte_days": 2.5940510870949076,
"max_pain_strike": 84000,
"pc_ratio": 1.4443750035567913,
"oi_call_usd": 95288683.02928346,
"oi_put_usd": 137632591.88934326
}
]
}GET /v1/options/max-pain/history
Max pain history of one expiry. How the max pain of ONE expiry moved. expiry is required. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
expiry | date | any | null | — | REQUIRED. Expiry date YYYY-MM-DD. Missing: 422 missing_expiry, and the error lists the active expiries. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
[].max_pain_strike | number | null | USD | Strike at which option holders lose the most at expiry (max pain). |
[].pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/max-pain/history?asset=BTC&expiry=2026-10-01&limit=3"{
"status": "ok",
"timestamp": 1790790289717,
"data_type": "options_max_pain_history",
"data": [
{
"time": "2026-09-30T17:44:33.986Z",
"timestamp": "2026-09-30T17:44:33.986Z",
"max_pain_strike": 84250,
"pc_ratio": 1.0254608477183764
},
{
"time": "2026-09-30T17:43:26.791Z",
"timestamp": "2026-09-30T17:43:26.791Z",
"max_pain_strike": 84250,
"pc_ratio": 1.024230175691702
},
{
"time": "2026-09-30T17:42:19.610Z",
"timestamp": "2026-09-30T17:42:19.610Z",
"max_pain_strike": 84250,
"pc_ratio": 1.0242167838195655
}
]
}GET /v1/options/oi
Options open interest. Calls and puts, in USD and in coins.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
11 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
total_usd | number | null | USD | Total, USD. |
call_usd | number | null | USD | Calls, USD. |
put_usd | number | null | USD | Puts, USD. |
call_coin | number | null | base asset quantity (BTC for BTCUSDT) | Call open interest in coins. |
put_coin | number | null | base asset quantity (BTC for BTCUSDT) | Put open interest in coins. |
coverage | object | sources_active (venues contributing) and oi_coverage_ratio (share of open interest covered, 1.0 = all). | |
coverage.sources_active | integer | null | count | Options venues contributing. |
coverage.oi_coverage_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi?asset=BTC"{
"status": "ok",
"timestamp": 1790790280730,
"data_type": "options_oi",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"total_usd": 36423347698.02251,
"call_usd": 22218554587.502285,
"put_usd": 14204793110.520224,
"call_coin": 262204.62,
"put_coin": 167789.02,
"coverage": {
"sources_active": 4,
"oi_coverage_ratio": 1
}
}
}GET /v1/options/oi/delta
Options open interest change. Change of call and put open interest over the latest bucket.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
delta_call_usd | number | null | USD | Change of call open interest over the bucket, USD. |
delta_put_usd | number | null | USD | Change of put open interest over the bucket, USD. |
delta_total_usd | number | null | USD | Change of total open interest over the bucket, USD. |
asset | string | Asset, e.g. BTC. | |
timeframe | string | Bucket size of the row. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/delta?asset=BTC&timeframe=1h"{
"status": "ok",
"timestamp": 1790790282077,
"data_type": "options_oi_delta",
"timeframe": "1h",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"timestamp": "2026-09-30T17:44:33.986Z",
"delta_call_usd": -65936080.49573517,
"delta_put_usd": -51989692.115448,
"delta_total_usd": -117925772.61118317,
"asset": "BTC",
"timeframe": "1h"
}
}GET /v1/options/oi/delta/history
Options OI change history. Per bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].delta_call_usd | number | null | USD | Change of call open interest over the bucket, USD. |
[].delta_put_usd | number | null | USD | Change of put open interest over the bucket, USD. |
[].delta_total_usd | number | null | USD | Change of total open interest over the bucket, USD. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/delta/history?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790282779,
"data_type": "options_oi_delta_history",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"delta_call_usd": 74136277.10503006,
"delta_put_usd": 61725492.81556702,
"delta_total_usd": 135861769.9206009
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"delta_call_usd": 121118135.45619965,
"delta_put_usd": 149065665.02907562,
"delta_total_usd": 270183800.48527527
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"delta_call_usd": -237661820.86148453,
"delta_put_usd": -52983718.61921692,
"delta_total_usd": -290645539.48070526
}
]
}GET /v1/options/oi/distribution
Open interest per strike. Latest open interest per (expiry, strike), calls and puts separately. data is a list.
| Parameter | Type | Default | Description |
|---|---|---|---|
expiry | date | any | null | — | Restrict to one expiry (YYYY-MM-DD). Omit for every active expiry. |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].expiry | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (YYYY-MM-DD) as the expiry parameter. |
[].strike | number | null | USD | Strike price. |
[].call_oi_usd | number | string | null | USD | Call open interest at this strike, USD. null = no call listed. |
[].put_oi_usd | number | null | USD | Put open interest at this strike, USD. null = no put listed. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/distribution?asset=BTC"{
"status": "ok",
"timestamp": 1790790283398,
"data_type": "options_oi_distribution",
"data": [
{
"expiry": "2026-10-01T08:00:00.000Z",
"strike": 74000,
"call_oi_usd": null,
"put_oi_usd": 1343594.08
},
{
"expiry": "2026-10-01T08:00:00.000Z",
"strike": 75000,
"call_oi_usd": null,
"put_oi_usd": 3543729.3860000004
},
{
"expiry": "2026-10-01T08:00:00.000Z",
"strike": 76000,
"call_oi_usd": null,
"put_oi_usd": 445065.539
}
]
}GET /v1/options/oi/history
Options open interest history. Per bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].oi_call_usd | number | null | USD | Call open interest, USD. |
[].oi_put_usd | number | null | USD | Put open interest, USD. |
[].oi_total_usd | number | null | USD | Total open interest, USD. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/history?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790281362,
"data_type": "options_oi_history",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"oi_call_usd": 22291425968.727673,
"oi_put_usd": 14259448648.632486,
"oi_total_usd": 36550874617.36016
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"oi_call_usd": 22217289691.622643,
"oi_put_usd": 14197723155.81692,
"oi_total_usd": 36415012847.43956
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"oi_call_usd": 22096171556.166443,
"oi_put_usd": 14048657490.787844,
"oi_total_usd": 36144829046.954285
}
]
}GET /v1/options/pc-ratio
Put/call ratio. Put/call open interest ratio and its reading.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
signal | string | bullish (pc_ratio < 0.7), neutral, or bearish (pc_ratio > 1). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/pc-ratio?asset=BTC"{
"status": "ok",
"timestamp": 1790790285416,
"data_type": "options_pc_ratio",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"pc_ratio": 0.6393212058227351,
"signal": "bullish"
}
}GET /v1/options/pc-ratio/history
Put/call ratio history. Per bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
3 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/pc-ratio/history?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790286056,
"data_type": "options_pc_ratio_history",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"pc_ratio": 0.6396831081437708
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"pc_ratio": 0.6390393856713485
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"pc_ratio": 0.6357960000028713
}
]
}GET /v1/options/summary
Options market summary. Open interest and volume (calls/puts, USD), put/call ratio and signal, ATM IV and the nearest expiry, aggregated across options venues.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
24 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
underlying_price | number | null | USD | Price of the underlying used by the options venues. |
open_interest | object | USD | Options open interest in USD: total_usd, call_usd, put_usd. |
open_interest.total_usd | number | null | USD | Total, USD. |
open_interest.call_usd | number | null | USD | Calls, USD. |
open_interest.put_usd | number | null | USD | Puts, USD. |
volume | object | base asset quantity (BTC for BTCUSDT) | Volume traded, AGGREGATED across venues (spot + perpetual futures), in base asset units. |
volume.total_usd | number | null | USD | Total, USD. |
volume.call_usd | number | null | USD | Calls, USD. |
volume.put_usd | number | null | USD | Puts, USD. |
pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
pc_signal | string | bullish (pc_ratio < 0.7), neutral, or bearish (pc_ratio > 1). | |
iv_atm_pct | number | null | percent (58.5 = 58.5 %) | At-the-money implied volatility, annualised, in percent (55.2 = 55.2 %). |
nearest_expiry | object | The next expiry: date, days left, max pain, put/call ratio, ATM IV. | |
nearest_expiry.expiry | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (YYYY-MM-DD) as the expiry parameter. |
nearest_expiry.dte_days | number | null | days | Days to expiry (fractional). |
nearest_expiry.max_pain_strike | number | null | USD | Strike at which option holders lose the most at expiry (max pain). |
nearest_expiry.pc_ratio | number | null | puts / calls | Put/call open interest ratio. Below 1 = more calls than puts. |
nearest_expiry.iv_atm_pct | number | null | percent (58.5 = 58.5 %) | At-the-money implied volatility, annualised, in percent (55.2 = 55.2 %). |
coverage | object | sources_active (venues contributing) and oi_coverage_ratio (share of open interest covered, 1.0 = all). | |
coverage.sources_active | integer | null | count | Options venues contributing. |
coverage.oi_coverage_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/summary?asset=BTC"{
"status": "ok",
"timestamp": 1790790280113,
"data_type": "options_summary",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"underlying_price": 84671.87,
"open_interest": {
"total_usd": 36423347698.02251,
"call_usd": 22218554587.502285,
"put_usd": 14204793110.520224
},
"volume": {
"total_usd": 1161041146.495026,
"call_usd": 570939143.4677235,
"put_usd": 590102003.0273026
},
"pc_ratio": 0.6393212058227351,
"pc_signal": "bullish",
"iv_atm_pct": 25.480000000000008,
"nearest_expiry": {
"expiry": "2026-10-01T08:00:00.000Z",
"dte_days": 0.5940510870949074,
"max_pain_strike": 84250,
"pc_ratio": 1.0254608477183764,
"iv_atm_pct": 25.480000000000008
},
"coverage": {
"sources_active": 4,
"oi_coverage_ratio": 1
}
}
}GET /v1/options/volume
Options volume. Calls and puts traded, USD.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
asset | string | Asset, e.g. BTC. | |
timestamp | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Measurement instant (start of the bucket for aggregated rows). |
total_usd | number | null | USD | Total, USD. |
call_usd | number | null | USD | Calls, USD. |
put_usd | number | null | USD | Puts, USD. |
coverage | object | sources_active (venues contributing) and oi_coverage_ratio (share of open interest covered, 1.0 = all). | |
coverage.sources_active | integer | null | count | Options venues contributing. |
coverage.oi_coverage_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/volume?asset=BTC"{
"status": "ok",
"timestamp": 1790790284152,
"data_type": "options_volume",
"data": {
"time": "2026-09-30T17:44:33.986Z",
"asset": "BTC",
"timestamp": "2026-09-30T17:44:33.986Z",
"total_usd": 1161041146.495026,
"call_usd": 570939143.4677235,
"put_usd": 590102003.0273026,
"coverage": {
"sources_active": 4,
"oi_coverage_ratio": 1
}
}
}GET /v1/options/volume/history
Options volume history. Per bucket. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1h | Bucket size: 1m, 5m, 15m, 30m, 1h, 4h or 1d. Other values: 422 invalid_timeframe with the accepted list. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 200 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
asset | string | BTC | Asset, e.g. BTC or ETH (no quote currency). Unknown: 400 invalid_asset. |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].bucket | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket (left edge). A 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999. |
[].vol_call_usd | number | null | USD | Call volume over the bucket, USD. |
[].vol_put_usd | number | null | USD | Put volume over the bucket, USD. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/volume/history?asset=BTC&timeframe=1h&limit=3"{
"status": "ok",
"timestamp": 1790790284804,
"data_type": "options_volume_history",
"timeframe": "1h",
"data": [
{
"time": "2026-09-30T16:00:00.000Z",
"bucket": "2026-09-30T16:00:00.000Z",
"vol_call_usd": 562615460.4712248,
"vol_put_usd": 578584644.1821741
},
{
"time": "2026-09-30T15:00:00.000Z",
"bucket": "2026-09-30T15:00:00.000Z",
"vol_call_usd": 539939649.8949113,
"vol_put_usd": 546795561.3387902
},
{
"time": "2026-09-30T14:00:00.000Z",
"bucket": "2026-09-30T14:00:00.000Z",
"vol_call_usd": 522140110.47708505,
"vol_put_usd": 530128814.60147095
}
]
}#Bitcoin network
Bitcoin chain state: recommended fees, mempool, mining pool concentration, difficulty and the next adjustment.
GET /v1/btc/fees
Recommended Bitcoin fees. Fee rates for each confirmation target (sat/vB), rounded and precise, and the fee pressure.
16 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
recommended | object | satoshis per virtual byte (sat/vB) | Recommended fee rates, rounded: fastest, half_hour, hour, economy, minimum. |
recommended.fastest | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for the next block. |
recommended.half_hour | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~30 minutes. |
recommended.hour | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~1 hour. |
recommended.economy | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for a low-priority confirmation. |
recommended.minimum | integer | null | satoshis per virtual byte (sat/vB) | Minimum relay fee rate. |
precise | object | satoshis per virtual byte (sat/vB) | Same fee rates, unrounded. |
precise.fastest | number | null | satoshis per virtual byte (sat/vB) | Fee rate for the next block. |
precise.half_hour | number | null | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~30 minutes. |
precise.hour | number | null | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~1 hour. |
precise.economy | number | null | satoshis per virtual byte (sat/vB) | Fee rate for a low-priority confirmation. |
precise.minimum | number | null | satoshis per virtual byte (sat/vB) | Minimum relay fee rate. |
fee_pressure | object | dimensionless ratio | ratio = fastest / economy fee rate, and its signal: normal (<= 2), elevated (> 2), congested (> 5). |
fee_pressure.ratio | number | null | dimensionless ratio | fastest / economy fee rate. |
fee_pressure.signal | string | Fee pressure: normal (ratio <= 2), elevated (> 2) or congested (> 5). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/fees"{
"status": "ok",
"timestamp": 1790790292219,
"data_type": "btc_fees",
"data": {
"time": "2026-09-30T17:44:06.179Z",
"recommended": {
"fastest": 2,
"half_hour": 1,
"hour": 1,
"economy": 1,
"minimum": 1
},
"precise": {
"fastest": 1.507,
"half_hour": 0.962,
"hour": 0.518,
"economy": 0.2,
"minimum": 0.1
},
"fee_pressure": {
"ratio": 2,
"signal": "normal"
}
}
}GET /v1/btc/fees/history
Bitcoin fees history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 24h, 1w, 1mo (one month), 3m, 6m, 1y. 1m also means ONE MONTH here (legacy spelling); prefer 1mo. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 300 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].fastest_fee | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for the next block. |
[].half_hour_fee | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for ~30 minutes. |
[].hour_fee | integer | null | satoshis per virtual byte (sat/vB) | Fee rate for ~1 hour. |
[].economy_fee | integer | null | satoshis per virtual byte (sat/vB) | Low-priority fee rate. |
[].minimum_fee | integer | null | satoshis per virtual byte (sat/vB) | Minimum relay fee rate. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/fees/history?timePeriod=1w&limit=3"{
"status": "ok",
"timestamp": 1790790292824,
"data_type": "btc_fees_history",
"data": [
{
"time": "2026-09-30T17:44:06.179Z",
"fastest_fee": 2,
"half_hour_fee": 1,
"hour_fee": 1,
"economy_fee": 1,
"minimum_fee": 1
},
{
"time": "2026-09-30T17:43:05.648Z",
"fastest_fee": 2,
"half_hour_fee": 1,
"hour_fee": 1,
"economy_fee": 1,
"minimum_fee": 1
},
{
"time": "2026-09-30T17:42:05.470Z",
"fastest_fee": 4,
"half_hour_fee": 3,
"hour_fee": 1,
"economy_fee": 1,
"minimum_fee": 1
}
]
}GET /v1/btc/mempool
Bitcoin mempool. Pending transactions, virtual size, total fees, fee histogram and the 1 h / 4 h / 24 h trend.
10 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
tx_count | integer | null | count | Unconfirmed transactions in the mempool. |
vsize | integer | null | virtual bytes | Total virtual size of the mempool. |
total_fee | integer | null | satoshis | Total fees waiting in the mempool. |
fee_histogram | number | null[][] | satoshis per virtual byte (sat/vB) | [fee_rate, vsize] pairs: how much virtual size waits at each fee rate. |
trend | object | virtual bytes | Mempool size change over 1 h, 4 h and 24 h, and its signal (filling, draining, stable). |
trend.vsize_delta_1h | integer | null | virtual bytes | Mempool size change over 1 hour. |
trend.vsize_delta_4h | integer | null | virtual bytes | Mempool size change over 4 hours. |
trend.vsize_delta_24h | integer | null | virtual bytes | Mempool size change over 24 hours. |
trend.signal | string | filling (vsize grew over 1 h), draining (shrank) or stable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mempool"{
"status": "ok",
"timestamp": 1790790293508,
"data_type": "btc_mempool",
"data": {
"time": "2026-09-30T17:44:06.179Z",
"tx_count": 88092,
"vsize": 44891543,
"total_fee": 8758605,
"fee_histogram": [
[
5.007924,
50350
],
[
3.621282,
59177
],
[
3.0182927,
50006
]
],
"trend": {
"vsize_delta_1h": -2980246,
"vsize_delta_4h": -1193654,
"vsize_delta_24h": 1070554,
"signal": "draining"
}
}
}GET /v1/btc/mempool/history
Mempool history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 24h, 1w, 1mo (one month), 3m, 6m, 1y. 1m also means ONE MONTH here (legacy spelling); prefer 1mo. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 300 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
4 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].tx_count | integer | null | count | Unconfirmed transactions in the mempool. |
[].vsize | integer | null | virtual bytes | Total virtual size of the mempool. |
[].total_fee | integer | null | satoshis | Total fees waiting in the mempool. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mempool/history?timePeriod=1w&limit=3"{
"status": "ok",
"timestamp": 1790790294121,
"data_type": "btc_mempool_history",
"data": [
{
"time": "2026-09-30T17:44:06.179Z",
"tx_count": 88092,
"vsize": 44891543,
"total_fee": 8758605
},
{
"time": "2026-09-30T17:43:05.648Z",
"tx_count": 87592,
"vsize": 44735546,
"total_fee": 8335460
},
{
"time": "2026-09-30T17:42:05.470Z",
"tx_count": 88575,
"vsize": 43043826,
"total_fee": 11303334
}
]
}GET /v1/btc/mining
Mining pool concentration. Share of the largest pools, pool ranking and the latest block reward in sats and USD.
16 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
concentration | object | percent (58.5 = 58.5 %) | Mining pool concentration over the last period. |
concentration.top1_share_pct | number | null | percent (58.5 = 58.5 %) | Share of blocks mined by the largest pool. |
concentration.top3_share_pct | number | null | percent (58.5 = 58.5 %) | Share of blocks mined by the three largest pools. |
concentration.pool_count | integer | null | count | Number of pools that mined at least one block. |
concentration.signal | string | Centralisation risk from the top-3 pool share: healthy (<= 40 %), moderate (> 40 %), high_risk (> 50 %). | |
latest_reward | object | Average block reward (subsidy + fees) of the latest blocks, in satoshis and USD. | |
latest_reward.avg_reward_sats | integer | null | satoshis | Average block reward. |
latest_reward.avg_reward_usd | number | null | USD | Average block reward in USD. |
latest_reward.btc_price_usd | number | null | USD | BTC price used for the conversion. |
pools | object[] | Pools ranked by blocks mined: name, slug, block_count, rank, share_pct. | |
pools[].name | string | Name. | |
pools[].slug | string | Stable identifier. | |
pools[].block_count | integer | null | count | Blocks mined over the period. |
pools[].rank | integer | null | rank (1 = first) | Rank. |
pools[].share_pct | number | null | percent (58.5 = 58.5 %) | Share of blocks. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mining"{
"status": "ok",
"timestamp": 1790790294780,
"data_type": "btc_mining",
"data": {
"time": "2026-09-30T17:43:15.367Z",
"concentration": {
"top1_share_pct": 25.58365758754864,
"top3_share_pct": 62.45136186770428,
"pool_count": 16,
"signal": "high_risk"
},
"latest_reward": {
"avg_reward_sats": 315067914,
"avg_reward_usd": 265551.84063576,
"btc_price_usd": 84284
},
"pools": [
{
"name": "Foundry USA",
"slug": "foundryusa",
"block_count": 263,
"rank": 1,
"share_pct": 25.58365758754864
},
{
"name": "AntPool",
"slug": "antpool",
"block_count": 222,
"rank": 2,
"share_pct": 21.595330739299612
},
{
"name": "F2Pool",
"slug": "f2pool",
"block_count": 157,
"rank": 3,
"share_pct": 15.272373540856032
}
]
}
}GET /v1/btc/mining/history
Mining history. One series selected by dataset. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
dataset | string | concentration | Which mining series to return: concentration (pool shares), rewards (block rewards), difficulty or fee_rates. |
timePeriod | string | any | null | — | Named window: 24h, 1w, 1mo (one month), 3m, 6m, 1y. 1m also means ONE MONTH here (legacy spelling); prefer 1mo. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 300 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].total_block_count | integer | null | count | Blocks in the period. |
[].top3_share_pct | number | null | percent (58.5 = 58.5 %) | Share of blocks mined by the three largest pools. |
[].top1_share_pct | number | null | percent (58.5 = 58.5 %) | Share of blocks mined by the largest pool. |
[].pool_count | integer | null | count | Number of pools that mined at least one block. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mining/history?dataset=concentration&timePeriod=1w&limit=3"{
"status": "ok",
"timestamp": 1790790295420,
"data_type": "btc_mining_history",
"data": [
{
"time": "2026-09-30T17:43:15.367Z",
"total_block_count": 1028,
"top3_share_pct": 62.45136186770428,
"top1_share_pct": 25.58365758754864,
"pool_count": 16
},
{
"time": "2026-09-30T17:33:15.172Z",
"total_block_count": 1028,
"top3_share_pct": 62.45136186770428,
"top1_share_pct": 25.58365758754864,
"pool_count": 16
},
{
"time": "2026-09-30T17:23:14.974Z",
"total_block_count": 1027,
"top3_share_pct": 62.414800389483936,
"top1_share_pct": 25.60856864654333,
"pool_count": 16
}
]
}GET /v1/btc/network
Bitcoin network state. Height, difficulty, 24 h block time and the next difficulty adjustment.
14 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
tip_height | integer | null | block height | Height of the latest block. |
difficulty | number | null | difficulty units | Network mining difficulty. |
block_time | object | seconds | Average block time over 24 h (avg_24h_s), its deviation from the 600 s target, and a signal. |
block_time.avg_24h_s | number | null | seconds | Average block time over 24 hours. |
block_time.deviation_s | number | null | seconds | avg_24h_s - 600. |
block_time.signal | string | 24 h block time versus the 600 s target: slow (> +30 s), fast (< -30 s) or on_target. | |
next_adjustment | object | Next difficulty adjustment: progress, expected change, date, remaining blocks and time. | |
next_adjustment.progress_pct | number | null | percent (58.5 = 58.5 %) | Progress through the current 2016-block difficulty period. |
next_adjustment.difficulty_change_pct | number | null | percent (58.5 = 58.5 %) | Expected difficulty change at the next adjustment. |
next_adjustment.estimated_retarget | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Estimated instant of the next adjustment. |
next_adjustment.remaining_blocks | integer | null | count | Blocks left before the adjustment. |
next_adjustment.remaining_time_ms | integer | null | milliseconds | Estimated time left before the adjustment. |
next_adjustment.next_retarget_height | integer | null | block height | Height of the next adjustment. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/network"{
"status": "ok",
"timestamp": 1790790296031,
"data_type": "btc_network",
"data": {
"time": "2026-09-30T17:43:22.437Z",
"tip_height": 969328,
"difficulty": 132757073449487.5,
"block_time": {
"avg_24h_s": 603.9154929577464,
"deviation_s": 3.915492957746437,
"signal": "on_target"
},
"next_adjustment": {
"progress_pct": 81.74603174603175,
"difficulty_change_pct": 0.09550248063647793,
"estimated_retarget": "2026-10-03T07:02:04.088Z",
"remaining_blocks": 368,
"remaining_time_ms": 220723088,
"next_retarget_height": 969696
}
}
}GET /v1/btc/network/history
Network history. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 24h, 1w, 1mo (one month), 3m, 6m, 1y. 1m also means ONE MONTH here (legacy spelling); prefer 1mo. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 300 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].difficulty | number | null | difficulty units | Network mining difficulty. |
[].tip_height | integer | null | block height | Height of the latest block. |
[].progress_pct | number | null | percent (58.5 = 58.5 %) | Progress through the current 2016-block difficulty period. |
[].difficulty_change_pct | number | null | percent (58.5 = 58.5 %) | Expected difficulty change at the next adjustment. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/network/history?timePeriod=1w&limit=3"{
"status": "ok",
"timestamp": 1790790296616,
"data_type": "btc_network_history",
"data": [
{
"time": "2026-09-30T17:43:22.437Z",
"difficulty": 132757073449487.5,
"tip_height": 969328,
"progress_pct": 81.74603174603175,
"difficulty_change_pct": 0.09550248063647793
},
{
"time": "2026-09-30T17:38:22.259Z",
"difficulty": 132757073449487.5,
"tip_height": 969327,
"progress_pct": 81.69642857142857,
"difficulty_change_pct": 0.06507063148870618
},
{
"time": "2026-09-30T17:33:22.147Z",
"difficulty": 132757073449487.5,
"tip_height": 969327,
"progress_pct": 81.69642857142857,
"difficulty_change_pct": 0.09566181271543071
}
]
}#Ethereum
Ethereum fundamentals: gas, supply and burn, staking and yield, DeFi TVL, ETH/BTC ratio and derived signals (deflation, supply squeeze, gas momentum).
GET /v1/eth/defi
Ethereum DeFi. TVL, DEX volume, TVL / market cap and the 30-day trend.
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
tvl_usd | number | null | USD | Total value locked in Ethereum DeFi. |
dex_volume_24h_usd | number | null | USD | DEX volume over 24 h. |
dex_volume_7d_usd | number | null | USD | DEX volume over 7 days. |
eth_market_cap_usd | number | null | USD | ETH market capitalisation. |
defi_health_ratio | number | null | fraction (0.585 = 58.5 %) | tvl_usd / eth_market_cap_usd. |
trend_30d_pct | number | null | percent (58.5 = 58.5 %) | TVL change over 30 days. |
signal | string | 30-day TVL trend: growing, declining or stable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/defi"{
"status": "ok",
"timestamp": 1790790303499,
"data_type": "eth_defi",
"data": {
"time": "2026-09-30T17:44:23.604Z",
"tvl_usd": 53490544615.9211,
"dex_volume_24h_usd": 2249654934.75,
"dex_volume_7d_usd": 10117923272.67,
"eth_market_cap_usd": 327233499795.6087,
"defi_health_ratio": 0.16346292372061996,
"trend_30d_pct": -0.5136541328507458,
"signal": "declining"
}
}GET /v1/eth/defi/history
DeFi history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].tvl_usd | number | null | USD | Total value locked in Ethereum DeFi. |
[].dex_volume_24h_usd | number | null | USD | DEX volume over 24 h. |
[].dex_volume_7d_usd | number | null | USD | DEX volume over 7 days. |
[].eth_market_cap_usd | number | null | USD | ETH market capitalisation. |
[].defi_health_ratio | number | null | fraction (0.585 = 58.5 %) | tvl_usd / eth_market_cap_usd. |
[].trend_30d_pct | number | null | percent (58.5 = 58.5 %) | TVL change over 30 days. |
[].signal | string | 30-day TVL trend: growing, declining or stable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/defi/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790304152,
"data_type": "eth_defi_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"tvl_usd": 53405384381.589645,
"dex_volume_24h_usd": 1775560176.42,
"dex_volume_7d_usd": 9901392630.21,
"eth_market_cap_usd": 326953868021.70447,
"defi_health_ratio": 0.16334226202836782,
"trend_30d_pct": -3.0525471661838295,
"signal": "declining"
},
{
"time": "2026-09-28T00:00:00.000Z",
"tvl_usd": 53404796365.371086,
"dex_volume_24h_usd": 877956617.37,
"dex_volume_7d_usd": 10524068113.06,
"eth_market_cap_usd": 328366469602.105,
"defi_health_ratio": 0.16263778829209893,
"trend_30d_pct": -1.4848964788682302,
"signal": "declining"
},
{
"time": "2026-09-27T00:00:00.000Z",
"tvl_usd": 53608718060.33713,
"dex_volume_24h_usd": 927564228,
"dex_volume_7d_usd": 11027047435.079998,
"eth_market_cap_usd": 328278373338.84045,
"defi_health_ratio": 0.1633026187960411,
"trend_30d_pct": -1.2275951141924373,
"signal": "declining"
}
]
}GET /v1/eth/deflation
ETH deflation. 24 h burn versus issuance and the annualised net supply change.
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
burn_24h | number | null | ETH | ETH burnt over the last 24 h. |
net_issuance_24h | number | null | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
annualized_rate_pct | number | null | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
zone | string | deflationary (24 h net issuance < 0) or inflationary. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/deflation"{
"status": "ok",
"timestamp": 1790790300946,
"data_type": "eth_deflation",
"data": {
"time": "2026-09-30T17:44:59.321Z",
"burn_24h": 230.75186128914356,
"net_issuance_24h": 2750.036794245243,
"annualized_rate_pct": 0.8221306029171951,
"zone": "inflationary"
}
}GET /v1/eth/deflation/history
Deflation history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].burn_24h | number | null | ETH | ETH burnt over the last 24 h. |
[].net_issuance_24h | number | null | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
[].annualized_rate_pct | number | null | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
[].zone | string | deflationary (24 h net issuance < 0) or inflationary. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/deflation/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790301582,
"data_type": "eth_deflation_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"burn_24h": 259.98423121962696,
"net_issuance_24h": 2716.8863708376884,
"annualized_rate_pct": 0.8122384931750257,
"zone": "inflationary"
},
{
"time": "2026-09-28T00:00:00.000Z",
"burn_24h": 151.3052807012573,
"net_issuance_24h": 2796.0945723950863,
"annualized_rate_pct": 0.8359371251957296,
"zone": "inflationary"
},
{
"time": "2026-09-27T00:00:00.000Z",
"burn_24h": 17.35258579440415,
"net_issuance_24h": 2922.49273596704,
"annualized_rate_pct": 0.8737458856021223,
"zone": "inflationary"
}
]
}GET /v1/eth/gas
Ethereum gas. Gas prices (gwei), base fee, block usage and congestion.
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
safe_gas_price | number | null | gwei | Gas price for a low-priority transaction. |
propose_gas_price | number | null | gwei | Gas price for a standard transaction. |
fast_gas_price | number | null | gwei | Gas price for a fast transaction. |
base_fee | number | null | gwei | EIP-1559 base fee (burnt). |
gas_used_ratio | number | null | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
congestion | string | low (gas_used_ratio < 0.5), normal, or high (> 0.8). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas"{
"status": "ok",
"timestamp": 1790790297214,
"data_type": "eth_gas",
"data": {
"time": "2026-09-30T17:39:58.759Z",
"safe_gas_price": 0.592738703,
"propose_gas_price": 0.601074552,
"fast_gas_price": 0.872012573,
"base_fee": 0.592738703,
"gas_used_ratio": 0.61796753183537,
"congestion": "normal"
}
}GET /v1/eth/gas-momentum
Gas momentum. 7-day versus 30-day base fee average: rising or falling demand for block space.
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
base_fee | number | null | gwei | EIP-1559 base fee (burnt). |
gas_used_ratio | number | null | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
gas_ma7 | number | null | gwei | 7-day moving average of the base fee. |
gas_ma30 | number | null | gwei | 30-day moving average of the base fee. |
momentum_pct | number | null | percent (58.5 = 58.5 %) | Relative gap between the short and the long moving average, in percent. |
regime | string | high_demand (gas_used_ratio > 0.8 and momentum > 0), low_demand (< 0.5 and momentum < 0), otherwise normal. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas-momentum"{
"status": "ok",
"timestamp": 1790790298457,
"data_type": "eth_gas_momentum",
"data": {
"time": "2026-09-30T17:39:58.759Z",
"base_fee": 0.592738703,
"gas_used_ratio": 0.61796753183537,
"gas_ma7": 0.7359732017468117,
"gas_ma30": 0.2898341458721775,
"momentum_pct": 153.9290874552063,
"regime": "normal"
}
}GET /v1/eth/gas-momentum/history
Gas momentum history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].base_fee | number | null | gwei | EIP-1559 base fee (burnt). |
[].gas_used_ratio | number | null | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
[].gas_ma7 | number | null | gwei | 7-day moving average of the base fee. |
[].gas_ma30 | number | null | gwei | 30-day moving average of the base fee. |
[].momentum_pct | number | null | percent (58.5 = 58.5 %) | Relative gap between the short and the long moving average, in percent. |
[].regime | string | high_demand (gas_used_ratio > 0.8 and momentum > 0), low_demand (< 0.5 and momentum < 0), otherwise normal. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas-momentum/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790299107,
"data_type": "eth_gas_momentum_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"base_fee": 0.138473642,
"gas_used_ratio": 0.5602710333333334,
"gas_ma7": 0.7359732017468116,
"gas_ma30": 0.28983414587217754,
"momentum_pct": 153.9290874552062,
"regime": "normal"
},
{
"time": "2026-09-28T00:00:00.000Z",
"base_fee": 0.854699776,
"gas_used_ratio": 0.5104909400000001,
"gas_ma7": 0.6062514615776523,
"gas_ma30": 0.25637983670076747,
"momentum_pct": 136.46612361534338,
"regime": "normal"
},
{
"time": "2026-09-27T00:00:00.000Z",
"base_fee": 0.471551096,
"gas_used_ratio": 0.429017,
"gas_ma7": 0.4868385049680292,
"gas_ma30": 0.21765141627727208,
"momentum_pct": 123.67807813748952,
"regime": "normal"
}
]
}GET /v1/eth/gas/history
Gas history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].safe_gas_price | number | null | gwei | Gas price for a low-priority transaction. |
[].propose_gas_price | number | null | gwei | Gas price for a standard transaction. |
[].fast_gas_price | number | null | gwei | Gas price for a fast transaction. |
[].base_fee | number | null | gwei | EIP-1559 base fee (burnt). |
[].gas_used_ratio | number | null | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
[].congestion | string | low (gas_used_ratio < 0.5), normal, or high (> 0.8). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790297856,
"data_type": "eth_gas_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"safe_gas_price": 0.138473643,
"propose_gas_price": 0.138473643,
"fast_gas_price": 0.139473642,
"base_fee": 0.138473642,
"gas_used_ratio": 0.5602710333333334,
"congestion": "normal"
},
{
"time": "2026-09-28T00:00:00.000Z",
"safe_gas_price": 0.854699776,
"propose_gas_price": 0.855699776,
"fast_gas_price": 1.366004339,
"base_fee": 0.854699776,
"gas_used_ratio": 0.5104909400000001,
"congestion": "normal"
},
{
"time": "2026-09-27T00:00:00.000Z",
"safe_gas_price": 0.471551096,
"propose_gas_price": 0.481651096,
"fast_gas_price": 0.529816205,
"base_fee": 0.471551096,
"gas_used_ratio": 0.429017,
"congestion": "low"
}
]
}GET /v1/eth/ratio
ETH/BTC ratio. ETH/BTC price ratio, its 7-day momentum and which asset outperforms.
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
eth_price_usd | number | null | USD | ETH price. |
btc_price_usd | number | null | USD | BTC price used for the conversion. |
eth_btc_ratio | number | null | BTC per ETH | ETH price / BTC price. |
momentum_7d_pct | number | null | percent (58.5 = 58.5 %) | Change of the ETH/BTC ratio over 7 days. |
signal | string | 7-day momentum of ETH/BTC: eth_outperform (> 0), btc_outperform (< 0) or neutral. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/ratio"{
"status": "ok",
"timestamp": 1790790304747,
"data_type": "eth_ratio",
"data": {
"time": "2026-09-30T17:42:12.911Z",
"eth_price_usd": 2680.2,
"btc_price_usd": 84022.25,
"eth_btc_ratio": 0.03189869350082865,
"momentum_7d_pct": 0.7540813503536662,
"signal": "eth_outperform"
}
}GET /v1/eth/ratio/history
ETH/BTC ratio history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
6 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].eth_price_usd | number | null | USD | ETH price. |
[].btc_price_usd | number | null | USD | BTC price used for the conversion. |
[].eth_btc_ratio | number | null | BTC per ETH | ETH price / BTC price. |
[].momentum_7d_pct | number | null | percent (58.5 = 58.5 %) | Change of the ETH/BTC ratio over 7 days. |
[].signal | string | 7-day momentum of ETH/BTC: eth_outperform (> 0), btc_outperform (< 0) or neutral. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/ratio/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790305400,
"data_type": "eth_ratio_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"eth_price_usd": 2677.97,
"btc_price_usd": 83665.62,
"eth_btc_ratio": 0.03200800998068263,
"momentum_7d_pct": 0.1693721109489341,
"signal": "eth_outperform"
},
{
"time": "2026-09-28T00:00:00.000Z",
"eth_price_usd": 2689.6,
"btc_price_usd": 83534,
"eth_btc_ratio": 0.03219766801541887,
"momentum_7d_pct": 0.4405241235708182,
"signal": "eth_outperform"
},
{
"time": "2026-09-27T00:00:00.000Z",
"eth_price_usd": 2688.94,
"btc_price_usd": 84458.6,
"eth_btc_ratio": 0.03183737357711352,
"momentum_7d_pct": -2.319482973188987,
"signal": "btc_outperform"
}
]
}GET /v1/eth/squeeze
ETH supply squeeze index. 0-100 index combining the staked share and net issuance.
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
staking_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
annualized_rate_pct | number | null | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
squeeze_index | number | null | score from 0 to 100 | Supply squeeze index: combines the staked share and net issuance. Higher = less liquid ETH available. |
level | string | low (< 33), moderate (>= 33), high (>= 66). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/squeeze"{
"status": "ok",
"timestamp": 1790790305995,
"data_type": "eth_squeeze",
"data": {
"time": "2026-09-30T17:44:59.321Z",
"staking_ratio": 0.3603355802690349,
"annualized_rate_pct": 0.8221306029171951,
"squeeze_index": 18.427844314910345,
"level": "low"
}
}GET /v1/eth/squeeze/history
Supply squeeze history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].staking_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
[].annualized_rate_pct | number | null | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
[].squeeze_index | number | null | score from 0 to 100 | Supply squeeze index: combines the staked share and net issuance. Higher = less liquid ETH available. |
[].level | string | low (< 33), moderate (>= 33), high (>= 66). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/squeeze/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790306639,
"data_type": "eth_squeeze_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"staking_ratio": 0.3600193832972402,
"annualized_rate_pct": 0.8122384931750257,
"squeeze_index": 18.40708841144952,
"level": "low"
},
{
"time": "2026-09-28T00:00:00.000Z",
"staking_ratio": null,
"annualized_rate_pct": 0.8359371251957296,
"squeeze_index": null,
"level": null
},
{
"time": "2026-09-27T00:00:00.000Z",
"staking_ratio": null,
"annualized_rate_pct": 0.8737458856021223,
"squeeze_index": null,
"level": null
}
]
}GET /v1/eth/staking
ETH staking. Share of ETH staked, total staked, staking APR and its spread over the Fed funds rate.
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
staking_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
total_staked | number | null | ETH | ETH staked (beacon chain). |
total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
fed_funds_rate_pct | number | string | null | percent (58.5 = 58.5 %) | US Fed funds rate, to compare with the staking yield. null if unavailable. |
yield_spread_pct | number | string | null | percentage points | Staking APR - Fed funds rate. null if unavailable. |
yield_signal | number | string | null | attractive (staking APR above the Fed funds rate), neutral or unattractive. null if unavailable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/staking"{
"status": "ok",
"timestamp": 1790790302184,
"data_type": "eth_staking",
"data": {
"time": "2026-09-30T17:35:00.287Z",
"staking_ratio": 0.3603355802690349,
"total_staked": 43994430.65156249,
"total_supply": 122092940.74905184,
"apr_pct": 2.245,
"fed_funds_rate_pct": null,
"yield_spread_pct": null,
"yield_signal": null
}
}GET /v1/eth/staking/history
Staking history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
8 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].staking_ratio | number | null | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
[].total_staked | number | null | ETH | ETH staked (beacon chain). |
[].total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
[].apr_pct | number | null | percent (58.5 = 58.5 %) | Annualised rate in percent. |
[].fed_funds_rate_pct | number | string | null | percent (58.5 = 58.5 %) | US Fed funds rate, to compare with the staking yield. null if unavailable. |
[].yield_spread_pct | number | string | null | percentage points | Staking APR - Fed funds rate. null if unavailable. |
[].yield_signal | number | string | null | attractive (staking APR above the Fed funds rate), neutral or unattractive. null if unavailable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/staking/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790302873,
"data_type": "eth_staking_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"staking_ratio": 0.3600193832972402,
"total_staked": 43954835.166869424,
"total_supply": 122090190.7122576,
"apr_pct": 2.312,
"fed_funds_rate_pct": null,
"yield_spread_pct": null,
"yield_signal": null
},
{
"time": "2026-09-28T00:00:00.000Z",
"staking_ratio": null,
"total_staked": null,
"total_supply": 122087473.82588676,
"apr_pct": 2.335,
"fed_funds_rate_pct": null,
"yield_spread_pct": null,
"yield_signal": null
},
{
"time": "2026-09-27T00:00:00.000Z",
"staking_ratio": null,
"total_staked": null,
"total_supply": 122084677.73131436,
"apr_pct": 2.187,
"fed_funds_rate_pct": null,
"yield_spread_pct": null,
"yield_signal": null
}
]
}GET /v1/eth/supply
ETH supply and burn. Supply, staking, burnt fees, withdrawals, 24 h burn and net issuance.
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
eth_supply | number | null | ETH | ETH supply reported by the source. |
eth2_staking | number | null | ETH | ETH deposited to the beacon chain, as reported by the source. |
burnt_fees | number | null | ETH | ETH burnt since EIP-1559. |
withdrawn_total | number | null | ETH | ETH withdrawn from staking. |
total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
burn_24h | number | null | ETH | ETH burnt over the last 24 h. |
net_issuance_24h | number | null | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
signal | string | deflationary (24 h net issuance < 0), inflationary (> 0) or neutral. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/supply"{
"status": "ok",
"timestamp": 1790790299703,
"data_type": "eth_supply",
"data": {
"time": "2026-09-30T17:39:58.759Z",
"eth_supply": 122373866.2178,
"eth2_staking": 4353987.930188726,
"burnt_fees": 4634913.398936898,
"withdrawn_total": 7618584.348954597,
"total_supply": 122092940.74905184,
"burn_24h": 230.75186128914356,
"net_issuance_24h": 2750.036794245243,
"signal": "inflationary"
}
}GET /v1/eth/supply/history
ETH supply history. One row per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 7d, 30d, 90d, 1y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
9 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].eth_supply | number | null | ETH | ETH supply reported by the source. |
[].eth2_staking | number | null | ETH | ETH deposited to the beacon chain, as reported by the source. |
[].burnt_fees | number | null | ETH | ETH burnt since EIP-1559. |
[].withdrawn_total | number | null | ETH | ETH withdrawn from staking. |
[].total_supply | number | null | coins | Total coins issued (circulating + locked), net of burns. |
[].burn_24h | number | null | ETH | ETH burnt over the last 24 h. |
[].net_issuance_24h | number | null | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
[].signal | string | deflationary (24 h net issuance < 0), inflationary (> 0) or neutral. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/supply/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790300333,
"data_type": "eth_supply_history",
"data": [
{
"time": "2026-09-29T00:00:00.000Z",
"eth_supply": 122373866.2178,
"eth2_staking": 4351007.141533189,
"burnt_fees": 4634682.647075609,
"withdrawn_total": 7618584.348954597,
"total_supply": 122090190.7122576,
"burn_24h": 259.98423121962696,
"net_issuance_24h": 2716.8863708376884,
"signal": "inflationary"
},
{
"time": "2026-09-28T00:00:00.000Z",
"eth_supply": 122373866.2178,
"eth2_staking": 4348030.270931135,
"burnt_fees": 4634422.66284439,
"withdrawn_total": 7618584.348954597,
"total_supply": 122087473.82588676,
"burn_24h": 151.3052807012573,
"net_issuance_24h": 2796.0945723950863,
"signal": "inflationary"
},
{
"time": "2026-09-27T00:00:00.000Z",
"eth_supply": 122373866.2178,
"eth2_staking": 4345082.8710780395,
"burnt_fees": 4634271.357563688,
"withdrawn_total": 7618584.348954597,
"total_supply": 122084677.73131436,
"burn_24h": 17.35258579440415,
"net_issuance_24h": 2922.49273596704,
"signal": "inflationary"
}
]
}#On-chain Bitcoin
Daily on-chain valuation and activity: MVRV, NVT, active addresses, miner stress.
GET /v1/onchain/active-addresses
Bitcoin active addresses. Daily active addresses, 7- and 30-day averages and momentum.
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
active_addresses | number | null | count | Addresses active on the day. |
avg_7d | number | null | count | 7-day average. |
avg_30d | number | null | count | 30-day average. |
momentum_pct | number | null | percent (58.5 = 58.5 %) | Relative gap between the short and the long moving average, in percent. |
signal | string | 7-day vs 30-day average: accelerating (> +5 %), decelerating (< -5 %) or stable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/active-addresses"{
"status": "ok",
"timestamp": 1790790309629,
"data_type": "onchain_active_addresses",
"data": {
"time": "2026-09-28",
"date": "2026-09-28",
"active_addresses": 491198,
"avg_7d": 477345.8571428571,
"avg_30d": 477719.6666666667,
"momentum_pct": -0.07824871988583121,
"signal": "stable"
}
}GET /v1/onchain/active-addresses/history
Active addresses history. One point per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 30d, 90d, 1y, 2y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
7 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].active_addresses | number | null | count | Addresses active on the day. |
[].avg_7d | number | null | count | 7-day average. |
[].avg_30d | number | null | count | 30-day average. |
[].momentum_pct | number | null | percent (58.5 = 58.5 %) | Relative gap between the short and the long moving average, in percent. |
[].signal | string | 7-day vs 30-day average: accelerating (> +5 %), decelerating (< -5 %) or stable. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/active-addresses/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790310226,
"data_type": "onchain_active_addresses_history",
"data": [
{
"time": "2026-09-28",
"date": "2026-09-28",
"active_addresses": 491198,
"avg_7d": 477345.8571428571,
"avg_30d": 477719.6666666667,
"momentum_pct": -0.07824871988583121,
"signal": "stable"
},
{
"time": "2026-09-27",
"date": "2026-09-27",
"active_addresses": 416118,
"avg_7d": 482648,
"avg_30d": 476254.93333333335,
"momentum_pct": 1.3423622978393612,
"signal": "stable"
},
{
"time": "2026-09-26",
"date": "2026-09-26",
"active_addresses": 448618,
"avg_7d": 482500.71428571426,
"avg_30d": 479660.63333333336,
"momentum_pct": 0.5921021561940911,
"signal": "stable"
}
]
}GET /v1/onchain/miner-stress
Bitcoin miner stress. Miner revenue per unit of difficulty against its 30-day average: healthy, stress or capitulation. Daily.
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
miner_stress | number | null | dimensionless score | Miner revenue / difficulty (revenue per unit of work). Read it against stress_ma30. |
stress_ma30 | number | null | dimensionless score | 30-day moving average of miner_stress. |
zone | string | healthy (at or above its 30-day average), stress (below it), capitulation (below 70 % of it — historically near BTC bottoms). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/miner-stress"{
"status": "ok",
"timestamp": 1790790310822,
"data_type": "onchain_miner_stress",
"data": {
"time": "2026-09-28",
"date": "2026-09-28",
"miner_stress": 3.6581775424862035e-7,
"stress_ma30": 3.172945811918241e-7,
"zone": "healthy"
}
}GET /v1/onchain/miner-stress/history
Miner stress history. One point per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 30d, 90d, 1y, 2y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].miner_stress | number | null | dimensionless score | Miner revenue / difficulty (revenue per unit of work). Read it against stress_ma30. |
[].stress_ma30 | number | null | dimensionless score | 30-day moving average of miner_stress. |
[].zone | string | healthy (at or above its 30-day average), stress (below it), capitulation (below 70 % of it — historically near BTC bottoms). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/miner-stress/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790311441,
"data_type": "onchain_miner_stress_history",
"data": [
{
"time": "2026-09-28",
"date": "2026-09-28",
"miner_stress": 3.6581775424862035e-7,
"stress_ma30": 3.172945811918241e-7,
"zone": "healthy"
},
{
"time": "2026-09-27",
"date": "2026-09-27",
"miner_stress": 3.0790386080647216e-7,
"stress_ma30": 3.153325023066599e-7,
"zone": "stress"
},
{
"time": "2026-09-26",
"date": "2026-09-26",
"miner_stress": 3.338864865252702e-7,
"stress_ma30": 3.151001733571237e-7,
"zone": "healthy"
}
]
}GET /v1/onchain/mvrv
Bitcoin MVRV. Market value / realised value with its zone and 30-day momentum. Daily.
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
mvrv | number | null | dimensionless ratio | Market value / realised value. |
zone | string | undervalued (<= 1), fair (> 1), elevated (> 2.5), overvalued (> 3.5). | |
momentum_30d_pct | number | null | percent (58.5 = 58.5 %) | Change over 30 days. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/mvrv"{
"status": "ok",
"timestamp": 1790790307229,
"data_type": "onchain_mvrv",
"data": {
"time": "2026-09-23",
"date": "2026-09-23",
"mvrv": 1.5899,
"zone": "fair",
"momentum_30d_pct": 5.802888134690901
}
}GET /v1/onchain/mvrv/history
MVRV history. One point per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 30d, 90d, 1y, 2y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].mvrv | number | null | dimensionless ratio | Market value / realised value. |
[].zone | string | undervalued (<= 1), fair (> 1), elevated (> 2.5), overvalued (> 3.5). | |
[].momentum_30d_pct | number | null | percent (58.5 = 58.5 %) | Change over 30 days. |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/mvrv/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790307811,
"data_type": "onchain_mvrv_history",
"data": [
{
"time": "2026-09-23",
"date": "2026-09-23",
"mvrv": 1.5899,
"zone": "fair",
"momentum_30d_pct": 5.802888134690901
},
{
"time": "2026-09-22",
"date": "2026-09-22",
"mvrv": 1.6254,
"zone": "fair",
"momentum_30d_pct": 9.883720930232547
},
{
"time": "2026-09-21",
"date": "2026-09-21",
"mvrv": 1.6366,
"zone": "fair",
"momentum_30d_pct": 11.477419794291947
}
]
}GET /v1/onchain/nvt
Bitcoin NVT. Network value to transactions ratio and its 90-day NVT Signal, derived on demand. Daily.
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
nvt | number | null | dimensionless ratio | Market cap / daily on-chain transaction volume (NVT ratio). |
nvt_signal | number | null | dimensionless ratio | NVT smoothed over 90 days (NVT Signal), less noisy. |
zone | string | Zone of the NVT Signal: undervalued (<= 45), fair (> 45), overvalued (> 100), bubble (> 150). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/nvt"{
"status": "ok",
"timestamp": 1790790308422,
"data_type": "onchain_nvt",
"data": {
"time": "2026-09-27",
"date": "2026-09-27",
"nvt": 580.1348324564798,
"nvt_signal": 303.47902556588224,
"zone": "bubble"
}
}GET /v1/onchain/nvt/history
NVT history. One point per day. Most recent first. Page backwards with until_ms.
| Parameter | Type | Default | Description |
|---|---|---|---|
timePeriod | string | any | null | — | Named window: 30d, 90d, 1y, 2y or all. |
since_ms | integer | any | null | — | Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 invalid_time_range. |
until_ms | integer | any | null | — | Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest time you received minus 1 ms (see the pagination guide). |
limit | integer · 1–5000 | 365 | Number of rows to return, most recent first. Also bounded by your plan's history window (403 history_depth beyond it). |
5 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
[].time | date | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
[].date | date | calendar date (YYYY-MM-DD) | Calendar day the value refers to. |
[].nvt | number | null | dimensionless ratio | Market cap / daily on-chain transaction volume (NVT ratio). |
[].nvt_signal | number | null | dimensionless ratio | NVT smoothed over 90 days (NVT Signal), less noisy. |
[].zone | string | Zone of the NVT Signal: undervalued (<= 45), fair (> 45), overvalued (> 100), bubble (> 150). |
Example: request and real response
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/nvt/history?timePeriod=30d&limit=3"{
"status": "ok",
"timestamp": 1790790309043,
"data_type": "onchain_nvt_history",
"data": [
{
"time": "2026-09-27",
"date": "2026-09-27",
"nvt": 580.1348324564798,
"nvt_signal": 303.47902556588247,
"zone": "bubble"
},
{
"time": "2026-09-26",
"date": "2026-09-26",
"nvt": 466.41016952520494,
"nvt_signal": 298.6212428564303,
"zone": "bubble"
},
{
"time": "2026-09-25",
"date": "2026-09-25",
"nvt": 128.7577049311245,
"nvt_signal": 299.67919310847753,
"zone": "bubble"
}
]
}#Technical indicators
20 technical indicators computed server-side on the same candles as /v1/raw/klines, several per request (RSI, MACD, Bollinger, ATR, Ichimoku, VWMA...).
POST /v1/indicators
Compute technical indicators. POST a JSON body: symbol, timeframe, results (values per indicator) and indicators, a list of {id, type, <parameters flat>} — e.g. {"id": "rsi_fast", "type": "rsi", "period": 14}. A nested "parameters": {...} object is also accepted. Computed on the same candles as /v1/raw/klines; results + warm-up is capped at 1000 candles. Errors on the body are 400 invalid_indicator.
31 fields of the response
| Field of data | Type | Unit | Description |
|---|---|---|---|
symbol | string | Trading pair, e.g. BTCUSDT. | |
timeframe | string | Bucket size of the row. | |
results | integer | null | count | Number of values per indicator. |
indicators | object | One entry per requested indicator id: its parameters, values (oldest to newest) and as_of (time of the last value). | |
indicators.rsi_fast | object | ||
indicators.rsi_fast.time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
indicators.rsi_fast.type | string | Indicator type. | |
indicators.rsi_fast.period | integer | null | candles | Look-back period of the indicator, in candles. |
indicators.rsi_fast.values | number | null[] | quote currency (USDT for BTCUSDT) | Indicator values, oldest to newest; an object of arrays for multi-output indicators (MACD, Bollinger...). |
indicators.rsi_fast.as_of | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Time of the candle of the last value. |
indicators.macd | object | ||
indicators.macd.time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
indicators.macd.type | string | Indicator type. | |
indicators.macd.fast | integer | null | candles | Fast period, in candles. |
indicators.macd.slow | integer | null | candles | Slow period, in candles. |
indicators.macd.signal | integer | null | candles | MACD signal period, in candles. |
indicators.macd.values | object | quote currency (USDT for BTCUSDT) | Indicator values, oldest to newest; an object of arrays for multi-output indicators (MACD, Bollinger...). |
indicators.macd.values.macd | number | null[] | ||
indicators.macd.values.signal | number | null[] | candles | MACD signal period, in candles. |
indicators.macd.values.histogram | number | null[] | ||
indicators.macd.as_of | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Time of the candle of the last value. |
indicators.bb_mid | object | ||
indicators.bb_mid.time | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the row: a copy of bucket, timestamp, date, period_end, settlement_at, day or as_of, present on every timestamped object so a generic client needs one key. |
indicators.bb_mid.type | string | Indicator type. | |
indicators.bb_mid.period | integer | null | candles | Look-back period of the indicator, in candles. |
indicators.bb_mid.std | number | null | standard deviations | Band width, in standard deviations. |
indicators.bb_mid.values | object | quote currency (USDT for BTCUSDT) | Indicator values, oldest to newest; an object of arrays for multi-output indicators (MACD, Bollinger...). |
indicators.bb_mid.values.upper | number | null[] | ||
indicators.bb_mid.values.middle | number | null[] | ||
indicators.bb_mid.values.lower | number | null[] | ||
indicators.bb_mid.as_of | date-time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Time of the candle of the last value. |
Example: request and real response
{
"symbol": "BTCUSDT",
"timeframe": "1h",
"results": 3,
"indicators": [
{
"id": "rsi_fast",
"type": "rsi",
"period": 14
},
{
"id": "macd",
"type": "macd",
"fast": 12,
"slow": 26,
"signal": 9
},
{
"id": "bb_mid",
"type": "bb",
"period": 20
}
]
}curl -X POST -H "X-API-KEY: $BYTNODE_API_KEY" -H "Content-Type: application/json" \
-d '{"symbol": "BTCUSDT", "timeframe": "1h", "results": 3, "indicators": [{"id": "rsi_fast", "type": "rsi", "period": 14}, {"id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9}, {"id": "bb_mid", "type": "bb", "period": 20}]}' \
https://api.bytnode.com/v1/indicators{
"status": "ok",
"timestamp": 1790790312091,
"data_type": "indicators",
"data": {
"symbol": "BTCUSDT",
"timeframe": "1h",
"results": 3,
"indicators": {
"rsi_fast": {
"time": "2026-09-30T16:00:00.000Z",
"type": "rsi",
"period": 14,
"values": [
50.8131287181248,
54.16981376214668,
56.23763630767805
],
"as_of": "2026-09-30T16:00:00.000Z"
},
"macd": {
"time": "2026-09-30T16:00:00.000Z",
"type": "macd",
"fast": 12,
"slow": 26,
"signal": 9,
"values": {
"macd": [
174.52954986991244,
179.8107200126251,
199.05105878527684
],
"signal": [
55.094238485326706,
80.03753479078638,
103.84023958968449
],
"histogram": [
119.43531138458572,
99.77318522183872,
95.21081919559236
]
},
"as_of": "2026-09-30T16:00:00.000Z"
},
"bb_mid": {
"time": "2026-09-30T16:00:00.000Z",
"type": "bb",
"period": 20,
"std": 2,
"values": {
"upper": [
84660.956588588,
84710.15098467488,
84787.943777102
],
"middle": [
83638.72449999998,
83665.74549999999,
83702.39799999999
],
"lower": [
82616.49241141196,
82621.3400153251,
82616.85222289797
]
},
"as_of": "2026-09-30T16:00:00.000Z"
}
}
}
}