Raw data · Prime + Raw
Shown: the deepest drop of every perpetual on Binance, OKX and Hyperliquid, 20:50–22:00 UTC on 10 Oct 2025, one tile each, three blocks in that order, deepest first; IOTX at −94.8%, the deepest of the 847, is the one orange tile · built with ohlcv 1m
exchange_timestamp, local_timestamp, then the columns below; exchange and symbol come from the path. Hyperliquid's derivative feed carries no exchange time, so in its mark price, index price, and funding files exchange_timestamp is modelled, and an exchange_timestamp_kind column says so.Every print, with the venue’s trade id and taker side.
Every trade printed on the venue, with its trade id, taker side, price and size.
Every change at the top of the book.
Top-of-book updates: best bid and best ask with their sizes, one row per change.
Mark price, index price and funding, one row per change.
The venue’s mark price, one row each time it changes.
The venue’s index price for the contract’s underlying, one row each time it changes.
The current funding rate and the next funding time, one row each time either changes.
| Dataset | Binance USDⓈ-M | OKX | Hyperliquid |
|---|---|---|---|
| trades | Jan 2020 | Sep 2019 | Jan 2025 |
| quotes | Jan 2020 | Sep 2019 | Jan 2025 |
| mark_price | Mar 2020 | Oct 2019 | Mar 2025 |
| index_price | Mar 2020 | Oct 2019 | Mar 2025 |
| funding_rate | Jan 2020 | Sep 2019 | Feb 2025 |
First month across all symbols of a venue; the raw catalog and /api/v1/metadata/raw list every symbol with its own coverage. Perpetuals only. Prime + Raw and Institutional reach back to the first month shown.
The shared key DEMO-KEY gets the 2025-06 trades file of the BTC perpetual on Binance and OKX, with no account and no API key of your own.
# Save the 2025-06 trades file in this folder — no account needed
file=binance-futures_trades_perpetual-BTC-USDT-USDT_2025-06.parquet
curl -fLG -H "X-API-KEY: DEMO-KEY" \
"https://aperiodic.io/api/v1/data/raw/preview/trades" \
-d exchange=binance-futures \
-d symbol=perpetual-BTC-USDT:USDT \
-d download=true \
-o "$file" && echo "Saved to $PWD/$file"The command for each venue is in the catalog’s preview data.
Install the Python client, then load a range into a DataFrame or sync it to a folder.
pip install "aperiodic[polars]"Into a DataFrame
from datetime import date
import aperiodic as ap
df = ap.get_raw(
api_key="YOUR_KEY",
dataset="trades",
exchange="binance-futures",
symbol="perpetual-BTC-USDT:USDT",
start_date=date(2025, 6, 1),
end_date=date(2025, 6, 3),
)
print(df.head())Sync a folder
from datetime import date
import aperiodic as ap
# Skips files already in ./raw, so running it again resumes
ap.download_raw(
api_key="YOUR_KEY",
dataset="trades",
exchange="okx-perps",
symbol="perpetual-BTC-USDT:USDT",
start_date=date(2025, 1, 1),
end_date=date(2025, 12, 31),
output_dir="raw",
)Monthly and daily files sit at different depths, so read a folder with a glob and filter on exchange_timestamp.
raw/trades/exchange=binance-futures/symbol=perpetual-BTC-USDT:USDT/ year=2025/month=06/data.parquet one file per month before 2026-08-01 year=2026/month=08/day=10/data.parquet one file per day from 2026-08-01
# DuckDB, from the folder that holds ./raw
duckdb -c "SELECT * FROM read_parquet('raw/trades/**/data.parquet')
WHERE exchange_timestamp >= '2025-06-01' LIMIT 10"from datetime import datetime, timezone
import polars as pl
df = (
pl.scan_parquet("raw/trades/**/data.parquet")
.filter(pl.col("exchange_timestamp") >= datetime(2025, 6, 1, tzinfo=timezone.utc))
.collect()
)
print(df.head())exchange_timestamp is the venue's own time for the event, exactly as it published it.local_timestamp is when the event reached our capture machine.$1,899 month to month, with a commercial licence. Institutional adds an SLA and real-time streaming.