Perp Flow
Bucket-by-bucket open interest joined to taker buy/sell volume. Distinguish new positions from short covering and long unwind, with absorbed flow flagged. Coverage is stated; where taker data is unavailable, the read uses price direction and says so.
What it does
USDT-margined perpetual flow for one coin on a 5m/15m/1h grid, from one venue: the deepest major exchange, or a second venue for coins it doesn't list (e.g. WAVES). Open interest (USD) at every bucket edge joined to taker buy and sell volume (USD), with each stretch read as new longs, new shorts, short covering or long unwind (OI direction × the aggressive side). The second venue publishes the taker split only for its last ~1000 trades, so its older buckets are read from OI against price direction instead, and every read states its basis (taker or price). Reports the window, the open-interest swings of 1% or more with the price and taker flow inside them (flagging aggressors absorbed by passive orders, taker basis only), and the buckets where OI moved most. One venue, not the market-wide aggregate. Use it to say whether a move was positions opening or closing, and which side pushed.
Parameters
| Name | Type | Description |
|---|---|---|
symbolrequiredpath | string | Coin symbol, e.g. "ETH". |
hoursquery | integer | Trailing window in hours, 1–72. Default 24. At 5m the window is capped at about 41h by the venue's 500-snapshot limit. |
intervalquery | string | Bucket size. Default 15m.5m15m1h |
Call it
One API key works for MCP, REST and WebSocket; each call uses one unit. Agents without an account can pay per call with x402.
curl "https://mcp.f1ow.com/v1/derivatives/flow/BTC?hours=24&interval=1h" \
-H "Authorization: Bearer $F1OW_API_KEY"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "derivatives_flow",
"arguments": {
"symbol": "BTC",
"hours": 24,
"interval": "1h"
}
}
}const res = await fetch("https://mcp.f1ow.com/v1/derivatives/flow/BTC?hours=24&interval=1h", {
headers: { Authorization: `Bearer ${process.env.F1OW_API_KEY}` },
});
const data = await res.json(); // the tool's result as JSON, typed in the OpenAPI spec
console.log(data);import os, requests
res = requests.get(
"https://mcp.f1ow.com/v1/derivatives/flow/BTC?hours=24&interval=1h",
headers={"Authorization": f"Bearer {os.environ['F1OW_API_KEY']}"},
)
data = res.json() # the tool's result as JSON, typed in the OpenAPI spec
print(data)// wss://mcp.f1ow.com/v1/ws — subprotocol "jsonrpc-2.0", Authorization: Bearer <key>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "derivatives_flow",
"arguments": {
"symbol": "BTC",
"hours": 24,
"interval": "1h"
}
}
}
// Or push a fresh result whenever it changes (minimum interval 15 s)
{
"jsonrpc": "2.0",
"id": 2,
"method": "subscriptions/subscribe",
"params": {
"name": "derivatives_flow",
"arguments": {
"symbol": "BTC",
"hours": 24,
"interval": "1h"
},
"intervalSeconds": 60
}
}# No account: the first call answers 402 with a PAYMENT-REQUIRED challenge;
# an x402 client pays it in USDC on Base and retries.
curl "https://mcp.f1ow.com/x402/v1/derivatives/flow/BTC?hours=24&interval=1h"Sample response
A real response captured 2026-11-13. Interactive is the tool's MCP App rendering it, as Claude, ChatGPT and other MCP Apps hosts show it; here it is read-only. JSON is what REST and WebSocket return, and the structuredContent of an MCP call (trimmed for length), with generatedAt for freshness. Text is the report an MCP client hands to a model.
BTC Binance USDT-M perp flow, last 24h, 1h buckets (UTC). One venue, not the market-wide aggregate.
window: price $73561.30 → $68644.50 (-6.68%) · OI $7.24B → $6.92B (-4.45%, -$321.9M) · taker buy 47% ($9.44B buy / $10.64B sell)
read: long unwind (OI down, sellers aggressive)
OI swings ≥ 1.0%:
11-12 09:00–13:00 OI +1.45% (+$104.9M) price -0.92% taker buy 49% positions opened, taker flow balanced
11-12 16:00–11-13 06:00 OI -6.84% (-$500.6M) price -4.97% taker buy 46% long unwind (OI down, sellers aggressive)
11-13 06:00–07:00 OI +2.64% (+$180.1M) price +1.36% taker buy 55% new longs (OI up, buyers aggressive)
11-13 07:00–08:00 OI -1.21% (-$84.9M) price -0.70% taker buy 47% long unwind (OI down, sellers aggressive)
largest OI buckets:
11-13 02:00 OI -1.51% (-$108.2M) price -0.99% taker buy 43% long unwind (OI down, sellers aggressive)
11-13 03:00 OI -1.28% (-$90.3M) price -1.82% taker buy 43% long unwind (OI down, sellers aggressive)
11-13 05:00 OI -2.32% (-$162.4M) price -0.64% taker buy 43% long unwind (OI down, sellers aggressive)
11-13 06:00 OI +2.64% (+$180.1M) price +1.36% taker buy 55% new longs (OI up, buyers aggressive)
11-13 07:00 OI -1.21% (-$84.9M) price -0.70% taker buy 47% long unwind (OI down, sellers aggressive)
forming 08:00: price $68644.50, taker buy 60% so far, OI change not yet known{
"buckets": 24,
"caveats": [
"Binance only: the largest perp venue on the majors, but not the market-wide aggregate. Do not add it to derivatives_open_interest figures.",
"Open interest is net of both sides and a taker buy can close a short as well as open a long, so a read names the dominant aggressor against the net change, not who holds the positions.",
"The newest bucket is still forming; its open-interest change is unknown until the next snapshot."
],
"episodes": [
{
"absorbed": false,
"endMs": 1794488400000,
"oiChangePct": 1.44911735786522,
"oiEndUsd": 7345230677.3472,
"oiStartUsd": 7240310087.1116,
"priceChangePct": -0.917466113295998,
"priceEnd": 72886.4,
"priceStart": 73561.3,
"read": "opened_balanced",
"readBasis": "taker",
"startMs": 1794474000000,
"takerBuyPct": 48.8422013390758,
"takerBuyUsd": 849794403.686,
"takerCoveragePct": 100,
"takerSellUsd": 890082957.2595
},
{
"absorbed": false,
"endMs": 1794549600000,
"oiChangePct": -6.83548399658549,
"oiEndUsd": 6823169003.0088,
"oiStartUsd": 7323785165.9732,
"priceChangePct": -4.97269711233944,
"priceEnd": 68113.1,
"priceStart": 71677.4,
"read": "long_unwind",
"readBasis": "taker",
"startMs": 1794499200000,
"takerBuyPct": 45.6620656826249,
"takerBuyUsd": 5160293609.2275,
"takerCoveragePct": 100,
"takerSellUsd": 6140758001.3024
},
{
"absorbed": false,
"endMs": 1794553200000,
"oiChangePct": 2.63971098978072,
"oiEndUsd": 7003280945.03253,
"oiStartUsd": 6823169003.0088,
"priceChangePct": 1.36185056641004,
"priceEnd": 69040.8,
"priceStart": 68113.2,
"read": "new_longs",
"readBasis": "taker",
"startMs": 1794549600000,
"takerBuyPct": 55.333986471809,
"takerBuyUsd": 825996249.5799,
"takerCoveragePct": 100,
"takerSellUsd": 666750436.9447
},
{
"absorbed": false,
"endMs": 1794556800000,
"oiChangePct": -1.21188036785782,
"oiEndUsd": 6918409558.15376,
"oiStartUsd": 7003280945.03253,
"priceChangePct": -0.703641904497055,
"priceEnd": 68555,
"priceStart": 69040.8,
"read": "long_unwind",
"readBasis": "taker",
"startMs": 1794553200000,
"takerBuyPct": 47.0563928663865,
"takerBuyUsd": 392649088.4406,
"takerCoveragePct": 100,
"takerSellUsd": 441773323.7394
}
],
"interval": "1h",
"largestOiBuckets": [
{
"oiChangePct": -1.50974514722565,
"oiChangeUsd": -108174693.306765,
"priceChangePct": -0.994429951350204,
"read": "long_unwind",
"readBasis": "taker",
"takerBuyPct": 43.0777868318867,
"timeMs": 1794535200000
},
{
"oiChangePct": -1.27968715554036,
"oiChangeUsd": -90306519.0582523,
"priceChangePct": -1.82225273394883,
"read": "long_unwind",
"readBasis": "taker",
"takerBuyPct": 43.4867870999536,
"timeMs": 1794538800000
},
{
"oiChangePct": -2.32494062570955,
"oiChangeUsd": -162410577.611103,
"priceChangePct": -0.641403414594294,
"read": "long_unwind",
"readBasis": "taker",
"takerBuyPct": 43.0215045752291,
"timeMs": 1794546000000
},
{
"oiChangePct": 2.63971098978072,
"oiChangeUsd": 180111942.023735,
"priceChangePct": 1.36185056641004,
"read": "new_longs",
"readBasis": "taker",
"takerBuyPct": 55.333986471809,
"timeMs": 1794549600000
},
{
"oiChangePct": -1.21188036785782,
"oiChangeUsd": -84871386.8787766,
"priceChangePct": -0.703641904497055,
"read": "long_unwind",
"readBasis": "taker",
"takerBuyPct": 47.0563928663865,
"timeMs": 1794553200000
}
],
"market": "USDT-margined perpetual",
"rule": "class = OI direction × taker aggressor (buyers aggressive when buy − sell ≥ 5% of taker volume, sellers when ≤ −5%); where the venue publishes no taker split, price direction stands in (up/down by ≥ 0.10% per bucket, 0.25% per episode or window) and the read says basis = price; OI is flat under 0.10% per bucket and 0.25% per window; an episode is an OI swing of ≥ 1.0% between zigzag pivots (revers…",
"symbol": "BTC",
"venue": "Binance",
"window": {
"oiChangePct": -4.44594948399867,
"oiEndUsd": 6918409558.15376,
"oiStartUsd": 7240310087.1116,
"priceChangePct": -6.68394930486547,
"priceEnd": 68644.5,
"priceStart": 73561.3,
"read": "long_unwind",
"readBasis": "taker",
"takerBuyPct": 47.014862737179,
"takerBuyUsd": 9440673865.6402,
"takerCoveragePct": 100,
"takerSellUsd": 10639516346.5809
},
"windowHours": 24,
"generatedAt": "2026-11-13T08:05:42.4284480+00:00"
}Related tools
derivatives_liquidationsMarket-wide long/short liquidations and venue splits, ranked against a year of daily totals. A separate order sample reveals timing, cascades and the largest forced exits; its coverage is stated, never scaled up to the whole market.
funding_currentCurrent perpetual funding, normalized to an eight-hour rate and annualized, with history and a one-year percentile baseline. Positive means longs pay shorts; it is a cost of holding, not a direction forecast.
derivatives_open_interestCross-exchange perpetual open interest with historical changes and a one-year baseline — how much leverage is committed, not merely how much changed hands. Venue-specific flow is a separate read.
research_regimeWhat kind of market you are trading in. Seven forces — trend, volatility, cycle, sentiment, leverage stress, ETF liquidity, rotation — each voting with its own reasoning and its own threshold for changing the call.
Call Perp Flow from your agent
Sign in, get an API key and make your first call in under a minute. No card required.
For agents: this page as Markdown · all docs
Coin Universe
Every symbol the market-data providers can answer for, so your agent knows what it can ask about before it asks.
Liquidation History
Market-wide long/short liquidations and venue splits, ranked against a year of daily totals. A separate order sample reveals timing, cascades and the largest forced exits; its coverage is stated, never scaled up to the whole market.