- Live API Reference
- Market Data
- Symbols & Contracts
- Option Expiries & Strikes
Option Expiries & Strikes API
Every available expiration for a symbol, with its strikes.
Endpoint
Returns option chain metadata for a symbol: all available expirations with their strikes.
X-Api-Key)
Rate Limited: Yes
Plan: Free+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
ticker |
path | string | required | - | Underlying symbol (e.g. SPY) |
Request
curl -H "X-Api-Key: YOUR_API_KEY" \
https://lab.flashalpha.com/v1/options/SPYimport requests
resp = requests.get(
"https://lab.flashalpha.com/v1/options/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
meta = resp.json()
for exp in meta["expirations"]:
print(exp["expiration"], len(exp["strikes"]), "strikes")const resp = await fetch("https://lab.flashalpha.com/v1/options/SPY", {
headers: { "X-Api-Key": "YOUR_API_KEY" }
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const meta = await resp.json();
meta.expirations.forEach(e => console.log(e.expiration, e.strikes.length, "strikes"));Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"symbol": "SPY",
"expirations": [
{
"expiration": "2026-10-30",
"strikes": [
470,
475,
480
]
},
{
"expiration": "2026-11-02",
"strikes": [
550,
555,
560
]
}
],
"expiration_count": 34,
"total_contracts": 12318,
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa5",
"equity_feed": "2026-10-30T13:46:16.918Z",
"equity_options_feed": "2026-10-30T13:46:16Z",
"index_feed": "2026-10-30T13:46:16.137Z",
"index_options_feed": "2026-10-30T13:46:16Z",
"futures_feed": "2026-10-30T13:46:15.271Z",
"futures_options_feed": "2026-10-30T13:46:14.335Z",
"flow_feed": "2026-10-30T13:46:00Z",
"oi_feed": "2026-10-29T20:00:00Z",
"macro_feed": "2026-10-29T21:00:20Z"
}
}Sending request…
See this endpoint on live data
Send this exact request and the real response shows up here, right next to the example.
Response Fields
| Field | Type | Description |
|---|---|---|
symbol |
string | Underlying symbol |
expirations |
array | One entry per expiration date |
expirations[].expiration |
string | Expiration date (yyyy-MM-dd) |
expirations[].strikes |
array of number | Strikes listed for that expiration |
expiration_count |
integer | Number of expirations |
total_contracts |
integer | Total number of expiration/strike pairs |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Errors
| Status | Error | When |
|---|---|---|
401 | - | Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON. |
404 | no_data | No data for the symbol. |
429 | Quota exceeded | Daily quota used up. Retry-After gives the seconds until the reset at 00:00 UTC. Rejected requests (including 403) count toward the quota. |
Authentication (401) and rate-limit (429) errors use the common error format, see Error Responses.
What Is the Option Expiries & Strikes Endpoint?
This endpoint describes the shape of a symbol's option chain without pricing it: which expirations exist and which strikes each one lists. It is the cheap first call before a chain or exposure request, so you can pick a valid expiration and strike instead of guessing, and it tells you how large a full chain pull will be.
Common Use Cases
- Pick a valid expiration - feed the
expirationfilter of the exposure endpoints with a date that exists - Build expiry and strike selectors - populate dropdowns in a trading UI
- Plan chain pulls - use
total_contractsto size a full option-quote request - Track the listing calendar - spot newly listed weeklies and 0DTE expirations
Related
Related reading
- Options expiration dates API - working with listed expirations programmatically
Complementary endpoints
- Option Quote - prices and greeks for the contracts listed here
- Available Tickers - every symbol you can query
- Gamma Exposure (GEX) - filter exposure by one of these expirations