Top-of-book updates: best bid and best ask with their sizes, one row per change.
/api/v1/data/raw/quotes
exchange_timestamptimestampWhen the venue says the event happened (UTC, µs). Exact.local_timestamptimestampWhen the event reached the capture machine (UTC, µs). Measured by our capture, or modelled as exchange_timestamp plus a latency drawn from our measured distribution; see local_timestamp_kind.local_timestamp_kindstring"measured" or "modelled". Don't use modelled rows for latency research.bid_pricefloat64Best bid pricebid_amountfloat64Size at the best bid. Base asset on Binance USDⓈ-M and Hyperliquid, contracts on OKXask_pricefloat64Best ask priceask_amountfloat64Size at the best ask. Base asset on Binance USDⓈ-M and Hyperliquid, contracts on OKX| Venue | Symbols | From | Through | Size |
|---|---|---|---|---|
| Binance | 963 | Jan 2020 | Sep 27, 2026 | 2+ TB |
| OKX | 675 | May 2019 | Sep 27, 2026 | 2+ TB |
| Hyperliquid | 443 | Dec 2024 | Sep 27, 2026 | 100+ GB |
One file per calendar month before 2026-08-01, one per day from then on, in the aperiodic-raw-quotes bucket. Example key:
v1/quotes/exchange=binance-futures/symbol=perpetual-BTC-USDT:USDT/year=2025/month=06/data.parquet
from datetime import date
import aperiodic as ap
# Into one DataFrame (monthly files are trimmed to your range)
df = ap.get_raw(api_key="YOUR_KEY", dataset="quotes",
exchange="binance-futures", symbol="perpetual-BTC-USDT:USDT",
start_date=date(2025, 6, 1), end_date=date(2025, 6, 30))
# Or stream the files to disk, skipping ones you already have
ap.download_raw(api_key="YOUR_KEY", dataset="quotes",
exchange="binance-futures", symbol="perpetual-BTC-USDT:USDT",
start_date=date(2025, 1, 1), end_date=date(2025, 12, 31),
output_dir="raw")-- DuckDB
SELECT * FROM read_parquet('raw/quotes/**/data.parquet')
WHERE exchange_timestamp >= '2025-06-01';
# polars
pl.scan_parquet("raw/quotes/**/data.parquet")The shared DEMO-KEY returns the 2025-06 file of each venue's BTC perpetual. No account needed.
curl -H "X-API-KEY: DEMO-KEY" "https://aperiodic.io/api/v1/data/raw/preview/quotes?exchange=binance-futures&symbol=perpetual-BTC-USDT%3AUSDT"
exchange_timestamp is the venue's own time. local_timestamp is measured on days we captured ourselves and modelled from our measured latency before that; local_timestamp_kind says which. Don't use modelled days for latency research.