# BytNode API — full reference for LLMs > Generated from the OpenAPI contract v1.1.0 (https://api.bytnode.com/openapi.json). Examples are real responses captured on 2026-09-30T17:43:51Z. **BytNode is a crypto market-data API built for developers and AI agents.** One key gives you market data aggregated across the major crypto venues, derivatives positioning, order flow, options, macro, ETF and on-chain fundamentals — about 120 REST routes, a consolidated real-time WebSocket and a native MCP server, all behind one consistent contract. ## Why BytNode - **Aggregated across the major venues, not one exchange.** Spot and perpetual futures markets are consolidated into one number per metric: volumes are summed, rates are open-interest weighted, prices volume weighted — and the method is documented for every metric, with the number of contributing venues on every row (`venue_count`). - **Depth on the assets that matter.** 22 pairs: BTC, ETH, SOL, XRP, DOGE, BNB, TRX, SUI, HYPE, XLM, XMR, LINK, ADA, LTC, UNI, GRAM (ex-TON), AVAX, HBAR, NEAR, TAO, plus USDC and USDT spot pairs. This is a deliberate choice: together these assets are about 93 % of the total crypto market capitalisation (measured on 2026-09-30: 2.69 of 2.88 trillion USD), and each of them gets every family of data from every venue that lists it — quality and depth on the assets people actually trade, instead of thin coverage of thousands of tickers. - **Fourteen families in one API.** Prices and candles, individual trades, order book, order flow (CVD, VWAP, trade candles), funding, basis, open interest, long/short, liquidations and liquidation heatmap, tokenomics, sentiment, macro (FRED + intraday), spot ETF fundamentals (SEC EDGAR), options (OI, IV, max pain, greeks), Bitcoin network, Ethereum fundamentals, on-chain valuation, and 20 server-side technical indicators. Many providers sell these as separate products; here they share one key, one envelope and one set of conventions. - **Honest numbers.** Every bucketed value says whether it is final (`is_closed`); every multi-venue metric says how many venues contributed (`venue_count`, `coverage`); every empty answer says why (`unavailable`: `not_applicable`, `no_api_key`, `no_data`); every numeric field has a documented unit. - **Made for AI agents.** A native MCP server (3 tools, 73 fields), `llms.txt` and `llms-full.txt`, this OpenAPI contract with units and real examples, one-request snapshots of up to 61 fields, and stable machine-readable error codes. - **Priced for builders.** A free plan (10,000 requests/month), then Traders from 6.95 USD/month, Financial from 19.95 USD/month and Startup from 99.95 USD/month (billed yearly), with history depth and families growing with the plan. See https://bytnode.com/pricing. ## Quick start 1. Create a free key at https://bytnode.com/sign-up. 2. Send it in the `X-API-KEY` header: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT" ``` ## Conventions - **Envelope.** Every success is `{status: "ok", timestamp, data_type, data}`, plus the effective `symbol` and `timeframe` when the route has them. `data` is an object for "latest" routes and a list (most recent first) for `/history` routes; a few routes document another shape. - **Units.** `*_pct` = percent (58.5 = 58.5 %), `*_ratio` = fraction (0.585), `*_bps` = basis points, `*_usd` = USD. Prices are in the quote currency (USDT for BTCUSDT). Volumes and quantities (`volume`, `trade_volume`, `volume_delta`, `taker_buy`...) are in BASE ASSET units (BTC for BTCUSDT), never dollars. Every response schema carries each field's unit in `x-unit`. - **Time.** Timestamps are ISO 8601 UTC with milliseconds (`2026-09-28T14:00:00.000Z`); every timestamped object under `data` also carries `time`. Time bounds (`since_ms`, `until_ms`) are epoch MILLISECONDS, inclusive. - **Closed buckets.** Bucketed routes serve the last CLOSED bucket; `?live=1` adds the open one with `is_closed: false`. - **Strict parameters.** An undeclared or repeated parameter is a 422 with a suggestion (`limt` -> did you mean `limit`?). `?fields=a,b.c` projects `data`. - **Aggregation only.** No route discloses which venue a number came from, except the inter-venue spread, whose purpose is to compare venues. ## Errors Every error has one shape: ``` {"status": "error", "timestamp": 1790784447808, "error": {"code": "invalid_symbol", "message": "Unknown symbol 'BTCUSD'. Accepted values: ...", "param": "symbol"}, "detail": "Unknown symbol 'BTCUSD'. Accepted values: ..."} ``` Branch on `error.code` (stable, listed in the `Error` schema), show `error.message` (English). `detail` repeats the message for older clients. Plan refusals also carry an `X-Deny-Reason` header (`key`, `family`, `websocket`, `rate`, `quota`, `depth`); 429 and 503 carry `Retry-After`. ## Limits Each plan has a per-minute rate, a monthly quota and a history window per timeframe. Responses made with a metered key carry the IETF `RateLimit-Policy` and `RateLimit` headers. Going further back than your plan allows is a 403 `history_depth`, never a silently truncated answer. Details: https://bytnode.com/docs/rate-limits. ## Versioning The contract is `v1`. Adding routes, fields or parameters is not a breaking change. A breaking change is announced in the changelog (https://bytnode.com/docs/changelog) with notice by plan: Traders 30 days, Financial 60 days, Startup 90 days, Enterprise per contract. ## Links Docs https://bytnode.com/docs · Pricing https://bytnode.com/pricing · Full reference for LLMs https://bytnode.com/llms-full.txt · WebSocket `wss://api.bytnode.com/ws` · MCP `https://api.bytnode.com/mcp` · Contact contact@bytnode.com ## Error codes Stable machine-readable code. Branch on it, never on the message. - `depth_too_large`: A snapshot field depth exceeds its documented maximum. - `edge_rate_limited`: Too many simultaneous requests from this IP address (edge anti-flood). - `history_depth`: The requested history goes further back than your plan allows. - `insufficient_data`: Not enough history to compute the requested indicator. - `internal_error`: Unexpected server error. Not worth retrying immediately. - `invalid_api_key`: The API key is missing, invalid or revoked. - `invalid_asset`: The asset is not served by this family. The error lists the accepted values. - `invalid_depth`: A snapshot field depth is not a positive integer. - `invalid_exchange`: The exchange value is not accepted. - `invalid_indicator`: The POST /v1/indicators body is invalid (id, type or parameters). - `invalid_pair`: The pair value is not accepted. - `invalid_parameter`: A parameter has an invalid type or value. - `invalid_series`: The macro series does not exist. See the family's /series catalogue. - `invalid_symbol`: The symbol is not served. The error lists the accepted values (see /v1/symbols). - `invalid_time_period`: The timePeriod value is not accepted. - `invalid_time_range`: since_ms / until_ms are not valid epoch milliseconds, or since_ms >= until_ms. - `invalid_timeframe`: The timeframe is not accepted by this route. - `method_not_allowed`: The route exists but not with this HTTP method. - `missing_expiry`: The route needs an options expiry; the error lists the active ones. - `missing_parameter`: A required parameter is missing. - `not_applicable`: The request has no meaning for this asset (e.g. indicators on a stablecoin). - `not_found`: Unknown route. - `plan_family`: Your plan does not include this data family. - `plan_websocket`: Your plan does not include the WebSocket stream. - `quota_exceeded`: Your plan's monthly quota is exhausted. - `rate_limited`: Your plan's per-minute rate is exceeded. Retry after Retry-After seconds. - `repeated_parameter`: A parameter appears more than once. - `service_unavailable`: Temporary unavailability. Retry after Retry-After seconds. - `timeframe_not_served`: The series exists but does not serve this timeframe. - `unknown_field`: A ?fields= or snapshot field name does not exist. - `unknown_parameter`: The route does not declare this parameter. - `upstream_timeout`: The request took too long. Reduce the window or depth, then retry. ## 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/health — Service health Liveness of the API and its database. No key needed, counted for nobody. Example: ``` curl "https://api.bytnode.com/v1/health" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - 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 (array) — 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/status" ``` Response (real, trimmed): ```json {"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). Fields of data (array): - [].symbol (string) — Trading pair, e.g. `BTCUSDT`. - [].base_asset (string) — Base asset of the pair. - [].name (string) — Name. Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/symbols" ``` Response (real, trimmed): ```json {"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). Parameters: - symbol (path, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - 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 (array) — Derived metrics available for the symbol. - computed_metrics_blocked (object) — Derived metrics unavailable, with the missing feeds. Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/symbols/BTCUSDT/capabilities" ``` Response (real, trimmed): ```json {"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). Parameters: - symbol (query, required) — 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 (query) — Futures-spot basis (N latest minutes). Same content as `/v1/basis`. Value: depth N, or `true` for 1. - btc_fees (query) — Recommended Bitcoin fees. Same content as `/v1/btc/fees`. Value: depth N, or `true` for 1. - btc_mempool (query) — Bitcoin mempool. Same content as `/v1/btc/mempool`. Value: depth N, or `true` for 1. - btc_mining (query) — Mining pool concentration. Same content as `/v1/btc/mining`. Value: depth N, or `true` for 1. - btc_network (query) — Bitcoin network state. Same content as `/v1/btc/network`. Value: depth N, or `true` for 1. - buysell_ratio (query) — Buy/sell volume ratio. Same content as `/v1/buysell/ratio`. Value: depth N, or `true` for 1. - eth_defi (query) — Ethereum DeFi. Same content as `/v1/eth/defi`. Value: depth N, or `true` for 1. - eth_deflation (query) — ETH deflation. Same content as `/v1/eth/deflation`. Value: depth N, or `true` for 1. - eth_gas (query) — Ethereum gas. Same content as `/v1/eth/gas`. Value: depth N, or `true` for 1. - eth_gas_momentum (query) — Gas momentum. Same content as `/v1/eth/gas-momentum`. Value: depth N, or `true` for 1. - eth_ratio (query) — ETH/BTC ratio. Same content as `/v1/eth/ratio`. Value: depth N, or `true` for 1. - eth_squeeze (query) — ETH supply squeeze index. Same content as `/v1/eth/squeeze`. Value: depth N, or `true` for 1. - eth_staking (query) — ETH staking. Same content as `/v1/eth/staking`. Value: depth N, or `true` for 1. - eth_supply (query) — ETH supply and burn. Same content as `/v1/eth/supply`. Value: depth N, or `true` for 1. - fear_greed (query) — Crypto Fear & Greed Index. Same content as `/v1/fear-greed`. Value: depth N, or `true` for 1. - funding_cumulative (query) — Funding summed over 24 h. Same content as `/v1/funding/cumulative`. Value: depth N, or `true` for 1. - funding_next (query) — Next funding forecast. Same content as `/v1/funding/next`. Value: depth N, or `true` for 1. - funding_rate_8h (query) — Latest settled funding window. Same content as `/v1/funding/rate`. Value: depth N, or `true` for 1. - futures_ticks (query) — 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 (query) — Total crypto market cap and dominance. Same content as `/v1/global`. Value: depth N, or `true` for 1. - heatmap (query) — Liquidation heatmap clusters. Same content as `/v1/heatmap/clusters`. Value: depth N, or `true` for 1. - klines_15m (query) — 15-minute OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_1d (query) — Daily OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_1h (query) — 1-hour OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_1m (query) — 1-minute OHLCV candles (N candles). Same content as `/v1/raw/klines`. Value: depth N, or `true` for 1. - klines_1w (query) — Weekly OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_30m (query) — 30-minute OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_4h (query) — 4-hour OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - klines_5m (query) — 5-minute OHLCV candles (N candles). Same content as `/v1/raw/klines/{interval}`. Value: depth N, or `true` for 1. - liq_cumulative (query) — Liquidations long/short USD (N latest minutes). Same content as `/v1/liquidations/cumulative`. Value: depth N, or `true` for 1. - liq_ratio (query) — Big vs small liquidations. Same content as `/v1/liquidations/ratio`. Value: depth N, or `true` for 1. - liquidations (query) — Individual liquidations over the last N minutes. Same content as `/v1/raw/liquidations`. Value: depth N, or `true` for 1. - macro (query) — Latest value of every FRED series. Same content as `/v1/macro`. Value: depth N, or `true` for 1. - macro_correlations (query) — BTC correlation with DXY, S&P 500, gold, VIX. Same content as `/v1/macro/correlations`. Value: depth N, or `true` for 1. - macro_momentum (query) — Macro momentum score. Same content as `/v1/macro/momentum`. Value: depth N, or `true` for 1. - macro_risk (query) — Risk-on / risk-off score. Same content as `/v1/macro/risk`. Value: depth N, or `true` for 1. - net_liquidity (query) — US net liquidity. Same content as `/v1/macro/net-liquidity`. Value: depth N, or `true` for 1. - oi_delta (query) — Open interest change (N latest minutes). Same content as `/v1/oi/delta`. Value: depth N, or `true` for 1. - oi_history (query) — Total open interest per minute (N minutes). Same content as `/v1/raw/oi`. Value: depth N, or `true` for 1. - oi_snapshots (query) — Latest total open interest. Same content as `/v1/raw/oi`. Value: depth N, or `true` for 1. - onchain_active_addresses (query) — Bitcoin active addresses. Same content as `/v1/onchain/active-addresses`. Value: depth N, or `true` for 1. - onchain_miner_stress (query) — Bitcoin miner stress. Same content as `/v1/onchain/miner-stress`. Value: depth N, or `true` for 1. - onchain_mvrv (query) — Bitcoin MVRV. Same content as `/v1/onchain/mvrv`. Value: depth N, or `true` for 1. - onchain_nvt (query) — Bitcoin NVT. Same content as `/v1/onchain/nvt`. Value: depth N, or `true` for 1. - options (query) — Options market summary for the symbol's asset. Same content as `/v1/options/summary`. Value: depth N, or `true` for 1. - orderbook (query) — Latest aggregated order book. Same content as `/v1/raw/orderbook`. Value: depth N, or `true` for 1. - price_change (query) — Price change over 1m to 1w, in percent. Same content as `/v1/price-change`. Value: depth N, or `true` for 1. - spot_ticks (query) — 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 (query) — Taker buy/sell volume per minute (N minutes). Same content as `/v1/raw/taker-combined`. Value: depth N, or `true` for 1. - tokenomics (query) — Supply, market cap, FDV. Same content as `/v1/tokenomics`. Value: depth N, or `true` for 1. - trade_size (query) — Average trade size. Same content as `/v1/trades/avg-size`. Value: depth N, or `true` for 1. - trades_raw (query) — Trades aggregated per second (N seconds). Same content as `/v1/raw/trades`. Value: depth N, or `true` for 1. - vwap (query) — Intraday VWAP (N latest minutes). Same content as `/v1/vwap`. Value: depth N, or `true` for 1. - @ (query) — multi-timeframe fields: cvd, vwap_window, orderbook_aggregated, spread_interexchange, trade, trade_spot, trade_future, ls_ratio, with tf in 1m, 5m, 15m, 30m, 1h, 4h, 1d (no 1m for ls_ratio). Fields of data (object): - funding_rate_8h (object) - funding_rate_8h.time (string) [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 (string) [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 (array) - basis[].time (string) [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 (string) [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 (string) [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 (string) [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 (array) - cvd@1h[].time (string) [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 (string) [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 (array) [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: ``` 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" ``` Response (real, trimmed): ```json {"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.6718699999959,"taker_buy_volume":14950.270559999979,"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. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/orderbook/aggregated?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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.13756999999998,"imbalance_avg":0.11016540017034959,"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`. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/orderbook/aggregated/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.13756999999998,"imbalance_avg":0.11016540017034959,"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.38886771881931853,"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/price-change?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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.10699171417461885,"30m":-0.3125685782578008,"1h":-0.3084296187335405,"4h":-0.588380795309514,"1d":1.0557960557960557,"1w":-0.11648995477678913}}} ``` ### GET /v1/raw/futures-ticks — Individual futures trades Raw perpetual futures executions across venues, most recent first. Kept 72 hours. Parameters: - limit (query, default 100, max 10000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/futures-ticks?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.1092000000001},{"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 60, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/klines?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.033891349999985,"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`. Parameters: - interval (path, required) — Candle interval in the path: `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `1d` or `1w`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/klines/1h?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.3496877999999,"taker_sell":1609.0977006966007,"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.0480467899947,"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`. Parameters: - limit (query, default 30, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/oi?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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). Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/orderbook?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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. Parameters: - limit (query, default 100, max 10000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/spot-ticks?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.9992663990000001},{"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`. Parameters: - limit (query, default 30, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/taker-combined?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.69762000000007,"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`. Parameters: - limit (query, default 60, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/trades?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.17200000000000001},{"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`. Parameters: - min_usd (query, default 100000) — Minimum notional in USD (default 100000, minimum 1000). - limit (query, default 50, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/trades/large?symbol=BTCUSDT&min_usd=100000&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/buysell/ratio?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/buysell/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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 (array) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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 (array) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/cvd/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.6718699999959,"taker_buy_volume":14950.270559999979,"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.9060600000167],"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. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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 (array) — 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/spread/interexchange?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 30, max 500) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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 (array) — 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/spread/interexchange/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.4377509153696106},{"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_ … ``` ### 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. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default false) — `1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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.030507578690431178,"trade_avg_buy":0.028389836265600935,"trade_avg_sell":0.03280565023807613,"trade_volume":20600.79164713008,"trade_volume_buy":9976.813040130011,"trade_volume_sell":10623.978607000001,"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). Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Measurement instant (start of the bucket for aggregated rows). Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/avg-size?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/avg-size/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default false) — `1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/future?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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.045230935747880084,"trade_avg_buy":0.04340942456327149,"trade_avg_sell":0.04705874468895452,"trade_volume":18320.564370000087,"trade_volume_buy":8806.556780000014,"trade_volume_sell":9514.007590000001,"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`. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/future/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.045230935747880084,"trade_avg_buy":0.04340942456327149,"trade_avg_sell":0.04705874468895452,"trade_volume":18320.564370000087,"trade_volume_buy":8806.556780000014,"trade_volume_sell":9514.007590000001,"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.978459999933,"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.0517048959 … ``` ### 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`. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.030507578690431178,"trade_avg_buy":0.028389836265600935,"trade_avg_sell":0.03280565023807613,"trade_volume":20600.79164713008,"trade_volume_buy":9976.813040130011,"trade_volume_sell":10623.978607000001,"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" … ``` ### 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. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default false) — `1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/spot?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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.009122574581049201,"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`. Parameters: - symbol (query, required) — 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 (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/trades/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.009122574581049201,"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.009180208129305853,"trade_volume":3350.4473884966014,"trade_volume_buy":1741.3496877999996,"trade_volume_sell":1609.0977006966007,"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.009508371415036425,"trade_avg_sell":0.010 … ``` ### GET /v1/vwap — Intraday VWAP Volume-weighted average price since 00:00 UTC, across venues. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Measurement instant (start of the bucket for aggregated rows). Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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.89329999924,"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. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/window?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, required) — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/vwap/window/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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). Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Measurement instant (start of the bucket for aggregated rows). Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/basis?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/basis/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/cumulative?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/cumulative/history?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/next?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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. Parameters: - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/funding/rate/history?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - timeframe (query, required) — `5m`, `15m`, `30m`, `1h`, `4h` or `1d` — no `1m`: no venue publishes a 1-minute account ratio. - live (query, default 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 (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/ls-ratio?symbol=BTCUSDT&timeframe=1h" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, required) — `5m`, `15m`, `30m`, `1h`, `4h` or `1d` — no `1m`: no venue publishes a 1-minute account ratio. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 30, max 500) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/ls-ratio/history?symbol=BTCUSDT&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Measurement instant (start of the bucket for aggregated rows). Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/oi/delta?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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.0018668811934142138,"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/oi/delta/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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.4657000000007,"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/heatmap/clusters?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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.010584555024925807,"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/heatmap/clusters/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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.4432528637559465,"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.039996657494672884,"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/cumulative?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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.637600000002,"total_usd":24959.637600000002}} ``` ### GET /v1/liquidations/cumulative/history — Cumulative liquidations history Per minute, or per bucket with `timeframe`. Most recent first. Page backwards with `until_ms`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/cumulative/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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. Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Measurement instant (start of the bucket for aggregated rows). Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/ratio?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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.637600000002,"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - timeframe (query) — Optional. With it, rows are aggregated per bucket and carry `is_closed`; without it, one row per minute. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/liquidations/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h" ``` Response (real, trimmed): ```json {"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.9821800003,"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`. Parameters: - limit (query, default 30, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - min_usd (query) — Optional minimum notional in USD. With it, `limit` counts events; without it, `limit` is a look-back in minutes. - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/raw/liquidations?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.637600000002},{"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). Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/fear-greed" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/fear-greed/history?limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/global" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/global/history?limit=3" ``` Response (real, trimmed): ```json {"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). Parameters: - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/tokenomics?symbol=BTCUSDT" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 1000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - symbol (query, required) — Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. An unknown pair returns 400 `invalid_symbol` with the accepted list. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/tokenomics/history?symbol=BTCUSDT&limit=3" ``` Response (real, trimmed): ```json {"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.5999,"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). Parameters: - series (query) — FRED series id (e.g. `DGS10`). Omit to get the latest value of EVERY active series. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro?series=DGS10" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/correlations" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 100, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - series (query, required) — FRED series id, e.g. `DGS10`, `CPIAUCSL`, `WALCL`. The list: `GET /v1/macro/series`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/history?series=DGS10&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 500, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - series (query, required) — 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 (query, default "1h") — Candle size. Optional, default `1h`. Each series serves only the timeframes listed in its catalogue entry; others return 400 `timeframe_not_served`. Fields of data (object): - series (string) — Series identifier. - timeframe (string) — Bucket size of the row. - candles (array) — OHLCV candles, most recent first. - candles[].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/intraday/history?series=EURUSD&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (array): - [].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 (array) — Timeframes natively collected for the series. - [].depth_start (string) [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 (string) - [].last_candle.5m (string) - [].last_candle.15m (string) - [].last_candle.1h (string) - [].last_candle.4h (string) - [].last_candle.1d (string) Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/intraday/series" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - 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 (array) — 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 (array) — 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/momentum" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - 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 (string) [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 (string) [calendar date (YYYY-MM-DD)] — Calendar day the value refers to. - components.tga (object) - components.tga.time (string) [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 (string) [calendar date (YYYY-MM-DD)] — Calendar day the value refers to. - components.rrp (object) - components.rrp.time (string) [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 (string) [calendar date (YYYY-MM-DD)] — Calendar day the value refers to. Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/net-liquidity" ``` Response (real, trimmed): ```json {"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`. Parameters: - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 180, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/net-liquidity/history?limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/risk" ``` Response (real, trimmed): ```json {"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. Parameters: - category (query) — Filter by category, e.g. `rates`, `inflation`, `liquidity`, `commodities`. Fields of data (array): - [].time (string) [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 (string) [calendar date (YYYY-MM-DD)] — Calendar day the value refers to. - [].value (number|null) [dimensionless score] — Value of the series. Example: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/macro/series" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [calendar date (YYYY-MM-DD)] — End of the reporting period of the filing. - [].balance_date (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/etf/fundamentals?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - ticker (query) — ETF ticker (e.g. `IBIT`, `FBTC`). Omit for every issuer. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 2000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [calendar date (YYYY-MM-DD)] — End of the reporting period of the filing. - [].ticker (string) — ETF ticker. - [].issuer (string) — ETF issuer. - [].balance_date (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/etf/fundamentals/history?asset=BTC&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].expiry (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/expiry?asset=BTC" ``` Response (real, trimmed): ```json {"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.361844316640262,"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/greeks?asset=BTC" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv/history?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/iv/klines?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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.580000000000002,"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].expiry (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/max-pain?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - expiry (query) — REQUIRED. Expiry date `YYYY-MM-DD`. Missing: 422 `missing_expiry`, and the error lists the active expiries. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` 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" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi?asset=BTC" ``` Response (real, trimmed): ```json {"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. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/delta?asset=BTC&timeframe=1h" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/delta/history?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - expiry (query) — Restrict to one expiry (`YYYY-MM-DD`). Omit for every active expiry. - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].expiry (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/distribution?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/oi/history?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/pc-ratio?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/pc-ratio/history?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/summary?asset=BTC" ``` Response (real, trimmed): ```json {"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. Parameters: - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/volume?asset=BTC" ``` Response (real, trimmed): ```json {"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`. Parameters: - timeframe (query, default "1h") — Bucket size: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Other values: 422 `invalid_timeframe` with the accepted list. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 200, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). - asset (query, default "BTC") — Asset, e.g. `BTC` or `ETH` (no quote currency). Unknown: 400 `invalid_asset`. Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/options/volume/history?asset=BTC&timeframe=1h&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/fees" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `24h`, `1w`, `1mo` (one month), `3m`, `6m`, `1y`. `1m` also means ONE MONTH here (legacy spelling); prefer `1mo`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 300, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/fees/history?timePeriod=1w&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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 (array) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mempool" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `24h`, `1w`, `1mo` (one month), `3m`, `6m`, `1y`. `1m` also means ONE MONTH here (legacy spelling); prefer `1mo`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 300, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mempool/history?timePeriod=1w&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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 (array) — 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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mining" ``` Response (real, trimmed): ```json {"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`. Parameters: - dataset (query, default "concentration") — Which mining series to return: `concentration` (pool shares), `rewards` (block rewards), `difficulty` or `fee_rates`. - timePeriod (query) — Named window: `24h`, `1w`, `1mo` (one month), `3m`, `6m`, `1y`. `1m` also means ONE MONTH here (legacy spelling); prefer `1mo`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 300, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/mining/history?dataset=concentration&timePeriod=1w&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/network" ``` Response (real, trimmed): ```json {"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.9154929577464372,"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`. Parameters: - timePeriod (query) — Named window: `24h`, `1w`, `1mo` (one month), `3m`, `6m`, `1y`. `1m` also means ONE MONTH here (legacy spelling); prefer `1mo`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 300, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/btc/network/history?timePeriod=1w&limit=3" ``` Response (real, trimmed): ```json {"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.09566181271543073}]} ``` ## 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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/defi" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/defi/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/deflation" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/deflation/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas-momentum" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas-momentum/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/gas/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/ratio" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/ratio/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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.44052412357081827,"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/squeeze" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/squeeze/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/staking" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/staking/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/supply" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `7d`, `30d`, `90d`, `1y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/eth/supply/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/active-addresses" ``` Response (real, trimmed): ```json {"status":"ok","timestamp":1790790309629,"data_type":"onchain_active_addresses","data":{"time":"2026-09-28","date":"2026-09-28","active_addresses":491198,"avg_7d":477345.85714285716,"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`. Parameters: - timePeriod (query) — Named window: `30d`, `90d`, `1y`, `2y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/active-addresses/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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.85714285716,"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. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/miner-stress" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `30d`, `90d`, `1y`, `2y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/miner-stress/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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.1729458119182406e-7,"zone":"healthy"},{"time":"2026-09-27","date":"2026-09-27","miner_stress":3.0790386080647216e-7,"stress_ma30":3.1533250230665984e-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. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/mvrv" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `30d`, `90d`, `1y`, `2y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/mvrv/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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.883720930232549},{"time":"2026-09-21","date":"2026-09-21","mvrv":1.6366,"zone":"fair","momentum_30d_pct":11.477419794291949}]} ``` ### GET /v1/onchain/nvt — Bitcoin NVT Network value to transactions ratio and its 90-day NVT Signal, derived on demand. Daily. Fields of data (object): - time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/nvt" ``` Response (real, trimmed): ```json {"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`. Parameters: - timePeriod (query) — Named window: `30d`, `90d`, `1y`, `2y` or `all`. - since_ms (query) — Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`. - until_ms (query) — Upper time bound, INCLUSIVE, in epoch milliseconds. To page backwards, pass the oldest `time` you received minus 1 ms (see the pagination guide). - limit (query, default 365, max 5000) — Number of rows to return, most recent first. Also bounded by your plan's history window (403 `history_depth` beyond it). Fields of data (array): - [].time (string) [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 (string) [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: ``` curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/onchain/nvt/history?timePeriod=30d&limit=3" ``` Response (real, trimmed): ```json {"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, }` — 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`. Fields of data (object): - 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 (string) [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 (array) [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 (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Time of the candle of the last value. - indicators.macd (object) - indicators.macd.time (string) [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 (array) - indicators.macd.values.signal (array) [candles] — MACD signal period, in candles. - indicators.macd.values.histogram (array) - indicators.macd.as_of (string) [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 (string) [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 (array) - indicators.bb_mid.values.middle (array) - indicators.bb_mid.values.lower (array) - indicators.bb_mid.as_of (string) [ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)] — Time of the candle of the last value. Example: ``` 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 ``` Response (real, trimmed): ```json {"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.84023958968447],"histogram":[119.43531138458573,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"}}}} ```