BitMEX (historical) wire format
How BitMEX messages become rows in our Parquet files. Each data type below shows a message next to the rows we publish for it, with the source and the rule for every column. Hover a line or a column to see how they connect.
Historical dataset
BitMEX (historical) is no longer collected. Its exchange has closed, so the messages below are rebuilt from published rows and the exchange's documented message format, and were checked against the last version of our collector. See Known Gaps & Corrections.
BitMEX settled its perpetual contracts on 2026-09-16 at 12:00 UTC, and our collection stopped on 2026-09-22. The WebSocket still accepts subscriptions, but every table is empty. In the examples, trade objects are BitMEX's REST records of the same trades; all other values come from our published rows. Fields that are not in our published data are left out. Each message's action is inferred from the rows: rows that share a receive time arrived in one message, and a row with the full instrument state came from a partial. The collector subscribed to orderBookL2:<symbol>, trade:<symbol>, instrument:<symbol> and liquidation:<symbol> on separate connections, and stored every message as it arrived. BitMEX sends numbers as JSON numbers; the pipeline read them as 64-bit floats and wrote them as shortest decimal strings.
- Public WebSocket (one connection per table: orderBookL2, trade, instrument, liquidation):
wss://ws.bitmex.com/realtime
Exchange API reference: www.bitmex.com. Conventions shared by every exchange are on the wire formats overview.
Trades
One row per trade from the trade table.
- WebSocket trade:<symbol>
Trade (XBTUSDT)
Reconstructed: BitMEX has closed and its feed can no longer be captured. The trade object is BitMEX's REST record of this trade (GET /api/v1/trade), byte for byte; BitMEX documents WebSocket rows as identical in structure to REST rows. The table/action wrapper follows BitMEX's documented WebSocket format.
{"table": "trade","action": "insert","data": [{"timestamp": "2026-09-02T12:06:40.251Z",→ event_time · trade_time"symbol": "XBTUSDT",→ symbol"side": "Sell",→ is_buyer_maker"size": 100000,→ quantity"price": 76674.4,→ price"tickDirection": "PlusTick","trdMatchID": "00000000-006d-1000-0000-00367d7e88f4",→ trade_id"grossValue": 7667440000,"homeNotional": 0.1,"foreignNotional": 7667.44,"trdType": "Regular","pool": "Secondary"}]}
Published row
timestamp. Milliseconds.trdMatchID UUID (Rust DefaultHasher, SipHash-1-3 with zero keys over the UUID's bytes followed by 0xFF, top bit cleared). To match BitMEX's trade history, hash its trdMatchID the same way.76270).size, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT, so 100000 is 0.1 XBT (BitMEX's homeNotional).event_time. Milliseconds.true when side is Sell (the taker sold), false when it is Buy.Market. BitMEX does not send an order type for trades.Two trades in one message (XBTUSD, inverse)
Reconstructed: BitMEX has closed and its feed can no longer be captured. The trade objects are BitMEX's REST records of these trades; one insert frame carried both, because both rows share one receive time.
{"table": "trade","action": "insert","data": [{"timestamp": "2026-09-02T12:56:49.947Z",→ event_time · trade_time"symbol": "XBTUSD",→ symbol"side": "Sell",→ is_buyer_maker"size": 3000,→ quantity"price": 76591.5,→ price"tickDirection": "MinusTick","trdMatchID": "00000000-006d-1000-0000-00367d8ab963",→ trade_id"grossValue": 3916890,"homeNotional": 0.0391689,"foreignNotional": 3000,"trdType": "Regular","pool": "Primary"},{"timestamp": "2026-09-02T12:56:49.947Z",→ event_time · trade_time"symbol": "XBTUSD",→ symbol"side": "Sell",→ is_buyer_maker"size": 800,→ quantity"price": 76584.8,→ price"tickDirection": "MinusTick","trdMatchID": "00000000-006d-1000-0000-00367d8ab964",→ trade_id"grossValue": 1044592,"homeNotional": 0.01044592,"foreignNotional": 800,"trdType": "Regular","pool": "Secondary"}]}
Published rows · 2
timestamp. Milliseconds.trdMatchID UUID (Rust DefaultHasher, SipHash-1-3 with zero keys over the UUID's bytes followed by 0xFF, top bit cleared). To match BitMEX's trade history, hash its trdMatchID the same way.76270).size. XBTUSD is an inverse contract: size is in USD contracts (1 contract = 1 USD), so 3000 is 3,000 USD; the BTC amount is BitMEX's homeNotional, which is not published.event_time. Milliseconds.true when side is Sell (the taker sold), false when it is Buy.Market. BitMEX does not send an order type for trades.Trades repeated in the subscription partial
Reconstructed: BitMEX has closed and its feed can no longer be captured. After every (re)connect, BitMEX answers the subscription with a partial that repeats recent trades. The collector stored them like new trades. In this hour both rows below share one receive time, so they arrived in one frame: the 11:11:32 trade had already been published in the 11:00 file, and is published again here. The trade objects are BitMEX's REST records; keys, types and filter are copied from a trade partial BitMEX sent on 2026-10-05. The order of the two trades in the original frame is not known.
{"table": "trade","action": "partial","keys": [],"types": {"timestamp": "timestamp","symbol": "symbol","side": "symbol","size": "long","price": "float","tickDirection": "symbol","trdMatchID": "guid","grossValue": "long","homeNotional": "float","foreignNotional": "float","trdType": "symbol","pool": "symbol"},"filter": {"pool": "Aggregated","symbol": "XBTUSDT"},"data": [{"timestamp": "2026-09-02T11:11:32.933Z",→ event_time · trade_time"symbol": "XBTUSDT",→ symbol"side": "Buy",→ is_buyer_maker"size": 10000,→ quantity"price": 76607.6,→ price"tickDirection": "PlusTick","trdMatchID": "00000000-006d-1000-0000-00367d690e16",→ trade_id"grossValue": 766076000,"homeNotional": 0.01,"foreignNotional": 766.076,"trdType": "Regular","pool": "Secondary"},{"timestamp": "2026-09-02T12:02:35.598Z",→ event_time · trade_time"symbol": "XBTUSDT",→ symbol"side": "Buy",→ is_buyer_maker"size": 20000,→ quantity"price": 76820.1,→ price"tickDirection": "PlusTick","trdMatchID": "00000000-006d-1000-0000-00367d7d57d7",→ trade_id"grossValue": 1536402000,"homeNotional": 0.02,"foreignNotional": 1536.402,"trdType": "Regular","pool": "Primary"}]}
Published rows · 2
timestamp. Milliseconds.trdMatchID UUID (Rust DefaultHasher, SipHash-1-3 with zero keys over the UUID's bytes followed by 0xFF, top bit cleared). To match BitMEX's trade history, hash its trdMatchID the same way.76270).size, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT, so 100000 is 0.1 XBT (BitMEX's homeNotional).event_time. Milliseconds.true when side is Sell (the taker sold), false when it is Buy.Market. BitMEX does not send an order type for trades.Settlement at expiry (no side)
Reconstructed: BitMEX has closed and its feed can no longer be captured. The trade object is BitMEX's REST record. When BitMEX settled XBTUSDT on 2026-09-16 at 12:00 UTC it published Settlement trades that have no side. The pipeline does not read trdType, so they are published as ordinary trades.
{"table": "trade","action": "insert","data": [{"timestamp": "2026-09-16T12:00:00.000Z",→ event_time · trade_time"symbol": "XBTUSDT",→ symbol"size": 3618200,→ quantity"price": 76152.5,→ price"tickDirection": "ZeroMinusTick","trdMatchID": "00000000-0079-1000-0000-0000669ebc65",→ trade_id"grossValue": 275534975500,"homeNotional": 3.6182,"foreignNotional": 275534.9755,"trdType": "Settlement","pool": "Primary"}]}
Published row
timestamp. Milliseconds.trdMatchID UUID (Rust DefaultHasher, SipHash-1-3 with zero keys over the UUID's bytes followed by 0xFF, top bit cleared). To match BitMEX's trade history, hash its trdMatchID the same way.76270).size, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT, so 100000 is 0.1 XBT (BitMEX's homeNotional).event_time. Milliseconds.false: settlement trades have no side, and a missing side is read as Buy. The value carries no aggressor information here.Market. BitMEX does not send an order type for trades.Notes
- Sizes are raw per-instrument units, not base asset: XBTUSD in USD contracts, XBTUSDT in 0.000001 XBT, ETHUSDT in 0.00001 ETH, spot pairs in 0.00000001 of the base asset. Check the instrument's multiplier before comparing with other venues.
- Trades are deduplicated only within an hour file. A trade repeated in a
partialafter a reconnect is published again if its first copy is in an earlier hour; deduplicate history on (symbol,trade_id). - On liquid days, 5–20 % of trades are missing compared with BitMEX's own trade history; see Known Gaps & Corrections.
trdTypeis not published:Regulartrades andSettlementtrades at expiry look the same.
Column types and descriptions: Trades schema.
Order Book
One row per price level. A partial after every (re)connect gives the whole book as snapshot rows; insert, update and delete messages become update rows.
- WebSocket orderBookL2:<symbol>
Partial (book image after subscribing)
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sends a partial with the whole book after every (re)connect. Each level becomes one snapshot row. keys, types and filter are copied from an orderBookL2 partial BitMEX sent on 2026-10-05.
Abridged: The original partial had 132 levels (99 bids, 33 asks); the two best asks and two best bids are shown, in the original order. BitMEX also sent timestamp and transactTime on every level; they are not published, so they are left out.
{"table": "orderBookL2","action": "partial",→ event_type"keys": ["symbol", "id", "side"],"types": {"symbol": "symbol","id": "long","side": "symbol","size": "long","price": "float","pool": "symbol","timestamp": "timestamp","transactTime": "timestamp"},"filter": {"pool": "Aggregated","symbol": "XBTUSDT"},"data": [{"symbol": "XBTUSDT",→ symbol"id": 234034598936,→ first_update_id · final_update_id · last_update_id"side": "Sell",→ side"size": 291100,→ quantity"price": 76824.2→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034600390,→ first_update_id · final_update_id · last_update_id"side": "Sell",→ side"size": 267100,→ quantity"price": 76822.4→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034599815,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 6778700,→ quantity"price": 76754.1→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034599842,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 1900,→ quantity"price": 76745.9→ price}]}
Published rows · 4
received_time. BitMEX's per-level timestamp is not published.transactTime is not published.snapshot for a partial message.first_update_id.first_update_id.bid for Buy, ask for Sell. One row per level.76754.1), so whole prices have no decimal point (240430).size: the level's new total, in raw instrument units (XBTUSDT: 1 = 0.000001 XBT).Insert (new levels)
Reconstructed: BitMEX has closed and its feed can no longer be captured.
Abridged: BitMEX also sent timestamp and transactTime on every level; they are not published, so they are left out.
{"table": "orderBookL2","action": "insert",→ event_type"data": [{"symbol": "XBTUSDT",→ symbol"id": 234034541763,→ first_update_id · final_update_id · last_update_id"side": "Sell",→ side"size": 266900,→ quantity"price": 76863.7→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034541208,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 6775200,→ quantity"price": 76796.6→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034541214,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 1900,→ quantity"price": 76788.9→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034541226,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 8100,→ quantity"price": 76785.1→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034541235,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 3200,→ quantity"price": 76787.4→ price}]}
Published rows · 5
received_time. BitMEX's per-level timestamp is not published.transactTime is not published.update for insert, update and delete messages alike.first_update_id.first_update_id.bid for Buy, ask for Sell. One row per level.76754.1), so whole prices have no decimal point (240430).size: the level's new total, in raw instrument units (XBTUSDT: 1 = 0.000001 XBT).Update (size change at an existing level)
Reconstructed: BitMEX has closed and its feed can no longer be captured. The level is found by id; its new size replaces the old one.
Abridged: BitMEX also sent timestamp and transactTime on every level; they are not published, so they are left out.
{"table": "orderBookL2","action": "update",→ event_type"data": [{"symbol": "XBTUSDT",→ symbol"id": 234034599806,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"size": 11300,→ quantity"price": 76745.5→ price}]}
Published row
received_time. BitMEX's per-level timestamp is not published.transactTime is not published.update for insert, update and delete messages alike.first_update_id.first_update_id.bid for Buy, ask for Sell. One row per level.76754.1), so whole prices have no decimal point (240430).size: the level's new total, in raw instrument units (XBTUSDT: 1 = 0.000001 XBT).Delete (levels removed)
Reconstructed: BitMEX has closed and its feed can no longer be captured. Delete rows carry no size; the pipeline writes quantity 0.
Abridged: BitMEX also sent timestamp and transactTime on every level; they are not published, so they are left out.
{"table": "orderBookL2","action": "delete",→ event_type"data": [{"symbol": "XBTUSDT",→ symbol"id": 234034541192,→ first_update_id · final_update_id · last_update_id"side": "Sell",→ side"price": 76864.3→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034540919,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"price": 76778.2→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034540922,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"price": 76774.8→ price},{"symbol": "XBTUSDT",→ symbol"id": 234034541040,→ first_update_id · final_update_id · last_update_id"side": "Buy",→ side"price": 76787.1→ price}]}
Published rows · 4
received_time. BitMEX's per-level timestamp is not published.transactTime is not published.update for insert, update and delete messages alike.first_update_id.first_update_id.bid for Buy, ask for Sell. One row per level.76754.1), so whole prices have no decimal point (240430).0 for every level of a delete message: the level is removed.Notes
- Apply rows by level ID (
last_update_id), not by price: anupdaterow sets the size of the level with that ID, and quantity0removes it. IDs are not sequence numbers, so gaps cannot be detected from them. - Files do not start with a checkpoint of the book. Continue from the previous hour's book, or start at the next
snapshotrows. event_timeis our receive time in nanoseconds, likereceived_time.- Sizes are raw per-instrument units, not base asset: XBTUSD in USD contracts, XBTUSDT in 0.000001 XBT, ETHUSDT in 0.00001 ETH, spot pairs in 0.00000001 of the base asset. Check the instrument's multiplier before comparing with other venues.
Column types and descriptions: Order Book schema.
Ticker
One row per instrument message.
- WebSocket instrument:<symbol>
Partial (full instrument state after subscribing)
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sends a partial with every instrument field after every (re)connect; this is the only kind of message that carries every field the pipeline reads. keys, types and filter are copied from an instrument partial BitMEX sent on 2026-10-05.
Abridged: A partial carries every instrument field (the types header lists 100). Only the fields the pipeline reads are shown; the others are not in our published data.
{"table": "instrument","action": "partial","keys": ["symbol"],"types": {"symbol": "symbol","rootSymbol": "symbol","instrumentID": "int","state": "symbol","typ": "symbol","listing": "timestamp","front": "timestamp","expiry": "timestamp","settle": "timestamp","listedSettle": "timestamp","relistInterval": "timespan","positionCurrency": "symbol","underlying": "symbol","quoteCurrency": "symbol","underlyingSymbol": "symbol","reference": "symbol","referenceSymbol": "symbol","calcInterval": "timespan","publishInterval": "timespan","publishTime": "timespan","maxOrderQty": "long","minPrice": "float","maxPrice": "float","lotSize": "long","tickSize": "float","multiplier": "long","settlCurrency": "symbol","underlyingToPositionMultiplier": "long","underlyingToSettleMultiplier": "long","quoteToSettleMultiplier": "long","isQuanto": "boolean","isInverse": "boolean","initMargin": "float","maintMargin": "float","riskLimit": "long","riskStep": "long","limit": "float","taxed": "boolean","deleverage": "boolean","makerFee": "float","takerFee": "float","settlementFee": "float","fundingBaseSymbol": "symbol","fundingQuoteSymbol": "symbol","fundingPremiumSymbol": "symbol","fundingTimestamp": "timestamp","fundingInterval": "timespan","fundingRate": "float","indicativeFundingRate": "float","rebalanceTimestamp": "timestamp","rebalanceInterval": "timespan","launchingTimestamp": "timestamp","prevClosePrice": "float","limitDownPrice": "float","limitUpPrice": "float","prevTotalVolume": "long","totalVolume": "long","volume": "long","volume24h": "long","prevTotalTurnover": "long","totalTurnover": "long","turnover": "long","turnover24h": "long","homeNotional24h": "float","foreignNotional24h": "float","prevPrice24h": "float","vwap": "float","highPrice": "float","lowPrice": "float","lastPrice": "float","lastPriceProtected": "float","lastTickDirection": "symbol","lastChangePcnt": "float","bidPrice": "float","midPrice": "float","askPrice": "float","impactBidPrice": "float","impactMidPrice": "float","impactAskPrice": "float","hasLiquidity": "boolean","openInterest": "long","openValue": "long","fairMethod": "symbol","fairBasisRate": "float","fairBasis": "float","fairPrice": "float","markMethod": "symbol","markPrice": "float","referencePrice": "float","indicativeSettlePrice": "float","settledPriceAdjustmentRate": "float","settledPrice": "float","instantPnl": "boolean","minTick": "float","fundingBaseRate": "float","fundingQuoteRate": "float","farLegSymbol": "symbol","nearLegSymbol": "symbol","tags": "symbol","timestamp": "timestamp"},"filter": {"symbol": "XBTUSDT"},"data": [{"symbol": "XBTUSDT",→ symbol"fundingTimestamp": "2026-09-02T20:00:00.000Z","fundingRate": 0.0001,"volume24h": 6131600,→ base_asset_volume"turnover24h": 473010789790,→ quote_asset_volume"prevPrice24h": 77932.3,→ price_change · open_price"highPrice": 78375.2,→ high_price"lowPrice": 76270,→ low_price"lastPrice": 76607.6,→ price_change · last_price"lastChangePcnt": -0.0166,→ price_change_percent"openInterest": 60628400,"markPrice": 76820.3,"indicativeSettlePrice": 76812.65,"timestamp": "2026-09-02T12:02:32.653Z"→ event_time}]}
Published row
timestamp. Milliseconds.lastPrice − prevPrice24h, computed in 64-bit floats, so it can carry float noise (-1324.699999999997). Null unless the message has both fields.lastChangePcnt × 100, in percent: BitMEX sends a fraction (-0.0166 becomes -1.66). Computed in 64-bit floats, so it can carry float noise (-1.6099999999999999).vwap is not published.lastPrice.prevPrice24h, the price 24 hours earlier.highPrice.lowPrice.volume24h, in raw instrument units, not base asset: for XBTUSDT 1 = 0.000001 XBT (6131600 is 6.1316 XBT).turnover24h, in BitMEX's settlement units: for XBTUSDT 1 = 0.000001 USDT (473010789790 is about 473,011 USDT).Update after a trade
Reconstructed: BitMEX has closed and its feed can no longer be captured. Updates carry only the fields that changed. Columns whose fields are absent are null, not carried forward.
Abridged: Only the fields the pipeline reads are shown. Other fields are not in our published data, so any others BitMEX sent in this message are unknown.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"lastPrice": 76820.1,→ price_change · last_price"lastChangePcnt": -0.0143,→ price_change_percent"timestamp": "2026-09-02T12:02:35.599Z"→ event_time}]}
Published row
timestamp. Milliseconds.lastPrice − prevPrice24h, computed in 64-bit floats, so it can carry float noise (-1324.699999999997). Null unless the message has both fields.lastChangePcnt × 100, in percent: BitMEX sends a fraction (-0.0166 becomes -1.66). Computed in 64-bit floats, so it can carry float noise (-1.6099999999999999).vwap is not published.lastPrice.prevPrice24h, the price 24 hours earlier.highPrice.lowPrice.volume24h, in raw instrument units, not base asset: for XBTUSDT 1 = 0.000001 XBT (6131600 is 6.1316 XBT).turnover24h, in BitMEX's settlement units: for XBTUSDT 1 = 0.000001 USDT (473010789790 is about 473,011 USDT).Update with no ticker fields
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sent fields in this update that the pipeline does not read; which fields they were is not in our published data, so only symbol and timestamp are shown. The message still produces a row in all three files, with every value null.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"timestamp": "2026-09-02T12:02:32.653Z"→ event_time}]}
Published row
timestamp. Milliseconds.lastPrice − prevPrice24h, computed in 64-bit floats, so it can carry float noise (-1324.699999999997). Null unless the message has both fields.lastChangePcnt × 100, in percent: BitMEX sends a fraction (-0.0166 becomes -1.66). Computed in 64-bit floats, so it can carry float noise (-1.6099999999999999).vwap is not published.lastPrice.prevPrice24h, the price 24 hours earlier.highPrice.lowPrice.volume24h, in raw instrument units, not base asset: for XBTUSDT 1 = 0.000001 XBT (6131600 is 6.1316 XBT).turnover24h, in BitMEX's settlement units: for XBTUSDT 1 = 0.000001 USDT (473010789790 is about 473,011 USDT).Notes
- The
instrumenttable feeds the ticker, mark price and open interest files: every message becomes one row in each of the three, with the samereceived_time. - BitMEX sends only changed fields, and the pipeline does not carry values forward. Most rows are null in every value column (XBTUSDT, 2026-09-02 12:00 UTC: 2,085 of 2,101 rows). Forward-fill per symbol, starting from a
partialrow.
Column types and descriptions: Ticker schema.
Mark Price
One row per instrument message.
- WebSocket instrument:<symbol>
Partial (full instrument state after subscribing)
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sends a partial with every instrument field after every (re)connect; this is the only kind of message that carries every field the pipeline reads. keys, types and filter are copied from an instrument partial BitMEX sent on 2026-10-05.
Abridged: A partial carries every instrument field (the types header lists 100). Only the fields the pipeline reads are shown; the others are not in our published data.
{"table": "instrument","action": "partial","keys": ["symbol"],"types": {"symbol": "symbol","rootSymbol": "symbol","instrumentID": "int","state": "symbol","typ": "symbol","listing": "timestamp","front": "timestamp","expiry": "timestamp","settle": "timestamp","listedSettle": "timestamp","relistInterval": "timespan","positionCurrency": "symbol","underlying": "symbol","quoteCurrency": "symbol","underlyingSymbol": "symbol","reference": "symbol","referenceSymbol": "symbol","calcInterval": "timespan","publishInterval": "timespan","publishTime": "timespan","maxOrderQty": "long","minPrice": "float","maxPrice": "float","lotSize": "long","tickSize": "float","multiplier": "long","settlCurrency": "symbol","underlyingToPositionMultiplier": "long","underlyingToSettleMultiplier": "long","quoteToSettleMultiplier": "long","isQuanto": "boolean","isInverse": "boolean","initMargin": "float","maintMargin": "float","riskLimit": "long","riskStep": "long","limit": "float","taxed": "boolean","deleverage": "boolean","makerFee": "float","takerFee": "float","settlementFee": "float","fundingBaseSymbol": "symbol","fundingQuoteSymbol": "symbol","fundingPremiumSymbol": "symbol","fundingTimestamp": "timestamp","fundingInterval": "timespan","fundingRate": "float","indicativeFundingRate": "float","rebalanceTimestamp": "timestamp","rebalanceInterval": "timespan","launchingTimestamp": "timestamp","prevClosePrice": "float","limitDownPrice": "float","limitUpPrice": "float","prevTotalVolume": "long","totalVolume": "long","volume": "long","volume24h": "long","prevTotalTurnover": "long","totalTurnover": "long","turnover": "long","turnover24h": "long","homeNotional24h": "float","foreignNotional24h": "float","prevPrice24h": "float","vwap": "float","highPrice": "float","lowPrice": "float","lastPrice": "float","lastPriceProtected": "float","lastTickDirection": "symbol","lastChangePcnt": "float","bidPrice": "float","midPrice": "float","askPrice": "float","impactBidPrice": "float","impactMidPrice": "float","impactAskPrice": "float","hasLiquidity": "boolean","openInterest": "long","openValue": "long","fairMethod": "symbol","fairBasisRate": "float","fairBasis": "float","fairPrice": "float","markMethod": "symbol","markPrice": "float","referencePrice": "float","indicativeSettlePrice": "float","settledPriceAdjustmentRate": "float","settledPrice": "float","instantPnl": "boolean","minTick": "float","fundingBaseRate": "float","fundingQuoteRate": "float","farLegSymbol": "symbol","nearLegSymbol": "symbol","tags": "symbol","timestamp": "timestamp"},"filter": {"symbol": "XBTUSDT"},"data": [{"symbol": "XBTUSDT",→ symbol"fundingTimestamp": "2026-09-02T20:00:00.000Z",→ next_funding_time"fundingRate": 0.0001,→ funding_rate"volume24h": 6131600,"turnover24h": 473010789790,"prevPrice24h": 77932.3,"highPrice": 78375.2,"lowPrice": 76270,"lastPrice": 76607.6,"lastChangePcnt": -0.0166,"openInterest": 60628400,"markPrice": 76820.3,→ mark_price"indicativeSettlePrice": 76812.65,→ estimated_settle_price"timestamp": "2026-09-02T12:02:32.653Z"→ event_time}]}
Published row
timestamp. Milliseconds.markPrice. Null when the message has no markPrice.indicativeSettlePrice. Null when the message does not carry it.fundingRate. A fraction per funding period (8 hours for XBTUSDT): 0.0001 is 0.01 %. Null when the message does not carry it.fundingTimestamp, the next funding time. Milliseconds. Null when the message does not carry it.Mark price at the funding time
Reconstructed: BitMEX has closed and its feed can no longer be captured. At the 12:00 UTC funding time, the update carried a new markPrice and the next fundingTimestamp.
Abridged: Only the fields the pipeline reads are shown. Other fields are not in our published data, so any others BitMEX sent in this message are unknown.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"fundingTimestamp": "2026-09-02T20:00:00.000Z",→ next_funding_time"markPrice": 76837.13,→ mark_price"timestamp": "2026-09-02T12:00:00.000Z"→ event_time}]}
Published row
timestamp. Milliseconds.markPrice. Null when the message has no markPrice.indicativeSettlePrice. Null when the message does not carry it.fundingRate. A fraction per funding period (8 hours for XBTUSDT): 0.0001 is 0.01 %. Null when the message does not carry it.fundingTimestamp, the next funding time. Milliseconds. Null when the message does not carry it.Indicative settle price update
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sends markPrice and indicativeSettlePrice in separate updates, so each row has one of them and the other is null.
Abridged: Only the fields the pipeline reads are shown. Other fields are not in our published data, so any others BitMEX sent in this message are unknown.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"indicativeSettlePrice": 76827.79,→ estimated_settle_price"timestamp": "2026-09-02T12:00:00.057Z"→ event_time}]}
Published row
timestamp. Milliseconds.markPrice. Null when the message has no markPrice.indicativeSettlePrice. Null when the message does not carry it.fundingRate. A fraction per funding period (8 hours for XBTUSDT): 0.0001 is 0.01 %. Null when the message does not carry it.fundingTimestamp, the next funding time. Milliseconds. Null when the message does not carry it.Notes
- The same
instrumentmessages also produce the ticker and open interest rows. - BitMEX sends only changed fields, and the pipeline does not carry values forward. Most rows have only
mark_price, onlyestimated_settle_priceor no value at all (XBTUSDT, 2026-09-02 12:00 UTC: 684, 685 and 729 of 2,101 rows). Forward-fill per symbol.
Column types and descriptions: Mark Price schema.
Open Interest
One row per instrument message.
- WebSocket instrument:<symbol>
Partial (full instrument state after subscribing)
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sends a partial with every instrument field after every (re)connect; this is the only kind of message that carries every field the pipeline reads. keys, types and filter are copied from an instrument partial BitMEX sent on 2026-10-05.
Abridged: A partial carries every instrument field (the types header lists 100). Only the fields the pipeline reads are shown; the others are not in our published data.
{"table": "instrument","action": "partial","keys": ["symbol"],"types": {"symbol": "symbol","rootSymbol": "symbol","instrumentID": "int","state": "symbol","typ": "symbol","listing": "timestamp","front": "timestamp","expiry": "timestamp","settle": "timestamp","listedSettle": "timestamp","relistInterval": "timespan","positionCurrency": "symbol","underlying": "symbol","quoteCurrency": "symbol","underlyingSymbol": "symbol","reference": "symbol","referenceSymbol": "symbol","calcInterval": "timespan","publishInterval": "timespan","publishTime": "timespan","maxOrderQty": "long","minPrice": "float","maxPrice": "float","lotSize": "long","tickSize": "float","multiplier": "long","settlCurrency": "symbol","underlyingToPositionMultiplier": "long","underlyingToSettleMultiplier": "long","quoteToSettleMultiplier": "long","isQuanto": "boolean","isInverse": "boolean","initMargin": "float","maintMargin": "float","riskLimit": "long","riskStep": "long","limit": "float","taxed": "boolean","deleverage": "boolean","makerFee": "float","takerFee": "float","settlementFee": "float","fundingBaseSymbol": "symbol","fundingQuoteSymbol": "symbol","fundingPremiumSymbol": "symbol","fundingTimestamp": "timestamp","fundingInterval": "timespan","fundingRate": "float","indicativeFundingRate": "float","rebalanceTimestamp": "timestamp","rebalanceInterval": "timespan","launchingTimestamp": "timestamp","prevClosePrice": "float","limitDownPrice": "float","limitUpPrice": "float","prevTotalVolume": "long","totalVolume": "long","volume": "long","volume24h": "long","prevTotalTurnover": "long","totalTurnover": "long","turnover": "long","turnover24h": "long","homeNotional24h": "float","foreignNotional24h": "float","prevPrice24h": "float","vwap": "float","highPrice": "float","lowPrice": "float","lastPrice": "float","lastPriceProtected": "float","lastTickDirection": "symbol","lastChangePcnt": "float","bidPrice": "float","midPrice": "float","askPrice": "float","impactBidPrice": "float","impactMidPrice": "float","impactAskPrice": "float","hasLiquidity": "boolean","openInterest": "long","openValue": "long","fairMethod": "symbol","fairBasisRate": "float","fairBasis": "float","fairPrice": "float","markMethod": "symbol","markPrice": "float","referencePrice": "float","indicativeSettlePrice": "float","settledPriceAdjustmentRate": "float","settledPrice": "float","instantPnl": "boolean","minTick": "float","fundingBaseRate": "float","fundingQuoteRate": "float","farLegSymbol": "symbol","nearLegSymbol": "symbol","tags": "symbol","timestamp": "timestamp"},"filter": {"symbol": "XBTUSDT"},"data": [{"symbol": "XBTUSDT",→ symbol"fundingTimestamp": "2026-09-02T20:00:00.000Z","fundingRate": 0.0001,"volume24h": 6131600,"turnover24h": 473010789790,"prevPrice24h": 77932.3,"highPrice": 78375.2,"lowPrice": 76270,"lastPrice": 76607.6,"lastChangePcnt": -0.0166,"openInterest": 60628400,→ sum_open_interest"markPrice": 76820.3,"indicativeSettlePrice": 76812.65,"timestamp": "2026-09-02T12:02:32.653Z"→ timestamp}]}
Published row
openInterest, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT (60628400 is 60.6284 XBT). Null when the message has no openInterest.openValue is not published.timestamp. Milliseconds.Open interest update
Reconstructed: BitMEX has closed and its feed can no longer be captured.
Abridged: Only the fields the pipeline reads are shown. Other fields are not in our published data, so any others BitMEX sent in this message are unknown.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"openInterest": 60608400,→ sum_open_interest"timestamp": "2026-09-02T12:02:36.454Z"→ timestamp}]}
Published row
openInterest, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT (60628400 is 60.6284 XBT). Null when the message has no openInterest.openValue is not published.timestamp. Milliseconds.Update without open interest
Reconstructed: BitMEX has closed and its feed can no longer be captured. BitMEX sent fields in this update that the pipeline does not read; which fields they were is not in our published data, so only symbol and timestamp are shown. The message still produces a row in all three files, with every value null.
{"table": "instrument","action": "update","data": [{"symbol": "XBTUSDT",→ symbol"timestamp": "2026-09-02T12:02:32.653Z"→ timestamp}]}
Published row
openInterest, in raw instrument units: for XBTUSDT 1 = 0.000001 XBT (60628400 is 60.6284 XBT). Null when the message has no openInterest.openValue is not published.timestamp. Milliseconds.Notes
- Open interest is null in most rows, because BitMEX sends it only when it changes (XBTUSDT, 2026-09-02 12:00 UTC: 8 of 2,101 rows have a value). Drop null rows and forward-fill.
- Sizes are raw per-instrument units, not base asset: XBTUSD in USD contracts, XBTUSDT in 0.000001 XBT, ETHUSDT in 0.00001 ETH, spot pairs in 0.00000001 of the base asset. Check the instrument's multiplier before comparing with other venues.
Column types and descriptions: Open Interest schema.
Liquidations
One row per row of the liquidation table, which lists liquidation orders as BitMEX enters them into the book.
- WebSocket liquidation:<symbol>
Reconstructed: BitMEX has closed and its feed can no longer be captured.
Abridged: BitMEX also sent the order's orderID (the table's key); it is not published, so it is left out.
{"table": "liquidation","action": "insert","data": [{"symbol": "XBTUSDT",→ symbol"side": "Sell",→ side"price": 78007,→ price · average_price"leavesQty": 14800→ quantity · last_filled_quantity · filled_quantity}]}
Published row
SELL closes a liquidated long, BUY a liquidated short.Market. A placeholder; BitMEX does not send an order type here.IOC. A placeholder; BitMEX does not send a time in force here.leavesQty (the table has no orderQty), in raw instrument units: for XBTUSDT 1 = 0.000001 XBT (14800 is 0.0148 XBT).price. Not an average fill price.FILLED. A placeholder; the message says nothing about fills.quantity. Not a fill.quantity. Not a fill.event_time. Our receive time; milliseconds since the 2026-10-04 correction, nanoseconds before it.Notes
- BitMEX sent a second message for most liquidation orders, a few seconds after the first, with the same side, price and quantity. The collector stored both, so about 95 % of liquidations were published twice. On 2026-10-04 published history was corrected: the second of two identical rows (
symbol,side,price,quantity) within 30 seconds was removed, andevent_timeandtrade_timewere converted from nanoseconds to milliseconds. - The 2026-09-01 12:00 UTC example hour originally had two identical rows, received 10 seconds apart; the second was removed by the correction.
order_type,time_in_forceandorder_statusare placeholders, and the fill columns repeatquantity.- Sizes are raw per-instrument units, not base asset: XBTUSD in USD contracts, XBTUSDT in 0.000001 XBT, ETHUSDT in 0.00001 ETH, spot pairs in 0.00000001 of the base asset. Check the instrument's multiplier before comparing with other venues.
Column types and descriptions: Liquidations schema.