Options Flow Summary API - Buy/Sell/Net Volume Totals | FlashAlpha
  1. 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

GET /v1/flow/options/{symbol}/summary
Auth required (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.

GET

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
symbolstringUppercase underlying symbol
contractsWithTradesintegerOption contracts with at least one buffered trade
totalTradesintegerTotal buffered option trades
buyVolumeintegerBuy-classified contract volume
sellVolumeintegerSell-classified contract volume
midVolumeintegerMid/unknown-side contract volume
netVolumeintegerbuyVolume - sellVolume
biggestSingleTradeintegerLargest single option trade size
lastTradeUtcstring/nullLatest trade timestamp
expirystring | nullEcho of the ?expiry= filter, or null when no filter was applied
endpoint_version, data_as_ofstring, objectResponse envelope, see Response envelope.

Errors

Status Error When
400invalid_expiryexpiry 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.
403tier_restrictedYour plan is below Alpha. The body includes current_plan and required_plan.
429Quota exceededDaily 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 netVolume or totalTrades to spot where today's option activity is concentrated
  • Detect stale or quiet tapes - compare lastTradeUtc against now to flag symbols that have gone inactive before trusting the totals
  • Measure conviction with the buy/sell split - weigh buyVolume versus sellVolume (and discount midVolume) to judge how one-sided the tape really is
  • Spot outsized single tickets - scale biggestSingleTrade against typical size to know whether one block is skewing the aggregate
  • Gauge breadth of participation - read contractsWithTrades to tell broad-based flow from activity crowded into a handful of strikes

Related reading

Complementary endpoints

Ready to build with FlashAlpha?

Get your free API key and start pulling live options data in 60 seconds.

No credit card required Setup in 60 seconds Secure & reliable