- Live API Reference
- Trade Flow Data
- Options
- Recent Trades
Options Recent Trades API
Recent option trades across all contracts for an underlying, newest first. Each row carries timestamp, contract instrument id, expiry, strike, right, price, size, side, block flag, and the prevailing bid/ask.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Alpha+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol |
limit |
query | integer | 50 | Number of trades, clamped to 1..500. Non-numeric values return a 400 problem-details body. |
|
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/recent?limit=10"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/options/SPY/recent",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"{data['count']} of {data['totalAvailable']} buffered trades")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/options/SPY/recent",
{ 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 + " of " + data.totalAvailable + " buffered trades");Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"symbol": "SPY",
"expiry": null,
"count": 10,
"totalAvailable": 5145,
"trades": [
{
"ts": "2026-10-30T13:45:58.448Z",
"instrumentId": 1375734148,
"expiry": "2026-11-02",
"strike": 761,
"right": "P",
"price": 3.74,
"size": 8,
"side": "mid",
"vendorSide": "none",
"isBlock": false,
"bid": 3.73,
"ask": 3.76
},
{
"ts": "2026-10-30T13:45:58.432Z",
"instrumentId": 1375734056,
"expiry": "2026-10-30",
"strike": 763,
"right": "C",
"price": 0.84,
"size": 20,
"side": "buy",
"vendorSide": "none",
"isBlock": false,
"bid": 0.83,
"ask": 0.84
}
],
"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 |
count | integer | Number of trades returned |
totalAvailable | integer | Trades available in the in-memory buffer |
trades[] | array | Recent trade rows: ts, instrumentId, expiry, strike, right, price, size, side, isBlock, bid, ask |
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. |
Fields of trades[]
| Field | Type | Description |
|---|---|---|
trades[].ts | string | Timestamp of the trade (UTC) |
trades[].instrumentId | number | Trades: instrument ID |
trades[].strike | number | Strike price |
trades[].right | string | Trades: right |
trades[].price | number | Trades: price |
trades[].size | number | Trades: size |
trades[].side | string | Trades: side |
trades[].vendorSide | string | Trades: vendor side |
trades[].isBlock | boolean | Trades: is block |
trades[].bid | number | Trades: bid |
trades[].ask | number | Trades: ask |
trades[].expiry | string | The contract's own expiry date (yyyy-MM-dd, never null) |
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
Returns the most recent option trades for an underlying across all of its contracts in a single stream, newest first. Trades come from the in-memory buffer fed by the ingest service, and totalAvailable reports how deep that buffer currently is. Useful for a live time-and-sales feed or for sampling the most recent activity on a name.
Common Use Cases
- Render a live time-and-sales feed - stream the newest
trades[]rows (ts,strike,right,price,size) into a tape widget for a watched symbol - Read buy/sell pressure at a glance - tally
side(buyvssellvsmid) across recent prints to judge whether the tape is aggressively bid or offered right now - Flag institutional prints - filter
isBlock=truerows to surface large single-ticket trades the moment they cross - Classify aggressor side from quotes - compare
priceagainstbid/askto confirm whether a fill lifted the offer or hit the bid for sweep/toxic-flow detection - Gauge tape depth - watch
totalAvailableversuscountto see how active a name is and how far back the in-memory buffer reaches - Feed downstream classifiers - sample the latest trades by
instrumentIdandexpiryto seed real-time sweep, repeat-hitter, or unusual-activity models
Related
Related reading
- Options flow API: recent trades, blocks & leaderboard - how the raw tape endpoints fit together end to end
- Flow Signals API: scoring unusual options activity - turn raw prints into a ranked unusual-activity score
Complementary endpoints
- Options Blocks - isolate only the large block and sweep prints from the same tape
- Options Summary - aggregate the tape into call/put and buy/sell totals
- Options Leaderboard - rank the most-active contracts behind these prints
- Flow Signals - scored unusual-activity layer built on this raw 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