Options basics

US option symbols explained

Every US option contract has a unique symbol, such as O:AAPL261023C00345000. Once you can read it, you can build the symbol for any contract yourself.

The format

Take O:AAPL261023C00345000: an AAPL call with a $345 strike expiring October 23, 2026.

PartExampleMeaning
PrefixO:Marks it as an option, as opposed to a stock ticker
UnderlyingAAPLTicker of the underlying stock or ETF
Expiration261023Two digits each for year, month, day (YYMMDD): 2026-10-23
TypeCC = call, P = put
Strike00345000Strike × 1000, left-padded with zeros to 8 digits: 345.000

Drop the O: prefix and what's left is the standard Options Clearing Corporation (OCC) symbol used by brokers and data vendors alike.

Strikes with decimals

The strike is multiplied by 1000 and rounded, so decimals encode cleanly:

  • 322.5 → 00322500, as in O:AAPL261021P00322500
  • 600 → 00600000, as in O:QQQ261016C00600000
  • 7.5 → 00007500

Build and parse symbols in Python

import re
from datetime import date


def build_option_symbol(underlying, expiration, contract_type, strike):
    """build_option_symbol("AAPL", date(2026, 10, 23), "call", 345) -> "O:AAPL261023C00345000" """
    cp = "C" if contract_type.lower() in ("c", "call") else "P"
    return f"O:{underlying.upper()}{expiration:%y%m%d}{cp}{round(strike * 1000):08d}"


PATTERN = re.compile(r"^O:([A-Z0-9.]+?)(\d{6})([CP])(\d{8})$")


def parse_option_symbol(symbol):
    """Split an option symbol into (underlying, expiration, type, strike)."""
    m = PATTERN.match(symbol)
    if not m:
        raise ValueError(f"Not a valid option symbol: {symbol}")
    underlying, yymmdd, cp, strike = m.groups()
    expiration = date(2000 + int(yymmdd[:2]), int(yymmdd[2:4]), int(yymmdd[4:]))
    return underlying, expiration, "call" if cp == "C" else "put", int(strike) / 1000


print(build_option_symbol("AAPL", date(2026, 10, 21), "put", 322.5))  # O:AAPL261021P00322500
print(parse_option_symbol("O:QQQ261016C00600000"))  # ('QQQ', datetime.date(2026, 10, 16), 'call', 600.0)

Using symbols with the API

Option symbols go straight into endpoint paths:

  • Contract details: /v3/reference/options/contracts/O:AAPL261023C00345000
  • Single contract snapshot: /v3/snapshot/options/AAPL/O:AAPL261023C00345000
  • Bars: /v2/aggs/ticker/O:AAPL261023C00345000/range/1/day/2026-10-01/2026-10-16
  • Trades and quotes: /v3/trades/O:AAPL261023C00345000, /v3/quotes/O:AAPL261023C00345000

The colon can be written as is or URL-encoded as %3A.

Gotchas

  • Don't guess symbols. Not every strike exists for every expiration. Look contracts up first with /v3/reference/options/contracts (filter by underlying, expiration and strike range) and use the ticker it returns.
  • Expired contracts: add expired=true to the contracts endpoint.
  • Adjusted contracts: after splits, special dividends and similar corporate actions, a few adjusted contracts carry an underlying part that doesn't match the stock ticker exactly. Trust the ticker returned by the contracts endpoint.
Try it free: verify your email and you get 3 days of the Advanced plan, no card needed. Paid plans start at $6.99/month. See pricing →