Aperiodic Market Data
Point-in-time microstructure, liquidity and order-flow metrics, plus raw trades and quotes, for crypto and RWA perpetuals (tokenized stocks, ETFs, commodities, FX) on Binance, OKX and Hyperliquid.
Hosted MCP Server
npx add-mcp 'https://aperiodic.io/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Toggle theme Get Started
One month of 5-minute flow metrics for one symbol is 8,928 rows by 37 columns, a 789 KB Parquet file. Written out as JSON it is 12,844,608 characters, about 3.2 million tokens at four characters a token. The get_data handle for the same file is 6,857 characters, about 1,714 tokens. The model reads the handle; your agent's code reads the file.
1,714 tokens
for the handle, against about 3.2 million for the same month as JSON. Measured on the May 2025 preview file.
MCP is the control plane and Parquet is the data plane. Tools answer with small JSON: the catalog, a schema, statistics, a handle. The bytes go from storage straight to your agent's sandbox. No tool returns a table.
The agent's model calls the MCP server and gets small JSON back. The agent's code sandbox downloads the Parquet files from R2 with a signed URL, so the data never passes through the model.
Your agentModelreads the handleCode sandboxPolars reads the Parquetwrites codewith the URLaperiodic.io/mcpcatalog · schema · stats · handleR2 · Parquet filessigned URL, valid one hourtool calls~6.9 KB of JSONParquet bytesnever throughthe modelThe agent's model calls the MCP server and gets small JSON back. The agent's code sandbox downloads the Parquet files from R2 with a signed URL, so the data never passes through the model.
aperiodic.io/mcpcatalog · schema · stats · handle~6.9 KB JSONtool callsYour agentModelreads the handlewrites codewith the URLCode sandboxPolars reads the ParquetParquet bytesnever throughthe modelR2 · Parquet filessigned URL, valid one hour
Control plane: tool calls and their answers, in the model's context. Data plane: the files, from storage to the agent's code.
list_datasets
Every dataset, metrics and raw, with its category, the plan that unlocks it, a one-line description, its field count and whether you get full access or the preview.
describe_dataset
Field definitions, intervals, exchanges with their start dates, the plan needed and the preview window.
find_symbols
Symbol ids on one exchange that match a query, at most 50: crypto and RWA perpetuals alike, Hyperliquid HIP-3 markets included.
get_data
A handle, not data: signed Parquet URLs, schema, row count, per-column min/max/nulls from the file footers, five sample rows and a Polars snippet. Metrics and raw data alike.
summarize
Statistics, a correlation matrix or a series resampled to at most 500 points, worked out on our side, for clients that cannot run code.
live_feed
The WebSocket URL, subscribe frame, your plan's limits and a Python client, so your code connects to the live metrics stream itself, with your API key.
search · fetch
The catalog as documents, in the shape ChatGPT connectors and deep research ask for.
You
Did flow toxicity on BTC perps rise ahead of the largest 5-minute moves in May 2025?
Agent
Calls get_data(dataset="flow") and get_data(dataset="ohlcv"), both on the free preview slice. The flow handle:
{
"mode": "preview",
"dataset": "flow",
"rows_in_files": 8928,
"files": [{ "period": "2025-05", "rows": 8928, "bytes": 788789,
"url": "https://trade-metrics.aperiodic.io/flow/…" }],
"schema": { "time": "Datetime(us)", "taker_buy_volume": "Float32", … },
"column_stats_format": "[min, max, null_count] across all files",
"column_stats": { "flow_toxicity_score": [-96.86266, 203.367, 31], … },
"sample": [[ "2025-05-01T00:00:00.000Z", 10985297, 9907840, … ], …],
"load_with": "from datetime import date\nimport polars as pl\n…"
}
Agent
Loads both files in its sandbox and runs:
python · polarsCopy
import polars as pl
flow = pl.read_parquet(flow_url) # get_data(dataset="flow")
bars = pl.read_parquet(ohlcv_url) # get_data(dataset="ohlcv")
df = (
bars.join(flow, on="time")
.sort("time")
.with_columns(
ret_bps=(pl.col("close") / pl.col("close").shift(1) - 1) * 1e4,
prior=pl.col("flow_toxicity_score").shift(1).rolling_mean(3),
)
.drop_nulls(["ret_bps", "prior"])
.with_columns(prior_pct=pl.col("prior").abs().rank() / pl.len())
)
top = df.sort(pl.col("ret_bps").abs(), descending=True).head(20)
bars: 8834
moves: 56.2 to 122.6 bps
median percentile of |toxicity| in the 15 min before: 0.88
moves with the 15 min before above the 90th percentile: 9 of 20
moves whose prior toxicity pointed the same way: 10 of 20
Agent
Partly. The 20 largest 5-minute moves on the Binance BTC-USDT perpetual in May 2025 (56 to 123 bps) came after unusually high flow toxicity: across them, the median of the 15 minutes before sat at the 88th percentile of the month, and 9 of the 20 were above the 90th. It did not call the direction: the prior toxicity pointed the way of the move 10 times out of 20. The score scales signed flow by recent realized volatility, so part of this is volatility clustering rather than flow leading price, and one month of one symbol is a lead to test, not a result.
The handle, the code and its output are real: this server's get_data on the May 2025 preview files, and the Polars run on those files. The wording of the conversation around them is ours.
Claude CodeCursorVS Codeclaude.ai / DesktopChatGPTNo MCP?
Copy
# The free preview, no key
claude mcp add --transport http aperiodic https://aperiodic.io/mcp
# With your key, for your plan's datasets and history
claude mcp add --transport http aperiodic https://aperiodic.io/mcp \
--header "X-API-KEY: <your key>"
Add --scope user to use it in every project.
No key is needed for the preview. For your plan's data, sign in from your client, or create a key on your API page: the same key the REST API and the SDK use.
Does the data pass through the model?
What does it cost?
How do I sign in?
Which licence applies?
Is there live data?
Which markets does it cover?
What about raw trades and quotes?
Give your agent the catalog, not the rows
Install the server and start on the free preview. A sign-in or a key takes it to your plan's datasets and history.
claude codeCopy
claude mcp add --transport http aperiodic https://aperiodic.io/mcp
Shown: minute lows of the 465 Binance perpetuals, 20:40–22:00 UTC on 10 Oct 2025, with BTC’s path traced · built with ohlcv 1m
{"@context":"https://schema.org","@type":"Organization","name":"Aperiodic","url":"https://aperiodic.io","logo":"https://aperiodic.io/images/favicon/favicon-150x150.png","description":"Point-in-time order flow, liquidity and funding for 500+ RWA perps (stocks, gold, oil, FX) and crypto on Binance, OKX and Hyperliquid, built for AI agents.","sameAs":["https://x.com/aperiodic_io","https://www.linkedin.com/company/aperiodic-io","https://github.com/aperiodic-io"],"contactPoint":{"@type":"ContactPoint","contactType":"sales","url":"https://aperiodic.io/contact"},"address":[{"@type":"PostalAddress","streetAddress":"114A Friedrichstrasse","addressLocality":"Berlin","postalCode":"10117","addressCountry":"DE"},{"@type":"PostalAddress","streetAddress":"22 Berners St","addressLocality":"London","postalCode":"W1T 3LP","addressCountry":"GB"}]}
{"@context":"https://schema.org","@type":"WebSite","name":"Aperiodic","alternateName":"aperiodic.io","url":"https://aperiodic.io","description":"Point-in-time order flow, liquidity and funding for 500+ RWA perps (stocks, gold, oil, FX) and crypto on Binance, OKX and Hyperliquid, built for AI agents.","publisher":{"@type":"Organization","name":"Aperiodic"}}