BitMEX Liquidation Dataset
BitMEX Historical Liquidation Data
BitMEX forced-liquidation events as published on the venue's public feed, with side, price, and quantity, normalized for cross-venue research.
No credit card · The sample is one real hourly Parquet file and needs no API key
Sample
See the data before you sign up
The first rows of one real hour: XBTUSDT on BitMEX, 2026-09-01 at 12:00 UTC. One row per forced liquidation order.
bitmex/2026-09-01/12/XBTUSDT_liquidations.parquetDownload full file| received_time | event_time | symbol | side | order_type | time_in_force | quantity | price | average_price | order_status | last_filled_quantity | filled_quantity | trade_time |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1788264086784605200 | 1788264086784605200 | XBTUSDT | SELL | Market | IOC | 14800 | 78007 | 78007 | FILLED | 14800 | 14800 | 1788264086784605200 |
| 1788264096787274472 | 1788264096787274472 | XBTUSDT | SELL | Market | IOC | 14800 | 78007 | 78007 | FILLED | 14800 | 14800 | 1788264096787274472 |
Wire format
From exchange message to Parquet row
Every row starts as a message on the exchange's WebSocket or REST API. Point at a line or a column to see where each value comes from and how we convert it. Our test suite replays these messages through the production pipeline, so the rows shown are the rows you download.
BitMEX (historical)
Reconstructed: BitMEX is closed, and it is not possible to capture its feed now.
Exchange sends
WebSocket message (reconstructed) · liquidation:<symbol>received 2026-09-01 12:01:26.784605 UTC
{"table": "liquidation","action": "insert","data": [{"symbol": "XBTUSDT","side": "Sell","price": 78007,"leavesQty": 14800}]}
Shortened: BitMEX also sent the orderID of the order (the key of the table). We do not publish it, thus the example does not show it.
You download
Parquet row · liquidations
Point at a line in the message or a column in the row to trace where each value comes from. Click a column to pin it.
Rebuilt from published rows; the exchange has closed
All BitMEX (historical) mapping rules →Conventions for every exchange are in the wire formats overview. Column types and units for liquidation data are in the schema below.
Use cases
What you can build with liquidation data
- Liquidation cascades
- Detect clusters of forced orders and study how they propagate through price and across venues.
- Long vs. short pressure
- Separate liquidated longs from liquidated shorts by side to measure which positioning is being flushed out.
- Risk and event studies
- Align liquidation bursts with trades, funding, and open interest to explain sharp moves after the fact.
Coverage
Liquidation coverage
Every venue is stored under its own exchange ID, so spot and derivatives never mix. Bars show each venue's history from its first hourly file to today, or to its last file for a venue that is no longer collected. Symbol counts are live from the symbols API.
| Venue | Exchange ID | Market | History | Liquidation symbols |
|---|---|---|---|---|
| bitmex | Futures | 2025-09-29 to 2026-09-2212 mo | 112 |
Other exchanges
Liquidations data on other exchanges
The same schema on every venue, so switching exchange is a one-argument change.
Or compare every venue on the cross-exchange liquidation overview.
Schema · 13 columns
Normalized liquidation schema
Every liquidation row is a forced order as published on the exchange's public feed, with side, price, quantity, and timing fields. Order type and fill-state fields are placeholders on venues that do not publish them.
| Column | Type | Description |
|---|---|---|
| received_time | INT64 | Unix timestamp (nanoseconds) when our system received the liquidation event |
| event_time | INT64 | Unix timestamp when the exchange generated the event (the time unit changes with the exchange) |
| symbol | STRING | Trading pair symbol (for example, 'BTCUSDT') |
| side | STRING | Side of the liquidation order ("BUY" = the exchange liquidated a short position, "SELL" = the exchange liquidated a long position) |
| order_type | STRING | Type of liquidation order (for example, "MARKET", "LIMIT"), if the venue publishes it. On venues that do not publish it (for example, Bybit and OKX), it is a fixed placeholder |
| time_in_force | STRING | Time-in-force policy of the order (for example, "IOC", "FOK", "GTC"), if the venue publishes it. If not, it is a fixed placeholder |
| quantity | STRING | Total order quantity that the exchange liquidates (stored as string for precision). OKX sizes are in contracts (refer to the venue notes) |
| price | STRING | Liquidation order price (stored as string for precision). Bybit and OKX publish the bankruptcy price |
| average_price | STRING | Average execution price, if the venue publishes it, for example Binance and Aster (stored as string for precision). Bybit and OKX repeat the bankruptcy price here. It is not an execution price |
| order_status | STRING | Status of the liquidation order (for example, "FILLED", "PARTIALLY_FILLED"), if the venue publishes it. On Bybit and OKX, it is a fixed "FILLED" placeholder and not an execution status |
| last_filled_quantity | STRING | Quantity filled in the most recent execution (stored as string for precision) |
| filled_quantity | STRING | Total quantity filled until now (stored as string for precision) |
| trade_time | INT64 | Unix timestamp when the liquidation trade occurred |
Quickstart
From pip install to DataFrame in a minute
The example loads XBTUSDT from BitMEX for 2026-09-01. Change the symbol, exchange, or dates to pull any other slice of the archive.
Install the Python SDK
pip install cryptohftdataCreate a free API key
Sign up with email or Google, then generate a key from your dashboard. No credit card.
Create accountCall get_liquidations()
Paste the snippet, replace YOUR_API_KEY, and you get a pandas DataFrame with the columns listed above.
import cryptohftdata as chd
client = chd.CryptoHFTDataClient(api_key="YOUR_API_KEY")
df = client.get_liquidations(
symbol="XBTUSDT",
exchange=chd.exchanges.BITMEX,
start_date="2026-09-01",
end_date="2026-09-01",
)
print(df.head())
print(f"Liquidations: {len(df):,}")curl --fail --location \
"https://api.cryptohftdata.com/download?file=bitmex/2026-09-01/12/XBTUSDT_liquidations.parquet" \
-o XBTUSDT_liquidations_12.parquetCaveats
Know this before you backtest
Exchange feeds differ in subtle ways. These are the details that matter for accurate backtests, replay pipelines, and features. Missing hours and pending corrections for every venue are listed on Known Gaps & Corrections.
Liquidations cover derivatives venues only; spot markets do not produce liquidation events.
Exchanges control what they broadcast. Binance and Aster push at most one liquidation snapshot per symbol per second (the latest within each 1,000 ms window), so their rows are a sample and totals are a lower bound.
Bybit and OKX publish the bankruptcy price, not an average execution price; their order status fields are placeholders, not execution status.
OKX can deliver liquidations hours late (up to about 4 hours observed). Files are keyed by arrival hour, so a liquidation can sit in a later hour's file than its event_time.
Hourly liquidation files exist only for hours in which the venue published at least one liquidation event for that symbol.
About 95 % of BitMEX liquidations appear twice, roughly 5 seconds apart, and event_time and trade_time are in nanoseconds rather than milliseconds; a correction is planned.
This page covers 2025-09-29 to 2026-09-22. The exchange has closed, so no new hourly files are published; the existing files remain downloadable.
FAQ
Frequently asked questions
Is BitMEX liquidation data free to download?
Yes. A free CryptoHFTData account with no credit card gives API access to BitMEX liquidation data and every other dataset. Individual hourly files can also be downloaded without an API key on the rate-limited free tier.
How far back does BitMEX liquidation data go?
The hourly files run from 2025-09-29 to 2026-09-22. The exchange has closed, so no new files are added, but the existing files remain downloadable.
What format are the files in?
Each file holds one symbol for one UTC hour, stored as Zstd-compressed Parquet under {exchange_id}/{YYYY-MM-DD}/{HH}/{SYMBOL}_liquidations.parquet. Parquet reads directly into pandas, Polars, DuckDB, and Arrow.
How do I load BitMEX liquidation data in Python?
Install the SDK with pip install cryptohftdata, create a client with your API key, and call client.get_liquidations() with a symbol, exchange, and date range. It returns a pandas DataFrame.
Does the data capture every liquidation?
No. It captures what each exchange publishes on its public liquidation feed. Binance and Aster push at most one liquidation per symbol per second (the latest in each window), so their rows are a sample and totals are a lower bound on actual liquidation volume.
Start using liquidation data today.
One free API key covers every exchange and every data type. $0.00.