Guides

Free historical BTC order book data (CSV) from Binance's archive

data.binance.vision publishes daily book-depth snapshots and every trade for each USD-M perpetual. No API key needed.

Why it happens

For each futures symbol the public archive has bookDepth (snapshots of cumulative resting notional within ±0.2% to ±5% of mid), aggTrades and trades (every print), klines, and monthly fundingRate files. It does not include the full L2 update stream, so you can't rebuild every price level from it. Depth bands plus trades still tell you a lot about liquidity. For level-by-level fills you need an L2 update stream from elsewhere.

URL pattern:
https://data.binance.vision/data/futures/um/daily/bookDepth/BTCUSDT/BTCUSDT-bookDepth-2026-09-30.zip

Fix it with plain pandas

import pandas as pd

depth = pd.read_csv("BTCUSDT-bookDepth-2026-09-30.zip")
depth["timestamp"] = pd.to_datetime(depth["timestamp"], utc=True)
wide = depth.pivot_table(index="timestamp", columns="percentage", values="notional")
print(wide[[-1.0, 1.0]].describe())   # resting $ within 1% below / above mid

Or with Deptho

Deptho reads every archive format, with or without header rows. Its trade-print execution replay estimates what your order sizes would have paid. Pass the depth bands to add a coarse depth-band cost (not level by level, and no queue position).

from deptho import datasets as bn

depth = bn.read_bookdepth("BTCUSDT-bookDepth-2026-09-30.zip")    # wide: one column per ±% level
trades = bn.read_aggtrades("BTCUSDT-aggTrades-2026-09-30.zip")   # price, qty, aggressor side

Related