Get filtered option chain matrix
GET/v1/chain/{symbol}

Get filtered option chain matrix

Returns option chain contracts matrix with pricing and Greeks. Defaults to max 45 DTE window (or minDte+45 if minDte is specified). Default limit is 500; when your plan's max_rows is below the default (or requested limit exceeds max_rows), limit is clamped and X-Limit-Clamped is set to true. Near-spot pages keep the page-1 spot as underlyingPrice, and each page is sorted by expiration/strike/type for display (pages are not globally sorted).

Endpoint Usage & Plan Rules

Plan Access
Included in Basic
Active subscription
Rate Limit
One request per call; no daily quota
Result Clamping
Clamped by Plan
Clamped to plan max_rows

Parameters

Required Parameters

NameTypeLocationDescription
symbolstringpathUnderlying equity ticker symbol.

Optional Parameters

NameTypeLocationDescription
expirationstringqueryFilter by expiration date in YYYY-MM-DD format.
sidestringqueryFilter by option side ('call' or 'put').
strikeMinnumberqueryMinimum strike price filter. strikeMin > strikeMax returns 400 invalid_range.
strikeMaxnumberqueryMaximum strike price filter.
deltaMinnumberqueryFilter by minimum absolute delta value. Signed put deltas (e.g. -0.30) are accepted and normalised to absolute values [0.0 to 1.0]. |delta| > 1 returns 400 invalid_parameter.
deltaMaxnumberqueryFilter by maximum absolute delta value. Signed put deltas (e.g. -0.30) are accepted and normalised to absolute values [0.0 to 1.0]. |delta| > 1 returns 400 invalid_parameter.
cursorstringqueryOpaque pagination cursor to fetch the next page of results.
minOIintegerqueryMinimum open interest contract floor (alias: oiMin).
minVolumeintegerqueryMinimum daily trading volume filter (alias: volumeMin).
minDteintegerqueryMinimum days to expiration (alias: dteMin).
maxDteintegerqueryMaximum days to expiration (defaults to minDte + 45 when unset; 0 means unset).
limitintegerqueryMaximum number of contracts to return. Capped at your account plan's max_rows limit; see https://api.wheelstrategyoptions.com/pricing.

Request Examples

curl -s -H "Authorization: Bearer $WSO_API_KEY" \
  "https://api.wheelstrategyoptions.com/v1/chain/AAPL?side=call&limit=50"

Try it

GET/v1/chain/{symbol}
Included in Basic

Requests run against the live API with your key and count against its rate limits. The key is sent only to this site. Sign in to get a key

Add your API key to send.
Response

Send a request to see the live response, its status, timing, and rate-limit headers.

Response Attributes (200 OK)

FieldTypeNullableDescription
symbolstringNoUnderlying equity ticker symbol.
underlyingPricenumberNoUnderlying spot price on the first returned contract row in USD.
asOfstringYesISO 8601 UTC timestamp of chain snapshot.
truncatedbooleanNoTrue when more contracts match than were returned (use nextCursor).
nextCursorstringYesOpaque cursor to fetch the next page of results, or null when all results have been returned.
contractsobject[]NoArray of option contracts matching filter parameters.

Response Example

json
{
  "asOf": "2026-10-09T17:26:29.555Z",
  "contracts": [
    {
      "optionSymbol": "AAPL261009C00110000",
      "underlying": "AAPL",
      "expiration": "2026-10-09",
      "strike": 110,
      "side": "call",
      "bid": 228.75,
      "ask": 231.55,
      "mid": 230.15,
      "last": 224.9,
      "volume": 0,
      "openInterest": 1,
      "iv": 383.07,
      "delta": 1,
      "gamma": 0,
      "theta": 0,
      "vega": 0,
      "rho": 0.003015,
      "underlyingPrice": 340.6,
      "spreadPercent": 1.22,
      "dte": 0,
      "asOf": "2026-10-09T00:15:46.697984Z"
    },
    {
      "optionSymbol": "AAPL261009P00110000",
      "underlying": "AAPL",
      "expiration": "2026-10-09",
      "strike": 110,
      "side": "put",
      "bid": 0,
      "ask": 0.01,
      "mid": 0.005,
      "last": 0.01,
      "volume": 0,
      "openInterest": 1100,
      "iv": 204.49,
      "delta": 0,
      "gamma": 0,
      "theta": 0,
      "vega": 0,
      "rho": 0,
      "underlyingPrice": 340.6,
      "spreadPercent": 200,
      "dte": 0,
      "asOf": "2026-10-09T00:15:46.697984Z"
    },
    {
      "optionSymbol": "AAPL261009C00120000",
      "underlying": "AAPL",
      "expiration": "2026-10-09",
      "strike": 120,
      "side": "call",
      "bid": 213.45,
      "ask": 216.4,
      "mid": 214.925,
      "last": 214.93,
      "volume": 4,
      "openInterest": 16,
      "iv": 3251.64,
      "delta": 0.983226,
      "gamma": 0.000224,
      "theta": -36.407934,
      "vega": 0.002387,
      "rho": 0.00033,
      "underlyingPrice": 335.03,
      "spreadPercent": 1.37,
      "dte": 0,
      "asOf": "2026-10-09T17:26:29.555Z"
    }
  ],
  "symbol": "AAPL",
  "truncated": true,
  "underlyingPrice": 340.6
}

Error Responses

StatusDescription
400Bad Request. The request body, query parameters, or path values violated validation constraints.
401Unauthorized. Missing, malformed, or invalid API key credential.
403Forbidden. Rejection reasons: `subscription_required` (no subscription record), `subscription_inactive` (subscription not active), `trial_ended` (trial has expired), `wrong_credential_type`, `origin_forbidden` (origin authentication failed).
404Not Found. Requested resource, ticker symbol, or option contract does not exist.
405Method Not Allowed. Returned with an `Allow` header when an unsupported HTTP method is used. Error code: `method_not_allowed`. (HEAD is served on all GET routes and counts against the rate limit like GET.)
429Too Many Requests. Rejection reasons: `rate_limited` (per-minute limit), `too_many_concurrent_requests` (in-flight cap), `too_many_auth_failures`.
500Internal Server Error. Unhandled internal server or database error.
503Service Unavailable. Backing database, cache, or external provider connection unavailable.
Get option expiration scheduleScreen option contracts with multi-factor filters