API Docs

Getting Started

Welcome to tardis.dev developer documentation. There are four main ways of accessing our historical market data API:

  • Locally installable tardis-machine server with built-in local caching, providing both streaming HTTP and WebSocket endpoints that can be consumed from any programming language supporting those protocols. It's available via NPM or as a Docker Image.

  • Node.js tardis-client providing fast and easy to use wrapper for more level HTTP API with local file based caching build in (requires Node.js v12+).

  • Python tardis-client providing high level and developer friendly data access API abstracting more low level HTTP API with local file based caching build in (requires Python 3.7.0+).

  • HTTP API - low level API providing historical data in minute by minute slices.

Check out /examples page with various useful Python and Node.js code snippets.

Recording and storing market data

  • All market data collection is being done on highly available Google Cloud Platform Kubernetes cluster in London region.

  • Local timestamp recorded for each market message has 100ns precision and is being stored in ISO 8601 format.

  • All exchanges data recorders use the same synchronized clock ensuring reliable local timestamps.

  • Collected historical market data is being stored in parallel in two separate geo-distributed storage providers and being served via global CDN.

  • New market data delay is 4 minutes in relation to real-time (T - 4min).

  • Each WebSocket connection that is used to collect real-time market data has 3 seconds keep alive timeout specified in order to detect stale and closed connection as soon as possible.

  • Additionally in case there is no market data received for more that 6 seconds for open WebSocket connection, such connection is closed and restarted.

Order book data

Order book data is provided in exactly the same format as exchange's WebSocket real-time stream messages, meaning that there is an full order book snapshot just after successful subscription and order book's delta updates after that initial snapshot.

Historical market data available via API provides order book snapshots at the beginning of each day (00:00:000 UTC) and anytime exchange restarted it's connection when recording real-time data stream. It means that in order to be sure to receive initial order book snapshots one must replay historical data from 00:00:000 UTC time of the day, it also means that there is a very tiny gap in historical data (around 50-300ms range depending on exchange) during re-subscribing to exchange's real-time WebSocket stream (every 24 hours).

Some exchanges do not provide initial order book snapshots when consuming WebSocket real-time stream (like Binance, Bitstamp or Coinbase Pro full order book), hence for such exchanges there is a 'generated' order book snapshot available instead, details are specific for each exchange and can be found in exchanges details section.

Tardis-machine

Tardis-machine is a fast, locally installable server with built-in local caching, that uses lower level HTTP API under the hood. It can be installed via NPM or run as a Docker Container (image available on Docker hub).

Locally cached data is stored on disk in compressed form (GZIP) and decompressed on demand when reading the data.

Tardis-machine provides on-demand tick-level market data replay API from any moment in time in exchange's WebSocket data format both via streaming HTTP and WebSocket endpoints. In many cases existing exchanges WebSocket clients can be used to consume historical message stream as if it was real-time one.

Detailed and most up to date documentation & installation instructions can be found on GitHub.

Example below illustrates tardis-machine executing inline from code and official Node.js BitMEX WebSocket client communicating with it and consuming historical data as if it was real-time stream - it can as well run as CLI installed via NPM and as Docker container.

tardis-machine example working with official Node.js BitMEX WebSocket client

Try example above using run button - first change Node version to v12 in dropdown on the left

tardis-machine example working together with ccxws lib

Try example above using run button - first change Node version to v12 in dropdown on the left

Node.js tardis-client

Node.js tardis-client provides simple and intuitive way of accessing tardis.dev historical market data API. Detailed and most up to date documentation & installation instructions can be found on GitHub, but the gist of it is that you provide exchange name, historical date ranges and optional filters (channel names are the same as exchange's channels in real-time WebSocket streams, same for symbols) and you receive an async iterable that provides market data message for each iteration. Local disk-based caching is being done transparently in the background. Cached data is stored on disk in compressed form (GZIP) and decompressed on demand when reading the data. Use playground below to try it live.

Requires Node.js v12+ as uses both for await...of and worker threads.

tardis-client example replaying historical BitMEX liquidations messages

Try example above using run button - first change Node version to v12 in dropdown on the left

Python tardis-client

Python tardis-client provides simple and intuitive way of accessing tardis.dev historical market data API. Detailed and most up to date documentation & installation instructions can be found on GitHub, but the gist of it is that you provide exchange name, historical date ranges and optional filters (channel names are the same as exchange's channels in real-time WebSocket streams, same for symbols) and you receive an Async Generator that provides market data message for each iteration. Local disk-based caching is being done transparently in the background. Cached data is stored on disk in compressed form (GZIP) and decompressed on demand when reading the data. See example snippet below that shows how to replay some of the historical BitMEX data.

Requires Python 3.7.0+.

import asyncio
from tardis_client import TardisClient, Channel
async def replay():
tardis_client = TardisClient()
# replay method returns Async Generator
# https://rickyhan.com/jekyll/update/2018/01/27/python36.html
messages = tardis_client.replay(
exchange="bitmex",
from_date="2019-06-01",
to_date="2019-06-02",
filters=[
Channel(name="trade", symbols=["XBTUSD","ETHUSD"]),
Channel("orderBookL2", ["XBTUSD"])
],
)
# this will print all trades and orderBookL2 messages for XBTUSD
# and all trades for ETHUSD for bitmex exchange
# between 2019-06-01T00:00:00.000Z and 2019-06-02T00:00:00.000Z
#(whole first day of June 2019)
async for local_timestamp, message in messages:
# local timestamp is a Python datetime that marks timestamp
# when given message has been received
# message is a message object as provided by exchange real-time stream
print(message)
asyncio.run(replay())

Try on repl.it

HTTP API

get
/data-feeds/:exchange

https://tardis.dev/api/v1/data-feeds/:exchange
Provides historical cryptocurrency market data feed as minute by minute slices in new line delimited JSON format (NDJSON) with addition of local timestamp at the beginning of each line - in ISO 8601 format. Each response is being GZIP compressed and contains one minute of historical market data. Parallel request to this endpoint are supported and can speed up overall fetch process substantially, but please don't use more than 60 parallel requests or so as it doesn't bring any speed benefits, but on contrary it may be slower. Check out https://github.com/tardis-dev/node-client implementation for hints how to efficiently use this API, feel free to contact us in case of any difficulties as well.
Request
Response
Path Parameters
exchange
required
string
requested exchange, use /exchanges API for most up to date exchanges list (use exchange.id as value for this param)
Headers
Authorization
optional
string
For authenticated requests provide Authorization header with value: 'Bearer <YOUR_API_KEY>'
Query Parameters
from
required
string
requested UTC start date of historical market data feed (e.g.: 2019-04-05 or 2019-04-05T01:02:00.000Z)
offset
optional
number
minute offset that together with from date specifies exact minute slice of historical data that will be returned (e.g.: from date: 2019-04-05 with offset: 2 will provide historical data between 2019-04-05T00:02:00.000Z and 2010-04-05T00:03:00.000Z)
filters
optional
string
URL encoded JSON string with {channel:string, symbols?: string[]} [] form with optional historical market data filters - (e.g: [{"channel":"trade"}]) , use https://tardis.dev/api/v1/exchanges/:exchange HTTP endpoint to get list of allowed channels and symbols for each exchange
200: OK
Example response snippet, each line contains local timestamp (ISO 8601) plus JSON message as provided by live exchange WebSocket stream
2019-04-01T00:00:34.8345516Z {"table":"trade","action":"insert","data":[{"timestamp":"2019-04-01T00:00:34.815Z","symbol":"ETHUSD","side":"Sell","size":7000,"price":141.2,"tickDirection":"ZeroMinusTick","trdMatchID":"baa369de-cb3b-b18f-685e-0ffdec00358c","grossValue":98840000,"homeNotional":28.654468050268125,"foreignNotional":4046.010888697859}]}
2019-04-01T00:00:34.8346465Z {"table":"orderBookL2","action":"update","data":[{"symbol":"ETHUSD","id":29699997176,"side":"Buy","size":65350}]}
2019-04-01T00:00:34.8395743Z {"table":"orderBookL2","action":"update","data":[{"symbol":"BCHM19","id":32999999571,"side":"Sell","size":333},{"symbol":"BCHM19","id":32999999572,"side":"Sell","size":576},{"symbol":"BCHM19","id":32999999573,"side":"Sell","size":353}]}
2019-04-01T00:00:34.8567501Z {"table":"trade","action":"insert","data":[{"timestamp":"2019-04-01T00:00:34.830Z","symbol":"XBTUSD","side":"Buy","size":182,"price":4089,"tickDirection":"ZeroPlusTick","trdMatchID":"fa93bd9b-e1b6-d38d-f4d4-65337a766e34","grossValue":4450992,"homeNotional":0.04450992,"foreignNotional":182}]}
2019-04-01T00:00:34.8567741Z {"table":"orderBookL2","action":"update","data":[{"symbol":"XBTUSD","id":8799591100,"side":"Sell","size":351568}]}
2019-04-01T00:00:34.8567783Z {"table":"orderBookL2","action":"update","data":[{"symbol":"ETHUSD","id":29699997176,"side":"Buy","size":55349}]}
2019-04-01T00:00:34.8567812Z {"table":"orderBookL2","action":"update","data":[{"symbol":"ETHUSD","id":29699997167,"side":"Sell","size":430305}]}
2019-04-01T00:00:34.8567847Z {"table":"orderBookL2","action":"insert","data":[{"symbol":"EOSM19","id":33199989652,"side":"Buy","size":216,"price":0.0010348}]}
2019-04-01T00:00:34.8605618Z {"table":"orderBookL2","action":"update","data":[{"symbol":"XBTUSD","id":8799591850,"side":"Buy","size":154511}]}
2019-04-01T00:00:34.8605944Z {"table":"orderBookL2","action":"update","data":[{"symbol":"TRXM19","id":33299999258,"side":"Sell","size":1493}]}
2019-04-01T00:00:34.8617223Z {"table":"orderBookL2","action":"update","data":[{"symbol":"ADAM19","id":33099998260,"side":"Buy","size":224039}]}Requests examples

Sample requests:

Get full BitMEX data feed from 2019-04-01T00:02:00.000Z to 2019-04-01T00:03:00.000Z
Get BitMEX trades for all instruments from 2019-05-01T00:00:00.000Z to 2019-05-01T00:01:00.000Z
Get full Bitfinex data feed from 2019-06-01T00:10:00.000Z to 2019-06-01T00:11:00.000Z

get
/exchanges

https://tardis.dev/api/v1/exchanges
Gets the exchanges list supported by tardis.dev
Request
Response
200: OK
Response contains JSON array of supported exchanges with basic details for each
[
{
"id": "bitmex",
"name": "BitMEX",
"priceInfo": { "fullAccessPrice": 10, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "coinbase",
"name": "Coinbase Pro",
"priceInfo": { "fullAccessPrice": 20, "singleSymbolPrice": 1.5, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "deribit",
"name": "Deribit",
"priceInfo": { "fullAccessPrice": 18, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "cryptofacilities",
"name": "Crypto Facilities",
"priceInfo": { "fullAccessPrice": 10, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "bitstamp",
"name": "Bitstamp",
"priceInfo": { "fullAccessPrice": 10, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "kraken",
"name": "Kraken",
"priceInfo": { "fullAccessPrice": 10, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": false,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "okex",
"name": "OKEx - spot high and mid caps, all swap & futures",
"priceInfo": { "fullAccessPrice": 18, "singleSymbolPrice": 0.5, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "binance",
"name": "Binance - high and mid caps",
"priceInfo": { "fullAccessPrice": 15, "singleSymbolPrice": 0.5, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z"
},
{
"id": "binance-jersey",
"name": "Binance Jersey",
"priceInfo": { "fullAccessPrice": 2, "singleSymbolPrice": 0.3, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-04-10T00:00:00.000Z"
},
{
"id": "binance-dex",
"name": "Binance DEX",
"priceInfo": { "fullAccessPrice": 7, "singleSymbolPrice": 0.5, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-06-04T00:00:00.000Z"
},
{
"id": "bitfinex",
"name": "Bitfinex - high caps only",
"priceInfo": { "fullAccessPrice": 10, "singleSymbolPrice": 1, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": false,
"availableSince": "2019-05-23T00:00:00.000Z"
}
]

Sample request:

Gets the exchanges list supported by tardis.dev

get
/exchanges/:exchange

https://tardis.dev/api/v1/exchanges/:exchange
Gets exchanges details: available symbols, availability dates, available channels, pricing info etc
Request
Response
Path Parameters
exchange
required
string
requested exchange, use /exchanges API for most up to date exchanges list (use exchange.id as value for this param)
200: OK
Response contains JSON object with exchange details - available symbols, available channels, pricing info etc.
{
"id": "coinbase",
"name": "Coinbase Pro",
"priceInfo": { "fullAccessPrice": 20, "singleSymbolPrice": 1.5, "stepDurationInDays": 30, "stepMultiplier": 0.1, "maxMultiplier": 5 },
"filterable": true,
"availableSince": "2019-03-30T00:00:00.000Z",
"availableSymbols": [
{ "symbol": "ETH-EUR", "displayName": "ETHEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETC-GBP", "displayName": "ETCGBP", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BTC-USDC", "displayName": "BTCUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "DAI-USDC", "displayName": "DAIUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETH-USD", "displayName": "ETHUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "DNT-USDC", "displayName": "DNTUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LINK-ETH", "displayName": "LINKETH", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETH-GBP", "displayName": "ETHGBP", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETC-BTC", "displayName": "ETCBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XRP-EUR", "displayName": "XRPEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BTC-USD", "displayName": "BTCUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LOOM-USDC", "displayName": "LOOMUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XLM-BTC", "displayName": "XLMBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETC-EUR", "displayName": "ETCEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "EOS-BTC", "displayName": "EOSBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "CVC-USDC", "displayName": "CVCUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BAT-USDC", "displayName": "BATUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BCH-USD", "displayName": "BCHUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XRP-BTC", "displayName": "XRPBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "REP-USD", "displayName": "REPUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETH-DAI", "displayName": "ETHDAI", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETH-USDC", "displayName": "ETHUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ZRX-EUR", "displayName": "ZRXEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LTC-EUR", "displayName": "LTCEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XRP-USD", "displayName": "XRPUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LINK-USD", "displayName": "LINKUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ZRX-USD", "displayName": "ZRXUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LTC-BTC", "displayName": "LTCBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "MANA-USDC", "displayName": "MANAUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ZRX-BTC", "displayName": "ZRXBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "EOS-USD", "displayName": "EOSUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "GNT-USDC", "displayName": "GNTUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BAT-ETH", "displayName": "BATETH", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BCH-GBP", "displayName": "BCHGBP", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XLM-USD", "displayName": "XLMUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETH-BTC", "displayName": "ETHBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BTC-GBP", "displayName": "BTCGBP", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BCH-EUR", "displayName": "BCHEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "REP-BTC", "displayName": "REPBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LTC-GBP", "displayName": "LTCGBP", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "XLM-EUR", "displayName": "XLMEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ZEC-BTC", "displayName": "ZECBTC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BTC-EUR", "displayName": "BTCEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ZEC-USDC", "displayName": "ZECUSDC", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "LTC-USD", "displayName": "LTCUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "ETC-USD", "displayName": "ETCUSD", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "EOS-EUR", "displayName": "EOSEUR", "availableSince": "2019-03-30T00:00:00.000Z" },
{ "symbol": "BCH-BTC", "displayName": "BCHBTC", "availableSince": "2019-03-30T00:00:00.000Z" }
],
"availableChannels": [
"subscriptions",
"received",
"open",
"done",
"match",
"change",
"l2update",
"ticker",
"snapshot",
"last_match",
"full_snapshot"
],
"incidentReports": []
}

Sample request:

get
/api-key-info

https://tardis.dev/api/v1/api-key-info
Given API KEY provided in request header provides information about what historical data (exchanges, date ranges, symbols) is available for given API KEY.
Request
Response
Headers
Authorization
required
string
API KEY in format 'Bearer <YOUR_API_KEY>'
200: OK

Exchanges details

BitMEX

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Available channels:

trade, orderBookL2, liquidation, connected, announcement, chat, publicNotifications, instrument, settlement, funding, insurance, orderBookL2_25, quote, quoteBin1m, quoteBin5m, quoteBin1h, quoteBin1d, tradeBin1m, tradeBin5m, tradeBin1h, tradeBin1d

Historical data availability date ranges & available symbols:

BitMEX exchange historical market data details - available symbols, channels , date ranges, incidents

Bitstamp

Historical raw market data is provided in the same data format as real-time WebSocket v2 API (plus local timestamps).

Bitstamp exchange WebSocket API docs

Bitstamp WebSocket API does not provide initial full order book snapshots for live_orders and diff_order_book channels subscriptions. To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages. Such snapshot messages are marked with "event": "snapshot" and "generated": true fields. This effectively allows reconstructing historical full order book for both of those channels.

Example API response for Bitstamp historical market data containing order book snapshots data

Available channels:

live_trades, live_orders, diff_order_book

Historical data availability date ranges & available symbols:

Bitstamp exchange historical market data details - available symbols, channels , date ranges, incidents

Coinbase Pro

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Coinbase Pro WebSocket API, provides initial full order book snapshots for level2, but not for full channel. To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages. Such snapshot messages are marked with "type":"full_snapshot" and "generated":true fields. This effectively allows reconstructing historical full order book for full channel.

Example API response for Coinbase Pro historical market data containing order book snapshots data

Recording process takes care of data integrity of order book by validating sequence numbers provided by exchange real-time message stream - in case of detecting missed message, recording process restarts WebSocket connection and subscribes again.

Cloudflare Pro WebSocket API sits behind Cloudflare which means slightly increased latency and occasional reconnection triggered by Cloudflare WebSocket proxy restarts.

Available channels:

subscriptions, received, open, done, match, change, l2update, ticker, snapshot, last_match, full_snapshot

Historical data availability date ranges & available symbols:

Coinbase Pro exchange historical market data details - available symbols, channels , date ranges, incidents

Deribit

Historical raw market data is provided in the same data format as real-time WebSocket v2 API (plus local timestamps).

Deribit exchange WebSocket API docs

Recording process takes care of data integrity of order book by validating sequence numbers provided by exchange real-time message stream - in case of detecting missed message, recording process restarts WebSocket connection and subscribes again.

Available channels:

book, deribit_price_index, deribit_price_ranking, estimated_expiration_price, markprice.options, perpetual, trades, ticker, quote

book, perpetual, ticker, trades channels data was all collected with raw interval - no aggregation was applied.

Historical data availability date ranges & available symbols:

Deribit exchange historical market data details - available symbols, channels , date ranges, incidents

Crypto Facilities

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

We use direct API access to Crypto Facilities exchange (without Cloudflare in between) that improves connection stability and latency - https://www.cryptofacilities.com/resources/hc/en-us/articles/360022531713-IP-whitelisting-for-direct-access

Recording process takes care of data integrity of order book by validating sequence numbers provided by exchange real-time message stream - in case of detecting missed message, recording process restarts WebSocket connection and subscribes again.

Available channels:

trade, trade_snapshot, book, book_snapshot, ticker, heartbeat

Historical data availability date ranges & available symbols:

Crypto Facilities exchange historical market data details - available symbols, channels , date ranges, incidents

Kraken

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Kraken WebSocket API sits behind Cloudflare which means slightly increased latency and occasional reconnection triggered by Cloudflare WebSocket proxy restarts.

Available channels:

ticker, trade, book, spread

book channel has been recorded with depth=1000.

Historical data availability date ranges & available symbols:

Kraken exchange historical market data details - available symbols, channels , date ranges, incidents

Bitfinex

Bitfinex high cap instruments only

Historical raw market data is provided in the same data format as real-time WebSocket API v2 (plus local timestamps).

Bitfinex historical market data API provided by tardis.dev currently does not offer filtering by symbol or channel.

Bitfinex WebSocket API sits behind Cloudflare which means slightly increased latency and occasional reconnection triggered by Cloudflare WebSocket proxy restarts.

Recording process takes care of data integrity by validating sequence numbers provided by exchange real-time message stream - in case of detecting missed message, recording process restarts WebSocket connection and subscribes again.

Available channels:

trades, book

book channel has been recorded both as book { prec=R0, freq=F0, len=100 } and book { prec=P0,freq=F0,len=100 }.

Historical data availability date ranges & available symbols:

Bitfinex historical market data details - available symbols, channels , date ranges, incidents

Bitfinex Derivatives

Historical raw market data is provided in the same data format as real-time WebSocket API v2 (plus local timestamps).

Bitfinex Derivatives historical market data API provided by tardis.dev currently does not offer filtering by symbol or channel.

Bitfinex Derivatives WebSocket API sits behind Cloudflare which means slightly increased latency and occasional reconnection triggered by Cloudflare WebSocket proxy restarts.

Recording process takes care of data integrity by validating sequence numbers provided by exchange real-time message stream - in case of detecting missed message, recording process restarts WebSocket connection and subscribes again.

Available channels:

trades, book, status

book channel has been recorded both as book { prec=R0, freq=F0, len=100 } and book { prec=P0,freq=F0,len=100 }.

status channel provides feed about derivatives pair status and liquidations.

Historical data availability date ranges & available symbols:

Bitfinex Derivatives exchange historical market data details - available symbols, channels , date ranges, incidents

OKEx

OKEx - spot high and mid caps, all swap & futures instruments

Historical raw market data is provided in the same data format as real-time WebSocket API v3 (plus local timestamps).

OKEx exchange WebSocket API docs

Available channels:

spot/ticker, spot/trade, spot/depth, swap/ticker, swap/trade, swap/depth, swap/funding_rate, swap/price_range, swap/mark_price, futures/ticker, futures/trade, futures/depth, futures/price_range, futures/mark_price, futures/estimated_price, index/ticker

index/ticker channel is available since 2019-09-21.

Historical data availability date ranges & available symbols:

OKEx exchange historical market data details - available symbols, channels , date ranges, incidents

Binance

Binance - high and mid caps coins

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Binance WebSocket API does not provide initial order book snapshots . To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages - top 1000 levels. Such snapshot messages are marked with "stream":"<symbol>@depthSnapshot" and "generated":true fields. This effectively allows reconstructing historical order book for both of those channels.

Example API response for Binance historical market data containing order book snapshots data

Available channels:

trade, ticker, depth, miniTicker, depthSnapshot, bookTicker

bookTicker channel is available since 2019-09-21.

Binance depth channel has been recorded with the fastest update speed API allowed at the time. It means until 30th of August 2019 it was depth (without @time suffix) - book updates pushed every 1000ms and after that date it was [email protected] - book updates pushed every 100ms (new API feature).

Historical data availability date ranges & available symbols:

Binance exchange historical market data details - available symbols, channels , date ranges, incidents

Binance Futures

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Binance Futures exchange WebSocket API docs

Binance Futures WebSocket API does not provide initial order book snapshots . To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages - top 1000 levels. Such snapshot messages are marked with "stream":"<symbol>@depthSnapshot" and "generated":true fields. This effectively allows reconstructing historical order book for both of those channels.

Example API response for Binance Futures historical market data containing order book snapshots data

Available channels:

aggTrade, ticker, depth, markPrice, depthSnapshot

Historical data availability date ranges & available symbols:

Binance Futures historical market data details - available symbols, channels , date ranges, incidents

Binance DEX

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Binance DEX exchange WebSocket API docs

Binance DEX WebSocket API does not provide initial order book snapshots . To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages - top 1000 levels. Such snapshot messages are marked with "stream":"depthSnapshot" and "generated":true fields. This effectively allows reconstructing historical order book for both of those channels.

Example API response for Binance DEX historical market data containing order book snapshots data

Available channels:

trades, marketDiff, kline_1m, ticker, depthSnapshot

Historical data availability date ranges & available symbols:

Binance DEX exchange historical market data details - available symbols, channels , date ranges, incidents

Binance Jersey

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Binance Jersey WebSocket API does not provide initial order book snapshots . To overcome this issue we record those snapshots by calling exchange REST API and store them together with rest of the WebSocket messages - top 1000 levels. Such snapshot messages are marked with "stream":"<symbol>@depthSnapshot" and "generated":true fields. This effectively allows reconstructing historical order book for both of those channels.

Example API response for Binance Jersey historical market data containing order book snapshots data

Available channels:

trade, ticker, depth, miniTicker, depthSnapshot, bookTicker

bookTicker channel is available since 2019-09-21.

Historical data availability date ranges & available symbols:

Binance Jersey exchange historical market data details - available symbols, channels , date ranges, incidents

FTX

Historical raw market data is provided in the same data format as real-time WebSocket API (plus local timestamps).

Available channels:

orderbook, trades

Historical data availability date ranges & available symbols:

FTX exchange historical market data details - available symbols, channels , date ranges, incidents

Gemini

Historical raw market data is provided in the same data format as real-time Market Data Version 2 WebSocket API (plus local timestamps).

Gemini exchange WebSocket API docs

Available channels:

trade, l2_updates, auction_open, auction_indicative, auction_result

Historical data availability date ranges & available symbols:

Gemini exchange historical market data details - available symbols, channels , date ranges, incidents

bitFlyer

Historical raw market data is provided in the same data format as real-time lightning JSON-RPC 2.0 over WebSocket WebSocket API (plus local timestamps).

Available channels:

lightning_board_snapshot, lightning_board, lightning_ticker, lightning_executions

Historical data availability date ranges & available symbols:

bitFlyer exchange historical market data details - available symbols, channels , date ranges, incidents