The format
Take O:AAPL261023C00345000: an AAPL call with a $345 strike expiring October 23, 2026.
| Part | Example | Meaning |
|---|---|---|
| Prefix | O: | Marks it as an option, as opposed to a stock ticker |
| Underlying | AAPL | Ticker of the underlying stock or ETF |
| Expiration | 261023 | Two digits each for year, month, day (YYMMDD): 2026-10-23 |
| Type | C | C = call, P = put |
| Strike | 00345000 | Strike × 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 inO:AAPL261021P00322500 - 600 →
00600000, as inO: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 thetickerit returns. - Expired contracts: add
expired=trueto 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
tickerreturned by the contracts endpoint.
Related
- Get a US option chain with Greeks in Python
- Option Greeks explained: delta, gamma, theta, vega
- API docs: Options data
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 →