Unusual Whales API - Option Contract endpoints

Layer mapping: L1 (0DTE) load-bearing. This is the per-contract substrate. Six endpoints scoped to a single option contract by its OCC symbol (SPY240120C00500000 etc.) plus one chain-search endpoint for finding contracts to query.

Together with uw-api-option-trade (flow alerts + full tape) and uw-api-gex-greeks (positional Greeks), this is the working set for the SPY hunter’s signal engine.

1. Base contract

PropertyValue
Base URLhttps://api.unusualwhales.com
AuthAuthorization: Bearer <token> header
Response envelope{ "data": [...] }
Status codes200, 422, 500

2. Endpoint matrix

#PathPurpose
1GET /api/stock/{ticker}/option-contractsChain search; find contracts matching filters
2GET /api/option-contract/{id}/flowTrade-level flow on one contract (per-trade Greeks)
3GET /api/option-contract/{id}/intradayIntraday tick/bar data on one contract
4GET /api/option-contract/{id}/historyHistorical daily summary for one contract
5GET /api/option-contract/{id}/volume-profileVolume-at-price profile for one contract
6GET /api/stock/{ticker}/expiry-breakdownPer-expiry rollup across all of a ticker’s contracts

Convention. Endpoints 2-5 take an OCC option symbol as {id} (e.g. TSLA230526P00167500). Endpoints 1 and 6 are ticker-scoped (at the underlying level).

Find contracts for a ticker matching filter criteria. Use this to get an OCC symbol that you then feed into endpoints 2-5.

Path parameter: ticker (e.g. SPY).

Query parameters:

ParamTypeRequiredDefaultRange
expiryISO dateno-Filter to one expiration
option_typeenumno-call, Call, put, Put
vol_greater_oiboolno-Only chains where vol > OI
exclude_zero_vol_chainsboolno-Drop zero-volume contracts
exclude_zero_dteboolno-Drop same-day expiry
exclude_zero_oi_chainsboolno-Drop zero-OI contracts
maybe_otm_onlyboolno-OTM contracts only
option_symbol[]arrayno-Filter to specific OCC symbols
limitintno5001 to 500
pageintno-0-indexed

Response per contract:

FieldTypeDescription
option_symbolstringOCC symbol
volume, open_interest, prev_oiintToday, current, prior
bid_volume, ask_volume, mid_volume, cross_volume, floor_volume, no_side_volumeintSide breakdown
sweep_volume, multi_leg_volume, stock_multi_leg_volumeintTrade-type breakdown
last_price, avg_price, high_price, low_pricedecimalToday’s OHLC
nbbo_bid, nbbo_askdecimalQuote
implied_volatilitydecimalIV
total_premiumdecimal$ premium

MK3 use. Two patterns:

  1. 0DTE chain discovery: pull ?expiry=TODAY&exclude_zero_vol_chains=true to get the active 0DTE strikes on SPY.
  2. OTM unusual activity scan: ?vol_greater_oi=true&maybe_otm_only=true&expiry=TODAY to find 0DTE OTM contracts where volume already exceeds OI (a classic “unusual” pattern).

The sweep_volume and floor_volume fields are pre-classified - no need to derive these from per-trade data.

4. GET /api/option-contract/{id}/flow - Per-contract trade flow

Trade-level flow on one contract with per-trade Greeks (huge value).

Path parameter: id = OCC symbol.

Query parameters:

ParamTypeRequiredDefaultNotes
sideenumnoALLALL, ASK, BID, MID
min_premiumintno0Min trade premium
limitintnounlimited>= 1
datedatenolast trading date-

Response per trade:

FieldTypeDescription
idUUIDTrade ID
underlying_symbolstringUnderlying
option_chain_idstringChain ID
expirydateExpiration
strikedecimalStrike
option_typestringcall or put
executed_atISO 8601Execution time
price, premium, sizedecimal/intTrade details
volume, open_interestintContract context at trade
delta, gamma, theta, vega, rhodecimalPer-trade Greeks
implied_volatilitydecimalIV at trade
nbbo_ask, nbbo_biddecimalQuote at trade
ask_vol, bid_vol, mid_vol, multi_volintSide breakdown
exchangestringVenue
full_name, sector, industry_typestringsUnderlying classification
marketcapdecimalUnderlying market cap
tagsarrayClassification tags
canceledboolPrint canceled

MK3 use (L1 critical). This is the per-trade Greek substrate for the IMPULSE engine. Per 2026-05-15-mk3-data-foundation-constraint, MK2 never recorded raw UW stream; this endpoint is the path to that recording for MK3 going forward.

Two derived feature families:

Feature familyWhat you compute
Aggressor flowside=ASK premium - side=BID premium, rolled to 1-min
Greek delta impactsum(delta * size * 100) (delta-equivalent shares)
Greek gamma exposuresum(gamma * size * 100) (gamma-equivalent shares)
Greek vega flowsum(vega * size)

Recording warning. Polling this endpoint per-contract with limit=unlimited and no filter could be huge. For SPY at the 0DTE level, hundreds of strikes have activity per day; conservative default: min_premium=10000 (cuts noise) and poll the top-20 by volume only.

5. GET /api/option-contract/{id}/intraday - Intraday data

Intraday tick / bar data for one contract.

Path parameter: id = OCC symbol.

Query parameters (inferred - not fetched in this pass):

  • date (default last trading date)
  • interval (likely 1m, 5m, etc.)

Response (inferred): time-bucketed OHLC + volume + premium for the contract. Useful for chart-style analysis of a single option’s intraday behavior. First real fetch needs to update with actual field set.

MK3 use. Secondary. The per-trade flow endpoint (#4) is richer; use intraday for backtest replay where minute-bar resolution is enough.

6. GET /api/option-contract/{id}/history - Daily history

Historical daily summary for one contract.

Response (inferred): per-trading-day rows with daily summary (OHLC, volume, OI, IV closing). For OOS backtest framing of how a specific contract traded over its life.

MK3 use. Lookback at session start - “did this strike see unusual activity yesterday or last week?“. Useful for context, not for real-time decisioning.

7. GET /api/option-contract/{id}/volume-profile - Vol at price

Volume distribution across price levels for one contract.

Response (inferred): array of (price_level, volume) rows. Helpful for identifying where the contract found acceptance vs rejection - particularly the strike’s own equilibrium pricing.

MK3 use. Niche. Useful when one strike is suspected of being a liquidity magnet. Not part of the default Setup Hunter feed.

8. GET /api/stock/{ticker}/expiry-breakdown - Per-expiry rollup

Per-expiry summary across all of a ticker’s contracts.

Response (inferred): one row per expiration with aggregate volume, OI, premium, IV per side.

MK3 use. Session-start snapshot. Identifies which expirations are getting flow. For SPY hunter: confirms 0DTE is the heaviest expiration today (it usually is on SPY) and quantifies the dominance ratio (0DTE volume / total volume).

9. Cross-endpoint workflow for SPY hunter

Session start:
  -> GET /api/stock/SPY/expiry-breakdown
     (which expirations are active today)
  -> GET /api/stock/SPY/option-contracts?expiry=TODAY
     (today's 0DTE chain with vol/OI per strike)
     -> identify top-20 contracts by volume
  -> For each top-20 contract:
     -> GET /api/option-contract/{id}/history?limit=5
        (recent daily context)

RTH polling (every minute on top-20 contracts):
  -> GET /api/option-contract/{id}/flow?date=TODAY&min_premium=10000
     -> de-dupe by trade id
     -> compute per-trade aggressor + Greek-equivalent features
     -> publish to MessageBus

10. Nautilus integration shape

  • Custom data classes:
    • UWOptionContract (one-shot from chain search)
    • UWOptionContractTrade (one per trade from /flow)
    • UWOptionContractDailyBar (from /history)
    • UWOptionContractIntradayBar (from /intraday)
  • Polling Actors:
    • UWChainDiscoveryActor - once at session start (chain search)
    • UWOptionFlowActor - per-minute polling on the top-20 chain
  • Determinism: per nautilus-custom-data - ts_event from executed_at, ts_init from receive time.

11. Known gaps

  • Intraday / history / volume-profile schemas not fully fetched yet. First real fetch needs to update these sections.
  • tags taxonomy on /flow trades not enumerated in the docs.
  • /flow has limit=unlimited by default. Footgun for SPY - always pass a cap and a min_premium filter.
  • The IMPULSE engine substrate question. Per 2026-05-15-mk3-data-foundation-constraint, MK2 never recorded per-trade Greek flow. This endpoint provides exactly that data going forward. MK3 should start recording from day-zero of the paper rollout so future OOS validations have it.

12. Source URLs

  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.option_contracts
  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.flow
  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.intraday
  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.history
  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.volume_profile
  • https://api.unusualwhales.com/docs/operations/PublicApi.OptionContractController.expiry_breakdown

cortana-north-star uw-api-option-trade uw-api-gex-greeks uw-api-tide 2026-05-15-mk3-data-foundation-constraint 2026-05-22-uw-historical-findings 2026-05-15-mk3-setup-hunter-architecture