- Live API Reference
- Trade Flow Data
- Options
- Trade Summary
Options Flow Summary API
Option trade-flow totals across all contracts for an underlying: contracts with trades, total trades, buy/sell/mid/net contract volume, biggest single trade, and last trade timestamp.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Alpha+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol |
expiry |
query | date | - | Filter to a single expiration cycle, yyyy-MM-dd. Aggregates only contracts on that expiry. Invalid values return 400 invalid_expiry. An expiry with no data returns an empty result, not an error. |
Request
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/options/SPY/summary"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/options/SPY/summary",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Net volume: {data['netVolume']:,}")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/options/SPY/summary",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log("Net volume: " + data.netVolume.toLocaleString());Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"symbol": "SPY",
"expiry": null,
"contractsWithTrades": 6773,
"totalTrades": 2492175,
"buyVolume": 7650147,
"sellVolume": 7430431,
"midVolume": 1679482,
"netVolume": 219716,
"biggestSingleTrade": 82957,
"lastTradeUtc": "2026-10-30T13:45:58.465Z",
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa5",
"equity_feed": "2026-10-30T13:45:58.488Z",
"equity_options_feed": "2026-10-30T13:45:58Z",
"index_feed": "2026-10-30T13:45:58.107Z",
"index_options_feed": "2026-10-30T13:45:57Z",
"futures_feed": "2026-10-30T13:45:51.589Z",
"futures_options_feed": "2026-10-30T13:45:51.596Z",
"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 |
|---|---|---|
symbol | string | Uppercase underlying symbol |
contractsWithTrades | integer | Option contracts with at least one buffered trade |
totalTrades | integer | Total buffered option trades |
buyVolume | integer | Buy-classified contract volume |
sellVolume | integer | Sell-classified contract volume |
midVolume | integer | Mid/unknown-side contract volume |
netVolume | integer | buyVolume - sellVolume |
biggestSingleTrade | integer | Largest single option trade size |
lastTradeUtc | string/null | Latest trade timestamp |
expiry | string | null | Echo of the ?expiry= filter, or null when no filter was applied |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Errors
| Status | Error | When |
|---|---|---|
400 | invalid_expiry | expiry is not a valid yyyy-MM-dd date. |
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
Returns aggregated option trade-flow totals across every contract on the underlying. Volumes are in contract units. netVolume is the signed buy-minus-sell directional pressure and is the headline number most flow dashboards anchor on.
Common Use Cases
- Headline directional pressure - surface signed
netVolume(buyVolume - sellVolume) as the lead number on a per-symbol flow dashboard - Rank a watchlist by flow - sort names by absolute
netVolumeortotalTradesto spot where today's option activity is concentrated - Detect stale or quiet tapes - compare
lastTradeUtcagainst now to flag symbols that have gone inactive before trusting the totals - Measure conviction with the buy/sell split - weigh
buyVolumeversussellVolume(and discountmidVolume) to judge how one-sided the tape really is - Spot outsized single tickets - scale
biggestSingleTradeagainst typical size to know whether one block is skewing the aggregate - Gauge breadth of participation - read
contractsWithTradesto tell broad-based flow from activity crowded into a handful of strikes
Related
Related reading
- Options flow API: recent trades, blocks & leaderboard - how the raw tape endpoints fit together end to end
Complementary endpoints
- Options Recent - drill from the aggregate into the individual prints behind it
- Options Blocks - see the large prints driving
biggestSingleTrade - Options Leaderboard - rank the most-active contracts inside the totals
- 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