# Unusual Options Activity Scanner Model

An unusual options activity scanner is a ranking system, not an oracle. It should rank contracts for inspection, then hand those contracts to quote, trade, chain, and replay workflows. Use this guide with the [Unusual Options Activity Scanner](/unusual-options-activity), [Options Chain API](/options-chain-api), [Option Chain docs](/docs/option-chain), [Options Chain Scanner Architecture](/docs/options-chain-scanner-architecture), [Historical Options Quotes API](/historical-options-quotes-api), and [Options Trades API](/options-trades-api).

## What the scanner can prove

A scanner can prove that a contract is active relative to the fields it sees. It can show volume, open interest, estimated premium, DTE, moneyness, IV, Greeks, and quote context when those fields are present in the chain snapshot. It can show that a row deserves review.

It cannot prove trader intent. A chain snapshot does not know whether a trade lifted the ask, hit the bid, opened a new position, closed an old one, rolled a hedge, or belonged to a multi-leg spread. That is why the scanner should present evidence and caveats instead of a buy or sell label.

| Scanner output | Strong interpretation | Weak interpretation |
| --- | --- | --- |
| High volume | The contract was active today | Someone has directional conviction |
| Volume above OI | Today activity is large versus the previous open interest base | Every print opened a new position |
| Large premium | More capital changed hands than in cheap-ticket flow | The buyer is informed |
| Tight spread | The contract is easier to inspect and model | The signal will make money |
| Short DTE | Event and gamma exposure may be concentrated | The contract is automatically better |

For execution-side confirmation, hand the selected contract to [Quotes](/docs/quotes), [Trades](/docs/trades), [Quote vs Trade Timeline](/quote-vs-trade-timeline-options), and [Backtesting Execution Realism](/docs/backtesting-execution-realism).

## Minimum fields

A useful unusual-activity row needs more than one price column:

| Field | Why it matters |
| --- | --- |
| `details.ticker` | Preserves the exact OCC contract |
| `details.expiration_date` | Defines DTE and event horizon |
| `details.contract_type` | Separates call and put activity |
| `details.strike_price` | Supports moneyness and strike clustering |
| `day.volume` | Measures same-day contract activity |
| `open_interest` | Gives the previous-position baseline |
| `last_quote.bid` and `last_quote.ask` | Supports spread and midpoint checks |
| `last_trade.price` | Gives last-sale context, not a full market |
| `implied_volatility` | Helps rank volatility-priced activity |
| `greeks.delta` | Helps compare risk exposure across strikes |
| `underlying_asset.price` | Supports moneyness and distance calculations |

The [Option Chain docs](/docs/option-chain), [Options Data API](/options-data-api), and [Options API Endpoint Coverage](/options-api-endpoint-coverage) explain how those fields fit into the broader endpoint map.

## Score components

A transparent scanner score is easier to trust than a black-box alert. CuteMarkets ranks contracts with a context score that emphasizes activity, premium, pressure against open interest, spread quality, and DTE.

| Component | Purpose | Caveat |
| --- | --- | --- |
| Volume | Surfaces active contracts | Cheap tickets can dominate raw volume |
| Premium | Separates larger capital from small-ticket noise | Premium does not reveal direction |
| Volume/OI pressure | Highlights activity large relative to prior OI | OI updates after the close |
| Spread percent | Penalizes noisy, expensive-to-cross contracts | Some event names still trade wide |
| DTE | Keeps short-dated concentration visible | 0DTE activity can be noisy |
| Low-OI activity | Helps surface fresh-looking rows | Low OI can also mean poor liquidity |

The score should be treated as a review queue. A high score means "inspect this contract first." It does not mean "enter this trade."

## Interpretation workflow

Use this scanner order:

1. Resolve the watchlist ticker.
2. Fetch listed expirations or choose a scanner DTE bucket.
3. Request the chain snapshot for each expiration.
4. Score rows by volume, premium, volume/OI pressure, spread percent, DTE, IV, and delta.
5. Keep quote fields visible so wide markets can be rejected.
6. Select exact OCC tickers for deeper inspection.
7. Pull quote windows for bid/ask behavior.
8. Pull trades for tape and activity validation.
9. Store the scanner score, tags, rejects, and follow-up requests.

This path connects [Options Chain API](/options-chain-api), [Options Liquidity Scanner](/options-liquidity-scanner), [Historical Options Replay Runbook](/docs/historical-options-replay-runbook), and [Options Backtesting API](/options-backtesting-api).

## Common false positives

Unusual-activity rows often look stronger than they are. Common false positives include:

- far-OTM weekly contracts with large ticket count but tiny premium
- contracts with high volume and no usable bid
- contracts where the spread percent is too wide for the strategy
- routine SPY or QQQ weekly activity that is active every session
- earnings-week rows where the event explains the volume but not direction
- rolls and spreads that look like single-leg conviction in a simple chain view
- stale last-trade rows with no fresh quote support

Use [Options Flow False Positives](/docs/options-flow-false-positives), [Options Volume and Open Interest](/docs/options-volume-open-interest), and [Why Option Quotes Matter More Than Last Price](/blog/why-option-quotes-matter-more-than-last-price) to keep these cases visible.

## Artifact fields

A scanner artifact should store:

- watchlist ticker
- expiration date
- OCC ticker
- contract type
- strike
- DTE
- underlying price
- volume
- open interest
- volume/OI ratio
- estimated premium
- bid
- ask
- midpoint
- spread percent
- quote timestamp when available
- IV and Greeks
- scanner score
- tags
- reject reasons
- next endpoint requested

The artifact gives a future dashboard, alert, backtest, or paper-trading system the reason a contract was surfaced and why it was accepted or rejected.

## Related pages

- [Unusual Options Activity Scanner](/unusual-options-activity)
- [Build an Options Chain Scanner That Is Quote-Aware](/blog/build-options-chain-scanner-quote-aware)
- [Options Chain Scanner Architecture](/docs/options-chain-scanner-architecture)
- [Options Liquidity Scanner](/options-liquidity-scanner)
- [Options Data Provider Evaluation](/docs/options-data-provider-evaluation)

## Scanner model notes

A UOA scanner needs a scoring model and a reject model. The score can use volume, volume/OI pressure, premium, IV, moneyness, DTE, trade size, and event tags. The reject model catches stale quotes, wide spreads, no-bid rows, low open interest, excluded trade conditions, cheap far-OTM contracts, and incomplete pagination.

Store both sides of the model. Accepted alerts need the OCC symbol, selected expiration, strike, side, quote timestamp, bid, ask, trade evidence, score inputs, and related underlying state. Rejected candidates need identity plus reason. Pair this page with [Options Chain Scanner Architecture](/docs/options-chain-scanner-architecture), [Options Flow False Positives](/docs/options-flow-false-positives), and [Option Quote and Trade Conditions](/docs/option-quote-trade-conditions).
