Snapshot
An à la carte endpoint: you name the fields, it brings them all back in one request. It is the right entry point for a dashboard or for feeding a model: one call per cycle instead of ten.
#The principle
Each parameter of the request is a field name, and its value the depth requested (a number of rows, of minutes or of seconds depending on the field). Fields that have only a current value are requested with =1 (or =true, which means the same). symbol is required. The snapshot is included from the Traders plan.
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/snapshot?symbol=BTCUSDT\
&funding_rate=1\
&basis=1\
&fear_greed=1\
&cvd@1h=2"With no field requested, the response returns an empty data and the catalogue of what your plan includes: available_fields (the fields without a timeframe), available_multi_tf_fields (requested as name@tf), timeframes and max_depth, the ceiling of each field. A client can build its requests from it without reading this page.
#The 48 fields
Thirty-seven fields are requested by their bare name (the discovery, /v1/snapshot?symbol=BTCUSDT, lists them). Each one has the name and the content of its route: a field whose route returns an object comes back as that object, requested with =1 (or =true) — a greater depth is a 422 that points to its /history route; the event fields (individual trades, liquidation events, per-second candles) are lists, up to the ceiling of the depth column.
Price and volume
| Field | Type | Description |
|---|---|---|
trades_kline_futures_seconds | 1000 seconds | The rows of /v1/trades-kline/futures/seconds: perpetual futures trades aggregated per second — volume, count, buy and sell volume. |
trades_spot | 10,000 trades | Individual spot trades, the rows of /v1/trades/spot. |
trades_futures | 10,000 trades | Individual futures trades, the rows of /v1/trades/futures. |
price_change | current value | Change in % over the eight timeframes, computed on demand. |
Derivatives and positioning
| Field | Type | Description |
|---|---|---|
oi_change | current value | Change in open interest, with its percentage. |
funding_next | current value | Next estimated funding, normalised to an 8 h equivalent. |
funding_rate | current value | Last rate applied, weighted by open interest. |
funding_cumulative | current value | Cumulative total over 24 h, the sum of the last three windows. |
liquidations_events | 10,000 events | The N latest liquidations, the rows of /v1/liquidations/events. Your plan sets how many: beyond it, 403 history_depth. |
liquidations_cumulative | current value | Liquidations accumulated in 5-minute windows. |
basis | current value | Futures against spot gap, weighted by open interest. |
Order book and microstructure
| Field | Type | Description |
|---|---|---|
heatmap_clusters | current value | Liquidation clusters above and below the price. |
Whole market and satellites
| Field | Type | Description |
|---|---|---|
tokenomics | current value | Supply, capitalisation and FDV of the asset of the symbol. |
global | current value | Total capitalisation, volume, BTC and ETH dominances. |
fear_greed | current value | Sentiment index 0-100 and its classification. |
options_summary | current value | Options summary of the asset derived from the symbol (BTC or ETH only). |
macro_series, macro_correlations, macro_net_liquidity, macro_momentum, macro_risk | current value | Macro series and the four derived indicators. |
btc_network, btc_mempool, btc_fees, btc_mining | current value | State of the Bitcoin network. |
btc_mvrv, btc_nvt, btc_active_addresses, btc_revenue_per_difficulty | current value | Bitcoin on-chain valuation, daily data. |
eth_supply, eth_gas, eth_gas_momentum, eth_staking, eth_deflation, eth_defi, eth_squeeze, eth_price_btc | current value | The eight Ethereum families. |
#Multi-timeframe fields
Eleven fields exist per timeframe. They are requested with the @tf suffix, required, and the key comes back as is in data (data["cvd@1h"]). klines also takes 1w (timeframes_by_field in the catalogue). A @tf field is always a LIST, even at depth 1; a field without a timeframe is the OBJECT of its route (depth 1 only), except the event fields (trades, liquidations, seconds), which are lists.
1m5m15m30m1h4h1d
| Field | Type | Description |
|---|---|---|
klines@tf | 1000 candles | The candles of /v1/klines, 1m to 1w (klines@1w too), with the fields of the route: time, open, high, low, close, volume (spot + perpetual futures) with its buy and sell parts, the same per market (volume_spot, volume_futures…), the is_*_estimated flags and is_closed. Volumes in base-asset units. |
oi@tf | 1000 windows | Total open interest per closed bucket, the rows of /v1/oi/history. oi@1m=1 gives the latest minute. |
cvd@tf | 200 windows | Cumulative volume delta and its internal series. |
buy_sell_ratio@tf | 1000 windows | Buy over sell ratio per closed bucket (the same buckets as cvd). |
trades_avg_size@tf | 1000 windows | Average trade size per closed bucket, weighted by the number of trades. |
liquidations_big_small_ratio@tf | 1000 windows | Large liquidations against small ones, per closed bucket. |
orderbook@tf | 1000 windows | The order book by price range at the end of each bucket, spot and perpetual futures summed: the rows of /v1/orderbook/history. |
spread_interexchange@tf | 50 windows | Premium of each venue. The only field that names the venues. |
trades_kline@tf | 1440 candles | Trade candles (/v1/trades-kline), spot and futures summed. |
trades_kline_spot@tf | 1440 candles | Trade candles, spot only (/v1/trades-kline/spot). |
trades_kline_futures@tf | 1440 candles | Trade candles, futures only (/v1/trades-kline/futures). |
Requesting a multi-timeframe field without its suffix returns 422, and the reverse as well: a single-form field suffixed @1h is refused.
#The additive keys
is_partial
Present on every response that asks for fields. It turns true as soon as part of the response could not be built: the field concerned is then {"error": {"code": "...", "message": "..."}} and the others answer normally. A local failure stays local: you never get an empty response because one family out of seven was unavailable.
unavailable
Present only if at least one requested field is empty. It says why, which a null alone cannot do.
{
"status": "ok",
"server_time": "2026-10-13T02:18:41.507Z",
"data_type": "snapshot",
"symbol": "USDCUSDT",
"is_partial": false,
"data": { "funding_rate": null, "options_summary": null, "heatmap_clusters": null },
"unavailable": {
"funding_rate": "not_applicable",
"options_summary": "not_applicable",
"heatmap_clusters": "not_applicable"
}
}Three values, in order of priority: not_applicable (the phenomenon does not exist for this asset), no_api_key (the upstream source is not wired in, nothing was ever collected), no_data (a real absence over the window). Only the third allows a market conclusion.
out_of_plan_fields
The snapshot returns the content of the other families, and it is filtered according to your plan: a field whose family is not in the plan is removed from data and its name is listed in out_of_plan_fields, present only in that case. The other fields answer normally; the request is not refused.
{
"status": "ok",
"server_time": "2026-10-13T02:30:56.839Z",
"data_type": "snapshot",
"symbol": "BTCUSDT",
"is_partial": false,
"data": {
"funding_rate": {"time": "2026-10-12T16:00:00.000Z", "period_end_at": "2026-10-13T00:00:00.000Z", "settled_at": "2026-10-13T00:00:00.005Z", "rate_pct": 0.0038949161538, "apr_pct": 4.26493318841, "is_closed": true},
"basis": {"time": "2026-10-13T02:30:14.102Z", "basis_value": -33.9427339947, "basis_pct": -0.0410036905061, "futures_price": 82743.8733191, "spot_price": 82777.8160531}
},
"out_of_plan_fields": ["fear_greed", "btc_mvrv"]
}With no field requested, available_fields lists only the fields of your plan. A snapshot whose fields are all out of plan returns an empty data with the complete list in out_of_plan_fields, never an empty result without explanation. The mapping between families and plans is on the plans page; the snapshot itself is open from Traders upwards.
#Errors
| Case | Code |
|---|---|
symbol missing | 422 |
| Unknown or disabled symbol | 422 with the list of active symbols |
| Multi-timeframe field without suffix, or the reverse | 422 |
| Unknown timeframe | 422 |
| Non-integer depth or below 1 | 422 invalid_depth |
| Depth beyond the ceiling of the field | 422 depth_too_large |
| Depth beyond the history window of the plan | 403 with X-Deny-Reason: history_depth, and the maximum limit in error.message |
| Unknown key, or key repeated | 422 with the closest field suggested |
| Field of a family out of plan | not an error: the field is removed and listed in out_of_plan_fields |
The history window of the plan applies to dated fields as it does to REST routes: klines@1h=1000 asks for a thousand hourly candles, which Traders (one week on 1h) refuses with an explicit 403 history_depth rather than returning 168 candles under the name of a thousand.
{
"status": "error",
"server_time": "2026-09-30T16:07:27.808Z",
"error": {
"code": "history_depth",
"message": "History depth beyond your plan: 1000 hour(s) requested on 1h, your plan allows 7 day(s) (i.e. at most limit=168 on this timeframe, and no since_ms/until_ms bound beyond that window).",
"param": "limit",
"details": {
"window_s": 604800,
"earliest_ms": 1791273600000,
"max_limit": 168,
"timeframe": "1h"
}
}
}