Options Recent Trades API - Raw Tape Rows | FlashAlpha
  1. 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

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

GET

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
symbolstringUppercase underlying symbol
countintegerNumber of trades returned
totalAvailableintegerTrades available in the in-memory buffer
trades[]arrayRecent trade rows: ts, instrumentId, expiry, strike, right, price, size, side, isBlock, bid, ask
expirystring | nullEcho of the ?expiry= filter, or null when no filter was applied
endpoint_version, data_as_ofstring, objectResponse envelope, see Response envelope.

Fields of trades[]

Field Type Description
trades[].tsstringTimestamp of the trade (UTC)
trades[].instrumentIdnumberTrades: instrument ID
trades[].strikenumberStrike price
trades[].rightstringTrades: right
trades[].pricenumberTrades: price
trades[].sizenumberTrades: size
trades[].sidestringTrades: side
trades[].vendorSidestringTrades: vendor side
trades[].isBlockbooleanTrades: is block
trades[].bidnumberTrades: bid
trades[].asknumberTrades: ask
trades[].expirystringThe contract's own expiry date (yyyy-MM-dd, never null)

Errors

Status Error When
400invalid_expiryexpiry 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.
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 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 (buy vs sell vs mid) across recent prints to judge whether the tape is aggressively bid or offered right now
  • Flag institutional prints - filter isBlock=true rows to surface large single-ticket trades the moment they cross
  • Classify aggressor side from quotes - compare price against bid/ask to confirm whether a fill lifted the offer or hit the bid for sweep/toxic-flow detection
  • Gauge tape depth - watch totalAvailable versus count to see how active a name is and how far back the in-memory buffer reaches
  • Feed downstream classifiers - sample the latest trades by instrumentId and expiry to seed real-time sweep, repeat-hitter, or unusual-activity models

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