Open interest as the venue reports it, one row each time it changes.
/api/v1/data/raw/open_interest
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.open_interestfloat64Open interest. Base asset on Binance USDⓈ-M and Hyperliquid, contracts on OKX| Venue | Symbols | From | Through | Size |
|---|---|---|---|---|
| Binance | 963 | Jun 2020 | Sep 27, 2026 | 40+ GB |
| OKX | 679 | Oct 2019 | Sep 27, 2026 | 30+ GB |
One file per calendar month before 2026-08-01, one per day from then on, in the aperiodic-raw-derivatives bucket. Example key:
v1/open_interest/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="open_interest",
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="open_interest",
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/open_interest/**/data.parquet')
WHERE exchange_timestamp >= '2025-06-01';
# polars
pl.scan_parquet("raw/open_interest/**/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/open_interest?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.