- Live API Reference
- Trade Flow Data
- Options
- Block Trades
Options Block Trades API
Large option trades across all contracts for an underlying, newest first, filtered by minimum contract size.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Alpha+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol |
minSize |
query | integer | 100 | Minimum contract size. Non-numeric values return a 400 problem-details body. Values below 1 are treated as 1. | |
expiry |
query | date | - | Filter to a single expiration cycle, yyyy-MM-dd. Omit to include all expiries. 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/blocks?minSize=250"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/options/SPY/blocks",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"{data['count']} blocks at minSize {data['minSize']}")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/options/SPY/blocks",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(data.count + " blocks at minSize " + data.minSize);Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"symbol": "SPY",
"expiry": null,
"minSize": 250,
"count": 7,
"blocks": [
{
"ts": "2026-10-30T13:45:37.643Z",
"expiry": "2026-10-30",
"strike": 757,
"right": "P",
"price": 0.79,
"size": 282,
"side": "buy",
"vendorSide": "none"
},
{
"ts": "2026-10-30T13:45:22.456Z",
"expiry": "2026-10-30",
"strike": 750,
"right": "P",
"price": 0.12,
"size": 407,
"side": "buy",
"vendorSide": "none"
}
],
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa4",
"equity_feed": "2026-10-30T13:45:50.282Z",
"equity_options_feed": "2026-10-30T13:45:48Z",
"index_feed": "2026-10-30T13:45:49.521Z",
"index_options_feed": "2026-10-30T13:45:45Z",
"futures_feed": "2026-10-30T13:45:42.97Z",
"futures_options_feed": "2026-10-30T13:45:43.095Z",
"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 |
minSize | integer | Minimum block size applied |
count | integer | Number of block trades returned |
blocks[] | array | Block rows: ts, expiry, strike, right, price, size, side |
expiry | string | null | Echo of the ?expiry= filter, or null when no filter was applied |
blocks[].ts | string | Timestamp of the trade (UTC) |
blocks[].strike | number | Strike price |
blocks[].right | string | Blocks: right |
blocks[].price | number | Blocks: price |
blocks[].size | number | Blocks: size |
blocks[].side | string | Blocks: side |
blocks[].vendorSide | string | Blocks: vendor side |
blocks[].expiry | string | The contract's own expiry date (yyyy-MM-dd, never null) |
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. |
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
Filters the option tape to only prints at or above minSize contracts. Default is 100 contracts but you can raise it for institutional-only filtering. Returns rows in the same shape as the recent feed minus instrument id, bid, and ask.
Common Use Cases
- Track institutional-only flow - raise
minSizeto 500+ and watchblocks[]to surface only large single-ticket prints worth reacting to - Detect multi-leg sweeps - cluster
blocks[]bytsacross strikes and expiries to identify a single sweep routed across venues - Read directional intent - combine
sidewithright(e.g.buycalls vsbuyputs) to tell bullish bets from hedges or bearish positioning - Score conviction by notional - multiply
sizebypriceon each block to rank prints by dollars committed, not just contract count - Spot event positioning - scan large prints on specific
expirylegs into earnings or macro catalysts - Build a day sentiment overlay - tally buy-side versus sell-side
sizeacross blocks to gauge net institutional pressure
Related
Related reading
- Options sweep detection: the 500ms rule - how block prints coalesce into cross-venue sweeps
- Flow Signals API: scoring unusual options activity - turn large prints into a ranked unusual-activity score
Complementary endpoints
- Options Recent - the full tape these blocks are filtered from, with bid/ask context
- Options Summary - aggregate buy/sell volume the blocks contribute to
- Options Leaderboard - rank the contracts these blocks land on
- 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