DATA/SPOT
Planned from Phase 2 · 2027

Spot markets, every print.

Trades, top-of-book quotes and candles for every listed spot pair, in one symbology. Spot is planned for nine exchanges, each subject to a data agreement with the exchange. Each row carries the venue's timestamp and ours, in nanoseconds.

Three tables for spot.

01tradesOne row per print, with price, size, aggressor side and the venue's trade id. Venues that report the maker's side, or a buyer-is-maker flag, are mapped to the aggressor side so side means the same thing everywhere.
02quotesL1 best bid and offer with sizes, one row each time the top of the book changes. Derived from our own L2 book where the venue has no dedicated BBO channel.
03candlesBuilt from trades at 1s, 1m, 5m, 1h and 1d. Intervals with no trades produce no row; we do not carry the previous close forward.

Spot depth lives in book_l2, book_l3 and book_l4, with the same symbols and timestamps as the tables here.

TRADES · BTC-USDTSYNTHETIC PREVIEW
TS_EXCHANGE (UTC)PRICESIZESIDE
14:02:07.11898,412.500.0410buy
14:02:07.11898,412.600.2000buy
14:02:07.30498,411.900.0062sell
14:02:07.55198,411.801.1500sell
14:02:07.55298,411.700.3380sell
14:02:07.90298,412.100.0150buy
14:02:08.01698,412.400.0905buy
VOLUME · 1s CANDLES
source: fdc_capturedecimal128(38,18)

Columns, as delivered.

Each table also carries the common columns: venue, symbol, venue_symbol, ts_exchange, ts_capture, seq, source.

TRADES

ColumnTypeMeaning
pricedecimalExecution price in quote currency.
sizedecimalQuantity in base currency.
sidestring"buy" or "sell", the aggressor side.
trade_idstringVenue trade id, unchanged.

QUOTES

ColumnTypeMeaning
bid_pricedecimalBest bid.
bid_sizedecimalTotal size at the best bid.
ask_pricedecimalBest offer.
ask_sizedecimalTotal size at the best offer.

CANDLES

ColumnTypeMeaning
intervalstring1s, 1m, 5m, 1h or 1d.
ts_openint64Interval start, ns, on venue time.
open high low closedecimalTrade prices within the interval.
volumedecimalBase volume.
quote_volumedecimalQuote volume (price × size).
buy_volumedecimalBase volume with aggressor side buy.
vwapdecimalVolume-weighted average price.
trade_countint64Number of prints.
Candles are bucketed on ts_exchange so that venue-supplied rows, which have no capture timestamp, and captured rows fall into the same intervals. Spot symbols follow BASE-QUOTE (BTC-USDT, ETH-USDC, BTC-USD); the exchange's own spelling stays in venue_symbol. See symbology.

History follows each venue agreement.

Spot venues are planned from Phase 2. The history available for each venue depends on the agreement with that venue.

fdc_capturefrom capture start

Captured rows

Two regions, merged by sequence number, both timestamps present. Quotes, depth and every derived field start here.

venue_archiveper agreement

Venue-supplied rows

Earlier trades and candles, where the agreement with the venue includes them. ts_capture and seq are null on these rows.

overlapreconciled

Overlap days

Where both sources cover a day, captured rows are served. Our checks on those days are described in data quality.

Nine spot venues planned.

Binance, Bybit and OKX are planned for Phase 2 (2027), Coinbase, Kraken and Bitget for Phase 3 (2028), and KuCoin, Bitfinex and Bitstamp for Phase 4 (2029), each subject to a data agreement with the exchange. Hyperliquid and Deribit are planned for derivatives only.

Full coverage matrix
VenuePhaseSpotL2L3L4
BinanceP2●●●○
BybitP2●●●○
OKXP2●●●○
CoinbaseP3●●●●
KrakenP3●●●●
BitgetP3●●●○
KuCoinP4●●●○
BitfinexP4●●●●
BitstampP4●●●●

Same call on every venue.

Pass several venues and get one frame back, already in one symbology and one clock.

from fdc import Client

fdc = Client(api_key="fdc_live_...")

# one-minute candles for the same pair on three venues
candles = fdc.candles(
    venues=["binance", "okx", "coinbase"],
    symbol="BTC-USDT",
    interval="1m",
    start="2028-07-01",
    end="2028-08-01",
).to_pandas()

# keep only rows we captured ourselves (both timestamps present)
trades = fdc.trades(venue="binance", symbol="BTC-USDT",
                    start="2027-09-01", end="2027-09-02").to_polars()
captured = trades.filter(trades["source"] == "fdc_capture")

Read next.

Need a spot venue sooner?

Pre-registered partners shape the order in which venues ship. Tell us the pairs and history you need.

EARLY ACCESS · PRE-SALE PRICINGPre-register for early access → DANIEL GARCIA · CEO & FOUNDERdaniel@financedatacloud.com →