Developer guide

Weekly Options Classification API

Options workflows often need more than a list of dates. You need to know whether a listed expiration is weekly, standard monthly, quarterly OpEx, or a long-dated LEAPS cycle.

Weekly

Listed short-dated cycle that is not the standard monthly third-Friday expiration.

Monthly

Standard third-Friday cycle, adjusted earlier if that Friday is a market holiday.

Quarterly

Monthly cycle in March, June, September, or December.

LEAPS

Long-dated monthly cycle, often January, listed far into the future.

Classification signals to preserve

The API can return listed dates and contracts; your application should store enough context to explain why a date was labeled weekly, monthly, quarterly, or long-dated.

SignalReasonImplementation detail
Listed dateThe listed expiration is the source of truth for whether contracts exist.Fetch `/v1/tickers/expirations/{ticker}` before assigning labels or requesting a chain.
Adjusted monthly dateThe standard third-Friday rule can move earlier when the market is closed.Calculate the adjusted monthly anchor, then compare the listed date against that anchor.
Quarterly monthMarch, June, September, and December monthly cycles often need a separate OpEx label.If the adjusted monthly date falls in a quarterly month, classify it as quarterly instead of generic monthly.
Distance from todayLong-dated contracts can look like normal monthly expirations if the date is stored without context.Keep a long-dated or LEAPS candidate label when the expiration is far beyond nearby weekly cycles.

Production detail

Separate classification from tradability

A classification label explains where a date sits in the expiration calendar. It does not prove a contract is liquid, active, or suitable for a scanner. After the date is classified, request contracts for that date, then inspect quote width, quote timestamp, open interest, and recent trade evidence before surfacing a leg.

This separation matters for thinly traded names and for backtests. A backtest that assumes every Friday is a tradable weekly date can create empty contract sets or select contracts that were not listed at the simulated time. A cleaner workflow stores the listed date, classification label, OCC symbol, and quote evidence together.

Minimum classification logic

Fetch listed expirations first, then classify each date against the adjusted third-Friday monthly cycle. Keep holiday adjustment separate from listed-date discovery.

def classify_expiration(date, monthly_date):
    if date == monthly_date and date.month in {3, 6, 9, 12}:
        return "quarterly"
    if date == monthly_date:
        return "monthly"
    if date.year - today.year >= 1:
        return "leaps_or_long_dated"
    return "weekly"

Endpoint examples

curl "https://api.cutemarkets.com/v1/tickers/expirations/QQQ/" \
  -H "Authorization: Bearer YOUR_API_KEY"

curl "https://api.cutemarkets.com/v1/options/contracts/?underlying_ticker=QQQ&expiration_date=2026-04-17&limit=100" \
  -H "Authorization: Bearer YOUR_API_KEY"

Related pages