REST API

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

GET/v1/snapshotdata_type · snapshotFull reference

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

FieldTypeDescription
trades_kline_futures_seconds1000 secondsThe rows of /v1/trades-kline/futures/seconds: perpetual futures trades aggregated per second — volume, count, buy and sell volume.
trades_spot10,000 tradesIndividual spot trades, the rows of /v1/trades/spot.
trades_futures10,000 tradesIndividual futures trades, the rows of /v1/trades/futures.
price_changecurrent valueChange in % over the eight timeframes, computed on demand.

Derivatives and positioning

FieldTypeDescription
oi_changecurrent valueChange in open interest, with its percentage.
funding_nextcurrent valueNext estimated funding, normalised to an 8 h equivalent.
funding_ratecurrent valueLast rate applied, weighted by open interest.
funding_cumulativecurrent valueCumulative total over 24 h, the sum of the last three windows.
liquidations_events10,000 eventsThe N latest liquidations, the rows of /v1/liquidations/events. Your plan sets how many: beyond it, 403 history_depth.
liquidations_cumulativecurrent valueLiquidations accumulated in 5-minute windows.
basiscurrent valueFutures against spot gap, weighted by open interest.

Order book and microstructure

FieldTypeDescription
heatmap_clusterscurrent valueLiquidation clusters above and below the price.

Whole market and satellites

FieldTypeDescription
tokenomicscurrent valueSupply, capitalisation and FDV of the asset of the symbol.
globalcurrent valueTotal capitalisation, volume, BTC and ETH dominances.
fear_greedcurrent valueSentiment index 0-100 and its classification.
options_summarycurrent valueOptions summary of the asset derived from the symbol (BTC or ETH only).
macro_series, macro_correlations, macro_net_liquidity, macro_momentum, macro_riskcurrent valueMacro series and the four derived indicators.
btc_network, btc_mempool, btc_fees, btc_miningcurrent valueState of the Bitcoin network.
btc_mvrv, btc_nvt, btc_active_addresses, btc_revenue_per_difficultycurrent valueBitcoin on-chain valuation, daily data.
eth_supply, eth_gas, eth_gas_momentum, eth_staking, eth_deflation, eth_defi, eth_squeeze, eth_price_btccurrent valueThe 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

FieldTypeDescription
klines@tf1000 candlesThe 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@tf1000 windowsTotal open interest per closed bucket, the rows of /v1/oi/history. oi@1m=1 gives the latest minute.
cvd@tf200 windowsCumulative volume delta and its internal series.
buy_sell_ratio@tf1000 windowsBuy over sell ratio per closed bucket (the same buckets as cvd).
trades_avg_size@tf1000 windowsAverage trade size per closed bucket, weighted by the number of trades.
liquidations_big_small_ratio@tf1000 windowsLarge liquidations against small ones, per closed bucket.
orderbook@tf1000 windowsThe order book by price range at the end of each bucket, spot and perpetual futures summed: the rows of /v1/orderbook/history.
spread_interexchange@tf50 windowsPremium of each venue. The only field that names the venues.
trades_kline@tf1440 candlesTrade candles (/v1/trades-kline), spot and futures summed.
trades_kline_spot@tf1440 candlesTrade candles, spot only (/v1/trades-kline/spot).
trades_kline_futures@tf1440 candlesTrade 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.

Response
{
  "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.

Response
{
  "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

CaseCode
symbol missing422
Unknown or disabled symbol422 with the list of active symbols
Multi-timeframe field without suffix, or the reverse422
Unknown timeframe422
Non-integer depth or below 1422 invalid_depth
Depth beyond the ceiling of the field422 depth_too_large
Depth beyond the history window of the plan403 with X-Deny-Reason: history_depth, and the maximum limit in error.message
Unknown key, or key repeated422 with the closest field suggested
Field of a family out of plannot 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.

403
{
  "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"
    }
  }
}