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