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, mark, open interest, IV, and the Greeks, for the latest or any past session.

4 min readOptionData
option-chainapiresttutorial

Today we're shipping the Option Chain API — the third member of the OptionData family, alongside the realtime WebSocket feed and the historical SQL endpoint. 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 · mark · close

  • Positioning: open interest · OI change · volume

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

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

When to reach for it

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

  • Realtime · WebSocket — the live tape of individual trades as they happen. Best for flow detection and alerts.
  • Historical · SQL — custom analytical queries over the full trade history. Best for backtests and research.
  • Option Chain · REST — a clean snapshot of the whole chain, strikes × expirations. Best for building a chain view, pricing a spread, screening across strikes, or grabbing an end-of-day IV/Greeks surface — without writing SQL or holding a connection open.

Where it fits: the recipes that now build on it — call & put walls, gamma squeeze, and T+1 OI confirmation.

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 three APIs.

POST a symbol

Send a JSON body with your key and a symbol. Everything else is optional.

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

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:

  • api_key (required) — your OptionData API key.
  • 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.

That's the whole surface. We intentionally kept it small — no strike windows, no DTE ranges, no flow flags — so the request is obvious and the response is the complete chain you asked for.

The response

{
  "status": "SUCCESS",
  "data": [
    {
      "option_symbol": "AAPL260717C00185000",
      "put_call": "CALL",
      "strike": 185,
      "expiration_date": "2026-07-17",
      "bid": 6.55,
      "ask": 6.70,
      "mark": 6.63,
      "close": 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": { "row_limit": 10000, "truncated": false }
}
  • data — one object per contract, across every strike and expiration that matched your request.
  • meta.row_limit — the maximum number of rows a single response will return.
  • meta.truncatedtrue if the chain hit that cap; narrow by expiration_date or put_call if you see it.

In your language

Same call, from Python:

import requests

response = requests.post(
    "https://www.optiondata.io/api/option-chain",
    json={
        "api_key": "YOUR_API_KEY",
        "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.

One key, three APIs

The Option Chain API is included in the Pro plan along with the realtime WebSocket feed and historical SQL access. One API key authenticates all three.

Beta

The Option Chain API is currently v1 / Beta. The core fields above are stable; we may add fields over time, so read by key rather than by position.

One dataset, three 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. Together they cover live monitoring, research, and on-demand pricing from a single licensed source — behind a single API key.

One OPRA-licensed dataset, three ways in — Realtime WebSocket, Historical SQL, and the Option Chain REST API.

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, and Option Chain REST APIs.

OptionData API

You can run this strategy programmatically with the OptionData API. Use Historical SQL for backtests and screens, and the Realtime WebSocket for live flow.

Pull the full option chain
Snapshot every strike and expiration (bid/ask, mark, 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 "Content-Type: application/json" \
-d '{"api_key":"YOUR_API_KEY","symbol":"AAPL","expiration_date":"2026-07-17"}'