- Live API Reference
- Trade Flow Data
- Stocks
- Outliers
Stocks Flow Outliers API
Cross-symbol stock-flow outliers ranked by absolute net notional, same shape as the options-outliers payload.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Alpha+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
limit |
query | integer | 20 | Rows returned, clamped to 1..200. Non-numeric values return a 400 problem-details body. |
|
minTrades |
query | integer | 20 | Minimum trades for a symbol to qualify. Non-numeric values return a 400 problem-details body. Values below 1 are treated as 1. | |
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/stocks/outliers?limit=20&minTrades=100&windowMinutes=240"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/stocks/outliers",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"{data['qualified']} of {data['tracked']} symbols qualified")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/stocks/outliers",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(data.qualified + " of " + data.tracked + " symbols qualified");Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"generatedUtc": "2026-10-30T13:46:04.1111129Z",
"windowMinutes": 240,
"tracked": 959,
"qualified": 982,
"limit": 20,
"outliers": [
{
"symbol": "MU",
"tradeCount": 81240,
"buyVolume": 1849182,
"sellVolume": 296795,
"midVolume": 1872936,
"netVolume": 1552387,
"imbalancePct": 72.3,
"skew": "BUY",
"notional": 3641981017,
"netNotional": 1406789344,
"biggestTrade": 1343101,
"biggestTradeUtc": "2026-10-30T12:11:00Z",
"biggestAgeSec": 5704,
"lastVwap": 906.21,
"lastTradeUtc": "2026-10-30T13:46:00Z",
"lastTradeAgeSec": 4
},
{
"symbol": "MNQ=F",
"tradeCount": 281458,
"buyVolume": 227694,
"sellVolume": 262452,
"midVolume": 18892,
"netVolume": -34758,
"imbalancePct": 7.1,
"skew": "FLAT",
"notional": 14652716214,
"netNotional": -1000512948,
"biggestTrade": 101,
"biggestTradeUtc": "2026-10-30T13:29:00Z",
"biggestAgeSec": 1024,
"lastVwap": 28785.11,
"lastTradeUtc": "2026-10-30T13:46:00Z",
"lastTradeAgeSec": 4
}
],
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa4",
"equity_feed": "2026-10-30T13:46:03.529Z",
"equity_options_feed": "2026-10-30T13:46:02Z",
"index_feed": "2026-10-30T13:46:03.1Z",
"index_options_feed": "2026-10-30T13:46:03Z",
"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 |
windowMinutes | integer | Effective lookback window |
tracked | integer | Symbols scanned |
qualified | integer | Symbols that met filters |
limit | integer | Effective output limit |
outliers[] | array | Outlier rows (same shape as options outliers): symbol, tradeCount, buyVolume, sellVolume, midVolume, netVolume, imbalancePct, skew, notional, netNotional, biggestTrade, biggestTradeUtc, biggestAgeSec, lastVwap, lastTradeUtc, lastTradeAgeSec |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Fields of outliers[]
| Field | Type | Description |
|---|---|---|
outliers[].symbol | string | Underlying symbol |
outliers[].tradeCount | number | Number of trades |
outliers[].buyVolume | number | Volume classified as buyer-initiated |
outliers[].sellVolume | number | Volume classified as seller-initiated |
outliers[].midVolume | number | Volume printed at the mid |
outliers[].netVolume | number | Buy volume minus sell volume |
outliers[].imbalancePct | number | Outliers: imbalance (%) |
outliers[].skew | string | Outliers: skew |
outliers[].notional | number | Outliers: notional |
outliers[].netNotional | number | Outliers: net notional |
outliers[].biggestTrade | number | Largest single trade size |
outliers[].biggestTradeUtc | string | Outliers: biggest trade (UTC) |
outliers[].biggestAgeSec | number | Outliers: biggest age seconds |
outliers[].lastVwap | number | Outliers: last vwap |
outliers[].lastTradeUtc | string | Outliers: last trade (UTC) |
outliers[].lastTradeAgeSec | number | Outliers: last trade age seconds |
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
Same response shape as options outliers, applied to the equity universe. Use minTrades to filter out thin tape and limit to cap output size. Refreshes about every 30 seconds.
Common Use Cases
- Scan for unusual equity activity - rank
outliers[]byskewand absolutenetNotionalto surface the most one-sided names across the universe - Quantify directional lean - read
imbalancePctand signednetVolumeto size how far buyers or sellers dominate each outlier's tape - Run a fresh big-print radar - filter on a low
biggestAgeSec(withbiggestTrade/biggestTradeUtc) to catch institutional prints that landed seconds ago - Filter out thin tape - raise
minTradesand checkqualifiedvstrackedto confirm enough symbols cleared the participation floor before trusting the ranking - Add execution and freshness context - pull
lastVwapfor slippage andlastTradeAgeSecto drop stale names from alerts - Generate pairs ideas - contrast
skewacross correlated tickers to find divergent flow for a relative-value setup
Related
Related reading
- Options flow API: recent trades, blocks & leaderboard - how to combine universe ranking and outlier detection on the options tape
Complementary endpoints
- Stocks Leaderboard - the net-notional top-N ranking that pairs with this skew/imbalance view
- Stocks Summary - drill into a single outlier's flow totals
- Stocks Recent - inspect the per-trade tape behind a flagged symbol
- Options Outliers - the matching outlier scan for the options tape (same response shape)
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