Option Chain Metadata API - Expirations and Strikes | FlashAlpha
  1. 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.

GET /v1/options/{ticker}
Auth required (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/SPY
import 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.

GET

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_ofstring, objectResponse 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.
404no_dataNo data for the symbol.
429Quota exceededDaily 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 expiration filter 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_contracts to size a full option-quote request
  • Track the listing calendar - spot newly listed weeklies and 0DTE expirations

Related reading

Complementary endpoints

Ready to build with FlashAlpha?

Get your free API key and start pulling live options data in 60 seconds.

No credit card required Setup in 60 seconds Secure & reliable