Binance USD-M order book (L2) and tick trade data

Captured diffs from Binance's @depth@100ms stream, captured tick trades and a 1,000-level snapshot every 5 minutes, for 25 USD-M perpetuals. Three capture nodes, one canonical file set per symbol per day, and known gaps on published days listed in the public gap log.

We've been recording Binance's USD-M perpetual order book since 4 June 2026. It started with the ten largest contracts by open interest at the time (BTC, ETH, SOL, DOGE, XRP, BNB, LINK, ADA, AVAX and DOT) and grew to 25 on 26 September 2026. Each of our three capture nodes writes its own copy, and a nightly job merges them into one canonical file set per symbol per day.

This is historical data in daily files, not a live feed. A day's files are built the following morning UTC, checked, and only then published. If you need a stream to trade on, connect to the exchange yourself. If you need to test an execution model, a market-making idea or a fill simulator against what the book really looked like, this is what it's for.

What's in the files

- ✓Book diffs from @depth@100ms, one row per changed price level, with Binance's update IDs (U, u, pu) kept so you can check the chain yourself.

- ✓REST snapshots with 1,000 levels a side, taken every 5 minutes per symbol and again after every reconnect or sequence break.

- ✓Captured tick trades from the @trade stream with its trade ID, aggressor side and, where Binance sends it, the order type field.

- ✓Binance's event and transaction times in milliseconds, plus our receive time in nanoseconds. Trades have had nanosecond receive times since capture began; book files switched from millisecond precision on 26 September 2026.

- ✓Parquet with exact decimals: one book file per hour, one snapshot file per day, one trades file per day, each with a SHA-256 checksum.

Here's what one day weighs. These numbers come from our reconciliation run on 25 September 2026:

A 100 ms stream can carry at most 864,000 events a day, so BTC had an update in about 98% of its slots. Among the 111 full BTC trade days measured in September 2026, 21 August had the largest raw file volume; reconciliation counted 10,565,671 trades that day.

How we capture it

tokyo

Tokyo

tokyo-vultr

Tokyo, on a different provider

singapore

Singapore

Each node holds its own WebSocket connections and writes its own copy. Reconnects happen, and a node sometimes loses a minute to a bad file. On 17 September 2026, for example, singapore lost 60 seconds of ADAUSDT book data at 07:18 UTC. The other two nodes had those updates, so the published day has no hole there.

The merge is strict. Binance numbers every book update, and each update names the one before it (pu equals the previous u). An update from a second node only goes in where that chain stays exactly continuous. Where two or three nodes recorded the same update, their copies have to agree on every price level; one disagreement and the day is held back instead of published. Trades work the same way, keyed by trade ID. Except on the first capture day or at a documented, approved boundary gap, each day's first update must chain onto the previous published day's last update.

When the chain breaks on every node at once, none of our copies has the missing updates, and we don't paper over that. The file starts a new segment, and the break goes into the public gap log. Between 4 June and 4 October 2026, the book update chain broke on all three nodes at once 10 times, the last on 17 September. That adds up to about 29 seconds per symbol over 123 days. Trades had one bigger event: at about 15:28 UTC on 19 August 2026 the trade stream dropped on all three nodes, and 32,153 trade IDs across the first ten symbols are missing, about 4 to 5.5 seconds of trades depending on the symbol. BTCUSDT alone lost 9,337 between 15:28:00.398 and 15:28:04.381. We list known gaps like that one on published days in the public gap log, with their time and size, rather than claiming there aren't any.

The snapshot detail that's easy to get wrong

Binance takes a REST snapshot while the book is moving, and its lastUpdateId often lands in the middle of a diff event, between that event's U and u. We call that a straddle. On 25 September 2026, 848 of 861 BTCUSDT snapshots and 845 of 860 ETHUSDT snapshots did this (counting the REST snapshots all three nodes took). On quieter coins it's lower but still common: 45.7% of DOTUSDT snapshots and 63.3% of ADAUSDT snapshots from 4 June to 4 October 2026.

The fix is simple once you know it: drop diff events whose u is below the snapshot's lastUpdateId, then apply the straddling event in full on top of the snapshot. That's safe because every row sets an absolute quantity, so a level the snapshot already has just gets the same value again. We tag every snapshot clean, straddle or in_gap so you don't have to work it out. We replayed three full hours of BTCUSDT on 25 September and checked the rebuilt book against 103 snapshots from the three nodes. The 3 clean ones matched exactly, on 1,700 to 1,900 levels each, and the 100 straddles matched on every level outside the straddling event. The docs have the rule and a Python replay example.

Coverage

Binance USD-M perpetuals only. Every symbol is quoted in USDT.

We can't backfill order book history: we only have what our nodes recorded at the time. So our archive starts on these dates and grows as additional days pass our publication checks. The public /v1/l2/coverage endpoint returns the current per-symbol range.

Free sample days

Book and trades for the 1st of every month are free to download, for every symbol. You need a CandleFeed account (the free one is fine). Free, Builder and Advanced accounts have a 10 GiB allowance of new sample files per account per UTC calendar month, shared across all account keys. Pro and Enterprise have no monthly byte cap; daily link limits still apply. So far that means 1 July, 1 August, 1 September and 1 October 2026 for the first ten symbols, and 1 October for the fifteen added in September. Capture started on 4 June, so there's no 1 June sample. Sample files come under the same licence as paid data (Terms §5.3): use them internally, and don't republish or share the raw files.

Download the 1 October 2026 BTCUSDT and DOTUSDT book days without an account. The order book docs show the one-line download.

Pricing

Everything in Advanced, plus the full order book and trades archive. We plan to raise the price to $199/mo once the archive holds 12 months of history, around June 2027. If you subscribe before the new price takes effect, you keep $149/mo (or $1,490/yr) for as long as your subscription stays active on the same plan and billing period (Terms §8.7).

Advanced ($99/mo) doesn't include order book or trade files, apart from the free sample days. Students and university researchers can get Pro annual at half price ($745/yr). We approve these by hand, so apply by email. Enterprise starts at $500/mo and adds the raw per-node copies from all three capture nodes, bigger quotas and invoicing.

Getting the files

The API hands out short-lived download links, one per file, each with the file's size and SHA-256. The Python client downloads them and refuses any file whose checksum doesn't match.

from candlefeed import CandleFeed

cf = CandleFeed(api_key="cf_live_...")

# 24 hourly diff files, the snapshot file and the manifest, each checked against its SHA-256

cf.download_l2("book", "BTCUSDT", "2026-09-25", "2026-09-25", "data/")

# One trades file per day

cf.download_l2("trades", "BTCUSDT", "2026-09-25", "2026-09-25", "data/")Then it's plain Parquet:

import pyarrow.parquet as pq

day = "data/book/binance/BTCUSDT/2026-09-25" # the folder download_l2 wrote

snap = pq.read_table(f"{day}/snapshot.parquet").to_pandas()

per_snapshot = snap.groupby("final_update_id")["anchor_class"].first()

print(per_snapshot.value_counts()) # on BTC, nearly all are "straddle"

diffs = pq.read_table(f"{day}/depth/14.parquet")

print(diffs.num_rows) # about 8.99 million level rows for 14:00 UTCThe order book docs cover the schemas, timestamps, checksums, raw HTTP endpoints and a full book replay that handles gaps and straddling snapshots.

If you're weighing this against Tardis

Tardis.dev has far more: 50+ exchanges and Binance USD-M history back to 2019-11-17, against our one venue and 25 symbols: book history from 4 June 2026 and trades from 6 June for ten symbols, with fifteen more added on 26 September 2026. What we offer is a lower price ($149/mo, against $700/mo for their Solo perpetuals plan or $350/mo for their academic plan on quarterly or yearly billing, checked on tardis.dev on 3 October 2026), Binance's own 1,000-level REST snapshot stored every 5 minutes, where Tardis stores one when each WebSocket connection starts and also sells top-25 and top-5 snapshots it rebuilds from the stream (Tardis docs, checked 2026-10-05), a gap log built from three nodes, and the same account that serves our funding, open interest and liquidation data. The full comparison is dated and sourced.