Skip to content

Releases: bytnode/bytnode-SDK

v3.0.1 — contract 3.0.1

Choose a tag to compare

@bytnode bytnode released this 28 Oct 16:54

[3.0.1] — 2026-10-28

Generated from contract 3.0.1. The first release since 2.0.6: it also carries contract 3.0.0,
a MAJOR version.

  • Breaking (contract 3.0.0): the four intraday macro series from Dukascopy (EURUSD,
    USDJPY, WTIUSD, DXY_ICE) are no longer served by macro.intraday; asking for one now
    returns a 422 naming the daily series to use instead. PAXGUSDT remains. StatusFeedsItem.feed
    loses macro_intraday_1m, macro_intraday_5m, macro_intraday_15m, macro_intraday_1h and
    macro_intraday_4h.
  • 104 served pairs instead of 77: 102 USDT-margined perpetual markets plus the two stablecoin
    pairs. KnownSymbol now lists all 104 (GET /v1/symbols remains the source of truth).
  • The 27 new pairs start on 2026-10-27: open interest and basis 1m–30m from 18:03 UTC;
    documented on the history methods.

v2.0.6 — contract 2.0.6

Choose a tag to compare

@bytnode bytnode released this 22 Oct 17:01

[2.0.6] — 2026-10-22

Generated from contract 2.0.6. No change to the generated methods or models.

  • The API now also accepts the key as Authorization: Bearer <key> (the SDKs keep sending
    X-API-KEY, which wins when both are present). The contract declares both forms.
  • MCP connectors that sign in with OAuth (claude.ai, ChatGPT, Claude Code) need no key:
    they connect to https://api.bytnode.com/mcp and approve access on bytnode.com.

v2.0.5 — contract 2.0.5

Choose a tag to compare

@bytnode bytnode released this 19 Oct 13:31

[2.0.5] � 2026-10-19

Generated from contract 2.0.5.

  • New sentiment routes from CoinMarketCap: fear_greed.cmc (CMC Fear & Greed, a different
    index from fear_greed), altcoin_season, and the indices.cmc20 / indices.cmc100
    market indices with their constituents (asset, name, weight_pct), each with a daily
    history.
  • New snapshot fields fear_greed_cmc, altcoin_season, cmc20 and cmc100.

[2.0.4] � 2026-10-19

Generated from contract 2.0.4.

  • 77 served pairs instead of 22: 75 USDT-margined perpetual markets plus the two stablecoin
    pairs. KnownSymbol now lists all 77 (GET /v1/symbols remains the source of truth).
  • The 55 new pairs have no imported open-interest or basis history: 1m�30m start on
    2026-10-19 09:31 UTC.

Install

pip install https://github.com/bytnode/bytnode-SDK/releases/download/v2.0.5/bytnode-2.0.5-py3-none-any.whl
npm install https://github.com/bytnode/bytnode-SDK/releases/download/v2.0.5/bytnode-2.0.5.tgz

v2.0.3

Choose a tag to compare

@bytnode bytnode released this 16 Oct 15:46

Generated from contract 2.0.3.

  • CVD and buy/sell-ratio history no longer return zeros on older buckets: they carry the real
    buy and sell volumes of the bucket's own candle (the same as trades_kline), with
    cvd_series set to None / null where finer candles do not cover the bucket.
  • New buy_sell_coverage_ratio on Cvd, BuySellRatio and TradesKline: the share of the
    volume whose buy/sell split is known (below 1 on part of the history).
  • CvdHistoryItem is now the same type as Cvd; the old name remains as an alias.

Install: see README (GitHub release assets; not on PyPI/npm).

v2.0.2

Choose a tag to compare

@bytnode bytnode released this 16 Oct 13:18

Generated from contract 2.0.2.

  • client.status() (/v1/status) now covers every data family: options, on-chain (BTC, ETH),
    macro, ETF, tokenomics and sentiment feeds join the market feeds. StatusFeedsItem.feed is the
    closed list of the 83 public feed names; family uses the names of /v1/limits (trades, no
    longer ticks).
  • age_s and is_stale are typed optional (None / null when a feed could not be checked), as
    the API always answered.
  • /v1/oi/history, /v1/oi/change/history, /v1/basis/history: each timeframe starts where the
    readings are at least that fine (1h from 2026-04-04, 4h from 2025-10-07, 1m–30m from
    2026-05-28), so step is always the real spacing; documented on the methods.

Install: see README (GitHub release assets; not on PyPI/npm).

v2.0.1 — contract 2.0.1

Choose a tag to compare

@bytnode bytnode released this 16 Oct 11:33

Generated from contract 2.0.1.

  • client.ws.token() (POST /v1/ws/token): a short-lived WebSocket token (60 seconds, one connection) to open the stream without handing your API key to a web page.
  • TypeScript stream: the API key never goes into a URL any more. New token option — a function returning a fresh token, typically from your backend — called before every connection and reconnection; the key is then not sent at all. Without the ws package (browser, Deno, Bun) and without token, the stream asks POST /v1/ws/token for a token instead of putting the key in ?api_key=. With ws (Node), the key stays in the X-API-KEY header.
  • The API now refuses plain http:// (403 https_required) instead of redirecting: the SDKs always use https://, nothing to change on your side.

Install:

pip install https://github.com/bytnode/bytnode-SDK/releases/download/v2.0.1/bytnode-2.0.1-py3-none-any.whl
npm install https://github.com/bytnode/bytnode-SDK/releases/download/v2.0.1/bytnode-2.0.1.tgz

v2.0.0 — contract 2.0.0

Choose a tag to compare

@bytnode bytnode released this 16 Oct 09:46

The reference version of the SDKs, generated from contract 2.0.0 (the reference version of
the API). Both packages share one version number with the contract's major.

  • Typed clients for the 131 routes, the WebSocket stream (frame / batch modes, gap detection,
    reconnection) and typed errors, in Python and TypeScript.
  • is_volume_estimated and its variants are optional: None / null when their volume is.
  • Channel helpers: trades, orderbook, liquidations.

v0.5.1 — contract 4.3.1

Choose a tag to compare

@bytnode bytnode released this 15 Oct 12:04

[0.5.1] — 2026-10-15

Generated from contract 4.3.1 (was 4.3.0). Nothing breaks.

Added

  • client.klines(symbol, timeframe, live=True) in Python, client.klines({ symbol, timeframe, live: true }) in TypeScript: the candle in progress, is_closed: false, its OHLC from the
    same reference market and its volumes provisional until it closes.

Changed

  • Docstrings and JSDoc follow the contract texts: a 1m candle is closed about 5 s after its end
    (it was about 21 s), a 1m order book about 2 s after.

v0.5.0 — contract 4.3.0

Choose a tag to compare

@bytnode bytnode released this 15 Oct 11:08

[0.5.0] — 2026-10-15

Generated from contract 4.3.0 (was 4.0.0). Nothing breaks: the contract only had MINOR
revisions since 0.4.0. With 0.4.0, every client warned at start-up that the API runs a newer
contract; 0.5.0 matches it.

Added

  • client.klines.history(symbol, "1w"): the weekly timeframe, already accepted by the API, is
    now in the type (KlineTimeframe).

Changed

  • Docstrings and JSDoc follow the contract texts (CVD volumes read from /v1/trades-kline,
    period_end_at, window_start_at, the series parameter of the macro intraday routes).

v0.4.0 — contract 4.0.0

Choose a tag to compare

@bytnode bytnode released this 14 Oct 09:55

[0.4.0] — 2026-10-14

Generated from contract 4.0.0. The contract had two MAJOR revisions since 0.3.0 (3.0.0 on
2026-10-13, 4.0.0 on 2026-10-14): 0.3.0 no longer matches the API — upgrade.

Changed (breaking, following the contract)

  • Every method is named after the path of its route (contract 3.0.0): client.oi.change
    (was oi.delta), client.options.put_call_ratio, client.buy_sell_ratio,
    client.liquidations.big_small_ratio, client.eth.price_btc, Bitcoin on-chain under
    client.btc.* (mvrv, nvt, active_addresses, revenue_per_difficulty),
    client.capabilities(symbol).
  • client.klines(symbol, timeframe) returns the latest CLOSED candle (one model); the list is
    client.klines.history(...) and client.klines.history.iter(...). Same for
    client.options.iv.klines.
  • client.buy_sell_ratio, client.trades.avg_size and client.liquidations.big_small_ratio
    require timeframe and return the latest closed bucket (contract 4.0.0); their snapshot fields
    take a timeframe mapping (buy_sell_ratio={"5m": 12}).
  • Snapshot: a multi-timeframe field (klines_1h, cvd_1h...) is typed as a LIST, never
    Model | list[Model]; a field without a timeframe is the object of its route (True or 1).
  • client.indicators(..., limit=N) (was results=); values is a list of dated rows,
    IndicatorRow(time, value) or the named outputs, most recent first; to_pandas() builds its
    columns from them.
  • global is a Python keyword: client.global_() (was client.global_market()); the TypeScript
    property is client.global.
  • WebSocket: ch.orderbook(symbol, market=...) (the channel is orderbook.*; ch.book stays as
    an alias), messages of kind orderbook carry avg_mid_price.
  • Field names follow the contract: *_at instants, *_s durations, *_count counts,
    step in the envelope of a list, is_partial on the snapshot.

Added

  • A warning when the API serves a newer MAJOR contract, or a newer MINOR one, than the SDK was
    generated from (contract_drift).