- Live API Reference
- Trade Flow Data
- Options
- Leaderboard
Options Flow Leaderboard API
Cross-symbol option-flow buyers and sellers ranked by net notional over a rolling window.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Alpha+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
n |
query | integer | 10 | Rows per side; effective max is 50. Non-numeric values return a 400 problem-details body. Out-of-range values are clamped to the supported range. |
|
windowMinutes |
query | integer | 240 | Lookback window, clamped to 1..10080. Non-numeric values return a 400 problem-details body. |
Request
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/options/leaderboard?n=10&windowMinutes=240"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/options/leaderboard",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Top buyer: {data['buyers'][0]['symbol']}")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/options/leaderboard",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log("Top buyer: " + data.buyers[0].symbol);Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"generatedUtc": "2026-10-30T13:45:58.1288162Z",
"n": 10,
"windowMinutes": 240,
"buyers": [
{
"symbol": "SPY",
"netVolume": 57663,
"netNotional": 14364083,
"buyVolume": 435734,
"sellVolume": 378071,
"avgPremium": 2.49,
"tradeCount": 144604,
"lastTradeUtc": "2026-10-30T13:45:55.557Z"
},
{
"symbol": "PLTR",
"netVolume": 15952,
"netNotional": 5754193,
"buyVolume": 34996,
"sellVolume": 19044,
"avgPremium": 3.61,
"tradeCount": 12102,
"lastTradeUtc": "2026-10-30T13:45:53.808Z"
}
],
"sellers": [
{
"symbol": "SPX",
"netVolume": -4651,
"netNotional": -108068020,
"buyVolume": 2461,
"sellVolume": 7112,
"avgPremium": 232.35,
"tradeCount": 2628,
"lastTradeUtc": "2026-10-30T13:45:54.931Z"
},
{
"symbol": "SNDK",
"netVolume": -4340,
"netNotional": -12101101,
"buyVolume": 8681,
"sellVolume": 13021,
"avgPremium": 27.88,
"tradeCount": 15706,
"lastTradeUtc": "2026-10-30T13:45:55.246Z"
}
],
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa4",
"equity_feed": "2026-10-30T13:45:58.109Z",
"equity_options_feed": "2026-10-30T13:45:57Z",
"index_feed": "2026-10-30T13:45:56.132Z",
"index_options_feed": "2026-10-30T13:45:54Z",
"futures_feed": "2026-10-30T13:45:53.139Z",
"futures_options_feed": "2026-10-30T13:45:49.971Z",
"flow_feed": "2026-10-30T13:45:00Z",
"oi_feed": "2026-10-29T20:00:00Z",
"macro_feed": "2026-10-29T21:00:20Z"
}
}Sending request…
See this endpoint on live data
Send this exact request and the real response shows up here, right next to the example.
Response Fields
| Field | Type | Description |
|---|---|---|
generatedUtc | string | Generation timestamp |
n | integer | Effective rows per side |
windowMinutes | integer | Effective lookback window |
buyers[] | array | Positive net-notional rows: symbol, netVolume, netNotional, buyVolume, sellVolume, avgPremium, tradeCount, lastTradeUtc |
sellers[] | array | Negative net-notional rows (same schema as buyers[]) |
buyers[].symbol | string | Underlying symbol |
buyers[].netVolume | number | Buy volume minus sell volume |
buyers[].netNotional | number | Buyers: net notional |
buyers[].buyVolume | number | Volume classified as buyer-initiated |
buyers[].sellVolume | number | Volume classified as seller-initiated |
buyers[].avgPremium | number | Buyers: avg premium |
buyers[].tradeCount | number | Number of trades |
buyers[].lastTradeUtc | string | Buyers: last trade (UTC) |
sellers[].symbol | string | Underlying symbol |
sellers[].netVolume | number | Buy volume minus sell volume |
sellers[].netNotional | number | Sellers: net notional |
sellers[].buyVolume | number | Volume classified as buyer-initiated |
sellers[].sellVolume | number | Volume classified as seller-initiated |
sellers[].avgPremium | number | Sellers: avg premium |
sellers[].tradeCount | number | Number of trades |
sellers[].lastTradeUtc | string | Sellers: last trade (UTC) |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Errors
| Status | Error | When |
|---|---|---|
400 | - | A query value has the wrong type, or a required value is missing. The body is an RFC 7807 problem-details object with errors.<param>. |
401 | - | Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON. |
403 | tier_restricted | Your plan is below Alpha. The body includes current_plan and required_plan. |
429 | Quota exceeded | Daily quota used up. Retry-After gives the seconds until the reset at 00:00 UTC. Rejected requests (including 403) count toward the quota. |
502 | - | Upstream flow data source unavailable. |
About
Ranks the option-flow universe by net notional over the requested window and returns the top buyers and sellers in a single payload. The leaderboard refreshes about every 30 seconds, so polling more often returns the same result.
Common Use Cases
- Run a universe-wide flow scanner - pull
buyers[]andsellers[]ranked bynetNotionalover a rollingwindowMinutesto surface where money is moving right now - Seed a watchlist automatically - take the top
nsymbols by absolutenetNotionalto focus the day on the most-pressured names - Send a daily flow recap - format the buyers and sellers lists into an email or Slack post each session close
- Separate conviction from churn - weigh
netVolumeagainstbuyVolume/sellVolumeandtradeCountto tell one-sided accumulation from two-way noise - Filter by premium tier - use
avgPremiumto split cheap lotto flow from expensive, higher-conviction positioning - Chart market-wide sentiment - snapshot aggregate buy versus sell
netNotionalacross the leaderboard over time, refreshing no faster than every 30 seconds
Related
Related reading
- Options flow API: recent trades, blocks & leaderboard - how the raw tape endpoints fit together end to end
- Build an unusual-options-activity scanner (Python) - wire this leaderboard into a working scanner
Complementary endpoints
- Options Outliers - per-contract anomalies behind the top-ranked names
- Options Summary - drill into a single ranked symbol's totals
- Options Recent - the raw prints driving each leaderboard row
- Flow Signals - scored unusual-activity layer built on this flow
Unlock DEX, VEX and CHEX with Basic
Everything in Free, plus:
- DEX, VEX and CHEX exposure
- Full max pain
- ETF & index symbols SPY, QQQ, SPX, VIX
Go full-chain with Growth
Everything in Basic, plus:
- Full-chain GEX Every expiration
- 0DTE analytics
- Exposure summary & AI narrative
- CME futures & live screener
Add history and vol surfaces with Alpha
Everything in Growth, plus:
- Historical API replay Since 2017
- SVI vol surfaces
- VRP analytics
- Greeks surfaces Vanna, charm, volga and speed grids