Back to blog

Option Chain API: The Whole Chain in One POST

The full option chain over REST, every strike and expiration with bid/ask, last price, open interest, IV, and the Greeks, for the latest or any past session.

4 min readOptionData
option-chainapiresttutorial
OPTION CHAINOptionData blog450445440435430425

Today we're shipping the Option Chain API, joining the realtime WebSocket feed and the historical SQL endpoint in the OptionData family. One POST, one symbol, and you get the entire option chain back: every strike and expiration, fully priced, with open interest, implied volatility, and the Greeks. No socket to keep alive, no SQL to write.

What you get

Send a symbol, get a clean JSON array of contracts. Every contract carries the fields you actually trade on:

Every field, on every contract

  • Pricing: bid · ask · last price

  • Positioning: open interest · OI change · volume

  • Risk / surface: IV · delta · gamma · theta · vega

It's the same OPRA-licensed dataset that powers our other APIs, shaped as a point-in-time snapshot of the whole chain instead of a stream of individual prints.

When to reach for it

OptionData gives you four ways into one dataset. Pick the shape that fits the job:

JobProduct
Live prints and flow alertsRealtime · WebSocket
Custom research over the tapeHistorical · SQL
Filterable contract quotes & GreeksOption Chain · REST
Full-chain GEX, walls, Max Pain, IV regimeMarket Structure · REST

Where it fits: recipes that build on it: call & put walls, gamma squeeze, and T+1 OI confirmation. For precomputed GEX and walls without assembling the board yourself, prefer Market Structure.

Quick start

Grab your API key

Sign in, start your free trial, and copy your API key from the dashboard. The same key works across all four APIs.

POST a symbol

Prefer Bearer auth. You can still pass api_key in the JSON body for compatibility.

curl -X POST https://www.optiondata.io/api/option-chain \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "symbol": "AAPL",
    "expiration_date": "2026-07-17",
    "strike_min": 180,
    "strike_max": 220
  }'

Read the chain

You get back a data array of fully-priced contracts. Render it, sort it, or feed it straight into your pricing model.

The request

A single POST to https://www.optiondata.io/api/option-chain with a JSON body:

  • AuthAuthorization: Bearer YOUR_API_KEY (preferred). Body field api_key is still accepted when the header is absent.
  • symbol (required), the underlying, e.g. AAPL.
  • date (optional), a trading day as YYYY-MM-DD. Defaults to the latest available session.
  • expiration_date (optional), narrow the chain to a single expiration.
  • put_call (optional) , CALL or PUT to return just one side.
  • strike (optional), an exact strike price, e.g. 185.
  • strike_min / strike_max (optional), an inclusive strike range; either bound can stand alone. Can't be combined with strike.

We kept it focused, no DTE ranges, no flow flags, so the request stays obvious and the response is the complete chain you asked for.

The response

{
  "data": [
    {
      "option_symbol": "AAPL260717C00185000",
      "put_call": "CALL",
      "strike": 185,
      "expiration_date": "2026-07-17",
      "bid": 6.55,
      "ask": 6.70,
      "last_price": 6.41,
      "open_interest": 12840,
      "open_interest_change": 310,
      "volume": 4215,
      "implied_volatility": 0.2413,
      "delta": 0.58,
      "gamma": 0.021,
      "theta": -0.18,
      "vega": 0.12
    }
  ],
  "meta": {
    "trading_date": "2026-06-03",
    "as_of": "2026-06-03T19:44:12.000Z"
  }
}
  • data, one object per contract, across every strike and expiration that matched your request.
  • meta.trading_date, the market session returned.
  • meta.as_of, the latest data update represented in the response, in UTC.
  • If a request is too broad, narrow it with expiration_date, put_call, or a strike range and retry.

In your language

Same call, from Python:

import requests

response = requests.post(
    "https://www.optiondata.io/api/option-chain",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "symbol": "AAPL",
        "expiration_date": "2026-07-17",
        "put_call": "CALL",
    },
)

chain = response.json()["data"]
print(len(chain), "contracts")

Latest session, or any trading day

Leave date off and you get the most recent session. Set it to a past YYYY-MM-DD and you get that day's chain as it stood, handy for end-of-day marks, point-in-time IV surfaces, or reconstructing what a spread looked like before an event.

Snapshot history for Option Chain (and Market Structure) grows with U.S. trading sessions from about 2026-02-20 forward. For trade-by-trade history back to 2025-02-18, use Historical SQL (≥15-minute delay).

One key, four APIs

Option Chain is included in the Pro plan with realtime WebSocket, Historical SQL, and Market Structure. One API key authenticates all four. 14-day free trial; no credit card required to start.

One dataset, four ways in

The realtime feed tells you what's trading right now. Historical SQL lets you ask deep questions of the past. The Option Chain API gives you the whole board at a glance. Market Structure gives you the positioning map on that board (GEX, walls, flip). Together they cover live monitoring, research, on-demand pricing, and structure—from a single licensed source, behind a single API key.

Ready to try it? Head to the Option Chain API page, run a symbol in the live playground, and start a free trial.


Run it with the OptionData API. Start a 14-day free trial (no credit card). One API key covers the Realtime WebSocket, Historical SQL, Option Chain REST, and Market Structure APIs.

OptionData API

Run this with the OptionData API — one Pro key covers Realtime WebSocket, Historical SQL, Option Chain, and Market Structure.

Pull the full option chain
Snapshot every strike and expiration (bid/ask, last price, OI, IV, Greeks) for a symbol in one POST — the latest session or any past trading day.
curl -X POST https://www.optiondata.io/api/option-chain \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"symbol":"AAPL","expiration_date":"2026-07-17"}'