Kraken Futures wire format
How Kraken Futures messages become rows in our Parquet files. Each data type below shows a real 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.
Checked against our pipeline
These messages were captured from Kraken Futures on 2026-10-05. Our test suite replays each one through the production collector parser and postprocessor, and fails if the published rows differ from the rows on this page. Files written before a change to the pipeline can differ; see Known Gaps & Corrections.
Kraken Futures lists linear multi-collateral contracts (PF_ perpetuals, FF_ fixed maturity) sized in base asset units, and inverse contracts (PI_ perpetuals, FI_ fixed maturity) worth USD 1 each. The collector subscribes to the book, trade and ticker feeds. Kraken sends prices and sizes as JSON numbers; we parse them as 64-bit floats and write the shortest decimal that round-trips, so trailing .0 is dropped. Ticker, mark price and open interest rows all come from the same ticker messages.
- Public WebSocket (book, trade, ticker feeds):
wss://futures.kraken.com/ws/v1 - REST (instrument metadata):
https://futures.kraken.com/derivatives/api/v3/instruments
Exchange API reference: docs.kraken.com. Conventions shared by every exchange are on the wire formats overview.
Trades
One row per trade from the trade feed, including the trade_snapshot Kraken sends after each subscription.
- WebSocket trade
- WebSocket trade_snapshot
Trade
{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "66e6153c-44ae-4985-bf0c-6943336aa975",→ trade_id"side": "buy",→ is_buyer_maker"type": "fill",→ order_type"time": 1791227712160,→ event_time · trade_time"qty": 0.0129,→ quantity"price": 85664.0,→ price"seq": 1086905}
Published row
trade_time.uid is a UUID string. We store a stable 63-bit FNV-1a hash of it, so the same uid always gives the same trade_id. IDs are not sequential.85663.0 becomes 85663.price. For PF_ and FF_ contracts this is base asset units (BTC for PF_XBTUSD); for inverse PI_ and FI_ contracts it is the number of USD 1 contracts.true when side is sell. Kraken's side is the taker's side.Market for fill, Liquidation for liquidation, Termination for termination, Block for block. Any other type (Kraken also sends assignment) becomes Market.Subscription trade snapshot
After each trade subscription, including every reconnect, Kraken sends the product's most recent trades in one trade_snapshot message. They fill trades missed while reconnecting. A trade whose uid was already received live or published in an earlier hour is dropped, and so is any trade timed more than 5 seconds before the hour being processed.
Abridged: Kraken sent 100 trades in this snapshot; the newest three are shown. Each trade becomes its own row.
{"feed": "trade_snapshot","product_id": "PF_XBTUSD","trades": [{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "11f44e6c-6e7c-49fa-8e00-47504294b2e7",→ trade_id"side": "buy",→ is_buyer_maker"type": "fill",→ order_type"time": 1791227710087,→ event_time · trade_time"qty": 0.0002,→ quantity"price": 85664.0,→ price"seq": 1086904},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "1b1d6268-e685-4330-892c-30281aa88fab",→ trade_id"side": "sell",→ is_buyer_maker"type": "fill",→ order_type"time": 1791227705302,→ event_time · trade_time"qty": 0.0002,→ quantity"price": 85663.0,→ price"seq": 1086903},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "17bef1f0-d4ff-4672-8004-143ef54ac870",→ trade_id"side": "sell",→ is_buyer_maker"type": "fill",→ order_type"time": 1791227705302,→ event_time · trade_time"qty": 0.0001,→ quantity"price": 85663.0,→ price"seq": 1086902}]}
Published rows · 3
trade_time.uid is a UUID string. We store a stable 63-bit FNV-1a hash of it, so the same uid always gives the same trade_id. IDs are not sequential.85663.0 becomes 85663.price. For PF_ and FF_ contracts this is base asset units (BTC for PF_XBTUSD); for inverse PI_ and FI_ contracts it is the number of USD 1 contracts.true when side is sell. Kraken's side is the taker's side.Market for fill, Liquidation for liquidation, Termination for termination, Block for block. Any other type (Kraken also sends assignment) becomes Market.Subscription trade snapshot after the hour started
This snapshot arrived 8.8 seconds after 20:00 UTC. Trades timed up to 5 seconds before the hour are published in the new hour. The two oldest trades shown are 6.3 and 7.1 seconds older than the hour and are dropped: they belong to the previous hour, which was already processed.
Abridged: Kraken sent 100 trades in this snapshot; the newest trade and the four trades around the 5-second cutoff are shown.
{"feed": "trade_snapshot","product_id": "PF_XBTUSD","trades": [{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "9735e2e3-bcd1-45e0-877b-3f4c4bd5a8e5",→ trade_id"side": "buy",→ is_buyer_maker"type": "fill",→ order_type"time": 1791230406349,→ event_time · trade_time"qty": 0.0003,→ quantity"price": 85737.0,→ price"seq": 1092138},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "a8e526ba-8336-4bb0-9849-0547959aca4e",→ trade_id"side": "sell",→ is_buyer_maker"type": "fill",→ order_type"time": 1791230395105,→ event_time · trade_time"qty": 0.0001,→ quantity"price": 85719.0,→ price"seq": 1092074},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "038370aa-388b-4e72-b694-abaf0cdcdf84",→ trade_id"side": "sell",→ is_buyer_maker"type": "fill",→ order_type"time": 1791230395105,→ event_time · trade_time"qty": 0.0111,→ quantity"price": 85719.0,→ price"seq": 1092073},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "95c75034-8f8e-482b-b4dc-2ba0831d1233",→ trade_id"side": "buy",→ is_buyer_maker"type": "fill",→ order_type"time": 1791230393740,→ event_time · trade_time"qty": 0.0012,→ quantity"price": 85720.0,→ price"seq": 1092072},{"product_id": "PF_XBTUSD",→ symbol"feed": "trade","uid": "8d6f2378-b87c-4a07-828e-fc5d6c3e714d",→ trade_id"side": "buy",→ is_buyer_maker"type": "fill",→ order_type"time": 1791230392891,→ event_time · trade_time"qty": 0.0012,→ quantity"price": 85723.0,→ price"seq": 1092071}]}
Published rows · 3
trade_time.uid is a UUID string. We store a stable 63-bit FNV-1a hash of it, so the same uid always gives the same trade_id. IDs are not sequential.85663.0 becomes 85663.price. For PF_ and FF_ contracts this is base asset units (BTC for PF_XBTUSD); for inverse PI_ and FI_ contracts it is the number of USD 1 contracts.true when side is sell. Kraken's side is the taker's side.Market for fill, Liquidation for liquidation, Termination for termination, Block for block. Any other type (Kraken also sends assignment) becomes Market.Notes
trade_idis a hash of Kraken's UUIDuid, not a sequence number. You cannot find gaps fromtrade_id.- Kraken also sends trades with
typeassignment. They are published withorder_typeMarket, like a normal fill. - Files written before the October 2026 pipeline update do not include trades recovered from
trade_snapshotmessages, so trades missed during a reconnect are missing there. - Trades whose
typeisliquidationorterminationare also published in the liquidations file; see Liquidations below.
Column types and descriptions: Trades schema.
Order Book
One row per price level. book_snapshot messages give the full book after each subscription; each book message changes one level.
- WebSocket book_snapshot
- WebSocket book
Book snapshot
Kraken sends the book in one book_snapshot message after each book subscription, including every reconnect. Each level becomes one snapshot row.
Abridged: Kraken sent 2290 bid and 1181 ask levels; the best three of each side are shown.
{"feed": "book_snapshot",→ event_type"product_id": "PF_XBTUSD",→ symbol"timestamp": 1791227712104,→ event_time"seq": 232413555,→ last_update_id"tickSize": null,"bids": [→ side{→ side"price": 85663.0,→ side · price"qty": 0.0844→ side · quantity},{→ side"price": 85662.0,→ side · price"qty": 0.015→ side · quantity},{→ side"price": 85661.0,→ side · price"qty": 0.014→ side · quantity}],"asks": [→ side{→ side"price": 85664.0,→ side · price"qty": 0.0129→ side · quantity},{→ side"price": 85665.0,→ side · price"qty": 0.0002→ side · quantity},{→ side"price": 85667.0,→ side · price"qty": 0.0674→ side · quantity}]}
Published rows · 6
snapshot for book_snapshot messages.book update usually carries seq + 1.bid for levels in bids, ask for levels in asks. One row per level.85663.0 becomes 85663.price. Base asset units for PF_ contracts, USD 1 contracts for PI_.Book update (level removed)
Each book message changes one price level. qty is the new total at that price; 0.0 removes the level.
{"feed": "book",→ event_type"product_id": "PF_XBTUSD",→ symbol"side": "sell",→ side"seq": 232413575,→ last_update_id"price": 85664.0,→ price"qty": 0.0,→ quantity"timestamp": 1791227712162→ event_time}
Published row
update for book messages.book message for the product increases seq by 1; a jump is a gap.bid for buy, ask for sell.85663.0 becomes 85663.price: 0.0 is published as 0, which removes the level.Notes
last_update_idholds Kraken'sseq, which Kraken counts per product. Eachbookmessage increases it by 1, so a jump is a gap. The first update after abook_snapshotusually carries the snapshot'sseq+ 1 but can be higher; the pipeline accepts it.- Several
bookmessages can share oneevent_time; order rows byreceived_timeand thenlast_update_id. - Files can start with a checkpoint snapshot of the book carried over from the previous hour: its
received_timeis the hour start andlast_update_idis theseqof the last message applied. It is only written when the book is proven current. Without it, continue from the previous hour's book or wait for the next snapshot in the file. - An empty
book_snapshotis published as onesnapshotrow withsidenoop,price0andquantity0that carries itsseq. Clear the book on it.
Column types and descriptions: Order Book schema.
Ticker
One row per ticker message. Kraken sends them at irregular intervals, several per second on busy markets, and consecutive messages can repeat the same time.
- WebSocket ticker
Ticker, linear perpetual (PF_XBTUSD)
{"time": 1791227712132,→ event_time"product_id": "PF_XBTUSD",→ symbol"funding_rate": 0.35319855164890357,"funding_rate_prediction": 0.0612474778575,"relative_funding_rate": 4.123429166667e-6,"relative_funding_rate_prediction": 7.1475e-7,"next_funding_rate_time": 1791230400000,"leverage": "100x","premium": -0.0,"feed": "ticker","bid": 85663.0,"ask": 85664.0,"bid_size": 0.0856,"ask_size": 0.0129,"volume": 5864.7333,→ base_asset_volume"dtm": 0,"index": 85665.91,"last": 85664.0,→ price_change · last_price"change": 0.34,→ price_change_percent"suspended": false,"tag": "perpetual","pair": "XBT:USD","openInterest": 2145.0821,"markPrice": 85664.79402421133,"maturityTime": 0,"post_only": false,"volumeQuote": 504231341.4699,→ quote_asset_volume"open": 85376.0,→ price_change · open_price"high": 86990.0,→ high_price"low": 84963.0→ low_price}
Published row
last − open, computed as an exact decimal: the absolute 24-hour change. Null when open is 0.change is the 24-hour change in percent: 0.34 means +0.34 %.85663.0 becomes 85663.volume (contracts) × the contract size from Kraken's instruments endpoint (1 for PF_XBTUSD). Base asset units.Ticker, inverse perpetual (PI_XBTUSD)
Inverse contracts are worth USD 1 each, so their volume cannot be stated in BTC.
{"time": 1791227712067,→ event_time"product_id": "PI_XBTUSD",→ symbol"funding_rate": 3.85624173e-10,"funding_rate_prediction": 3.7702427e-10,"relative_funding_rate": 0.000033031220833333,"relative_funding_rate_prediction": 0.0000323075,"next_funding_rate_time": 1791230400000,"leverage": "50x","premium": 0.0,"feed": "ticker","bid": 85610.0,"ask": 85777.5,"bid_size": 10.0,"ask_size": 10573.0,"volume": 208456.0,→ base_asset_volume"dtm": 0,"index": 85665.91,"last": 85425.0,→ price_change · last_price"change": 0.07,→ price_change_percent"suspended": false,"tag": "perpetual","pair": "XBT:USD","openInterest": 2361300.0,"markPrice": 85688.7933200642,"maturityTime": 0,"post_only": false,"volumeQuote": 208456.0,→ quote_asset_volume"open": 85369.5,→ price_change · open_price"high": 86931.0,→ high_price"low": 85064.0→ low_price}
Published row
last − open, computed as an exact decimal: the absolute 24-hour change. Null when open is 0.change is the 24-hour change in percent: 0.34 means +0.34 %.85663.0 becomes 85663.volume counts USD 1 contracts on inverse markets, which have no exact base asset volume.Notes
price_changeis absolute (last−open) andprice_change_percentis Kraken's percentage. Files before the 2026-09 data-integrity release had Kraken's percentage inprice_change; they were corrected on 2026-09-30.- Files written before the October 2026 pipeline update hold the contract count in
base_asset_volumefor inversePI_andFI_contracts. Current files leave it null, because those contracts are USD amounts.
Column types and descriptions: Ticker schema.
Mark Price
One row per ticker message, from the same messages as the ticker rows.
- WebSocket ticker
{"time": 1791227712132,→ event_time"product_id": "PF_XBTUSD",→ symbol"funding_rate": 0.35319855164890357,"funding_rate_prediction": 0.0612474778575,"relative_funding_rate": 4.123429166667e-6,→ funding_rate"relative_funding_rate_prediction": 7.1475e-7,"next_funding_rate_time": 1791230400000,→ next_funding_time"leverage": "100x","premium": -0.0,"feed": "ticker","bid": 85663.0,"ask": 85664.0,"bid_size": 0.0856,"ask_size": 0.0129,"volume": 5864.7333,"dtm": 0,"index": 85665.91,→ index_price"last": 85664.0,"change": 0.34,"suspended": false,"tag": "perpetual","pair": "XBT:USD","openInterest": 2145.0821,"markPrice": 85664.79402421133,→ mark_price"maturityTime": 0,"post_only": false,"volumeQuote": 504231341.4699,"open": 85376.0,"high": 86990.0,"low": 84963.0}
Published row
85663.0 becomes 85663.4.123429166667e-6 is 0.000412 %), written in plain decimal notation. Kraken's funding_rate field is an absolute amount per contract and is not published. Null when Kraken omits the field, which it does when the rate is zero and for fixed-maturity contracts.Notes
funding_rateis Kraken'srelative_funding_rate, comparable with other venues. Files before the 2026-09 data-integrity release held the absolutefunding_rate; see the venue notes.- Kraken's API documentation describes
next_funding_rate_timeas the time until the next funding. The values it sends are Unix timestamps in milliseconds, as in this example.
Column types and descriptions: Mark Price schema.
Open Interest
One row per ticker message, from Kraken's openInterest field.
- WebSocket ticker
Ticker, linear perpetual (PF_XBTUSD)
{"time": 1791227712132,→ timestamp"product_id": "PF_XBTUSD",→ symbol"funding_rate": 0.35319855164890357,"funding_rate_prediction": 0.0612474778575,"relative_funding_rate": 4.123429166667e-6,"relative_funding_rate_prediction": 7.1475e-7,"next_funding_rate_time": 1791230400000,"leverage": "100x","premium": -0.0,"feed": "ticker","bid": 85663.0,"ask": 85664.0,"bid_size": 0.0856,"ask_size": 0.0129,"volume": 5864.7333,"dtm": 0,"index": 85665.91,"last": 85664.0,"change": 0.34,"suspended": false,"tag": "perpetual","pair": "XBT:USD","openInterest": 2145.0821,→ sum_open_interest · sum_open_interest_value"markPrice": 85664.79402421133,→ sum_open_interest_value"maturityTime": 0,"post_only": false,"volumeQuote": 504231341.4699,"open": 85376.0,"high": 86990.0,"low": 84963.0}
Published row
PF_ contracts.openInterest × contract size × markPrice, as an exact decimal rounded to 8 decimal places. Quote currency (USD for PF_XBTUSD).Ticker, inverse perpetual (PI_XBTUSD)
{"time": 1791227712067,→ timestamp"product_id": "PI_XBTUSD",→ symbol"funding_rate": 3.85624173e-10,"funding_rate_prediction": 3.7702427e-10,"relative_funding_rate": 0.000033031220833333,"relative_funding_rate_prediction": 0.0000323075,"next_funding_rate_time": 1791230400000,"leverage": "50x","premium": 0.0,"feed": "ticker","bid": 85610.0,"ask": 85777.5,"bid_size": 10.0,"ask_size": 10573.0,"volume": 208456.0,"dtm": 0,"index": 85665.91,"last": 85425.0,"change": 0.07,"suspended": false,"tag": "perpetual","pair": "XBT:USD","openInterest": 2361300.0,→ sum_open_interest · sum_open_interest_value"markPrice": 85688.7933200642,"maturityTime": 0,"post_only": false,"volumeQuote": 208456.0,"open": 85369.5,"high": 86931.0,"low": 85064.0}
Published row
PI_ contracts.openInterest × contract size (USD 1), as an exact decimal rounded to 8 decimal places. USD.Notes
- The contract size and type come from Kraken's instruments endpoint when the hour is processed. If an instrument is not listed there, or the endpoint cannot be reached, the symbol prefix decides:
PI_/FI_are USD 1 inverse contracts,PF_/FF_are linear with contract size 1. For other prefixessum_open_interest_valueis null. - Inverse
sum_open_interest_valuebefore the 2026-09 data-integrity release was contracts × price; it was corrected to contracts × contract size on 2026-09-30.
Column types and descriptions: Open Interest schema.
Liquidations
One row per trade whose type is liquidation or termination, from the trade feed and from trade_snapshot messages.
- WebSocket trade
- WebSocket trade_snapshot
No example yet
No liquidation arrived on any Kraken Futures market while the examples for this page were captured, so this section has no example yet. The notes below describe the mapping, taken from the conversion code.
Notes
- Each such trade is published both in the trades file and in the liquidations file, after the same deduplication.
received_timeis our receive time of the message,event_timeandtrade_timeare the trade'stimein milliseconds, andsymbolis itsproduct_id. sideis Kraken's takersideupper-cased (BUY,SELL).priceandaverage_priceare the fill price.quantity,last_filled_quantityandfilled_quantityare the fill'sqty, in the same units as tradequantity(base asset forPF_/FF_, USD 1 contracts forPI_/FI_).order_typeMarket,time_in_forceIOCandorder_statusFILLEDare fixed placeholders.- A liquidation that fills at several prices gives one row per fill.
Column types and descriptions: Liquidations schema.