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
Result Clamping
Clamped by Plan
Clamped to plan max_rows
Parameters
Required Parameters
| Name | Type | Location | Description |
|---|---|---|---|
| symbol | string | path | Underlying equity ticker symbol. |
Optional Parameters
| Name | Type | Location | Description |
|---|---|---|---|
| expiration | string | query | Filter by expiration date in YYYY-MM-DD format. |
| side | string | query | Filter by option side ('call' or 'put'). |
| strikeMin | number | query | Minimum strike price filter. strikeMin > strikeMax returns 400 invalid_range. |
| strikeMax | number | query | Maximum strike price filter. |
| deltaMin | number | query | Filter 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. |
| deltaMax | number | query | Filter 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. |
| cursor | string | query | Opaque pagination cursor to fetch the next page of results. |
| minOI | integer | query | Minimum open interest contract floor (alias: oiMin). |
| minVolume | integer | query | Minimum daily trading volume filter (alias: volumeMin). |
| minDte | integer | query | Minimum days to expiration (alias: dteMin). |
| maxDte | integer | query | Maximum days to expiration (defaults to minDte + 45 when unset; 0 means unset). |
| limit | integer | query | Maximum 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 BasicAdd 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)
| Field | Type | Nullable | Description |
|---|---|---|---|
| symbol | string | No | Underlying equity ticker symbol. |
| underlyingPrice | number | No | Underlying spot price on the first returned contract row in USD. |
| asOf | string | Yes | ISO 8601 UTC timestamp of chain snapshot. |
| truncated | boolean | No | True when more contracts match than were returned (use nextCursor). |
| nextCursor | string | Yes | Opaque cursor to fetch the next page of results, or null when all results have been returned. |
| contracts | object[] | No | Array 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
| Status | Description |
|---|---|
| 400 | Bad Request. The request body, query parameters, or path values violated validation constraints. |
| 401 | Unauthorized. Missing, malformed, or invalid API key credential. |
| 403 | Forbidden. 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). |
| 404 | Not Found. Requested resource, ticker symbol, or option contract does not exist. |
| 405 | Method 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.) |
| 429 | Too Many Requests. Rejection reasons: `rate_limited` (per-minute limit), `too_many_concurrent_requests` (in-flight cap), `too_many_auth_failures`. |
| 500 | Internal Server Error. Unhandled internal server or database error. |
| 503 | Service Unavailable. Backing database, cache, or external provider connection unavailable. |