# Data

<details>

<summary><strong>What data types do you support?</strong></summary>

We provide the most comprehensive and granular market data [sourced from real-time WebSocket APIs](#why-data-source-matters-websocket-feeds-vs-rest-endpoints), with complete [control and transparency](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview) over how the data is recorded.

Via [downloadable CSV data files](https://docs.tardis.dev/downloadable-csv-files/overview) following normalized **tick-level** data types are available:

* [trades](https://docs.tardis.dev/downloadable-csv-files/data-types#trades)
* [incremental order book L2 updates](https://docs.tardis.dev/downloadable-csv-files/data-types#incremental_book_l2)
* order book snapshots ([top 25](https://docs.tardis.dev/downloadable-csv-files/data-types#book_snapshot_25) and [top 5](https://docs.tardis.dev/downloadable-csv-files/data-types#book_snapshot_5) levels)
* [options\_chain](https://docs.tardis.dev/downloadable-csv-files/data-types#options_chain)
* [quotes](https://docs.tardis.dev/downloadable-csv-files/data-types#quotes)
* [book\_ticker](https://docs.tardis.dev/downloadable-csv-files/data-types#book_ticker) (best bid/ask from native exchange BBO feeds)
* [derivative tick info](https://docs.tardis.dev/downloadable-csv-files/data-types#derivative_ticker) (open interest, funding rate, mark price, index price)
* [liquidations](https://docs.tardis.dev/downloadable-csv-files/data-types#liquidations)

[Raw data API](https://docs.tardis.dev/api/quickstart), which is **available for** [**pro and business subscriptions**](https://docs.tardis.dev/billing-and-subscriptions#what-are-the-differences-between-subscription-types), provides data in [exchange-native data format](#what-is-a-difference-between-exchange-native-and-normalized-data-format). See [historical data details](https://docs.tardis.dev/historical-data-details/overview) to learn about [real-time channels](#what-is-the-channel-field-used-in-the-http-api-and-client-libs-replay-functions) captured for each exchange. Each captured channel can be considered a different exchange-specific data type (for example [Binance bookTicker channel](https://docs.tardis.dev/historical-data-details/binance#captured-real-time-channels), or [BitMEX liquidation channel](https://docs.tardis.dev/historical-data-details/bitmex#captured-real-time-channels)).

We also provide the following [normalized data types](#what-is-a-difference-between-exchange-native-and-normalized-data-format) via our [client libs](https://docs.tardis.dev/api/quickstart) (normalization is done client-side, using [raw data API](https://docs.tardis.dev/api/quickstart) as a data source):

* trades
* order book L2 updates
* order book snapshots (tick-by-tick, 10ms, 100ms, 1s, 10s etc)
* quotes
* book ticker (best bid/ask from native BBO feeds)
* derivative tick info (open interest, funding rate, mark price, index price)
* liquidations
* options summary
* OHLCV
* volume/tick based trade bars

</details>

<details>

<summary><strong>What does high frequency historical data mean?</strong></summary>

We always collect and provide data with the highest granularity an exchange can offer via its [real-time WS feeds](#why-data-source-matters-websocket-feeds-vs-rest-endpoints). High frequency can mean different things for different exchanges due to exchange API limitations. For example, for [Coinbase Exchange](https://docs.tardis.dev/historical-data-details/coinbase) it can mean [L3 order book data](https://docs.tardis.dev/order-books#what-l3-order-book-data-can-be-used-for) (market-by-order), for [Binance USDS-M Futures](https://docs.tardis.dev/historical-data-details/binance-futures) all order book [L2](https://docs.tardis.dev/order-books#what-l2-order-book-data-can-be-used-for) real-time updates, and for [Binance Spot](https://docs.tardis.dev/historical-data-details/binance) it means order book updates aggregated in 100ms intervals.

</details>

<details>

<summary><strong>How is historical raw market data sourced?</strong></summary>

Raw market data is sourced from exchanges' real-time WebSocket APIs. For cases where an exchange lacks a WebSocket API for a particular data type, we fall back to polling a REST API periodically, e.g., Binance USDS-M Futures open interest data.

{% hint style="info" %}
See [market data collection overview](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview) for more details and why [data source matters](#why-data-source-matters-websocket-feeds-vs-rest-endpoints).
{% endhint %}

</details>

<details>

<summary><strong>Why data source matters — WebSocket feeds vs REST endpoints</strong></summary>

Recording exchanges' real-time WebSocket feeds allows us to preserve and provide [the most granular data](#what-does-high-frequency-historical-data-mean) that exchanges' APIs can offer, including data that is not available via REST APIs, like tick-level order book updates.

Historical data sourced from WebSocket real-time feeds adheres to what you'll see when trading live and can be used to exactly replicate live conditions, even if it means occasional [connection drops](#is-provided-raw-market-data-complete) causing [small data gaps](#is-provided-raw-market-data-complete), real-time publishing delays during larger market moves, [duplicated trades](#are-exchanges-publishing-duplicated-trades-data-messages), or [crossed books](https://docs.tardis.dev/order-books#can-reconstructed-order-books-have-bid-ask-overlap) in edge cases. We find that trade-off acceptable and, even if data isn't as clean and corrected as data sourced from REST APIs, it provides more insight into market microstructure and unusual exchange behaviors that otherwise can't be captured.

A simple example would be latency spikes for many exchanges during increased volatility periods where exchanges publish trade/order book/quote WebSocket messages with larger-than-usual latency or skip some updates and then return them in one batch. Querying the REST API would result in a clean trade history, but such data wouldn't fully reflect actionable market behavior and could produce unrealistic backtesting results that break in real-time scenarios.

{% hint style="info" %}
See [market data collection overview](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview) for more details.
{% endhint %}

</details>

<details>

<summary><strong>What is a difference between exchange-native and normalized data format?</strong></summary>

Cryptocurrency markets are very fragmented and every exchange provides data in its own bespoke format, which we call **exchange-native data format**.

Our [HTTP API](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange) and [client libs](https://docs.tardis.dev/api/quickstart) can provide market data in this format, meaning data you receive is exactly the same as the live data you would have received from exchanges ("as-is").

{% hint style="info" %}
See [how we collect data](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview) in exchange-native format and [why it's important](#why-data-source-matters-websocket-feeds-vs-rest-endpoints).
{% endhint %}

For example BitMEX trade message looks like this:

```javascript
{
  "table": "trade",
  "action": "insert",
  "data": [
    {
      "timestamp": "2019-06-01T00:03:11.589Z",
      "symbol": "ETHUSD",
      "side": "Sell",
      "size": 10,
      "price": 268.7,
      "tickDirection": "ZeroMinusTick",
      "trdMatchID": "ebc230d9-0b6e-2d5d-f99a-f90109a2b113",
      "grossValue": 268700,
      "homeNotional": 0.08555051758063137,
      "foreignNotional": 22.987424073915648
    }
  ]
}
```

and this is Deribit trade message:

```javascript
{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "channel": "trades.ETH-26JUN20.raw",
    "data": [
      {
        "trade_seq": 18052,
        "trade_id": "ETH-10813935",
        "timestamp": 1577836825724,
        "tick_direction": 0,
        "price": 132.65,
        "instrument_name": "ETH-26JUN20",
        "index_price": 128.6,
        "direction": "buy",
        "amount": 1.0
      }
    ]
  }
}

```

In contrast, **normalized data format** means the same, unified format across multiple exchanges. We provide normalized data via our [client libs](https://docs.tardis.dev/api/quickstart) (data normalization is performed client-side) as well as via [downloadable CSV files](https://docs.tardis.dev/downloadable-csv-files/overview).

{% hint style="info" %}
In the process of data normalization we map the data we [collected from real-time WebSocket APIs](#why-data-source-matters-websocket-feeds-vs-rest-endpoints) (exchange-native format) to normalized/unified format across exchanges that is easier to deal with (one data format across multiple exchanges).

[We've open sourced all the data mappings](https://github.com/tardis-dev/tardis-node/tree/master/src/mappers) from exchange-native to normalized format to make the whole process as transparent as possible.
{% endhint %}

Sample **normalized** trade message:

```javascript
{
  "type": "trade",
  "symbol": "XBTUSD",
  "exchange": "bitmex",
  "id": "282a0445-0e3a-abeb-f403-11003204ea1b",
  "price": 7996,
  "amount": 50,
  "side": "sell",
  "timestamp": "2019-10-23T10:32:49.669Z",
  "localTimestamp": "2019-10-23T10:32:49.740Z"
}
```

We support following normalized data types via our [client libs](https://docs.tardis.dev/api/quickstart):

* tick-by-tick trades
* order book L2 updates
* order book snapshots (tick-by-tick, 10ms, 100ms, 1s, 10s etc)
* quotes
* book ticker (best bid/ask from native BBO feeds)
* derivative tick info (open interest, funding rate, mark price, index price)
* liquidations
* options summary
* OHLCV
* volume/tick based trade bars

and [downloadable CSV data files](https://docs.tardis.dev/downloadable-csv-files/overview):

* [tick-by-tick trades](https://docs.tardis.dev/downloadable-csv-files/data-types#trades)
* [incremental order book L2 updates](https://docs.tardis.dev/downloadable-csv-files/data-types#incremental_book_l2)
* tick level order book snapshots ([top 25](https://docs.tardis.dev/downloadable-csv-files/data-types#book_snapshot_25) and [top 5](https://docs.tardis.dev/downloadable-csv-files/data-types#book_snapshot_5) levels)
* [options\_chain](https://docs.tardis.dev/downloadable-csv-files/data-types#options_chain)
* [quotes](https://docs.tardis.dev/downloadable-csv-files/data-types#quotes)
* [book\_ticker](https://docs.tardis.dev/downloadable-csv-files/data-types#book_ticker) (best bid/ask from native BBO feeds)
* [derivative tick info](https://docs.tardis.dev/downloadable-csv-files/data-types#derivative_ticker) (open interest, funding rate, mark price, index price)
* [liquidations](https://docs.tardis.dev/downloadable-csv-files/data-types#liquidations)

{% hint style="info" %}
**Where to find what — quick reference:**

* **Raw replay** ([HTTP API](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange)) — all exchange-native channels in original format. Use this when you need fields or data types not available in normalized format.
* **Downloadable CSV files** ([datasets](https://docs.tardis.dev/downloadable-csv-files/overview)) — normalized data types listed above (trades, incremental\_book\_L2, book\_snapshot, quotes, book\_ticker, derivative\_ticker, liquidations, options\_chain).
* **Client libs / tardis-machine** ([getting started](https://docs.tardis.dev/api/quickstart)) — normalized data types plus additional computed types (trade\_bar, book snapshots with custom intervals, OHLCV, etc.), available for both historical replay and real-time streaming.

Not every exchange-native channel has a normalized equivalent. If a data type is available as a raw channel but not listed in normalized types above, it can only be accessed via raw replay.
{% endhint %}

</details>

<details>

<summary><strong>Do you provide market data in normalized format?</strong></summary>

[Normalized market data](#what-is-a-difference-between-exchange-native-and-normalized-data-format) (unified data format for every exchange) is available via our [official libraries](https://docs.tardis.dev/api/quickstart) and [downloadable CSV files](https://docs.tardis.dev/downloadable-csv-files/overview). Our [HTTP API](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange) provides data only in [exchange-native format](#what-is-a-difference-between-exchange-native-and-normalized-data-format).

</details>

<details>

<summary><strong>What is the difference between `book_ticker` and `quote`?</strong></summary>

Both provide best bid/ask (BBO) data, but from different sources:

* **`book_ticker`** — sourced from exchanges' native WebSocket BBO channels (e.g., Binance `bookTicker`, Bybit `orderbook.1`). Available via [client libraries](https://docs.tardis.dev/api/quickstart), [tardis-machine](https://docs.tardis.dev/tardis-machine/quickstart) and [CSV datasets](https://docs.tardis.dev/downloadable-csv-files/data-types#book_ticker). See [which exchanges support it](#which-exchanges-support-book_ticker-data-type).
* **`quote`** (alias for `book_snapshot_1_0ms`) — derived from L2 order book data. Available on all exchanges that provide L2 data. Also available as [`quotes` CSV dataset](https://docs.tardis.dev/downloadable-csv-files/data-types#quotes).

Update frequency differs between the two and depends on the exchange. For example, on Binance the native `bookTicker` stream fires significantly more often than L2-derived quotes, because the exchange publishes a dedicated BBO update on every best-price change. On other exchanges the difference may be smaller or negligible. Check the update rates for your specific exchange before choosing.

When using the [replay API](https://docs.tardis.dev/api/quickstart), `book_ticker` can be replayed starting from any point in time since it is a standalone exchange feed. In contrast, `quote` is derived from L2 order book state, which requires an initial snapshot to reconstruct — snapshots are provided at 00:00 UTC each day (and after each [WebSocket reconnect](#how-frequently-exchanges-drop-websocket-connections)), so replay should start from 00:00 UTC to get accurate quotes.

</details>

<details>

<summary><strong>Does Tardis provide precomputed indicators or OHLCV candles?</strong></summary>

Tardis provides raw tick-level market data (trades, order book updates, funding rates, liquidations, etc.) — not precomputed indicators, aggregated Kline/OHLCV candles, or hosted analytics. OHLCV bars and other derived metrics can be computed client-side from our data, for example using `trade_bar` data type in [tardis-machine](https://docs.tardis.dev/tardis-machine/quickstart) or [client libraries](https://docs.tardis.dev/api/quickstart).

</details>

<details>

<summary><strong>Do you provide time based aggregated data as well?</strong></summary>

Our APIs (both [HTTP](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange) and [CSV datasets](https://docs.tardis.dev/downloadable-csv-files/api#datasets-api-details)) provide tick-level data only and do not support time-based aggregated data.

If you need aggregated data (OHLC, interval-based order book snapshots), our [client libs](https://docs.tardis.dev/api/quickstart) can compute it, but aggregation runs client-side from tick-level data, so it is slower than downloading pre-aggregated files.

</details>

<details>

<summary><strong>What is the historical market data delay in relation to real-time?</strong></summary>

For [raw data replay API](https://docs.tardis.dev/api/quickstart) the most recent data available is approximately T-6 minutes from the current time.

[Downloadable CSV files](https://docs.tardis.dev/downloadable-csv-files/overview) for a given day are available on the next day around 06:00 UTC — see [CSV readiness](https://docs.tardis.dev/downloadable-csv-files/overview) for details.

</details>

<details>

<summary><strong>What is the `channel` field used in the HTTP API and client libs `replay` functions?</strong></summary>

When exchanges publish real-time data messages, they always publish them for the subscription topics clients subscribed to. These subscription topics are also often called "channels" or "streams" in exchange documentation and describe the data type a given message belongs to. For example, [BitMEX](https://docs.tardis.dev/historical-data-details/bitmex) publishes its trade data via [trade channel](https://docs.tardis.dev/historical-data-details/bitmex#captured-real-time-channels) and order book L2 update data via [orderBookL2](https://docs.tardis.dev/historical-data-details/bitmex#captured-real-time-channels).

Since we collect the data for all the channels described in exchanges' details page ([Captured real-time market data channels section](https://docs.tardis.dev/historical-data-details/bitmex#captured-real-time-channels)) our [HTTP API](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange) and [client libs](https://docs.tardis.dev/api/quickstart) offer filtering capability by those channels names, so for example to get historical trades for [BitMEX](https://docs.tardis.dev/historical-data-details/bitmex), channel [trade](https://docs.tardis.dev/historical-data-details/bitmex#captured-real-time-channels) needs to be provided alongside requested instruments symbols (via HTTP API or client lib `replay` function args).

</details>

<details>

<summary><strong>How CSV datasets are split into the files?</strong></summary>

CSV datasets are available in daily intervals split by exchange, data type, and symbol. In addition to standard currency pairs/instrument symbols, each exchange also has special [grouped symbols](https://docs.tardis.dev/downloadable-csv-files/overview#grouped-symbols) available depending on whether it supports a given market type: SPOT, FUTURES, OPTIONS, and PERPETUALS. That feature is useful if someone is interested in, for example, all Deribit's options instruments trades or quotes data without requesting data for each symbol separately.

</details>

<details>

<summary><strong>How do symbol IDs differ between raw replay and CSV datasets?</strong></summary>

The [`/exchanges/:exchange`](https://docs.tardis.dev/api/http-api-reference#exchanges-exchange) API returns two separate symbol lists with different ID formats:

* **`availableSymbols[].id`** — used for [raw data replay](https://docs.tardis.dev/api/http-api-reference#data-feeds-exchange). These are exchange-native symbol IDs as used in WebSocket subscriptions (e.g., `btcusdt` for Binance, `BTC-PERPETUAL` for Deribit).
* **`datasets.symbols[].id`** — used for [CSV dataset downloads](https://docs.tardis.dev/downloadable-csv-files/overview). These are always uppercased, and URL-unsafe characters (`/`, `:`) are replaced with `-`.

The [Instruments Metadata API](https://docs.tardis.dev/api/instruments-metadata-api) provides both `id` (native) and `datasetId` (CSV) fields per instrument.

</details>

<details>

<summary><strong>Does your historical data include delisted or expired instruments?</strong></summary>

Yes. Our historical datasets are survival-bias-free — they include all instruments that were actively trading at the time of data collection, including those that have since been delisted, expired, or renamed by the exchange.

Note that for some spot exchanges, early historical coverage was limited to high-cap currency pairs only. See individual exchange pages in [Historical Data Details](https://docs.tardis.dev/historical-data-details/overview) for exact coverage boundaries and start dates.

</details>

<details>

<summary><strong>Can the same symbol ID refer to different assets over time?</strong></summary>

Yes. Exchanges may reuse symbol identifiers for different assets — for example, delisting a token and later listing a different token under the same symbol. Tardis passes through symbol IDs as provided by the exchange without modification, so the same symbol string may appear across different time periods for different underlying assets. Verify token identity using additional context such as price levels or exchange announcements.

</details>

<details>

<summary><strong>Do you provide historical futures data?</strong></summary>

We cover all leading derivatives exchanges such as [BitMEX](https://docs.tardis.dev/historical-data-details/bitmex), [Deribit](https://docs.tardis.dev/historical-data-details/deribit), [Binance USDS-M Futures](https://docs.tardis.dev/historical-data-details/binance-futures), [Binance COIN Futures](https://docs.tardis.dev/historical-data-details/binance-delivery), [FTX](https://docs.tardis.dev/historical-data-details/ftx), [OKX Futures](https://docs.tardis.dev/historical-data-details/okex-futures), [HTX Coin-M Futures](https://docs.tardis.dev/historical-data-details/huobi-dm), [HTX Coin-M Perpetual](https://docs.tardis.dev/historical-data-details/huobi-dm-swap), [Bitfinex Derivatives](https://docs.tardis.dev/historical-data-details/bitfinex-derivatives), [Bybit Derivatives](https://docs.tardis.dev/historical-data-details/bybit) and [many more.](https://docs.tardis.dev/historical-data-details/overview)

</details>

<details>

<summary><strong>What is the difference between futures and perpetual swaps contracts?</strong></summary>

Futures contract is a contract that has expiry date (for example quarter ahead for quarterly futures). Futures contract price converges to spot price as the contract approaches expiration/settlement date. After futures contract expires, exchange settles it and replaces with a new contract for the next period (next quarter for our previous example).

A perpetual swap contract, also commonly called "perp", "swap", "perpetual", or "perpetual future" in crypto exchange nomenclature, is very similar to a futures contract but does not have an expiry date (hence perpetual). To ensure that the perpetual swap contract price stays near the spot price, exchanges employ a mechanism called funding rate. When the funding rate is positive, Longs pay Shorts. When the funding rate is negative, Shorts pay Longs. This mechanism can be quite nuanced and vary between exchanges, so it's best to study each contract specification to learn all the details (funding periods, mark price mechanisms, etc.).

{% hint style="info" %}
See CSV [grouped symbols section](https://docs.tardis.dev/downloadable-csv-files/overview#grouped-symbols) if you'd like to download data for all futures or perpetual swaps as a single file for given exchange instead one by one for each individual instrument.
{% endhint %}

</details>

<details>

<summary><strong>Do you provide historical options data?</strong></summary>

Yes, we do provide historical options data for [Deribit](https://docs.tardis.dev/historical-data-details/deribit), [OKX Options](https://docs.tardis.dev/historical-data-details/okex-options), [Bybit Options](https://docs.tardis.dev/historical-data-details/bybit-options), [Binance European Options](https://docs.tardis.dev/historical-data-details/binance-european-options), and [HTX Options](https://docs.tardis.dev/historical-data-details/huobi-dm-options) - see [options chain](https://docs.tardis.dev/downloadable-csv-files/data-types#options_chain) CSV data type and the corresponding exchange details pages.

</details>

<details>

<summary><strong>Which exchanges support liquidations data type?</strong></summary>

[Liquidations](https://medium.com/tardis-dev/live-liquidations-monitor-for-top-cryptocurrency-exchanges-ac8e429e9556) data is sourced from exchanges' WebSocket APIs when supported, with fallback to polling REST APIs when WebSocket APIs do not support that data type, and can be accessed via [raw data APIs (replaying relevant channels)](https://docs.tardis.dev/api/quickstart) or as a [normalized data type via CSV downloads](https://docs.tardis.dev/downloadable-csv-files/data-types#liquidations).

| exchange                                                                                     | available since | data source                                                                                                                                                                |
| -------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [BitMEX](https://docs.tardis.dev/historical-data-details/bitmex)                             | 2019-03-30      | WS `liquidation` channel                                                                                                                                                   |
| [Deribit](https://docs.tardis.dev/historical-data-details/deribit)                           | 2019-03-30      | WS `trades` channel (trades with `liquidation` flag); data available until 2023-10-03 (Deribit removed the liquidation field from public trade subscriptions on that date) |
| [Binance USDS-M Futures](https://docs.tardis.dev/historical-data-details/binance-futures)    | 2020-01-07      | WS `forceOrder` stream                                                                                                                                                     |
| [Binance COIN Futures](https://docs.tardis.dev/historical-data-details/binance-delivery)     | 2020-07-08      | WS `forceOrder` stream                                                                                                                                                     |
| [OKX Futures](https://docs.tardis.dev/historical-data-details/okex-futures)                  | 2020-12-17      | WS `futures/liquidation` channel (before 2021-12-23); WS `liquidations` channel since 2021-12-23                                                                           |
| [OKX Swap](https://docs.tardis.dev/historical-data-details/okex-swap)                        | 2020-12-18      | WS `swap/liquidation` channel (before 2021-12-23); WS `liquidations` channel since                                                                                         |
| [HTX Coin-M Futures](https://docs.tardis.dev/historical-data-details/huobi-dm)               | 2020-06-23      | WS `liquidation_orders` channel                                                                                                                                            |
| [HTX Coin-M Perpetual](https://docs.tardis.dev/historical-data-details/huobi-dm-swap)        | 2020-06-23      | WS `liquidation_orders` channel                                                                                                                                            |
| [HTX USDT-M Contracts](https://docs.tardis.dev/historical-data-details/huobi-dm-linear-swap) | 2020-10-30      | WS `liquidation_orders` channel                                                                                                                                            |
| [Bitfinex Derivatives](https://docs.tardis.dev/historical-data-details/bitfinex-derivatives) | 2019-09-14      | WS `liquidations` channel                                                                                                                                                  |
| [Kraken Futures](https://docs.tardis.dev/historical-data-details/cryptofacilities)           | 2019-03-30      | WS `trade` channel (trades with `liquidation` type)                                                                                                                        |
| [Bybit Derivatives](https://docs.tardis.dev/historical-data-details/bybit)                   | 2020-11-03      | WS `liquidation` channel (before 2023-04-05); WS `allLiquidation` channel since 2025-02-25                                                                                 |
| [dYdX v4](https://docs.tardis.dev/historical-data-details/dydx-v4)                           | 2024-08-23      | WS `trades` channel (trades with `liquidation` type)                                                                                                                       |

{% hint style="info" %}
Binance `forceOrder` streams push snapshot data at most once per second since April 2021 (no longer real-time individual events). Tardis captures exactly what exchanges publish — liquidation data should not be assumed to contain every individual liquidation event.
{% endhint %}

</details>

<details>

<summary><strong>Which exchanges support book_ticker data type?</strong></summary>

`book_ticker` provides top of the book (best bid/ask) data captured directly from exchanges' native WebSocket best bid/offer channels. See [book\_ticker vs quote](#what-is-the-difference-between-book_ticker-and-quote) for how it differs from L2-derived quotes.

| exchange                                                                                             | available since | data source                                                         |
| ---------------------------------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------- |
| [Binance Spot](https://docs.tardis.dev/historical-data-details/binance)                              | 2019-09-21      | WS `bookTicker` channel                                             |
| [Binance USDS-M Futures](https://docs.tardis.dev/historical-data-details/binance-futures)            | 2019-11-17      | WS `bookTicker` channel                                             |
| [Binance COIN Futures](https://docs.tardis.dev/historical-data-details/binance-delivery)             | 2020-06-16      | WS `bookTicker` channel                                             |
| [Binance European Options](https://docs.tardis.dev/historical-data-details/binance-european-options) | 2025-12-17      | WS `bookTicker` channel                                             |
| [Binance US](https://docs.tardis.dev/historical-data-details/binance-us)                             | 2019-09-25      | WS `bookTicker` channel                                             |
| [BitMEX](https://docs.tardis.dev/historical-data-details/bitmex)                                     | 2019-03-30      | WS `quote` channel                                                  |
| [Deribit](https://docs.tardis.dev/historical-data-details/deribit)                                   | 2019-10-01      | WS `ticker` channel                                                 |
| [Bybit Derivatives](https://docs.tardis.dev/historical-data-details/bybit)                           | 2023-04-05      | WS `orderbook.1` channel                                            |
| [Bybit Spot](https://docs.tardis.dev/historical-data-details/bybit-spot)                             | 2021-12-04      | WS `bookTicker` channel (before 2023-04-05); WS `orderbook.1` since |
| [Hyperliquid](https://docs.tardis.dev/historical-data-details/hyperliquid)                           | 2025-06-26      | WS `bbo` channel                                                    |
| [OKX Spot](https://docs.tardis.dev/historical-data-details/okex)                                     | 2019-03-30      | WS `spot/ticker` channel (before 2021-12-23); WS `bbo-tbt` since    |
| [OKX Futures](https://docs.tardis.dev/historical-data-details/okex-futures)                          | 2019-03-30      | WS `futures/ticker` channel (before 2021-12-23); WS `bbo-tbt` since |
| [OKX Swap](https://docs.tardis.dev/historical-data-details/okex-swap)                                | 2019-03-30      | WS `swap/ticker` channel (before 2021-12-23); WS `bbo-tbt` since    |
| [OKX Options](https://docs.tardis.dev/historical-data-details/okex-options)                          | 2020-02-01      | WS `option/ticker` channel (before 2021-12-23); WS `bbo-tbt` since  |
| [OKX Nitro Spreads](https://docs.tardis.dev/historical-data-details/okex-spreads)                    | 2023-12-22      | WS `sprd-bbo-tbt` channel                                           |
| [HTX Spot](https://docs.tardis.dev/historical-data-details/huobi)                                    | 2019-11-19      | WS `bbo` channel                                                    |
| [HTX Coin-M Futures](https://docs.tardis.dev/historical-data-details/huobi-dm)                       | 2020-06-23      | WS `bbo` channel                                                    |
| [HTX Coin-M Perpetual](https://docs.tardis.dev/historical-data-details/huobi-dm-swap)                | 2020-08-17      | WS `bbo` channel                                                    |
| [HTX USDT-M Contracts](https://docs.tardis.dev/historical-data-details/huobi-dm-linear-swap)         | 2020-10-30      | WS `bbo` channel                                                    |
| [Coinbase Exchange](https://docs.tardis.dev/historical-data-details/coinbase)                        | 2019-03-30      | WS `ticker` channel                                                 |
| [Coinbase International](https://docs.tardis.dev/historical-data-details/coinbase-international)     | 2024-10-31      | WS `LEVEL1` channel                                                 |
| [Kraken](https://docs.tardis.dev/historical-data-details/kraken)                                     | 2019-06-04      | WS `spread` channel                                                 |
| [Kraken Futures](https://docs.tardis.dev/historical-data-details/cryptofacilities)                   | 2019-03-30      | WS `ticker` channel                                                 |
| [Bitfinex](https://docs.tardis.dev/historical-data-details/bitfinex)                                 | 2019-05-23      | WS `ticker` channel                                                 |
| [Bitfinex Derivatives](https://docs.tardis.dev/historical-data-details/bitfinex-derivatives)         | 2019-09-14      | WS `ticker` channel                                                 |
| [Gate.io](https://docs.tardis.dev/historical-data-details/gate-io)                                   | 2023-04-29      | WS `book_ticker` channel                                            |
| [Gate.io Futures](https://docs.tardis.dev/historical-data-details/gate-io-futures)                   | 2022-03-17      | WS `book_ticker` channel                                            |
| [Bitget Spot](https://docs.tardis.dev/historical-data-details/bitget)                                | 2024-11-08      | WS `books1` channel                                                 |
| [Bitget Futures](https://docs.tardis.dev/historical-data-details/bitget-futures)                     | 2024-11-08      | WS `books1` channel                                                 |
| [KuCoin Spot](https://docs.tardis.dev/historical-data-details/kucoin)                                | 2022-08-16      | WS `market/ticker` channel                                          |
| [KuCoin Futures](https://docs.tardis.dev/historical-data-details/kucoin-futures)                     | 2024-01-25      | WS `contractMarket/tickerV2` channel                                |
| [Crypto.com](https://docs.tardis.dev/historical-data-details/crypto-com)                             | 2022-06-01      | WS `ticker` channel                                                 |
| [Delta Exchange](https://docs.tardis.dev/historical-data-details/delta)                              | 2023-04-01      | WS `l1_orderbook` channel                                           |
| [AscendEX](https://docs.tardis.dev/historical-data-details/ascendex)                                 | 2021-03-28      | WS `bbo` channel                                                    |
| [bitFlyer](https://docs.tardis.dev/historical-data-details/bitflyer)                                 | 2019-08-30      | WS `lightning_ticker` channel                                       |
| [WOO X](https://docs.tardis.dev/historical-data-details/woo-x)                                       | 2023-01-20      | WS `bbo` channel                                                    |

</details>

<details>

<summary><strong>Do you provide normalized contract amounts for derivatives?</strong></summary>

Data we provide has contract amounts exactly as provided by exchanges' APIs, meaning the `amount` field may represent contracts, base-asset units, or USD depending on the exchange. This can be tricky when comparing across exchanges due to different contract multipliers (e.g., OKX where each contract has a $100 value) or different contract types (linear or inverse).

We provide the [instruments metadata API](https://docs.tardis.dev/api/instruments-metadata-api) that returns `contractMultiplier`, `inverse`, `contractType`, tick sizes, and more for each instrument in a uniform way, allowing you to normalize contract amounts client-side. Use the following formulas for **futures and perpetual contracts**:

| Contract type             | Base-asset volume                     | USD notional                          |
| ------------------------- | ------------------------------------- | ------------------------------------- |
| Linear (`inverse: false`) | `amount × contractMultiplier`         | `amount × contractMultiplier × price` |
| Inverse (`inverse: true`) | `amount × contractMultiplier / price` | `amount × contractMultiplier`         |

{% hint style="warning" %}
These formulas apply to standard futures and perpetual contracts. Quanto contracts (`quanto_future`, `quanto_perpetual`) and options require different treatment — consult exchange-specific documentation for their volume calculations.
{% endhint %}

</details>

<details>

<summary><strong>Can you record market data for exchange that's not currently supported?</strong></summary>

Yes, we're always open to support new promising exchanges. [Contact us](https://tardis.dev/#contact) and we'll get back to you to discuss the details.

</details>

<details>

<summary><strong>Is provided raw market data complete?</strong></summary>

We're doing our best to provide the most complete and reliable historical raw data API on the market. To do so, among [many other things](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview), we utilize [highly available Kubernetes clusters](https://docs.tardis.dev/general#what-is-your-infrastructure-setup) on Google Cloud Platform that offer best-in-class availability, networking, and monitoring. However, due to exchanges' API downtimes (maintenance, deployments, [connection drops](#how-frequently-exchanges-drop-websocket-connections), etc.) we can experience data gaps and cannot guarantee 100% data completeness, but 99.9% (99.99% on most days), which should be more than enough for most use cases where tick-level data is useful.

In rare circumstances, when exchange's API changes without any notice or we hit new unexpected rate limits we also may fail to record data during such period, it happens very rarely and is very specific for each exchange. Data gaps caused by exchange outages or collection interruptions are permanent — WebSocket-sourced data cannot be retroactively backfilled. Use [`/exchanges/:exchange`](https://docs.tardis.dev/api/http-api-reference#exchanges-exchange) API endpoint and check for `incidentReports` field in order to get most detailed and up to date information on that subject.

</details>

<details>

<summary><strong>Can exchange data contain invalid or extreme values?</strong></summary>

Yes. Tardis stores and serves exchange payloads exactly as received, without modification or filtering. If an exchange publishes an invalid price, extreme value, or malformed field, it will appear in the data as-is. This preserves full fidelity of the original feed. Apply your own validation and sanitization downstream when consuming raw data.

</details>

<details>

<summary><strong>What time zone is used in the data?</strong></summary>

UTC, always.

</details>

<details>

<summary><strong>How are market data messages timestamped?</strong></summary>

Each message received via WebSocket connection is timestamped with 100ns precision using [synchronized clock](https://developers.google.com/time) at arrival time (before any message processing) and stored in ISO 8601 format. Note that data is collected from different server locations depending on the exchange ([see market data collection overview](https://docs.tardis.dev/historical-data-details/overview#market-data-collection-overview)). Local timestamps for exchanges collected from the same server location are directly comparable, but cross-region comparisons (e.g., London vs Tokyo) should not be used for sub-millisecond latency analysis.

</details>

<details>

<summary><strong>How are events ordered when multiple messages share the same timestamp?</strong></summary>

Row order in both replay API responses and CSV files reflects the original capture order — the sequence in which messages were received from the exchange WebSocket connection. When multiple events share the same millisecond exchange timestamp, use the row position (or `localTimestamp` ordering) as the tie-breaker rather than rounding or deduplicating by exchange timestamp.

</details>

<details>

<summary><strong>Are trades and order book updates synchronized across channels?</strong></summary>

Exchanges publish different data types (trades, order book updates, tickers, etc.) on independent WebSocket channels — often processed by separate backend services or workers. There is no cross-channel ordering guarantee from exchanges. For example, Deribit explicitly documents that cross-instrument timing is "inherently asynchronous" with separate internal workers per currency. Other exchanges (Binance, Bybit, OKX) are silent on cross-channel ordering, which in practice means no guarantee.

This means a trade's exchange timestamp does not guarantee that the order book state at that exact timestamp reflects the pre- or post-trade book. Similarly, different symbols — even on the same channel — may be served by different backend servers and arrive independently.

Tardis preserves the original message arrival order and never reorders events. In historical replay and CSV files, all messages are sorted by `localTimestamp` (the time we received the message), providing a chronological sequence across data types as observed from our collection servers.

</details>

<details>

<summary><strong>How frequently exchanges drop WebSocket connections?</strong></summary>

As long as an exchange WebSocket API is not hidden behind a Cloudflare proxy (causing relatively frequent "CloudFlare WebSocket proxy restarting, Connection reset by peer" errors), connections are stable for the majority of supported exchanges and there are almost no connection drops during the day. During periods of higher market volatility, some exchanges tend to drop connections more frequently or have larger latency spikes. Overall, it's a nuanced matter that changes over time. If you have any questions regarding a particular exchange, please do not hesitate to [contact us](https://tardis.dev/#contact).

</details>

<details>

<summary><strong>Are exchanges publishing duplicated trades data messages?</strong></summary>

Some exchanges are occasionally publishing duplicated trades (trades with the same ids). Since we collect real-time data we also collect and provide duplicate trades via [API](https://docs.tardis.dev/api/quickstart) if those were published by real-time WebSocket feeds of exchanges. Our [client libraries](https://docs.tardis.dev/api/quickstart) have functionality that when working with [normalized data](#what-is-a-difference-between-exchange-native-and-normalized-data-format) can deduplicate such trades, similarly for [downloadable CSV files](https://docs.tardis.dev/downloadable-csv-files/overview) we deduplicate [tick-by-tick trades](https://docs.tardis.dev/downloadable-csv-files/data-types#trades) data.

</details>

<details>

<summary><strong>Can timestamps be non-monotonic within a channel?</strong></summary>

That shouldn't happen in theory, but we've detected that for some exchanges when new connection is established sometimes first message for given channel & symbol has newer timestamp than subsequent message, e.g., order book snapshot has newer timestamp than first order book update. This is why we provide data via [API](https://docs.tardis.dev/api/quickstart) and [CSV downloads](https://docs.tardis.dev/downloadable-csv-files/overview) for given data ranges based on [local timestamps](#how-are-market-data-messages-timestamped) (timestamp of message arrival) which are always monotonically increasing.

</details>
