CuteMarkets Docs

API Reference

Everything you need to integrate market data, build faster, and scale.

Docs

Tip: open /docs/options-chain-scanner-architecture.md directly for raw markdown (easy copy/paste into an LLM).

An options chain scanner turns a broad contract surface into a smaller set of contracts worth showing, alerting on, or sending into deeper analysis. The hard part is not requesting a chain. The hard part is avoiding false precision from stale quotes, incomplete pagination, weak liquidity, wrong expirations, and historical leakage.

This guide describes a practical scanner architecture for current chain workflows.

It connects the Options Chain API, Option Chain docs, Options Data API, Unusual Options Activity, Options Liquidity Scanner, and Historical Options Quotes API. Use consistent terminology in scanner articles: expiration, DTE, strike, moneyness, delta, IV, Greeks, open interest, volume, bid, ask, midpoint, spread percent, quote age, pagination, OCC ticker, and reject reason.

Request order

The scanner should not begin with a made-up OCC symbol.

  1. Choose an underlying.
  2. Fetch listed expirations.
  3. Select an expiration or DTE policy.
  4. Request the chain for that date.
  5. Load all required pages.
  6. Normalize rows into a scanner table.
  7. Apply filters.
  8. Rank candidates.
  9. Drill into contract snapshots or quote/trade history.
  10. Store the decisions and rejects.
bash
curl "https://api.cutemarkets.com/v1/tickers/expirations/AAPL/" \
  -H "Authorization: Bearer YOUR_API_KEY"

curl "https://api.cutemarkets.com/v1/options/chain/AAPL/?expiration_date=2026-06-19&limit=100" \
  -H "Authorization: Bearer YOUR_API_KEY"

Expiration discovery is a small step, but it prevents many scanner bugs. It keeps the UI from offering dates that are not listed and keeps the backend from guessing weekly calendars. For calendar-heavy workflows, link out to Expiration Calendar, Options Expiration Data Workflow, and Options Expiration API.

Scanner row model

Store a row model that separates identity, market data, risk fields, derived filters, and decision output.

GroupFields
Identityunderlying, OCC ticker, expiration, contract type, strike
Underlying contextunderlying price, snapshot timestamp
Risk fieldsdelta, gamma, theta, vega, IV
Participationopen interest, volume, latest trade price, latest trade timestamp
Quote contextbid, ask, bid size, ask size, quote timestamp
Derived metricsmidpoint, spread dollars, spread percent, moneyness, DTE
Scanner stateloaded page, pagination complete, plan freshness, row evaluated at
Decision outputpass, rank, reject reason, next endpoint

Do not store only the displayed columns. The hidden fields are what make the row auditable.

Filters

A scanner should make filters explicit. Each filter should have a reason and a failure behavior.

FilterReasonFailure behavior
Expiration or DTEMatches the strategy horizonReject if outside policy
Contract typeSeparates calls, puts, spreads, and straddlesReject if wrong side
Moneyness or deltaKeeps the contract tied to the thesisReject or down-rank
Minimum open interestAvoids empty contract linesReject or mark thin
Minimum volumeConfirms recent attentionDown-rank if low
Maximum spread percentControls execution dragReject if quote exists and spread is too wide
Maximum quote ageAvoids stale market contextReject if stale or missing
Minimum bidPrevents impossible exitsReject if bid is zero or too small
IV presentSupports volatility workflowsReject if IV is required
Pagination completePrevents partial-surface rankingsBlock ranking until complete

The policy can be configurable, but it should not be invisible. Users and developers need to know why a row appeared.

Ranking

Ranking should happen after hard filters.

Example score components:

  • lower spread percent
  • higher open interest
  • recent quote timestamp
  • target delta proximity
  • IV percentile or relative IV signal if available
  • volume relative to open interest
  • DTE match
  • notional premium or contract price range

Avoid a single "unusual" score that hides everything. Show the evidence behind the rank. A high-volume far-wing contract with a wide market should not outrank a tighter, more usable candidate unless the scanner is explicitly designed for lottery-ticket activity.

Chain versus snapshot versus quotes

Use the chain for breadth. Use the contract snapshot after the user selects a leg. Use historical quotes when the question is fill realism. Use trades when the question is printed activity.

User questionEndpoint
Which strikes are available for this expiration?Chain
What is the current state of this one contract?Contract snapshot
Was this contract executable near 10:00?Historical quotes
Did anything print after the alert?Trades
How did the contract move over 5-minute bars?Aggregates
Did this contract exist last month?Contracts with as_of

This handoff is the main architectural boundary. A chain scanner that tries to answer every question from one response will either overfetch or make weak claims. The same boundary appears in Options Quotes vs Trades, Options Aggregates vs Quotes, and Why Is Last Price Bad for Options Backtesting.

Historical leakage warning

The current chain is not a historical fill surface. It is a current snapshot. If you are replaying a past event, switch to:

  1. contracts with as_of
  2. historical quotes for the selected contracts
  3. historical trades for activity validation
  4. aggregates for chart context

Do not use today's chain to choose a contract for a past date. That can include contracts that were not listed, exclude adjusted contracts, and shift the liquidity profile.

UI notes

A scanner UI should show enough context to prevent misuse:

  • expiration selector backed by listed dates
  • current freshness label
  • plan label for live or delayed data
  • quote-aware badges only when quote fields are available
  • spread and quote age columns
  • reject counts and reasons
  • pagination or partial-load status
  • selected contract links to snapshots, quotes, trades, and docs

Avoid a huge table that looks precise but hides whether quotes are stale or missing.

Related CuteMarkets docs

Scanner architecture notes

A chain scanner needs two outputs: accepted candidates and rejected candidates. Accepted rows keep underlying, expiration, OCC symbol, strike, side, DTE, moneyness, IV, Greeks, open interest, volume, quote timestamp, bid, ask, spread percent, and score inputs. Rejected rows keep the same identity fields plus the reason: stale quote, wide spread, no bid, low OI, missing size, event mismatch, or incomplete pagination.

Use Expirations before requesting the chain and Option Contract Snapshot after a user drills into one row. For historical scanners, add Contracts with as_of and Historical Options Replay Runbook. This sequence makes scanner alerts reviewable instead of turning volume into a black-box ranking.

Terminology

Terms to keep straight on this page

Market-data APIs use similar words for different objects. These links keep the docs page connected to the precise CuteMarkets workflow and related reference material.

OPRA-originating data

The listed-options source context behind quotes, trades, participant records, exchange context, and consolidated option-market data.

SIP and direct feed

Market-data delivery paths that explain where consolidated equities and options records originate before a normalized API returns them.

Quote, trade, aggregate

Three different price semantics: executable bid/ask market, printed transaction, and bar-level summary.

Quote/trade condition

The sale condition, quote condition, exchange id, correction, sequence, and timestamp context attached to market-data rows.

Contract identity

The OCC symbol, expiration, strike, side, root, and reference data needed to preserve the exact option being studied.

Entitlement gate

A plan-aware check that prevents live, quote, WebSocket, or historical behavior from being implied when the product does not include it.

Access method

The delivery mode for data, such as REST request, WebSocket stream, historical window, flat file, or local cache.

Backfill window

A timestamp-bounded REST request used to repair or complete data after a stream gap, retry, deploy, or cache miss.

Session label

A premarket, regular, after-hours, closed, half-day, holiday, or unknown tag attached to a market-data timestamp.

Data-quality reject

A logged reason for skipping a candidate because required contracts, quotes, timestamps, pagination, or entitlements failed policy.

Commercial-use boundary

The product, plan, display, redistribution, and customer-facing use context that must be reviewed before shipping market data.

Adjusted option deliverable

The changed deliverable or contract terms that can appear after splits, mergers, special dividends, or other corporate actions.

Next steps

Move from the docs into the product workflow

If you are evaluating the API rather than implementing a specific endpoint right now, the product pages map live and historical workflows for stocks, options, and WebSockets.