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.
| Signal | Reason | Implementation detail |
|---|---|---|
| Listed date | The 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 date | The 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 month | March, 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 today | Long-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.
Audit trail
Keep the expiration decision explainable
Classification should leave an audit trail that a developer can replay without reinterpreting the calendar by hand. Store the listed date returned by the expirations endpoint, the adjusted monthly anchor used for that month, the holiday calendar version, and the rule that produced the final label. If a Friday moved to Thursday because of a closure, the row should say that explicitly instead of only showing a generic monthly badge.
The same record should travel into downstream chain and contract requests. When a scanner asks for QQQ weekly contracts, it should pass the exact expiration date, then keep the OCC symbol, strike, side, and response envelope returned by the contracts endpoint. That prevents a weekly label from being reused against a nearby monthly contract during pagination, cache refreshes, or a later backtest replay.
Long-dated cycles need the same discipline. A LEAPS candidate can share the normal monthly rule, so the API client should preserve distance from today, root ticker, listed status, and quote evidence before treating the contract as tradable. In review, the date label can say weekly, monthly, quarterly, or LEAPS, but the real question is whether the classification, endpoint request, and selected contract still describe the same market instrument.
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