{
 "openapi": "3.1.0",
 "info": {
  "title": "BytNode Crypto Market Data API",
  "version": "2.2.0",
  "summary": "Crypto market data aggregated across the major venues, derivatives, order flow, options, macro, ETF and on-chain — for developers and AI agents.",
  "description": "**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 — 129 REST routes, a consolidated real-time WebSocket and a native MCP server, all behind one consistent contract.\n\n## Why BytNode\n\n- **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.\n- **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.\n- **Twelve data families in one API.** Prices and candles, individual trades, order book, order flow (CVD, trade candles), funding, basis, open interest, 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 19 server-side technical indicators. Many providers sell these as separate products; here they share one key, one envelope and one set of conventions.\n- **Honest numbers.** Every bucketed or history row says whether it is final (`is_closed`); every empty answer says why (`unavailable`: `not_applicable`, `no_api_key`, `no_data`); every numeric field has a documented unit.\n- **Made for AI agents.** A native MCP server (3 tools, 60 fields), `llms.txt` and `llms-full.txt`, this OpenAPI contract with units and real examples, one-request snapshots of up to 48 fields, and stable machine-readable error codes.\n- **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. Each operation names its data family in `x-family` (the identifiers `GET /v1/limits` returns for your key); `x-metered: false` marks the routes that are never counted.\n\n## Quick start\n\n1. Create a free key at https://bytnode.com/sign-up.\n2. Send it in the `X-API-KEY` header:\n\n```\ncurl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT\"\n```\n\n## Conventions\n\n- **Envelope.** Every success is `{status: \"ok\", server_time, data_type, data}`, plus the effective `symbol`, `timeframe`, `asset`, `series` or `market` when the route has them. The shape of `data` follows the path: an OBJECT (or `null`) for the latest value of a metric; a LIST (most recent first, or oldest first with `order=asc`) for every `/history` route and every series route — `/v1/klines`, `/v1/trades/{spot,futures,large}`, `/v1/trades-kline/futures/seconds`, `/v1/liquidations/events`, which are series by nature (candles, trades, events, one row per second). A `/history` envelope gives the step of its rows in `timeframe` when that step is fixed, even if the route takes no `timeframe` parameter (`1d` for a daily series, `8h` for funding: a step, not a value to send back). Collections are lists too: `/v1/symbols`, `/v1/etf/fundamentals`, `/v1/macro/series`, `/v1/macro/intraday/series`, and the options expiry, max-pain and OI distribution routes. A field that can be `null` is typed so in the schema; any other field is never `null`.\n- **Units.** `*_pct` = percent (58.5 = 58.5 %), `*_ratio` = a dimensionless quotient (a share of a whole is a fraction, 0.585 = 58.5 %; `put_call_ratio` 1.2 = 1.2 puts per call), `*_bps` = basis points, `*_usd` = USD (every USD amount ends in `_usd`), `*_s` = seconds, `*_pp` = percentage points. Prices, and price differences such as `basis_value`, are in the quote currency (USDT for BTCUSDT). Volumes and quantities (`volume`, `buy_volume`, `sell_volume`, `net_volume`, `oi`...) are in BASE ASSET units (BTC for BTCUSDT), never dollars: a quantity OF AN ASSET without a unit suffix is in base asset units; any other measure (virtual bytes, difficulty, block height, index points) states its unit in `x-unit`. A name without a market suffix covers EVERY market of the route: on a candle, `volume` is spot + perpetual futures, `volume_spot` and `volume_futures` one market each. Every response schema carries each field's unit in `x-unit`. Numbers are rounded to 12 significant digits.\n- **Names.** One concept has one name on every route, in the snapshot, in the MCP and on the WebSocket: `buy_volume` / `sell_volume` / `net_volume`, `trade_count`, `sample_count`, booleans `is_*`, a qualitative reading `label`, instants `*_at`, durations `*_s`; the perpetual market is `futures` everywhere. A TRADE is one execution (`/v1/trades/spot`, `/v1/trades/futures`, WebSocket `trades.*`); the candles aggregated from trades are `trades_kline` (`/v1/trades-kline`). `data_type` is the route's own name (`/v1/trades/avg-size/history` -> `trades_avg_size_history`), and a snapshot field is named after the route that serves the same data (`liquidations_cumulative`, `trades_kline@1h`). Every retired name and its replacement is listed in `x-renamed` at the root of this contract.\n- **Market in the path.** A route that serves several markets takes the market as a path suffix: no suffix = every market (spot + perpetual futures), `/spot`, `/futures` (`/v1/cvd`, `/v1/cvd/spot`, `/v1/cvd/futures`; the same for `/v1/buysell/ratio`, `/v1/trades/avg-size`, `/v1/orderbook`, `/v1/trades-kline`). The envelope repeats it in `market`. A route on ONE market says it in its path or its description and repeats it in `market` too: `/v1/trades/large` (large trades are perpetual futures trades), `/v1/trades-kline/futures/seconds`.\n- **Time.** Timestamps are ISO 8601 UTC with milliseconds (`2026-09-28T14:00:00.000Z`). `time` is the canonical key: every timestamped object under `data` carries it. It follows ONE of two rules, and the description of `time` on each route says which. (1) A row of a BUCKETED series (candles, trade candles, CVD, order book per bucket, funding per 8-hour period, every `/history` read with `timeframe`) is dated at the START of its bucket. (2) A POINT-IN-TIME value is dated at the instant it refers to: the END of a rolling window (`/v1/buysell/ratio`, `/v1/liquidations/cumulative`, `/v1/oi/delta`), the instant of the computation (`/v1/basis`), the instant the SOURCE states (options, BTC, ETH, tokenomics; `/v1/global`, which may end in `.999`), the settlement a forecast is for (`/v1/funding/next`), the EVENT (trades, large trades, liquidations), and the most recent input of a composite (`/v1/macro/correlations`, `/momentum`, `/risk`, which also give `oldest_input_date` and a `time` per component). A daily value is dated at midnight UTC. The envelope's `server_time` is the time of the response. Time bounds (`since_ms`, `until_ms`) are epoch MILLISECONDS, inclusive.\n- **Closed buckets.** Bucketed routes serve the last CLOSED bucket; `?live=1` adds the open one with `is_closed: false`. Every `/history` row carries `is_closed`. A latest value computed over a rolling window (buy/sell ratio, cumulative liquidations, open-interest change, cumulative funding) or read on the latest closed minute (`/v1/trades/avg-size`, `/v1/liquidations/ratio`) is always final and carries no `is_closed`; `window_start` and `window_s` give its window.\n- **Pagination.** A paged response carries `next`: the relative URL of the following page, ready to call (`/v1/klines?symbol=BTCUSDT&timeframe=1h&limit=100&before_ms=…`), or `null` once the range is read. Loop `while next: GET base + next`; it never repeats a row.\n- **Freshness.** A response is never more than 1 second old (`Cache-Control: private, max-age=1`). `x-update-frequency-seconds` on each operation says how often the SOURCE changes — from 2 s (trades) to 5 min (daily macro, on-chain, ETF series): polling faster than that returns the same values.\n- **Strict parameters.** An undeclared or repeated parameter is a 422 with a suggestion (`limt` -> did you mean `limit`?), and so is an unknown value of a closed set (`symbol`, `asset`, `series`, `timeframe`, `category`, `ticker`, `expiry`…), with the accepted values. `symbol`, `asset`, `series`, `timeframe` and `order` are case-insensitive (`1M` excepted: elsewhere a month, here refused). `?fields=a,b.c` projects `data` (not on `POST /v1/indicators`, which takes no query parameter).\n- **Aggregation only.** No route discloses which venue a number came from, except the inter-venue spread, whose purpose is to compare venues.\n- **Browsers and probes.** The REST API answers CORS (`Access-Control-Allow-Origin: *`, the `X-API-KEY` header allowed, preflight `OPTIONS` without a key) and `HEAD` on every `GET` route. A key used in a web page is readable by its visitors: use a dedicated key there.\n\n## Errors\n\nEvery error has one shape:\n\n```\n{\"status\": \"error\", \"server_time\": \"2026-09-30T14:07:27.808Z\",\n \"error\": {\"code\": \"invalid_symbol\", \"message\": \"Unknown symbol 'BTCUSD'. Accepted values: ...\", \"param\": \"symbol\"}}\n```\n\nBranch on `error.code` (stable, listed in the `ApiError` schema), show `error.message` (English). Plan refusals also carry an `X-Deny-Reason` header (`key`, `family`, `websocket`, `rate`, `quota`, `depth`); 429 and 503 carry `Retry-After`.\n\n## Limits\n\nEach 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.\n\n## Versioning\n\nThe URL prefix `/v1` is the API generation. `info.version` is the revision of THIS contract, in semantic versioning: a MINOR increment adds (a route, a field, a parameter, an accepted value), a MAJOR increment removes, renames or changes a meaning. Every response carries it in the `BytNode-Contract-Version` header, so a client detects a new contract without re-reading it. 2.0.0 (2026-10-12) covers the renamings published from 2026-10-09 to 2026-10-12 under 1.2.0; 2.1.0 (2026-10-13) only adds (exact schemas with `required`, every variant of a route, shared enums, `x-family`, the 500 and 504 responses; no name removed or renamed); 2.2.0 (2026-10-13) adds fields the API serves (`time` on the options expiry, max-pain and OI distribution rows, `window_start` and `window_s` on the OI change, liquidation ratio and trade size histories, `label` on the put/call history). Any change of this contract now changes its version. Every retired name and its replacement is in `x-renamed`, the removal date of each route, parameter and snapshot field in `x-removed-on`, and a retired name answers with an error that names its replacement and the date. The guide: https://bytnode.com/docs/versioning. 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.\n\n## Links\n\nDocs 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\n",
  "license": {
   "name": "Proprietary: BytNode terms of service",
   "url": "https://bytnode.com/terms"
  },
  "contact": {
   "name": "BytNode",
   "url": "https://bytnode.com",
   "email": "contact@bytnode.com"
  }
 },
 "externalDocs": {
  "description": "Guides, conventions and pricing",
  "url": "https://bytnode.com/docs"
 },
 "servers": [
  {
   "url": "https://api.bytnode.com",
   "description": "Production"
  }
 ],
 "tags": [
  {
   "name": "System",
   "description": "Health, per-feed freshness, the list of served symbols and what each symbol supports. `/v1/health` is the only route that needs no key."
  },
  {
   "name": "Snapshot",
   "description": "One request, up to 48 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=1`, or `true` for depth 1); multi-timeframe fields are `name@tf=depth` (`klines@1h=24`, `cvd@1h=24`). Call it with only `symbol` to list the fields your plan includes."
  },
  {
   "name": "Market: prices & volumes",
   "description": "OHLCV candles, individual trades, price change and the aggregated order book. OHLC comes from one reference spot market per symbol; a candle's `volume` covers spot and perpetual futures, `volume_spot` and `volume_futures` one market each."
  },
  {
   "name": "Order flow",
   "description": "Who is buying and who is selling: trade candles (`trades-kline`: spot, futures, combined), CVD, buy/sell ratio, average trade size and inter-venue spread. Every bucketed series says whether the value is final (`is_closed`)."
  },
  {
   "name": "Derivatives",
   "description": "Perpetual futures positioning, aggregated across venues: funding (settled, estimated, cumulative), basis, open interest."
  },
  {
   "name": "Liquidations",
   "description": "Forced liquidations across venues: individual events, cumulative long/short USD, big vs small liquidations, and the liquidation heatmap clusters the price is drawn to."
  },
  {
   "name": "Tokenomics & sentiment",
   "description": "Supply, market cap and FDV derived from the live price; total crypto market cap and dominance; the Crypto Fear & Greed Index."
  },
  {
   "name": "Macro",
   "description": "Daily FRED series (rates, inflation, liquidity, commodities, the VIX, US indices), intraday macro candles (ICE dollar index, EUR/USD, USD/JPY, gold, WTI oil), and derived crypto-macro signals: net liquidity, BTC correlations, macro momentum, risk-on/risk-off score."
  },
  {
   "name": "ETF",
   "description": "Spot BTC and ETH ETF fundamentals per issuer, anchored on SEC EDGAR filings: shares, NAV, net assets and coins held."
  },
  {
   "name": "Options",
   "description": "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."
  },
  {
   "name": "Bitcoin network",
   "description": "Bitcoin chain state: recommended fees, mempool, mining pool concentration, difficulty and the next adjustment."
  },
  {
   "name": "Ethereum",
   "description": "Ethereum fundamentals: gas, supply and burn, staking and yield, DeFi TVL, ETH/BTC ratio and derived signals (deflation, supply squeeze, gas momentum)."
  },
  {
   "name": "On-chain Bitcoin",
   "description": "Daily on-chain valuation and activity: MVRV, NVT, active addresses, miner stress."
  },
  {
   "name": "Technical indicators",
   "description": "19 technical indicators computed server-side on the same candles as `/v1/klines`, several per request (RSI, MACD, Bollinger, ATR, Ichimoku...)."
  }
 ],
 "components": {
  "schemas": {
   "ApiError": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "error"
    ],
    "properties": {
     "status": {
      "type": "string",
      "enum": [
       "error"
      ]
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "error": {
      "type": "object",
      "required": [
       "code",
       "message"
      ],
      "properties": {
       "code": {
        "type": "string",
        "enum": [
         "depth_too_large",
         "edge_rate_limited",
         "history_depth",
         "insufficient_data",
         "internal_error",
         "invalid_api_key",
         "invalid_asset",
         "invalid_channel",
         "invalid_depth",
         "invalid_indicator",
         "invalid_message",
         "invalid_parameter",
         "invalid_series",
         "invalid_symbol",
         "invalid_time_range",
         "invalid_timeframe",
         "method_not_allowed",
         "missing_expiry",
         "missing_parameter",
         "not_applicable",
         "not_authenticated",
         "not_found",
         "plan_family",
         "plan_websocket",
         "quota_exceeded",
         "rate_limited",
         "repeated_parameter",
         "service_unavailable",
         "timeframe_not_served",
         "unknown_field",
         "unknown_parameter",
         "upstream_timeout"
        ],
        "description": "Stable machine-readable code. Branch on it, never on the message.\n\n- `depth_too_large`: A snapshot field depth exceeds its documented maximum.\n- `edge_rate_limited`: Too many requests from this IP address at the edge (anti-flood: 20 per second per address, bursts of 40). Retry after 1 second.\n- `history_depth`: The requested history goes further back than your plan allows.\n- `insufficient_data`: Not enough history to compute the requested indicator.\n- `internal_error`: Unexpected server error. A retry with backoff may succeed; if it persists, report it with the response's X-Request-Id header.\n- `invalid_api_key`: The API key is missing, invalid or revoked.\n- `invalid_asset`: The asset is not served by this family. The error lists the accepted values.\n- `invalid_channel`: WebSocket: the channel name is malformed or unknown; the error lists the accepted forms.\n- `invalid_depth`: A snapshot field depth is not a positive integer.\n- `invalid_indicator`: The POST /v1/indicators body is invalid (id, type or parameters).\n- `invalid_message`: WebSocket: the message is not a readable JSON object.\n- `invalid_parameter`: A parameter has an invalid type or value.\n- `invalid_series`: The macro series does not exist. See the family's /series catalogue.\n- `invalid_symbol`: The symbol is not served. The error lists the accepted values (see /v1/symbols).\n- `invalid_time_range`: since_ms / until_ms are not valid epoch milliseconds, or since_ms > until_ms (until_ms is inclusive).\n- `invalid_timeframe`: The timeframe is not accepted by this route.\n- `method_not_allowed`: The route exists but not with this HTTP method.\n- `missing_expiry`: The route needs an options expiry; the error lists the active ones.\n- `missing_parameter`: A required parameter is missing.\n- `not_applicable`: WebSocket: the channel has no meaning for this asset (a futures channel of a stablecoin). The REST API answers such a request with 200 and `unavailable: not_applicable`.\n- `not_authenticated`: WebSocket: a message other than auth arrived on a session not yet authenticated (residual: the key is checked at the handshake, where a missing key answers 401 invalid_api_key).\n- `not_found`: Unknown route.\n- `plan_family`: Your plan does not include this data family: the message names it, and GET /v1/limits lists the families of your key.\n- `plan_websocket`: Your plan does not include the WebSocket stream.\n- `quota_exceeded`: Your plan's monthly quota is exhausted. Retry-After (and retry_after) give the seconds until it resets, on the first day of the month (UTC).\n- `rate_limited`: Your plan's per-minute rate is exceeded. Retry after Retry-After seconds.\n- `repeated_parameter`: A parameter appears more than once.\n- `service_unavailable`: Temporary unavailability. Retry after Retry-After seconds.\n- `timeframe_not_served`: The series exists but does not serve this timeframe (a daily-only series asked in 1h). A timeframe the route never serves is invalid_timeframe.\n- `unknown_field`: A ?fields= or snapshot field name does not exist.\n- `unknown_parameter`: The route does not declare this parameter.\n- `upstream_timeout`: The request took too long. Reduce the window or depth, then retry."
       },
       "message": {
        "type": "string",
        "description": "Human-readable explanation, in English."
       },
       "param": {
        "type": "string",
        "description": "The parameter at fault, when there is one."
       },
       "details": {
        "description": "Structured complement (e.g. every validation error)."
       }
      }
     },
     "retry_after": {
      "type": "integer",
      "description": "Seconds to wait (429 and 503 only).",
      "x-unit": "seconds"
     }
    }
   },
   "Asset": {
    "type": "string",
    "enum": [
     "BTC",
     "ETH"
    ],
    "x-enum-varnames": [
     "BTC",
     "ETH"
    ],
    "description": "Underlying asset of the options and spot ETF routes."
   },
   "Basis": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the venue prices used (each venue's last futures and spot trades, at most 2 minutes old).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "basis_value": {
      "type": "number",
      "description": "Futures price - spot price, in the quote currency (USDT for BTCUSDT), like the two prices.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "basis_pct": {
      "type": "number",
      "description": "(futures - spot) / spot, in percent. Positive = contango.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "futures_price": {
      "type": "number",
      "description": "Perpetual futures price, open-interest weighted across venues.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "spot_price": {
      "type": "number",
      "description": "Spot price across venues.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     }
    },
    "required": [
     "time",
     "basis_value",
     "basis_pct",
     "futures_price",
     "spot_price"
    ]
   },
   "BasisHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket of `timeframe`; the value is the LAST one of the bucket's minutes.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "basis_value": {
      "type": "number",
      "description": "Futures price - spot price, in the quote currency (USDT for BTCUSDT), like the two prices.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "basis_pct": {
      "type": "number",
      "description": "(futures - spot) / spot, in percent. Positive = contango.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "futures_price": {
      "type": "number",
      "description": "Perpetual futures price, open-interest weighted across venues.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "spot_price": {
      "type": "number",
      "description": "Spot price across venues.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "basis_value",
     "basis_pct",
     "futures_price",
     "spot_price",
     "sample_count",
     "is_closed"
    ]
   },
   "BasisHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "basis_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BasisHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BasisResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "basis",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Basis"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcFees": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "fastest_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for the next block.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "half_hour_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for confirmation within ~30 minutes.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "hour_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for confirmation within ~1 hour.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "economy_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for a low-priority confirmation.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "minimum_fee_sat_vb": {
      "type": "integer",
      "description": "Minimum relay fee rate.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "precise": {
      "type": "object",
      "properties": {
       "fastest_fee_sat_vb": {
        "type": "number",
        "description": "Fee rate for the next block.",
        "x-unit": "satoshis per virtual byte (sat/vB)"
       },
       "half_hour_fee_sat_vb": {
        "type": "number",
        "description": "Fee rate for confirmation within ~30 minutes.",
        "x-unit": "satoshis per virtual byte (sat/vB)"
       },
       "hour_fee_sat_vb": {
        "type": "number",
        "description": "Fee rate for confirmation within ~1 hour.",
        "x-unit": "satoshis per virtual byte (sat/vB)"
       },
       "economy_fee_sat_vb": {
        "type": "number",
        "description": "Fee rate for a low-priority confirmation.",
        "x-unit": "satoshis per virtual byte (sat/vB)"
       },
       "minimum_fee_sat_vb": {
        "type": "number",
        "description": "Minimum relay fee rate.",
        "x-unit": "satoshis per virtual byte (sat/vB)"
       }
      },
      "description": "Same fee rates, unrounded."
     },
     "fee_pressure": {
      "type": "object",
      "properties": {
       "ratio": {
        "type": [
         "number",
         "null"
        ],
        "description": "fastest / economy fee rate.",
        "x-unit": "dimensionless ratio"
       },
       "label": {
        "type": "string",
        "description": "Fee pressure: `normal` (ratio <= 2), `elevated` (> 2) or `congested` (> 5)."
       }
      },
      "description": "`ratio` = fastest / economy fee rate, and its `label`: `normal` (<= 2), `elevated` (> 2), `congested` (> 5)."
     }
    },
    "required": [
     "time",
     "fastest_fee_sat_vb",
     "half_hour_fee_sat_vb",
     "hour_fee_sat_vb",
     "economy_fee_sat_vb",
     "minimum_fee_sat_vb",
     "precise",
     "fee_pressure"
    ]
   },
   "BtcFeesHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Without `timeframe`: the instant of the reading. With `timeframe`: start of the bucket, the value being its LAST reading.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "fastest_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for the next block.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "half_hour_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for confirmation within ~30 minutes.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "hour_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for confirmation within ~1 hour.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "economy_fee_sat_vb": {
      "type": "integer",
      "description": "Fee rate for a low-priority confirmation.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "minimum_fee_sat_vb": {
      "type": "integer",
      "description": "Minimum relay fee rate.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "fastest_fee_sat_vb",
     "half_hour_fee_sat_vb",
     "hour_fee_sat_vb",
     "economy_fee_sat_vb",
     "minimum_fee_sat_vb",
     "is_closed"
    ]
   },
   "BtcFeesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_fees_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BtcFeesHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcFeesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_fees",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcFees"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcMempool": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "tx_count": {
      "type": "integer",
      "description": "Unconfirmed transactions in the mempool.",
      "x-unit": "count"
     },
     "vsize": {
      "type": "integer",
      "description": "Total virtual size of the mempool.",
      "x-unit": "virtual bytes"
     },
     "total_fee_sats": {
      "type": "integer",
      "description": "Total fees waiting in the mempool.",
      "x-unit": "satoshis"
     },
     "fee_histogram": {
      "type": "array",
      "items": {
       "type": "array",
       "prefixItems": [
        {
         "type": "number",
         "description": "Fee rate.",
         "x-unit": "sat/vB"
        },
        {
         "type": "number",
         "description": "Virtual size waiting at this fee rate.",
         "x-unit": "virtual bytes"
        }
       ],
       "items": {
        "type": "number",
        "x-unit": "sat/vB, then virtual bytes"
       },
       "minItems": 2,
       "maxItems": 2
      },
      "description": "`[fee_rate, vsize]` pairs: how much virtual size (virtual bytes) waits at each fee rate (sat/vB)."
     },
     "trend": {
      "type": "object",
      "properties": {
       "vsize_delta_1h": {
        "type": "integer",
        "description": "Mempool size change over 1 hour.",
        "x-unit": "virtual bytes"
       },
       "vsize_delta_4h": {
        "type": "integer",
        "description": "Mempool size change over 4 hours.",
        "x-unit": "virtual bytes"
       },
       "vsize_delta_24h": {
        "type": "integer",
        "description": "Mempool size change over 24 hours.",
        "x-unit": "virtual bytes"
       },
       "label": {
        "type": "string",
        "description": "`filling` (vsize grew over 1 h), `draining` (shrank) or `stable`."
       }
      },
      "description": "Mempool size change over 1 h, 4 h and 24 h, and its `label` (`filling`, `draining`, `stable`)."
     }
    },
    "required": [
     "time",
     "tx_count",
     "vsize",
     "total_fee_sats",
     "fee_histogram",
     "trend"
    ]
   },
   "BtcMempoolHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "tx_count": {
      "type": "integer",
      "description": "Unconfirmed transactions in the mempool.",
      "x-unit": "count"
     },
     "vsize": {
      "type": "integer",
      "description": "Total virtual size of the mempool.",
      "x-unit": "virtual bytes"
     },
     "total_fee_sats": {
      "type": "integer",
      "description": "Total fees waiting in the mempool.",
      "x-unit": "satoshis"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "tx_count",
     "vsize",
     "total_fee_sats",
     "is_closed"
    ]
   },
   "BtcMempoolHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_mempool_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BtcMempoolHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcMempoolResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_mempool",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcMempool"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcMining": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "concentration": {
      "type": "object",
      "properties": {
       "total_block_count": {
        "type": "integer",
        "description": "Blocks in the period.",
        "x-unit": "count"
       },
       "top1_share_pct": {
        "type": "number",
        "description": "Share of blocks mined by the largest pool.",
        "x-unit": "percent (58.5 = 58.5 %)"
       },
       "top3_share_pct": {
        "type": "number",
        "description": "Share of blocks mined by the three largest pools.",
        "x-unit": "percent (58.5 = 58.5 %)"
       },
       "pool_count": {
        "type": "integer",
        "description": "Number of pools that mined at least one block.",
        "x-unit": "count"
       },
       "label": {
        "type": "string",
        "description": "Centralisation risk from the top-3 pool share: `healthy` (<= 40 %), `moderate` (> 40 %), `high_risk` (> 50 %)."
       }
      },
      "description": "Mining pool concentration over the last period."
     },
     "latest_reward": {
      "type": "object",
      "properties": {
       "time": {
        "type": "string",
        "format": "date-time",
        "description": "Point-in-time value: the instant of the measurement (when the source was read).",
        "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
       },
       "block_height": {
        "type": "integer",
        "description": "Height of the reward sample (Mempool.space average height of the blocks).",
        "x-unit": "block height"
       },
       "avg_reward_sats": {
        "type": "integer",
        "description": "Average block reward.",
        "x-unit": "satoshis"
       },
       "avg_reward_usd": {
        "type": "number",
        "description": "Average block reward in USD.",
        "x-unit": "USD"
       },
       "btc_price_usd_at_block": {
        "type": "number",
        "description": "BTC price at the block of the reward (Mempool.space), used for `avg_reward_usd`. Not the current price.",
        "x-unit": "USD"
       }
      },
      "description": "Average block reward (subsidy + fees) of the latest blocks, in satoshis and USD."
     },
     "pools": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string",
         "description": "Human-readable name."
        },
        "slug": {
         "type": "string",
         "description": "Stable identifier."
        },
        "block_count": {
         "type": "integer",
         "description": "Blocks mined over the period.",
         "x-unit": "count"
        },
        "rank": {
         "type": "integer",
         "description": "Rank.",
         "x-unit": "rank (1 = first)"
        },
        "share_pct": {
         "type": "number",
         "description": "Share of blocks.",
         "x-unit": "percent (58.5 = 58.5 %)"
        }
       }
      },
      "description": "Pools ranked by blocks mined: `name`, `slug`, `block_count`, `rank`, `share_pct`."
     }
    },
    "required": [
     "time",
     "concentration",
     "latest_reward",
     "pools"
    ]
   },
   "BtcMiningHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "total_block_count": {
      "type": "integer",
      "description": "Blocks in the period.",
      "x-unit": "count"
     },
     "top1_share_pct": {
      "type": "number",
      "description": "Share of blocks mined by the largest pool.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "top3_share_pct": {
      "type": "number",
      "description": "Share of blocks mined by the three largest pools.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "pool_count": {
      "type": "integer",
      "description": "Number of pools that mined at least one block.",
      "x-unit": "count"
     },
     "label": {
      "type": "string",
      "description": "Centralisation risk from the top-3 pool share: `healthy` (<= 40 %), `moderate` (> 40 %), `high_risk` (> 50 %)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "block_height": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Height of the reward sample (Mempool.space average height of the blocks).",
      "x-unit": "block height"
     },
     "avg_reward_sats": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average block reward.",
      "x-unit": "satoshis"
     },
     "avg_reward_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average block reward in USD.",
      "x-unit": "USD"
     },
     "btc_price_usd_at_block": {
      "type": [
       "number",
       "null"
      ],
      "description": "BTC price at the block of the reward (Mempool.space), used for `avg_reward_usd`. Not the current price.",
      "x-unit": "USD"
     },
     "height": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Height of the block where the difficulty adjustment took effect.",
      "x-unit": "block height"
     },
     "new_difficulty": {
      "type": [
       "number",
       "null"
      ],
      "description": "Difficulty after the adjustment.",
      "x-unit": "difficulty units"
     },
     "old_difficulty": {
      "type": [
       "number",
       "null"
      ],
      "description": "Difficulty before the adjustment.",
      "x-unit": "difficulty units"
     },
     "difficulty_change_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Expected difficulty change at the next adjustment.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "adjustment_multiplier": {
      "type": [
       "number",
       "null"
      ],
      "description": "`new_difficulty / old_difficulty` (1.05 = a 5 % rise).",
      "x-unit": "dimensionless ratio"
     },
     "fee_rate_p0_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lowest fee rate paid in the blocks (0th percentile).",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p10_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "10th percentile of the fee rates paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p25_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "25th percentile of the fee rates paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p50_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Median fee rate paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p75_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "75th percentile of the fee rates paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p90_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "90th percentile of the fee rates paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     },
     "fee_rate_p100_sat_vb": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Highest fee rate paid in the blocks.",
      "x-unit": "satoshis per virtual byte (sat/vB)"
     }
    },
    "required": [
     "time",
     "is_closed"
    ]
   },
   "BtcMiningHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_mining_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "dataset": {
      "type": "string"
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BtcMiningHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcMiningResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_mining",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcMining"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcNetwork": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "difficulty": {
      "type": "number",
      "description": "Network mining difficulty.",
      "x-unit": "difficulty units"
     },
     "tip_height": {
      "type": "integer",
      "description": "Height of the latest block.",
      "x-unit": "block height"
     },
     "progress_pct": {
      "type": "number",
      "description": "Progress through the current 2016-block difficulty period.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "difficulty_change_pct": {
      "type": "number",
      "description": "Expected difficulty change at the next adjustment.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "block_time": {
      "type": "object",
      "properties": {
       "avg_24h_s": {
        "type": "number",
        "description": "Average block time over 24 hours.",
        "x-unit": "seconds"
       },
       "deviation_s": {
        "type": "number",
        "description": "avg_24h_s - 600.",
        "x-unit": "seconds"
       },
       "label": {
        "type": "string",
        "description": "24 h block time versus the 600 s target: `slow` (> +30 s), `fast` (< -30 s) or `on_target`."
       }
      },
      "description": "Average block time over 24 h (`avg_24h_s`), its deviation from the 600 s target, and a `label`."
     },
     "next_adjustment": {
      "type": "object",
      "properties": {
       "estimated_retarget_at": {
        "type": "string",
        "format": "date-time",
        "description": "Estimated instant of the next adjustment.",
        "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
       },
       "remaining_block_count": {
        "type": "integer",
        "description": "Blocks left before the adjustment.",
        "x-unit": "count"
       },
       "next_retarget_height": {
        "type": "integer",
        "description": "Height of the next adjustment.",
        "x-unit": "block height"
       },
       "remaining_s": {
        "type": "number",
        "description": "Estimated time left before the adjustment, seconds.",
        "x-unit": "seconds"
       }
      },
      "description": "Next difficulty adjustment: progress, expected change, date, remaining blocks and time."
     }
    },
    "required": [
     "time",
     "difficulty",
     "tip_height",
     "progress_pct",
     "difficulty_change_pct",
     "block_time",
     "next_adjustment"
    ]
   },
   "BtcNetworkHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "difficulty": {
      "type": "number",
      "description": "Network mining difficulty.",
      "x-unit": "difficulty units"
     },
     "tip_height": {
      "type": "integer",
      "description": "Height of the latest block.",
      "x-unit": "block height"
     },
     "progress_pct": {
      "type": "number",
      "description": "Progress through the current 2016-block difficulty period.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "difficulty_change_pct": {
      "type": "number",
      "description": "Expected difficulty change at the next adjustment.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "difficulty",
     "tip_height",
     "progress_pct",
     "difficulty_change_pct",
     "is_closed"
    ]
   },
   "BtcNetworkHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_network_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BtcNetworkHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BtcNetworkResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "btc_network",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcNetwork"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatio": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value over a rolling window: the END of the 5-minute window, aligned on the minute.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "buy_volume / (buy_volume + sell_volume). Above 0.5 = buyers dominate.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "buy_volume",
     "sell_volume",
     "buy_ratio",
     "is_volume_estimated",
     "window_start",
     "window_s"
    ]
   },
   "BuysellRatioFuturesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio_futures_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BuysellRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatioFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BuysellRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatioHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket. The row covers the WHOLE bucket, from `time` to `time + window_s` (excluded).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "buy_volume / (buy_volume + sell_volume). Above 0.5 = buyers dominate.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of points of the CVD series behind the bucket — the `sample_count` of `/v1/cvd/history` for the same bucket.",
      "x-unit": "count"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the totals cover (= `time`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of the bucket, in seconds (3600 for `1h`).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "buy_volume",
     "sell_volume",
     "buy_ratio",
     "sample_count",
     "is_volume_estimated",
     "is_closed",
     "window_start",
     "window_s"
    ]
   },
   "BuysellRatioHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BuysellRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatioResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BuysellRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatioSpotHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio_spot_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/BuysellRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "BuysellRatioSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "buysell_ratio_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BuysellRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CoarseTimeframe": {
    "type": "string",
    "enum": [
     "1h",
     "4h",
     "1d"
    ],
    "x-enum-varnames": [
     "H1",
     "H4",
     "D1"
    ],
    "description": "Optional step of a history aggregated to the last reading of each closed bucket."
   },
   "Cvd": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "cvd_series": {
      "type": "array",
      "items": {
       "type": "number",
       "x-unit": "base asset quantity (BTC for BTCUSDT)"
      },
      "description": "Cumulative volume delta inside the bucket, one point per minute, starting from 0 at the bucket start.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "net_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "buy_volume - sell_volume over the row, base asset units. Positive = net buying.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of one-minute points in `cvd_series`.",
      "x-unit": "count"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "cvd_series",
     "net_volume",
     "buy_volume",
     "sell_volume",
     "sample_count",
     "is_volume_estimated",
     "is_closed"
    ]
   },
   "CvdFuturesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd_futures_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Cvd"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CvdFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CvdHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "cvd_series": {
      "type": [
       "array",
       "null"
      ],
      "items": {
       "type": "number",
       "x-unit": "base asset quantity (BTC for BTCUSDT)"
      },
      "description": "Cumulative volume delta inside the bucket, one point per minute, starting from 0 at the bucket start.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "net_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "buy_volume - sell_volume over the row, base asset units. Positive = net buying.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of one-minute points in `cvd_series`.",
      "x-unit": "count"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "cvd_series",
     "net_volume",
     "buy_volume",
     "sell_volume",
     "sample_count",
     "is_volume_estimated",
     "is_closed"
    ]
   },
   "CvdHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/CvdHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CvdResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CvdSpotHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd_spot_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Cvd"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "CvdSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "cvd_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EtfFundamentals": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The balance-sheet date of the filing — the day the holdings, NAV and net assets are measured (end of the quarter for a 10-Q), at midnight UTC. `filed_date` says when the filing reached the SEC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "ticker": {
      "type": "string",
      "description": "ETF ticker."
     },
     "issuer": {
      "type": "string",
      "description": "ETF issuer."
     },
     "shares_outstanding": {
      "type": "number",
      "description": "ETF shares outstanding.",
      "x-unit": "shares"
     },
     "nav_per_share_usd": {
      "type": "number",
      "description": "Net asset value per share.",
      "x-unit": "USD"
     },
     "net_assets_usd": {
      "type": "number",
      "description": "Net assets (AUM).",
      "x-unit": "USD"
     },
     "form": {
      "type": "string",
      "description": "SEC form type of the filing (`10-Q`, `10-K`...)."
     },
     "filed_date": {
      "type": "string",
      "format": "date",
      "description": "Filing date at the SEC.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "filing_url": {
      "type": "string",
      "description": "Link to the filing on SEC EDGAR."
     },
     "btc_holdings": {
      "type": [
       "number",
       "null"
      ],
      "description": "BTC held by the fund.",
      "x-unit": "BTC"
     },
     "is_holdings_estimated": {
      "type": "boolean",
      "description": "`true` if the holdings are derived from net assets / price rather than read in the filing."
     },
     "eth_holdings": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH held by the fund.",
      "x-unit": "ETH"
     }
    },
    "required": [
     "time",
     "ticker",
     "issuer",
     "shares_outstanding",
     "nav_per_share_usd",
     "net_assets_usd",
     "form",
     "filed_date",
     "filing_url",
     "is_holdings_estimated"
    ]
   },
   "EtfFundamentalsHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The balance-sheet date of the filing — the day the holdings, NAV and net assets are measured (end of the quarter for a 10-Q), at midnight UTC. `filed_date` says when the filing reached the SEC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "ticker": {
      "type": "string",
      "description": "ETF ticker."
     },
     "issuer": {
      "type": "string",
      "description": "ETF issuer."
     },
     "shares_outstanding": {
      "type": "number",
      "description": "ETF shares outstanding.",
      "x-unit": "shares"
     },
     "nav_per_share_usd": {
      "type": "number",
      "description": "Net asset value per share.",
      "x-unit": "USD"
     },
     "net_assets_usd": {
      "type": "number",
      "description": "Net assets (AUM).",
      "x-unit": "USD"
     },
     "form": {
      "type": "string",
      "description": "SEC form type of the filing (`10-Q`, `10-K`...)."
     },
     "filed_date": {
      "type": "string",
      "format": "date",
      "description": "Filing date at the SEC.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "filing_url": {
      "type": "string",
      "description": "Link to the filing on SEC EDGAR."
     },
     "btc_holdings": {
      "type": [
       "number",
       "null"
      ],
      "description": "BTC held by the fund.",
      "x-unit": "BTC"
     },
     "is_holdings_estimated": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "`true` if the holdings are derived from net assets / price rather than read in the filing."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "eth_holdings": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH held by the fund.",
      "x-unit": "ETH"
     }
    },
    "required": [
     "time",
     "ticker",
     "issuer",
     "shares_outstanding",
     "nav_per_share_usd",
     "net_assets_usd",
     "form",
     "filed_date",
     "filing_url",
     "is_holdings_estimated",
     "is_closed"
    ]
   },
   "EtfFundamentalsHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "etf_fundamentals_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EtfFundamentalsHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     },
     "ticker": {
      "type": "string",
      "description": "Effective `ticker` of the request."
     }
    }
   },
   "EtfFundamentalsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "etf_fundamentals",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EtfFundamentals"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthDefi": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "tvl_usd": {
      "type": "number",
      "description": "Total value locked in Ethereum DeFi.",
      "x-unit": "USD"
     },
     "dex_volume_24h_usd": {
      "type": "number",
      "description": "DEX volume over 24 h.",
      "x-unit": "USD"
     },
     "dex_volume_7d_usd": {
      "type": "number",
      "description": "DEX volume over 7 days.",
      "x-unit": "USD"
     },
     "eth_market_cap_usd": {
      "type": "number",
      "description": "ETH market capitalisation.",
      "x-unit": "USD"
     },
     "defi_health_ratio": {
      "type": "number",
      "description": "tvl_usd / eth_market_cap_usd.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "defi_health_change_30d_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Relative change of `defi_health_ratio` (TVL / ETH market cap) over 30 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "30-day trend of `defi_health_ratio` (TVL / ETH market cap): `growing`, `declining` or `stable`."
     }
    },
    "required": [
     "time",
     "tvl_usd",
     "dex_volume_24h_usd",
     "dex_volume_7d_usd",
     "eth_market_cap_usd",
     "defi_health_ratio",
     "defi_health_change_30d_pct",
     "label"
    ]
   },
   "EthDefiHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "tvl_usd": {
      "type": "number",
      "description": "Total value locked in Ethereum DeFi.",
      "x-unit": "USD"
     },
     "dex_volume_24h_usd": {
      "type": "number",
      "description": "DEX volume over 24 h.",
      "x-unit": "USD"
     },
     "dex_volume_7d_usd": {
      "type": "number",
      "description": "DEX volume over 7 days.",
      "x-unit": "USD"
     },
     "eth_market_cap_usd": {
      "type": "number",
      "description": "ETH market capitalisation.",
      "x-unit": "USD"
     },
     "defi_health_ratio": {
      "type": "number",
      "description": "tvl_usd / eth_market_cap_usd.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "defi_health_change_30d_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Relative change of `defi_health_ratio` (TVL / ETH market cap) over 30 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": [
       "string",
       "null"
      ],
      "description": "30-day trend of `defi_health_ratio` (TVL / ETH market cap): `growing`, `declining` or `stable`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "tvl_usd",
     "dex_volume_24h_usd",
     "dex_volume_7d_usd",
     "eth_market_cap_usd",
     "defi_health_ratio",
     "defi_health_change_30d_pct",
     "label",
     "is_closed"
    ]
   },
   "EthDefiHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_defi_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthDefiHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthDefiResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_defi",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthDefi"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthDeflation": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "burn_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH burnt over the last 24 h.",
      "x-unit": "ETH"
     },
     "net_issuance_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "New ETH issued minus ETH burnt over 24 h. Negative = deflationary.",
      "x-unit": "ETH"
     },
     "annualized_rate_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Net issuance annualised, as a percent of supply. Negative = the supply shrinks.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "`deflationary` (24 h net issuance < 0) or `inflationary`."
     }
    },
    "required": [
     "time",
     "burn_24h",
     "net_issuance_24h",
     "annualized_rate_pct",
     "label"
    ]
   },
   "EthDeflationHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "burn_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH burnt over the last 24 h.",
      "x-unit": "ETH"
     },
     "net_issuance_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "New ETH issued minus ETH burnt over 24 h. Negative = deflationary.",
      "x-unit": "ETH"
     },
     "annualized_rate_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Net issuance annualised, as a percent of supply. Negative = the supply shrinks.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": [
       "string",
       "null"
      ],
      "description": "`deflationary` (24 h net issuance < 0) or `inflationary`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "burn_24h",
     "net_issuance_24h",
     "annualized_rate_pct",
     "label",
     "is_closed"
    ]
   },
   "EthDeflationHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_deflation_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthDeflationHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthDeflationResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_deflation",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthDeflation"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthGas": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "safe_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a low-priority transaction.",
      "x-unit": "gwei"
     },
     "propose_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a standard transaction.",
      "x-unit": "gwei"
     },
     "fast_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a fast transaction.",
      "x-unit": "gwei"
     },
     "base_fee_gwei": {
      "type": "number",
      "description": "EIP-1559 base fee (burnt).",
      "x-unit": "gwei"
     },
     "gas_used_ratio": {
      "type": "number",
      "description": "Block gas used / gas target over recent blocks.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "Congestion: `low` (gas_used_ratio < 0.5), `normal`, or `high` (> 0.8)."
     }
    },
    "required": [
     "time",
     "safe_gas_price_gwei",
     "propose_gas_price_gwei",
     "fast_gas_price_gwei",
     "base_fee_gwei",
     "gas_used_ratio",
     "label"
    ]
   },
   "EthGasHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "safe_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a low-priority transaction.",
      "x-unit": "gwei"
     },
     "propose_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a standard transaction.",
      "x-unit": "gwei"
     },
     "fast_gas_price_gwei": {
      "type": "number",
      "description": "Gas price for a fast transaction.",
      "x-unit": "gwei"
     },
     "base_fee_gwei": {
      "type": "number",
      "description": "EIP-1559 base fee (burnt).",
      "x-unit": "gwei"
     },
     "gas_used_ratio": {
      "type": "number",
      "description": "Block gas used / gas target over recent blocks.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "Congestion: `low` (gas_used_ratio < 0.5), `normal`, or `high` (> 0.8)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "safe_gas_price_gwei",
     "propose_gas_price_gwei",
     "fast_gas_price_gwei",
     "base_fee_gwei",
     "gas_used_ratio",
     "label",
     "is_closed"
    ]
   },
   "EthGasHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_gas_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthGasHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthGasMomentum": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "base_fee_gwei": {
      "type": "number",
      "description": "EIP-1559 base fee (burnt).",
      "x-unit": "gwei"
     },
     "gas_used_ratio": {
      "type": "number",
      "description": "Block gas used / gas target over recent blocks.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "gas_sma_7d_gwei": {
      "type": "number",
      "description": "7-day simple moving average of the base fee.",
      "x-unit": "gwei"
     },
     "gas_sma_30d_gwei": {
      "type": "number",
      "description": "30-day simple moving average of the base fee.",
      "x-unit": "gwei"
     },
     "sma_7d_vs_30d_pct": {
      "type": "number",
      "description": "(7-day simple moving average - 30-day simple moving average) / 30-day average, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "`high_demand` (gas_used_ratio > 0.8 and sma_7d_vs_30d_pct > 0), `low_demand` (< 0.5 and sma_7d_vs_30d_pct < 0), otherwise `normal`."
     }
    },
    "required": [
     "time",
     "base_fee_gwei",
     "gas_used_ratio",
     "gas_sma_7d_gwei",
     "gas_sma_30d_gwei",
     "sma_7d_vs_30d_pct",
     "label"
    ]
   },
   "EthGasMomentumHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "base_fee_gwei": {
      "type": "number",
      "description": "EIP-1559 base fee (burnt).",
      "x-unit": "gwei"
     },
     "gas_used_ratio": {
      "type": "number",
      "description": "Block gas used / gas target over recent blocks.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "gas_sma_7d_gwei": {
      "type": "number",
      "description": "7-day simple moving average of the base fee.",
      "x-unit": "gwei"
     },
     "gas_sma_30d_gwei": {
      "type": "number",
      "description": "30-day simple moving average of the base fee.",
      "x-unit": "gwei"
     },
     "sma_7d_vs_30d_pct": {
      "type": "number",
      "description": "(7-day simple moving average - 30-day simple moving average) / 30-day average, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "`high_demand` (gas_used_ratio > 0.8 and sma_7d_vs_30d_pct > 0), `low_demand` (< 0.5 and sma_7d_vs_30d_pct < 0), otherwise `normal`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "base_fee_gwei",
     "gas_used_ratio",
     "gas_sma_7d_gwei",
     "gas_sma_30d_gwei",
     "sma_7d_vs_30d_pct",
     "label",
     "is_closed"
    ]
   },
   "EthGasMomentumHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_gas_momentum_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthGasMomentumHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthGasMomentumResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_gas_momentum",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthGasMomentum"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthGasResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_gas",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthGas"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthRatio": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "eth_price_usd": {
      "type": "number",
      "description": "ETH price.",
      "x-unit": "USD"
     },
     "btc_price_usd": {
      "type": "number",
      "description": "BTC price in USD at the time of the row (the source of the ETH/BTC ratio).",
      "x-unit": "USD"
     },
     "eth_price_btc": {
      "type": "number",
      "description": "ETH price in BTC (ETH price / BTC price).",
      "x-unit": "BTC"
     },
     "change_7d_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Relative change of the value over 7 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "7-day momentum of ETH/BTC: `eth_outperform` (> 0), `btc_outperform` (< 0) or `neutral`."
     }
    },
    "required": [
     "time",
     "eth_price_usd",
     "btc_price_usd",
     "eth_price_btc",
     "change_7d_pct",
     "label"
    ]
   },
   "EthRatioHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "eth_price_usd": {
      "type": "number",
      "description": "ETH price.",
      "x-unit": "USD"
     },
     "btc_price_usd": {
      "type": "number",
      "description": "BTC price in USD at the time of the row (the source of the ETH/BTC ratio).",
      "x-unit": "USD"
     },
     "eth_price_btc": {
      "type": "number",
      "description": "ETH price in BTC (ETH price / BTC price).",
      "x-unit": "BTC"
     },
     "change_7d_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Relative change of the value over 7 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": [
       "string",
       "null"
      ],
      "description": "7-day momentum of ETH/BTC: `eth_outperform` (> 0), `btc_outperform` (< 0) or `neutral`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "eth_price_usd",
     "btc_price_usd",
     "eth_price_btc",
     "change_7d_pct",
     "label",
     "is_closed"
    ]
   },
   "EthRatioHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_ratio_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthRatioResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_ratio",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthSqueeze": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "staking_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "Share of the ETH supply staked.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "annualized_rate_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Net issuance annualised, as a percent of supply. Negative = the supply shrinks.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "squeeze_index": {
      "type": [
       "number",
       "null"
      ],
      "description": "Supply squeeze index: combines the staked share and net issuance. Higher = less liquid ETH available.",
      "x-unit": "score from 0 to 100"
     },
     "label": {
      "type": "string",
      "description": "`low` (< 33), `moderate` (>= 33), `high` (>= 66)."
     }
    },
    "required": [
     "time",
     "staking_ratio",
     "annualized_rate_pct",
     "squeeze_index",
     "label"
    ]
   },
   "EthSqueezeHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "staking_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "Share of the ETH supply staked.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "annualized_rate_pct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Net issuance annualised, as a percent of supply. Negative = the supply shrinks.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "squeeze_index": {
      "type": [
       "number",
       "null"
      ],
      "description": "Supply squeeze index: combines the staked share and net issuance. Higher = less liquid ETH available.",
      "x-unit": "score from 0 to 100"
     },
     "label": {
      "type": [
       "string",
       "null"
      ],
      "description": "`low` (< 33), `moderate` (>= 33), `high` (>= 66)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "staking_ratio",
     "annualized_rate_pct",
     "squeeze_index",
     "label",
     "is_closed"
    ]
   },
   "EthSqueezeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_squeeze_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthSqueezeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthSqueezeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_squeeze",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthSqueeze"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthStaking": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "staking_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "Share of the ETH supply staked.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "total_staked": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH staked (beacon chain).",
      "x-unit": "ETH"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     }
    },
    "required": [
     "time",
     "staking_ratio",
     "total_staked",
     "total_supply",
     "apr_pct"
    ]
   },
   "EthStakingHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "staking_ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "Share of the ETH supply staked.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "total_staked": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH staked (beacon chain).",
      "x-unit": "ETH"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "staking_ratio",
     "total_staked",
     "total_supply",
     "apr_pct",
     "is_closed"
    ]
   },
   "EthStakingHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_staking_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthStakingHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthStakingResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_staking",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthStaking"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthSupply": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "execution_issuance_cumulative": {
      "type": "number",
      "description": "Cumulative execution-layer issuance (genesis + proof-of-work rewards before the Merge), as published by Etherscan. NOT the supply: `total_supply` = this + `consensus_rewards_cumulative` - `burnt_fees` (was `eth_supply`).",
      "x-unit": "ETH"
     },
     "consensus_rewards_cumulative": {
      "type": "number",
      "description": "Cumulative consensus-layer issuance (staking rewards) since the Beacon Chain launch. NOT the ETH staked: see `total_staked` on `/v1/eth/staking`.",
      "x-unit": "ETH"
     },
     "burnt_fees": {
      "type": "number",
      "description": "ETH burnt since EIP-1559.",
      "x-unit": "ETH"
     },
     "withdrawn_total": {
      "type": "number",
      "description": "ETH withdrawn from staking.",
      "x-unit": "ETH"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "burn_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH burnt over the last 24 h.",
      "x-unit": "ETH"
     },
     "net_issuance_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "New ETH issued minus ETH burnt over 24 h. Negative = deflationary.",
      "x-unit": "ETH"
     },
     "label": {
      "type": "string",
      "description": "`deflationary` (24 h net issuance < 0), `inflationary` (> 0) or `neutral`."
     }
    },
    "required": [
     "time",
     "execution_issuance_cumulative",
     "consensus_rewards_cumulative",
     "burnt_fees",
     "withdrawn_total",
     "total_supply",
     "burn_24h",
     "net_issuance_24h",
     "label"
    ]
   },
   "EthSupplyHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day, at midnight UTC; the value is the LAST measurement of that day.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "execution_issuance_cumulative": {
      "type": "number",
      "description": "Cumulative execution-layer issuance (genesis + proof-of-work rewards before the Merge), as published by Etherscan. NOT the supply: `total_supply` = this + `consensus_rewards_cumulative` - `burnt_fees` (was `eth_supply`).",
      "x-unit": "ETH"
     },
     "consensus_rewards_cumulative": {
      "type": "number",
      "description": "Cumulative consensus-layer issuance (staking rewards) since the Beacon Chain launch. NOT the ETH staked: see `total_staked` on `/v1/eth/staking`.",
      "x-unit": "ETH"
     },
     "burnt_fees": {
      "type": "number",
      "description": "ETH burnt since EIP-1559.",
      "x-unit": "ETH"
     },
     "withdrawn_total": {
      "type": "number",
      "description": "ETH withdrawn from staking.",
      "x-unit": "ETH"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "burn_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "ETH burnt over the last 24 h.",
      "x-unit": "ETH"
     },
     "net_issuance_24h": {
      "type": [
       "number",
       "null"
      ],
      "description": "New ETH issued minus ETH burnt over 24 h. Negative = deflationary.",
      "x-unit": "ETH"
     },
     "label": {
      "type": [
       "string",
       "null"
      ],
      "description": "`deflationary` (24 h net issuance < 0), `inflationary` (> 0) or `neutral`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "execution_issuance_cumulative",
     "consensus_rewards_cumulative",
     "burnt_fees",
     "withdrawn_total",
     "total_supply",
     "burn_24h",
     "net_issuance_24h",
     "label",
     "is_closed"
    ]
   },
   "EthSupplyHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_supply_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/EthSupplyHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "EthSupplyResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "eth_supply",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthSupply"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FearGreed": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "value": {
      "type": "integer",
      "description": "Crypto Fear & Greed Index (alternative.me). 0 = extreme fear, 100 = extreme greed.",
      "x-unit": "score from 0 to 100"
     },
     "label": {
      "type": "string",
      "description": "Label of the value, from alternative.me's scale: `extreme_fear`, `fear`, `neutral`, `greed` or `extreme_greed` (snake_case, like every label of the API)."
     }
    },
    "required": [
     "time",
     "value",
     "label"
    ]
   },
   "FearGreedHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "value": {
      "type": "integer",
      "description": "Crypto Fear & Greed Index (alternative.me). 0 = extreme fear, 100 = extreme greed.",
      "x-unit": "score from 0 to 100"
     },
     "label": {
      "type": "string",
      "description": "Label of the value, from alternative.me's scale: `extreme_fear`, `fear`, `neutral`, `greed` or `extreme_greed` (snake_case, like every label of the API)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "value",
     "label",
     "is_closed"
    ]
   },
   "FearGreedHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "fear_greed_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/FearGreedHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FearGreedResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "fear_greed",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FearGreed"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FundingCumulative": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value over a rolling window: the END of the 24-hour window, i.e. the settlement that closes the last 8-hour period summed. The window starts at `window_start` and lasts `window_s`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the 24-hour window summed (inclusive).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of the window, in seconds (86400 = 24 hours).",
      "x-unit": "seconds"
     },
     "rolling_24h_rate_pct": {
      "type": "number",
      "description": "Sum of the last three settled 8-hour funding rates — a ROLLING 24-hour window — in percent. A row is published every 8 hours and covers 24: consecutive rows OVERLAP by 16 hours, so never add them up (sum `rate_pct` of `/v1/funding/rate/history` instead).",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of 8-hour funding windows summed.",
      "x-unit": "count"
     }
    },
    "required": [
     "time",
     "window_start",
     "window_s",
     "rolling_24h_rate_pct",
     "apr_pct",
     "sample_count"
    ]
   },
   "FundingCumulativeHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "END of each 24-hour window (the settlement that closes its last 8-hour period). The window starts at `window_start` and lasts `window_s`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the 24-hour window summed (inclusive).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of the window, in seconds (86400 = 24 hours).",
      "x-unit": "seconds"
     },
     "rolling_24h_rate_pct": {
      "type": "number",
      "description": "Sum of the last three settled 8-hour funding rates — a ROLLING 24-hour window — in percent. A row is published every 8 hours and covers 24: consecutive rows OVERLAP by 16 hours, so never add them up (sum `rate_pct` of `/v1/funding/rate/history` instead).",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of 8-hour funding windows summed.",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "window_start",
     "window_s",
     "rolling_24h_rate_pct",
     "apr_pct",
     "sample_count",
     "is_closed"
    ]
   },
   "FundingCumulativeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "funding_cumulative_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/FundingCumulativeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FundingCumulativeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "funding_cumulative",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingCumulative"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FundingNext": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the next funding settlement the forecast is for.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "estimated_rate_pct": {
      "type": "number",
      "description": "Venue forecast of the NEXT funding settlement, in percent per 8 h (0.01 = 0.01 %), normalised to 8 h, OI-weighted.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_past": {
      "type": "boolean",
      "description": "`true` if the forecast settlement instant is already past (the next forecast is not published yet)."
     }
    },
    "required": [
     "time",
     "estimated_rate_pct",
     "apr_pct",
     "is_past"
    ]
   },
   "FundingNextResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "funding_next",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingNext"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FundingRate": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the 8-hour funding period. The window is PAID by the settlement at its end: read `period_end` / `settled_at` for when it was settled.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "period_end": {
      "type": "string",
      "format": "date-time",
      "description": "End of the 8-hour funding period (exclusive): the instant of the settlement that pays it.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "settled_at": {
      "type": "string",
      "format": "date-time",
      "description": "Instant of the last settlement counted in the window: `period_end` for a complete settled window, earlier for the window in progress (`?live=1`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "rate_pct": {
      "type": "number",
      "description": "Settled funding rate of the 8-hour period, in percent (0.01 = 0.01 % per 8 h), normalised to 8 h and open-interest weighted across venues.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "apr_pct": {
      "type": "number",
      "description": "Annualised rate in percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "period_end",
     "settled_at",
     "rate_pct",
     "apr_pct",
     "is_closed"
    ]
   },
   "FundingRateHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "funding_rate_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/FundingRate"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "FundingRateResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "funding_rate",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingRate"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "GlobalHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "global_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/GlobalMarketHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "GlobalMarket": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant the source states for its measurement (often the last millisecond of its minute, `…:59.999Z`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "total_market_cap_usd": {
      "type": "number",
      "description": "Total crypto market capitalisation.",
      "x-unit": "USD"
     },
     "total_volume_usd": {
      "type": "number",
      "description": "Total crypto trading volume over 24 h.",
      "x-unit": "USD"
     },
     "btc_dominance_pct": {
      "type": "number",
      "description": "Bitcoin share of the total market cap.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "eth_dominance_pct": {
      "type": "number",
      "description": "Ether share of the total market cap.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "others_dominance_pct": {
      "type": "number",
      "description": "Share of every other asset.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "active_cryptocurrency_count": {
      "type": "integer",
      "description": "Number of tracked crypto assets.",
      "x-unit": "count"
     }
    },
    "required": [
     "time",
     "total_market_cap_usd",
     "total_volume_usd",
     "btc_dominance_pct",
     "eth_dominance_pct",
     "others_dominance_pct",
     "active_cryptocurrency_count"
    ]
   },
   "GlobalMarketHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The instant the source states for each measurement.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "total_market_cap_usd": {
      "type": "number",
      "description": "Total crypto market capitalisation.",
      "x-unit": "USD"
     },
     "total_volume_usd": {
      "type": "number",
      "description": "Total crypto trading volume over 24 h.",
      "x-unit": "USD"
     },
     "btc_dominance_pct": {
      "type": "number",
      "description": "Bitcoin share of the total market cap.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "eth_dominance_pct": {
      "type": "number",
      "description": "Ether share of the total market cap.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "others_dominance_pct": {
      "type": "number",
      "description": "Share of every other asset.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "active_cryptocurrency_count": {
      "type": "integer",
      "description": "Number of tracked crypto assets.",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "total_market_cap_usd",
     "total_volume_usd",
     "btc_dominance_pct",
     "eth_dominance_pct",
     "others_dominance_pct",
     "active_cryptocurrency_count",
     "is_closed"
    ]
   },
   "GlobalResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "global",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/GlobalMarket"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Health": {
    "type": "object",
    "properties": {
     "database": {
      "type": "string",
      "description": "`connected` when the service reaches its database. A failing check answers 503 `service_unavailable` with `database` in the error body."
     }
    },
    "required": [
     "database"
    ]
   },
   "HealthResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "health",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Health"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "database": {
      "type": "string",
      "description": "`connected` when the service reaches its database. A failing check answers 503 `service_unavailable` with `database` in the error body."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "HeatmapClusters": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "density_up": {
      "type": "number",
      "description": "Estimated liquidation density of the most attractive cluster ABOVE the price (short positions).",
      "x-unit": "dimensionless score"
     },
     "dist_up_ratio": {
      "type": "number",
      "description": "Distance from the price to the cluster above, as a fraction of the price (0.037 = 3.7 % higher).",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "density_down": {
      "type": "number",
      "description": "Estimated liquidation density of the most attractive cluster BELOW the price (long positions).",
      "x-unit": "dimensionless score"
     },
     "dist_down_ratio": {
      "type": "number",
      "description": "Distance from the price to the cluster below, as a fraction of the price.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "attraction_up": {
      "type": "number",
      "description": "density_up / dist_up_ratio²: how strongly the cluster above pulls the price.",
      "x-unit": "dimensionless score"
     },
     "attraction_down": {
      "type": "number",
      "description": "density_down / dist_down_ratio²: how strongly the cluster below pulls the price. Compare with attraction_up.",
      "x-unit": "dimensionless score"
     }
    },
    "required": [
     "time",
     "density_up",
     "dist_up_ratio",
     "density_down",
     "dist_down_ratio",
     "attraction_up",
     "attraction_down"
    ]
   },
   "HeatmapClustersHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket of `timeframe`; the value is the LAST one of the bucket's minutes.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "density_up": {
      "type": "number",
      "description": "Estimated liquidation density of the most attractive cluster ABOVE the price (short positions).",
      "x-unit": "dimensionless score"
     },
     "dist_up_ratio": {
      "type": "number",
      "description": "Distance from the price to the cluster above, as a fraction of the price (0.037 = 3.7 % higher).",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "density_down": {
      "type": "number",
      "description": "Estimated liquidation density of the most attractive cluster BELOW the price (long positions).",
      "x-unit": "dimensionless score"
     },
     "dist_down_ratio": {
      "type": "number",
      "description": "Distance from the price to the cluster below, as a fraction of the price.",
      "x-unit": "fraction (0.585 = 58.5 %)"
     },
     "attraction_up": {
      "type": "number",
      "description": "density_up / dist_up_ratio²: how strongly the cluster above pulls the price.",
      "x-unit": "dimensionless score"
     },
     "attraction_down": {
      "type": "number",
      "description": "density_down / dist_down_ratio²: how strongly the cluster below pulls the price. Compare with attraction_up.",
      "x-unit": "dimensionless score"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "density_up",
     "dist_up_ratio",
     "density_down",
     "dist_down_ratio",
     "attraction_up",
     "attraction_down",
     "sample_count",
     "is_closed"
    ]
   },
   "HeatmapClustersHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "heatmap_clusters_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/HeatmapClustersHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "HeatmapClustersResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "heatmap_clusters",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/HeatmapClusters"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "IndicatorAd": {
    "type": "object",
    "description": "`ad` indicator. Warm-up: 0 candles before the first value. Output: one array of values. Uses the candle volume.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "ad"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorAdosc": {
    "type": "object",
    "description": "`adosc` indicator. Warm-up: 6×slow candles before the first value. Output: one array of values. Uses the candle volume.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "adosc"
     },
     "fast": {
      "type": "integer",
      "default": 3,
      "minimum": 2,
      "x-unit": "candles"
     },
     "slow": {
      "type": "integer",
      "default": 10,
      "minimum": 5,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "fast": {
        "type": "integer",
        "default": 3,
        "minimum": 2,
        "x-unit": "candles"
       },
       "slow": {
        "type": "integer",
        "default": 10,
        "minimum": 5,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorAdx": {
    "type": "object",
    "description": "`adx` indicator. Warm-up: 14×period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "adx"
     },
     "period": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorAtr": {
    "type": "object",
    "description": "`atr` indicator. Warm-up: 5×period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "atr"
     },
     "period": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorBb": {
    "type": "object",
    "description": "`bb` indicator. Warm-up: period candles before the first value. Output: an object of arrays `upper, middle, lower`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "bb"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "std": {
      "type": "number",
      "default": 2.0,
      "minimum": 0.5,
      "maximum": 10.0,
      "x-unit": "standard deviations"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       },
       "std": {
        "type": "number",
        "default": 2.0,
        "minimum": 0.5,
        "maximum": 10.0,
        "x-unit": "standard deviations"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorCci": {
    "type": "object",
    "description": "`cci` indicator. Warm-up: period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "cci"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorDefinition": {
    "oneOf": [
     {
      "$ref": "#/components/schemas/IndicatorAd"
     },
     {
      "$ref": "#/components/schemas/IndicatorAdosc"
     },
     {
      "$ref": "#/components/schemas/IndicatorAdx"
     },
     {
      "$ref": "#/components/schemas/IndicatorAtr"
     },
     {
      "$ref": "#/components/schemas/IndicatorBb"
     },
     {
      "$ref": "#/components/schemas/IndicatorCci"
     },
     {
      "$ref": "#/components/schemas/IndicatorDonchian"
     },
     {
      "$ref": "#/components/schemas/IndicatorEma"
     },
     {
      "$ref": "#/components/schemas/IndicatorIchimoku"
     },
     {
      "$ref": "#/components/schemas/IndicatorKeltner"
     },
     {
      "$ref": "#/components/schemas/IndicatorMacd"
     },
     {
      "$ref": "#/components/schemas/IndicatorMfi"
     },
     {
      "$ref": "#/components/schemas/IndicatorObv"
     },
     {
      "$ref": "#/components/schemas/IndicatorRoc"
     },
     {
      "$ref": "#/components/schemas/IndicatorRsi"
     },
     {
      "$ref": "#/components/schemas/IndicatorSar"
     },
     {
      "$ref": "#/components/schemas/IndicatorSma"
     },
     {
      "$ref": "#/components/schemas/IndicatorStoch"
     },
     {
      "$ref": "#/components/schemas/IndicatorWillr"
     }
    ],
    "discriminator": {
     "propertyName": "type",
     "mapping": {
      "ad": "#/components/schemas/IndicatorAd",
      "adosc": "#/components/schemas/IndicatorAdosc",
      "adx": "#/components/schemas/IndicatorAdx",
      "atr": "#/components/schemas/IndicatorAtr",
      "bb": "#/components/schemas/IndicatorBb",
      "cci": "#/components/schemas/IndicatorCci",
      "donchian": "#/components/schemas/IndicatorDonchian",
      "ema": "#/components/schemas/IndicatorEma",
      "ichimoku": "#/components/schemas/IndicatorIchimoku",
      "keltner": "#/components/schemas/IndicatorKeltner",
      "macd": "#/components/schemas/IndicatorMacd",
      "mfi": "#/components/schemas/IndicatorMfi",
      "obv": "#/components/schemas/IndicatorObv",
      "roc": "#/components/schemas/IndicatorRoc",
      "rsi": "#/components/schemas/IndicatorRsi",
      "sar": "#/components/schemas/IndicatorSar",
      "sma": "#/components/schemas/IndicatorSma",
      "stoch": "#/components/schemas/IndicatorStoch",
      "willr": "#/components/schemas/IndicatorWillr"
     }
    },
    "description": "One indicator to compute, discriminated by `type`."
   },
   "IndicatorDonchian": {
    "type": "object",
    "description": "`donchian` indicator. Warm-up: period candles before the first value. Output: an object of arrays `upper, middle, lower`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "donchian"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorEma": {
    "type": "object",
    "description": "`ema` indicator. Warm-up: 3×period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "ema"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorIchimoku": {
    "type": "object",
    "description": "`ichimoku` indicator. Warm-up: max(tenkan,kijun,senkou)+kijun candles before the first value. Output: an object of arrays `tenkan_sen, kijun_sen, senkou_a, senkou_b`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "ichimoku"
     },
     "tenkan": {
      "type": "integer",
      "default": 9,
      "minimum": 2,
      "x-unit": "candles"
     },
     "kijun": {
      "type": "integer",
      "default": 26,
      "minimum": 5,
      "x-unit": "candles"
     },
     "senkou": {
      "type": "integer",
      "default": 52,
      "minimum": 10,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "tenkan": {
        "type": "integer",
        "default": 9,
        "minimum": 2,
        "x-unit": "candles"
       },
       "kijun": {
        "type": "integer",
        "default": 26,
        "minimum": 5,
        "x-unit": "candles"
       },
       "senkou": {
        "type": "integer",
        "default": 52,
        "minimum": 10,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorKeltner": {
    "type": "object",
    "description": "`keltner` indicator. Warm-up: 5×period candles before the first value. Output: an object of arrays `upper, middle, lower`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "keltner"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "multiplier": {
      "type": "number",
      "default": 2.0,
      "minimum": 0.5,
      "maximum": 10.0,
      "x-unit": "multiples of the ATR"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       },
       "multiplier": {
        "type": "number",
        "default": 2.0,
        "minimum": 0.5,
        "maximum": 10.0,
        "x-unit": "multiples of the ATR"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorMacd": {
    "type": "object",
    "description": "`macd` indicator. Warm-up: 3×slow+signal candles before the first value. Output: an object of arrays `macd, signal, histogram`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "macd"
     },
     "fast": {
      "type": "integer",
      "default": 12,
      "minimum": 2,
      "x-unit": "candles"
     },
     "slow": {
      "type": "integer",
      "default": 26,
      "minimum": 5,
      "x-unit": "candles"
     },
     "signal": {
      "type": "integer",
      "default": 9,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "fast": {
        "type": "integer",
        "default": 12,
        "minimum": 2,
        "x-unit": "candles"
       },
       "slow": {
        "type": "integer",
        "default": 26,
        "minimum": 5,
        "x-unit": "candles"
       },
       "signal": {
        "type": "integer",
        "default": 9,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorMfi": {
    "type": "object",
    "description": "`mfi` indicator. Warm-up: period candles before the first value. Output: one array of values. Uses the candle volume.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "mfi"
     },
     "period": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorObv": {
    "type": "object",
    "description": "`obv` indicator. Warm-up: 0 candles before the first value. Output: one array of values. Uses the candle volume.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "obv"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorResult": {
    "type": "object",
    "required": [
     "time",
     "type",
     "values",
     "times"
    ],
    "properties": {
     "time": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time",
      "description": "Start of the candle of the LAST value of `values` (the latest candle actually used; `values` are oldest first).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Indicator type."
     },
     "period": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Look-back period of the indicator, in candles.",
      "x-unit": "candles"
     },
     "values": {
      "oneOf": [
       {
        "type": "array",
        "items": {
         "type": "number",
         "x-unit": "the indicator's own unit"
        }
       },
       {
        "type": "object",
        "additionalProperties": {
         "type": "array",
         "items": {
          "type": "number",
          "x-unit": "the indicator's own unit"
         }
        }
       }
      ],
      "description": "The values, oldest to newest: one array, or an object of arrays for a multi-output indicator (`macd`: `macd`, `signal`, `histogram`; `bb`: `upper`, `middle`, `lower`…). Each indicator's unit is its own (RSI 0 to 100, MACD and moving averages in the quote currency…).",
      "x-unit": "the indicator's own unit"
     },
     "times": {
      "type": "array",
      "items": {
       "type": "string",
       "format": "date-time"
      },
      "description": "Start of the candle of each value: `times[i]` is the candle of `values[i]` (oldest to newest, the same length as `values`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "fast": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Fast period, in candles.",
      "x-unit": "candles"
     },
     "slow": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Slow period, in candles.",
      "x-unit": "candles"
     },
     "signal": {
      "type": [
       "integer",
       "null"
      ],
      "description": "MACD signal period, in candles.",
      "x-unit": "candles"
     },
     "std": {
      "type": [
       "number",
       "null"
      ],
      "description": "Band width, in standard deviations.",
      "x-unit": "standard deviations"
     }
    },
    "additionalProperties": true,
    "description": "One computed indicator: its type, its parameters as applied, `values` and the candle of each value (`times`)."
   },
   "IndicatorRoc": {
    "type": "object",
    "description": "`roc` indicator. Warm-up: period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "roc"
     },
     "period": {
      "type": "integer",
      "default": 10,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 10,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorRsi": {
    "type": "object",
    "description": "`rsi` indicator. Warm-up: 5×period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "rsi"
     },
     "period": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorSar": {
    "type": "object",
    "description": "`sar` indicator. Warm-up: 200 candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "sar"
     },
     "acceleration": {
      "type": "number",
      "default": 0.02,
      "minimum": 0.01,
      "maximum": 1.0,
      "x-unit": "acceleration factor (dimensionless)"
     },
     "maximum": {
      "type": "number",
      "default": 0.2,
      "minimum": 0.05,
      "maximum": 1.0,
      "x-unit": "acceleration factor (dimensionless)"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "acceleration": {
        "type": "number",
        "default": 0.02,
        "minimum": 0.01,
        "maximum": 1.0,
        "x-unit": "acceleration factor (dimensionless)"
       },
       "maximum": {
        "type": "number",
        "default": 0.2,
        "minimum": 0.05,
        "maximum": 1.0,
        "x-unit": "acceleration factor (dimensionless)"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorSma": {
    "type": "object",
    "description": "`sma` indicator. Warm-up: period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "sma"
     },
     "period": {
      "type": "integer",
      "default": 20,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 20,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorStoch": {
    "type": "object",
    "description": "`stoch` indicator. Warm-up: k+d+smooth candles before the first value. Output: an object of arrays `k, d`.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "stoch"
     },
     "k": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "d": {
      "type": "integer",
      "default": 3,
      "minimum": 2,
      "x-unit": "candles"
     },
     "smooth": {
      "type": "integer",
      "default": 3,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "k": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       },
       "d": {
        "type": "integer",
        "default": 3,
        "minimum": 2,
        "x-unit": "candles"
       },
       "smooth": {
        "type": "integer",
        "default": 3,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "IndicatorWillr": {
    "type": "object",
    "description": "`willr` indicator. Warm-up: period candles before the first value. Output: one array of values.",
    "required": [
     "id",
     "type"
    ],
    "additionalProperties": false,
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.-]{1,64}$",
      "description": "Your own name for the result (unique in the call): `data.indicators` is keyed by it."
     },
     "type": {
      "type": "string",
      "const": "willr"
     },
     "period": {
      "type": "integer",
      "default": 14,
      "minimum": 2,
      "x-unit": "candles"
     },
     "parameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
       "period": {
        "type": "integer",
        "default": 14,
        "minimum": 2,
        "x-unit": "candles"
       }
      },
      "description": "The same parameters, nested instead of flat (either form)."
     }
    }
   },
   "Indicators": {
    "type": "object",
    "properties": {
     "indicators": {
      "type": "object",
      "additionalProperties": {
       "$ref": "#/components/schemas/IndicatorResult"
      },
      "description": "One result per indicator of the request, keyed by the `id` you gave it."
     }
    },
    "required": [
     "indicators"
    ]
   },
   "IndicatorsRequest": {
    "properties": {
     "symbol": {
      "type": "string",
      "description": "Trading pair, e.g. `BTCUSDT` (see `GET /v1/symbols`)."
     },
     "timeframe": {
      "type": "string",
      "enum": [
       "1m",
       "5m",
       "15m",
       "30m",
       "1h",
       "4h",
       "1d",
       "1w"
      ],
      "description": "Candle size the indicators are computed on."
     },
     "results": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "description": "Number of values per indicator (default 1). `limit` and `results` are synonyms: give one of them.",
      "x-unit": "values per indicator"
     },
     "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "description": "Number of values per indicator (default 1). `limit` and `results` are synonyms: give one of them.",
      "x-unit": "values per indicator"
     },
     "indicators": {
      "type": "array",
      "minItems": 1,
      "maxItems": 50,
      "items": {
       "$ref": "#/components/schemas/IndicatorDefinition"
      },
      "description": "The indicators to compute; several of the same type are allowed."
     }
    },
    "additionalProperties": false,
    "type": "object",
    "required": [
     "symbol",
     "timeframe",
     "indicators"
    ],
    "title": "IndicatorsRequest"
   },
   "IntradayTimeframe": {
    "type": "string",
    "enum": [
     "1m",
     "5m",
     "15m",
     "1h",
     "4h",
     "1d"
    ],
    "x-enum-varnames": [
     "M1",
     "M5",
     "M15",
     "H1",
     "H4",
     "D1"
    ],
    "description": "Candle size of an intraday macro series (no `30m`)."
   },
   "Kline": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "open": {
      "type": "number",
      "description": "Opening price of the candle.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "high": {
      "type": "number",
      "description": "Highest price of the candle.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "low": {
      "type": "number",
      "description": "Lowest price of the candle.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "close": {
      "type": "number",
      "description": "Closing price of the candle (last price for the open candle).",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Traded volume over the row, base asset units (BTC for BTCUSDT, NOT dollars), aggregated across venues, ALL the markets of the route: spot + perpetual futures on `/v1/klines` and `/v1/trades-kline` (a name without a market suffix covers every market; `volume_spot` / `volume_futures` restrict). `null` when a market is not available (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "volume_spot": {
      "type": [
       "number",
       "null"
      ],
      "description": "Volume traded on the SPOT market, summed across venues, base asset units. `null` while not available yet (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume_spot": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume on the SPOT market, across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume_spot": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume on the SPOT market, across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "is_volume_spot_estimated": {
      "type": "boolean",
      "description": "`true` when the spot quantities of this candle were ESTIMATED from USD amounts and the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "volume_futures": {
      "type": [
       "number",
       "null"
      ],
      "description": "Volume traded on PERPETUAL FUTURES, summed across venues, in base asset units. `null` when not available yet (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume_futures": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume on PERPETUAL FUTURES, across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume_futures": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume on PERPETUAL FUTURES, across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "is_volume_futures_estimated": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "`true` when `volume_futures` was ESTIMATED from USD amounts and the candle's typical price; `false` = measured."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "open",
     "high",
     "low",
     "close",
     "volume",
     "buy_volume",
     "sell_volume",
     "is_volume_estimated",
     "volume_spot",
     "buy_volume_spot",
     "sell_volume_spot",
     "is_volume_spot_estimated",
     "volume_futures",
     "buy_volume_futures",
     "sell_volume_futures",
     "is_volume_futures_estimated",
     "is_closed"
    ]
   },
   "KlineTimeframe": {
    "type": "string",
    "enum": [
     "1m",
     "5m",
     "15m",
     "30m",
     "1h",
     "4h",
     "1d",
     "1w"
    ],
    "x-enum-varnames": [
     "M1",
     "M5",
     "M15",
     "M30",
     "H1",
     "H4",
     "D1",
     "W1"
    ],
    "description": "Candle size: every timeframe, the week included."
   },
   "KlinesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "klines",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Kline"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Limits": {
    "type": "object",
    "properties": {
     "plan": {
      "type": "string",
      "description": "Your plan: `free`, `traders`, `financial`, `startup` or `enterprise` (`legacy` for an internal unmetered key: every limit below is then unset)."
     },
     "families": {
      "type": [
       "number",
       "string",
       "null"
      ],
      "description": "Data families your plan includes (`price_volume`, `derivatives`, `microstructure`, `ticks`, `snapshot`, `indicators`, `macro`, `options`, `onchain`, `etf`, `tokenomics`, `sentiment`); `null` = all of them. A route outside them answers 403 `plan_family`."
     },
     "history": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "timeframe": {
         "type": "string",
         "description": "The timeframe the window applies to."
        },
        "window_minutes": {
         "type": [
          "integer",
          "null"
         ],
         "description": "How far back this timeframe may be read, in minutes, measured from now; `null` = unlimited. Beyond it: 403 `history_depth`.",
         "x-unit": "minutes"
        }
       }
      },
      "description": "History window per timeframe, one object per timeframe the API serves."
     },
     "ticks_window_minutes": {
      "type": [
       "integer",
       "null"
      ],
      "description": "How far back individual trades (`/v1/trades/*`) may be read, in minutes; `null` = unlimited or not in your plan (see `families`).",
      "x-unit": "minutes"
     },
     "liquidation_events": {
      "type": [
       "integer",
       "null"
      ],
      "description": "How many of the most recent individual liquidations `/v1/liquidations/events` may return; `null` = unlimited.",
      "x-unit": "count"
     },
     "rate": {
      "type": [
       "number",
       "string",
       "null"
      ],
      "description": "The per-minute rate, as a token bucket; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`debit` policy)."
     },
     "quota": {
      "type": [
       "number",
       "string",
       "null"
      ],
      "description": "The monthly quota; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`mensuel` policy). It resets on the 1st of the month, 00:00 UTC."
     }
    },
    "required": [
     "plan",
     "families",
     "history",
     "ticks_window_minutes",
     "liquidation_events",
     "rate",
     "quota"
    ]
   },
   "LimitsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "limits",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Limits"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "LiquidationEvent": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Instant of the liquidation, as stated by the venue (milliseconds).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "side": {
      "type": "string",
      "description": "`long` (a long position was liquidated: forced sell) or `short` (forced buy)."
     },
     "price": {
      "type": "number",
      "description": "Price.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "quantity": {
      "type": "number",
      "description": "Quantity traded or liquidated, in base asset units.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "value_usd": {
      "type": "number",
      "description": "Notional value: price × quantity.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "side",
     "price",
     "quantity",
     "value_usd"
    ]
   },
   "LiquidationsCumulative": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value over a rolling window: the END of the 5-minute window, aligned on the minute.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "long_usd": {
      "type": "number",
      "description": "Long positions liquidated, USD.",
      "x-unit": "USD"
     },
     "short_usd": {
      "type": "number",
      "description": "Short positions liquidated, USD.",
      "x-unit": "USD"
     },
     "total_usd": {
      "type": "number",
      "description": "Total, USD.",
      "x-unit": "USD"
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "long_usd",
     "short_usd",
     "total_usd",
     "window_start",
     "window_s"
    ]
   },
   "LiquidationsCumulativeHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket. The row covers the WHOLE bucket, from `time` to `time + window_s` (excluded).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "long_usd": {
      "type": "number",
      "description": "Long positions liquidated, USD.",
      "x-unit": "USD"
     },
     "short_usd": {
      "type": "number",
      "description": "Short positions liquidated, USD.",
      "x-unit": "USD"
     },
     "total_usd": {
      "type": "number",
      "description": "Total, USD.",
      "x-unit": "USD"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the totals cover (= `time`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of the bucket, in seconds (3600 for `1h`).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "long_usd",
     "short_usd",
     "total_usd",
     "sample_count",
     "is_closed",
     "window_start",
     "window_s"
    ]
   },
   "LiquidationsCumulativeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "liquidations_cumulative_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/LiquidationsCumulativeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "LiquidationsCumulativeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "liquidations_cumulative",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/LiquidationsCumulative"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "LiquidationsEventsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "liquidations_events",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/LiquidationEvent"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "LiquidationsRatio": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the latest CLOSED minute that had at least one liquidation — the same row as the first one of `/v1/liquidations/ratio/history?timeframe=1m`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "big_count": {
      "type": "integer",
      "description": "Liquidations of 100,000 USD or more.",
      "x-unit": "count"
     },
     "big_usd": {
      "type": "number",
      "description": "Notional of liquidations of 100,000 USD or more.",
      "x-unit": "USD"
     },
     "small_count": {
      "type": "integer",
      "description": "Liquidations below 100,000 USD.",
      "x-unit": "count"
     },
     "small_usd": {
      "type": "number",
      "description": "Notional of liquidations below 100,000 USD.",
      "x-unit": "USD"
     },
     "ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "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.",
      "x-unit": "big / small"
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "big_count",
     "big_usd",
     "small_count",
     "small_usd",
     "ratio",
     "window_start",
     "window_s"
    ]
   },
   "LiquidationsRatioHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket of `timeframe`, the value aggregating the bucket's minutes; the row covers `window_start` to `window_start + window_s`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "big_count": {
      "type": "integer",
      "description": "Liquidations of 100,000 USD or more.",
      "x-unit": "count"
     },
     "big_usd": {
      "type": "number",
      "description": "Notional of liquidations of 100,000 USD or more.",
      "x-unit": "USD"
     },
     "small_count": {
      "type": "integer",
      "description": "Liquidations below 100,000 USD.",
      "x-unit": "count"
     },
     "small_usd": {
      "type": "number",
      "description": "Notional of liquidations below 100,000 USD.",
      "x-unit": "USD"
     },
     "ratio": {
      "type": [
       "number",
       "null"
      ],
      "description": "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.",
      "x-unit": "big / small"
     },
     "sample_count": {
      "type": "integer",
      "description": "Minutes of the bucket that had at least one liquidation.",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "big_count",
     "big_usd",
     "small_count",
     "small_usd",
     "ratio",
     "sample_count",
     "is_closed",
     "window_start",
     "window_s"
    ]
   },
   "LiquidationsRatioHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "liquidations_ratio_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/LiquidationsRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "LiquidationsRatioResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "liquidations_ratio",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/LiquidationsRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Macro": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day of the observation, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "series_id": {
      "type": "string",
      "description": "Series identifier."
     },
     "category": {
      "type": "string",
      "description": "Series category."
     },
     "name": {
      "type": "string",
      "description": "Human-readable name of the series."
     },
     "frequency": {
      "type": "string",
      "description": "Publication frequency of the source (`daily`, `weekly`, `monthly`)."
     },
     "units": {
      "type": "string",
      "description": "Unit of `value` as published by the source."
     },
     "value": {
      "type": "number",
      "description": "Latest value of the series, in the unit given by `units`.",
      "x-unit": "see `units`"
     }
    },
    "required": [
     "time",
     "series_id",
     "category",
     "name",
     "frequency",
     "units",
     "value"
    ]
   },
   "MacroCorrelations": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oldest_input_date": {
      "type": "string",
      "format": "date",
      "description": "Date of the OLDEST input the value uses (a monthly series lags a daily one): the value cannot be fresher than this input. `time` is the most recent input; each component carries its own date.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "method": {
      "type": "string",
      "description": "How the value is computed."
     },
     "correlations": {
      "type": "object",
      "properties": {
       "dxy": {
        "type": "object",
        "properties": {
         "30d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         },
         "90d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         }
        },
        "description": "US Dollar Index."
       },
       "sp500": {
        "type": "object",
        "properties": {
         "30d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         },
         "90d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         }
        },
        "description": "S&P 500."
       },
       "gold": {
        "type": "object",
        "properties": {
         "30d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         },
         "90d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         }
        }
       },
       "vix": {
        "type": "object",
        "properties": {
         "30d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         },
         "90d": {
          "type": "object",
          "properties": {
           "time": {
            "type": "string",
            "format": "date-time",
            "description": "Point-in-time value: the last date used by the window (at the top level, the most recent of all windows; see `oldest_input_date`).",
            "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
           },
           "correlation": {
            "type": "number",
            "description": "Pearson correlation of daily returns.",
            "x-unit": "from -1 to 1"
           },
           "sample_count": {
            "type": "integer",
            "description": "Number of days used.",
            "x-unit": "count"
           }
          }
         }
        },
        "description": "CBOE Volatility Index."
       }
      },
      "description": "Pearson correlation from -1 to 1, per macro series and window, with `sample_count` = number of common days."
     }
    },
    "required": [
     "time",
     "oldest_input_date",
     "asset",
     "method",
     "correlations"
    ]
   },
   "MacroCorrelationsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_correlations",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroCorrelations"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day of the observation, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "value": {
      "type": "number",
      "description": "Value of the series on the day of `time`.",
      "x-unit": "see the series `units`"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "value",
     "is_closed"
    ]
   },
   "MacroHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "series": {
      "type": "string",
      "description": "Series identifier."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/MacroHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroIntraday": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "open": {
      "type": "number",
      "description": "Open.",
      "x-unit": "series unit"
     },
     "high": {
      "type": "number",
      "description": "High.",
      "x-unit": "series unit"
     },
     "low": {
      "type": "number",
      "description": "Low.",
      "x-unit": "series unit"
     },
     "close": {
      "type": "number",
      "description": "Close.",
      "x-unit": "series unit"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Volume reported by the source for this instrument (not the whole market).",
      "x-unit": "see `volume_kind`"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "open",
     "high",
     "low",
     "close",
     "volume",
     "is_closed"
    ]
   },
   "MacroIntradayHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_intraday_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "series": {
      "type": "string",
      "description": "Series identifier."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/MacroIntraday"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroIntradaySeriesInfo": {
    "type": "object",
    "properties": {
     "series_id": {
      "type": "string",
      "description": "Series identifier."
     },
     "source": {
      "type": "string",
      "description": "Upstream source."
     },
     "instrument_code": {
      "type": "string",
      "description": "Code of the instrument at the source (informative; use `series_id` in requests)."
     },
     "category": {
      "type": "string",
      "description": "Series category."
     },
     "name": {
      "type": "string",
      "description": "Human-readable name of the series."
     },
     "units": {
      "type": "string",
      "description": "Unit of `value` as published by the source."
     },
     "volume_kind": {
      "type": "string",
      "description": "What `volume` measures for this instrument (`broker` = the source's own flow, not the whole market)."
     },
     "timeframes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Timeframes natively collected for the series."
     },
     "history_start_date": {
      "type": "string",
      "format": "date",
      "description": "First day of available history.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "last_candle_at": {
      "type": "object",
      "properties": {
       "1m": {
        "type": "string",
        "format": "date-time"
       },
       "5m": {
        "type": "string",
        "format": "date-time"
       },
       "15m": {
        "type": "string",
        "format": "date-time"
       },
       "1h": {
        "type": "string",
        "format": "date-time"
       },
       "4h": {
        "type": "string",
        "format": "date-time"
       },
       "1d": {
        "type": "string",
        "format": "date-time"
       }
      },
      "description": "Last candle available, per timeframe."
     }
    },
    "required": [
     "series_id",
     "source",
     "instrument_code",
     "category",
     "name",
     "units",
     "volume_kind",
     "timeframes",
     "history_start_date",
     "last_candle_at"
    ]
   },
   "MacroIntradaySeriesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_intraday_series",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/MacroIntradaySeriesInfo"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroMomentum": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the date of the most recent input. See `oldest_input_date` for the stalest one.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oldest_input_date": {
      "type": "string",
      "format": "date",
      "description": "Date of the OLDEST input the value uses (a monthly series lags a daily one): the value cannot be fresher than this input. `time` is the most recent input; each component carries its own date.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "scale": {
      "type": "string",
      "description": "Reading scale of the score."
     },
     "30d": {
      "type": "object",
      "properties": {
       "score": {
        "type": "number",
        "description": "Macro momentum for crypto: positive = macro tailwind (weaker dollar, growing liquidity).",
        "x-unit": "score from -100 to +100"
       },
       "components": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "time": {
           "type": "string",
           "format": "date-time",
           "description": "Point-in-time value: the date of the most recent input. See `oldest_input_date` for the stalest one.",
           "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
          },
          "metric": {
           "type": "string",
           "description": "Input name."
          },
          "change_pct": {
           "type": "number",
           "description": "Relative change of the input over the window, percent.",
           "x-unit": "percent (58.5 = 58.5 %)"
          },
          "contribution": {
           "type": "number",
           "description": "Contribution of the input to the score.",
           "x-unit": "dimensionless score"
          }
         }
        },
        "description": "The inputs of the score and their contributions."
       }
      }
     },
     "90d": {
      "type": "object",
      "properties": {
       "score": {
        "type": "number",
        "description": "Macro momentum for crypto: positive = macro tailwind (weaker dollar, growing liquidity).",
        "x-unit": "score from -100 to +100"
       },
       "components": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "time": {
           "type": "string",
           "format": "date-time",
           "description": "Point-in-time value: the date of the most recent input. See `oldest_input_date` for the stalest one.",
           "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
          },
          "metric": {
           "type": "string",
           "description": "Input name."
          },
          "change_pct": {
           "type": "number",
           "description": "Relative change of the input over the window, percent.",
           "x-unit": "percent (58.5 = 58.5 %)"
          },
          "contribution": {
           "type": "number",
           "description": "Contribution of the input to the score.",
           "x-unit": "dimensionless score"
          }
         }
        },
        "description": "The inputs of the score and their contributions."
       }
      }
     }
    },
    "required": [
     "time",
     "oldest_input_date",
     "scale",
     "30d",
     "90d"
    ]
   },
   "MacroMomentumResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_momentum",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroMomentum"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroNetLiquidity": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "net_liquidity_usd": {
      "type": "number",
      "description": "Fed balance sheet (WALCL) - Treasury General Account (TGA) - overnight reverse repo (ON RRP), in USD.",
      "x-unit": "USD"
     },
     "walcl_usd": {
      "type": "number",
      "description": "Fed total assets (WALCL), as known on that day.",
      "x-unit": "USD"
     },
     "tga_usd": {
      "type": "number",
      "description": "Treasury General Account (WTREGEN), as known on that day.",
      "x-unit": "USD"
     },
     "rrp_usd": {
      "type": "number",
      "description": "Overnight reverse repo (RRPONTSYD) of that day.",
      "x-unit": "USD"
     },
     "walcl_date": {
      "type": "string",
      "format": "date",
      "description": "Observation day of the WALCL value used (weekly series).",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "tga_date": {
      "type": "string",
      "format": "date",
      "description": "Observation day of the TGA value used (weekly series).",
      "x-unit": "calendar date (YYYY-MM-DD)"
     }
    },
    "required": [
     "time",
     "net_liquidity_usd",
     "walcl_usd",
     "tga_usd",
     "rrp_usd",
     "walcl_date",
     "tga_date"
    ]
   },
   "MacroNetLiquidityHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "net_liquidity_usd": {
      "type": "number",
      "description": "Fed balance sheet (WALCL) - Treasury General Account (TGA) - overnight reverse repo (ON RRP), in USD.",
      "x-unit": "USD"
     },
     "walcl_usd": {
      "type": "number",
      "description": "Fed total assets (WALCL), as known on that day.",
      "x-unit": "USD"
     },
     "tga_usd": {
      "type": "number",
      "description": "Treasury General Account (WTREGEN), as known on that day.",
      "x-unit": "USD"
     },
     "rrp_usd": {
      "type": "number",
      "description": "Overnight reverse repo (RRPONTSYD) of that day.",
      "x-unit": "USD"
     },
     "walcl_date": {
      "type": "string",
      "format": "date",
      "description": "Observation day of the WALCL value used (weekly series).",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "tga_date": {
      "type": "string",
      "format": "date",
      "description": "Observation day of the TGA value used (weekly series).",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "net_liquidity_usd",
     "walcl_usd",
     "tga_usd",
     "rrp_usd",
     "walcl_date",
     "tga_date",
     "is_closed"
    ]
   },
   "MacroNetLiquidityHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_net_liquidity_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/MacroNetLiquidityHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroNetLiquidityResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_net_liquidity",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroNetLiquidity"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "series": {
      "type": "string",
      "description": "Series identifier."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Macro"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroRisk": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oldest_input_date": {
      "type": "string",
      "format": "date",
      "description": "Date of the OLDEST input the value uses (a monthly series lags a daily one): the value cannot be fresher than this input. `time` is the most recent input; each component carries its own date.",
      "x-unit": "calendar date (YYYY-MM-DD)"
     },
     "score": {
      "type": "number",
      "description": "Share of risk-on signals × 100.",
      "x-unit": "score from 0 to 100"
     },
     "label": {
      "type": "string",
      "description": "`risk_on` (score above 50), `risk_off` (below 50) or `neutral` (exactly 50)."
     },
     "risk_on_signal_count": {
      "type": "integer",
      "description": "Signals currently risk-on.",
      "x-unit": "count"
     },
     "available_signal_count": {
      "type": "integer",
      "description": "Signals that could be evaluated (data available).",
      "x-unit": "count"
     },
     "signal_count": {
      "type": "integer",
      "description": "Signals in the model.",
      "x-unit": "count"
     },
     "signals": {
      "type": "object",
      "properties": {
       "vix": {
        "type": "object",
        "properties": {
         "time": {
          "type": "string",
          "format": "date-time",
          "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
          "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
         },
         "condition": {
          "type": "string",
          "description": "Rule of the signal."
         },
         "is_risk_on": {
          "type": "boolean",
          "description": "Whether the signal is risk-on now."
         }
        },
        "description": "CBOE Volatility Index."
       },
       "dxy": {
        "type": "object",
        "properties": {
         "time": {
          "type": "string",
          "format": "date-time",
          "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
          "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
         },
         "condition": {
          "type": "string",
          "description": "Rule of the signal."
         },
         "is_risk_on": {
          "type": "boolean",
          "description": "Whether the signal is risk-on now."
         }
        },
        "description": "US Dollar Index."
       },
       "yield_curve": {
        "type": "object",
        "properties": {
         "time": {
          "type": "string",
          "format": "date-time",
          "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
          "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
         },
         "condition": {
          "type": "string",
          "description": "Rule of the signal."
         },
         "is_risk_on": {
          "type": "boolean",
          "description": "Whether the signal is risk-on now."
         }
        }
       },
       "sp500": {
        "type": "object",
        "properties": {
         "time": {
          "type": "string",
          "format": "date-time",
          "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
          "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
         },
         "condition": {
          "type": "string",
          "description": "Rule of the signal."
         },
         "is_risk_on": {
          "type": "boolean",
          "description": "Whether the signal is risk-on now."
         }
        },
        "description": "S&P 500."
       },
       "gold": {
        "type": "object",
        "properties": {
         "time": {
          "type": "string",
          "format": "date-time",
          "description": "Point-in-time value: the date of the most recent signal. See `oldest_input_date` for the stalest one.",
          "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
         },
         "condition": {
          "type": "string",
          "description": "Rule of the signal."
         },
         "is_risk_on": {
          "type": "boolean",
          "description": "Whether the signal is risk-on now."
         }
        }
       }
      },
      "description": "Each signal: its `condition` and whether it is risk-on now (`is_risk_on`)."
     },
     "context": {
      "type": "object",
      "properties": {
       "vix": {
        "type": "number",
        "description": "CBOE Volatility Index.",
        "x-unit": "index points"
       },
       "dxy": {
        "type": "number",
        "description": "US Dollar Index.",
        "x-unit": "index points"
       },
       "dxy_7d_ago": {
        "type": "number",
        "description": "US Dollar Index seven days earlier.",
        "x-unit": "index points"
       },
       "yield_curve_10y2y_pp": {
        "type": "number",
        "description": "10-year minus 2-year US Treasury yield.",
        "x-unit": "percentage points"
       },
       "sp500": {
        "type": "number",
        "description": "S&P 500.",
        "x-unit": "index points"
       },
       "sp500_sma_50d": {
        "type": "number",
        "description": "50-day simple moving average of the S&P 500.",
        "x-unit": "index points"
       },
       "gold_usd": {
        "type": "number",
        "description": "Gold price.",
        "x-unit": "USD per troy ounce"
       },
       "gold_7d_ago_usd": {
        "type": "number",
        "description": "Gold price seven days earlier.",
        "x-unit": "USD per troy ounce"
       }
      },
      "description": "The raw inputs used by the signals."
     }
    },
    "required": [
     "time",
     "oldest_input_date",
     "score",
     "label",
     "risk_on_signal_count",
     "available_signal_count",
     "signal_count",
     "signals",
     "context"
    ]
   },
   "MacroRiskResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_risk",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroRisk"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MacroSeriesInfo": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day of the latest observation of the series, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "series_id": {
      "type": "string",
      "description": "Series identifier."
     },
     "category": {
      "type": "string",
      "description": "Series category."
     },
     "name": {
      "type": "string",
      "description": "Human-readable name of the series."
     },
     "frequency": {
      "type": "string",
      "description": "Publication frequency of the source (`daily`, `weekly`, `monthly`)."
     },
     "units": {
      "type": "string",
      "description": "Unit of `value` as published by the source."
     },
     "value": {
      "type": "number",
      "description": "Value of the series.",
      "x-unit": "dimensionless score"
     }
    },
    "required": [
     "time",
     "series_id",
     "category",
     "name",
     "frequency",
     "units",
     "value"
    ]
   },
   "MacroSeriesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "macro_series",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/MacroSeriesInfo"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "MiningDataset": {
    "type": "string",
    "enum": [
     "concentration",
     "rewards",
     "difficulty",
     "fee_rates"
    ],
    "x-enum-varnames": [
     "CONCENTRATION",
     "REWARDS",
     "DIFFICULTY",
     "FEE_RATES"
    ],
    "description": "Mining series of `/v1/btc/mining/history`."
   },
   "Oi": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the latest reading summed (the same as `/v1/oi/delta`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi": {
      "type": "number",
      "description": "Total open interest across venues, base asset units. On a bucketed row, the value at the END of the bucket (like a close); on `/v1/oi/delta`, the latest measurement.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     }
    },
    "required": [
     "time",
     "oi"
    ]
   },
   "OiDelta": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement; the change covers the minute before it.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi": {
      "type": "number",
      "description": "Total open interest across venues, base asset units. On a bucketed row, the value at the END of the bucket (like a close); on `/v1/oi/delta`, the latest measurement.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_previous": {
      "type": "number",
      "description": "Total open interest at the start of the window.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_change": {
      "type": "number",
      "description": "oi - oi_previous, base asset units.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_change_pct": {
      "type": "number",
      "description": "Relative open interest change, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "oi",
     "oi_previous",
     "oi_change",
     "oi_change_pct",
     "window_start",
     "window_s"
    ]
   },
   "OiDeltaHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket of `timeframe`, the value aggregating the bucket's minutes; the row covers `window_start` to `window_start + window_s`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi": {
      "type": "number",
      "description": "Total open interest across venues, base asset units. On a bucketed row, the value at the END of the bucket (like a close); on `/v1/oi/delta`, the latest measurement.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_previous": {
      "type": "number",
      "description": "Total open interest at the start of the window.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_change": {
      "type": "number",
      "description": "oi - oi_previous, base asset units.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_change_pct": {
      "type": "number",
      "description": "Relative open interest change, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "oi",
     "oi_previous",
     "oi_change",
     "oi_change_pct",
     "sample_count",
     "is_closed",
     "window_start",
     "window_s"
    ]
   },
   "OiDeltaHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "oi_delta_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OiDeltaHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OiDeltaResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "oi_delta",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiDelta"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OiHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi": {
      "type": "number",
      "description": "Total open interest across venues, base asset units. On a bucketed row, the value at the END of the bucket (like a close); on `/v1/oi/delta`, the latest measurement.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "oi",
     "sample_count",
     "is_closed"
    ]
   },
   "OiHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "oi_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OiHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OiResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "oi",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Oi"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainActiveAddresses": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "active_addresses": {
      "type": "number",
      "description": "Addresses active on the day.",
      "x-unit": "count"
     },
     "active_addresses_sma_7d": {
      "type": "number",
      "description": "7-day simple moving average of active_addresses.",
      "x-unit": "count"
     },
     "active_addresses_sma_30d": {
      "type": "number",
      "description": "30-day simple moving average of active_addresses.",
      "x-unit": "count"
     },
     "sma_7d_vs_30d_pct": {
      "type": "number",
      "description": "(7-day simple moving average - 30-day simple moving average) / 30-day average, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "7-day vs 30-day average: `accelerating` (> +5 %), `decelerating` (< -5 %) or `stable`."
     }
    },
    "required": [
     "time",
     "active_addresses",
     "active_addresses_sma_7d",
     "active_addresses_sma_30d",
     "sma_7d_vs_30d_pct",
     "label"
    ]
   },
   "OnchainActiveAddressesHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "active_addresses": {
      "type": "number",
      "description": "Addresses active on the day.",
      "x-unit": "count"
     },
     "active_addresses_sma_7d": {
      "type": "number",
      "description": "7-day simple moving average of active_addresses.",
      "x-unit": "count"
     },
     "active_addresses_sma_30d": {
      "type": "number",
      "description": "30-day simple moving average of active_addresses.",
      "x-unit": "count"
     },
     "sma_7d_vs_30d_pct": {
      "type": "number",
      "description": "(7-day simple moving average - 30-day simple moving average) / 30-day average, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "label": {
      "type": "string",
      "description": "7-day vs 30-day average: `accelerating` (> +5 %), `decelerating` (< -5 %) or `stable`."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "active_addresses",
     "active_addresses_sma_7d",
     "active_addresses_sma_30d",
     "sma_7d_vs_30d_pct",
     "label",
     "is_closed"
    ]
   },
   "OnchainActiveAddressesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_active_addresses_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OnchainActiveAddressesHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainActiveAddressesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_active_addresses",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainActiveAddresses"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainMinerStress": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "revenue_per_difficulty_usd": {
      "type": "number",
      "description": "Miners' daily revenue (USD) divided by the network difficulty of the day: revenue per unit of work. Read it against its 30-day average.",
      "x-unit": "USD per unit of difficulty"
     },
     "revenue_per_difficulty_sma_30d_usd": {
      "type": "number",
      "description": "30-day simple moving average of revenue_per_difficulty_usd.",
      "x-unit": "USD per unit of difficulty"
     },
     "label": {
      "type": "string",
      "description": "`healthy` (at or above its 30-day average), `stress` (below it), `capitulation` (below 70 % of it — historically near BTC bottoms)."
     }
    },
    "required": [
     "time",
     "revenue_per_difficulty_usd",
     "revenue_per_difficulty_sma_30d_usd",
     "label"
    ]
   },
   "OnchainMinerStressHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "revenue_per_difficulty_usd": {
      "type": "number",
      "description": "Miners' daily revenue (USD) divided by the network difficulty of the day: revenue per unit of work. Read it against its 30-day average.",
      "x-unit": "USD per unit of difficulty"
     },
     "revenue_per_difficulty_sma_30d_usd": {
      "type": "number",
      "description": "30-day simple moving average of revenue_per_difficulty_usd.",
      "x-unit": "USD per unit of difficulty"
     },
     "label": {
      "type": "string",
      "description": "`healthy` (at or above its 30-day average), `stress` (below it), `capitulation` (below 70 % of it — historically near BTC bottoms)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "revenue_per_difficulty_usd",
     "revenue_per_difficulty_sma_30d_usd",
     "label",
     "is_closed"
    ]
   },
   "OnchainMinerStressHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_miner_stress_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OnchainMinerStressHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainMinerStressResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_miner_stress",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainMinerStress"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainMvrv": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "mvrv": {
      "type": "number",
      "description": "Market value / realised value.",
      "x-unit": "dimensionless ratio"
     },
     "label": {
      "type": "string",
      "description": "`undervalued` (<= 1), `fair` (> 1), `elevated` (> 2.5), `overvalued` (> 3.5)."
     },
     "change_30d_pct": {
      "type": "number",
      "description": "Relative change of the value over 30 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     }
    },
    "required": [
     "time",
     "mvrv",
     "label",
     "change_30d_pct"
    ]
   },
   "OnchainMvrvHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "mvrv": {
      "type": "number",
      "description": "Market value / realised value.",
      "x-unit": "dimensionless ratio"
     },
     "label": {
      "type": "string",
      "description": "`undervalued` (<= 1), `fair` (> 1), `elevated` (> 2.5), `overvalued` (> 3.5)."
     },
     "change_30d_pct": {
      "type": "number",
      "description": "Relative change of the value over 30 days, percent.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "mvrv",
     "label",
     "change_30d_pct",
     "is_closed"
    ]
   },
   "OnchainMvrvHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_mvrv_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OnchainMvrvHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainMvrvResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_mvrv",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainMvrv"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainNvt": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "nvt": {
      "type": "number",
      "description": "Market cap / daily on-chain transaction volume (NVT ratio).",
      "x-unit": "dimensionless ratio"
     },
     "nvt_signal": {
      "type": "number",
      "description": "NVT smoothed over 90 days (NVT Signal), less noisy.",
      "x-unit": "dimensionless ratio"
     },
     "label": {
      "type": "string",
      "description": "Zone of the NVT Signal: `undervalued` (<= 45), `fair` (> 45), `overvalued` (> 100), `bubble` (> 150)."
     }
    },
    "required": [
     "time",
     "nvt",
     "nvt_signal",
     "label"
    ]
   },
   "OnchainNvtHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "nvt": {
      "type": "number",
      "description": "Market cap / daily on-chain transaction volume (NVT ratio).",
      "x-unit": "dimensionless ratio"
     },
     "nvt_signal": {
      "type": "number",
      "description": "NVT smoothed over 90 days (NVT Signal), less noisy.",
      "x-unit": "dimensionless ratio"
     },
     "label": {
      "type": "string",
      "description": "Zone of the NVT Signal: `undervalued` (<= 45), `fair` (> 45), `overvalued` (> 100), `bubble` (> 150)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "nvt",
     "nvt_signal",
     "label",
     "is_closed"
    ]
   },
   "OnchainNvtHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_nvt_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OnchainNvtHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OnchainNvtResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "onchain_nvt",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainNvt"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsExpiry": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "expiry": {
      "type": "string",
      "format": "date-time",
      "description": "Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "dte_days": {
      "type": "number",
      "description": "Days to expiry (fractional).",
      "x-unit": "days"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call open interest, USD.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest, USD.",
      "x-unit": "USD"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "max_pain_strike_usd": {
      "type": "number",
      "description": "Strike at which option holders lose the most at expiry (max pain).",
      "x-unit": "USD"
     },
     "top_call_strike_usd": {
      "type": "number",
      "description": "Strike with the largest call open interest.",
      "x-unit": "USD"
     },
     "top_put_strike_usd": {
      "type": "number",
      "description": "Strike with the largest put open interest.",
      "x-unit": "USD"
     },
     "iv_atm_pct": {
      "type": "number",
      "description": "At-the-money implied volatility of THIS expiry, annualised, in percent (55.2 = 55.2 %).",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "put_call_label": {
      "type": "string",
      "description": "`bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1)."
     }
    },
    "required": [
     "time",
     "expiry",
     "dte_days",
     "oi_call_usd",
     "oi_put_usd",
     "put_call_ratio",
     "max_pain_strike_usd",
     "top_call_strike_usd",
     "top_put_strike_usd",
     "iv_atm_pct",
     "put_call_label"
    ]
   },
   "OptionsExpiryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_expiry",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsExpiry"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsGreeks": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "delta": {
      "type": "number",
      "description": "Aggregated delta of open options, OI-weighted (per unit of underlying).",
      "x-unit": "delta"
     },
     "gamma": {
      "type": "number",
      "description": "Change of delta for a 1 USD move of the underlying, OI-weighted.",
      "x-unit": "delta per USD"
     },
     "theta": {
      "type": "number",
      "description": "Time decay per day, OI-weighted.",
      "x-unit": "USD per day"
     },
     "vega": {
      "type": "number",
      "description": "Value change for +1 point of implied volatility, OI-weighted.",
      "x-unit": "USD per volatility point"
     },
     "coverage": {
      "type": "object",
      "properties": {
       "oi_coverage_ratio": {
        "type": "number",
        "description": "Share of the open interest covered by the contributing venues.",
        "x-unit": "fraction (0.585 = 58.5 %)"
       }
      },
      "description": "`oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all)."
     }
    },
    "required": [
     "time",
     "delta",
     "gamma",
     "theta",
     "vega",
     "coverage"
    ]
   },
   "OptionsGreeksResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_greeks",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsGreeks"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsIv": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "iv_atm_30d_pct": {
      "type": "number",
      "description": "At-the-money implied volatility at a constant 30-day maturity, annualised, in percent (55.2 = 55.2 %). Interpolated in total variance (IV² × time) between the two expiries around 30 days, so it does not jump when the nearest expiry rolls off; the ATM IV of each expiry is on `/v1/options/expiry`.",
      "x-unit": "percent (58.5 = 58.5 %)"
     }
    },
    "required": [
     "time",
     "iv_atm_30d_pct"
    ]
   },
   "OptionsIvKline": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the value is the LAST options snapshot of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "open": {
      "type": "number",
      "description": "30-day ATM IV at the start of the bucket.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "high": {
      "type": "number",
      "description": "Highest 30-day ATM IV.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "low": {
      "type": "number",
      "description": "Lowest 30-day ATM IV.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "close": {
      "type": "number",
      "description": "30-day ATM IV at the end of the bucket.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "open",
     "high",
     "low",
     "close",
     "is_closed"
    ]
   },
   "OptionsIvKlinesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_iv_klines",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsIvKline"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsIvResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_iv",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsIv"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsMaxPain": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "expiry": {
      "type": "string",
      "format": "date-time",
      "description": "Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "dte_days": {
      "type": "number",
      "description": "Days to expiry (fractional).",
      "x-unit": "days"
     },
     "max_pain_strike_usd": {
      "type": "number",
      "description": "Strike at which option holders lose the most at expiry (max pain).",
      "x-unit": "USD"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call open interest, USD.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest, USD.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "expiry",
     "dte_days",
     "max_pain_strike_usd",
     "put_call_ratio",
     "oi_call_usd",
     "oi_put_usd"
    ]
   },
   "OptionsMaxPainHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The instant of the options snapshot the max pain was computed on (one row per snapshot, about every minute; no `timeframe`).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "max_pain_strike_usd": {
      "type": "number",
      "description": "Strike at which option holders lose the most at expiry (max pain).",
      "x-unit": "USD"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "max_pain_strike_usd",
     "put_call_ratio",
     "is_closed"
    ]
   },
   "OptionsMaxPainHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_max_pain_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "expiry": {
      "type": "string",
      "format": "date",
      "description": "Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsMaxPainHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsMaxPainResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_max_pain",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsMaxPain"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsOi": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi_total_usd": {
      "type": "number",
      "description": "Total open interest, USD.",
      "x-unit": "USD"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call open interest, USD.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest, USD.",
      "x-unit": "USD"
     },
     "oi_call": {
      "type": "number",
      "description": "Call open interest, in coins (base asset).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_put": {
      "type": "number",
      "description": "Put open interest, in coins (base asset).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "coverage": {
      "type": "object",
      "properties": {
       "oi_coverage_ratio": {
        "type": "number",
        "description": "Share of the open interest covered by the contributing venues.",
        "x-unit": "fraction (0.585 = 58.5 %)"
       }
      },
      "description": "`oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all)."
     }
    },
    "required": [
     "time",
     "oi_total_usd",
     "oi_call_usd",
     "oi_put_usd",
     "oi_call",
     "oi_put",
     "coverage"
    ]
   },
   "OptionsOiDelta": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi_change_call_usd": {
      "type": "number",
      "description": "Change of call open interest over the bucket, USD.",
      "x-unit": "USD"
     },
     "oi_change_put_usd": {
      "type": "number",
      "description": "Change of put open interest over the bucket, USD.",
      "x-unit": "USD"
     },
     "oi_change_total_usd": {
      "type": "number",
      "description": "Change of total open interest over the bucket, USD.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "oi_change_call_usd",
     "oi_change_put_usd",
     "oi_change_total_usd"
    ]
   },
   "OptionsOiDeltaHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the value is the LAST options snapshot of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi_change_call_usd": {
      "type": "number",
      "description": "Change of call open interest over the bucket, USD.",
      "x-unit": "USD"
     },
     "oi_change_put_usd": {
      "type": "number",
      "description": "Change of put open interest over the bucket, USD.",
      "x-unit": "USD"
     },
     "oi_change_total_usd": {
      "type": "number",
      "description": "Change of total open interest over the bucket, USD.",
      "x-unit": "USD"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "oi_change_call_usd",
     "oi_change_put_usd",
     "oi_change_total_usd",
     "is_closed"
    ]
   },
   "OptionsOiDeltaHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_oi_delta_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsOiDeltaHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsOiDeltaResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_oi_delta",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsOiDelta"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsOiDistribution": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "expiry": {
      "type": "string",
      "format": "date-time",
      "description": "Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "strike_usd": {
      "type": "number",
      "description": "Strike price.",
      "x-unit": "USD"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "string",
       "null"
      ],
      "description": "Call open interest at this strike, USD. `null` = no call listed.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest at this strike, USD. `null` = no put listed.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "expiry",
     "strike_usd",
     "oi_call_usd",
     "oi_put_usd"
    ]
   },
   "OptionsOiDistributionResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_oi_distribution",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsOiDistribution"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     },
     "expiry": {
      "type": "string",
      "description": "Effective `expiry` of the request."
     }
    }
   },
   "OptionsOiHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the value is the LAST options snapshot of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "oi_total_usd": {
      "type": "number",
      "description": "Total open interest, USD.",
      "x-unit": "USD"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call open interest, USD.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest, USD.",
      "x-unit": "USD"
     },
     "oi_call": {
      "type": "number",
      "description": "Call open interest, in coins (base asset).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "oi_put": {
      "type": "number",
      "description": "Put open interest, in coins (base asset).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "oi_total_usd",
     "oi_call_usd",
     "oi_put_usd",
     "oi_call",
     "oi_put",
     "is_closed"
    ]
   },
   "OptionsOiHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_oi_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsOiHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsOiResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_oi",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsOi"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsPcRatio": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "label": {
      "type": "string",
      "description": "`bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1)."
     }
    },
    "required": [
     "time",
     "put_call_ratio",
     "label"
    ]
   },
   "OptionsPcRatioHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the value is the LAST options snapshot of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "label": {
      "type": "string",
      "description": "`bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1)."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "put_call_ratio",
     "label",
     "is_closed"
    ]
   },
   "OptionsPcRatioHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_pc_ratio_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsPcRatioHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsPcRatioResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_pc_ratio",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsPcRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsSummary": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "underlying_price_usd": {
      "type": "number",
      "description": "Index (spot) price of the underlying, from the options venues. Each expiry's ATM strike and greeks use that expiry's own forward price.",
      "x-unit": "USD"
     },
     "oi_total_usd": {
      "type": "number",
      "description": "Total open interest, USD.",
      "x-unit": "USD"
     },
     "oi_call_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call open interest, USD.",
      "x-unit": "USD"
     },
     "oi_put_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put open interest, USD.",
      "x-unit": "USD"
     },
     "volume_total_usd": {
      "type": "number",
      "description": "Total traded volume, USD.",
      "x-unit": "USD"
     },
     "volume_call_usd": {
      "type": "number",
      "description": "Call volume, USD.",
      "x-unit": "USD"
     },
     "volume_put_usd": {
      "type": "number",
      "description": "Put volume, USD.",
      "x-unit": "USD"
     },
     "put_call_ratio": {
      "type": "number",
      "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
      "x-unit": "puts / calls"
     },
     "put_call_label": {
      "type": "string",
      "description": "`bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1)."
     },
     "iv_atm_30d_pct": {
      "type": "number",
      "description": "At-the-money implied volatility at a constant 30-day maturity, annualised, in percent (55.2 = 55.2 %). Interpolated in total variance (IV² × time) between the two expiries around 30 days, so it does not jump when the nearest expiry rolls off; the ATM IV of each expiry is on `/v1/options/expiry`.",
      "x-unit": "percent (58.5 = 58.5 %)"
     },
     "nearest_expiry": {
      "type": "object",
      "properties": {
       "expiry": {
        "type": "string",
        "format": "date-time",
        "description": "Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter.",
        "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
       },
       "dte_days": {
        "type": "number",
        "description": "Days to expiry (fractional).",
        "x-unit": "days"
       },
       "max_pain_strike_usd": {
        "type": "number",
        "description": "Strike at which option holders lose the most at expiry (max pain).",
        "x-unit": "USD"
       },
       "put_call_ratio": {
        "type": "number",
        "description": "Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.",
        "x-unit": "puts / calls"
       },
       "iv_atm_pct": {
        "type": "number",
        "description": "At-the-money implied volatility of THIS expiry, annualised, in percent (55.2 = 55.2 %).",
        "x-unit": "percent (58.5 = 58.5 %)"
       }
      },
      "description": "The next expiry: date, days left, max pain, put/call ratio, ATM IV."
     },
     "coverage": {
      "type": "object",
      "properties": {
       "oi_coverage_ratio": {
        "type": "number",
        "description": "Share of the open interest covered by the contributing venues.",
        "x-unit": "fraction (0.585 = 58.5 %)"
       }
      },
      "description": "`oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all)."
     }
    },
    "required": [
     "time",
     "underlying_price_usd",
     "oi_total_usd",
     "oi_call_usd",
     "oi_put_usd",
     "volume_total_usd",
     "volume_call_usd",
     "volume_put_usd",
     "put_call_ratio",
     "put_call_label",
     "iv_atm_30d_pct",
     "nearest_expiry",
     "coverage"
    ]
   },
   "OptionsSummaryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_summary",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsSummary"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsTimeframe": {
    "type": "string",
    "enum": [
     "5m",
     "15m",
     "30m",
     "1h",
     "4h",
     "1d"
    ],
    "x-enum-varnames": [
     "M5",
     "M15",
     "M30",
     "H1",
     "H4",
     "D1"
    ],
    "description": "Bucket size on options routes (no `1m`)."
   },
   "OptionsVolume": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the options snapshot (all venues read together).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "volume_total_usd": {
      "type": "number",
      "description": "Total traded volume, USD.",
      "x-unit": "USD"
     },
     "volume_call_usd": {
      "type": "number",
      "description": "Call volume, USD.",
      "x-unit": "USD"
     },
     "volume_put_usd": {
      "type": "number",
      "description": "Put volume, USD.",
      "x-unit": "USD"
     },
     "coverage": {
      "type": "object",
      "properties": {
       "oi_coverage_ratio": {
        "type": "number",
        "description": "Share of the open interest covered by the contributing venues.",
        "x-unit": "fraction (0.585 = 58.5 %)"
       }
      },
      "description": "`oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all)."
     }
    },
    "required": [
     "time",
     "volume_total_usd",
     "volume_call_usd",
     "volume_put_usd",
     "coverage"
    ]
   },
   "OptionsVolumeHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the value is the LAST options snapshot of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "volume_total_usd": {
      "type": "number",
      "description": "Total traded volume, USD.",
      "x-unit": "USD"
     },
     "volume_call_usd": {
      "type": "number",
      "description": "Call volume, USD.",
      "x-unit": "USD"
     },
     "volume_put_usd": {
      "type": "number",
      "description": "Put volume, USD.",
      "x-unit": "USD"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "volume_total_usd",
     "volume_call_usd",
     "volume_put_usd",
     "is_closed"
    ]
   },
   "OptionsVolumeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_volume_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OptionsVolumeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OptionsVolumeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "options_volume",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "asset": {
      "type": "string",
      "description": "Asset, e.g. `BTC`."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsVolume"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Order": {
    "type": "string",
    "enum": [
     "asc",
     "desc"
    ],
    "x-enum-varnames": [
     "ASC",
     "DESC"
    ],
    "description": "Reading order: `desc` (most recent first) or `asc` (oldest first)."
   },
   "Orderbook": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket; the depth is the photo of the order book at the END of the bucket.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "ranges": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "range_pct": {
         "type": "number",
         "description": "Half-width of the range around each venue's mid price ((best bid + best ask) / 2): `1.0` = bids down to -1 % and asks up to +1 %.",
         "x-unit": "percent (58.5 = 58.5 %)"
        },
        "bids_quantity": {
         "type": [
          "number",
          "null"
         ],
         "description": "Resting BUY orders inside the range (price >= mid × (1 - range_pct/100)), summed across venues. `null` = no venue publishes its book that deep.",
         "x-unit": "base asset quantity (BTC for BTCUSDT)"
        },
        "asks_quantity": {
         "type": [
          "number",
          "null"
         ],
         "description": "Resting SELL orders inside the range (price <= mid × (1 + range_pct/100)), summed across venues. `null` = not measured.",
         "x-unit": "base asset quantity (BTC for BTCUSDT)"
        },
        "bids_usd": {
         "type": "number",
         "description": "USD value (Σ price × quantity) of the buy orders inside the range.",
         "x-unit": "USD"
        },
        "asks_usd": {
         "type": "number",
         "description": "USD value (Σ price × quantity) of the sell orders inside the range.",
         "x-unit": "USD"
        },
        "imbalance_ratio": {
         "type": [
          "number",
          "null"
         ],
         "description": "(bids_usd - asks_usd) / (bids_usd + asks_usd). Positive = more bids than asks. `null` when one side is not measured.",
         "x-unit": "fraction from -1 to 1"
        }
       }
      },
      "description": "One entry per price range around the mid price, from the tightest (±0.25 %) to the widest (±10 %). Each range is cumulative: ±1 % includes everything inside ±0.5 %."
     }
    },
    "required": [
     "time",
     "is_closed",
     "ranges"
    ]
   },
   "OrderbookFuturesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook_futures_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Orderbook"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OrderbookFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OrderbookHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Orderbook"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OrderbookResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OrderbookSpotHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook_spot_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Orderbook"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "OrderbookSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "orderbook_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "PostIndicatorsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "indicators",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Indicators"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "PriceChange": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the latest closed one-minute candle; `price` is its close. Exception: USDTUSDC, which no spot candle source lists, gives the instant of its latest trade, `price` being the volume-weighted price of its last 90 seconds.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "price": {
      "type": "number",
      "description": "Price.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "changes_pct": {
      "type": "object",
      "properties": {
       "1m": {
        "type": "number",
        "x-unit": "percent"
       },
       "5m": {
        "type": "number",
        "x-unit": "percent"
       },
       "15m": {
        "type": "number",
        "x-unit": "percent"
       },
       "30m": {
        "type": "number",
        "x-unit": "percent"
       },
       "1h": {
        "type": "number",
        "x-unit": "percent"
       },
       "4h": {
        "type": [
         "number",
         "null"
        ],
        "x-unit": "percent"
       },
       "1d": {
        "type": [
         "number",
         "null"
        ],
        "x-unit": "percent"
       },
       "1w": {
        "type": [
         "number",
         "null"
        ],
        "x-unit": "percent"
       }
      },
      "description": "Price change over each window, keyed by window (`1m` … `1w`), in percent."
     }
    },
    "required": [
     "time",
     "price",
     "changes_pct"
    ]
   },
   "PriceChangeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "price_change",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/PriceChange"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "ResponseStatus": {
    "type": "string",
    "enum": [
     "ok"
    ],
    "description": "`ok` on success (an error answers `error`, see `Error`)."
   },
   "Snapshot": {
    "type": "object",
    "properties": {
     "basis": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Basis"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Basis"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Futures-spot basis (N latest minutes). Same content as `/v1/basis`. Value: depth N (at most 60), or `true` for 1."
     },
     "btc_fees": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcFees"
       },
       {
        "type": "null"
       }
      ],
      "description": "Recommended Bitcoin fees. Same content as `/v1/btc/fees`. Value: `true` (or 1): the latest value only."
     },
     "btc_mempool": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcMempool"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin mempool. Same content as `/v1/btc/mempool`. Value: `true` (or 1): the latest value only."
     },
     "btc_mining": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcMining"
       },
       {
        "type": "null"
       }
      ],
      "description": "Mining pool concentration. Same content as `/v1/btc/mining`. Value: `true` (or 1): the latest value only."
     },
     "btc_network": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BtcNetwork"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin network state. Same content as `/v1/btc/network`. Value: `true` (or 1): the latest value only."
     },
     "buysell_ratio": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BuysellRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "Buy/sell volume ratio. Same content as `/v1/buysell/ratio`. Value: `true` (or 1): the latest value only."
     },
     "eth_defi": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthDefi"
       },
       {
        "type": "null"
       }
      ],
      "description": "Ethereum DeFi. Same content as `/v1/eth/defi`. Value: `true` (or 1): the latest value only."
     },
     "eth_deflation": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthDeflation"
       },
       {
        "type": "null"
       }
      ],
      "description": "ETH deflation. Same content as `/v1/eth/deflation`. Value: `true` (or 1): the latest value only."
     },
     "eth_gas": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthGas"
       },
       {
        "type": "null"
       }
      ],
      "description": "Ethereum gas. Same content as `/v1/eth/gas`. Value: `true` (or 1): the latest value only."
     },
     "eth_gas_momentum": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthGasMomentum"
       },
       {
        "type": "null"
       }
      ],
      "description": "Gas momentum. Same content as `/v1/eth/gas-momentum`. Value: `true` (or 1): the latest value only."
     },
     "eth_ratio": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "ETH/BTC ratio. Same content as `/v1/eth/ratio`. Value: `true` (or 1): the latest value only."
     },
     "eth_squeeze": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthSqueeze"
       },
       {
        "type": "null"
       }
      ],
      "description": "ETH supply squeeze index. Same content as `/v1/eth/squeeze`. Value: `true` (or 1): the latest value only."
     },
     "eth_staking": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthStaking"
       },
       {
        "type": "null"
       }
      ],
      "description": "ETH staking. Same content as `/v1/eth/staking`. Value: `true` (or 1): the latest value only."
     },
     "eth_supply": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/EthSupply"
       },
       {
        "type": "null"
       }
      ],
      "description": "ETH supply and burn. Same content as `/v1/eth/supply`. Value: `true` (or 1): the latest value only."
     },
     "fear_greed": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FearGreed"
       },
       {
        "type": "null"
       }
      ],
      "description": "Crypto Fear & Greed Index. Same content as `/v1/fear-greed`. Value: `true` (or 1): the latest value only."
     },
     "funding_cumulative": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingCumulative"
       },
       {
        "type": "null"
       }
      ],
      "description": "Funding summed over 24 h. Same content as `/v1/funding/cumulative`. Value: `true` (or 1): the latest value only."
     },
     "funding_next": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingNext"
       },
       {
        "type": "null"
       }
      ],
      "description": "Next funding forecast. Same content as `/v1/funding/next`. Value: `true` (or 1): the latest value only."
     },
     "funding_rate": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/FundingRate"
       },
       {
        "type": "null"
       }
      ],
      "description": "Latest settled funding window. Same content as `/v1/funding/rate`. Value: `true` (or 1): the latest value only."
     },
     "global": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/GlobalMarket"
       },
       {
        "type": "null"
       }
      ],
      "description": "Total crypto market cap and dominance. Same content as `/v1/global`. Value: `true` (or 1): the latest value only."
     },
     "heatmap_clusters": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/HeatmapClusters"
       },
       {
        "type": "null"
       }
      ],
      "description": "Liquidation heatmap clusters. Same content as `/v1/heatmap/clusters`. Value: `true` (or 1): the latest value only."
     },
     "liquidations_cumulative": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/LiquidationsCumulative"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/LiquidationsCumulative"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Liquidations long/short USD (N latest minutes). Same content as `/v1/liquidations/cumulative`. Value: depth N (at most 1440), or `true` for 1."
     },
     "liquidations_events": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/LiquidationEvent"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/LiquidationEvent"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Individual liquidations (N latest events, at most your plan's count). Same content as `/v1/liquidations/events`. Value: depth N (at most 10000), or `true` for 1."
     },
     "liquidations_ratio": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/LiquidationsRatio"
       },
       {
        "type": "null"
       }
      ],
      "description": "Big vs small liquidations. Same content as `/v1/liquidations/ratio`. Value: `true` (or 1): the latest value only."
     },
     "macro": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroSeriesInfo"
       },
       {
        "type": "null"
       }
      ],
      "description": "Latest value of every FRED series. Same content as `/v1/macro/series`. Value: `true` (or 1): the latest value only."
     },
     "macro_correlations": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroCorrelations"
       },
       {
        "type": "null"
       }
      ],
      "description": "BTC correlation with DXY, S&P 500, gold, VIX. Same content as `/v1/macro/correlations`. Value: `true` (or 1): the latest value only."
     },
     "macro_momentum": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroMomentum"
       },
       {
        "type": "null"
       }
      ],
      "description": "Macro momentum score. Same content as `/v1/macro/momentum`. Value: `true` (or 1): the latest value only."
     },
     "macro_net_liquidity": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroNetLiquidity"
       },
       {
        "type": "null"
       }
      ],
      "description": "US net liquidity. Same content as `/v1/macro/net-liquidity`. Value: `true` (or 1): the latest value only."
     },
     "macro_risk": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/MacroRisk"
       },
       {
        "type": "null"
       }
      ],
      "description": "Risk-on / risk-off score. Same content as `/v1/macro/risk`. Value: `true` (or 1): the latest value only."
     },
     "oi_delta": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiDelta"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiDelta"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Open interest change (N latest minutes). Same content as `/v1/oi/delta`. Value: depth N (at most 60), or `true` for 1."
     },
     "onchain_active_addresses": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainActiveAddresses"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin active addresses. Same content as `/v1/onchain/active-addresses`. Value: `true` (or 1): the latest value only."
     },
     "onchain_miner_stress": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainMinerStress"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin miner stress. Same content as `/v1/onchain/miner-stress`. Value: `true` (or 1): the latest value only."
     },
     "onchain_mvrv": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainMvrv"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin MVRV. Same content as `/v1/onchain/mvrv`. Value: `true` (or 1): the latest value only."
     },
     "onchain_nvt": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OnchainNvt"
       },
       {
        "type": "null"
       }
      ],
      "description": "Bitcoin NVT. Same content as `/v1/onchain/nvt`. Value: `true` (or 1): the latest value only."
     },
     "options_summary": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OptionsSummary"
       },
       {
        "type": "null"
       }
      ],
      "description": "Options market summary for the symbol's asset. Same content as `/v1/options/summary`. Value: `true` (or 1): the latest value only."
     },
     "price_change": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/PriceChange"
       },
       {
        "type": "null"
       }
      ],
      "description": "Price change over 1m to 1w, in percent. Same content as `/v1/price-change`. Value: `true` (or 1): the latest value only."
     },
     "tokenomics": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Tokenomics"
       },
       {
        "type": "null"
       }
      ],
      "description": "Supply, market cap, FDV. Same content as `/v1/tokenomics`. Value: `true` (or 1): the latest value only."
     },
     "trades_avg_size": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesAvgSize"
       },
       {
        "type": "null"
       }
      ],
      "description": "Average trade size. Same content as `/v1/trades/avg-size`. Value: `true` (or 1): the latest value only."
     },
     "trades_futures": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Trade"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Trade"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Individual futures trades (N trades), bounded by your plan's tick window. Same content as `/v1/trades/futures`. Value: depth N (at most 10000), or `true` for 1."
     },
     "trades_kline_futures_seconds": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKlineSecond"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKlineSecond"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Futures trades aggregated per second (N seconds). Same content as `/v1/trades-kline/futures/seconds`. Value: depth N (at most 1000), or `true` for 1."
     },
     "trades_spot": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Trade"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Trade"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Individual spot trades (N trades), bounded by your plan's tick window. Same content as `/v1/trades/spot`. Value: depth N (at most 10000), or `true` for 1."
     },
     "cvd@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1m. Same content as `/v1/cvd?timeframe=1m`."
     },
     "cvd@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 5m. Same content as `/v1/cvd?timeframe=5m`."
     },
     "cvd@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 15m. Same content as `/v1/cvd?timeframe=15m`."
     },
     "cvd@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 30m. Same content as `/v1/cvd?timeframe=30m`."
     },
     "cvd@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1h. Same content as `/v1/cvd?timeframe=1h`."
     },
     "cvd@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 4h. Same content as `/v1/cvd?timeframe=4h`."
     },
     "cvd@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Cvd"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Cvd"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1d. Same content as `/v1/cvd?timeframe=1d`."
     },
     "klines@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 1m. Same content as `/v1/klines?timeframe=1m`."
     },
     "klines@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 5m. Same content as `/v1/klines?timeframe=5m`."
     },
     "klines@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 15m. Same content as `/v1/klines?timeframe=15m`."
     },
     "klines@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 30m. Same content as `/v1/klines?timeframe=30m`."
     },
     "klines@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 1h. Same content as `/v1/klines?timeframe=1h`."
     },
     "klines@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 4h. Same content as `/v1/klines?timeframe=4h`."
     },
     "klines@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 1d. Same content as `/v1/klines?timeframe=1d`."
     },
     "klines@1w": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Kline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Kline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "OHLCV candles (N latest closed candles). Timeframe 1w. Same content as `/v1/klines?timeframe=1w`."
     },
     "oi_history@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1m. Same content as `/v1/oi/history?timeframe=1m`."
     },
     "oi_history@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 5m. Same content as `/v1/oi/history?timeframe=5m`."
     },
     "oi_history@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 15m. Same content as `/v1/oi/history?timeframe=15m`."
     },
     "oi_history@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 30m. Same content as `/v1/oi/history?timeframe=30m`."
     },
     "oi_history@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1h. Same content as `/v1/oi/history?timeframe=1h`."
     },
     "oi_history@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 4h. Same content as `/v1/oi/history?timeframe=4h`."
     },
     "oi_history@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/OiHistoryItem"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/OiHistoryItem"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1d. Same content as `/v1/oi/history?timeframe=1d`."
     },
     "orderbook@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1m. Same content as `/v1/orderbook?timeframe=1m`."
     },
     "orderbook@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 5m. Same content as `/v1/orderbook?timeframe=5m`."
     },
     "orderbook@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 15m. Same content as `/v1/orderbook?timeframe=15m`."
     },
     "orderbook@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 30m. Same content as `/v1/orderbook?timeframe=30m`."
     },
     "orderbook@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1h. Same content as `/v1/orderbook?timeframe=1h`."
     },
     "orderbook@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 4h. Same content as `/v1/orderbook?timeframe=4h`."
     },
     "orderbook@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Orderbook"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Orderbook"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1d. Same content as `/v1/orderbook?timeframe=1d`."
     },
     "spread_interexchange@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 1m. Same content as `/v1/spread/interexchange?timeframe=1m`."
     },
     "spread_interexchange@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 5m. Same content as `/v1/spread/interexchange?timeframe=5m`."
     },
     "spread_interexchange@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 15m. Same content as `/v1/spread/interexchange?timeframe=15m`."
     },
     "spread_interexchange@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 30m. Same content as `/v1/spread/interexchange?timeframe=30m`."
     },
     "spread_interexchange@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 1h. Same content as `/v1/spread/interexchange?timeframe=1h`."
     },
     "spread_interexchange@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 4h. Same content as `/v1/spread/interexchange?timeframe=4h`."
     },
     "spread_interexchange@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/SpreadInterexchange"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Inter-venue spread per bucket. Timeframe 1d. Same content as `/v1/spread/interexchange?timeframe=1d`."
     },
     "trades_kline@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1m. Same content as `/v1/trades-kline?timeframe=1m`."
     },
     "trades_kline@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 5m. Same content as `/v1/trades-kline?timeframe=5m`."
     },
     "trades_kline@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 15m. Same content as `/v1/trades-kline?timeframe=15m`."
     },
     "trades_kline@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 30m. Same content as `/v1/trades-kline?timeframe=30m`."
     },
     "trades_kline@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1h. Same content as `/v1/trades-kline?timeframe=1h`."
     },
     "trades_kline@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 4h. Same content as `/v1/trades-kline?timeframe=4h`."
     },
     "trades_kline@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1d. Same content as `/v1/trades-kline?timeframe=1d`."
     },
     "trades_kline_futures@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 1m. Same content as `/v1/trades-kline/futures?timeframe=1m`."
     },
     "trades_kline_futures@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 5m. Same content as `/v1/trades-kline/futures?timeframe=5m`."
     },
     "trades_kline_futures@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 15m. Same content as `/v1/trades-kline/futures?timeframe=15m`."
     },
     "trades_kline_futures@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 30m. Same content as `/v1/trades-kline/futures?timeframe=30m`."
     },
     "trades_kline_futures@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 1h. Same content as `/v1/trades-kline/futures?timeframe=1h`."
     },
     "trades_kline_futures@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 4h. Same content as `/v1/trades-kline/futures?timeframe=4h`."
     },
     "trades_kline_futures@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, futures only. Timeframe 1d. Same content as `/v1/trades-kline/futures?timeframe=1d`."
     },
     "trades_kline_spot@1m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 1m. Same content as `/v1/trades-kline/spot?timeframe=1m`."
     },
     "trades_kline_spot@5m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 5m. Same content as `/v1/trades-kline/spot?timeframe=5m`."
     },
     "trades_kline_spot@15m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 15m. Same content as `/v1/trades-kline/spot?timeframe=15m`."
     },
     "trades_kline_spot@30m": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 30m. Same content as `/v1/trades-kline/spot?timeframe=30m`."
     },
     "trades_kline_spot@1h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 1h. Same content as `/v1/trades-kline/spot?timeframe=1h`."
     },
     "trades_kline_spot@4h": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 4h. Same content as `/v1/trades-kline/spot?timeframe=4h`."
     },
     "trades_kline_spot@1d": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/TradesKline"
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Trade candles, spot only. Timeframe 1d. Same content as `/v1/trades-kline/spot?timeframe=1d`."
     }
    }
   },
   "SnapshotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "snapshot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "partial": {
      "type": "boolean"
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Snapshot"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "type": "object",
      "additionalProperties": {
       "$ref": "#/components/schemas/Unavailable"
      },
      "description": "Present only when a requested field is empty: for each such field, why."
     },
     "out_of_plan_fields": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Requested fields your plan does not include: left out of `data`, the others are served."
     },
     "available_fields": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Catalogue (`?symbol=` alone): the single-value fields your plan includes."
     },
     "available_multi_tf_fields": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Catalogue: the fields requested per timeframe, as `<field>@<tf>=<depth>`."
     },
     "multi_tf_syntax": {
      "type": "string",
      "description": "Catalogue: how to request a multi-timeframe field."
     },
     "timeframes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Catalogue: the timeframes a multi-timeframe field accepts by default."
     },
     "timeframes_by_field": {
      "type": "object",
      "additionalProperties": {
       "type": "array",
       "items": {
        "type": "string"
       }
      },
      "description": "Catalogue: the fields whose timeframes differ from `timeframes`."
     },
     "max_depth": {
      "type": "object",
      "additionalProperties": {
       "type": "integer",
       "x-unit": "depth: rows (one-minute values for basis, oi_delta and liquidations_cumulative)"
      },
      "description": "Catalogue: the largest depth each field accepts (a larger one: 422 `depth_too_large`)."
     }
    }
   },
   "SpreadInterexchange": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "ref_price": {
      "type": "number",
      "description": "Reference price: the volume-weighted average price across venues over the bucket.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "weighting": {
      "type": "string",
      "description": "How venues are combined: `oi` (open-interest weighted) or `volume` (volume weighted)."
     },
     "max_spread_bps": {
      "type": "number",
      "description": "Gap between the highest and the lowest venue price, relative to ref_price.",
      "x-unit": "basis points (1 bp = 0.01 %)"
     },
     "high": {
      "type": "object",
      "properties": {
       "venue": {
        "type": "string",
        "description": "Venue name (this route is the only one that names venues)."
       },
       "price": {
        "type": "number",
        "description": "Volume-weighted price of the venue over the bucket.",
        "x-unit": "quote currency (USDT for BTCUSDT)"
       }
      },
      "description": "Venue with the highest price over the bucket, and that price (`{venue, price}`)."
     },
     "low": {
      "type": "object",
      "properties": {
       "venue": {
        "type": "string",
        "description": "Venue name (this route is the only one that names venues)."
       },
       "price": {
        "type": "number",
        "description": "Volume-weighted price of the venue over the bucket.",
        "x-unit": "quote currency (USDT for BTCUSDT)"
       }
      },
      "description": "Venue with the lowest price over the bucket, and that price (`{venue, price}`)."
     },
     "venues": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "venue": {
         "type": "string",
         "description": "Venue name (this route is the only one that names venues)."
        },
        "price": {
         "type": "number",
         "description": "Volume-weighted price of the venue over the bucket.",
         "x-unit": "quote currency (USDT for BTCUSDT)"
        },
        "premium_bps": {
         "type": "number",
         "description": "Venue price premium (positive) or discount (negative) versus ref_price.",
         "x-unit": "basis points (1 bp = 0.01 %)"
        }
       }
      },
      "description": "Per-venue prices and premiums (`[{venue, price, premium_bps}]`)."
     }
    },
    "required": [
     "time",
     "is_closed",
     "ref_price",
     "weighting",
     "max_spread_bps",
     "high",
     "low",
     "venues"
    ]
   },
   "SpreadInterexchangeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "spread_interexchange_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/SpreadInterexchange"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "SpreadInterexchangeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "spread_interexchange",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SpreadInterexchange"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Status": {
    "type": "object",
    "properties": {
     "computed_at": {
      "type": "string",
      "format": "date-time",
      "description": "When the status was computed. It is cached for up to 5 minutes: every `age_s` is measured at this instant, not at `server_time`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "feed_count": {
      "type": "integer",
      "description": "Public feeds checked.",
      "x-unit": "count"
     },
     "stale_feed_count": {
      "type": "integer",
      "description": "Feeds older than their threshold.",
      "x-unit": "count"
     },
     "error_feed_count": {
      "type": "integer",
      "description": "Feeds that could not be checked.",
      "x-unit": "count"
     },
     "max_age_s": {
      "type": "number",
      "description": "Age of the oldest feed.",
      "x-unit": "seconds"
     },
     "feeds": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "feed": {
         "type": "string",
         "description": "Public feed name, after the route that serves it (`trades_kline_futures_1h`, `cvd_source_1m`, `trades_kline_futures_seconds`, `funding_rate`...). The same names key `feeds_active_last_24h` in `/v1/symbols/{symbol}/capabilities`."
        },
        "family": {
         "type": "string",
         "description": "Data family the feed belongs to: `price_volume`, `microstructure`, `derivatives` or `ticks`."
        },
        "age_s": {
         "type": "number",
         "description": "Age of the latest row of the feed.",
         "x-unit": "seconds"
        },
        "expected_interval_s": {
         "type": "integer",
         "description": "Maximum legitimate age of the feed.",
         "x-unit": "seconds"
        },
        "threshold_s": {
         "type": "integer",
         "description": "Age above which the feed is stale (1.5 × expected_interval_s).",
         "x-unit": "seconds"
        },
        "is_stale": {
         "type": "boolean",
         "description": "Whether the feed is stale."
        },
        "stale_venue_count": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Venues lagging on this feed.",
         "x-unit": "count"
        }
       }
      },
      "description": "One row per public feed."
     }
    },
    "required": [
     "computed_at",
     "feed_count",
     "stale_feed_count",
     "error_feed_count",
     "max_age_s",
     "feeds"
    ]
   },
   "StatusResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "type": "string",
      "enum": [
       "ok",
       "degraded"
      ],
      "description": "`ok`, or `degraded` when at least one feed is stale or failed its check (still a 200)."
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "status",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Status"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Symbol": {
    "type": "object",
    "properties": {
     "symbol": {
      "type": "string",
      "description": "Trading pair, e.g. `BTCUSDT`."
     },
     "base_asset": {
      "type": "string",
      "description": "Base asset of the pair."
     },
     "name": {
      "type": "string",
      "description": "Human-readable name."
     },
     "quote_asset": {
      "type": "string",
      "description": "Quote currency of the pair (`USDT` for BTCUSDT, `USDC` for USDTUSDC): the currency of its prices."
     },
     "markets": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Markets served for the pair: `spot` and `futures` (USDT-margined perpetual), or `spot` only for the two stablecoin pairs (their `/futures` routes answer `unavailable: not_applicable`)."
     }
    },
    "required": [
     "symbol",
     "base_asset",
     "name",
     "quote_asset",
     "markets"
    ]
   },
   "SymbolsCapabilities": {
    "type": "object",
    "properties": {
     "asset_class": {
      "type": "string",
      "description": "`crypto` or `stablecoin` (spot only, no futures metrics)."
     },
     "feeds_active_last_24h": {
      "type": "object",
      "properties": {
       "klines_futures_1m": {
        "type": "boolean"
       },
       "trades_spot": {
        "type": "boolean"
       },
       "trades_futures": {
        "type": "boolean"
       },
       "oi_history": {
        "type": "boolean"
       },
       "funding_rate": {
        "type": "boolean"
       },
       "liquidations_events": {
        "type": "boolean"
       },
       "trades_kline_futures_seconds": {
        "type": "boolean"
       },
       "klines_futures_multi": {
        "type": "boolean"
       },
       "klines_1m": {
        "type": "boolean"
       },
       "klines_multi": {
        "type": "boolean"
       }
      },
      "description": "Per source feed, under its `/v1/status` name (`trades_spot`, `trades_kline_futures_seconds`, `oi_history`, `funding_rate`, `klines_1m`...): whether it received data for this symbol in the last 24 h."
     },
     "computed_metrics_available": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Derived metrics available for the symbol."
     },
     "computed_metrics_blocked": {
      "type": "object",
      "properties": {},
      "description": "Derived metrics unavailable, with the missing feeds."
     },
     "feeds_not_applicable": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Feeds that do not exist for this symbol (the futures feeds of a spot-only stablecoin), under their `/v1/status` names."
     },
     "stablecoin_note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Spot-only stablecoin: why its futures feeds and derived metrics do not apply. Absent for any other symbol."
     },
     "computed_metrics_not_applicable": {
      "type": "object",
      "properties": {
       "basis": {
        "type": [
         "string",
         "null"
        ]
       },
       "oi_delta": {
        "type": [
         "string",
         "null"
        ]
       },
       "liquidations_cumulative": {
        "type": [
         "string",
         "null"
        ]
       },
       "liquidations_ratio": {
        "type": [
         "string",
         "null"
        ]
       },
       "funding_cumulative": {
        "type": [
         "string",
         "null"
        ]
       },
       "indicators": {
        "type": [
         "string",
         "null"
        ],
        "description": "One entry per requested indicator id: its parameters, `values` (oldest to newest), `times` (the candle of each value) and `time` (the candle of the last value)."
       }
      },
      "description": "Derived metrics that do not apply (stablecoins have no futures)."
     }
    },
    "required": [
     "asset_class",
     "feeds_active_last_24h",
     "computed_metrics_available",
     "computed_metrics_blocked"
    ]
   },
   "SymbolsCapabilitiesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "symbols_capabilities",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/SymbolsCapabilities"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "SymbolsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "symbols",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Symbol"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Timeframe": {
    "type": "string",
    "enum": [
     "1m",
     "5m",
     "15m",
     "30m",
     "1h",
     "4h",
     "1d"
    ],
    "x-enum-varnames": [
     "M1",
     "M5",
     "M15",
     "M30",
     "H1",
     "H4",
     "D1"
    ],
    "description": "Bucket size of a bucketed series."
   },
   "Tokenomics": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Point-in-time value: the instant of the measurement (when the source was read).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "circulating_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Coins in circulation.",
      "x-unit": "coins"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "max_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Hard cap on supply. `null` = no cap.",
      "x-unit": "coins"
     },
     "price_usd": {
      "type": "number",
      "description": "Latest price used for market_cap_usd and fdv_usd (the USDT price of the pair, read as USD).",
      "x-unit": "USD"
     },
     "priced_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time",
      "description": "Instant of `price_usd` (the row's `time` is the instant of the supply data). `null` when the price is the stablecoin peg.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "market_cap_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "circulating_supply × current price, in USD, derived at request time.",
      "x-unit": "USD"
     },
     "fdv_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Fully diluted valuation: max_supply (or total_supply if uncapped) × price. `null` for stablecoins.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "circulating_supply",
     "total_supply",
     "max_supply",
     "price_usd",
     "priced_at",
     "market_cap_usd",
     "fdv_usd"
    ]
   },
   "TokenomicsHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "The day the value refers to, at midnight UTC.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "price_usd": {
      "type": "number",
      "description": "Daily closing price used for the derived values.",
      "x-unit": "USD"
     },
     "circulating_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Coins in circulation.",
      "x-unit": "coins"
     },
     "total_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total coins issued (circulating + locked), net of burns.",
      "x-unit": "coins"
     },
     "max_supply": {
      "type": [
       "number",
       "null"
      ],
      "description": "Hard cap on supply. `null` = no cap.",
      "x-unit": "coins"
     },
     "market_cap_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "circulating_supply × current price, in USD, derived at request time.",
      "x-unit": "USD"
     },
     "fdv_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Fully diluted valuation: max_supply (or total_supply if uncapped) × price. `null` for stablecoins.",
      "x-unit": "USD"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "price_usd",
     "circulating_supply",
     "total_supply",
     "max_supply",
     "market_cap_usd",
     "fdv_usd",
     "is_closed"
    ]
   },
   "TokenomicsHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "tokenomics_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TokenomicsHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TokenomicsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "tokenomics",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Tokenomics"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Trade": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Execution instant of the trade, as stated by the venue (milliseconds).",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "id": {
      "type": "string",
      "description": "Opaque, stable identifier of the trade (16 hex characters): the same trade always has the same `id`, so it can be used to deduplicate or resume. It reveals nothing about the venue."
     },
     "side": {
      "type": "string",
      "description": "Trades: `buy` or `sell` (aggressor side). Liquidations: `long` or `short` (the position liquidated)."
     },
     "price": {
      "type": "number",
      "description": "Price.",
      "x-unit": "quote currency (USDT for BTCUSDT)"
     },
     "quantity": {
      "type": "number",
      "description": "Quantity traded or liquidated, in base asset units.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "value_usd": {
      "type": "number",
      "description": "Notional value: price × quantity.",
      "x-unit": "USD"
     }
    },
    "required": [
     "time",
     "id",
     "side",
     "price",
     "quantity",
     "value_usd"
    ]
   },
   "TradesAvgSize": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the latest closed one-minute trade candle the value comes from.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "avg_trade_size": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average trade size, base asset units (NOT dollars: multiply by the price for a notional).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Traded volume over the row, base asset units (BTC for BTCUSDT, NOT dollars), aggregated across venues, ALL the markets of the route: spot + perpetual futures on `/v1/klines` and `/v1/trades-kline` (a name without a market suffix covers every market; `volume_spot` / `volume_futures` restrict). `null` when a market is not available (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "trade_count": {
      "type": "integer",
      "description": "Number of trades.",
      "x-unit": "count"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "avg_trade_size",
     "volume",
     "trade_count",
     "is_volume_estimated",
     "window_start",
     "window_s"
    ]
   },
   "TradesAvgSizeFuturesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size_futures_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesAvgSizeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesAvgSizeFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesAvgSize"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesAvgSizeHistoryItem": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket of `timeframe`, the value aggregating the bucket's minutes; the row covers `window_start` to `window_start + window_s`.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "avg_trade_size": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average trade size, base asset units (NOT dollars: multiply by the price for a notional).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Traded volume over the row, base asset units (BTC for BTCUSDT, NOT dollars), aggregated across venues, ALL the markets of the route: spot + perpetual futures on `/v1/klines` and `/v1/trades-kline` (a name without a market suffix covers every market; `volume_spot` / `volume_futures` restrict). `null` when a market is not available (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "trade_count": {
      "type": "integer",
      "description": "Number of trades.",
      "x-unit": "count"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "sample_count": {
      "type": "integer",
      "description": "Number of source points behind the value (one-minute points in a bucket).",
      "x-unit": "count"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     },
     "window_start": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the window the value covers (inclusive), aligned on the minute. The route's `time` says whether it is dated at the start or at the end of this window.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "window_s": {
      "type": "integer",
      "description": "Length of that window, in seconds: it runs from `window_start` to `window_start + window_s` (excluded).",
      "x-unit": "seconds"
     }
    },
    "required": [
     "time",
     "avg_trade_size",
     "volume",
     "trade_count",
     "is_volume_estimated",
     "sample_count",
     "is_closed",
     "window_start",
     "window_s"
    ]
   },
   "TradesAvgSizeHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesAvgSizeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesAvgSizeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesAvgSize"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesAvgSizeSpotHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size_spot_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesAvgSizeHistoryItem"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesAvgSizeSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_avg_size_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesAvgSize"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Trade"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "Present in range reading (`since_ms`, `until_ms` or `order` given): the relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`). `null` once the range is read.",
      "example": "/v1/trades/futures?symbol=BTCUSDT&limit=3&until_ms=1791747084214&after_id=5f874bfcf2b5aacf&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKline": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the bucket the row covers: a 1h bucket at 14:00 covers 14:00:00 to 14:59:59.999.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "trade_count": {
      "type": "integer",
      "description": "Number of trades.",
      "x-unit": "count"
     },
     "avg_trade_size": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average trade size, base asset units (NOT dollars: multiply by the price for a notional).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Traded volume over the row, base asset units (BTC for BTCUSDT, NOT dollars), aggregated across venues, ALL the markets of the route: spot + perpetual futures on `/v1/klines` and `/v1/trades-kline` (a name without a market suffix covers every market; `volume_spot` / `volume_futures` restrict). `null` when a market is not available (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "net_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "buy_volume - sell_volume over the row, base asset units. Positive = net buying.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "trade_rate": {
      "type": "number",
      "description": "Average number of trades per second over the bucket.",
      "x-unit": "trades per second"
     },
     "is_volume_estimated": {
      "type": "boolean",
      "description": "`true` when base-asset quantities of this row were ESTIMATED from USD amounts ÷ the candle's typical price (high + low + close) / 3 (data written before quantities were recorded; mean error 0.04 % in 1m, 0.37 % in 1d); `false` = measured."
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "trade_count",
     "avg_trade_size",
     "volume",
     "buy_volume",
     "sell_volume",
     "net_volume",
     "trade_rate",
     "is_volume_estimated",
     "is_closed"
    ]
   },
   "TradesKlineFuturesHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_futures_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesKline"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineFuturesResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_futures",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineFuturesSecondsResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_futures_seconds",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesKlineSecond"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "Present in range reading (`since_ms`, `until_ms` or `order` given): the relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`). `null` once the range is read.",
      "example": "/v1/trades/futures?symbol=BTCUSDT&limit=3&until_ms=1791747084214&after_id=5f874bfcf2b5aacf&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesKline"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineSecond": {
    "type": "object",
    "properties": {
     "time": {
      "type": "string",
      "format": "date-time",
      "description": "Start of the second the row covers.",
      "x-unit": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)"
     },
     "volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Traded volume over the row, base asset units (BTC for BTCUSDT, NOT dollars), aggregated across venues, ALL the markets of the route: spot + perpetual futures on `/v1/klines` and `/v1/trades-kline` (a name without a market suffix covers every market; `volume_spot` / `volume_futures` restrict). `null` when a market is not available (never a partial sum).",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "trade_count": {
      "type": "integer",
      "description": "Number of trades.",
      "x-unit": "count"
     },
     "buy_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) buy volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "sell_volume": {
      "type": [
       "number",
       "null"
      ],
      "description": "Aggressive (taker) sell volume, base asset units, aggregated across venues.",
      "x-unit": "base asset quantity (BTC for BTCUSDT)"
     },
     "is_closed": {
      "type": "boolean",
      "description": "`true` = the bucket is final and will never change; `false` = provisional (only with `?live=1`)."
     }
    },
    "required": [
     "time",
     "volume",
     "trade_count",
     "buy_volume",
     "sell_volume",
     "is_closed"
    ]
   },
   "TradesKlineSpotHistoryResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_spot_history",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TradesKline"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "The relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`): your parameters, with the page bound set. It never repeats a row. `null` once the range is read (the page was not full).",
      "example": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791734400000&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesKlineSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_kline_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "timeframe": {
      "type": "string",
      "description": "Effective `timeframe` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TradesKline"
       },
       {
        "type": "null"
       }
      ],
      "description": "The payload: the latest value, or `null` (then `unavailable` says why)."
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesLargeResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_large",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Trade"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "Present in range reading (`since_ms`, `until_ms` or `order` given): the relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`). `null` once the range is read.",
      "example": "/v1/trades/futures?symbol=BTCUSDT&limit=3&until_ms=1791747084214&after_id=5f874bfcf2b5aacf&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "TradesSpotResponse": {
    "type": "object",
    "required": [
     "status",
     "server_time",
     "data_type",
     "data"
    ],
    "properties": {
     "status": {
      "$ref": "#/components/schemas/ResponseStatus"
     },
     "server_time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time of the response, ISO 8601 UTC with milliseconds, in the format of every date of `data`. It is not the time of the data: rows carry their own `time`.",
      "x-unit": "ISO 8601 UTC"
     },
     "data_type": {
      "type": "string",
      "const": "trades_spot",
      "description": "Name of the payload type: the route's own name (stable)."
     },
     "symbol": {
      "type": "string",
      "description": "Effective `symbol` of the request."
     },
     "market": {
      "type": "string",
      "description": "Market served, from the route path: `all` (no suffix: spot + perpetual futures), `spot` (`/spot`) or `futures` (`/futures`)."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Trade"
      },
      "description": "The payload. Most recent first when it is a list."
     },
     "next": {
      "type": [
       "string",
       "null"
      ],
      "description": "Present in range reading (`since_ms`, `until_ms` or `order` given): the relative URL of the following page, ready to call (`GET https://api.bytnode.com` + `next`). `null` once the range is read.",
      "example": "/v1/trades/futures?symbol=BTCUSDT&limit=3&until_ms=1791747084214&after_id=5f874bfcf2b5aacf&order=desc"
     },
     "unavailable": {
      "$ref": "#/components/schemas/Unavailable",
      "description": "Present only when `data` is empty: why."
     }
    }
   },
   "Unavailable": {
    "type": "string",
    "enum": [
     "not_applicable",
     "no_api_key",
     "no_data"
    ],
    "description": "Why a value is empty. `not_applicable` = the metric does not exist for this asset (e.g. futures on a stablecoin); `no_api_key` = the upstream source is not wired; `no_data` = nothing measured in the window."
   }
  },
  "responses": {
   "Unauthorized": {
    "description": "The API key is missing, invalid or revoked (`invalid_api_key`). Send it in the `X-API-KEY` header.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "invalid_api_key": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "invalid_api_key",
          "message": "API key missing, invalid or revoked. Send it in the X-API-KEY header; create one at https://bytnode.com/dashboard/keys."
         }
        }
       }
      }
     }
    },
    "headers": {
     "WWW-Authenticate": {
      "description": "Authentication scheme expected: `ApiKey header=\"X-API-KEY\"`.",
      "schema": {
       "type": "string"
      }
     }
    }
   },
   "Forbidden": {
    "description": "The key is valid but your plan does not cover the request (`plan_family`, `plan_websocket`, `history_depth`).",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "history_depth": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "history_depth",
          "message": "History depth beyond your plan: 30 day(s) requested on 1h, your plan allows 1 day(s) (i.e. at most limit=24 on this timeframe, and no since_ms/until_ms bound beyond that window).",
          "param": "limit"
         }
        }
       }
      }
     }
    },
    "headers": {
     "X-Deny-Reason": {
      "description": "Why the plan refused: `key`, `family`, `websocket`, `rate`, `quota` or `depth`.",
      "schema": {
       "type": "string"
      }
     }
    }
   },
   "NotFound": {
    "description": "Unknown route (`not_found`). A removed or renamed route names its replacement in the message.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "not_found": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "not_found",
          "message": "Route '/v1/raw/klines' was removed on 2026-10-11: use /v1/klines?timeframe=1m."
         }
        }
       }
      }
     }
    }
   },
   "MethodNotAllowed": {
    "description": "The route exists, but not with this HTTP method (`method_not_allowed`). `Allow` lists the accepted ones.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "method_not_allowed": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "method_not_allowed",
          "message": "Method Not Allowed"
         }
        }
       }
      }
     }
    },
    "headers": {
     "Allow": {
      "description": "HTTP methods the route accepts.",
      "schema": {
       "type": "string"
      }
     }
    }
   },
   "Unprocessable": {
    "description": "A parameter is missing, unknown, repeated or has an invalid value (`missing_parameter`, `unknown_parameter`, `repeated_parameter`, `invalid_parameter`, `invalid_symbol`, `invalid_asset`, `invalid_series`, `invalid_timeframe`, `invalid_time_range`, `invalid_depth`, `depth_too_large`, `invalid_indicator`, `unknown_field`...).",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "invalid_symbol": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "invalid_symbol",
          "message": "Unknown symbol 'BTCUSD'. Accepted values: ADAUSDT, AVAXUSDT, BNBUSDT, BTCUSDT, ...",
          "param": "symbol"
         }
        }
       },
       "unknown_parameter": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "unknown_parameter",
          "message": "Unknown parameter 'limt'. Did you mean 'limit'? Accepted parameters: fields, limit, since_ms, symbol, timeframe, until_ms.",
          "param": "limt"
         }
        }
       },
       "invalid_time_range": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "invalid_time_range",
          "message": "since_ms=1790000000 looks like seconds: time bounds are epoch MILLISECONDS (e.g. since_ms=1790000000000).",
          "param": "since_ms"
         }
        }
       }
      }
     }
    }
   },
   "TooManyRequests": {
    "description": "Your plan's per-minute rate (`rate_limited`) or monthly quota (`quota_exceeded`) is exhausted, or too many simultaneous requests from one IP (`edge_rate_limited`).",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "rate_limited": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "rate_limited",
          "message": "Rate limit exceeded: your plan allows a limited number of requests per minute. Retry after the Retry-After delay."
         },
         "retry_after": 1
        }
       }
      }
     }
    },
    "headers": {
     "Retry-After": {
      "description": "Seconds to wait before retrying.",
      "schema": {
       "type": "integer"
      }
     },
     "X-Deny-Reason": {
      "description": "Why the plan refused: `key`, `family`, `websocket`, `rate`, `quota` or `depth`.",
      "schema": {
       "type": "string"
      }
     },
     "RateLimit-Policy": {
      "description": "Your plan's limits, IETF `draft-ietf-httpapi-ratelimit-headers` format: one item per policy, `\"<name>\";q=<capacity>;w=<window seconds>`. Two policies, whose names are fixed identifiers: `debit` = the token bucket of the per-minute rate (`q` = burst capacity, `w` = seconds to refill it from empty) and `mensuel` = the monthly quota (`q` = requests per month, `w` = length of the current calendar month UTC, in seconds). Example below: the Traders plan (60 requests/min, burst 20, 200,000/month) in a 31-day month. Absent with an unmetered key.",
      "schema": {
       "type": "string"
      },
      "example": "\"debit\";q=20;w=20, \"mensuel\";q=200000;w=2678400"
     },
     "RateLimit": {
      "description": "What is left, same items as `RateLimit-Policy`: `\"<name>\";r=<remaining>;t=<seconds until fully restored>` (for `mensuel`: until the 1st of next month, 00:00 UTC).",
      "schema": {
       "type": "string"
      },
      "example": "\"debit\";r=19;t=1, \"mensuel\";r=187342;t=1641600"
     }
    }
   },
   "ServiceUnavailable": {
    "description": "Temporary unavailability (`service_unavailable`). Retry after `Retry-After` seconds.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "service_unavailable": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "service_unavailable",
          "message": "Service temporarily unavailable, please retry."
         },
         "retry_after": 5
        }
       }
      }
     }
    },
    "headers": {
     "Retry-After": {
      "description": "Seconds to wait before retrying.",
      "schema": {
       "type": "integer"
      }
     }
    }
   },
   "InternalError": {
    "description": "Unexpected server error (`internal_error`), never caused by the request. Retry with backoff; if it persists, report it with the `X-Request-Id` header.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "internal_error": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "internal_error",
          "message": "Internal server error."
         }
        }
       }
      }
     }
    }
   },
   "GatewayTimeout": {
    "description": "The query took too long for the window or depth asked (`upstream_timeout`): reduce `limit` or the time range, then retry.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/ApiError"
      },
      "examples": {
       "upstream_timeout": {
        "value": {
         "status": "error",
         "server_time": "2026-09-30T14:07:27.808Z",
         "error": {
          "code": "upstream_timeout",
          "message": "The query took too long: reduce `limit` or the time range (`since_ms` / `until_ms`), then retry."
         }
        }
       }
      }
     }
    }
   }
  },
  "headers": {
   "RateLimit-Policy": {
    "description": "Your plan's limits, IETF `draft-ietf-httpapi-ratelimit-headers` format: one item per policy, `\"<name>\";q=<capacity>;w=<window seconds>`. Two policies, whose names are fixed identifiers: `debit` = the token bucket of the per-minute rate (`q` = burst capacity, `w` = seconds to refill it from empty) and `mensuel` = the monthly quota (`q` = requests per month, `w` = length of the current calendar month UTC, in seconds). Example below: the Traders plan (60 requests/min, burst 20, 200,000/month) in a 31-day month. Absent with an unmetered key.",
    "schema": {
     "type": "string"
    },
    "example": "\"debit\";q=20;w=20, \"mensuel\";q=200000;w=2678400"
   },
   "RateLimit": {
    "description": "What is left, same items as `RateLimit-Policy`: `\"<name>\";r=<remaining>;t=<seconds until fully restored>` (for `mensuel`: until the 1st of next month, 00:00 UTC).",
    "schema": {
     "type": "string"
    },
    "example": "\"debit\";r=19;t=1, \"mensuel\";r=187342;t=1641600"
   },
   "X-Request-Id": {
    "description": "Unique identifier of this request (32 hex characters). Quote it when you contact support.",
    "schema": {
     "type": "string"
    }
   },
   "BytNode-Contract-Version": {
    "description": "Version of the API contract (`info.version` of this document) that served the response.",
    "schema": {
     "type": "string"
    },
    "example": "2.0.0"
   },
   "Cache-Control": {
    "description": "`private, max-age=1` at most: no response is served more than one second old. How often the SOURCE of a route changes is its `x-update-frequency-seconds`; polling faster than that returns the same values.",
    "schema": {
     "type": "string"
    },
    "example": "private, max-age=1"
   }
  },
  "securitySchemes": {
   "APIKeyHeader": {
    "type": "apiKey",
    "in": "header",
    "name": "X-API-KEY",
    "description": "Your API key (`cb_live_...`). Get a free one at https://bytnode.com/sign-up."
   }
  }
 },
 "security": [
  {
   "APIKeyHeader": []
  }
 ],
 "paths": {
  "/v1/basis": {
   "get": {
    "summary": "Futures-spot basis",
    "description": "Perpetual futures price versus spot, OI-weighted across venues (each venue weighted by its latest open interest within 10 minutes). An INSTANT value, not a window: each venue's last futures and spot trade prices (at most 2 minutes old) at `time`.",
    "operationId": "getBasis",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BasisResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:24.300Z",
         "data_type": "basis",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:27:14.101Z",
          "basis_value": -47.3512600109,
          "basis_pct": -0.0577320413654,
          "futures_price": 81970.9623012,
          "spot_price": 82018.3135612
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/basis?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/basis\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/basis?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/basis/history": {
   "get": {
    "summary": "Basis history",
    "description": "One row per closed bucket of `timeframe` (required). Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBasisHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BasisHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:24.875Z",
         "data_type": "basis_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "basis_value": -36.1879480914,
           "basis_pct": -0.0444506300662,
           "futures_price": 81373.948459,
           "spot_price": 81410.1364071,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "basis_value": -44.4240467512,
           "basis_pct": -0.0542566320295,
           "futures_price": 81832.0940697,
           "spot_price": 81876.5181164,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "basis_value": -44.3743175408,
           "basis_pct": -0.0539358305561,
           "futures_price": 82226.9508873,
           "spot_price": 82271.3252048,
           "sample_count": 60,
           "is_closed": true
          }
         ],
         "next": "/v1/basis/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/basis/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/basis/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/basis/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/fees": {
   "get": {
    "summary": "Recommended Bitcoin fees",
    "description": "Fee rates for each confirmation target (sat/vB): the rounded rates under the same names as the history, the unrounded ones under `precise`, and the fee pressure.",
    "operationId": "getBtcFees",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcFeesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:48.340Z",
         "data_type": "btc_fees",
         "data": {
          "time": "2026-10-13T01:26:52.900Z",
          "fastest_fee_sat_vb": 2,
          "half_hour_fee_sat_vb": 1,
          "hour_fee_sat_vb": 1,
          "economy_fee_sat_vb": 1,
          "minimum_fee_sat_vb": 1,
          "precise": {
           "fastest_fee_sat_vb": 1.508,
           "half_hour_fee_sat_vb": 0.9,
           "hour_fee_sat_vb": 0.452,
           "economy_fee_sat_vb": 0.2,
           "minimum_fee_sat_vb": 0.1
          },
          "fee_pressure": {
           "ratio": 2.0,
           "label": "normal"
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Bitcoin network"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/fees\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/fees\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/fees\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/fees/history": {
   "get": {
    "summary": "Bitcoin fees history",
    "description": "Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBtcFeesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/CoarseTimeframe"
      },
      "description": "Optional row step: `1h`, `4h` or `1d` — the LAST reading of each closed bucket, dated at the start of the bucket (the bucket in progress is not served). Without it: one row per reading of the source. Other values: 422 `invalid_timeframe`."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcFeesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:48.912Z",
         "data_type": "btc_fees_history",
         "timeframe": "1m",
         "data": [
          {
           "time": "2026-10-13T01:26:52.900Z",
           "fastest_fee_sat_vb": 2,
           "half_hour_fee_sat_vb": 1,
           "hour_fee_sat_vb": 1,
           "economy_fee_sat_vb": 1,
           "minimum_fee_sat_vb": 1,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:25:52.857Z",
           "fastest_fee_sat_vb": 2,
           "half_hour_fee_sat_vb": 1,
           "hour_fee_sat_vb": 1,
           "economy_fee_sat_vb": 1,
           "minimum_fee_sat_vb": 1,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:24:52.676Z",
           "fastest_fee_sat_vb": 2,
           "half_hour_fee_sat_vb": 1,
           "hour_fee_sat_vb": 1,
           "economy_fee_sat_vb": 1,
           "minimum_fee_sat_vb": 1,
           "is_closed": true
          }
         ],
         "next": "/v1/btc/fees/history?limit=3&before_ms=1791854692676&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Bitcoin network"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/fees/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/fees/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/fees/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/mempool": {
   "get": {
    "summary": "Bitcoin mempool",
    "description": "Pending transactions, virtual size, total fees, fee histogram and the 1 h / 4 h / 24 h trend.",
    "operationId": "getBtcMempool",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcMempoolResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:49.431Z",
         "data_type": "btc_mempool",
         "data": {
          "time": "2026-10-13T01:26:52.900Z",
          "tx_count": 84791,
          "vsize": 39909468,
          "total_fee_sats": 7044238,
          "fee_histogram": [
           [
            4.019231,
            50212
           ],
           [
            3.1504035,
            50236
           ],
           [
            2.542373,
            50488
           ]
          ],
          "trend": {
           "vsize_delta_1h": 1270022,
           "vsize_delta_4h": -1193154,
           "vsize_delta_24h": 2096178,
           "label": "filling"
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Bitcoin network"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/mempool\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/mempool\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/mempool\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/mempool/history": {
   "get": {
    "summary": "Mempool history",
    "description": "Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBtcMempoolHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcMempoolHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:49.995Z",
         "data_type": "btc_mempool_history",
         "timeframe": "1m",
         "data": [
          {
           "time": "2026-10-13T01:26:52.900Z",
           "tx_count": 84791,
           "vsize": 39909468,
           "total_fee_sats": 7044238,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:25:52.857Z",
           "tx_count": 84630,
           "vsize": 39871697,
           "total_fee_sats": 6958210,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:24:52.676Z",
           "tx_count": 84579,
           "vsize": 39849087,
           "total_fee_sats": 6872224,
           "is_closed": true
          }
         ],
         "next": "/v1/btc/mempool/history?limit=3&before_ms=1791854692676&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Bitcoin network"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/mempool/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/mempool/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/mempool/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/mining": {
   "get": {
    "summary": "Mining pool concentration",
    "description": "Share of the largest pools, pool ranking and the latest block reward in sats and USD, with the BTC price AT THAT BLOCK (`btc_price_usd_at_block`, `block_height`, `block_timestamp`) — not the current price (see `/v1/klines`).",
    "operationId": "getBtcMining",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcMiningResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:50.509Z",
         "data_type": "btc_mining",
         "data": {
          "time": "2026-10-13T01:24:52.769Z",
          "concentration": {
           "total_block_count": 1059,
           "top1_share_pct": 25.3068932956,
           "top3_share_pct": 63.8338054769,
           "pool_count": 17,
           "label": "high_risk"
          },
          "latest_reward": {
           "time": "2026-10-13T00:39:09.000Z",
           "block_height": 971165,
           "avg_reward_sats": 312918339,
           "avg_reward_usd": 255832.646416,
           "btc_price_usd_at_block": 81757.0
          },
          "pools": [
           {
            "name": "Foundry USA",
            "slug": "foundryusa",
            "block_count": 268,
            "rank": 1,
            "share_pct": 25.3068932956
           },
           {
            "name": "AntPool",
            "slug": "antpool",
            "block_count": 224,
            "rank": 2,
            "share_pct": 21.1520302172
           },
           {
            "name": "F2Pool",
            "slug": "f2pool",
            "block_count": 184,
            "rank": 3,
            "share_pct": 17.3748819641
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Bitcoin network"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/mining\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/mining\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/mining\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/mining/history": {
   "get": {
    "summary": "Mining history",
    "description": "One series selected by `dataset`. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBtcMiningHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "dataset",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/MiningDataset",
       "default": "concentration"
      },
      "description": "Which mining series to return: `concentration` (pool shares), `rewards` (block rewards), `difficulty` or `fee_rates`.",
      "example": "concentration"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcMiningHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:51.277Z",
         "data_type": "btc_mining_history",
         "dataset": "concentration",
         "timeframe": "10m",
         "data": [
          {
           "time": "2026-10-13T01:24:52.769Z",
           "total_block_count": 1059,
           "top1_share_pct": 25.3068932956,
           "top3_share_pct": 63.8338054769,
           "pool_count": 17,
           "label": "high_risk",
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:18:17.019Z",
           "total_block_count": 1058,
           "top1_share_pct": 25.3308128544,
           "top3_share_pct": 63.7996219282,
           "pool_count": 17,
           "label": "high_risk",
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:08:16.749Z",
           "total_block_count": 1060,
           "top1_share_pct": 25.3773584906,
           "top3_share_pct": 63.7735849057,
           "pool_count": 17,
           "label": "high_risk",
           "is_closed": true
          }
         ],
         "next": "/v1/btc/mining/history?dataset=concentration&limit=3&before_ms=1791853696749&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Bitcoin network"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/mining/history?dataset=concentration&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/mining/history\",\n    params={\"dataset\": \"concentration\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/mining/history?dataset=concentration&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/network": {
   "get": {
    "summary": "Bitcoin network state",
    "description": "Height, difficulty and progress of the current period under the same names as the history, plus the 24 h block time and the details of the next difficulty adjustment.",
    "operationId": "getBtcNetwork",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcNetworkResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:51.815Z",
         "data_type": "btc_network",
         "data": {
          "time": "2026-10-13T01:24:52.724Z",
          "difficulty": 132716002350731.0,
          "tip_height": 971167,
          "progress_pct": 72.9662698413,
          "difficulty_change_pct": 4.78161006815,
          "block_time": {
           "avg_24h_s": 583.156462585,
           "deviation_s": -16.843537415,
           "label": "on_target"
          },
          "next_adjustment": {
           "estimated_retarget_at": "2026-10-16T16:09:41.360Z",
           "remaining_block_count": 545,
           "next_retarget_height": 971712,
           "remaining_s": 312289.36
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Bitcoin network"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/network\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/network\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/network\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/btc/network/history": {
   "get": {
    "summary": "Network history",
    "description": "Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBtcNetworkHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BtcNetworkHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:52.336Z",
         "data_type": "btc_network_history",
         "timeframe": "5m",
         "data": [
          {
           "time": "2026-10-13T01:24:52.724Z",
           "difficulty": 132716002350731.0,
           "tip_height": 971167,
           "progress_pct": 72.9662698413,
           "difficulty_change_pct": 4.78161006815,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:23:14.104Z",
           "difficulty": 132716002350731.0,
           "tip_height": 971167,
           "progress_pct": 72.9662698413,
           "difficulty_change_pct": 4.7939183457,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:18:14.006Z",
           "difficulty": 132716002350731.0,
           "tip_height": 971167,
           "progress_pct": 72.9662698413,
           "difficulty_change_pct": 4.83110939136,
           "is_closed": true
          }
         ],
         "next": "/v1/btc/network/history?limit=3&before_ms=1791854294006&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Bitcoin network"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/btc/network/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/btc/network/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/btc/network/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio": {
   "get": {
    "summary": "Buy/sell volume ratio",
    "operationId": "getBuysellRatio",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:20.044Z",
         "data_type": "buysell_ratio",
         "symbol": "BTCUSDT",
         "market": "all",
         "data": {
          "time": "2026-10-13T01:26:00.000Z",
          "buy_volume": 1155.11152014,
          "sell_volume": 1184.80234647,
          "buy_ratio": 0.493655572807,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:21:00.000Z",
          "window_s": 300
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "description": "Taker buy share of volume over the last closed 5-minute window, all venues. Above 0.5 = buyers dominate. The window starts at `window_start`, lasts `window_s` and is aligned on the minute; `time` is its end. The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history.",
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio/futures": {
   "get": {
    "summary": "Buy/sell volume ratio, perpetual futures only",
    "operationId": "getBuysellRatioFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:08.091Z",
         "data_type": "buysell_ratio_futures",
         "symbol": "BTCUSDT",
         "market": "futures",
         "data": {
          "time": "2026-10-13T01:26:00.000Z",
          "buy_volume": 970.21598,
          "sell_volume": 1064.3271,
          "buy_ratio": 0.476871681675,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:21:00.000Z",
          "window_s": 300
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "description": "Perpetual futures market only. Same as `/v1/buysell/ratio`, which serves every market.",
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio/futures?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio/futures\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio/futures?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio/futures/history": {
   "get": {
    "summary": "Buy/sell ratio history, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/buysell/ratio/history`, which serves every market.",
    "operationId": "getBuysellRatioFuturesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, holding the totals of the WHOLE bucket. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioFuturesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:09.141Z",
         "data_type": "buysell_ratio_futures_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "buy_volume": 21649.82456,
           "sell_volume": 27398.86988,
           "buy_ratio": 0.441394512274,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "buy_volume": 17026.80517,
           "sell_volume": 20332.62306,
           "buy_ratio": 0.455756578103,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "buy_volume": 7290.54228,
           "sell_volume": 11826.59394,
           "buy_ratio": 0.381361632626,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/buysell/ratio/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio/futures/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio/history": {
   "get": {
    "summary": "Buy/sell ratio history",
    "description": "One row per closed bucket of `timeframe` (required): the taker buy and sell volumes of the WHOLE bucket — the same volumes as `/v1/cvd/history` for the same market and bucket — and the buy share of their sum. The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getBuysellRatioHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, holding the totals of the WHOLE bucket. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:20.593Z",
         "data_type": "buysell_ratio_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "buy_volume": 24078.1340729,
           "sell_volume": 30037.6700555,
           "buy_ratio": 0.444937194609,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "buy_volume": 18938.2378418,
           "sell_volume": 22375.7377791,
           "buy_ratio": 0.458397855863,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "buy_volume": 8264.22543527,
           "sell_volume": 13068.7918138,
           "buy_ratio": 0.387391307043,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/buysell/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio/spot": {
   "get": {
    "summary": "Buy/sell volume ratio, spot only",
    "operationId": "getBuysellRatioSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:07.584Z",
         "data_type": "buysell_ratio_spot",
         "symbol": "BTCUSDT",
         "market": "spot",
         "data": {
          "time": "2026-10-13T01:26:00.000Z",
          "buy_volume": 184.89554014,
          "sell_volume": 120.47524647,
          "buy_ratio": 0.605478808869,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:21:00.000Z",
          "window_s": 300
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "description": "Spot market only. Same as `/v1/buysell/ratio`, which serves every market.",
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio/spot?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio/spot\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio/spot?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/buysell/ratio/spot/history": {
   "get": {
    "summary": "Buy/sell ratio history, spot only",
    "description": "Spot market only. Same as `/v1/buysell/ratio/history`, which serves every market.",
    "operationId": "getBuysellRatioSpotHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, holding the totals of the WHOLE bucket. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BuysellRatioSpotHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:08.635Z",
         "data_type": "buysell_ratio_spot_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "buy_volume": 2428.30951292,
           "sell_volume": 2638.80017549,
           "buy_ratio": 0.479229711264,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "buy_volume": 1911.43267185,
           "sell_volume": 2043.11471915,
           "buy_ratio": 0.483350553897,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "buy_volume": 973.68315527,
           "sell_volume": 1242.19787377,
           "buy_ratio": 0.439411296234,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/buysell/ratio/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/buysell/ratio/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/buysell/ratio/spot/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/buysell/ratio/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd": {
   "get": {
    "summary": "Cumulative volume delta per bucket",
    "description": "Net taker delta of the latest closed bucket, with its path inside the bucket (`cvd_series`: one point per minute up to 1h, per 5 minutes in 4h, per 15 minutes in 1d), aggregated across venues. The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history. Bucketed: `is_closed` says whether the value is final. Add `?live=1` for the open period.",
    "operationId": "getCvd",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:16.876Z",
         "data_type": "cvd",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "cvd_series": [
           61.24880816,
           125.01611121,
           244.64884666
          ],
          "net_volume": -5959.53598257,
          "buy_volume": 24078.1340729,
          "sell_volume": 30037.6700555,
          "sample_count": 60,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd/futures": {
   "get": {
    "summary": "Cumulative volume delta per bucket, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/cvd`, which serves every market.",
    "operationId": "getCvdFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:05.979Z",
         "data_type": "cvd_futures",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "cvd_series": [
           59.59845,
           114.5258,
           230.02745
          ],
          "net_volume": -5749.04532,
          "buy_volume": 21649.82456,
          "sell_volume": 27398.86988,
          "sample_count": 60,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd/futures?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd/futures\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd/futures?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd/futures/history": {
   "get": {
    "summary": "Cumulative volume delta history, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/cvd/history`, which serves every market.",
    "operationId": "getCvdFuturesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdFuturesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:07.054Z",
         "data_type": "cvd_futures_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "cvd_series": [
            59.59845,
            114.5258,
            230.02745
           ],
           "net_volume": -5749.04532,
           "buy_volume": 21649.82456,
           "sell_volume": 27398.86988,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "cvd_series": [
            310.62038,
            279.82427,
            -750.076
           ],
           "net_volume": -3305.81789,
           "buy_volume": 17026.80517,
           "sell_volume": 20332.62306,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "cvd_series": [
            30.97976,
            15.89058,
            -38.2447
           ],
           "net_volume": -4536.05166,
           "buy_volume": 7290.54228,
           "sell_volume": 11826.59394,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/cvd/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd/futures/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd/history": {
   "get": {
    "summary": "Cumulative volume delta history",
    "description": "Same as `/v1/cvd`, one row per closed bucket. The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getCvdHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:17.423Z",
         "data_type": "cvd_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "cvd_series": [
            61.24880816,
            125.01611121,
            244.64884666
           ],
           "net_volume": -5959.53598257,
           "buy_volume": 24078.1340729,
           "sell_volume": 30037.6700555,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "cvd_series": [
            315.17269994,
            261.99727367,
            -780.87188717
           ],
           "net_volume": -3437.4999373,
           "buy_volume": 18938.2378418,
           "sell_volume": 22375.7377791,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "cvd_series": [
            23.84211312,
            15.05890717,
            -39.72717557
           ],
           "net_volume": -4804.5663785,
           "buy_volume": 8264.22543527,
           "sell_volume": 13068.7918138,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/cvd/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd/spot": {
   "get": {
    "summary": "Cumulative volume delta per bucket, spot only",
    "description": "Spot market only. Same as `/v1/cvd`, which serves every market.",
    "operationId": "getCvdSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:05.465Z",
         "data_type": "cvd_spot",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "cvd_series": [
           1.65035816,
           10.49031121,
           14.62139666
          ],
          "net_volume": -210.49066257,
          "buy_volume": 2428.30951292,
          "sell_volume": 2638.80017549,
          "sample_count": 60,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd/spot?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd/spot\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd/spot?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/cvd/spot/history": {
   "get": {
    "summary": "Cumulative volume delta history, spot only",
    "description": "Spot market only. Same as `/v1/cvd/history`, which serves every market.",
    "operationId": "getCvdSpotHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CvdSpotHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:06.519Z",
         "data_type": "cvd_spot_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "cvd_series": [
            1.65035816,
            10.49031121,
            14.62139666
           ],
           "net_volume": -210.49066257,
           "buy_volume": 2428.30951292,
           "sell_volume": 2638.80017549,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "cvd_series": [
            4.55231994,
            -17.82699633,
            -30.79588717
           ],
           "net_volume": -131.6820473,
           "buy_volume": 1911.43267185,
           "sell_volume": 2043.11471915,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "cvd_series": [
            -7.13764688,
            -0.83167283,
            -1.48247557
           ],
           "net_volume": -268.514718499,
           "buy_volume": 973.68315527,
           "sell_volume": 1242.19787377,
           "sample_count": 60,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/cvd/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/cvd/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/cvd/spot/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/cvd/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/etf/fundamentals": {
   "get": {
    "summary": "ETF fundamentals per issuer",
    "description": "Latest SEC EDGAR anchor per spot ETF: shares outstanding, NAV, net assets and coins held. `data` is a list, one row per issuer.",
    "operationId": "getEtfFundamentals",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EtfFundamentalsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:38.681Z",
         "data_type": "etf_fundamentals",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "ARKB",
           "issuer": "Ark/21Shares",
           "shares_outstanding": 101190000.0,
           "nav_per_share_usd": 19.47,
           "net_assets_usd": 1889240000.0,
           "form": "10-Q",
           "filed_date": "2026-08-06",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1869699/000121390026086191/",
           "btc_holdings": 32178.228,
           "is_holdings_estimated": false
          },
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "BITB",
           "issuer": "Bitwise",
           "shares_outstanding": 68160000.0,
           "nav_per_share_usd": 31.87,
           "net_assets_usd": 2125612000.0,
           "form": "10-Q",
           "filed_date": "2026-08-07",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1763415/000119312526340183/",
           "btc_holdings": 36269.9000433,
           "is_holdings_estimated": true
          },
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "BRRR",
           "issuer": "CoinShares/Valkyrie",
           "shares_outstanding": 20895000.0,
           "nav_per_share_usd": 16.46,
           "net_assets_usd": 342354115.0,
           "form": "10-Q",
           "filed_date": "2026-08-12",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1841175/000199937126017701/",
           "btc_holdings": 5841.68208049,
           "is_holdings_estimated": true
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "ETF"
    ],
    "x-family": "etf",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/etf/fundamentals?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/etf/fundamentals\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/etf/fundamentals?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/etf/fundamentals/history": {
   "get": {
    "summary": "ETF fundamentals history",
    "description": "One row per filing and issuer. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEtfFundamentalsHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "ticker",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ETF ticker (e.g. `IBIT`, `FBTC`). Omit for every issuer."
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to read, most recent first by default. A page holds EVERY issuer's row of each balance-sheet date those rows reach, so it can hold a few more than `limit` (a date is never split across two pages); `next` is `null` on the last page.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EtfFundamentalsHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:39.202Z",
         "data_type": "etf_fundamentals_history",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "ARKB",
           "issuer": "Ark/21Shares",
           "shares_outstanding": 101190000.0,
           "nav_per_share_usd": 19.47,
           "net_assets_usd": 1889240000.0,
           "form": "10-Q",
           "filed_date": "2026-08-06",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1869699/000121390026086191/",
           "btc_holdings": 32178.228,
           "is_holdings_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "BITB",
           "issuer": "Bitwise",
           "shares_outstanding": 68160000.0,
           "nav_per_share_usd": 31.87,
           "net_assets_usd": 2125612000.0,
           "form": "10-Q",
           "filed_date": "2026-08-07",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1763415/000119312526340183/",
           "btc_holdings": 36269.9000433,
           "is_holdings_estimated": true,
           "is_closed": true
          },
          {
           "time": "2026-06-30T00:00:00.000Z",
           "ticker": "BRRR",
           "issuer": "CoinShares/Valkyrie",
           "shares_outstanding": 20895000.0,
           "nav_per_share_usd": 16.46,
           "net_assets_usd": 342354115.0,
           "form": "10-Q",
           "filed_date": "2026-08-12",
           "filing_url": "https://www.sec.gov/Archives/edgar/data/1841175/000199937126017701/",
           "btc_holdings": 5841.68208049,
           "is_holdings_estimated": true,
           "is_closed": true
          }
         ],
         "next": "/v1/etf/fundamentals/history?asset=BTC&limit=3&before_ms=1782777600000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "ETF"
    ],
    "x-family": "etf",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/etf/fundamentals/history?asset=BTC&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/etf/fundamentals/history\",\n    params={\"asset\": \"BTC\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/etf/fundamentals/history?asset=BTC&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/defi": {
   "get": {
    "summary": "Ethereum DeFi",
    "description": "TVL, DEX volume, TVL / market cap and the 30-day trend.",
    "operationId": "getEthDefi",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthDefiResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:58.156Z",
         "data_type": "eth_defi",
         "data": {
          "time": "2026-10-13T01:24:53.771Z",
          "tvl_usd": 50454144275.0,
          "dex_volume_24h_usd": 1138275215.4,
          "dex_volume_7d_usd": 10008292141.9,
          "eth_market_cap_usd": 299062690242.0,
          "defi_health_ratio": 0.168707585136,
          "defi_health_change_30d_pct": 3.68611895827,
          "label": "growing"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/defi\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/defi\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/defi\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/defi/history": {
   "get": {
    "summary": "DeFi history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthDefiHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthDefiHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:58.683Z",
         "data_type": "eth_defi_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "tvl_usd": 51052869015.0,
           "dex_volume_24h_usd": 712388423.0,
           "dex_volume_7d_usd": 9970208977.73,
           "eth_market_cap_usd": 298917465507.0,
           "defi_health_ratio": 0.170792526052,
           "defi_health_change_30d_pct": 4.9224064874,
           "label": "growing",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "tvl_usd": 51739380874.0,
           "dex_volume_24h_usd": 569251210.72,
           "dex_volume_7d_usd": 9842189760.12,
           "eth_market_cap_usd": 309916117727.0,
           "defi_health_ratio": 0.166946402315,
           "defi_health_change_30d_pct": 2.26742460267,
           "label": "growing",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "tvl_usd": 51562646544.6,
           "dex_volume_24h_usd": 1044588497.35,
           "dex_volume_7d_usd": 9778387749.64,
           "eth_market_cap_usd": 306132595222.0,
           "defi_health_ratio": 0.168432396123,
           "defi_health_change_30d_pct": 1.58948638809,
           "label": "growing",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/defi/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/defi/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/defi/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/defi/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/deflation": {
   "get": {
    "summary": "ETH deflation",
    "description": "24 h burn versus issuance and the annualised net supply change.",
    "operationId": "getEthDeflation",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthDeflationResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:56.047Z",
         "data_type": "eth_deflation",
         "data": {
          "time": "2026-10-13T01:24:52.173Z",
          "burn_24h": 31.2787782596,
          "net_issuance_24h": 2948.64045607,
          "annualized_rate_pct": 0.881231075111,
          "label": "inflationary"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/deflation\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/deflation\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/deflation\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/deflation/history": {
   "get": {
    "summary": "Deflation history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthDeflationHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthDeflationHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:56.569Z",
         "data_type": "eth_deflation_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "burn_24h": 20.283163459,
           "net_issuance_24h": 2956.06656344,
           "annualized_rate_pct": 0.883471772479,
           "label": "inflationary",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "burn_24h": 15.5932326857,
           "net_issuance_24h": 2961.38214344,
           "annualized_rate_pct": 0.885081848918,
           "label": "inflationary",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "burn_24h": 45.9718156802,
           "net_issuance_24h": 2931.29256888,
           "annualized_rate_pct": 0.876110084546,
           "label": "inflationary",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/deflation/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/deflation/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/deflation/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/deflation/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/gas": {
   "get": {
    "summary": "Ethereum gas",
    "description": "Gas prices (gwei), base fee, block usage and congestion.",
    "operationId": "getEthGas",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthGasResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:52.856Z",
         "data_type": "eth_gas",
         "data": {
          "time": "2026-10-13T01:24:52.173Z",
          "safe_gas_price_gwei": 0.134742131,
          "propose_gas_price_gwei": 0.135742131,
          "fast_gas_price_gwei": 0.149316344,
          "base_fee_gwei": 0.134742131,
          "gas_used_ratio": 0.415135214352,
          "label": "low"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/gas\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/gas\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/gas\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/gas-momentum": {
   "get": {
    "summary": "Gas momentum",
    "description": "7-day versus 30-day base fee average: rising or falling demand for block space.",
    "operationId": "getEthGasMomentum",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthGasMomentumResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:53.929Z",
         "data_type": "eth_gas_momentum",
         "data": {
          "time": "2026-10-13T01:24:52.173Z",
          "base_fee_gwei": 0.134742131,
          "gas_used_ratio": 0.415135214352,
          "gas_sma_7d_gwei": 0.382383671003,
          "gas_sma_30d_gwei": 0.382004258163,
          "sma_7d_vs_30d_pct": 0.0993216260115,
          "label": "normal"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/gas-momentum\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/gas-momentum\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/gas-momentum\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/gas-momentum/history": {
   "get": {
    "summary": "Gas momentum history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthGasMomentumHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthGasMomentumHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:54.460Z",
         "data_type": "eth_gas_momentum_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "base_fee_gwei": 0.104619422,
           "gas_used_ratio": 0.72126114,
           "gas_sma_7d_gwei": 0.382383671003,
           "gas_sma_30d_gwei": 0.382004258163,
           "sma_7d_vs_30d_pct": 0.0993216260115,
           "label": "normal",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "base_fee_gwei": 0.08011574,
           "gas_used_ratio": 0.44585128,
           "gas_sma_7d_gwei": 0.427712789855,
           "gas_sma_30d_gwei": 0.381585677113,
           "sma_7d_vs_30d_pct": 12.088271523,
           "label": "normal",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "base_fee_gwei": 0.064051283,
           "gas_used_ratio": 0.533798566667,
           "gas_sma_7d_gwei": 0.430775051177,
           "gas_sma_30d_gwei": 0.387133048749,
           "sma_7d_vs_30d_pct": 11.2731275641,
           "label": "normal",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/gas-momentum/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/gas-momentum/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/gas-momentum/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/gas-momentum/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/gas/history": {
   "get": {
    "summary": "Gas history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthGasHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthGasHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:53.397Z",
         "data_type": "eth_gas_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "safe_gas_price_gwei": 0.104619422,
           "propose_gas_price_gwei": 0.104636768,
           "fast_gas_price_gwei": 0.121104737,
           "base_fee_gwei": 0.104619422,
           "gas_used_ratio": 0.72126114,
           "label": "normal",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "safe_gas_price_gwei": 0.08011574,
           "propose_gas_price_gwei": 0.083270853,
           "fast_gas_price_gwei": 0.091597938,
           "base_fee_gwei": 0.08011574,
           "gas_used_ratio": 0.44585128,
           "label": "low",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "safe_gas_price_gwei": 0.064051283,
           "propose_gas_price_gwei": 0.064151283,
           "fast_gas_price_gwei": 0.070566411,
           "base_fee_gwei": 0.064051283,
           "gas_used_ratio": 0.533798566667,
           "label": "normal",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/gas/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/gas/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/gas/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/gas/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/ratio": {
   "get": {
    "summary": "ETH/BTC ratio",
    "description": "ETH/BTC price ratio, its 7-day momentum and which asset outperforms.",
    "operationId": "getEthRatio",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthRatioResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:59.215Z",
         "data_type": "eth_ratio",
         "data": {
          "time": "2026-10-13T01:24:52.216Z",
          "eth_price_usd": 2448.71,
          "btc_price_usd": 82041.19,
          "eth_price_btc": 0.0298473242526,
          "change_7d_pct": -5.60995972315,
          "label": "btc_outperform"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/ratio\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/ratio\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/ratio\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/ratio/history": {
   "get": {
    "summary": "ETH/BTC ratio history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthRatioHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthRatioHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:59.743Z",
         "data_type": "eth_ratio_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "eth_price_usd": 2447.58,
           "btc_price_usd": 81870.1,
           "eth_price_btc": 0.0298958960597,
           "change_7d_pct": -5.40526068712,
           "label": "btc_outperform",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "eth_price_usd": 2537.7,
           "btc_price_usd": 83773.08,
           "eth_price_btc": 0.0302925474389,
           "change_7d_pct": -3.92586865064,
           "label": "btc_outperform",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "eth_price_usd": 2506.78,
           "btc_price_usd": 82988.35,
           "eth_price_btc": 0.0302064084899,
           "change_7d_pct": -4.75571227838,
           "label": "btc_outperform",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/ratio/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/ratio/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/ratio/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/ratio/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/squeeze": {
   "get": {
    "summary": "ETH supply squeeze index",
    "description": "0-100 index combining the staked share and net issuance.",
    "operationId": "getEthSqueeze",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthSqueezeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:00.267Z",
         "data_type": "eth_squeeze",
         "data": {
          "time": "2026-10-13T01:24:52.173Z",
          "staking_ratio": 0.362371183923,
          "annualized_rate_pct": 0.881231075111,
          "squeeze_index": 18.5591747337,
          "label": "low"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/squeeze\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/squeeze\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/squeeze\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/squeeze/history": {
   "get": {
    "summary": "Supply squeeze history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthSqueezeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthSqueezeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:00.786Z",
         "data_type": "eth_squeeze_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "staking_ratio": 0.36237745342,
           "annualized_rate_pct": 0.883471772479,
           "squeeze_index": 18.5606085573,
           "label": "low",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "staking_ratio": 0.362658085976,
           "annualized_rate_pct": 0.885081848918,
           "squeeze_index": 18.5754452233,
           "label": "low",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "staking_ratio": 0.362540592496,
           "annualized_rate_pct": 0.876110084546,
           "squeeze_index": 18.5650846671,
           "label": "low",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/squeeze/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/squeeze/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/squeeze/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/squeeze/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/staking": {
   "get": {
    "summary": "ETH staking",
    "description": "Share of ETH staked, total staked and the staking APR. The Fed funds rate is served by `/v1/macro` (series `DFF`).",
    "operationId": "getEthStaking",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthStakingResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:57.077Z",
         "data_type": "eth_staking",
         "data": {
          "time": "2026-10-13T01:24:58.732Z",
          "staking_ratio": 0.362371183923,
          "total_staked": 44256649.881,
          "total_supply": 122130709.738,
          "apr_pct": 2.218
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/staking\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/staking\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/staking\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/staking/history": {
   "get": {
    "summary": "Staking history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthStakingHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthStakingHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:57.603Z",
         "data_type": "eth_staking_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "staking_ratio": 0.36237745342,
           "total_staked": 44256347.0584,
           "total_supply": 122127761.097,
           "apr_pct": 2.218,
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "staking_ratio": 0.362658085976,
           "total_staked": 44289548.0427,
           "total_supply": 122124805.031,
           "apr_pct": 2.203,
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "staking_ratio": 0.362540592496,
           "total_staked": 44274125.5531,
           "total_supply": 122121843.649,
           "apr_pct": 2.216,
           "is_closed": true
          }
         ],
         "next": "/v1/eth/staking/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/staking/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/staking/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/staking/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/supply": {
   "get": {
    "summary": "ETH supply and burn",
    "description": "Supply, staking, burnt fees, withdrawals, 24 h burn and net issuance.",
    "operationId": "getEthSupply",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthSupplyResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:54.980Z",
         "data_type": "eth_supply",
         "data": {
          "time": "2026-10-13T01:24:52.173Z",
          "execution_issuance_cumulative": 122373866.218,
          "consensus_rewards_cumulative": 4392729.95188,
          "burnt_fees": 4635886.43176,
          "withdrawn_total": 7618584.34895,
          "total_supply": 122130709.738,
          "burn_24h": 31.2787782596,
          "net_issuance_24h": 2948.64045607,
          "label": "inflationary"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Ethereum"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/supply\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/supply\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/supply\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/eth/supply/history": {
   "get": {
    "summary": "ETH supply history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getEthSupplyHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EthSupplyHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:55.530Z",
         "data_type": "eth_supply_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "execution_issuance_cumulative": 122373866.218,
           "consensus_rewards_cumulative": 4389750.03265,
           "burnt_fees": 4635855.15298,
           "withdrawn_total": 7618584.34895,
           "total_supply": 122127761.097,
           "burn_24h": 20.283163459,
           "net_issuance_24h": 2956.06656344,
           "label": "inflationary",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "execution_issuance_cumulative": 122373866.218,
           "consensus_rewards_cumulative": 4386773.68292,
           "burnt_fees": 4635834.86982,
           "withdrawn_total": 7618584.34895,
           "total_supply": 122124805.031,
           "burn_24h": 15.5932326857,
           "net_issuance_24h": 2961.38214344,
           "label": "inflationary",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "execution_issuance_cumulative": 122373866.218,
           "consensus_rewards_cumulative": 4383796.70755,
           "burnt_fees": 4635819.27659,
           "withdrawn_total": 7618584.34895,
           "total_supply": 122121843.649,
           "burn_24h": 45.9718156802,
           "net_issuance_24h": 2931.29256888,
           "label": "inflationary",
           "is_closed": true
          }
         ],
         "next": "/v1/eth/supply/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Ethereum"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/eth/supply/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/eth/supply/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/eth/supply/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/fear-greed": {
   "get": {
    "summary": "Crypto Fear & Greed Index",
    "description": "Daily index from 0 (extreme fear) to 100 (extreme greed).",
    "operationId": "getFearGreed",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FearGreedResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:32.382Z",
         "data_type": "fear_greed",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "value": 57,
          "label": "greed"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Tokenomics & sentiment"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "sentiment",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/fear-greed\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/fear-greed\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/fear-greed\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/fear-greed/history": {
   "get": {
    "summary": "Fear & Greed history",
    "description": "One point per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getFearGreedHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FearGreedHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:32.897Z",
         "data_type": "fear_greed_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "value": 57,
           "label": "greed",
           "is_closed": true
          },
          {
           "time": "2026-10-12T00:00:00.000Z",
           "value": 69,
           "label": "greed",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "value": 61,
           "label": "greed",
           "is_closed": true
          }
         ],
         "next": "/v1/fear-greed/history?limit=3&before_ms=1791676800000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Tokenomics & sentiment"
    ],
    "x-family": "sentiment",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/fear-greed/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/fear-greed/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/fear-greed/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/funding/cumulative": {
   "get": {
    "summary": "Funding over the last 24 h",
    "description": "Sum of the last three settled 8-hour windows (`rolling_24h_rate_pct`, a ROLLING 24-hour window) and its annualised rate. `time` is the end of the window; a new value every 8 hours.",
    "operationId": "getFundingCumulative",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FundingCumulativeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:23.076Z",
         "data_type": "funding_cumulative",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "window_start": "2026-10-12T00:00:00.000Z",
          "window_s": 86400,
          "rolling_24h_rate_pct": 0.0111678610718,
          "apr_pct": 4.0762692912,
          "sample_count": 3
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/cumulative?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/funding/cumulative\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/funding/cumulative?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/funding/cumulative/history": {
   "get": {
    "summary": "Rolling 24 h funding history",
    "description": "One row every 8 hours, each covering the 24 hours before it: consecutive rows OVERLAP by 16 hours, so never add them up — sum `rate_pct` of `/v1/funding/rate/history` for a total over a period. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getFundingCumulativeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FundingCumulativeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:23.738Z",
         "data_type": "funding_cumulative_history",
         "symbol": "BTCUSDT",
         "timeframe": "8h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "window_start": "2026-10-12T00:00:00.000Z",
           "window_s": 86400,
           "rolling_24h_rate_pct": 0.0111678610718,
           "apr_pct": 4.0762692912,
           "sample_count": 3,
           "is_closed": true
          },
          {
           "time": "2026-10-12T16:00:00.000Z",
           "window_start": "2026-10-11T16:00:00.000Z",
           "window_s": 86400,
           "rolling_24h_rate_pct": 0.00943046616826,
           "apr_pct": 3.44212015142,
           "sample_count": 3,
           "is_closed": true
          },
          {
           "time": "2026-10-12T08:00:00.000Z",
           "window_start": "2026-10-11T08:00:00.000Z",
           "window_s": 86400,
           "rolling_24h_rate_pct": 0.00609948195017,
           "apr_pct": 2.22631091181,
           "sample_count": 3,
           "is_closed": true
          }
         ],
         "next": "/v1/funding/cumulative/history?symbol=BTCUSDT&limit=3&before_ms=1791792000000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/cumulative/history?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/funding/cumulative/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/funding/cumulative/history?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/funding/next": {
   "get": {
    "summary": "Next funding forecast",
    "description": "Each venue's forecast of its next settlement, normalised to 8 h and OI-weighted.",
    "operationId": "getFundingNext",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FundingNextResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:22.433Z",
         "data_type": "funding_next",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T08:00:00.000Z",
          "estimated_rate_pct": 0.00242743915636,
          "apr_pct": 2.65804587622,
          "is_past": false
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/next?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/funding/next\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/funding/next?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/funding/rate": {
   "get": {
    "summary": "Latest settled funding rate",
    "description": "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. `time` is the START of the period; the period is `[time, period_end)` and `settled_at` says when its last settlement was paid — compare it with the `time` of `/v1/funding/next` (the next settlement), not with this `time`. `rate_pct` is in percent per 8 h.",
    "operationId": "getFundingRate",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FundingRateResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:21.266Z",
         "data_type": "funding_rate",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-12T16:00:00.000Z",
          "period_end": "2026-10-13T00:00:00.000Z",
          "settled_at": "2026-10-13T00:00:00.005Z",
          "rate_pct": 0.0038949161538,
          "apr_pct": 4.26493318841,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/funding/rate\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/funding/rate?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/funding/rate/history": {
   "get": {
    "summary": "Settled funding history",
    "description": "One row per settled 8-hour window (`time` = start of the period), with `period_end` and `settled_at`. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getFundingRateHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/FundingRateHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:21.916Z",
         "data_type": "funding_rate_history",
         "symbol": "BTCUSDT",
         "timeframe": "8h",
         "data": [
          {
           "time": "2026-10-12T16:00:00.000Z",
           "period_end": "2026-10-13T00:00:00.000Z",
           "settled_at": "2026-10-13T00:00:00.005Z",
           "rate_pct": 0.0038949161538,
           "apr_pct": 4.26493318841,
           "is_closed": true
          },
          {
           "time": "2026-10-12T08:00:00.000Z",
           "period_end": "2026-10-12T16:00:00.000Z",
           "settled_at": "2026-10-12T16:00:00.067Z",
           "rate_pct": 0.00392276538143,
           "apr_pct": 4.29542809266,
           "is_closed": true
          },
          {
           "time": "2026-10-12T00:00:00.000Z",
           "period_end": "2026-10-12T08:00:00.000Z",
           "settled_at": "2026-10-12T08:00:00.019Z",
           "rate_pct": 0.00335017953657,
           "apr_pct": 3.66844659254,
           "is_closed": true
          }
         ],
         "next": "/v1/funding/rate/history?symbol=BTCUSDT&limit=3&before_ms=1791763200000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/funding/rate/history?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/funding/rate/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/funding/rate/history?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/global": {
   "get": {
    "summary": "Total crypto market",
    "description": "Total market capitalisation, 24 h volume and dominance of BTC, ETH and the rest.",
    "operationId": "getGlobal",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/GlobalResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:31.337Z",
         "data_type": "global",
         "data": {
          "time": "2026-10-13T01:23:59.999Z",
          "total_market_cap_usd": 2755259488729.0,
          "total_volume_usd": 87016551591.5,
          "btc_dominance_pct": 59.7892126848,
          "eth_dominance_pct": 10.8469953528,
          "others_dominance_pct": 29.3637919625,
          "active_cryptocurrency_count": 8146
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Tokenomics & sentiment"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "price_volume",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/global\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/global\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/global\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/global/history": {
   "get": {
    "summary": "Total crypto market history",
    "description": "Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getGlobalHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/CoarseTimeframe"
      },
      "description": "Optional row step: `1h`, `4h` or `1d` — the LAST reading of each closed bucket, dated at the start of the bucket (the bucket in progress is not served). Without it: one row per reading of the source. Other values: 422 `invalid_timeframe`."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/GlobalHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:31.875Z",
         "data_type": "global_history",
         "data": [
          {
           "time": "2026-10-13T01:23:59.999Z",
           "total_market_cap_usd": 2755259488729.0,
           "total_volume_usd": 87016551591.5,
           "btc_dominance_pct": 59.7892126848,
           "eth_dominance_pct": 10.8469953528,
           "others_dominance_pct": 29.3637919625,
           "active_cryptocurrency_count": 8146,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:21:59.999Z",
           "total_market_cap_usd": 2755500511720.0,
           "total_volume_usd": 86814116740.1,
           "btc_dominance_pct": 59.7968904968,
           "eth_dominance_pct": 10.8527934375,
           "others_dominance_pct": 29.3503160657,
           "active_cryptocurrency_count": 8146,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:16:59.999Z",
           "total_market_cap_usd": 2750106542029.0,
           "total_volume_usd": 86116132147.2,
           "btc_dominance_pct": 59.8092582864,
           "eth_dominance_pct": 10.8199581059,
           "others_dominance_pct": 29.3707836077,
           "active_cryptocurrency_count": 8146,
           "is_closed": true
          }
         ],
         "next": "/v1/global/history?limit=3&before_ms=1791854219999&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Tokenomics & sentiment"
    ],
    "x-family": "price_volume",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/global/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/global/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/global/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/health": {
   "get": {
    "summary": "Service health",
    "description": "Liveness of the API and its database. No key needed, counted for nobody.",
    "operationId": "getHealth",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HealthResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:04.213Z",
         "data_type": "health",
         "data": {
          "database": "connected"
         },
         "database": "connected"
        }
       }
      },
      "headers": {
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       }
      }
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     }
    },
    "tags": [
     "System"
    ],
    "x-metered": false,
    "security": [],
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl \"https://api.bytnode.com/v1/health\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/health\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/health\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/heatmap/clusters": {
   "get": {
    "summary": "Liquidation heatmap clusters",
    "operationId": "getHeatmapClusters",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HeatmapClustersResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:29.266Z",
         "data_type": "heatmap_clusters",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:27:14.159Z",
          "density_up": 0.0674527175009,
          "dist_up_ratio": 0.00322534998219,
          "density_down": 0.484916107795,
          "dist_down_ratio": 0.00360595103909,
          "attraction_up": 6484.04107723,
          "attraction_down": 37292.9689256
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "description": "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.",
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/heatmap/clusters?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/heatmap/clusters\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/heatmap/clusters?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/heatmap/clusters/history": {
   "get": {
    "summary": "Liquidation clusters history",
    "operationId": "getHeatmapClustersHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HeatmapClustersHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:29.785Z",
         "data_type": "heatmap_clusters_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "density_up": 1.5606264991,
           "dist_up_ratio": 0.0273892637822,
           "density_down": 2.06963900656,
           "dist_down_ratio": 0.00505460770567,
           "attraction_up": 2080.358873,
           "attraction_down": 81006.4668858,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "density_up": 1.73765585154,
           "dist_up_ratio": 0.0215890108306,
           "density_down": 0.569167697515,
           "dist_down_ratio": 0.00187332051866,
           "attraction_up": 3728.19207357,
           "attraction_down": 162187.008781,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "density_up": 0.509554303491,
           "dist_up_ratio": 0.0117728034984,
           "density_down": 1.84668917595,
           "dist_down_ratio": 0.00379293194004,
           "attraction_up": 3676.46709576,
           "attraction_down": 128364.136589,
           "sample_count": 60,
           "is_closed": true
          }
         ],
         "next": "/v1/heatmap/clusters/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "description": "One row per closed bucket of `timeframe` (required). Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/heatmap/clusters/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/heatmap/clusters/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/heatmap/clusters/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/indicators": {
   "post": {
    "summary": "Compute technical indicators",
    "operationId": "postIndicators",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/IndicatorsRequest"
       },
       "example": {
        "symbol": "BTCUSDT",
        "timeframe": "1h",
        "results": 3,
        "indicators": [
         {
          "id": "rsi_14",
          "type": "rsi",
          "period": 14
         },
         {
          "id": "macd",
          "type": "macd",
          "fast": 12,
          "slow": 26,
          "signal": 9
         },
         {
          "id": "bb_20",
          "type": "bb",
          "period": 20
         }
        ]
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PostIndicatorsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:14.112Z",
         "data_type": "indicators",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": {
          "indicators": {
           "rsi_14": {
            "time": "2026-10-13T00:00:00.000Z",
            "type": "rsi",
            "period": 14,
            "values": [
             35.6543011074,
             32.4664868804,
             28.7947488902
            ],
            "times": [
             "2026-10-12T22:00:00.000Z",
             "2026-10-12T23:00:00.000Z",
             "2026-10-13T00:00:00.000Z"
            ]
           },
           "macd": {
            "time": "2026-10-13T00:00:00.000Z",
            "type": "macd",
            "fast": 12,
            "slow": 26,
            "signal": 9,
            "values": {
             "macd": [
              -267.933035785,
              -322.214488546,
              -393.573068475
             ],
             "signal": [
              -185.03169891,
              -212.468256837,
              -248.689219165
             ],
             "histogram": [
              -82.9013368754,
              -109.746231709,
              -144.883849311
             ]
            },
            "times": [
             "2026-10-12T22:00:00.000Z",
             "2026-10-12T23:00:00.000Z",
             "2026-10-13T00:00:00.000Z"
            ]
           },
           "bb_20": {
            "time": "2026-10-13T00:00:00.000Z",
            "type": "bb",
            "period": 20,
            "std": 2.0,
            "values": {
             "upper": [
              84399.2488413,
              84415.3764242,
              84360.752448
             ],
             "middle": [
              83158.085,
              83069.932,
              82934.6195
             ],
             "lower": [
              81916.9211587,
              81724.4875758,
              81508.486552
             ]
            },
            "times": [
             "2026-10-12T22:00:00.000Z",
             "2026-10-12T23:00:00.000Z",
             "2026-10-13T00:00:00.000Z"
            ]
           }
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Technical indicators"
    ],
    "description": "POST a JSON body: `symbol`, `timeframe`, `limit` (values per indicator, 1 to 1000, default 1; `results` is accepted as a synonym) and `indicators`, a list of `{id, type, <parameters flat>}` — e.g. `{\"id\": \"rsi_14\", \"type\": \"rsi\", \"period\": 14}`. `id` is your own name for the result (1 to 64 characters among letters, digits, `_`, `-`, `.`), unique in the call: `data.indicators` is keyed by it, and a type may appear any number of times. A nested `\"parameters\": {...}` object is also accepted; an unknown body field is a 422 `unknown_parameter`. Computed on the same candles as `/v1/klines`; `limit + warm-up` is capped at 1000 candles. Each result gives `values` OLDEST FIRST (the order of a chart) with `times`, the candle of each value, and `time`, the candle of the last one. Errors on the indicators are 422 `invalid_indicator`. On a stablecoin: 200, `data: null`, `unavailable: \"not_applicable\"`.",
    "x-family": "indicators",
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -X POST -H \"X-API-KEY: $BYTNODE_API_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"results\": 3, \"indicators\": [{\"id\": \"rsi_14\", \"type\": \"rsi\", \"period\": 14}, {\"id\": \"macd\", \"type\": \"macd\", \"fast\": 12, \"slow\": 26, \"signal\": 9}, {\"id\": \"bb_20\", \"type\": \"bb\", \"period\": 20}]}' \\\n  https://api.bytnode.com/v1/indicators"
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.post(\n    \"https://api.bytnode.com/v1/indicators\",\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    json={\n    \"symbol\": \"BTCUSDT\",\n    \"timeframe\": \"1h\",\n    \"results\": 3,\n    \"indicators\": [\n        {\n            \"id\": \"rsi_14\",\n            \"type\": \"rsi\",\n            \"period\": 14\n        },\n        {\n            \"id\": \"macd\",\n            \"type\": \"macd\",\n            \"fast\": 12,\n            \"slow\": 26,\n            \"signal\": 9\n        },\n        {\n            \"id\": \"bb_20\",\n            \"type\": \"bb\",\n            \"period\": 20\n        }\n    ]\n},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/indicators\", {\n  method: \"POST\",\n  headers: {\n    \"X-API-KEY\": process.env.BYTNODE_API_KEY,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"results\": 3, \"indicators\": [{\"id\": \"rsi_14\", \"type\": \"rsi\", \"period\": 14}, {\"id\": \"macd\", \"type\": \"macd\", \"fast\": 12, \"slow\": 26, \"signal\": 9}, {\"id\": \"bb_20\", \"type\": \"bb\", \"period\": 20}]}),\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/klines": {
   "get": {
    "summary": "OHLCV candles",
    "operationId": "getKlines",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/KlineTimeframe"
      },
      "description": "Candle size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `1d` or `1w` (weekly candles start on Monday 00:00 UTC). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/KlinesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:07.914Z",
         "data_type": "klines",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "open": 81850.01,
           "high": 81959.53,
           "low": 81033.66,
           "close": 81442.56,
           "volume": 53963.6299284,
           "buy_volume": 24013.7702729,
           "sell_volume": 29949.8596555,
           "is_volume_estimated": false,
           "volume_spot": 5067.10968841,
           "buy_volume_spot": 2428.30951292,
           "sell_volume_spot": 2638.80017549,
           "is_volume_spot_estimated": false,
           "volume_futures": 48896.52024,
           "buy_volume_futures": 21585.46076,
           "sell_volume_futures": 27311.05948,
           "is_volume_futures_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "open": 82157.65,
           "high": 82270.87,
           "low": 81750.09,
           "close": 81850.0,
           "volume": 41313.558971,
           "buy_volume": 18937.9463919,
           "sell_volume": 22375.6125791,
           "is_volume_estimated": false,
           "volume_spot": 3954.547391,
           "buy_volume_spot": 1911.43267185,
           "sell_volume_spot": 2043.11471915,
           "is_volume_spot_estimated": false,
           "volume_futures": 37359.01158,
           "buy_volume_futures": 17026.51372,
           "sell_volume_futures": 20332.49786,
           "is_volume_futures_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "open": 82574.18,
           "high": 82781.61,
           "low": 82101.65,
           "close": 82157.66,
           "volume": 21332.949649,
           "buy_volume": 8264.20063527,
           "sell_volume": 13068.7490138,
           "is_volume_estimated": false,
           "volume_spot": 2215.88102904,
           "buy_volume_spot": 973.68315527,
           "sell_volume_spot": 1242.19787377,
           "is_volume_spot_estimated": false,
           "volume_futures": 19117.06862,
           "buy_volume_futures": 7290.51748,
           "sell_volume_futures": 11826.55114,
           "is_volume_futures_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "description": "CLOSED candles of `timeframe` (required: `1m` to `1w`); the candle in progress is never served. OHLC from one reference SPOT market per symbol. `volume`, `buy_volume` and `sell_volume` cover ALL markets (spot + perpetual futures, summed across venues); `volume_spot` / `volume_futures` and their buy/sell split cover one market. `is_closed` turns true once the candle's volumes are final (a few seconds after its end: until then they can be `null`). To sync incrementally, resume FROM the oldest row still `is_closed: false` (read it again), not after it. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "x-family": "price_volume",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/klines\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/klines?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/limits": {
   "get": {
    "summary": "Your plan's limits",
    "operationId": "getLimits",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LimitsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:05.496Z",
         "data_type": "limits",
         "data": {
          "plan": "legacy",
          "families": null,
          "history": [
           {
            "timeframe": "1m",
            "window_minutes": null
           },
           {
            "timeframe": "5m",
            "window_minutes": null
           },
           {
            "timeframe": "15m",
            "window_minutes": null
           }
          ],
          "ticks_window_minutes": null,
          "liquidation_events": null,
          "rate": null,
          "quota": null
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "System"
    ],
    "description": "What your key may do, read from the plan that served THIS request: `plan`, the data `families` it includes (`null` = all), the history window per `timeframe` (`window_minutes`, `null` = unlimited), the tick-by-tick window, the number of individual liquidations, and the per-minute `rate` and monthly `quota` with what is left. Use it to size `limit` and `since_ms` before paging instead of discovering the window through a 403 `history_depth`. Free: not counted in your quota. With an unmetered key, every limit is `null`.",
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-metered": false,
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/limits\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/limits\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/limits\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/liquidations/cumulative": {
   "get": {
    "summary": "Liquidations over the last 5 minutes",
    "operationId": "getLiquidationsCumulative",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LiquidationsCumulativeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:27.067Z",
         "data_type": "liquidations_cumulative",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:27:00.000Z",
          "long_usd": 42476.512,
          "short_usd": 1393.8181,
          "total_usd": 43870.3301,
          "window_start": "2026-10-13T01:22:00.000Z",
          "window_s": 300
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "description": "Longs and shorts liquidated, USD, all venues, over the last closed 5-minute window (from `window_start`, `window_s` long), aligned on the minute; `time` is its end.",
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/liquidations/cumulative?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/liquidations/cumulative\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/liquidations/cumulative?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/liquidations/cumulative/history": {
   "get": {
    "summary": "Cumulative liquidations history",
    "operationId": "getLiquidationsCumulativeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, holding the totals of the WHOLE bucket. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LiquidationsCumulativeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:27.628Z",
         "data_type": "liquidations_cumulative_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "long_usd": 28639207.1225,
           "short_usd": 389992.909966,
           "total_usd": 29029200.0324,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "long_usd": 29642428.1436,
           "short_usd": 103205.145838,
           "total_usd": 29745633.2894,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "long_usd": 6423144.24091,
           "short_usd": 5160.5535,
           "total_usd": 6428304.79441,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/liquidations/cumulative/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "description": "One row per closed bucket of `timeframe` (required): the longs and shorts liquidated during the WHOLE bucket, USD, all venues (0 when none). The series starts at the first liquidation recorded for the symbol. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/liquidations/cumulative/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/liquidations/cumulative/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/liquidations/cumulative/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/liquidations/events": {
   "get": {
    "summary": "Individual liquidations",
    "description": "Forced liquidations across futures venues, one row per event, most recent first. `limit` is a number of events (with `min_usd`: events of at least that size). History depth is a count per plan: the last 100 liquidations on Free, 500 on Traders, 1,000 on Financial, 10,000 on Startup; a larger `limit` returns 403 `history_depth`.",
    "operationId": "getLiquidationsEvents",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 10000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "min_usd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number",
       "minimum": 0
      },
      "description": "Optional minimum notional in USD: only liquidations of at least this size are returned. `limit` always counts events."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LiquidationsEventsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:11.055Z",
         "data_type": "liquidations_events",
         "symbol": "BTCUSDT",
         "data": [
          {
           "time": "2026-10-13T01:25:20.092Z",
           "side": "short",
           "price": 81989.3,
           "quantity": 0.017,
           "value_usd": 1393.8181
          },
          {
           "time": "2026-10-13T01:24:30.786Z",
           "side": "long",
           "price": 81685.6,
           "quantity": 0.52,
           "value_usd": 42476.512
          },
          {
           "time": "2026-10-13T01:19:39.387Z",
           "side": "short",
           "price": 82163.8,
           "quantity": 0.009,
           "value_usd": 739.4742
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 2,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/liquidations/events?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/liquidations/events\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/liquidations/events?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/liquidations/ratio": {
   "get": {
    "summary": "Big vs small liquidations",
    "description": "Liquidations of 100,000 USD or more versus smaller ones over the latest closed minute with liquidations: counts, USD and ratio. A high ratio = large positions are being flushed.",
    "operationId": "getLiquidationsRatio",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LiquidationsRatioResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:28.204Z",
         "data_type": "liquidations_ratio",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:25:00.000Z",
          "big_count": 0,
          "big_usd": 0.0,
          "small_count": 1,
          "small_usd": 1393.8181,
          "ratio": 0.0,
          "window_start": "2026-10-13T01:25:00.000Z",
          "window_s": 60
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/liquidations/ratio?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/liquidations/ratio\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/liquidations/ratio?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/liquidations/ratio/history": {
   "get": {
    "summary": "Big vs small liquidations history",
    "description": "One row per closed bucket of `timeframe` (required). History depth is a number of rows per plan, whatever the timeframe: the last 100 on Free, 500 on Traders, 1,000 on Financial, 10,000 on Startup (1,000 per page at most: follow `next`); a larger `limit`, or a bound beyond those rows, returns 403 `history_depth`. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getLiquidationsRatioHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/LiquidationsRatioHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:28.736Z",
         "data_type": "liquidations_ratio_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "big_count": 51,
           "big_usd": 21375466.8724,
           "small_count": 1020,
           "small_usd": 7653733.16001,
           "ratio": 2.79281579662,
           "sample_count": 37,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "big_count": 34,
           "big_usd": 26250879.092,
           "small_count": 433,
           "small_usd": 3494754.19744,
           "ratio": 7.51150942495,
           "sample_count": 28,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "big_count": 16,
           "big_usd": 4360022.62402,
           "small_count": 276,
           "small_usd": 2068282.17039,
           "ratio": 2.10804052099,
           "sample_count": 20,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/liquidations/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Liquidations"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/liquidations/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/liquidations/ratio/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/liquidations/ratio/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro": {
   "get": {
    "summary": "Latest macro values",
    "description": "Latest value of one FRED series (`series` required; the latest value of every series is `/v1/macro/series`).",
    "operationId": "getMacro",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "series",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "FRED series id (e.g. `DGS10`). Required. The latest value of every series: `GET /v1/macro/series`.",
      "example": "DGS10"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:33.410Z",
         "data_type": "macro",
         "series": "DGS10",
         "data": {
          "time": "2026-10-08T00:00:00.000Z",
          "series_id": "DGS10",
          "category": "rates",
          "name": "Treasury 10Y",
          "frequency": "daily",
          "units": "%",
          "value": 5.22
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Macro"
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro?series=DGS10\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro\",\n    params={\"series\": \"DGS10\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro?series=DGS10\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/correlations": {
   "get": {
    "summary": "BTC correlation with macro",
    "description": "Rolling Pearson correlation of BTC daily returns with the dollar index, the S&P 500, gold and the VIX, over 30 and 90 days.",
    "operationId": "getMacroCorrelations",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroCorrelationsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:34.980Z",
         "data_type": "macro_correlations",
         "data": {
          "time": "2026-10-12T00:00:00.000Z",
          "oldest_input_date": "2026-10-02",
          "asset": "BTC",
          "method": "Pearson correlation of daily returns (common dates), rolling window",
          "correlations": {
           "dxy": {
            "30d": {
             "time": "2026-10-02T00:00:00.000Z",
             "correlation": -0.1346,
             "sample_count": 15
            },
            "90d": {
             "time": "2026-10-02T00:00:00.000Z",
             "correlation": -0.3044,
             "sample_count": 57
            }
           },
           "sp500": {
            "30d": {
             "time": "2026-10-12T00:00:00.000Z",
             "correlation": 0.5594,
             "sample_count": 21
            },
            "90d": {
             "time": "2026-10-12T00:00:00.000Z",
             "correlation": 0.3344,
             "sample_count": 63
            }
           },
           "gold": {
            "30d": {
             "time": "2026-10-12T00:00:00.000Z",
             "correlation": 0.3005,
             "sample_count": 30
            },
            "90d": {
             "time": "2026-10-12T00:00:00.000Z",
             "correlation": 0.5182,
             "sample_count": 90
            }
           },
           "vix": {
            "30d": {
             "time": "2026-10-09T00:00:00.000Z",
             "correlation": -0.1323,
             "sample_count": 20
            },
            "90d": {
             "time": "2026-10-09T00:00:00.000Z",
             "correlation": -0.2112,
             "sample_count": 63
            }
           }
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Macro"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/correlations\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/correlations\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/correlations\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/history": {
   "get": {
    "summary": "Macro series history",
    "description": "Values of one series at its native frequency. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getMacroHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "series",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "FRED series id, e.g. `DGS10`, `CPIAUCSL`, `WALCL`. The list: `GET /v1/macro/series`.",
      "example": "DGS10"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:34.444Z",
         "data_type": "macro_history",
         "series": "DGS10",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-08T00:00:00.000Z",
           "value": 5.22,
           "is_closed": true
          },
          {
           "time": "2026-10-07T00:00:00.000Z",
           "value": 5.28,
           "is_closed": true
          },
          {
           "time": "2026-10-06T00:00:00.000Z",
           "value": 5.27,
           "is_closed": true
          }
         ],
         "next": "/v1/macro/history?series=DGS10&limit=3&before_ms=1791244800000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Macro"
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/history?series=DGS10&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/history\",\n    params={\"series\": \"DGS10\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/history?series=DGS10&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/intraday/history": {
   "get": {
    "summary": "Intraday macro candles",
    "description": "OHLCV candles of one instrument, most recent first (`data` is the list of candles; `series` and `timeframe` are recalled in the envelope).",
    "operationId": "getMacroIntradayHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "series",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "The `series_id` returned by `GET /v1/macro/intraday/series` (e.g. `EURUSD`, `DXY_ICE`), in any case. The `instrument_code` column is NOT accepted.",
      "example": "EURUSD"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/IntradayTimeframe"
      },
      "description": "Candle size, required. Each series serves only the timeframes listed in its catalogue entry; others return 422 `timeframe_not_served`.",
      "example": "1h"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroIntradayHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:38.161Z",
         "data_type": "macro_intraday_history",
         "timeframe": "1h",
         "series": "EURUSD",
         "data": [
          {
           "time": "2026-10-08T23:00:00.000Z",
           "open": 1.12126,
           "high": 1.12131,
           "low": 1.12105,
           "close": 1.12126,
           "volume": 2912.91997886,
           "is_closed": true
          },
          {
           "time": "2026-10-08T22:00:00.000Z",
           "open": 1.12121,
           "high": 1.12156,
           "low": 1.12101,
           "close": 1.12125,
           "volume": 2085.07002425,
           "is_closed": true
          },
          {
           "time": "2026-10-08T21:00:00.000Z",
           "open": 1.12096,
           "high": 1.12127,
           "low": 1.12033,
           "close": 1.12121,
           "volume": 1248.5800066,
           "is_closed": true
          }
         ],
         "next": "/v1/macro/intraday/history?series=EURUSD&timeframe=1h&limit=3&before_ms=1791493200000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Macro"
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/intraday/history?series=EURUSD&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/intraday/history\",\n    params={\"series\": \"EURUSD\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/intraday/history?series=EURUSD&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/intraday/series": {
   "get": {
    "summary": "Intraday macro instruments",
    "description": "Instruments with intraday candles (FX, dollar index, gold, oil, US yields, VIX...), the timeframes each serves, their history depth and last candle.",
    "operationId": "getMacroIntradaySeries",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroIntradaySeriesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:37.622Z",
         "data_type": "macro_intraday_series",
         "data": [
          {
           "series_id": "DXY_ICE",
           "source": "dukascopy",
           "instrument_code": "DOLLARIDXUSD",
           "category": "fx",
           "name": "ICE Dollar Index",
           "units": "Index",
           "volume_kind": "broker",
           "timeframes": [
            "1m",
            "5m",
            "15m"
           ],
           "history_start_date": "2017-12-01",
           "last_candle_at": {
            "1m": "2026-10-08T20:59:00.000Z",
            "5m": "2026-10-08T20:55:00.000Z",
            "15m": "2026-10-08T20:45:00.000Z",
            "1h": "2026-10-08T20:00:00.000Z",
            "4h": "2026-10-08T20:00:00.000Z",
            "1d": "2026-10-08T00:00:00.000Z"
           }
          },
          {
           "series_id": "EURUSD",
           "source": "dukascopy",
           "instrument_code": "EURUSD",
           "category": "fx",
           "name": "EUR/USD",
           "units": "USD per EUR",
           "volume_kind": "broker",
           "timeframes": [
            "1m",
            "5m",
            "15m"
           ],
           "history_start_date": "2003-05-04",
           "last_candle_at": {
            "1m": "2026-10-08T23:59:00.000Z",
            "5m": "2026-10-08T23:55:00.000Z",
            "15m": "2026-10-08T23:45:00.000Z",
            "1h": "2026-10-08T23:00:00.000Z",
            "4h": "2026-10-08T20:00:00.000Z",
            "1d": "2026-10-08T00:00:00.000Z"
           }
          },
          {
           "series_id": "PAXGUSDT",
           "source": "venue_a",
           "instrument_code": "PAXGUSDT",
           "category": "commodities",
           "name": "PAX Gold / USDT",
           "units": "USDT per token",
           "volume_kind": "market",
           "timeframes": [
            "1m",
            "5m",
            "15m"
           ],
           "history_start_date": "2020-08-28",
           "last_candle_at": {
            "1m": "2026-10-13T01:23:00.000Z",
            "5m": "2026-10-13T01:15:00.000Z",
            "15m": "2026-10-13T01:00:00.000Z",
            "1h": "2026-10-13T00:00:00.000Z",
            "4h": "2026-10-12T20:00:00.000Z",
            "1d": "2026-10-12T00:00:00.000Z"
           }
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Macro"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/intraday/series\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/intraday/series\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/intraday/series\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/momentum": {
   "get": {
    "summary": "Macro momentum score",
    "description": "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.",
    "operationId": "getMacroMomentum",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroMomentumResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:35.496Z",
         "data_type": "macro_momentum",
         "data": {
          "time": "2026-10-07T00:00:00.000Z",
          "oldest_input_date": "2026-08-01",
          "scale": "-100 (bearish) .. +100 (bullish crypto)",
          "30d": {
           "score": -5.6,
           "components": [
            {
             "time": "2026-10-02T00:00:00.000Z",
             "metric": "dxy",
             "change_pct": 2.409,
             "contribution": -96.4
            },
            {
             "time": "2026-08-01T00:00:00.000Z",
             "metric": "m2",
             "change_pct": 0.538,
             "contribution": 71.7
            },
            {
             "time": "2026-10-07T00:00:00.000Z",
             "metric": "fed_balance_sheet",
             "change_pct": 0.154,
             "contribution": 7.7
            }
           ]
          },
          "90d": {
           "score": 21.2,
           "components": [
            {
             "time": "2026-10-02T00:00:00.000Z",
             "metric": "dxy",
             "change_pct": 0.576,
             "contribution": -11.5
            },
            {
             "time": "2026-08-01T00:00:00.000Z",
             "metric": "m2",
             "change_pct": 1.43,
             "contribution": 71.5
            },
            {
             "time": "2026-10-07T00:00:00.000Z",
             "metric": "fed_balance_sheet",
             "change_pct": 0.177,
             "contribution": 3.5
            }
           ]
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Macro"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/momentum\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/momentum\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/momentum\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/net-liquidity": {
   "get": {
    "summary": "US net liquidity",
    "description": "Fed balance sheet minus Treasury General Account minus overnight reverse repo, in USD, with its components: the latest row of the history (daily grid of the reverse repo; the weekly WALCL and TGA values are the latest known on that day, dated by `walcl_date` / `tga_date`).",
    "operationId": "getMacroNetLiquidity",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroNetLiquidityResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:36.541Z",
         "data_type": "macro_net_liquidity",
         "data": {
          "time": "2026-10-09T00:00:00.000Z",
          "net_liquidity_usd": 5867007000000.0,
          "walcl_usd": 6747560000000.0,
          "tga_usd": 880253000000.0,
          "rrp_usd": 300000000.0,
          "walcl_date": "2026-10-07",
          "tga_date": "2026-10-07"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Macro"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/net-liquidity\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/net-liquidity\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/net-liquidity\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/net-liquidity/history": {
   "get": {
    "summary": "Net liquidity history",
    "description": "Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getMacroNetLiquidityHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroNetLiquidityHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:37.044Z",
         "data_type": "macro_net_liquidity_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-09T00:00:00.000Z",
           "net_liquidity_usd": 5867007000000.0,
           "walcl_usd": 6747560000000.0,
           "tga_usd": 880253000000.0,
           "rrp_usd": 300000000.0,
           "walcl_date": "2026-10-07",
           "tga_date": "2026-10-07",
           "is_closed": true
          },
          {
           "time": "2026-10-08T00:00:00.000Z",
           "net_liquidity_usd": 5866972000000.0,
           "walcl_usd": 6747560000000.0,
           "tga_usd": 880253000000.0,
           "rrp_usd": 335000000.0,
           "walcl_date": "2026-10-07",
           "tga_date": "2026-10-07",
           "is_closed": true
          },
          {
           "time": "2026-10-07T00:00:00.000Z",
           "net_liquidity_usd": 5864969000000.0,
           "walcl_usd": 6747560000000.0,
           "tga_usd": 880253000000.0,
           "rrp_usd": 2338000000.0,
           "walcl_date": "2026-10-07",
           "tga_date": "2026-10-07",
           "is_closed": true
          }
         ],
         "next": "/v1/macro/net-liquidity/history?limit=3&before_ms=1791331200000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Macro"
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/net-liquidity/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/net-liquidity/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/net-liquidity/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/risk": {
   "get": {
    "summary": "Risk-on / risk-off score",
    "description": "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.",
    "operationId": "getMacroRisk",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroRiskResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:36.025Z",
         "data_type": "macro_risk",
         "data": {
          "time": "2026-10-12T00:00:00.000Z",
          "oldest_input_date": "2026-10-02",
          "score": 60.0,
          "label": "risk_on",
          "risk_on_signal_count": 3,
          "available_signal_count": 5,
          "signal_count": 5,
          "signals": {
           "vix": {
            "time": "2026-10-09T00:00:00.000Z",
            "condition": "VIX < 20",
            "is_risk_on": true
           },
           "dxy": {
            "time": "2026-10-02T00:00:00.000Z",
            "condition": "DXY down over 7 days",
            "is_risk_on": false
           },
           "yield_curve": {
            "time": "2026-10-09T00:00:00.000Z",
            "condition": "10Y-2Y curve positive",
            "is_risk_on": true
           },
           "sp500": {
            "time": "2026-10-12T00:00:00.000Z",
            "condition": "S&P 500 > SMA50",
            "is_risk_on": true
           },
           "gold": {
            "time": "2026-10-12T00:00:00.000Z",
            "condition": "Gold down over 7 days",
            "is_risk_on": false
           }
          },
          "context": {
           "vix": 14.84,
           "dxy": 121.3848,
           "dxy_7d_ago": 120.33,
           "yield_curve_10y2y_pp": 0.44,
           "sp500": 7807.24,
           "sp500_sma_50d": 7703.269,
           "gold_usd": 4168.69483834,
           "gold_7d_ago_usd": 4142.06466953
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "Macro"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/risk\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/risk\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/risk\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/macro/series": {
   "get": {
    "summary": "Macro series catalogue",
    "description": "Every active FRED series with its category, unit, frequency and latest value.",
    "operationId": "getMacroSeries",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "category",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Filter by category, e.g. `rates`, `inflation`, `liquidity`, `commodities`."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MacroSeriesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:33.928Z",
         "data_type": "macro_series",
         "data": [
          {
           "time": "2026-10-06T00:00:00.000Z",
           "series_id": "DCOILWTICO",
           "category": "commodities",
           "name": "WTI Crude Oil",
           "frequency": "daily",
           "units": "USD per barrel",
           "value": 96.24
          },
          {
           "time": "2026-10-12T00:00:00.000Z",
           "series_id": "GOLD_USD",
           "category": "commodities",
           "name": "Gold (PAXG proxy, USD/oz)",
           "frequency": "daily",
           "units": "USD per troy ounce",
           "value": 4168.69483834
          },
          {
           "time": "2026-09-01T00:00:00.000Z",
           "series_id": "PAYEMS",
           "category": "employment",
           "name": "Nonfarm Payrolls",
           "frequency": "monthly",
           "units": "Thousands of persons",
           "value": 159044.0
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Macro"
    ],
    "x-family": "macro",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/macro/series\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/macro/series\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/macro/series\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/oi": {
   "get": {
    "summary": "Open interest",
    "description": "Current total open interest of the perpetual futures, summed across venues (base asset units): for each venue its latest reading, then the sum. The same `oi`, at the same instant, as `/v1/oi/delta`; its history is `/v1/oi/history`.",
    "operationId": "getOi",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OiResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:25.395Z",
         "data_type": "oi",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:27:14.101Z",
          "oi": 332726.15482
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/oi?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/oi\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/oi?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/oi/delta": {
   "get": {
    "summary": "Open interest change",
    "description": "Change of total open interest over the last minute, summed across venues: `oi` (now), `oi_previous`, `oi_change`, `oi_change_pct`.",
    "operationId": "getOiDelta",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OiDeltaResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:25.903Z",
         "data_type": "oi_delta",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:27:14.101Z",
          "oi": 332726.15482,
          "oi_previous": 332525.28168,
          "oi_change": 200.87314,
          "oi_change_pct": 0.0604083812771,
          "window_start": "2026-10-13T01:26:14.101Z",
          "window_s": 60
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/oi/delta?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/oi/delta\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/oi/delta?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/oi/delta/history": {
   "get": {
    "summary": "Open interest change history",
    "description": "One row per closed bucket of `timeframe` (required). Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOiDeltaHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OiDeltaHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:26.451Z",
         "data_type": "oi_delta_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "oi": 332959.43072,
           "oi_previous": 335492.36492,
           "oi_change": -2532.9342,
           "oi_change_pct": -0.754990117466,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "oi": 335492.36492,
           "oi_previous": 339760.84148,
           "oi_change": -4268.47656,
           "oi_change_pct": -1.25631798574,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "oi": 339957.12848,
           "oi_previous": 339108.60192,
           "oi_change": 848.52656,
           "oi_change_pct": 0.250222658817,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/oi/delta/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/oi/delta/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/oi/delta/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/oi/delta/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/oi/history": {
   "get": {
    "summary": "Total open interest history",
    "description": "Open interest summed across futures venues, per closed bucket of `timeframe` (required): for each venue, its last open interest in the bucket — `oi` is the value at the END of the bucket, like a close. The same quantity, under the same name, as `oi` on `/v1/oi/delta`. Older history is coarser: its source has one reading every 4 hours, then one a day further back (BTCUSDT: hourly readings from 2026-06-24, 4-hourly from 2025-10-06). On a finer `timeframe` such a period has one row per reading; the buckets in between are absent, never filled. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOiHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OiHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:10.529Z",
         "data_type": "oi_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "oi": 332959.43072,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "oi": 335492.36492,
           "sample_count": 60,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "oi": 339957.12848,
           "sample_count": 60,
           "is_closed": true
          }
         ],
         "next": "/v1/oi/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Derivatives"
    ],
    "x-family": "derivatives",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/oi/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/oi/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/oi/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/active-addresses": {
   "get": {
    "summary": "Bitcoin active addresses",
    "description": "Daily active addresses, 7- and 30-day averages and momentum.",
    "operationId": "getOnchainActiveAddresses",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainActiveAddressesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:03.369Z",
         "data_type": "onchain_active_addresses",
         "data": {
          "time": "2026-10-12T00:00:00.000Z",
          "active_addresses": 469212.0,
          "active_addresses_sma_7d": 480309.142857,
          "active_addresses_sma_30d": 484214.0,
          "sma_7d_vs_30d_pct": -0.806432102925,
          "label": "stable"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "On-chain Bitcoin"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/active-addresses\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/active-addresses\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/active-addresses\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/active-addresses/history": {
   "get": {
    "summary": "Active addresses history",
    "description": "One point per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOnchainActiveAddressesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainActiveAddressesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:03.883Z",
         "data_type": "onchain_active_addresses_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "active_addresses": 469212.0,
           "active_addresses_sma_7d": 480309.142857,
           "active_addresses_sma_30d": 484214.0,
           "sma_7d_vs_30d_pct": -0.806432102925,
           "label": "stable",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "active_addresses": 418068.0,
           "active_addresses_sma_7d": 484272.428571,
           "active_addresses_sma_30d": 483574.466667,
           "sma_7d_vs_30d_pct": 0.144333903643,
           "label": "stable",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "active_addresses": 459043.0,
           "active_addresses_sma_7d": 485448.428571,
           "active_addresses_sma_30d": 486700.566667,
           "sma_7d_vs_30d_pct": -0.257270728862,
           "label": "stable",
           "is_closed": true
          }
         ],
         "next": "/v1/onchain/active-addresses/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "On-chain Bitcoin"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/active-addresses/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/active-addresses/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/active-addresses/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/miner-stress": {
   "get": {
    "summary": "Bitcoin miner stress",
    "description": "Miner revenue per unit of difficulty against its 30-day average: healthy, stress or capitulation. Daily.",
    "operationId": "getOnchainMinerStress",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainMinerStressResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:04.398Z",
         "data_type": "onchain_miner_stress",
         "data": {
          "time": "2026-10-12T00:00:00.000Z",
          "revenue_per_difficulty_usd": 3.23589739812e-07,
          "revenue_per_difficulty_sma_30d_usd": 3.19367344424e-07,
          "label": "healthy"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "On-chain Bitcoin"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/miner-stress\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/miner-stress\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/miner-stress\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/miner-stress/history": {
   "get": {
    "summary": "Miner stress history",
    "description": "One point per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOnchainMinerStressHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainMinerStressHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:04.925Z",
         "data_type": "onchain_miner_stress_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "revenue_per_difficulty_usd": 3.23589739812e-07,
           "revenue_per_difficulty_sma_30d_usd": 3.19367344424e-07,
           "label": "healthy",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "revenue_per_difficulty_usd": 3.42885052815e-07,
           "revenue_per_difficulty_sma_30d_usd": 3.19419432076e-07,
           "label": "healthy",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "revenue_per_difficulty_usd": 3.27435258524e-07,
           "revenue_per_difficulty_sma_30d_usd": 3.19508212669e-07,
           "label": "healthy",
           "is_closed": true
          }
         ],
         "next": "/v1/onchain/miner-stress/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "On-chain Bitcoin"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/miner-stress/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/miner-stress/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/miner-stress/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/mvrv": {
   "get": {
    "summary": "Bitcoin MVRV",
    "description": "Market value / realised value with its zone and 30-day momentum. Daily.",
    "operationId": "getOnchainMvrv",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainMvrvResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:01.301Z",
         "data_type": "onchain_mvrv",
         "data": {
          "time": "2026-10-06T00:00:00.000Z",
          "mvrv": 1.6056,
          "label": "fair",
          "change_30d_pct": 5.50663687738
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "On-chain Bitcoin"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/mvrv\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/mvrv\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/mvrv\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/mvrv/history": {
   "get": {
    "summary": "MVRV history",
    "description": "One point per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOnchainMvrvHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainMvrvHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:01.812Z",
         "data_type": "onchain_mvrv_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-06T00:00:00.000Z",
           "mvrv": 1.6056,
           "label": "fair",
           "change_30d_pct": 5.50663687738,
           "is_closed": true
          },
          {
           "time": "2026-10-05T00:00:00.000Z",
           "mvrv": 1.6068,
           "label": "fair",
           "change_30d_pct": 6.15750528541,
           "is_closed": true
          },
          {
           "time": "2026-10-04T00:00:00.000Z",
           "mvrv": 1.624,
           "label": "fair",
           "change_30d_pct": 7.39320195741,
           "is_closed": true
          }
         ],
         "next": "/v1/onchain/mvrv/history?limit=3&before_ms=1791072000000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "On-chain Bitcoin"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/mvrv/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/mvrv/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/mvrv/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/nvt": {
   "get": {
    "summary": "Bitcoin NVT",
    "description": "Network value to transactions ratio and its 90-day NVT Signal, derived on demand. Daily.",
    "operationId": "getOnchainNvt",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainNvtResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:02.328Z",
         "data_type": "onchain_nvt",
         "data": {
          "time": "2026-10-12T00:00:00.000Z",
          "nvt": 256.780965406,
          "nvt_signal": 290.067385335,
          "label": "bubble"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "tags": [
     "On-chain Bitcoin"
    ],
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/nvt\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/nvt\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/nvt\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/onchain/nvt/history": {
   "get": {
    "summary": "NVT history",
    "description": "One point per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOnchainNvtHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OnchainNvtHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:02.841Z",
         "data_type": "onchain_nvt_history",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "nvt": 256.780965406,
           "nvt_signal": 290.067385335,
           "label": "bubble",
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "nvt": 367.826136099,
           "nvt_signal": 289.193794538,
           "label": "bubble",
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "nvt": 487.484715423,
           "nvt_signal": 287.051748232,
           "label": "bubble",
           "is_closed": true
          }
         ],
         "next": "/v1/onchain/nvt/history?limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "On-chain Bitcoin"
    ],
    "x-family": "onchain",
    "x-update-frequency-seconds": 300,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/onchain/nvt/history?limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/onchain/nvt/history\",\n    params={\"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/onchain/nvt/history?limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/expiry": {
   "get": {
    "summary": "Per-expiry breakdown",
    "description": "Every active expiry: open interest, put/call ratio, max pain, top call and put strikes, the ATM IV of that expiry. `data` is a list.",
    "operationId": "getOptionsExpiry",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsExpiryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:47.300Z",
         "data_type": "options_expiry",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-13T08:00:00.000Z",
           "dte_days": 0.272771997604,
           "oi_call_usd": 440190151.043,
           "oi_put_usd": 349126486.361,
           "put_call_ratio": 0.793126528464,
           "max_pain_strike_usd": 83000.0,
           "top_call_strike_usd": 86000.0,
           "top_put_strike_usd": 82500.0,
           "iv_atm_pct": 33.0200606115,
           "put_call_label": "neutral"
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-14T08:00:00.000Z",
           "dte_days": 1.2727719976,
           "oi_call_usd": 218119793.526,
           "oi_put_usd": 123379463.098,
           "put_call_ratio": 0.565650008663,
           "max_pain_strike_usd": 82500.0,
           "top_call_strike_usd": 88000.0,
           "top_put_strike_usd": 81500.0,
           "iv_atm_pct": 32.6521701116,
           "put_call_label": "bullish"
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-15T08:00:00.000Z",
           "dte_days": 2.2727719976,
           "oi_call_usd": 99210697.6519,
           "oi_put_usd": 63136794.4674,
           "put_call_ratio": 0.636390993731,
           "max_pain_strike_usd": 82500.0,
           "top_call_strike_usd": 87000.0,
           "top_put_strike_usd": 81000.0,
           "iv_atm_pct": 34.6336412962,
           "put_call_label": "bullish"
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/expiry?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/expiry\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/expiry?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/greeks": {
   "get": {
    "summary": "Aggregated greeks",
    "description": "Delta, gamma, theta and vega of open options, recomputed under one convention and OI-weighted, so they add up across venues.",
    "operationId": "getOptionsGreeks",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsGreeksResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:47.816Z",
         "data_type": "options_greeks",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "delta": 0.083327895657,
          "gamma": 2.42930052704e-05,
          "theta": -31.0318826914,
          "vega": 57.7963185468,
          "coverage": {
           "oi_coverage_ratio": 1.0
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/greeks?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/greeks\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/greeks?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/iv": {
   "get": {
    "summary": "ATM implied volatility (30 days)",
    "description": "At-the-money implied volatility at a constant 30-day maturity, aggregated across venues, in percent: interpolated in total variance between the two expiries around 30 days. The ATM IV of each expiry is on `/v1/options/expiry`.",
    "operationId": "getOptionsIv",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsIvResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:45.209Z",
         "data_type": "options_iv",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "iv_atm_30d_pct": 35.9555733432
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/iv?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/iv\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/iv?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/iv/klines": {
   "get": {
    "summary": "30-day ATM IV candles",
    "description": "OHLC of the 30-day ATM implied volatility per bucket, in percent. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsIvKlines",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsIvKlinesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:45.725Z",
         "data_type": "options_iv_klines",
         "timeframe": "1h",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "open": 36.2174477963,
           "high": 36.4405912827,
           "low": 36.0103109108,
           "close": 36.1358816787,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "open": 36.1281857203,
           "high": 36.3202714237,
           "low": 36.1276039949,
           "close": 36.2383518367,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "open": 35.7005300685,
           "high": 35.997163661,
           "low": 35.6356668296,
           "close": 35.997163661,
           "is_closed": true
          }
         ],
         "next": "/v1/options/iv/klines?asset=BTC&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/iv/klines?asset=BTC&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/iv/klines\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/iv/klines?asset=BTC&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/max-pain": {
   "get": {
    "summary": "Max pain per expiry",
    "description": "Max pain strike of every active expiry, with days to expiry, put/call ratio and open interest. `data` is a list.",
    "operationId": "getOptionsMaxPain",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsMaxPainResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:46.244Z",
         "data_type": "options_max_pain",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-13T08:00:00.000Z",
           "dte_days": 0.272771997604,
           "max_pain_strike_usd": 83000.0,
           "put_call_ratio": 0.793126528464,
           "oi_call_usd": 440190151.043,
           "oi_put_usd": 349126486.361
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-14T08:00:00.000Z",
           "dte_days": 1.2727719976,
           "max_pain_strike_usd": 82500.0,
           "put_call_ratio": 0.565650008663,
           "oi_call_usd": 218119793.526,
           "oi_put_usd": 123379463.098
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-15T08:00:00.000Z",
           "dte_days": 2.2727719976,
           "max_pain_strike_usd": 82500.0,
           "put_call_ratio": 0.636390993731,
           "oi_call_usd": 99210697.6519,
           "oi_put_usd": 63136794.4674
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/max-pain?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/max-pain\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/max-pain?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/max-pain/history": {
   "get": {
    "summary": "Max pain history of one expiry",
    "description": "How the max pain of ONE expiry moved. `expiry` is required. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsMaxPainHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "expiry",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "REQUIRED. Expiry: `YYYY-MM-DD`, or the `expiry` date-time as served (`2026-10-30T08:00:00.000Z`). Missing: 422 `missing_expiry`, and the error lists the active expiries.",
      "example": "2026-10-13"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsMaxPainHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:46.784Z",
         "data_type": "options_max_pain_history",
         "asset": "BTC",
         "expiry": "2026-10-13",
         "data": [
          {
           "time": "2026-10-13T01:27:12.499Z",
           "max_pain_strike_usd": 83000.0,
           "put_call_ratio": 0.793126528464,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:26:05.269Z",
           "max_pain_strike_usd": 83000.0,
           "put_call_ratio": 0.793328931443,
           "is_closed": true
          },
          {
           "time": "2026-10-13T01:24:58.666Z",
           "max_pain_strike_usd": 83000.0,
           "put_call_ratio": 0.789203691165,
           "is_closed": true
          }
         ],
         "next": "/v1/options/max-pain/history?asset=BTC&expiry=2026-10-13&limit=3&before_ms=1791854698666&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/max-pain/history?asset=BTC&expiry=2026-10-13&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/max-pain/history\",\n    params={\"asset\": \"BTC\", \"expiry\": \"2026-10-13\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/max-pain/history?asset=BTC&expiry=2026-10-13&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/oi": {
   "get": {
    "summary": "Options open interest",
    "description": "Calls and puts, in USD and in coins.",
    "operationId": "getOptionsOi",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsOiResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:40.258Z",
         "data_type": "options_oi",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "oi_total_usd": 37268189347.7,
          "oi_call_usd": 22449766645.1,
          "oi_put_usd": 14818422702.7,
          "oi_call": 271701.14,
          "oi_put": 179446.65,
          "coverage": {
           "oi_coverage_ratio": 1.0
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/oi?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/oi\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/oi?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/oi/delta": {
   "get": {
    "summary": "Options open interest change",
    "description": "Change of call and put open interest over the latest bucket.",
    "operationId": "getOptionsOiDelta",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsOiDeltaResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:41.310Z",
         "data_type": "options_oi_delta",
         "timeframe": "1h",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "oi_change_call_usd": 199575693.175,
          "oi_change_put_usd": 109193850.225,
          "oi_change_total_usd": 308769543.4
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/oi/delta?asset=BTC&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/oi/delta\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/oi/delta?asset=BTC&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/oi/delta/history": {
   "get": {
    "summary": "Options OI change history",
    "description": "Per bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsOiDeltaHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsOiDeltaHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:42.016Z",
         "data_type": "options_oi_delta_history",
         "timeframe": "1h",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "oi_change_call_usd": -44966552.2085,
           "oi_change_put_usd": -67499261.6546,
           "oi_change_total_usd": -112465813.863,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "oi_change_call_usd": -52824070.174,
           "oi_change_put_usd": -42397772.921,
           "oi_change_total_usd": -95221843.095,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "oi_change_call_usd": -79386130.4853,
           "oi_change_put_usd": -48324132.4176,
           "oi_change_total_usd": -127710262.903,
           "is_closed": true
          }
         ],
         "next": "/v1/options/oi/delta/history?asset=BTC&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/oi/delta/history?asset=BTC&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/oi/delta/history\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/oi/delta/history?asset=BTC&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/oi/distribution": {
   "get": {
    "summary": "Open interest per strike",
    "description": "Latest open interest per (expiry, strike), calls and puts separately. `data` is a list.",
    "operationId": "getOptionsOiDistribution",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "expiry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Restrict to one expiry: `YYYY-MM-DD`, or the `expiry` date-time as served (`2026-10-30T08:00:00.000Z`). Omit for every active expiry."
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsOiDistributionResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:42.568Z",
         "data_type": "options_oi_distribution",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-13T08:00:00.000Z",
           "strike_usd": 73000.0,
           "oi_call_usd": null,
           "oi_put_usd": 2236886.925
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-13T08:00:00.000Z",
           "strike_usd": 74000.0,
           "oi_call_usd": null,
           "oi_put_usd": 827590.97
          },
          {
           "time": "2026-10-13T01:27:12.499Z",
           "expiry": "2026-10-13T08:00:00.000Z",
           "strike_usd": 75000.0,
           "oi_call_usd": null,
           "oi_put_usd": 270401.01
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/oi/distribution?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/oi/distribution\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/oi/distribution?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/oi/history": {
   "get": {
    "summary": "Options open interest history",
    "description": "Per bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsOiHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsOiHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:40.783Z",
         "data_type": "options_oi_history",
         "timeframe": "1h",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "oi_total_usd": 36968034998.8,
           "oi_call_usd": 22269989694.4,
           "oi_put_usd": 14698045304.4,
           "oi_call": 271494.23,
           "oi_put": 179294.43,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "oi_total_usd": 37080500812.7,
           "oi_call_usd": 22314956246.6,
           "oi_put_usd": 14765544566.1,
           "oi_call": 270530.48,
           "oi_put": 179120.3,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "oi_total_usd": 37175722655.8,
           "oi_call_usd": 22367780316.8,
           "oi_put_usd": 14807942339.0,
           "oi_call": 269930.6,
           "oi_put": 178808.89,
           "is_closed": true
          }
         ],
         "next": "/v1/options/oi/history?asset=BTC&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/oi/history?asset=BTC&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/oi/history\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/oi/history?asset=BTC&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/pc-ratio": {
   "get": {
    "summary": "Put/call ratio",
    "description": "Put/call open interest ratio and its reading.",
    "operationId": "getOptionsPcRatio",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsPcRatioResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:44.176Z",
         "data_type": "options_pc_ratio",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "put_call_ratio": 0.660070233109,
          "label": "bullish"
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/pc-ratio?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/pc-ratio\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/pc-ratio?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/pc-ratio/history": {
   "get": {
    "summary": "Put/call ratio history",
    "description": "Per bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsPcRatioHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsPcRatioHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:44.689Z",
         "data_type": "options_pc_ratio_history",
         "timeframe": "1h",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "put_call_ratio": 0.659993359048,
           "label": "bullish",
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "put_call_ratio": 0.661688259786,
           "label": "bullish",
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "put_call_ratio": 0.662021091464,
           "label": "bullish",
           "is_closed": true
          }
         ],
         "next": "/v1/options/pc-ratio/history?asset=BTC&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/pc-ratio/history?asset=BTC&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/pc-ratio/history\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/pc-ratio/history?asset=BTC&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/summary": {
   "get": {
    "summary": "Options market summary",
    "description": "Open interest and volume (calls/puts, USD), put/call ratio and signal, 30-day ATM IV and the nearest expiry, aggregated across options venues.",
    "operationId": "getOptionsSummary",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsSummaryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:39.725Z",
         "data_type": "options_summary",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "underlying_price_usd": 81932.93,
          "oi_total_usd": 37268189347.7,
          "oi_call_usd": 22449766645.1,
          "oi_put_usd": 14818422702.7,
          "volume_total_usd": 1118990522.27,
          "volume_call_usd": 541434110.684,
          "volume_put_usd": 577556411.589,
          "put_call_ratio": 0.660070233109,
          "put_call_label": "bullish",
          "iv_atm_30d_pct": 35.9555733432,
          "nearest_expiry": {
           "expiry": "2026-10-13T08:00:00.000Z",
           "dte_days": 0.272771997604,
           "max_pain_strike_usd": 83000.0,
           "put_call_ratio": 0.793126528464,
           "iv_atm_pct": 33.0200606115
          },
          "coverage": {
           "oi_coverage_ratio": 1.0
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/summary?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/summary\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/summary?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/volume": {
   "get": {
    "summary": "Options volume",
    "description": "Calls and puts traded, USD.",
    "operationId": "getOptionsVolume",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsVolumeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:43.136Z",
         "data_type": "options_volume",
         "asset": "BTC",
         "data": {
          "time": "2026-10-13T01:27:12.499Z",
          "volume_total_usd": 1118990522.27,
          "volume_call_usd": 541434110.684,
          "volume_put_usd": 577556411.589,
          "coverage": {
           "oi_coverage_ratio": 1.0
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/volume?asset=BTC\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/volume\",\n    params={\"asset\": \"BTC\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/volume?asset=BTC\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/options/volume/history": {
   "get": {
    "summary": "Options volume history",
    "description": "Per bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOptionsVolumeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/OptionsTimeframe"
      },
      "description": "Bucket size, required: `5m`, `15m`, `30m`, `1h`, `4h` or `1d` (`1m` is not served on options). Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe`.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "asset",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Asset"
      },
      "description": "Asset, e.g. `BTC` or `ETH` (no quote currency), in any case (`eth` works; the envelope gives the canonical form). Unknown: 422 `invalid_asset`.",
      "example": "BTC"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OptionsVolumeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:43.647Z",
         "data_type": "options_volume_history",
         "timeframe": "1h",
         "asset": "BTC",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "volume_total_usd": 1077541307.78,
           "volume_call_usd": 521471962.46,
           "volume_put_usd": 556069345.316,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "volume_total_usd": 974651740.899,
           "volume_call_usd": 476912046.446,
           "volume_put_usd": 497739694.453,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "volume_total_usd": 884664391.184,
           "volume_call_usd": 443937251.179,
           "volume_put_usd": 440727140.005,
           "is_closed": true
          }
         ],
         "next": "/v1/options/volume/history?asset=BTC&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Options"
    ],
    "x-family": "options",
    "x-update-frequency-seconds": 30,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/options/volume/history?asset=BTC&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/options/volume/history\",\n    params={\"asset\": \"BTC\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/options/volume/history?asset=BTC&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook": {
   "get": {
    "summary": "Order book depth by price range, per bucket",
    "description": "Liquidity resting within ±0.25 to ±10 % of the mid price (eight ranges), bids and asks, in coins and USD, summed across venues, for the latest CLOSED bucket of `timeframe` (required; `1m` = the latest closed minute). The value of a bucket is the book as it stood at the END of the bucket (a snapshot, not an average); `time` is the start of the bucket. No suffix: spot and perpetual futures books summed; `/v1/orderbook/spot` and `/v1/orderbook/futures`: one market. Every row is final (`is_closed: true`): there is no open period to return, so `live` is not accepted.",
    "operationId": "getOrderbook",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:17.943Z",
         "data_type": "orderbook",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "is_closed": true,
          "ranges": [
           {
            "range_pct": 0.25,
            "bids_quantity": 3694.03698537,
            "asks_quantity": 3353.27670252,
            "bids_usd": 300335118.567,
            "asks_usd": 273268322.229,
            "imbalance_ratio": 0.0471872977266
           },
           {
            "range_pct": 0.5,
            "bids_quantity": 4859.25049454,
            "asks_quantity": 4604.11895125,
            "bids_usd": 394818833.333,
            "asks_usd": 375455927.45,
            "imbalance_ratio": 0.0251376610908
           },
           {
            "range_pct": 0.75,
            "bids_quantity": 5944.82040347,
            "asks_quantity": 5161.307791,
            "bids_usd": 482632619.051,
            "asks_usd": 421105335.271,
            "imbalance_ratio": 0.068080889472
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook/futures": {
   "get": {
    "summary": "Order book depth by price range, per bucket, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/orderbook`, which serves every market.",
    "operationId": "getOrderbookFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:12.500Z",
         "data_type": "orderbook_futures",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "is_closed": true,
          "ranges": [
           {
            "range_pct": 0.25,
            "bids_quantity": 3165.7115,
            "asks_quantity": 2854.2641,
            "bids_usd": 257385148.975,
            "asks_usd": 232608503.256,
            "imbalance_ratio": 0.0505652381528
           },
           {
            "range_pct": 0.5,
            "bids_quantity": 4113.6574,
            "asks_quantity": 3859.0219,
            "bids_usd": 334250657.565,
            "asks_usd": 314696987.822,
            "imbalance_ratio": 0.0301313517065
           },
           {
            "range_pct": 0.75,
            "bids_quantity": 5070.6031,
            "asks_quantity": 4349.4496,
            "bids_usd": 411650877.482,
            "asks_usd": 354878636.12,
            "imbalance_ratio": 0.0740639993049
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook/futures?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook/futures\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook/futures?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook/futures/history": {
   "get": {
    "summary": "Order book depth by price range, history, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/orderbook/history`, which serves every market.",
    "operationId": "getOrderbookFuturesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookFuturesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:13.548Z",
         "data_type": "orderbook_futures_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 3165.7115,
             "asks_quantity": 2854.2641,
             "bids_usd": 257385148.975,
             "asks_usd": 232608503.256,
             "imbalance_ratio": 0.0505652381528
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 4113.6574,
             "asks_quantity": 3859.0219,
             "bids_usd": 334250657.565,
             "asks_usd": 314696987.822,
             "imbalance_ratio": 0.0301313517065
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 5070.6031,
             "asks_quantity": 4349.4496,
             "bids_usd": 411650877.482,
             "asks_usd": 354878636.12,
             "imbalance_ratio": 0.0740639993049
            }
           ]
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 2668.8328,
             "asks_quantity": 3012.0425,
             "bids_usd": 218093355.418,
             "asks_usd": 246706872.85,
             "imbalance_ratio": -0.0615608936752
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 3656.1414,
             "asks_quantity": 3803.0902,
             "bids_usd": 298565530.947,
             "asks_usd": 311653661.774,
             "imbalance_ratio": -0.0214482451275
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 4490.6983,
             "asks_quantity": 4213.406,
             "bids_usd": 366418069.894,
             "asks_usd": 345437978.779,
             "imbalance_ratio": 0.0294723787968
            }
           ]
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 2958.369,
             "asks_quantity": 2492.441,
             "bids_usd": 242662767.523,
             "asks_usd": 204948711.05,
             "imbalance_ratio": 0.08425623175
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 4527.5407,
             "asks_quantity": 3365.0997,
             "bids_usd": 371093171.829,
             "asks_usd": 276877207.755,
             "imbalance_ratio": 0.145401652671
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 5220.1376,
             "asks_quantity": 3673.1999,
             "bids_usd": 427630862.712,
             "asks_usd": 302342976.559,
             "imbalance_ratio": 0.171633392065
            }
           ]
          }
         ],
         "next": "/v1/orderbook/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook/futures/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook/history": {
   "get": {
    "summary": "Order book depth by price range, history",
    "description": "Same as `/v1/orderbook`, one row per closed bucket; `timeframe` is required. `since_ms` / `until_ms` apply to the start of the bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getOrderbookHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:18.463Z",
         "data_type": "orderbook_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 3694.03698537,
             "asks_quantity": 3353.27670252,
             "bids_usd": 300335118.567,
             "asks_usd": 273268322.229,
             "imbalance_ratio": 0.0471872977266
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 4859.25049454,
             "asks_quantity": 4604.11895125,
             "bids_usd": 394818833.333,
             "asks_usd": 375455927.45,
             "imbalance_ratio": 0.0251376610908
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 5944.82040347,
             "asks_quantity": 5161.307791,
             "bids_usd": 482632619.051,
             "asks_usd": 421105335.271,
             "imbalance_ratio": 0.068080889472
            }
           ]
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 3242.92262194,
             "asks_quantity": 3552.68391543,
             "bids_usd": 264998482.404,
             "asks_usd": 290987828.128,
             "imbalance_ratio": -0.046744578477
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 4968.47970065,
             "asks_quantity": 4546.93641597,
             "bids_usd": 405616113.789,
             "asks_usd": 372613929.311,
             "imbalance_ratio": 0.0424067212144
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 6069.64451919,
             "asks_quantity": 5008.43900957,
             "bids_usd": 495144452.251,
             "asks_usd": 410610457.044,
             "imbalance_ratio": 0.093329878027
            }
           ]
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 3594.55239992,
             "asks_quantity": 2959.55699605,
             "bids_usd": 294839823.004,
             "asks_usd": 243371137.762,
             "imbalance_ratio": 0.0956292030329
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 5729.96822522,
             "asks_quantity": 3998.38464846,
             "bids_usd": 469621070.415,
             "asks_usd": 328995632.624,
             "imbalance_ratio": 0.176086271745
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 6479.18471797,
             "asks_quantity": 4376.31686321,
             "bids_usd": 530779373.416,
             "asks_usd": 360225952.576,
             "imbalance_ratio": 0.191416836539
            }
           ]
          }
         ],
         "next": "/v1/orderbook/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook/spot": {
   "get": {
    "summary": "Order book depth by price range, per bucket, spot only",
    "description": "Spot market only. Same as `/v1/orderbook`, which serves every market.",
    "operationId": "getOrderbookSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:11.986Z",
         "data_type": "orderbook_spot",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "is_closed": true,
          "ranges": [
           {
            "range_pct": 0.25,
            "bids_quantity": 528.32548537,
            "asks_quantity": 499.01260252,
            "bids_usd": 42949969.5922,
            "asks_usd": 40659818.9727,
            "imbalance_ratio": 0.0273909390124
           },
           {
            "range_pct": 0.5,
            "bids_quantity": 745.59309454,
            "asks_quantity": 745.09705125,
            "bids_usd": 60568175.7689,
            "asks_usd": 60758939.6278,
            "imbalance_ratio": -0.00157231018202
           },
           {
            "range_pct": 0.75,
            "bids_quantity": 874.21730347,
            "asks_quantity": 811.858191,
            "bids_usd": 70981741.5685,
            "asks_usd": 66226699.1513,
            "imbalance_ratio": 0.0346556115081
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook/spot?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook/spot\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook/spot?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/orderbook/spot/history": {
   "get": {
    "summary": "Order book depth by price range, history, spot only",
    "description": "Spot market only. Same as `/v1/orderbook/history`, which serves every market.",
    "operationId": "getOrderbookSpotHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/OrderbookSpotHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:13.015Z",
         "data_type": "orderbook_spot_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 528.32548537,
             "asks_quantity": 499.01260252,
             "bids_usd": 42949969.5922,
             "asks_usd": 40659818.9727,
             "imbalance_ratio": 0.0273909390124
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 745.59309454,
             "asks_quantity": 745.09705125,
             "bids_usd": 60568175.7689,
             "asks_usd": 60758939.6278,
             "imbalance_ratio": -0.00157231018202
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 874.21730347,
             "asks_quantity": 811.858191,
             "bids_usd": 70981741.5685,
             "asks_usd": 66226699.1513,
             "imbalance_ratio": 0.0346556115081
            }
           ]
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 574.08982194,
             "asks_quantity": 540.64141543,
             "bids_usd": 46905126.9858,
             "asks_usd": 44280955.2779,
             "imbalance_ratio": 0.0287782043345
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 1312.33830065,
             "asks_quantity": 743.84621597,
             "bids_usd": 107050582.842,
             "asks_usd": 60960267.537,
             "imbalance_ratio": 0.274329397187
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 1578.94621919,
             "asks_quantity": 795.03300957,
             "bids_usd": 128726382.357,
             "asks_usd": 65172478.2657,
             "imbalance_ratio": 0.327768321523
            }
           ]
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "is_closed": true,
           "ranges": [
            {
             "range_pct": 0.25,
             "bids_quantity": 636.18339992,
             "asks_quantity": 467.11599605,
             "bids_usd": 52177055.4805,
             "asks_usd": 38422426.7116,
             "imbalance_ratio": 0.151817962268
            },
            {
             "range_pct": 0.5,
             "bids_quantity": 1202.42752522,
             "asks_quantity": 633.28494846,
             "bids_usd": 98527898.586,
             "asks_usd": 52118424.8685,
             "imbalance_ratio": 0.308069076319
            },
            {
             "range_pct": 0.75,
             "bids_quantity": 1259.04711797,
             "asks_quantity": 703.11696321,
             "bids_usd": 103148510.704,
             "asks_usd": 57882976.0164,
             "imbalance_ratio": 0.281097415229
            }
           ]
          }
         ],
         "next": "/v1/orderbook/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/orderbook/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/orderbook/spot/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/orderbook/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/price-change": {
   "get": {
    "summary": "Price change over 1m to 1w",
    "description": "Rolling price change in percent over eight windows, from the latest price. Spot-based for stablecoins.",
    "operationId": "getPriceChange",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PriceChangeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:11.609Z",
         "data_type": "price_change",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:26:00.000Z",
          "price": 82034.26,
          "changes_pct": {
           "1m": -0.0238136442188,
           "5m": -0.0594276235383,
           "15m": 0.25868158675,
           "30m": 0.848841792206,
           "1h": 0.702153279058,
           "4h": -1.09510713256,
           "1d": -2.19112457077,
           "1w": -4.53807520445
          }
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "price_volume",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/price-change?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/price-change\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/price-change?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/snapshot": {
   "get": {
    "summary": "Many fields for one symbol in one request",
    "description": "48 fields for one symbol in a single call (40 plain, 8 multi-timeframe): prices, flow, derivatives, liquidations, macro, on-chain, options. Each query key is a field and its value a depth: `funding_rate=1` (or `=true`). Multi-timeframe fields take `@tf`: `klines@1h=24`, `cvd@1h=24`; `klines` also takes `1w`. Every field has the name of its route and, at depth 1, its response: the object of a latest-value route (`basis`, `cvd@1h`, `orderbook@1m`…). A depth above 1 is accepted only where `max_depth` gives a ceiling: a multi-timeframe field returns the latest N rows of its `/history` at that timeframe; the series `trades_spot`, `trades_futures`, `trades_kline_futures_seconds` and `liquidations_events` their latest N rows; `basis`, `oi_delta` and `liquidations_cumulative` their latest N one-minute values, each shaped like the latest value. Any other field serves its latest value alone: 422 `depth_too_large` above 1, naming its `/history` route when it has one. A market field serves all markets (the route without `/spot` or `/futures`). Call it with only `symbol` to get `available_fields` (fields without a timeframe), `available_multi_tf_fields`, `timeframes`, `timeframes_by_field` 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: `symbol`, `data` (an object keyed by field name) and `partial` (true if a field failed).",
    "operationId": "getSnapshot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list. Alone, it returns the catalogue of the fields your plan includes.",
      "schema": {
       "type": "string"
      },
      "example": "BTCUSDT"
     },
     {
      "name": "basis",
      "in": "query",
      "required": false,
      "description": "Futures-spot basis (N latest minutes). Same content as `/v1/basis`. Value: depth N (at most 60), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 60
      }
     },
     {
      "name": "btc_fees",
      "in": "query",
      "required": false,
      "description": "Recommended Bitcoin fees. Same content as `/v1/btc/fees`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "btc_mempool",
      "in": "query",
      "required": false,
      "description": "Bitcoin mempool. Same content as `/v1/btc/mempool`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "btc_mining",
      "in": "query",
      "required": false,
      "description": "Mining pool concentration. Same content as `/v1/btc/mining`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "btc_network",
      "in": "query",
      "required": false,
      "description": "Bitcoin network state. Same content as `/v1/btc/network`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "buysell_ratio",
      "in": "query",
      "required": false,
      "description": "Buy/sell volume ratio. Same content as `/v1/buysell/ratio`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_defi",
      "in": "query",
      "required": false,
      "description": "Ethereum DeFi. Same content as `/v1/eth/defi`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_deflation",
      "in": "query",
      "required": false,
      "description": "ETH deflation. Same content as `/v1/eth/deflation`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_gas",
      "in": "query",
      "required": false,
      "description": "Ethereum gas. Same content as `/v1/eth/gas`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_gas_momentum",
      "in": "query",
      "required": false,
      "description": "Gas momentum. Same content as `/v1/eth/gas-momentum`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_ratio",
      "in": "query",
      "required": false,
      "description": "ETH/BTC ratio. Same content as `/v1/eth/ratio`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_squeeze",
      "in": "query",
      "required": false,
      "description": "ETH supply squeeze index. Same content as `/v1/eth/squeeze`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_staking",
      "in": "query",
      "required": false,
      "description": "ETH staking. Same content as `/v1/eth/staking`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "eth_supply",
      "in": "query",
      "required": false,
      "description": "ETH supply and burn. Same content as `/v1/eth/supply`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "fear_greed",
      "in": "query",
      "required": false,
      "description": "Crypto Fear & Greed Index. Same content as `/v1/fear-greed`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "funding_cumulative",
      "in": "query",
      "required": false,
      "description": "Funding summed over 24 h. Same content as `/v1/funding/cumulative`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "funding_next",
      "in": "query",
      "required": false,
      "description": "Next funding forecast. Same content as `/v1/funding/next`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "funding_rate",
      "in": "query",
      "required": false,
      "description": "Latest settled funding window. Same content as `/v1/funding/rate`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "global",
      "in": "query",
      "required": false,
      "description": "Total crypto market cap and dominance. Same content as `/v1/global`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "heatmap_clusters",
      "in": "query",
      "required": false,
      "description": "Liquidation heatmap clusters. Same content as `/v1/heatmap/clusters`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "liquidations_cumulative",
      "in": "query",
      "required": false,
      "description": "Liquidations long/short USD (N latest minutes). Same content as `/v1/liquidations/cumulative`. Value: depth N (at most 1440), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "liquidations_events",
      "in": "query",
      "required": false,
      "description": "Individual liquidations (N latest events, at most your plan's count). Same content as `/v1/liquidations/events`. Value: depth N (at most 10000), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10000
      }
     },
     {
      "name": "liquidations_ratio",
      "in": "query",
      "required": false,
      "description": "Big vs small liquidations. Same content as `/v1/liquidations/ratio`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "macro",
      "in": "query",
      "required": false,
      "description": "Latest value of every FRED series. Same content as `/v1/macro/series`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "macro_correlations",
      "in": "query",
      "required": false,
      "description": "BTC correlation with DXY, S&P 500, gold, VIX. Same content as `/v1/macro/correlations`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "macro_momentum",
      "in": "query",
      "required": false,
      "description": "Macro momentum score. Same content as `/v1/macro/momentum`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "macro_net_liquidity",
      "in": "query",
      "required": false,
      "description": "US net liquidity. Same content as `/v1/macro/net-liquidity`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "macro_risk",
      "in": "query",
      "required": false,
      "description": "Risk-on / risk-off score. Same content as `/v1/macro/risk`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "oi_delta",
      "in": "query",
      "required": false,
      "description": "Open interest change (N latest minutes). Same content as `/v1/oi/delta`. Value: depth N (at most 60), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 60
      }
     },
     {
      "name": "onchain_active_addresses",
      "in": "query",
      "required": false,
      "description": "Bitcoin active addresses. Same content as `/v1/onchain/active-addresses`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "onchain_miner_stress",
      "in": "query",
      "required": false,
      "description": "Bitcoin miner stress. Same content as `/v1/onchain/miner-stress`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "onchain_mvrv",
      "in": "query",
      "required": false,
      "description": "Bitcoin MVRV. Same content as `/v1/onchain/mvrv`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "onchain_nvt",
      "in": "query",
      "required": false,
      "description": "Bitcoin NVT. Same content as `/v1/onchain/nvt`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "options_summary",
      "in": "query",
      "required": false,
      "description": "Options market summary for the symbol's asset. Same content as `/v1/options/summary`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "price_change",
      "in": "query",
      "required": false,
      "description": "Price change over 1m to 1w, in percent. Same content as `/v1/price-change`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "tokenomics",
      "in": "query",
      "required": false,
      "description": "Supply, market cap, FDV. Same content as `/v1/tokenomics`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "trades_avg_size",
      "in": "query",
      "required": false,
      "description": "Average trade size. Same content as `/v1/trades/avg-size`. Value: `true` (or 1): the latest value only.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1
      }
     },
     {
      "name": "trades_futures",
      "in": "query",
      "required": false,
      "description": "Individual futures trades (N trades), bounded by your plan's tick window. Same content as `/v1/trades/futures`. Value: depth N (at most 10000), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10000
      }
     },
     {
      "name": "trades_kline_futures_seconds",
      "in": "query",
      "required": false,
      "description": "Futures trades aggregated per second (N seconds). Same content as `/v1/trades-kline/futures/seconds`. Value: depth N (at most 1000), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "trades_spot",
      "in": "query",
      "required": false,
      "description": "Individual spot trades (N trades), bounded by your plan's tick window. Same content as `/v1/trades/spot`. Value: depth N (at most 10000), or `true` for 1.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10000
      }
     },
     {
      "name": "cvd@1m",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1m. Same content as `/v1/cvd?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@5m",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 5m. Same content as `/v1/cvd?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@15m",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 15m. Same content as `/v1/cvd?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@30m",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 30m. Same content as `/v1/cvd?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@1h",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1h. Same content as `/v1/cvd?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@4h",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 4h. Same content as `/v1/cvd?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "cvd@1d",
      "in": "query",
      "required": false,
      "description": "CVD per bucket (N latest closed buckets). Timeframe 1d. Same content as `/v1/cvd?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 200
      }
     },
     {
      "name": "klines@1m",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 1m. Same content as `/v1/klines?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@5m",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 5m. Same content as `/v1/klines?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@15m",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 15m. Same content as `/v1/klines?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@30m",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 30m. Same content as `/v1/klines?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@1h",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 1h. Same content as `/v1/klines?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@4h",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 4h. Same content as `/v1/klines?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@1d",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 1d. Same content as `/v1/klines?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "klines@1w",
      "in": "query",
      "required": false,
      "description": "OHLCV candles (N latest closed candles). Timeframe 1w. Same content as `/v1/klines?timeframe=1w`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@1m",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1m. Same content as `/v1/oi/history?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@5m",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 5m. Same content as `/v1/oi/history?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@15m",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 15m. Same content as `/v1/oi/history?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@30m",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 30m. Same content as `/v1/oi/history?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@1h",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1h. Same content as `/v1/oi/history?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@4h",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 4h. Same content as `/v1/oi/history?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "oi_history@1d",
      "in": "query",
      "required": false,
      "description": "Total open interest per closed bucket (N buckets). Timeframe 1d. Same content as `/v1/oi/history?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@1m",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1m. Same content as `/v1/orderbook?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@5m",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 5m. Same content as `/v1/orderbook?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@15m",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 15m. Same content as `/v1/orderbook?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@30m",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 30m. Same content as `/v1/orderbook?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@1h",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1h. Same content as `/v1/orderbook?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@4h",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 4h. Same content as `/v1/orderbook?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "orderbook@1d",
      "in": "query",
      "required": false,
      "description": "Order book depth by price range per closed bucket (book at the end of the bucket), spot + futures (`orderbook@1m=1` = the latest closed minute). Timeframe 1d. Same content as `/v1/orderbook?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1000
      }
     },
     {
      "name": "spread_interexchange@1m",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 1m. Same content as `/v1/spread/interexchange?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@5m",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 5m. Same content as `/v1/spread/interexchange?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@15m",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 15m. Same content as `/v1/spread/interexchange?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@30m",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 30m. Same content as `/v1/spread/interexchange?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@1h",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 1h. Same content as `/v1/spread/interexchange?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@4h",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 4h. Same content as `/v1/spread/interexchange?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "spread_interexchange@1d",
      "in": "query",
      "required": false,
      "description": "Inter-venue spread per bucket. Timeframe 1d. Same content as `/v1/spread/interexchange?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50
      }
     },
     {
      "name": "trades_kline@1m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1m. Same content as `/v1/trades-kline?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@5m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 5m. Same content as `/v1/trades-kline?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@15m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 15m. Same content as `/v1/trades-kline?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@30m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 30m. Same content as `/v1/trades-kline?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@1h",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1h. Same content as `/v1/trades-kline?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@4h",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 4h. Same content as `/v1/trades-kline?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline@1d",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot + futures (N latest closed buckets). Timeframe 1d. Same content as `/v1/trades-kline?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@1m",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 1m. Same content as `/v1/trades-kline/futures?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@5m",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 5m. Same content as `/v1/trades-kline/futures?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@15m",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 15m. Same content as `/v1/trades-kline/futures?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@30m",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 30m. Same content as `/v1/trades-kline/futures?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@1h",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 1h. Same content as `/v1/trades-kline/futures?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@4h",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 4h. Same content as `/v1/trades-kline/futures?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_futures@1d",
      "in": "query",
      "required": false,
      "description": "Trade candles, futures only. Timeframe 1d. Same content as `/v1/trades-kline/futures?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@1m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 1m. Same content as `/v1/trades-kline/spot?timeframe=1m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@5m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 5m. Same content as `/v1/trades-kline/spot?timeframe=5m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@15m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 15m. Same content as `/v1/trades-kline/spot?timeframe=15m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@30m",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 30m. Same content as `/v1/trades-kline/spot?timeframe=30m`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@1h",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 1h. Same content as `/v1/trades-kline/spot?timeframe=1h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@4h",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 4h. Same content as `/v1/trades-kline/spot?timeframe=4h`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     },
     {
      "name": "trades_kline_spot@1d",
      "in": "query",
      "required": false,
      "description": "Trade candles, spot only. Timeframe 1d. Same content as `/v1/trades-kline/spot?timeframe=1d`.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 1440
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SnapshotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:07.403Z",
         "data_type": "snapshot",
         "symbol": "BTCUSDT",
         "partial": false,
         "data": {
          "funding_rate": {
           "time": "2026-10-12T16:00:00.000Z",
           "period_end": "2026-10-13T00:00:00.000Z",
           "settled_at": "2026-10-13T00:00:00.005Z",
           "rate_pct": 0.0038949161538,
           "apr_pct": 4.26493318841,
           "is_closed": true
          },
          "basis": {
           "time": "2026-10-13T01:26:14.104Z",
           "basis_value": -42.9491105165,
           "basis_pct": -0.052342982585,
           "futures_price": 82009.1505455,
           "spot_price": 82052.099656
          },
          "fear_greed": {
           "time": "2026-10-13T00:00:00.000Z",
           "value": 57,
           "label": "greed"
          },
          "cvd@1h": [
           {
            "time": "2026-10-13T00:00:00.000Z",
            "cvd_series": [
             61.24880816,
             125.01611121,
             244.64884666
            ],
            "net_volume": -5959.53598257,
            "buy_volume": 24078.1340729,
            "sell_volume": 30037.6700555,
            "sample_count": 60,
            "is_volume_estimated": false,
            "is_closed": true
           },
           {
            "time": "2026-10-12T23:00:00.000Z",
            "cvd_series": [
             315.17269994,
             261.99727367,
             -780.87188717
            ],
            "net_volume": -3437.4999373,
            "buy_volume": 18938.2378418,
            "sell_volume": 22375.7377791,
            "sample_count": 60,
            "is_volume_estimated": false,
            "is_closed": true
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Snapshot"
    ],
    "x-family": "snapshot",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/snapshot?symbol=BTCUSDT&funding_rate=1&basis=1&fear_greed=1&cvd@1h=2\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/snapshot\",\n    params={\"symbol\": \"BTCUSDT\", \"funding_rate\": \"1\", \"basis\": \"1\", \"fear_greed\": \"1\", \"cvd@1h\": \"2\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/snapshot?symbol=BTCUSDT&funding_rate=1&basis=1&fear_greed=1&cvd@1h=2\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/spread/interexchange": {
   "get": {
    "summary": "Inter-venue price spread",
    "description": "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.",
    "operationId": "getSpreadInterexchange",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SpreadInterexchangeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:18.999Z",
         "data_type": "spread_interexchange",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "is_closed": true,
          "ref_price": 81389.1706739,
          "weighting": "volume",
          "max_spread_bps": 11.8695266089,
          "high": {
           "venue": "venue_a",
           "price": 81402.5405555
          },
          "low": {
           "venue": "venue_b",
           "price": 81305.9354628
          },
          "venues": [
           {
            "venue": "venue_a",
            "price": 81402.5405555,
            "premium_bps": 1.64271013598
           },
           {
            "venue": "venue_c",
            "price": 81393.8406898,
            "premium_bps": 0.573788354085
           },
           {
            "venue": "venue_d",
            "price": 81393.3778307,
            "premium_bps": 0.51691849041
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/spread/interexchange?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/spread/interexchange\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/spread/interexchange?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/spread/interexchange/history": {
   "get": {
    "summary": "Inter-venue spread history",
    "description": "Same as `/v1/spread/interexchange`, one row per closed bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getSpreadInterexchangeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SpreadInterexchangeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:19.520Z",
         "data_type": "spread_interexchange_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "is_closed": true,
           "ref_price": 81389.1706739,
           "weighting": "volume",
           "max_spread_bps": 11.8695266089,
           "high": {
            "venue": "venue_a",
            "price": 81402.5405555
           },
           "low": {
            "venue": "venue_b",
            "price": 81305.9354628
           },
           "venues": [
            {
             "venue": "venue_a",
             "price": 81402.5405555,
             "premium_bps": 1.64271013598
            },
            {
             "venue": "venue_c",
             "price": 81393.8406898,
             "premium_bps": 0.573788354085
            },
            {
             "venue": "venue_d",
             "price": 81393.3778307,
             "premium_bps": 0.51691849041
            }
           ]
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "is_closed": true,
           "ref_price": 81940.902371,
           "weighting": "volume",
           "max_spread_bps": 21.3853422154,
           "high": {
            "venue": "venue_d",
            "price": 81969.1934708
           },
           "low": {
            "venue": "venue_e",
            "price": 81793.960047
           },
           "venues": [
            {
             "venue": "venue_d",
             "price": 81969.1934708,
             "premium_bps": 3.45262244014
            },
            {
             "venue": "venue_a",
             "price": 81943.3620172,
             "premium_bps": 0.300173181927
            },
            {
             "venue": "venue_c",
             "price": 81940.7582161,
             "premium_bps": -0.0175925431025
            }
           ]
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "is_closed": true,
           "ref_price": 82409.0594008,
           "weighting": "volume",
           "max_spread_bps": 14.9969596868,
           "high": {
            "venue": "venue_d",
            "price": 82467.569128
           },
           "low": {
            "venue": "venue_e",
            "price": 82343.9805938
           },
           "venues": [
            {
             "venue": "venue_d",
             "price": 82467.569128,
             "premium_bps": 7.09991445185
            },
            {
             "venue": "venue_b",
             "price": 82462.7718717,
             "premium_bps": 6.51778715821
            },
            {
             "venue": "venue_f",
             "price": 82462.1191783,
             "premium_bps": 6.43858550159
            }
           ]
          }
         ],
         "next": "/v1/spread/interexchange/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/spread/interexchange/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/spread/interexchange/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/spread/interexchange/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/status": {
   "get": {
    "summary": "Freshness of every feed",
    "operationId": "getStatus",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StatusResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:04.962Z",
         "data_type": "status",
         "data": {
          "computed_at": "2026-10-13T01:27:04.714Z",
          "feed_count": 55,
          "stale_feed_count": 0,
          "error_feed_count": 0,
          "max_age_s": 91624.9,
          "feeds": [
           {
            "feed": "klines_futures_1m",
            "family": "price_volume",
            "age_s": 124.8,
            "expected_interval_s": 120,
            "threshold_s": 180,
            "is_stale": false,
            "stale_venue_count": 0
           },
           {
            "feed": "klines_1m",
            "family": "price_volume",
            "age_s": 64.8,
            "expected_interval_s": 180,
            "threshold_s": 270,
            "is_stale": false,
            "stale_venue_count": 0
           },
           {
            "feed": "klines_multi",
            "family": "price_volume",
            "age_s": 424.8,
            "expected_interval_s": 660,
            "threshold_s": 990,
            "is_stale": false,
            "stale_venue_count": null
           }
          ]
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "System"
    ],
    "description": "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'. Counted as one request of the price & volume family.",
    "x-family": "price_volume",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/status\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/status\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/status\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/symbols": {
   "get": {
    "summary": "List the served trading pairs",
    "operationId": "getSymbols",
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SymbolsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:06.007Z",
         "data_type": "symbols",
         "data": [
          {
           "symbol": "ADAUSDT",
           "base_asset": "ADA",
           "name": "Cardano",
           "quote_asset": "USDT",
           "markets": [
            "spot",
            "futures"
           ]
          },
          {
           "symbol": "AVAXUSDT",
           "base_asset": "AVAX",
           "name": "Avalanche",
           "quote_asset": "USDT",
           "markets": [
            "spot",
            "futures"
           ]
          },
          {
           "symbol": "BNBUSDT",
           "base_asset": "BNB",
           "name": "BNB",
           "quote_asset": "USDT",
           "markets": [
            "spot",
            "futures"
           ]
          }
         ]
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "System"
    ],
    "description": "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).",
    "parameters": [
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "x-family": "price_volume",
    "x-update-frequency-seconds": 60,
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/symbols\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/symbols\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/symbols\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/symbols/{symbol}/capabilities": {
   "get": {
    "summary": "What a symbol supports",
    "description": "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).",
    "operationId": "getSymbolsCapabilities",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SymbolsCapabilitiesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:06.600Z",
         "data_type": "symbols_capabilities",
         "symbol": "BTCUSDT",
         "data": {
          "asset_class": "crypto",
          "feeds_active_last_24h": {
           "klines_futures_1m": true,
           "trades_spot": true,
           "trades_futures": true,
           "oi_history": true,
           "funding_rate": true,
           "liquidations_events": true,
           "trades_kline_futures_seconds": true,
           "klines_futures_multi": true,
           "klines_1m": true,
           "klines_multi": true
          },
          "computed_metrics_available": [
           "basis",
           "buysell_ratio",
           "funding_cumulative"
          ],
          "computed_metrics_blocked": {}
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "System"
    ],
    "x-family": "price_volume",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/symbols/BTCUSDT/capabilities\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/symbols/BTCUSDT/capabilities\",\n    params={},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/symbols/BTCUSDT/capabilities\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/tokenomics": {
   "get": {
    "summary": "Supply, market cap and FDV",
    "description": "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).",
    "operationId": "getTokenomics",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TokenomicsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:30.309Z",
         "data_type": "tokenomics",
         "symbol": "BTCUSDT",
         "data": {
          "time": "2026-10-13T01:24:53.787Z",
          "circulating_supply": 20097368.0,
          "total_supply": 20097368.0,
          "max_supply": 21000000.0,
          "price_usd": 82034.26,
          "priced_at": "2026-10-13T01:26:00.000Z",
          "market_cap_usd": 1648672711828.0,
          "fdv_usd": 1722719460000.0
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Tokenomics & sentiment"
    ],
    "x-family": "tokenomics",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/tokenomics?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/tokenomics\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/tokenomics?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/tokenomics/history": {
   "get": {
    "summary": "Supply and market cap history",
    "description": "One row per day. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTokenomicsHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TokenomicsHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:30.824Z",
         "data_type": "tokenomics_history",
         "symbol": "BTCUSDT",
         "timeframe": "1d",
         "data": [
          {
           "time": "2026-10-12T00:00:00.000Z",
           "price_usd": 81850.0,
           "circulating_supply": 20097328.0,
           "total_supply": 20097328.0,
           "max_supply": 21000000.0,
           "market_cap_usd": 1644966296800.0,
           "fdv_usd": 1718850000000.0,
           "is_closed": true
          },
          {
           "time": "2026-10-11T00:00:00.000Z",
           "price_usd": 83773.12,
           "circulating_supply": 20096834.0,
           "total_supply": 20096834.0,
           "max_supply": 21000000.0,
           "market_cap_usd": 1683574486302.0,
           "fdv_usd": 1759235520000.0,
           "is_closed": true
          },
          {
           "time": "2026-10-10T00:00:00.000Z",
           "price_usd": 82988.36,
           "circulating_supply": 20096353.0,
           "total_supply": 20096353.0,
           "max_supply": 21000000.0,
           "market_cap_usd": 1667763377451.0,
           "fdv_usd": 1742755560000.0,
           "is_closed": true
          }
         ],
         "next": "/v1/tokenomics/history?symbol=BTCUSDT&limit=3&before_ms=1791590400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Tokenomics & sentiment"
    ],
    "x-family": "tokenomics",
    "x-update-frequency-seconds": 60,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/tokenomics/history?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/tokenomics/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/tokenomics/history?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline": {
   "get": {
    "summary": "Trade candle, spot + futures combined",
    "description": "The trades of the latest closed bucket aggregated into a candle (\"trades kline\"): trade count, volume, buy/sell volume, net volume, average size and rate, all venues, spot and futures. Volumes are in BASE ASSET units (BTC for BTCUSDT). The individual trades are `/v1/trades/spot` and `/v1/trades/futures`. Bucketed: `is_closed` says whether the value is final. Add `?live=1` for the open period.",
    "operationId": "getTradesKline",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:12.129Z",
         "data_type": "trades_kline",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "trade_count": 1594582,
          "avg_trade_size": 0.0338418657231,
          "volume": 53963.6299284,
          "buy_volume": 24013.7702729,
          "sell_volume": 29949.8596555,
          "net_volume": -5936.08938257,
          "trade_rate": 442.939444444,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/futures": {
   "get": {
    "summary": "Trade candle, futures only",
    "description": "Same as `/v1/trades-kline`, 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.",
    "operationId": "getTradesKlineFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:14.239Z",
         "data_type": "trades_kline_futures",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "trade_count": 979478,
          "avg_trade_size": 0.0499209989811,
          "volume": 48896.52024,
          "buy_volume": 21585.46076,
          "sell_volume": 27311.05948,
          "net_volume": -5725.59872,
          "trade_rate": 272.077222222,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/futures?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/futures\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/futures?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/futures/history": {
   "get": {
    "summary": "Trade candles history, futures only",
    "description": "Same as `/v1/trades-kline/futures`, one row per closed bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTradesKlineFuturesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineFuturesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:14.763Z",
         "data_type": "trades_kline_futures_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "trade_count": 979478,
           "avg_trade_size": 0.0499209989811,
           "volume": 48896.52024,
           "buy_volume": 21585.46076,
           "sell_volume": 27311.05948,
           "net_volume": -5725.59872,
           "trade_rate": 272.077222222,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "trade_count": 682299,
           "avg_trade_size": 0.0547546040372,
           "volume": 37359.01158,
           "buy_volume": 17026.51372,
           "sell_volume": 20332.49786,
           "net_volume": -3305.98414,
           "trade_rate": 189.5275,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "trade_count": 375610,
           "avg_trade_size": 0.0508960587311,
           "volume": 19117.06862,
           "buy_volume": 7290.51748,
           "sell_volume": 11826.55114,
           "net_volume": -4536.03366,
           "trade_rate": 104.336111111,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/trades-kline/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/futures/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/futures/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/futures/seconds": {
   "get": {
    "summary": "Trades aggregated per second",
    "description": "Every PERPETUAL FUTURES trade of every venue summed per second: volume, trade count, taker buy and sell, and `is_closed` (a second is final 21 s after it ends: a venue can still deliver a late trade before). Kept 72 hours. Without range parameters: the last `limit` seconds, and a full page carries `next` (the older seconds). With `since_ms`, `until_ms` or `order`: a page of `limit` seconds of the range, and `next` is the URL of the following page (`null` at the end of the range). Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTradesKlineFuturesSeconds",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of seconds to return (one row per second with trades). In range reading, a page covers `limit` seconds of time.",
      "example": 3
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order"
      },
      "description": "Range reading: `desc` (most recent first, the default) or `asc`. Giving `order`, `since_ms` or `until_ms` switches the route to range reading. Either way, a full page carries `next` (the following page, older trades without range parameters) and the last page `next: null`."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineFuturesSecondsResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:08.419Z",
         "data_type": "trades_kline_futures_seconds",
         "symbol": "BTCUSDT",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T01:27:07.000Z",
           "volume": 22.27954,
           "trade_count": 293,
           "buy_volume": 0.07527,
           "sell_volume": 22.20427,
           "is_closed": false
          },
          {
           "time": "2026-10-13T01:27:06.000Z",
           "volume": 0.31482,
           "trade_count": 26,
           "buy_volume": 0.02035,
           "sell_volume": 0.29447,
           "is_closed": false
          },
          {
           "time": "2026-10-13T01:27:05.000Z",
           "volume": 1.67347,
           "trade_count": 38,
           "buy_volume": 0.71207,
           "sell_volume": 0.9614,
           "is_closed": false
          }
         ],
         "next": "/v1/trades-kline/futures/seconds?symbol=BTCUSDT&limit=3&until_ms=1791854824999&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "x-family": "ticks",
    "x-update-frequency-seconds": 2,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/futures/seconds?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/futures/seconds\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/futures/seconds?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/history": {
   "get": {
    "summary": "Trade candles history, combined",
    "description": "Same as `/v1/trades-kline`, one row per closed bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTradesKlineHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:12.669Z",
         "data_type": "trades_kline_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "trade_count": 1594582,
           "avg_trade_size": 0.0338418657231,
           "volume": 53963.6299284,
           "buy_volume": 24013.7702729,
           "sell_volume": 29949.8596555,
           "net_volume": -5936.08938257,
           "trade_rate": 442.939444444,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "trade_count": 1124600,
           "avg_trade_size": 0.0367362252988,
           "volume": 41313.558971,
           "buy_volume": 18937.9463919,
           "sell_volume": 22375.6125791,
           "net_volume": -3437.6661873,
           "trade_rate": 312.388888889,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "trade_count": 639364,
           "avg_trade_size": 0.033365891181,
           "volume": 21332.949649,
           "buy_volume": 8264.20063527,
           "sell_volume": 13068.7490138,
           "net_volume": -4804.5483785,
           "trade_rate": 177.601111111,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/trades-kline/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/spot": {
   "get": {
    "summary": "Trade candle, spot only",
    "description": "Same as `/v1/trades-kline`, spot venues only. Bucketed: `is_closed` says whether the value is final. Add `?live=1` for the open period.",
    "operationId": "getTradesKlineSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "live",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "`1` or `true` to return the CURRENT, still-open period computed on the fly (`is_closed: false`). Default: the last closed period only."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:13.179Z",
         "data_type": "trades_kline_spot",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": {
          "time": "2026-10-13T00:00:00.000Z",
          "trade_count": 615104,
          "avg_trade_size": 0.00823780968488,
          "volume": 5067.10968841,
          "buy_volume": 2428.30951292,
          "sell_volume": 2638.80017549,
          "net_volume": -210.49066257,
          "trade_rate": 170.862222222,
          "is_volume_estimated": false,
          "is_closed": true
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/spot?symbol=BTCUSDT&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/spot\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/spot?symbol=BTCUSDT&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades-kline/spot/history": {
   "get": {
    "summary": "Trade candles history, spot only",
    "description": "Same as `/v1/trades-kline/spot`, one row per closed bucket. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTradesKlineSpotHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Bucket size, required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. Missing: 422 `missing_parameter`; other values: 422 `invalid_timeframe` with the accepted list. In any case (`1H` is `1h`), except `1M`: refused, since elsewhere it means a month and here `1m` is one minute.",
      "example": "1h"
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesKlineSpotHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:13.723Z",
         "data_type": "trades_kline_spot_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "trade_count": 615104,
           "avg_trade_size": 0.00823780968488,
           "volume": 5067.10968841,
           "buy_volume": 2428.30951292,
           "sell_volume": 2638.80017549,
           "net_volume": -210.49066257,
           "trade_rate": 170.862222222,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "trade_count": 442301,
           "avg_trade_size": 0.00894085111949,
           "volume": 3954.547391,
           "buy_volume": 1911.43267185,
           "sell_volume": 2043.11471915,
           "net_volume": -131.6820473,
           "trade_rate": 122.861388889,
           "is_volume_estimated": false,
           "is_closed": true
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "trade_count": 263754,
           "avg_trade_size": 0.00840131724652,
           "volume": 2215.88102904,
           "buy_volume": 973.68315527,
           "sell_volume": 1242.19787377,
           "net_volume": -268.514718499,
           "trade_rate": 73.265,
           "is_volume_estimated": false,
           "is_closed": true
          }
         ],
         "next": "/v1/trades-kline/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades-kline/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades-kline/spot/history\",\n    params={\"symbol\": \"BTCUSDT\", \"timeframe\": \"1h\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades-kline/spot/history?symbol=BTCUSDT&timeframe=1h&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size": {
   "get": {
    "summary": "Average trade size",
    "description": "Average trade size (volume / number of trades, all venues) over the latest closed one-minute trade candle (null if no trade in the last day). The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history.",
    "operationId": "getTradesAvgSize",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:15.295Z",
         "data_type": "trades_avg_size",
         "symbol": "BTCUSDT",
         "market": "all",
         "data": {
          "time": "2026-10-13T01:26:00.000Z",
          "avg_trade_size": 0.0451412326375,
          "volume": 231.3939585,
          "trade_count": 5126,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:26:00.000Z",
          "window_s": 60
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size/futures": {
   "get": {
    "summary": "Average trade size, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/trades/avg-size`, which serves every market.",
    "operationId": "getTradesAvgSizeFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:10.198Z",
         "data_type": "trades_avg_size_futures",
         "symbol": "BTCUSDT",
         "market": "futures",
         "data": {
          "time": "2026-10-13T01:27:00.000Z",
          "avg_trade_size": 0.091014287234,
          "volume": 598.87401,
          "trade_count": 6580,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:27:00.000Z",
          "window_s": 60
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size/futures?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size/futures\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size/futures?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size/futures/history": {
   "get": {
    "summary": "Average trade size history, perpetual futures only",
    "description": "Perpetual futures market only. Same as `/v1/trades/avg-size/history`, which serves every market.",
    "operationId": "getTradesAvgSizeFuturesHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeFuturesHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:11.467Z",
         "data_type": "trades_avg_size_futures_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "avg_trade_size": 0.0499209989811,
           "volume": 48896.52024,
           "trade_count": 979478,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "avg_trade_size": 0.0547546040372,
           "volume": 37359.01158,
           "trade_count": 682299,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "avg_trade_size": 0.0508960587311,
           "volume": 19117.06862,
           "trade_count": 375610,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/trades/avg-size/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size/futures/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size/futures/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size/history": {
   "get": {
    "summary": "Average trade size history",
    "description": "Trade candles of the market of the path: one row per closed bucket of `timeframe`. On candles written before base-asset quantities were recorded, the quantity is estimated from USD volume ÷ typical price, as on `/v1/trades-kline*`, and the row carries `is_volume_estimated: true`. The market is in the PATH: no suffix = all markets (spot + perpetual futures), `/spot`, `/futures`; the envelope says which (`market`). Spot base-asset quantities are measured since 2026-09-27: before that date, spot and all-market buy/sell volumes are estimated from USD amounts (`is_volume_estimated: true`); `/futures` serves the full futures history. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "operationId": "getTradesAvgSizeHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:16.312Z",
         "data_type": "trades_avg_size_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "all",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "avg_trade_size": 0.0338418657231,
           "volume": 53963.6299284,
           "trade_count": 1594582,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "avg_trade_size": 0.0367362252988,
           "volume": 41313.558971,
           "trade_count": 1124600,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "avg_trade_size": 0.033365891181,
           "volume": 21332.949649,
           "trade_count": 639364,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/trades/avg-size/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size/spot": {
   "get": {
    "summary": "Average trade size, spot only",
    "description": "Spot market only. Same as `/v1/trades/avg-size`, which serves every market.",
    "operationId": "getTradesAvgSizeSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:09.683Z",
         "data_type": "trades_avg_size_spot",
         "symbol": "BTCUSDT",
         "market": "spot",
         "data": {
          "time": "2026-10-13T01:27:00.000Z",
          "avg_trade_size": 0.0125877068536,
          "volume": 50.04872245,
          "trade_count": 3976,
          "is_volume_estimated": false,
          "window_start": "2026-10-13T01:27:00.000Z",
          "window_s": 60
         }
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size/spot?symbol=BTCUSDT\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size/spot\",\n    params={\"symbol\": \"BTCUSDT\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size/spot?symbol=BTCUSDT\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/avg-size/spot/history": {
   "get": {
    "summary": "Average trade size history, spot only",
    "description": "Spot market only. Same as `/v1/trades/avg-size/history`, which serves every market.",
    "operationId": "getTradesAvgSizeSpotHistory",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 1000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "timeframe",
      "in": "query",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Timeframe"
      },
      "description": "Required: `1m`, `5m`, `15m`, `30m`, `1h`, `4h` or `1d`. One row per closed bucket, aggregating its minutes (`sample_count` = minutes in the bucket); `1m` gives one row per minute, aligned on the minute. Missing: 422 `missing_parameter`.",
      "example": "1h"
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order",
       "default": "desc"
      },
      "description": "Reading order: `desc` (most recent first, the default) or `asc` (oldest first, reading forward from `since_ms`, which is then required). Follow `next` to read the following page."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesAvgSizeSpotHistoryResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:28:10.833Z",
         "data_type": "trades_avg_size_spot_history",
         "symbol": "BTCUSDT",
         "timeframe": "1h",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T00:00:00.000Z",
           "avg_trade_size": 0.00823780968488,
           "volume": 5067.10968841,
           "trade_count": 615104,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-13T00:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T23:00:00.000Z",
           "avg_trade_size": 0.00894085111949,
           "volume": 3954.547391,
           "trade_count": 442301,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T23:00:00.000Z",
           "window_s": 3600
          },
          {
           "time": "2026-10-12T22:00:00.000Z",
           "avg_trade_size": 0.00840131724652,
           "volume": 2215.88102904,
           "trade_count": 263754,
           "is_volume_estimated": false,
           "sample_count": 60,
           "is_closed": true,
           "window_start": "2026-10-12T22:00:00.000Z",
           "window_s": 3600
          }
         ],
         "next": "/v1/trades/avg-size/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h&before_ms=1791842400000&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Order flow"
    ],
    "x-family": "microstructure",
    "x-update-frequency-seconds": 5,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/avg-size/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/avg-size/spot/history\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\", \"timeframe\": \"1h\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/avg-size/spot/history?symbol=BTCUSDT&limit=3&timeframe=1h\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/futures": {
   "get": {
    "summary": "Individual futures trades",
    "operationId": "getTradesFutures",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 10000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "after_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Resume right after this trade: the `id` of the last trade received, with its `time` as `since_ms` (order=asc) or `until_ms` (order=desc). Simplest: call the `next` URL of the previous response. Unknown or expired id: 422 `invalid_parameter`."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order"
      },
      "description": "Range reading: `desc` (most recent first, the default) or `asc`. Giving `order`, `since_ms` or `until_ms` switches the route to range reading. Either way, a full page carries `next` (the following page, older trades without range parameters) and the last page `next: null`."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesFuturesResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:09.956Z",
         "data_type": "trades_futures",
         "symbol": "BTCUSDT",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T01:27:09.698Z",
           "id": "6bfa916b6eb2f380",
           "side": "sell",
           "price": 81976.0,
           "quantity": 0.01,
           "value_usd": 819.76
          },
          {
           "time": "2026-10-13T01:27:09.698Z",
           "id": "68ddf1a4b740a46b",
           "side": "sell",
           "price": 81976.0,
           "quantity": 0.01,
           "value_usd": 819.76
          },
          {
           "time": "2026-10-13T01:27:09.613Z",
           "id": "e6e26f04eda9f037",
           "side": "sell",
           "price": 81969.8,
           "quantity": 0.0256,
           "value_usd": 2098.42688
          }
         ],
         "next": "/v1/trades/futures?symbol=BTCUSDT&limit=3&until_ms=1791854829613&after_id=e6e26f04eda9f037&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "description": "Perpetual futures executions (\"trades\") across venues, one row per trade, most recent first — the same trades, with the same `id`, as the WebSocket channel `trades.futures`. Kept 72 hours; your plan sets how far back you can read. Without range parameters: the last `limit` trades. To read a time range, give `since_ms`, `until_ms` and/or `order` (`asc` or `desc`): a page holds at most `limit` trades and covers at most 15 minutes, and `next` is the URL of the following page — call it as is — or `null` once the range is read. Following `next` returns every trade of the range exactly once, in order. Each trade has a stable `id`, the same as on the WebSocket.",
    "x-family": "ticks",
    "x-update-frequency-seconds": 2,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/futures?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/futures\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/futures?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/large": {
   "get": {
    "summary": "Large individual trades",
    "operationId": "getTradesLarge",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "min_usd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number",
       "minimum": 1000,
       "default": 100000
      },
      "description": "Minimum notional in USD (default 100000, minimum 1000).",
      "example": 100000.0
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 10000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "after_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Resume right after this trade: the `id` of the last trade received, with its `time` as `since_ms` (order=asc) or `until_ms` (order=desc). Simplest: call the `next` URL of the previous response. Unknown or expired id: 422 `invalid_parameter`."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order"
      },
      "description": "Range reading: `desc` (most recent first, the default) or `asc`. Giving `order`, `since_ms` or `until_ms` switches the route to range reading. Either way, a full page carries `next` (the following page, older trades without range parameters) and the last page `next: null`."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesLargeResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:08.938Z",
         "data_type": "trades_large",
         "symbol": "BTCUSDT",
         "market": "futures",
         "data": [
          {
           "time": "2026-10-13T01:27:07.278Z",
           "id": "72e8df823bf07e75",
           "side": "sell",
           "price": 81983.9,
           "quantity": 5.25,
           "value_usd": 430415.475
          },
          {
           "time": "2026-10-13T01:27:01.206Z",
           "id": "911a494fe73e8635",
           "side": "sell",
           "price": 81984.0,
           "quantity": 2.6828,
           "value_usd": 219946.6752
          },
          {
           "time": "2026-10-13T01:27:01.206Z",
           "id": "6294dde536fd7b1d",
           "side": "sell",
           "price": 81987.7,
           "quantity": 1.4084,
           "value_usd": 115471.47668
          }
         ],
         "next": "/v1/trades/large?symbol=BTCUSDT&min_usd=100000&limit=3&until_ms=1791854821206&after_id=6294dde536fd7b1d&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "description": "Individual perpetual futures trades above `min_usd` (default 100,000 USD), all venues. The venue is not disclosed (aggregation-only contract). Read a time range like `/v1/trades/futures`: `since_ms`, `until_ms`, `order`, `after_id`, and follow `next`. Most recent first, or oldest first with `order=asc`. Follow `next` to read the following page (it never repeats a row).",
    "x-family": "ticks",
    "x-update-frequency-seconds": 2,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/large?symbol=BTCUSDT&min_usd=100000&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/large\",\n    params={\"symbol\": \"BTCUSDT\", \"min_usd\": \"100000\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/large?symbol=BTCUSDT&min_usd=100000&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  },
  "/v1/trades/spot": {
   "get": {
    "summary": "Individual spot trades",
    "operationId": "getTradesSpot",
    "security": [
     {
      "APIKeyHeader": []
     }
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 10000,
       "minimum": 1,
       "default": 100
      },
      "description": "Number of rows to return, in the reading order (most recent first by default). Bounded by your plan's history window: an explicit `limit` (or `since_ms`) reaching beyond it returns 403 `history_depth`; without them the page simply stops at the window.",
      "example": 3
     },
     {
      "name": "since_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Lower time bound, INCLUSIVE, in epoch MILLISECONDS (13 digits). A value in seconds returns 422 `invalid_time_range`."
     },
     {
      "name": "until_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, INCLUSIVE to the millisecond, in epoch milliseconds. To page, prefer `before_ms` (exclusive) or simply follow `next`."
     },
     {
      "name": "before_ms",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Upper time bound, EXCLUSIVE, in epoch milliseconds: rows strictly before it. Pass the oldest `time` you received to read the previous page without repeating a row. Not combinable with `until_ms` (422 `invalid_time_range`)."
     },
     {
      "name": "after_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Resume right after this trade: the `id` of the last trade received, with its `time` as `since_ms` (order=asc) or `until_ms` (order=desc). Simplest: call the `next` URL of the previous response. Unknown or expired id: 422 `invalid_parameter`."
     },
     {
      "name": "order",
      "in": "query",
      "required": false,
      "schema": {
       "$ref": "#/components/schemas/Order"
      },
      "description": "Range reading: `desc` (most recent first, the default) or `asc`. Giving `order`, `since_ms` or `until_ms` switches the route to range reading. Either way, a full page carries `next` (the following page, older trades without range parameters) and the last page `next: null`."
     },
     {
      "name": "symbol",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Trading pair, e.g. `BTCUSDT`. Required. The 22 served pairs: `GET /v1/symbols`. Case-insensitive (`btcusdt` works; the envelope gives the canonical `BTCUSDT`). An unknown pair returns 422 `invalid_symbol` with the accepted list.",
      "example": "BTCUSDT"
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated projection of `data` (dot notation for nested keys): `fields=time,basis_pct`. Unknown field: 422 `unknown_field` with a suggestion."
     }
    ],
    "responses": {
     "200": {
      "description": "Success. The example is a real response captured in production, trimmed to 3 rows.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TradesSpotResponse"
        },
        "example": {
         "status": "ok",
         "server_time": "2026-10-13T01:27:09.446Z",
         "data_type": "trades_spot",
         "symbol": "BTCUSDT",
         "market": "spot",
         "data": [
          {
           "time": "2026-10-13T01:27:09.181Z",
           "id": "0038135adc46b261",
           "side": "sell",
           "price": 82033.0,
           "quantity": 0.01210087,
           "value_usd": 992.67066871
          },
          {
           "time": "2026-10-13T01:27:09.181Z",
           "id": "40f99a2997a6cb3e",
           "side": "sell",
           "price": 82033.1,
           "quantity": 0.00010495,
           "value_usd": 8.609373845
          },
          {
           "time": "2026-10-13T01:27:08.927Z",
           "id": "27da1e5256f9867f",
           "side": "sell",
           "price": 82033.1,
           "quantity": 0.01220582,
           "value_usd": 1001.28125264
          }
         ],
         "next": "/v1/trades/spot?symbol=BTCUSDT&limit=3&until_ms=1791854828927&after_id=27da1e5256f9867f&order=desc"
        }
       }
      },
      "headers": {
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimit-Policy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/X-Request-Id"
       },
       "BytNode-Contract-Version": {
        "$ref": "#/components/headers/BytNode-Contract-Version"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/Cache-Control"
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "405": {
      "$ref": "#/components/responses/MethodNotAllowed"
     },
     "422": {
      "$ref": "#/components/responses/Unprocessable"
     },
     "429": {
      "$ref": "#/components/responses/TooManyRequests"
     },
     "503": {
      "$ref": "#/components/responses/ServiceUnavailable"
     },
     "500": {
      "$ref": "#/components/responses/InternalError"
     },
     "504": {
      "$ref": "#/components/responses/GatewayTimeout"
     }
    },
    "tags": [
     "Market: prices & volumes"
    ],
    "description": "Spot executions (\"trades\") across venues, one row per trade, most recent first — the same trades, with the same `id`, as the WebSocket channel `trades.spot`. Kept 72 hours; your plan sets how far back you can read. Without range parameters: the last `limit` trades. To read a time range, give `since_ms`, `until_ms` and/or `order` (`asc` or `desc`): a page holds at most `limit` trades and covers at most 15 minutes, and `next` is the URL of the following page — call it as is — or `null` once the range is read. Following `next` returns every trade of the range exactly once, in order. Each trade has a stable `id`, the same as on the WebSocket.",
    "x-family": "ticks",
    "x-update-frequency-seconds": 2,
    "x-codeSamples": [
     {
      "lang": "curl",
      "label": "curl",
      "source": "curl -H \"X-API-KEY: $BYTNODE_API_KEY\" \"https://api.bytnode.com/v1/trades/spot?symbol=BTCUSDT&limit=3\""
     },
     {
      "lang": "python",
      "label": "Python",
      "source": "import os, requests\n\nr = requests.get(\n    \"https://api.bytnode.com/v1/trades/spot\",\n    params={\"symbol\": \"BTCUSDT\", \"limit\": \"3\"},\n    headers={\"X-API-KEY\": os.environ[\"BYTNODE_API_KEY\"]},\n    timeout=30,\n)\nbody = r.json()\nif body[\"status\"] == \"error\":\n    raise RuntimeError(body[\"error\"][\"code\"] + \": \" + body[\"error\"][\"message\"])\nprint(body[\"data\"])"
     },
     {
      "lang": "javascript",
      "label": "JavaScript",
      "source": "const r = await fetch(\"https://api.bytnode.com/v1/trades/spot?symbol=BTCUSDT&limit=3\", {\n  headers: { \"X-API-KEY\": process.env.BYTNODE_API_KEY },\n});\nconst body = await r.json();\nif (body.status === \"error\") throw new Error(body.error.code);\nconsole.log(body.data);"
     }
    ]
   }
  }
 },
 "x-units": {
  "active_addresses": "count",
  "active_addresses_sma_30d": "count",
  "active_addresses_sma_7d": "count",
  "active_cryptocurrency_count": "count",
  "adjustment_multiplier": "dimensionless ratio",
  "age_s": "seconds",
  "annualized_rate_pct": "percent (58.5 = 58.5 %)",
  "apr_pct": "percent (58.5 = 58.5 %)",
  "asks_quantity": "base asset quantity (BTC for BTCUSDT)",
  "asks_usd": "USD",
  "attraction_down": "dimensionless score",
  "attraction_up": "dimensionless score",
  "available_signal_count": "count",
  "avg_24h_s": "seconds",
  "avg_reward_sats": "satoshis",
  "avg_reward_usd": "USD",
  "avg_trade_size": "base asset quantity (BTC for BTCUSDT)",
  "base_fee_gwei": "gwei",
  "basis_pct": "percent (58.5 = 58.5 %)",
  "basis_value": "quote currency (USDT for BTCUSDT)",
  "bids_quantity": "base asset quantity (BTC for BTCUSDT)",
  "bids_usd": "USD",
  "big_count": "count",
  "big_usd": "USD",
  "block_count": "count",
  "block_height": "block height",
  "btc_dominance_pct": "percent (58.5 = 58.5 %)",
  "btc_holdings": "BTC",
  "btc_price_usd": "USD",
  "btc_price_usd_at_block": "USD",
  "burn_24h": "ETH",
  "burnt_fees": "ETH",
  "burst": "count",
  "buy_ratio": "fraction (0.585 = 58.5 %)",
  "buy_volume": "base asset quantity (BTC for BTCUSDT)",
  "buy_volume_futures": "base asset quantity (BTC for BTCUSDT)",
  "buy_volume_spot": "base asset quantity (BTC for BTCUSDT)",
  "change_30d_pct": "percent (58.5 = 58.5 %)",
  "change_7d_pct": "percent (58.5 = 58.5 %)",
  "change_pct": "percent (58.5 = 58.5 %)",
  "changes_pct": "percent (58.5 = 58.5 %)",
  "circulating_supply": "coins",
  "computed_at": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "concentration": "percent (58.5 = 58.5 %)",
  "consensus_rewards_cumulative": "ETH",
  "contribution": "dimensionless score",
  "correlation": "from -1 to 1",
  "correlations": "dimensionless ratio",
  "cvd_series": "base asset quantity (BTC for BTCUSDT)",
  "defi_health_change_30d_pct": "percent (58.5 = 58.5 %)",
  "defi_health_ratio": "fraction (0.585 = 58.5 %)",
  "delta": "delta",
  "density_down": "dimensionless score",
  "density_up": "dimensionless score",
  "deviation_s": "seconds",
  "dex_volume_24h_usd": "USD",
  "dex_volume_7d_usd": "USD",
  "difficulty": "difficulty units",
  "difficulty_change_pct": "percent (58.5 = 58.5 %)",
  "dist_down_ratio": "fraction (0.585 = 58.5 %)",
  "dist_up_ratio": "fraction (0.585 = 58.5 %)",
  "dte_days": "days",
  "dxy": "index points",
  "dxy_7d_ago": "index points",
  "economy_fee_sat_vb": "satoshis per virtual byte (sat/vB)",
  "error_feed_count": "count",
  "estimated_rate_pct": "percent (58.5 = 58.5 %)",
  "estimated_retarget_at": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "eth_dominance_pct": "percent (58.5 = 58.5 %)",
  "eth_holdings": "ETH",
  "eth_market_cap_usd": "USD",
  "eth_price_btc": "BTC",
  "eth_price_usd": "USD",
  "execution_issuance_cumulative": "ETH",
  "expected_interval_s": "seconds",
  "expiry": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "fast": "candles",
  "fast_gas_price_gwei": "gwei",
  "fastest_fee_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fdv_usd": "USD",
  "fee_histogram": "[sat/vB, virtual bytes] pairs",
  "fee_pressure": "dimensionless ratio",
  "fee_rate_p0_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p100_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p10_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p25_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p50_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p75_sat_vb": "satoshis per virtual byte (sat/vB)",
  "fee_rate_p90_sat_vb": "satoshis per virtual byte (sat/vB)",
  "feed_count": "count",
  "filed_date": "calendar date (YYYY-MM-DD)",
  "futures_price": "quote currency (USDT for BTCUSDT)",
  "gamma": "delta per USD",
  "gas_sma_30d_gwei": "gwei",
  "gas_sma_7d_gwei": "gwei",
  "gas_used_ratio": "fraction (0.585 = 58.5 %)",
  "gold_7d_ago_usd": "USD per troy ounce",
  "gold_usd": "USD per troy ounce",
  "half_hour_fee_sat_vb": "satoshis per virtual byte (sat/vB)",
  "height": "block height",
  "history_start_date": "calendar date (YYYY-MM-DD)",
  "hour_fee_sat_vb": "satoshis per virtual byte (sat/vB)",
  "imbalance_ratio": "fraction from -1 to 1",
  "iv_atm_30d_pct": "percent (58.5 = 58.5 %)",
  "iv_atm_pct": "percent (58.5 = 58.5 %)",
  "last_candle_at": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "liquidation_events": "count",
  "long_usd": "USD",
  "market_cap_usd": "USD",
  "max_age_s": "seconds",
  "max_pain_strike_usd": "USD",
  "max_spread_bps": "basis points (1 bp = 0.01 %)",
  "max_supply": "coins",
  "minimum_fee_sat_vb": "satoshis per virtual byte (sat/vB)",
  "monthly": "count",
  "mvrv": "dimensionless ratio",
  "nav_per_share_usd": "USD",
  "net_assets_usd": "USD",
  "net_issuance_24h": "ETH",
  "net_liquidity_usd": "USD",
  "net_volume": "base asset quantity (BTC for BTCUSDT)",
  "new_difficulty": "difficulty units",
  "next_retarget_height": "block height",
  "nvt": "dimensionless ratio",
  "nvt_signal": "dimensionless ratio",
  "oi": "base asset quantity (BTC for BTCUSDT)",
  "oi_call": "base asset quantity (BTC for BTCUSDT)",
  "oi_call_usd": "USD",
  "oi_change": "base asset quantity (BTC for BTCUSDT)",
  "oi_change_call_usd": "USD",
  "oi_change_pct": "percent (58.5 = 58.5 %)",
  "oi_change_put_usd": "USD",
  "oi_change_total_usd": "USD",
  "oi_coverage_ratio": "fraction (0.585 = 58.5 %)",
  "oi_previous": "base asset quantity (BTC for BTCUSDT)",
  "oi_put": "base asset quantity (BTC for BTCUSDT)",
  "oi_put_usd": "USD",
  "oi_total_usd": "USD",
  "old_difficulty": "difficulty units",
  "oldest_input_date": "calendar date (YYYY-MM-DD)",
  "others_dominance_pct": "percent (58.5 = 58.5 %)",
  "period": "candles",
  "period_end": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "pool_count": "count",
  "precise": "satoshis per virtual byte (sat/vB)",
  "premium_bps": "basis points (1 bp = 0.01 %)",
  "price": "quote currency (USDT for BTCUSDT)",
  "priced_at": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "progress_pct": "percent (58.5 = 58.5 %)",
  "propose_gas_price_gwei": "gwei",
  "put_call_ratio": "puts / calls",
  "quantity": "base asset quantity (BTC for BTCUSDT)",
  "range_pct": "percent (58.5 = 58.5 %)",
  "rank": "rank (1 = first)",
  "rate_pct": "percent (58.5 = 58.5 %)",
  "ref_price": "quote currency (USDT for BTCUSDT)",
  "remaining": "count",
  "remaining_block_count": "count",
  "remaining_s": "seconds",
  "results": "count",
  "revenue_per_difficulty_sma_30d_usd": "USD per unit of difficulty",
  "revenue_per_difficulty_usd": "USD per unit of difficulty",
  "risk_on_signal_count": "count",
  "rolling_24h_rate_pct": "percent (58.5 = 58.5 %)",
  "rrp_usd": "USD",
  "safe_gas_price_gwei": "gwei",
  "sample_count": "count",
  "sell_volume": "base asset quantity (BTC for BTCUSDT)",
  "sell_volume_futures": "base asset quantity (BTC for BTCUSDT)",
  "sell_volume_spot": "base asset quantity (BTC for BTCUSDT)",
  "settled_at": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "share_pct": "percent (58.5 = 58.5 %)",
  "shares_outstanding": "shares",
  "short_usd": "USD",
  "signal_count": "count",
  "slow": "candles",
  "sma_7d_vs_30d_pct": "percent (58.5 = 58.5 %)",
  "small_count": "count",
  "small_usd": "USD",
  "sp500": "index points",
  "sp500_sma_50d": "index points",
  "spot_price": "quote currency (USDT for BTCUSDT)",
  "squeeze_index": "score from 0 to 100",
  "staking_ratio": "fraction (0.585 = 58.5 %)",
  "stale_feed_count": "count",
  "stale_venue_count": "count",
  "std": "standard deviations",
  "strike_usd": "USD",
  "tga_date": "calendar date (YYYY-MM-DD)",
  "tga_usd": "USD",
  "theta": "USD per day",
  "threshold_s": "seconds",
  "time": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "times": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "tip_height": "block height",
  "top1_share_pct": "percent (58.5 = 58.5 %)",
  "top3_share_pct": "percent (58.5 = 58.5 %)",
  "top_call_strike_usd": "USD",
  "top_put_strike_usd": "USD",
  "total_block_count": "count",
  "total_fee_sats": "satoshis",
  "total_market_cap_usd": "USD",
  "total_staked": "ETH",
  "total_supply": "coins",
  "total_usd": "USD",
  "total_volume_usd": "USD",
  "trade_count": "count",
  "trade_rate": "trades per second",
  "trend": "virtual bytes",
  "tvl_usd": "USD",
  "tx_count": "count",
  "underlying_price_usd": "USD",
  "value_usd": "USD",
  "values": "the indicator's own unit",
  "vega": "USD per volatility point",
  "vix": "index points",
  "volume_call_usd": "USD",
  "volume_futures": "base asset quantity (BTC for BTCUSDT)",
  "volume_put_usd": "USD",
  "volume_spot": "base asset quantity (BTC for BTCUSDT)",
  "volume_total_usd": "USD",
  "vsize": "virtual bytes",
  "vsize_delta_1h": "virtual bytes",
  "vsize_delta_24h": "virtual bytes",
  "vsize_delta_4h": "virtual bytes",
  "walcl_date": "calendar date (YYYY-MM-DD)",
  "walcl_usd": "USD",
  "window_minutes": "minutes",
  "window_s": "seconds",
  "window_start": "ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)",
  "withdrawn_total": "ETH",
  "yield_curve_10y2y_pp": "percentage points"
 },
 "x-examples-captured-at": "2026-10-13T01:27:03Z",
 "x-renamed": {
  "fields": {
   "active_cryptocurrencies": "active_cryptocurrency_count",
   "age_seconds": "age_s",
   "asks_qty": "asks_quantity",
   "available_signals": "available_signal_count",
   "avg_30d": "active_addresses_sma_30d",
   "avg_7d": "active_addresses_sma_7d",
   "avg_size": "avg_trade_size",
   "bids_qty": "bids_quantity",
   "call_coin": "oi_call",
   "call_oi_usd": "oi_call_usd",
   "congestion": "label",
   "cumulative_rate_pct": "rolling_24h_rate_pct",
   "delta_call_usd": "oi_change_call_usd",
   "delta_put_usd": "oi_change_put_usd",
   "delta_total_usd": "oi_change_total_usd",
   "depth_start": "history_start_date",
   "dist_down": "dist_down_ratio",
   "dist_up": "dist_up_ratio",
   "estimated_retarget": "estimated_retarget_at",
   "eth_btc_ratio": "eth_price_btc",
   "exchange_count": null,
   "expected_interval_seconds": "expected_interval_s",
   "fdv": "fdv_usd",
   "feeds_checked": "feed_count",
   "feeds_in_error": "error_feed_count",
   "feeds_stale": "stale_feed_count",
   "filed": "filed_date",
   "gas_ma30_gwei": "gas_sma_30d_gwei",
   "gas_ma7_gwei": "gas_sma_7d_gwei",
   "gold_7d_ago": "gold_7d_ago_usd",
   "holdings_estimated": "is_holdings_estimated",
   "imbalance": "imbalance_ratio",
   "last_candle": "last_candle_at",
   "market_cap": "market_cap_usd",
   "max_age_seconds": "max_age_s",
   "max_pain_strike": "max_pain_strike_usd",
   "momentum_30d_pct": "change_30d_pct",
   "momentum_7d_pct": "change_7d_pct",
   "nav_per_share": "nav_per_share_usd",
   "net_delta": "net_volume",
   "oi_current": "oi",
   "oi_total": "oi",
   "pc_label": "put_call_label",
   "pc_ratio": "put_call_ratio",
   "pc_signal": "put_call_label",
   "points": "sample_count",
   "points_count": "sample_count",
   "price_time": "priced_at",
   "put_coin": "oi_put",
   "put_oi_usd": "oi_put_usd",
   "regime": "label",
   "remaining_blocks": "remaining_block_count",
   "remaining_time_ms": "remaining_s",
   "revenue_per_difficulty_ma30_usd": "revenue_per_difficulty_sma_30d_usd",
   "risk_on": "is_risk_on",
   "risk_on_signals": "risk_on_signal_count",
   "roc_pct": "change_pct",
   "sources_active": null,
   "sp500_sma50": "sp500_sma_50d",
   "stale_venues": "stale_venue_count",
   "strike": "strike_usd",
   "taker_buy": "buy_volume",
   "taker_buy_vol": "buy_volume",
   "taker_buy_volume": "buy_volume",
   "taker_sell": "sell_volume",
   "taker_sell_vol": "sell_volume",
   "taker_sell_volume": "sell_volume",
   "threshold_seconds": "threshold_s",
   "top_call_strike": "top_call_strike_usd",
   "top_put_strike": "top_put_strike_usd",
   "total_signals": "signal_count",
   "total_volume": "volume",
   "trade_volume": "volume",
   "trade_volume_buy": "buy_volume",
   "trade_volume_sell": "sell_volume",
   "trades_avg": "avg_trade_size",
   "trades_count": "trade_count",
   "trend_30d_pct": "defi_health_change_30d_pct",
   "underlying_price": "underlying_price_usd",
   "usd_value": "value_usd",
   "value_classification": "label",
   "venue_count": null,
   "venues_expected": null,
   "volume_combined": "volume",
   "volume_delta": "net_volume",
   "volume_estimated": "is_volume_estimated",
   "volume_futures_estimated": "is_volume_futures_estimated",
   "volume_total": "volume",
   "window_count": "sample_count",
   "yield_curve_10y2y": "yield_curve_10y2y_pp",
   "zone": "label"
  },
  "fields_by_route": {
   "/v1/btc/fees": {
    "signal": "label"
   },
   "/v1/btc/mempool": {
    "signal": "label"
   },
   "/v1/btc/mining": {
    "signal": "label"
   },
   "/v1/btc/network": {
    "signal": "label"
   },
   "/v1/eth/defi": {
    "signal": "label"
   },
   "/v1/eth/gas-momentum": {
    "momentum_pct": "sma_7d_vs_30d_pct"
   },
   "/v1/eth/ratio": {
    "signal": "label"
   },
   "/v1/eth/squeeze": {
    "level": "label"
   },
   "/v1/eth/supply": {
    "eth_supply": "execution_issuance_cumulative",
    "signal": "label"
   },
   "/v1/klines": {
    "buy_combined": "buy_volume",
    "sell_combined": "sell_volume",
    "taker_buy": "buy_volume_spot",
    "taker_buy_futures": "buy_volume_futures",
    "taker_sell": "sell_volume_spot",
    "taker_sell_futures": "sell_volume_futures",
    "volume_combined": "volume",
    "volume_combined_estimated": "is_volume_estimated",
    "volume_estimated": "is_volume_spot_estimated"
   },
   "/v1/macro": {
    "label": "name"
   },
   "/v1/macro/correlations": {
    "n": "sample_count"
   },
   "/v1/macro/intraday/series": {
    "label": "name"
   },
   "/v1/macro/series": {
    "label": "name"
   },
   "/v1/oi/delta": {
    "delta": "oi_change",
    "delta_pct": "oi_change_pct"
   },
   "/v1/onchain/active-addresses": {
    "avg_30d": "active_addresses_sma_30d",
    "avg_7d": "active_addresses_sma_7d",
    "momentum_pct": "sma_7d_vs_30d_pct",
    "signal": "label"
   },
   "/v1/options/oi": {
    "call_coin": "oi_call",
    "call_usd": "oi_call_usd",
    "put_coin": "oi_put",
    "put_usd": "oi_put_usd",
    "total_usd": "oi_total_usd"
   },
   "/v1/options/oi/delta": {
    "delta_call_usd": "oi_change_call_usd",
    "delta_put_usd": "oi_change_put_usd",
    "delta_total_usd": "oi_change_total_usd"
   },
   "/v1/options/oi/distribution": {
    "call_oi_usd": "oi_call_usd",
    "put_oi_usd": "oi_put_usd"
   },
   "/v1/options/pc-ratio": {
    "signal": "label"
   },
   "/v1/options/pc-ratio/history": {
    "signal": "label"
   },
   "/v1/options/volume": {
    "call_usd": "volume_call_usd",
    "put_usd": "volume_put_usd",
    "total_usd": "volume_total_usd"
   },
   "/v1/spread/interexchange": {
    "exchange": "venue"
   },
   "/v1/tokenomics": {
    "price": "price_usd"
   }
  },
  "snapshot_fields": {
   "funding_rate_8h": "funding_rate",
   "futures_ticks": "trades_futures",
   "global_market": "global",
   "heatmap": "heatmap_clusters",
   "klines_15m": "klines@15m",
   "klines_1d": "klines@1d",
   "klines_1h": "klines@1h",
   "klines_1m": "klines@1m",
   "klines_1w": "klines@1w",
   "klines_30m": "klines@30m",
   "klines_4h": "klines@4h",
   "klines_5m": "klines@5m",
   "liq_cumulative": "liquidations_cumulative",
   "liq_ratio": "liquidations_ratio",
   "liquidations": "liquidations_events",
   "net_liquidity": "macro_net_liquidity",
   "oi_snapshots": null,
   "options": "options_summary",
   "orderbook_aggregated": "orderbook",
   "raw_trades": "trades_kline_futures_seconds",
   "spot_ticks": "trades_spot",
   "taker_futures": null,
   "ticks_futures": "trades_futures",
   "ticks_spot": "trades_spot",
   "trade": "trades_kline",
   "trade_futures": "trades_kline_futures",
   "trade_size": "trades_avg_size",
   "trade_spot": "trades_kline_spot",
   "trades": "trades_kline",
   "trades_futures_seconds": "trades_kline_futures_seconds",
   "trades_raw": "trades_kline_futures_seconds",
   "vwap": null,
   "vwap_window": null
  },
  "websocket_channels": {
   "book.perp.<SYMBOL>": "book.futures.<SYMBOL>"
  },
  "websocket_fields": {
   "time (frame root)": "server_time",
   "usd_value": "value_usd",
   "spread_bps_avg": "avg_spread_bps"
  },
  "envelope": {
   "timestamp": "server_time",
   "detail": "error.message"
  },
  "row_time_keys": {
   "bucket": "time",
   "timestamp": "time"
  },
  "parameters": {
   "market": "moved to the path on 2026-10-12: /v1/cvd/spot, /v1/cvd/futures, and /v1/cvd (no suffix) for all markets combined; the same for /v1/buysell/ratio, /v1/trades/avg-size and /v1/orderbook",
   "timePeriod": "was removed on 2026-10-11: bound the history with since_ms / until_ms (epoch milliseconds) and limit, like every other history"
  },
  "routes": {
   "/v1/ls-ratio": null,
   "/v1/ls-ratio/history": null,
   "/v1/options/iv/history": "/v1/options/iv/klines",
   "/v1/orderbook/aggregated": "/v1/orderbook",
   "/v1/orderbook/aggregated/history": "/v1/orderbook/history",
   "/v1/raw/futures-ticks": "/v1/trades/futures",
   "/v1/raw/klines": "/v1/klines?timeframe=1m",
   "/v1/raw/klines/15m": "/v1/klines?timeframe=15m",
   "/v1/raw/klines/1d": "/v1/klines?timeframe=1d",
   "/v1/raw/klines/1h": "/v1/klines?timeframe=1h",
   "/v1/raw/klines/1m": "/v1/klines?timeframe=1m",
   "/v1/raw/klines/1w": "/v1/klines?timeframe=1w",
   "/v1/raw/klines/30m": "/v1/klines?timeframe=30m",
   "/v1/raw/klines/4h": "/v1/klines?timeframe=4h",
   "/v1/raw/klines/5m": "/v1/klines?timeframe=5m",
   "/v1/raw/liquidations": "/v1/liquidations/events",
   "/v1/raw/oi": "/v1/oi/history?timeframe=1m",
   "/v1/raw/orderbook": "/v1/orderbook/futures?timeframe=1m",
   "/v1/raw/spot-ticks": "/v1/trades/spot",
   "/v1/raw/taker-combined": "/v1/cvd/futures/history",
   "/v1/raw/taker-futures": "/v1/cvd/futures/history",
   "/v1/raw/trades": "/v1/trades-kline/futures/seconds",
   "/v1/raw/trades/large": "/v1/trades/large",
   "/v1/ticks/futures": "/v1/trades/futures",
   "/v1/ticks/large": "/v1/trades/large",
   "/v1/ticks/spot": "/v1/trades/spot",
   "/v1/trades": "/v1/trades-kline",
   "/v1/trades/future": "/v1/trades-kline/futures",
   "/v1/trades/future/history": "/v1/trades-kline/futures/history",
   "/v1/trades/futures/history": "/v1/trades-kline/futures/history",
   "/v1/trades/futures/seconds": "/v1/trades-kline/futures/seconds",
   "/v1/trades/history": "/v1/trades-kline/history",
   "/v1/trades/spot/history": "/v1/trades-kline/spot/history",
   "/v1/vwap": null,
   "/v1/vwap/history": null,
   "/v1/vwap/window": null,
   "/v1/vwap/window/history": null
  }
 },
 "x-removed-on": {
  "routes": {
   "/v1/ls-ratio": "2026-10-01",
   "/v1/ls-ratio/history": "2026-10-01",
   "/v1/options/iv/history": "2026-10-11",
   "/v1/orderbook/aggregated": "2026-10-12",
   "/v1/orderbook/aggregated/history": "2026-10-12",
   "/v1/raw/futures-ticks": "2026-10-11",
   "/v1/raw/klines": "2026-10-11",
   "/v1/raw/klines/15m": "2026-10-11",
   "/v1/raw/klines/1d": "2026-10-11",
   "/v1/raw/klines/1h": "2026-10-11",
   "/v1/raw/klines/1m": "2026-10-11",
   "/v1/raw/klines/1w": "2026-10-11",
   "/v1/raw/klines/30m": "2026-10-11",
   "/v1/raw/klines/4h": "2026-10-11",
   "/v1/raw/klines/5m": "2026-10-11",
   "/v1/raw/liquidations": "2026-10-11",
   "/v1/raw/oi": "2026-10-11",
   "/v1/raw/orderbook": "2026-10-10",
   "/v1/raw/spot-ticks": "2026-10-11",
   "/v1/raw/taker-combined": "2026-10-10",
   "/v1/raw/taker-futures": "2026-10-11",
   "/v1/raw/trades": "2026-10-11",
   "/v1/raw/trades/large": "2026-10-11",
   "/v1/ticks/futures": "2026-10-12",
   "/v1/ticks/large": "2026-10-12",
   "/v1/ticks/spot": "2026-10-12",
   "/v1/trades": "2026-10-12",
   "/v1/trades/future": "2026-10-09",
   "/v1/trades/future/history": "2026-10-09",
   "/v1/trades/futures/history": "2026-10-12",
   "/v1/trades/futures/seconds": "2026-10-12",
   "/v1/trades/history": "2026-10-12",
   "/v1/trades/spot/history": "2026-10-12",
   "/v1/vwap": "2026-10-11",
   "/v1/vwap/history": "2026-10-11",
   "/v1/vwap/window": "2026-10-11",
   "/v1/vwap/window/history": "2026-10-11"
  },
  "parameters": {
   "market": "2026-10-12",
   "timePeriod": "2026-10-11"
  },
  "envelope": {
   "timestamp": "2026-10-11",
   "detail": "2026-10-11"
  },
  "row_time_keys": {
   "bucket": "2026-10-09",
   "timestamp": "2026-10-09"
  },
  "snapshot_fields": {
   "futures_ticks": "2026-10-11",
   "global_market": "2026-10-12",
   "klines_15m": "2026-10-11",
   "klines_1d": "2026-10-11",
   "klines_1h": "2026-10-11",
   "klines_1m": "2026-10-11",
   "klines_1w": "2026-10-11",
   "klines_30m": "2026-10-11",
   "klines_4h": "2026-10-11",
   "klines_5m": "2026-10-11",
   "liquidations": "2026-10-11",
   "orderbook_aggregated": "2026-10-12",
   "raw_trades": "2026-10-11",
   "spot_ticks": "2026-10-11",
   "ticks_futures": "2026-10-12",
   "ticks_spot": "2026-10-12",
   "trades": "2026-10-12",
   "trades_futures_seconds": "2026-10-12"
  }
 }
}
