{
  "openapi": "3.1.0",
  "info": {
    "title": "WSO Options Data API",
    "version": "1.0.0",
    "description": "REST API providing US equity options chain matrices, quotes, options flow, dealer gamma exposure (GEX), implied volatility analytics, and options screener tools.\n\n### Base URL & Authentication\nAll API requests are served over HTTPS from:\n```\nhttps://api.wheelstrategyoptions.com\n```\n\nEvery `/v1/*` endpoint (except public schema documentation) requires an authenticated Bearer token passed in the `Authorization` header:\n```http\nAuthorization: Bearer wso_live_...\n```\nAPI keys are created and managed via the developer dashboard at `https://api.wheelstrategyoptions.com/dashboard`. Keys adhere to the format `wso_live_<43_chars><6_checksum>` (58 characters, regex `^wso_live_[0-9a-zA-Z]{49}$`). API keys must **never** be supplied in query strings, as query strings appear in web proxy and server access logs.\n\n### Plans & Limits\nEach plan sets a per-minute request rate limit, a concurrent request limit, a cap on rows per list request and a historical lookback window; current plans, prices and limits are listed at GET /public/plans. Each call counts as one request against your plan's per-minute rate limit; concurrent requests are capped; there is no daily quota. See plan pricing and limits at https://api.wheelstrategyoptions.com/pricing.\n\n### Rate Limiting & Concurrency\nLimits are enforced per account across all keys:\n- **Per-minute rate limit**: GCRA rate limiting. When exceeded, the server responds with HTTP 429 Too Many Requests, error code `rate_limited`, and a `Retry-After` header indicating seconds until retry.\n- **Account concurrency limit**: In-flight requests are capped by your plan. Requests exceeding the concurrency limit return HTTP 429 with error code `too_many_concurrent_requests` and `Retry-After: 1`.\n- **Edge security**: IP rate limiting and authentication failure lockouts (`too_many_auth_failures`) apply when requests arrive behind Cloudflare origin authentication.\n\n### HTTP Methods & HEAD Support\nHEAD requests are served on GET routes and count against the rate limit like GET. Requests using unsupported HTTP methods on any route (including `/v1/*`, `/public/plans`, `/health`, `/ready` and `/openapi.json`) return HTTP 405 with a JSON `method_not_allowed` error and an `Allow` header.\n\n### Response Headers\nResponses include diagnostic and rate-limit headers according to the stage reached in request processing:\n- `X-Request-ID`: Present on every response. Echoes a valid client-supplied request ID or contains a server-generated UUID for tracing.\n- `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`: Present on all responses processed through the rate limiting pipeline (including successful 200 responses and downstream handler 4xx/5xx errors). Absent on early rejection responses (401 Unauthorized, 403 Forbidden, 404 Not Found before pipeline routing, IP-limit 429, and auth-failure 429). `X-RateLimit-Reset` indicates the time in seconds until the bucket fully refills.\n- `X-Limit-Clamped`: Set to `true` on responses when query results or date windows were clamped by active plan row limits or history lookback limits. Can appear on successful 200 responses as well as downstream handler 4xx/5xx responses.\n- `Retry-After`: Present on HTTP 429 responses indicating retry delay in seconds.\n- `WWW-Authenticate`: Present on HTTP 401 Unauthorized responses specifying the Bearer challenge.\n\n### Public Documentation\nThe OpenAPI 3.1.0 specification is publicly accessible without authentication at `/v1/openapi.json` and `/openapi.json`, supporting client caching via `ETag` and `If-None-Match`.\n\n### Usage Terms\nMarket data and analytical metrics provided by the API are licensed for developer and internal application use subject to the Wheel Strategy Options Terms of Service. API credentials belong to your account; credential sharing is prohibited. Commercial redistribution of raw feed data without explicit agreement is prohibited."
  },
  "servers": [
    {
      "url": "https://api.wheelstrategyoptions.com"
    }
  ],
  "tags": [
    {
      "name": "Account",
      "description": "Verify credentials and inspect live account entitlement, daily requests usage, and rate limits."
    },
    {
      "name": "Quotes",
      "description": "Current and fallback US equity spot quotes with corporate profile metadata and exchange timestamps."
    },
    {
      "name": "Options",
      "description": "Option contract quotes, multi-symbol batch quotes, expiration schedules, and filtered matrices."
    },
    {
      "name": "Screener",
      "description": "Options screener supporting custom column comparisons, wheel contract scores, and multi-level sorting."
    },
    {
      "name": "Calendar",
      "description": "Corporate action schedules covering earnings announcement windows and upcoming dividend ex-dates."
    },
    {
      "name": "Volatility",
      "description": "Implied volatility metrics, 52-week IV range extremes, percentile ranks, and market-wide top volatility screeners."
    },
    {
      "name": "GEX",
      "description": "Dealer gamma exposure profiles, gamma flip price levels, major strike walls, and 2D expiration heatmaps."
    },
    {
      "name": "Flow",
      "description": "Options flow trades capturing sweeps, blocks, and splits, alongside 1-minute net flow bars."
    },
    {
      "name": "Meta",
      "description": "Service health probes, dependency readiness verification, and OpenAPI contract specifications."
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "Service health check probe",
        "description": "Returns HTTP 200 and binary version string when the API service process is active.",
        "operationId": "health",
        "security": [],
        "responses": {
          "200": {
            "description": "System health check response.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/ready": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "Dependency readiness probe",
        "description": "Probes connectivity to the primary market database and control plane databases.",
        "operationId": "ready",
        "security": [],
        "responses": {
          "200": {
            "description": "Readiness probe status.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadyResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "503": {
            "description": "Readiness probe failed.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "OpenAPI 3.1.0 contract document",
        "description": "Returns the complete OpenAPI 3.1.0 specification with ETag and public caching.",
        "operationId": "openapi",
        "security": [],
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag value for conditional cache validation.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OpenAPI 3.1.0 JSON specification document.",
            "headers": {
              "ETag": {
                "description": "Specification content hash for conditional caching.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Public caching policy.",
                "schema": {
                  "type": "string",
                  "example": "public, max-age=3600"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header permitting cross-origin access.",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              },
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "304": {
            "description": "Document not modified since the provided ETag.",
            "headers": {
              "ETag": {
                "description": "Specification content hash.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Public caching policy.",
                "schema": {
                  "type": "string",
                  "example": "public, max-age=3600"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header permitting cross-origin access.",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              },
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenRank0"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequestsRank0"
          }
        }
      }
    },
    "/v1/openapi.json": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "OpenAPI contract document alias",
        "description": "Versioned alias for GET /openapi.json.",
        "operationId": "openapi_v1",
        "security": [],
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag value for conditional cache validation.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OpenAPI 3.1.0 JSON specification document.",
            "headers": {
              "ETag": {
                "description": "Specification content hash for conditional caching.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Public caching policy.",
                "schema": {
                  "type": "string",
                  "example": "public, max-age=3600"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header permitting cross-origin access.",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              },
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "304": {
            "description": "Document not modified since the provided ETag.",
            "headers": {
              "ETag": {
                "description": "Specification content hash.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Public caching policy.",
                "schema": {
                  "type": "string",
                  "example": "public, max-age=3600"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header permitting cross-origin access.",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              },
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenRank0"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequestsRank0"
          }
        }
      }
    },
    "/v1/auth/verify": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Verify credentials and entitlement",
        "description": "Verifies that an API key is valid, unrevoked, and checks active tier subscription status.",
        "operationId": "verify",
        "x-min-plan": null,
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/auth/verify\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/auth/verify\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/auth/verify\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "responses": {
          "200": {
            "description": "Key verified successfully.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerifyResponse"
                },
                "example": {
                  "key_id": 2,
                  "key_prefix": "wso_live_YOURKEY",
                  "status": "authenticated",
                  "plan": "basic",
                  "subscription_status": "active",
                  "entitled": true,
                  "entitlement_reason": ""
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenRank0"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequestsRank0"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/usage": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Get account usage and limits",
        "description": "Account usage metrics and rate limits.",
        "operationId": "usage",
        "x-min-plan": null,
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/usage\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/usage\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/usage\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "responses": {
          "200": {
            "description": "Account usage metrics and rate limits.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UsageResponse"
                },
                "example": {
                  "plan": "basic",
                  "subscription_status": "active",
                  "entitled": true,
                  "date": "2026-10-10",
                  "requests": {
                    "today": 42,
                    "reset_at": "2026-10-11T04:00:00Z",
                    "reset_unix": 1791691200
                  },
                  "rate_limit": {
                    "requests_per_minute": 300
                  },
                  "concurrency": {
                    "max": 5
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenRank0"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequestsRank0"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/quotes/{symbol}": {
      "get": {
        "tags": [
          "Quotes"
        ],
        "summary": "Get equity spot price quote",
        "description": "Retrieves the latest equity spot quote and company profile name.",
        "operationId": "quotes",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/quotes/AAPL\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/quotes/AAPL\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/quotes/AAPL\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol (1-10 uppercase alphanumeric, dot, or hyphen). Invalid format returns 400 invalid_parameter.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9.\\-]{1,10}$",
              "example": "AAPL"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current or database fallback stock quote.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Data-Source": {
                "$ref": "#/components/headers/X-Data-Source"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteResponse"
                },
                "example": {
                  "symbol": "AAPL",
                  "name": "Apple Inc.",
                  "price": 337.389617919922,
                  "asOf": "2026-10-09T19:30:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "502": {
            "$ref": "#/components/responses/BadGateway"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/options/quotes/{optionSymbol}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Get single option contract quote",
        "description": "Returns option pricing, Greeks, volume, and open interest for an OCC contract symbol.",
        "operationId": "option_quote",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/options/quotes/SPY270917C00800000\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/options/quotes/SPY270917C00800000\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/options/quotes/SPY270917C00800000\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "optionSymbol",
            "in": "path",
            "required": true,
            "description": "Full OCC option contract symbol. Missing symbol returns 400 missing_symbol.",
            "schema": {
              "type": "string",
              "example": "SPY270917C00800000"
            },
            "example": "SPY270917C00800000"
          }
        ],
        "responses": {
          "200": {
            "description": "Option contract quote.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OptionQuote"
                },
                "example": {
                  "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"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/options/quotes": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Batch fetch multiple option quotes",
        "description": "Retrieves quotes for up to 20 comma-separated OCC option symbols in a single request. A batch counts as one request however many symbols it names; duplicate symbols are queried and returned once. Unknown symbols are returned in the `missing` array. Result order of quotes is unspecified.",
        "operationId": "option_quotes_batch",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/options/quotes?symbols=SPY270917C00800000,SPY270917P00750000\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/options/quotes?symbols=SPY270917C00800000,SPY270917P00750000\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/options/quotes?symbols=SPY270917C00800000,SPY270917P00750000\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbols",
            "in": "query",
            "required": true,
            "description": "Comma-separated list of up to 20 OCC option symbols. Exceeding 20 returns 400 too_many_symbols.",
            "schema": {
              "type": "string",
              "example": "SPY270917C00800000,SPY270917P00750000"
            },
            "example": "SPY270917C00800000,SPY270917P00750000"
          }
        ],
        "responses": {
          "200": {
            "description": "Array of returned option contract quotes.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OptionQuotesBatchResponse"
                },
                "example": {
                  "quotes": [
                    {
                      "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"
                    }
                  ],
                  "missing": []
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/expirations/{symbol}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Get option expiration schedule",
        "description": "Returns available expiration dates and days to expiry (DTE) for an underlying stock.",
        "operationId": "expirations",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/expirations/AAPL\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/expirations/AAPL\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/expirations/AAPL\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol. Missing symbol returns 400 missing_symbol.",
            "schema": {
              "type": "string",
              "example": "AAPL"
            }
          },
          {
            "name": "minDte",
            "in": "query",
            "required": false,
            "description": "Minimum days to expiration (alias: dteMin; default 0).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "maxDte",
            "in": "query",
            "required": false,
            "description": "Maximum days to expiration (alias: dteMax; default 365; 0 means unset, defaulting to 365).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 365
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Option expiration schedule.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpirationsResponse"
                },
                "example": {
                  "asOf": "2026-10-09T19:33:58.413Z",
                  "expirations": [
                    {
                      "expiration": "2026-10-09",
                      "dte": 0
                    },
                    {
                      "expiration": "2026-10-12",
                      "dte": 3
                    },
                    {
                      "expiration": "2026-10-14",
                      "dte": 5
                    },
                    {
                      "expiration": "2026-10-16",
                      "dte": 7
                    },
                    {
                      "expiration": "2026-10-19",
                      "dte": 10
                    },
                    {
                      "expiration": "2026-10-21",
                      "dte": 12
                    },
                    {
                      "expiration": "2026-10-23",
                      "dte": 14
                    },
                    {
                      "expiration": "2026-10-30",
                      "dte": 21
                    },
                    {
                      "expiration": "2026-11-06",
                      "dte": 28
                    },
                    {
                      "expiration": "2026-11-13",
                      "dte": 35
                    },
                    {
                      "expiration": "2026-11-20",
                      "dte": 42
                    },
                    {
                      "expiration": "2026-11-27",
                      "dte": 49
                    },
                    {
                      "expiration": "2026-12-18",
                      "dte": 70
                    },
                    {
                      "expiration": "2027-01-15",
                      "dte": 98
                    },
                    {
                      "expiration": "2027-02-19",
                      "dte": 133
                    },
                    {
                      "expiration": "2027-03-19",
                      "dte": 161
                    },
                    {
                      "expiration": "2027-04-16",
                      "dte": 189
                    },
                    {
                      "expiration": "2027-06-17",
                      "dte": 251
                    },
                    {
                      "expiration": "2027-09-17",
                      "dte": 343
                    }
                  ],
                  "symbol": "AAPL"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/chain/{symbol}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Get filtered option chain matrix",
        "description": "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).",
        "operationId": "chain",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/chain/AAPL?side=call&limit=50\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/chain/AAPL?side=call&limit=50\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/chain/AAPL?side=call&limit=50\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol.",
            "schema": {
              "type": "string",
              "example": "AAPL"
            }
          },
          {
            "name": "expiration",
            "in": "query",
            "required": false,
            "description": "Filter by expiration date in YYYY-MM-DD format.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "Filter by option side ('call' or 'put').",
            "schema": {
              "type": "string",
              "enum": [
                "call",
                "put"
              ]
            }
          },
          {
            "name": "strikeMin",
            "in": "query",
            "required": false,
            "description": "Minimum strike price filter. strikeMin > strikeMax returns 400 invalid_range.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "strikeMax",
            "in": "query",
            "required": false,
            "description": "Maximum strike price filter.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "deltaMin",
            "in": "query",
            "required": false,
            "description": "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.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "deltaMax",
            "in": "query",
            "required": false,
            "description": "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.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor to fetch the next page of results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minOI",
            "in": "query",
            "required": false,
            "description": "Minimum open interest contract floor (alias: oiMin).",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "minVolume",
            "in": "query",
            "required": false,
            "description": "Minimum daily trading volume filter (alias: volumeMin).",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "minDte",
            "in": "query",
            "required": false,
            "description": "Minimum days to expiration (alias: dteMin).",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "maxDte",
            "in": "query",
            "required": false,
            "description": "Maximum days to expiration (defaults to minDte + 45 when unset; 0 means unset).",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of contracts to return. Capped at your account plan's max_rows limit; see https://api.wheelstrategyoptions.com/pricing.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 250
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Option chain contracts matching query filters.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChainResponse"
                },
                "example": {
                  "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
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/contracts/screen": {
      "post": {
        "tags": [
          "Screener"
        ],
        "summary": "Screen option contracts with multi-factor filters",
        "description": "Screen option contracts matching custom filter predicates. Request body page and pageSize take precedence over query parameters; query parameters apply only when body values are <= 0. Results are silently capped at 100 contracts (not plan-clamped). Default sort order is option_key ASC (or expiration ASC, strike ASC, option_key ASC when a single symbol is pinned); specifying an explicit sort filter (e.g. contractScore desc) is recommended.",
        "operationId": "screen",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -X POST -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbols\":[\"AAPL\"],\"deltaMax\":0.35,\"dteMax\":45}' \\\n  \"https://api.wheelstrategyoptions.com/v1/contracts/screen\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.post(\n    \"https://api.wheelstrategyoptions.com/v1/contracts/screen\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"},\n    json={\"symbols\": [\"AAPL\"], \"deltaMax\": 0.35, \"dteMax\": 45}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/contracts/screen\", {\n    method: \"POST\",\n    headers: {\n      \"Authorization\": `Bearer ${process.env.WSO_API_KEY}`,\n      \"Content-Type\": \"application/json\"\n    },\n    body: JSON.stringify({ symbols: [\"AAPL\"], deltaMax: 0.35, dteMax: 45 })\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (1-based; body value takes precedence if > 0; query applies only when body page <= 0).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": false,
            "description": "Results per page (1 to 100, default 10; body value takes precedence if > 0; query applies only when body pageSize <= 0; values > 100 capped silently).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            }
          }
        ],
        "requestBody": {
          "required": false,
          "description": "Screener filter predicates, sorting criteria, and pagination parameters.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScreenRequest"
              },
              "examples": {
                "cashSecuredPuts": {
                  "summary": "Cash-Secured Puts (CSPs)",
                  "description": "Scan for high-yield out-of-the-money puts with delta between -0.35 and -0.20, DTE between 30 and 45 days, minimum open interest 100, strike cushion >= 5% (strike <= spot * 0.95), sorted by contractScore descending.",
                  "value": {
                    "type": "put",
                    "deltaMin": -0.35,
                    "deltaMax": -0.2,
                    "dteMin": 30,
                    "dteMax": 45,
                    "openInterestMin": 100,
                    "filters": [
                      {
                        "field": "put",
                        "operation": "strikeFilter",
                        "value": 0.05
                      },
                      {
                        "field": "contractScore",
                        "operation": "sort",
                        "value": "desc"
                      }
                    ],
                    "pageSize": 10
                  }
                },
                "coveredCalls": {
                  "summary": "Covered Calls with Dividends",
                  "description": "Scan for out-of-the-money calls on dividend-paying equities with dividend yield >= 2%, delta <= 0.40, DTE <= 60, sorted by annualized return.",
                  "value": {
                    "type": "call",
                    "deltaMax": 0.4,
                    "dteMax": 60,
                    "filters": [
                      {
                        "field": "dividendYield",
                        "operation": "gte",
                        "value": 2
                      },
                      {
                        "field": "annualizedReturn",
                        "operation": "sort",
                        "value": "desc"
                      }
                    ],
                    "pageSize": 10
                  }
                },
                "highIvEarningsExclusion": {
                  "summary": "High IV with Earnings Exclusion",
                  "description": "Scan for high implied volatility equities with IVR >= 50, marketCap > 5B, excluding contracts expiring during corporate earnings announcement weeks.",
                  "value": {
                    "type": "put",
                    "filters": [
                      {
                        "field": "ivr",
                        "operation": "gte",
                        "value": 50
                      },
                      {
                        "field": "marketCap",
                        "operation": "gt",
                        "value": 5000000000
                      },
                      {
                        "field": "earnings",
                        "operation": "excludeEarnings",
                        "value": "contract"
                      },
                      {
                        "field": "stockIV",
                        "operation": "sort",
                        "value": "desc"
                      }
                    ],
                    "pageSize": 10
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Paginated candidate contract screening results.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScreenResponse"
                },
                "example": {
                  "count": 1000,
                  "countCapped": true,
                  "hasMore": true,
                  "results": [
                    {
                      "symbol": "A",
                      "type": "call",
                      "expiration": "2026-10-16T00:00:00Z",
                      "strike": 140,
                      "yieldPercent": 16.86,
                      "bidPrice": 23.6,
                      "volume": 3,
                      "openInterest": 44,
                      "delta": 0.97663,
                      "annualizedReturn": 876.8803,
                      "lastUpdatedDate": "2026-10-09T19:33:52.362Z",
                      "optionKey": "A261016C00140000",
                      "probability": 0.02406497,
                      "yesterdayMark": 29.3,
                      "thirtyDayAverageVolume": 2,
                      "thirtyDayAverageIV": 0.44,
                      "thirtyDayAveragePremium": 2130,
                      "premiumChange1dPct": null,
                      "volumeZScore30d": 0.19,
                      "openInterestZScore30d": -2.98,
                      "volumeStdDev30d": 3.86,
                      "openInterestStdDev30d": 22.84,
                      "volumeHistorySamples30d": 22,
                      "openInterestHistorySamples30d": 22,
                      "contractScore": 0.3483,
                      "premium": 2360,
                      "lastPrice": 16.65,
                      "lastTradeDate": "2026-09-18T19:14:26.111Z",
                      "askPrice": 26.6,
                      "stockPrice": 171.031311035156,
                      "impliedVolatility": 75.2,
                      "vega": 0.01306,
                      "gamma": 0.00308,
                      "theta": -0.08217,
                      "earningsDate": "2026-11-23T00:00:00Z",
                      "marketCap": 47302000000,
                      "industry": "Diagnostics & Research",
                      "sector": "Healthcare",
                      "peRatio": 33.0927,
                      "rating": "B+",
                      "consensus": "Buy",
                      "overallScore": 3,
                      "discountedCashFlowScore": 3,
                      "returnOnEquityScore": 5,
                      "returnOnAssetsScore": 5,
                      "debtToEquityScore": 1,
                      "priceToEarningsScore": 2,
                      "priceToBookScore": 2,
                      "rsi": 59.197136081869125,
                      "stockIV": 32.9,
                      "ivr": 59.0747,
                      "lowestStockIV": 16.3,
                      "highestStockIV": 44.4,
                      "lowestStockIVDate": "2026-07-29",
                      "highestStockIVDate": "2026-05-27",
                      "fiftyTwoWeekLow": 108.35,
                      "fiftyTwoWeekHigh": 177.05,
                      "fiftyDayAverage": 152.5316,
                      "twoHundredDayAverage": 132.8269,
                      "dividendYield": 0.602374,
                      "nextDividendDate": "2027-01-06",
                      "nextDividendIsEstimated": true,
                      "nextDividendPaymentDate": null,
                      "nextDividendAmount": 0.255,
                      "dividendFrequency": "Quarterly",
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/A.png"
                    },
                    {
                      "symbol": "A",
                      "type": "call",
                      "expiration": "2026-10-16T00:00:00Z",
                      "strike": 145,
                      "yieldPercent": 12.83,
                      "bidPrice": 18.6,
                      "volume": 1,
                      "openInterest": 18,
                      "delta": 0.97342,
                      "annualizedReturn": 667.282,
                      "lastUpdatedDate": "2026-10-09T19:33:33.711Z",
                      "optionKey": "A261016C00145000",
                      "probability": 0.02754515,
                      "yesterdayMark": 24.3,
                      "thirtyDayAverageVolume": 2,
                      "thirtyDayAverageIV": 0.25,
                      "thirtyDayAveragePremium": 1713.64,
                      "premiumChange1dPct": null,
                      "volumeZScore30d": -0.23,
                      "openInterestZScore30d": -2.27,
                      "volumeStdDev30d": 5.22,
                      "openInterestStdDev30d": 9.44,
                      "volumeHistorySamples30d": 22,
                      "openInterestHistorySamples30d": 22,
                      "contractScore": 0.3487,
                      "premium": 1860,
                      "lastPrice": 12.33,
                      "lastTradeDate": "2026-09-18T13:53:26.906Z",
                      "askPrice": 22,
                      "stockPrice": 171.031311035156,
                      "impliedVolatility": 63.7,
                      "vega": 0.01456,
                      "gamma": 0.00405,
                      "theta": -0.07878,
                      "earningsDate": "2026-11-23T00:00:00Z",
                      "marketCap": 47302000000,
                      "industry": "Diagnostics & Research",
                      "sector": "Healthcare",
                      "peRatio": 33.0927,
                      "rating": "B+",
                      "consensus": "Buy",
                      "overallScore": 3,
                      "discountedCashFlowScore": 3,
                      "returnOnEquityScore": 5,
                      "returnOnAssetsScore": 5,
                      "debtToEquityScore": 1,
                      "priceToEarningsScore": 2,
                      "priceToBookScore": 2,
                      "rsi": 59.197136081869125,
                      "stockIV": 32.9,
                      "ivr": 59.0747,
                      "lowestStockIV": 16.3,
                      "highestStockIV": 44.4,
                      "lowestStockIVDate": "2026-07-29",
                      "highestStockIVDate": "2026-05-27",
                      "fiftyTwoWeekLow": 108.35,
                      "fiftyTwoWeekHigh": 177.05,
                      "fiftyDayAverage": 152.5316,
                      "twoHundredDayAverage": 132.8269,
                      "dividendYield": 0.602374,
                      "nextDividendDate": "2027-01-06",
                      "nextDividendIsEstimated": true,
                      "nextDividendPaymentDate": null,
                      "nextDividendAmount": 0.255,
                      "dividendFrequency": "Quarterly",
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/A.png"
                    },
                    {
                      "symbol": "A",
                      "type": "call",
                      "expiration": "2026-10-16T00:00:00Z",
                      "strike": 150,
                      "yieldPercent": 9.13,
                      "bidPrice": 13.7,
                      "volume": 2,
                      "openInterest": 105,
                      "delta": 0.96902,
                      "annualizedReturn": 474.8468,
                      "lastUpdatedDate": "2026-10-09T19:32:09.733Z",
                      "optionKey": "A261016C00150000",
                      "probability": 0.0323634,
                      "yesterdayMark": 19.2,
                      "thirtyDayAverageVolume": 6,
                      "thirtyDayAverageIV": 0.39,
                      "thirtyDayAveragePremium": 1325.23,
                      "premiumChange1dPct": null,
                      "volumeZScore30d": -0.73,
                      "openInterestZScore30d": 0.5,
                      "volumeStdDev30d": 6.1,
                      "openInterestStdDev30d": 6.89,
                      "volumeHistorySamples30d": 22,
                      "openInterestHistorySamples30d": 22,
                      "contractScore": 0.3898,
                      "premium": 1370,
                      "lastPrice": 8.67,
                      "lastTradeDate": "2026-09-18T17:43:18.253Z",
                      "askPrice": 16.8,
                      "stockPrice": 171.031311035156,
                      "impliedVolatility": 52.42,
                      "vega": 0.01654,
                      "gamma": 0.0056,
                      "theta": -0.07497,
                      "earningsDate": "2026-11-23T00:00:00Z",
                      "marketCap": 47302000000,
                      "industry": "Diagnostics & Research",
                      "sector": "Healthcare",
                      "peRatio": 33.0927,
                      "rating": "B+",
                      "consensus": "Buy",
                      "overallScore": 3,
                      "discountedCashFlowScore": 3,
                      "returnOnEquityScore": 5,
                      "returnOnAssetsScore": 5,
                      "debtToEquityScore": 1,
                      "priceToEarningsScore": 2,
                      "priceToBookScore": 2,
                      "rsi": 59.197136081869125,
                      "stockIV": 32.9,
                      "ivr": 59.0747,
                      "lowestStockIV": 16.3,
                      "highestStockIV": 44.4,
                      "lowestStockIVDate": "2026-07-29",
                      "highestStockIVDate": "2026-05-27",
                      "fiftyTwoWeekLow": 108.35,
                      "fiftyTwoWeekHigh": 177.05,
                      "fiftyDayAverage": 152.5316,
                      "twoHundredDayAverage": 132.8269,
                      "dividendYield": 0.602374,
                      "nextDividendDate": "2027-01-06",
                      "nextDividendIsEstimated": true,
                      "nextDividendPaymentDate": null,
                      "nextDividendAmount": 0.255,
                      "dividendFrequency": "Quarterly",
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/A.png"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/earnings": {
      "get": {
        "tags": [
          "Calendar"
        ],
        "summary": "Get earnings calendar events",
        "description": "Returns scheduled earnings announcement dates and estimates. Default window is 30 days starting from current date in America/New_York (ET); maximum date range is 90 days. Default limit is 1000; 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. X-Limit-Clamped is also set when the date range exceeds your plan's history window.",
        "operationId": "earnings",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/earnings?symbol=DAL\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/earnings?symbol=DAL\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/earnings?symbol=DAL\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Window start date in YYYY-MM-DD format. Clamped to account history_days. from > to returns 400 invalid_range.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Window end date in YYYY-MM-DD format. Range cannot exceed 90 days (400 invalid_range).",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "description": "Filter by equity ticker symbol. Invalid symbol returns 400 invalid_parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor to fetch the next page of results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum events to return (1-1000, default 250). Clamped to plan max_rows.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 250
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Earnings announcement calendar events.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EarningsResponse"
                },
                "example": {
                  "from": "2026-10-09",
                  "to": "2026-11-08",
                  "truncated": false,
                  "nextCursor": null,
                  "results": [
                    {
                      "symbol": "DAL",
                      "name": "Delta Air Lines, Inc.",
                      "earningsDate": "2026-10-09",
                      "timing": "bmo",
                      "fiscalQuarter": null,
                      "epsEstimated": 1.93,
                      "revenueEstimated": null
                    },
                    {
                      "symbol": "HIFS",
                      "name": "Hingham Institution for Savings",
                      "earningsDate": "2026-10-09",
                      "timing": "amc",
                      "fiscalQuarter": null,
                      "epsEstimated": null,
                      "revenueEstimated": null
                    },
                    {
                      "symbol": "HOVR",
                      "name": "New Horizon Aircraft Ltd.",
                      "earningsDate": "2026-10-09",
                      "timing": "bmo",
                      "fiscalQuarter": null,
                      "epsEstimated": -0.08,
                      "revenueEstimated": null
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/dividends": {
      "get": {
        "tags": [
          "Calendar"
        ],
        "summary": "Get dividend ex-date calendar",
        "description": "Returns expected dividend payment dates, cash amounts, and yields. Default window is 30 days starting from current date in America/New_York (ET); maximum date range is 90 days. The unfiltered calendar excludes symbols outside our coverage universe (the stocks/ETFs we carry options data for) — e.g. foreign/OTC listings and non-optionable funds such as many closed-end funds and ETNs; pass includeAll=true to list every symbol in the source. A symbol you request explicitly is always returned. Default limit is 1000; 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. X-Limit-Clamped is also set when the date range exceeds your plan's history window.",
        "operationId": "dividends",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/dividends\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/dividends\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/dividends\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Window start date in YYYY-MM-DD format. Clamped to account history_days. from > to returns 400 invalid_range.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Window end date in YYYY-MM-DD format. Range cannot exceed 90 days (400 invalid_range).",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "description": "Filter by equity ticker symbol. Invalid symbol returns 400 invalid_parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor to fetch the next page of results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeAll",
            "in": "query",
            "required": false,
            "description": "Include symbols outside our coverage universe (the stocks/ETFs we carry options data for) — e.g. foreign/OTC listings and non-optionable funds such as many closed-end funds and ETNs; defaults to false. When true, lists every symbol in the source. A symbol you request explicitly is always returned.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum events to return (1-1000, default 250). Clamped to plan max_rows.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 250
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Dividend calendar events.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DividendsResponse"
                },
                "example": {
                  "from": "2026-10-09",
                  "to": "2026-11-08",
                  "truncated": false,
                  "nextCursor": null,
                  "results": [
                    {
                      "symbol": "AAP",
                      "name": "Advance Auto Parts, Inc.",
                      "exDate": "2026-10-09",
                      "payDate": "2026-10-23",
                      "amount": 0.25,
                      "yieldPercent": 2.358491,
                      "frequency": "Quarterly"
                    },
                    {
                      "symbol": "ACGBF",
                      "name": "ACGBF",
                      "exDate": "2026-10-09",
                      "payDate": "2026-11-25",
                      "amount": 0.019339,
                      "yieldPercent": 4.865637,
                      "frequency": "Semi-Annual"
                    },
                    {
                      "symbol": "ACGBY",
                      "name": "ACGBY",
                      "exDate": "2026-10-09",
                      "payDate": "2026-12-15",
                      "amount": 0.48346,
                      "yieldPercent": 4.593684,
                      "frequency": "Semi-Annual"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/iv/{symbol}": {
      "get": {
        "tags": [
          "Volatility"
        ],
        "summary": "Get implied volatility context",
        "description": "Returns current 30-day implied volatility, IV rank (IVR), 52-week high/low, and IV percentile (IVP).",
        "operationId": "iv",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/iv/AAPL\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/iv/AAPL\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/iv/AAPL\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol. Missing symbol returns 400 missing_symbol.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9.\\-]{1,10}$",
              "example": "AAPL"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Implied volatility context metrics.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IVContext"
                },
                "example": {
                  "symbol": "AAPL",
                  "currentIV": 26.900000000000002,
                  "ivr": 61.875,
                  "ivp": 64.68253968253968,
                  "ivHigh52w": 33,
                  "ivLow52w": 17,
                  "asOf": "2026-10-08"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/stocks/top-iv": {
      "get": {
        "tags": [
          "Volatility"
        ],
        "summary": "Get stocks with highest implied volatility",
        "description": "Returns equities ranked by highest annualized implied volatility, excluding stocks with IV > 200%. Limit defaults to 20; capped at your account plan's max_rows; requests exceeding 100 are capped silently.",
        "operationId": "top_iv",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/stocks/top-iv?limit=20\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/stocks/top-iv?limit=20\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/stocks/top-iv?limit=20\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum stocks to return (1-100, default 20). Clamped to plan max_rows.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of stocks ranked by highest implied volatility.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TopIvStocksResponse"
                },
                "example": {
                  "stocks": [
                    {
                      "symbol": "NFE",
                      "name": "New Fortress Energy Inc.",
                      "stockIV": 199.76,
                      "ivr": 14.4656,
                      "ivChange1w": 0,
                      "marketCap": 37532400,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/NFE.png"
                    },
                    {
                      "symbol": "BNTC",
                      "name": "Benitec Biopharma Inc.",
                      "stockIV": 199.3,
                      "ivr": 64.2366,
                      "ivChange1w": 106.6,
                      "marketCap": 313247000,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/BNTC.png"
                    },
                    {
                      "symbol": "CTNM",
                      "name": "Contineum Therapeutics, Inc.",
                      "stockIV": 199.3,
                      "ivr": 45.7567,
                      "ivChange1w": 16.3,
                      "marketCap": 493589000,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/CTNM.png"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/stocks/top-ivr": {
      "get": {
        "tags": [
          "Volatility"
        ],
        "summary": "Get stocks with highest IV rank",
        "description": "Returns equities ranked by highest 52-week IV rank (IVR), excluding stocks with IV > 200%. Limit defaults to 20; capped at your account plan's max_rows; requests exceeding 100 are capped silently.",
        "operationId": "top_ivr",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/stocks/top-ivr?limit=20\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/stocks/top-ivr?limit=20\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/stocks/top-ivr?limit=20\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum stocks to return (1-100, default 20). Clamped to plan max_rows.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of stocks ranked by highest IV Rank.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TopIvStocksResponse"
                },
                "example": {
                  "stocks": [
                    {
                      "symbol": "AGNC",
                      "name": "AGNC Investment Corp.",
                      "stockIV": 33.1,
                      "ivr": 100,
                      "ivChange1w": 2,
                      "marketCap": 10420400000,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/AGNC.png"
                    },
                    {
                      "symbol": "ASGN",
                      "name": "ASGN Incorporated",
                      "stockIV": 157.65,
                      "ivr": 100,
                      "ivChange1w": 0,
                      "marketCap": null,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/ASGN.png"
                    },
                    {
                      "symbol": "AXL",
                      "name": "American Axle & Manufacturing Holdings, Inc.",
                      "stockIV": 170.6,
                      "ivr": 100,
                      "ivChange1w": 0,
                      "marketCap": null,
                      "logoUrl": "https://images.financialmodelingprep.com/symbol/AXL.png"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenStarter"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/gex/{symbol}": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Get dealer gamma exposure profile",
        "description": "Returns aggregate dealer gamma positioning, gamma flip threshold, and major call/put walls.",
        "operationId": "gex",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/gex/SPY?minDte=0&maxDte=60\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/gex/SPY?minDte=0&maxDte=60\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/gex/SPY?minDte=0&maxDte=60\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol (e.g. SPY, AAPL).",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9.\\-]{1,10}$",
              "example": "SPY"
            }
          },
          {
            "name": "minDte",
            "in": "query",
            "required": false,
            "description": "Minimum DTE horizon filter (alias: dteMin, default 0).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "maxDte",
            "in": "query",
            "required": false,
            "description": "Maximum days to expiration (alias: dteMax; default 60; max 730). In GEX, maxDte=0 filters for 0DTE contracts (same-day expiration) for backward compatibility; see also zeroDte=true.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 730,
              "default": 60
            }
          },
          {
            "name": "zeroDte",
            "in": "query",
            "required": false,
            "description": "Filter strictly for 0DTE (same-day expiration) contracts. In GEX, maxDte=0 also denotes 0DTE contracts for backwards compatibility. zeroDte=true with maxDte > 0 returns 400 invalid_parameter.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Dealer gamma exposure aggregate profile.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GexResponse"
                },
                "example": {
                  "symbol": "SPY",
                  "stockPrice": 778.92,
                  "asOf": "2026-10-09T19:32:20.682Z",
                  "regime": "positive",
                  "flipRegime": "negative",
                  "netGex": 14833896574.04,
                  "totalCallGex": 33527578994.1,
                  "totalPutGex": -18693682420.07,
                  "gammaFlip": 779.51,
                  "callWallStrike": 780,
                  "putWallStrike": 778,
                  "strikes": [
                    {
                      "strike": 300,
                      "callGex": 3858.59,
                      "putGex": -12155.75,
                      "netGex": -8297.16
                    },
                    {
                      "strike": 305,
                      "callGex": 0,
                      "putGex": -4588.69,
                      "netGex": -4588.69
                    },
                    {
                      "strike": 310,
                      "callGex": 93.77,
                      "putGex": -702.65,
                      "netGex": -608.88
                    },
                    {
                      "strike": 315,
                      "callGex": 0,
                      "putGex": -1708.11,
                      "netGex": -1708.11
                    },
                    {
                      "strike": 320,
                      "callGex": 506.55,
                      "putGex": -1330.42,
                      "netGex": -823.87
                    },
                    {
                      "strike": 325,
                      "callGex": 52.64,
                      "putGex": -858.14,
                      "netGex": -805.51
                    },
                    {
                      "strike": 330,
                      "callGex": 0,
                      "putGex": -727.47,
                      "netGex": -727.47
                    },
                    {
                      "strike": 335,
                      "callGex": 0,
                      "putGex": -475.68,
                      "netGex": -475.68
                    },
                    {
                      "strike": 340,
                      "callGex": 59,
                      "putGex": -8713.33,
                      "netGex": -8654.33
                    },
                    {
                      "strike": 345,
                      "callGex": 0,
                      "putGex": -1921.31,
                      "netGex": -1921.31
                    },
                    {
                      "strike": 350,
                      "callGex": 127.23,
                      "putGex": -4566.24,
                      "netGex": -4439.01
                    },
                    {
                      "strike": 355,
                      "callGex": 0,
                      "putGex": -5528.62,
                      "netGex": -5528.62
                    },
                    {
                      "strike": 360,
                      "callGex": 68.56,
                      "putGex": -12933.31,
                      "netGex": -12864.76
                    },
                    {
                      "strike": 365,
                      "callGex": 0,
                      "putGex": -54362.02,
                      "netGex": -54362.02
                    },
                    {
                      "strike": 370,
                      "callGex": 0,
                      "putGex": -72443.35,
                      "netGex": -72443.35
                    },
                    {
                      "strike": 375,
                      "callGex": 0,
                      "putGex": -13541.92,
                      "netGex": -13541.92
                    },
                    {
                      "strike": 380,
                      "callGex": 79.54,
                      "putGex": -1183101.07,
                      "netGex": -1183021.53
                    },
                    {
                      "strike": 385,
                      "callGex": 0,
                      "putGex": -3658.83,
                      "netGex": -3658.83
                    },
                    {
                      "strike": 390,
                      "callGex": 0,
                      "putGex": -943333.85,
                      "netGex": -943333.85
                    },
                    {
                      "strike": 395,
                      "callGex": 93.61,
                      "putGex": -15896.77,
                      "netGex": -15803.16
                    },
                    {
                      "strike": 400,
                      "callGex": 2028.64,
                      "putGex": -805084.38,
                      "netGex": -803055.75
                    },
                    {
                      "strike": 405,
                      "callGex": 0,
                      "putGex": -3657.75,
                      "netGex": -3657.75
                    },
                    {
                      "strike": 410,
                      "callGex": 99.27,
                      "putGex": -16110.41,
                      "netGex": -16011.14
                    },
                    {
                      "strike": 415,
                      "callGex": 103.01,
                      "putGex": -13202.72,
                      "netGex": -13099.71
                    },
                    {
                      "strike": 420,
                      "callGex": 0,
                      "putGex": -43158.13,
                      "netGex": -43158.13
                    },
                    {
                      "strike": 425,
                      "callGex": 887.25,
                      "putGex": -11268.26,
                      "netGex": -10381.01
                    },
                    {
                      "strike": 430,
                      "callGex": 115.09,
                      "putGex": -45826.84,
                      "netGex": -45711.75
                    },
                    {
                      "strike": 435,
                      "callGex": 2627.57,
                      "putGex": -5595.99,
                      "netGex": -2968.41
                    },
                    {
                      "strike": 440,
                      "callGex": 123.95,
                      "putGex": -10513.3,
                      "netGex": -10389.35
                    },
                    {
                      "strike": 445,
                      "callGex": 514.62,
                      "putGex": -16029.03,
                      "netGex": -15514.41
                    },
                    {
                      "strike": 450,
                      "callGex": 2136.82,
                      "putGex": -13376.82,
                      "netGex": -11240
                    },
                    {
                      "strike": 455,
                      "callGex": 0,
                      "putGex": -5344.4,
                      "netGex": -5344.4
                    },
                    {
                      "strike": 460,
                      "callGex": 2303.01,
                      "putGex": -23203.01,
                      "netGex": -20900
                    },
                    {
                      "strike": 465,
                      "callGex": 597.85,
                      "putGex": -151569.56,
                      "netGex": -150971.72
                    },
                    {
                      "strike": 470,
                      "callGex": 1274.55,
                      "putGex": -995438.92,
                      "netGex": -994164.38
                    },
                    {
                      "strike": 475,
                      "callGex": 1518.91,
                      "putGex": -156964.6,
                      "netGex": -155445.69
                    },
                    {
                      "strike": 480,
                      "callGex": 6965.41,
                      "putGex": -190158.13,
                      "netGex": -183192.72
                    },
                    {
                      "strike": 485,
                      "callGex": 6412.25,
                      "putGex": -23662.31,
                      "netGex": -17250.06
                    },
                    {
                      "strike": 490,
                      "callGex": 13172.83,
                      "putGex": -23019.91,
                      "netGex": -9847.09
                    },
                    {
                      "strike": 495,
                      "callGex": 35062.4,
                      "putGex": -23263.91,
                      "netGex": 11798.49
                    },
                    {
                      "strike": 500,
                      "callGex": 9903.82,
                      "putGex": -14242024.15,
                      "netGex": -14232120.34
                    },
                    {
                      "strike": 505,
                      "callGex": 789.52,
                      "putGex": -49012.88,
                      "netGex": -48223.35
                    },
                    {
                      "strike": 510,
                      "callGex": 7430.83,
                      "putGex": -10878345.13,
                      "netGex": -10870914.3
                    },
                    {
                      "strike": 515,
                      "callGex": 21864.6,
                      "putGex": -560790.4,
                      "netGex": -538925.8
                    },
                    {
                      "strike": 520,
                      "callGex": 15830.93,
                      "putGex": -9706013.19,
                      "netGex": -9690182.26
                    },
                    {
                      "strike": 525,
                      "callGex": 1632.79,
                      "putGex": -339907.69,
                      "netGex": -338274.9
                    },
                    {
                      "strike": 530,
                      "callGex": 21573.63,
                      "putGex": -363203.79,
                      "netGex": -341630.16
                    },
                    {
                      "strike": 535,
                      "callGex": 2707.3,
                      "putGex": -153932.32,
                      "netGex": -151225.02
                    },
                    {
                      "strike": 540,
                      "callGex": 4909.57,
                      "putGex": -262112.01,
                      "netGex": -257202.43
                    },
                    {
                      "strike": 545,
                      "callGex": 11350.06,
                      "putGex": -416574.81,
                      "netGex": -405224.74
                    },
                    {
                      "strike": 550,
                      "callGex": 9720.81,
                      "putGex": -953698.35,
                      "netGex": -943977.53
                    },
                    {
                      "strike": 555,
                      "callGex": 5913.5,
                      "putGex": -533951.43,
                      "netGex": -528037.92
                    },
                    {
                      "strike": 560,
                      "callGex": 8984.6,
                      "putGex": -1013642.92,
                      "netGex": -1004658.32
                    },
                    {
                      "strike": 565,
                      "callGex": 5714.79,
                      "putGex": -723853.07,
                      "netGex": -718138.28
                    },
                    {
                      "strike": 570,
                      "callGex": 257744.92,
                      "putGex": -19850265.87,
                      "netGex": -19592520.95
                    },
                    {
                      "strike": 575,
                      "callGex": 24754.99,
                      "putGex": -402136.91,
                      "netGex": -377381.92
                    },
                    {
                      "strike": 580,
                      "callGex": 62745.11,
                      "putGex": -3751865.06,
                      "netGex": -3689119.95
                    },
                    {
                      "strike": 581,
                      "callGex": 0,
                      "putGex": -3301.6,
                      "netGex": -3301.6
                    },
                    {
                      "strike": 582,
                      "callGex": 0,
                      "putGex": -3724.17,
                      "netGex": -3724.17
                    },
                    {
                      "strike": 583,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "strike": 584,
                      "callGex": 4746.4,
                      "putGex": -38377.91,
                      "netGex": -33631.51
                    },
                    {
                      "strike": 585,
                      "callGex": 16812.15,
                      "putGex": -891045.23,
                      "netGex": -874233.08
                    },
                    {
                      "strike": 586,
                      "callGex": 0,
                      "putGex": -593.14,
                      "netGex": -593.14
                    },
                    {
                      "strike": 587,
                      "callGex": 0,
                      "putGex": -200.69,
                      "netGex": -200.69
                    },
                    {
                      "strike": 588,
                      "callGex": 0,
                      "putGex": -407.52,
                      "netGex": -407.52
                    },
                    {
                      "strike": 589,
                      "callGex": 0,
                      "putGex": -413.91,
                      "netGex": -413.91
                    },
                    {
                      "strike": 590,
                      "callGex": 33110.28,
                      "putGex": -600522.05,
                      "netGex": -567411.77
                    },
                    {
                      "strike": 591,
                      "callGex": 1844.67,
                      "putGex": -5124.09,
                      "netGex": -3279.41
                    },
                    {
                      "strike": 592,
                      "callGex": 931.81,
                      "putGex": -433.69,
                      "netGex": 498.12
                    },
                    {
                      "strike": 593,
                      "callGex": 0,
                      "putGex": -2643.13,
                      "netGex": -2643.13
                    },
                    {
                      "strike": 595,
                      "callGex": 119397.3,
                      "putGex": -2076224.37,
                      "netGex": -1956827.07
                    },
                    {
                      "strike": 596,
                      "callGex": 0,
                      "putGex": -68312.11,
                      "netGex": -68312.11
                    },
                    {
                      "strike": 597,
                      "callGex": 0,
                      "putGex": -78752.4,
                      "netGex": -78752.4
                    },
                    {
                      "strike": 598,
                      "callGex": 496.27,
                      "putGex": -209465.42,
                      "netGex": -208969.15
                    },
                    {
                      "strike": 599,
                      "callGex": 0,
                      "putGex": -2658.96,
                      "netGex": -2658.96
                    },
                    {
                      "strike": 600,
                      "callGex": 1263592.26,
                      "putGex": -5517676.3,
                      "netGex": -4254084.04
                    },
                    {
                      "strike": 601,
                      "callGex": 0,
                      "putGex": -747.77,
                      "netGex": -747.77
                    },
                    {
                      "strike": 602,
                      "callGex": 0,
                      "putGex": -29865.78,
                      "netGex": -29865.78
                    },
                    {
                      "strike": 603,
                      "callGex": 0,
                      "putGex": -5653.84,
                      "netGex": -5653.84
                    },
                    {
                      "strike": 604,
                      "callGex": 0,
                      "putGex": -260.94,
                      "netGex": -260.94
                    },
                    {
                      "strike": 605,
                      "callGex": 10188.74,
                      "putGex": -820898.9,
                      "netGex": -810710.16
                    },
                    {
                      "strike": 606,
                      "callGex": 0,
                      "putGex": -15339.12,
                      "netGex": -15339.12
                    },
                    {
                      "strike": 607,
                      "callGex": 0,
                      "putGex": -107422.82,
                      "netGex": -107422.82
                    },
                    {
                      "strike": 608,
                      "callGex": 0,
                      "putGex": -100238.23,
                      "netGex": -100238.23
                    },
                    {
                      "strike": 609,
                      "callGex": 8381.43,
                      "putGex": -60666.94,
                      "netGex": -52285.51
                    },
                    {
                      "strike": 610,
                      "callGex": 30143.08,
                      "putGex": -1247589.95,
                      "netGex": -1217446.87
                    },
                    {
                      "strike": 611,
                      "callGex": 0,
                      "putGex": -7868.29,
                      "netGex": -7868.29
                    },
                    {
                      "strike": 612,
                      "callGex": 0,
                      "putGex": -6212007.74,
                      "netGex": -6212007.74
                    },
                    {
                      "strike": 614,
                      "callGex": 0,
                      "putGex": -1834.55,
                      "netGex": -1834.55
                    },
                    {
                      "strike": 615,
                      "callGex": 23832.52,
                      "putGex": -1478621.99,
                      "netGex": -1454789.47
                    },
                    {
                      "strike": 616,
                      "callGex": 0,
                      "putGex": -34721.29,
                      "netGex": -34721.29
                    },
                    {
                      "strike": 617,
                      "callGex": 0,
                      "putGex": -86267.26,
                      "netGex": -86267.26
                    },
                    {
                      "strike": 618,
                      "callGex": 0,
                      "putGex": -99373.55,
                      "netGex": -99373.55
                    },
                    {
                      "strike": 619,
                      "callGex": 0,
                      "putGex": -51636.92,
                      "netGex": -51636.92
                    },
                    {
                      "strike": 620,
                      "callGex": 50042.87,
                      "putGex": -49282341.35,
                      "netGex": -49232298.48
                    },
                    {
                      "strike": 621,
                      "callGex": 0,
                      "putGex": -1025.49,
                      "netGex": -1025.49
                    },
                    {
                      "strike": 622,
                      "callGex": 644.31,
                      "putGex": -104587.97,
                      "netGex": -103943.66
                    },
                    {
                      "strike": 623,
                      "callGex": 0,
                      "putGex": -353.19,
                      "netGex": -353.19
                    },
                    {
                      "strike": 624,
                      "callGex": 0,
                      "putGex": -144670.21,
                      "netGex": -144670.21
                    },
                    {
                      "strike": 625,
                      "callGex": 10441.71,
                      "putGex": -7736860.66,
                      "netGex": -7726418.95
                    },
                    {
                      "strike": 626,
                      "callGex": 0,
                      "putGex": -119777.95,
                      "netGex": -119777.95
                    },
                    {
                      "strike": 627,
                      "callGex": 0,
                      "putGex": -20728.5,
                      "netGex": -20728.5
                    },
                    {
                      "strike": 628,
                      "callGex": 0,
                      "putGex": -118353.99,
                      "netGex": -118353.99
                    },
                    {
                      "strike": 629,
                      "callGex": 0,
                      "putGex": -778.56,
                      "netGex": -778.56
                    },
                    {
                      "strike": 630,
                      "callGex": 537393.28,
                      "putGex": -38360756.77,
                      "netGex": -37823363.5
                    },
                    {
                      "strike": 631,
                      "callGex": 0,
                      "putGex": -214915.22,
                      "netGex": -214915.22
                    },
                    {
                      "strike": 632,
                      "callGex": 0,
                      "putGex": -124017.84,
                      "netGex": -124017.84
                    },
                    {
                      "strike": 633,
                      "callGex": 0,
                      "putGex": -4578.6,
                      "netGex": -4578.6
                    },
                    {
                      "strike": 634,
                      "callGex": 0,
                      "putGex": -108358.42,
                      "netGex": -108358.42
                    },
                    {
                      "strike": 635,
                      "callGex": 270369.52,
                      "putGex": -2829888.09,
                      "netGex": -2559518.57
                    },
                    {
                      "strike": 636,
                      "callGex": 0,
                      "putGex": -59522.91,
                      "netGex": -59522.91
                    },
                    {
                      "strike": 637,
                      "callGex": 761.12,
                      "putGex": -90340.71,
                      "netGex": -89579.59
                    },
                    {
                      "strike": 638,
                      "callGex": 0,
                      "putGex": -22172.5,
                      "netGex": -22172.5
                    },
                    {
                      "strike": 639,
                      "callGex": 0,
                      "putGex": -15182.86,
                      "netGex": -15182.86
                    },
                    {
                      "strike": 640,
                      "callGex": 506498.81,
                      "putGex": -34264859.79,
                      "netGex": -33758360.97
                    },
                    {
                      "strike": 641,
                      "callGex": 1571822.46,
                      "putGex": -82685.07,
                      "netGex": 1489137.39
                    },
                    {
                      "strike": 642,
                      "callGex": 26212.71,
                      "putGex": -89197.08,
                      "netGex": -62984.37
                    },
                    {
                      "strike": 643,
                      "callGex": 0,
                      "putGex": -95841.33,
                      "netGex": -95841.33
                    },
                    {
                      "strike": 644,
                      "callGex": 513.55,
                      "putGex": -102043.92,
                      "netGex": -101530.37
                    },
                    {
                      "strike": 645,
                      "callGex": 88347.75,
                      "putGex": -3608898.23,
                      "netGex": -3520550.48
                    },
                    {
                      "strike": 646,
                      "callGex": 3731.26,
                      "putGex": -107299.6,
                      "netGex": -103568.34
                    },
                    {
                      "strike": 647,
                      "callGex": 0,
                      "putGex": -312152.45,
                      "netGex": -312152.45
                    },
                    {
                      "strike": 648,
                      "callGex": 553.07,
                      "putGex": -107347.72,
                      "netGex": -106794.65
                    },
                    {
                      "strike": 649,
                      "callGex": 0,
                      "putGex": -129928,
                      "netGex": -129928
                    },
                    {
                      "strike": 650,
                      "callGex": 1797217.54,
                      "putGex": -16682905.28,
                      "netGex": -14885687.74
                    },
                    {
                      "strike": 651,
                      "callGex": 1168.45,
                      "putGex": -74819.78,
                      "netGex": -73651.33
                    },
                    {
                      "strike": 652,
                      "callGex": 1189.83,
                      "putGex": -251788.96,
                      "netGex": -250599.13
                    },
                    {
                      "strike": 653,
                      "callGex": 0,
                      "putGex": -332224.55,
                      "netGex": -332224.55
                    },
                    {
                      "strike": 654,
                      "callGex": 2467.15,
                      "putGex": -52987.8,
                      "netGex": -50520.65
                    },
                    {
                      "strike": 655,
                      "callGex": 1010202.27,
                      "putGex": -9252396.71,
                      "netGex": -8242194.45
                    },
                    {
                      "strike": 656,
                      "callGex": 112523.91,
                      "putGex": -126884.69,
                      "netGex": -14360.79
                    },
                    {
                      "strike": 657,
                      "callGex": 1301.77,
                      "putGex": -146203,
                      "netGex": -144901.23
                    },
                    {
                      "strike": 658,
                      "callGex": 22952.03,
                      "putGex": -132950.14,
                      "netGex": -109998.11
                    },
                    {
                      "strike": 659,
                      "callGex": 1655.18,
                      "putGex": -130599.48,
                      "netGex": -128944.3
                    },
                    {
                      "strike": 660,
                      "callGex": 1350881.74,
                      "putGex": -10665812.76,
                      "netGex": -9314931.03
                    },
                    {
                      "strike": 661,
                      "callGex": 7688.45,
                      "putGex": -284533.07,
                      "netGex": -276844.62
                    },
                    {
                      "strike": 662,
                      "callGex": 4980.27,
                      "putGex": -90776.78,
                      "netGex": -85796.52
                    },
                    {
                      "strike": 663,
                      "callGex": 724.2,
                      "putGex": -391970.9,
                      "netGex": -391246.7
                    },
                    {
                      "strike": 664,
                      "callGex": 737.14,
                      "putGex": -520290.43,
                      "netGex": -519553.29
                    },
                    {
                      "strike": 665,
                      "callGex": 1928811.4,
                      "putGex": -4280117.08,
                      "netGex": -2351305.68
                    },
                    {
                      "strike": 666,
                      "callGex": 13588.85,
                      "putGex": -104823.08,
                      "netGex": -91234.23
                    },
                    {
                      "strike": 667,
                      "callGex": 777.34,
                      "putGex": -289595.35,
                      "netGex": -288818.01
                    },
                    {
                      "strike": 668,
                      "callGex": 4257.83,
                      "putGex": -199426.96,
                      "netGex": -195169.13
                    },
                    {
                      "strike": 669,
                      "callGex": 1610.68,
                      "putGex": -87039.65,
                      "netGex": -85428.97
                    },
                    {
                      "strike": 670,
                      "callGex": 2189401.48,
                      "putGex": -40026168.31,
                      "netGex": -37836766.83
                    },
                    {
                      "strike": 671,
                      "callGex": 0,
                      "putGex": -124045.54,
                      "netGex": -124045.54
                    },
                    {
                      "strike": 672,
                      "callGex": 5394.67,
                      "putGex": -211543.8,
                      "netGex": -206149.13
                    },
                    {
                      "strike": 673,
                      "callGex": 411077.29,
                      "putGex": -456633.87,
                      "netGex": -45556.57
                    },
                    {
                      "strike": 674,
                      "callGex": 142406.63,
                      "putGex": -287781.89,
                      "netGex": -145375.26
                    },
                    {
                      "strike": 675,
                      "callGex": 453354.61,
                      "putGex": -76886534.06,
                      "netGex": -76433179.45
                    },
                    {
                      "strike": 676,
                      "callGex": 36220.4,
                      "putGex": -164118.71,
                      "netGex": -127898.31
                    },
                    {
                      "strike": 677,
                      "callGex": 3079.17,
                      "putGex": -279998.02,
                      "netGex": -276918.85
                    },
                    {
                      "strike": 678,
                      "callGex": 158223.99,
                      "putGex": -303981.17,
                      "netGex": -145757.18
                    },
                    {
                      "strike": 679,
                      "callGex": 142789.47,
                      "putGex": -833056.53,
                      "netGex": -690267.06
                    },
                    {
                      "strike": 680,
                      "callGex": 1259957.76,
                      "putGex": -54866690.18,
                      "netGex": -53606732.42
                    },
                    {
                      "strike": 681,
                      "callGex": 59135.02,
                      "putGex": -652421.36,
                      "netGex": -593286.34
                    },
                    {
                      "strike": 682,
                      "callGex": 78671.63,
                      "putGex": -214541.4,
                      "netGex": -135869.77
                    },
                    {
                      "strike": 683,
                      "callGex": 54907.52,
                      "putGex": -1270854.55,
                      "netGex": -1215947.03
                    },
                    {
                      "strike": 684,
                      "callGex": 151150.66,
                      "putGex": -20022471.18,
                      "netGex": -19871320.51
                    },
                    {
                      "strike": 685,
                      "callGex": 711917.24,
                      "putGex": -25012170.38,
                      "netGex": -24300253.14
                    },
                    {
                      "strike": 686,
                      "callGex": 90580.82,
                      "putGex": -463632.69,
                      "netGex": -373051.87
                    },
                    {
                      "strike": 687,
                      "callGex": 68763.43,
                      "putGex": -245042.57,
                      "netGex": -176279.14
                    },
                    {
                      "strike": 688,
                      "callGex": 4121293.15,
                      "putGex": -2361274.54,
                      "netGex": 1760018.61
                    },
                    {
                      "strike": 689,
                      "callGex": 4353445.91,
                      "putGex": -2239297.58,
                      "netGex": 2114148.33
                    },
                    {
                      "strike": 690,
                      "callGex": 3120518.59,
                      "putGex": -41033326.61,
                      "netGex": -37912808.02
                    },
                    {
                      "strike": 691,
                      "callGex": 80017.78,
                      "putGex": -417006.58,
                      "netGex": -336988.8
                    },
                    {
                      "strike": 692,
                      "callGex": 180552.95,
                      "putGex": -1219564.22,
                      "netGex": -1039011.26
                    },
                    {
                      "strike": 693,
                      "callGex": 3252303.32,
                      "putGex": -3605185.69,
                      "netGex": -352882.37
                    },
                    {
                      "strike": 694,
                      "callGex": 59407.87,
                      "putGex": -282748.35,
                      "netGex": -223340.47
                    },
                    {
                      "strike": 695,
                      "callGex": 3415107.14,
                      "putGex": -17091155.81,
                      "netGex": -13676048.67
                    },
                    {
                      "strike": 696,
                      "callGex": 192188.01,
                      "putGex": -506752.39,
                      "netGex": -314564.38
                    },
                    {
                      "strike": 697,
                      "callGex": 45597.85,
                      "putGex": -549476.77,
                      "netGex": -503878.92
                    },
                    {
                      "strike": 698,
                      "callGex": 2187274.73,
                      "putGex": -1333261.6,
                      "netGex": 854013.13
                    },
                    {
                      "strike": 699,
                      "callGex": 274113.78,
                      "putGex": -471709.88,
                      "netGex": -197596.1
                    },
                    {
                      "strike": 700,
                      "callGex": 15602155.4,
                      "putGex": -116253817.6,
                      "netGex": -100651662.2
                    },
                    {
                      "strike": 701,
                      "callGex": 334736.19,
                      "putGex": -3692257.04,
                      "netGex": -3357520.85
                    },
                    {
                      "strike": 702,
                      "callGex": 78631.38,
                      "putGex": -1774610.2,
                      "netGex": -1695978.81
                    },
                    {
                      "strike": 703,
                      "callGex": 58942.12,
                      "putGex": -1256475.44,
                      "netGex": -1197533.32
                    },
                    {
                      "strike": 704,
                      "callGex": 75821.54,
                      "putGex": -1721593.02,
                      "netGex": -1645771.48
                    },
                    {
                      "strike": 705,
                      "callGex": 1637321.62,
                      "putGex": -36922960.04,
                      "netGex": -35285638.42
                    },
                    {
                      "strike": 706,
                      "callGex": 227202.99,
                      "putGex": -1945153.46,
                      "netGex": -1717950.48
                    },
                    {
                      "strike": 707,
                      "callGex": 137452.81,
                      "putGex": -24228852.43,
                      "netGex": -24091399.62
                    },
                    {
                      "strike": 708,
                      "callGex": 57599.37,
                      "putGex": -2665333.62,
                      "netGex": -2607734.25
                    },
                    {
                      "strike": 709,
                      "callGex": 74163.67,
                      "putGex": -3095368.27,
                      "netGex": -3021204.6
                    },
                    {
                      "strike": 710,
                      "callGex": 2829086.24,
                      "putGex": -44460314.45,
                      "netGex": -41631228.21
                    },
                    {
                      "strike": 711,
                      "callGex": 206695.38,
                      "putGex": -2894463.82,
                      "netGex": -2687768.45
                    },
                    {
                      "strike": 712,
                      "callGex": 255589.24,
                      "putGex": -4606096,
                      "netGex": -4350506.76
                    },
                    {
                      "strike": 713,
                      "callGex": 201592.23,
                      "putGex": -4350559.63,
                      "netGex": -4148967.4
                    },
                    {
                      "strike": 714,
                      "callGex": 167961.18,
                      "putGex": -5948658.21,
                      "netGex": -5780697.03
                    },
                    {
                      "strike": 715,
                      "callGex": 2822303.61,
                      "putGex": -81025055.9,
                      "netGex": -78202752.3
                    },
                    {
                      "strike": 716,
                      "callGex": 372203.58,
                      "putGex": -8989013.14,
                      "netGex": -8616809.57
                    },
                    {
                      "strike": 717,
                      "callGex": 284327.09,
                      "putGex": -3419765.49,
                      "netGex": -3135438.4
                    },
                    {
                      "strike": 718,
                      "callGex": 202419.68,
                      "putGex": -9819639.75,
                      "netGex": -9617220.07
                    },
                    {
                      "strike": 719,
                      "callGex": 281303.84,
                      "putGex": -2875232.55,
                      "netGex": -2593928.72
                    },
                    {
                      "strike": 720,
                      "callGex": 8327185.28,
                      "putGex": -123767405.27,
                      "netGex": -115440219.99
                    },
                    {
                      "strike": 721,
                      "callGex": 125673.12,
                      "putGex": -4439708.19,
                      "netGex": -4314035.06
                    },
                    {
                      "strike": 722,
                      "callGex": 265785.89,
                      "putGex": -18284917.58,
                      "netGex": -18019131.69
                    },
                    {
                      "strike": 723,
                      "callGex": 183498.98,
                      "putGex": -23641148.4,
                      "netGex": -23457649.42
                    },
                    {
                      "strike": 724,
                      "callGex": 682345.62,
                      "putGex": -23783350.07,
                      "netGex": -23101004.44
                    },
                    {
                      "strike": 725,
                      "callGex": 7855016.01,
                      "putGex": -212064080.03,
                      "netGex": -204209064.02
                    },
                    {
                      "strike": 726,
                      "callGex": 774779.98,
                      "putGex": -37779324.27,
                      "netGex": -37004544.29
                    },
                    {
                      "strike": 727,
                      "callGex": 611602.6,
                      "putGex": -111913241.13,
                      "netGex": -111301638.53
                    },
                    {
                      "strike": 728,
                      "callGex": 1616868.39,
                      "putGex": -56856152.45,
                      "netGex": -55239284.06
                    },
                    {
                      "strike": 729,
                      "callGex": 414803.66,
                      "putGex": -62187611.4,
                      "netGex": -61772807.74
                    },
                    {
                      "strike": 730,
                      "callGex": 10164073.61,
                      "putGex": -269630531.52,
                      "netGex": -259466457.91
                    },
                    {
                      "strike": 731,
                      "callGex": 1028863.7,
                      "putGex": -13253621.71,
                      "netGex": -12224758.02
                    },
                    {
                      "strike": 732,
                      "callGex": 1909564.55,
                      "putGex": -66499217.26,
                      "netGex": -64589652.72
                    },
                    {
                      "strike": 733,
                      "callGex": 1507890.91,
                      "putGex": -75777935.41,
                      "netGex": -74270044.5
                    },
                    {
                      "strike": 734,
                      "callGex": 671773.24,
                      "putGex": -50919873.62,
                      "netGex": -50248100.39
                    },
                    {
                      "strike": 735,
                      "callGex": 16711990.28,
                      "putGex": -146065282.1,
                      "netGex": -129353291.82
                    },
                    {
                      "strike": 736,
                      "callGex": 1382211.72,
                      "putGex": -153954893.45,
                      "netGex": -152572681.73
                    },
                    {
                      "strike": 737,
                      "callGex": 1960468.45,
                      "putGex": -27787918.41,
                      "netGex": -25827449.96
                    },
                    {
                      "strike": 738,
                      "callGex": 1748691.94,
                      "putGex": -28232426.97,
                      "netGex": -26483735.03
                    },
                    {
                      "strike": 739,
                      "callGex": 2609828.94,
                      "putGex": -103882374.23,
                      "netGex": -101272545.29
                    },
                    {
                      "strike": 740,
                      "callGex": 27900065.21,
                      "putGex": -614460268.23,
                      "netGex": -586560203.02
                    },
                    {
                      "strike": 741,
                      "callGex": 3079307.44,
                      "putGex": -19778201.16,
                      "netGex": -16698893.73
                    },
                    {
                      "strike": 742,
                      "callGex": 3285490.06,
                      "putGex": -32236957.6,
                      "netGex": -28951467.54
                    },
                    {
                      "strike": 743,
                      "callGex": 6673553.51,
                      "putGex": -23155766.58,
                      "netGex": -16482213.07
                    },
                    {
                      "strike": 744,
                      "callGex": 3603991.41,
                      "putGex": -29399769.45,
                      "netGex": -25795778.04
                    },
                    {
                      "strike": 745,
                      "callGex": 28800195.93,
                      "putGex": -428501390.84,
                      "netGex": -399701194.92
                    },
                    {
                      "strike": 746,
                      "callGex": 6501936.38,
                      "putGex": -26443316.28,
                      "netGex": -19941379.91
                    },
                    {
                      "strike": 747,
                      "callGex": 5523106.05,
                      "putGex": -50096593.59,
                      "netGex": -44573487.54
                    },
                    {
                      "strike": 748,
                      "callGex": 1913116.39,
                      "putGex": -78423502.53,
                      "netGex": -76510386.14
                    },
                    {
                      "strike": 749,
                      "callGex": 4446977.27,
                      "putGex": -43920612.6,
                      "netGex": -39473635.33
                    },
                    {
                      "strike": 750,
                      "callGex": 86233500.84,
                      "putGex": -704106421.68,
                      "netGex": -617872920.84
                    },
                    {
                      "strike": 751,
                      "callGex": 6403222.04,
                      "putGex": -73419928.15,
                      "netGex": -67016706.11
                    },
                    {
                      "strike": 752,
                      "callGex": 6043465.36,
                      "putGex": -53635759.75,
                      "netGex": -47592294.39
                    },
                    {
                      "strike": 753,
                      "callGex": 4289960.69,
                      "putGex": -169260508.68,
                      "netGex": -164970548
                    },
                    {
                      "strike": 754,
                      "callGex": 7070102.86,
                      "putGex": -61405602.56,
                      "netGex": -54335499.7
                    },
                    {
                      "strike": 755,
                      "callGex": 45403153.64,
                      "putGex": -799707149.22,
                      "netGex": -754303995.58
                    },
                    {
                      "strike": 756,
                      "callGex": 10008267.46,
                      "putGex": -56917772.09,
                      "netGex": -46909504.63
                    },
                    {
                      "strike": 757,
                      "callGex": 10545558.86,
                      "putGex": -204918237.22,
                      "netGex": -194372678.36
                    },
                    {
                      "strike": 758,
                      "callGex": 22913150.83,
                      "putGex": -81407696.88,
                      "netGex": -58494546.05
                    },
                    {
                      "strike": 759,
                      "callGex": 19908209.87,
                      "putGex": -97711743.75,
                      "netGex": -77803533.88
                    },
                    {
                      "strike": 760,
                      "callGex": 178248019.7,
                      "putGex": -546988041.19,
                      "netGex": -368740021.48
                    },
                    {
                      "strike": 761,
                      "callGex": 39081782.77,
                      "putGex": -140325309.64,
                      "netGex": -101243526.87
                    },
                    {
                      "strike": 762,
                      "callGex": 40325423.41,
                      "putGex": -146180482.18,
                      "netGex": -105855058.77
                    },
                    {
                      "strike": 763,
                      "callGex": 45637821.7,
                      "putGex": -173872888.78,
                      "netGex": -128235067.08
                    },
                    {
                      "strike": 764,
                      "callGex": 49547726.86,
                      "putGex": -129017487.75,
                      "netGex": -79469760.89
                    },
                    {
                      "strike": 765,
                      "callGex": 183085415.26,
                      "putGex": -880277364.04,
                      "netGex": -697191948.78
                    },
                    {
                      "strike": 766,
                      "callGex": 120895048.59,
                      "putGex": -169531050.07,
                      "netGex": -48636001.47
                    },
                    {
                      "strike": 767,
                      "callGex": 130638244.33,
                      "putGex": -454393728,
                      "netGex": -323755483.67
                    },
                    {
                      "strike": 768,
                      "callGex": 117149458.34,
                      "putGex": -373988900.92,
                      "netGex": -256839442.58
                    },
                    {
                      "strike": 769,
                      "callGex": 115538385.7,
                      "putGex": -250899354.86,
                      "netGex": -135360969.17
                    },
                    {
                      "strike": 770,
                      "callGex": 569661047.33,
                      "putGex": -1037661388.73,
                      "netGex": -468000341.4
                    },
                    {
                      "strike": 771,
                      "callGex": 157912610.62,
                      "putGex": -308038477,
                      "netGex": -150125866.38
                    },
                    {
                      "strike": 772,
                      "callGex": 265713255.72,
                      "putGex": -643995874.57,
                      "netGex": -378282618.85
                    },
                    {
                      "strike": 773,
                      "callGex": 267306550.65,
                      "putGex": -355540461.77,
                      "netGex": -88233911.12
                    },
                    {
                      "strike": 774,
                      "callGex": 391529913.36,
                      "putGex": -595273028.03,
                      "netGex": -203743114.67
                    },
                    {
                      "strike": 775,
                      "callGex": 1227689919.6,
                      "putGex": -993190592.28,
                      "netGex": 234499327.32
                    },
                    {
                      "strike": 776,
                      "callGex": 786665473.41,
                      "putGex": -537419865.78,
                      "netGex": 249245607.62
                    },
                    {
                      "strike": 777,
                      "callGex": 1239843353.4,
                      "putGex": -544164232.67,
                      "netGex": 695679120.73
                    },
                    {
                      "strike": 778,
                      "callGex": 2672240798.78,
                      "putGex": -1057377941.05,
                      "netGex": 1614862857.73
                    },
                    {
                      "strike": 779,
                      "callGex": 4556181185.73,
                      "putGex": -1815044386.75,
                      "netGex": 2741136798.98
                    },
                    {
                      "strike": 780,
                      "callGex": 7712772041.17,
                      "putGex": -615721479.71,
                      "netGex": 7097050561.46
                    },
                    {
                      "strike": 781,
                      "callGex": 1332684865.07,
                      "putGex": -169578285.68,
                      "netGex": 1163106579.39
                    },
                    {
                      "strike": 782,
                      "callGex": 835934208.37,
                      "putGex": -110494943.43,
                      "netGex": 725439264.94
                    },
                    {
                      "strike": 783,
                      "callGex": 930376494.57,
                      "putGex": -35948905.4,
                      "netGex": 894427589.17
                    },
                    {
                      "strike": 784,
                      "callGex": 519696618.46,
                      "putGex": -30835728.87,
                      "netGex": 488860889.59
                    },
                    {
                      "strike": 785,
                      "callGex": 2745060799.16,
                      "putGex": -230309750.4,
                      "netGex": 2514751048.75
                    },
                    {
                      "strike": 786,
                      "callGex": 368642399.76,
                      "putGex": -12605514.04,
                      "netGex": 356036885.73
                    },
                    {
                      "strike": 787,
                      "callGex": 311475162.18,
                      "putGex": -19529506.64,
                      "netGex": 291945655.54
                    },
                    {
                      "strike": 788,
                      "callGex": 162480997.51,
                      "putGex": -13029669.36,
                      "netGex": 149451328.16
                    },
                    {
                      "strike": 789,
                      "callGex": 175700890.36,
                      "putGex": -4562192.2,
                      "netGex": 171138698.16
                    },
                    {
                      "strike": 790,
                      "callGex": 1277355864.08,
                      "putGex": -58543577.1,
                      "netGex": 1218812286.98
                    },
                    {
                      "strike": 791,
                      "callGex": 108294166.5,
                      "putGex": -2004663.44,
                      "netGex": 106289503.06
                    },
                    {
                      "strike": 792,
                      "callGex": 117240165.82,
                      "putGex": -5644360.23,
                      "netGex": 111595805.59
                    },
                    {
                      "strike": 793,
                      "callGex": 165846309.56,
                      "putGex": -2936982.13,
                      "netGex": 162909327.43
                    },
                    {
                      "strike": 794,
                      "callGex": 109830163.41,
                      "putGex": -2221579.56,
                      "netGex": 107608583.85
                    },
                    {
                      "strike": 795,
                      "callGex": 518934687.55,
                      "putGex": -24375796.5,
                      "netGex": 494558891.05
                    },
                    {
                      "strike": 796,
                      "callGex": 102227373.61,
                      "putGex": -2425903.24,
                      "netGex": 99801470.37
                    },
                    {
                      "strike": 797,
                      "callGex": 126512642.62,
                      "putGex": -2052681.62,
                      "netGex": 124459960.99
                    },
                    {
                      "strike": 798,
                      "callGex": 100986933.71,
                      "putGex": -725617.03,
                      "netGex": 100261316.69
                    },
                    {
                      "strike": 799,
                      "callGex": 58167149.81,
                      "putGex": -347405.01,
                      "netGex": 57819744.8
                    },
                    {
                      "strike": 800,
                      "callGex": 890270131.93,
                      "putGex": -9491365.07,
                      "netGex": 880778766.86
                    },
                    {
                      "strike": 801,
                      "callGex": 31104055.6,
                      "putGex": -49480.47,
                      "netGex": 31054575.13
                    },
                    {
                      "strike": 802,
                      "callGex": 33615417.12,
                      "putGex": -318022.37,
                      "netGex": 33297394.74
                    },
                    {
                      "strike": 803,
                      "callGex": 43671876.64,
                      "putGex": -12545.91,
                      "netGex": 43659330.72
                    },
                    {
                      "strike": 804,
                      "callGex": 30290309.48,
                      "putGex": -4179.71,
                      "netGex": 30286129.77
                    },
                    {
                      "strike": 805,
                      "callGex": 189208865.44,
                      "putGex": -300905.21,
                      "netGex": 188907960.23
                    },
                    {
                      "strike": 806,
                      "callGex": 133322120.88,
                      "putGex": -10320.97,
                      "netGex": 133311799.91
                    },
                    {
                      "strike": 807,
                      "callGex": 22232407.32,
                      "putGex": -5274.9,
                      "netGex": 22227132.42
                    },
                    {
                      "strike": 808,
                      "callGex": 69630378.78,
                      "putGex": -9989.28,
                      "netGex": 69620389.5
                    },
                    {
                      "strike": 809,
                      "callGex": 21181156.48,
                      "putGex": 0,
                      "netGex": 21181156.48
                    },
                    {
                      "strike": 810,
                      "callGex": 258273893.83,
                      "putGex": -51405.97,
                      "netGex": 258222487.85
                    },
                    {
                      "strike": 811,
                      "callGex": 14878824.31,
                      "putGex": -1677.98,
                      "netGex": 14877146.33
                    },
                    {
                      "strike": 812,
                      "callGex": 12230524.64,
                      "putGex": 0,
                      "netGex": 12230524.64
                    },
                    {
                      "strike": 813,
                      "callGex": 3441522.67,
                      "putGex": 0,
                      "netGex": 3441522.67
                    },
                    {
                      "strike": 814,
                      "callGex": 9029933.9,
                      "putGex": 0,
                      "netGex": 9029933.9
                    },
                    {
                      "strike": 815,
                      "callGex": 82565441.72,
                      "putGex": -4094.72,
                      "netGex": 82561347
                    },
                    {
                      "strike": 816,
                      "callGex": 9116244.26,
                      "putGex": 0,
                      "netGex": 9116244.26
                    },
                    {
                      "strike": 817,
                      "callGex": 7331795.35,
                      "putGex": 0,
                      "netGex": 7331795.35
                    },
                    {
                      "strike": 818,
                      "callGex": 6135428.02,
                      "putGex": 0,
                      "netGex": 6135428.02
                    },
                    {
                      "strike": 819,
                      "callGex": 5618902.08,
                      "putGex": 0,
                      "netGex": 5618902.08
                    },
                    {
                      "strike": 820,
                      "callGex": 120021173.65,
                      "putGex": -507.31,
                      "netGex": 120020666.34
                    },
                    {
                      "strike": 821,
                      "callGex": 4902040.64,
                      "putGex": 0,
                      "netGex": 4902040.64
                    },
                    {
                      "strike": 822,
                      "callGex": 1763471.47,
                      "putGex": 0,
                      "netGex": 1763471.47
                    },
                    {
                      "strike": 823,
                      "callGex": 1494442.17,
                      "putGex": 0,
                      "netGex": 1494442.17
                    },
                    {
                      "strike": 824,
                      "callGex": 1875806.92,
                      "putGex": 0,
                      "netGex": 1875806.92
                    },
                    {
                      "strike": 825,
                      "callGex": 36071147.53,
                      "putGex": -1273.93,
                      "netGex": 36069873.6
                    },
                    {
                      "strike": 826,
                      "callGex": 317172.31,
                      "putGex": 0,
                      "netGex": 317172.31
                    },
                    {
                      "strike": 827,
                      "callGex": 5552516.4,
                      "putGex": 0,
                      "netGex": 5552516.4
                    },
                    {
                      "strike": 828,
                      "callGex": 532439.26,
                      "putGex": 0,
                      "netGex": 532439.26
                    },
                    {
                      "strike": 829,
                      "callGex": 5905179.91,
                      "putGex": 0,
                      "netGex": 5905179.91
                    },
                    {
                      "strike": 830,
                      "callGex": 42385894.31,
                      "putGex": -628.3,
                      "netGex": 42385266.01
                    },
                    {
                      "strike": 831,
                      "callGex": 2954629.15,
                      "putGex": 0,
                      "netGex": 2954629.15
                    },
                    {
                      "strike": 832,
                      "callGex": 1054088.7,
                      "putGex": 0,
                      "netGex": 1054088.7
                    },
                    {
                      "strike": 833,
                      "callGex": 261319.5,
                      "putGex": 0,
                      "netGex": 261319.5
                    },
                    {
                      "strike": 834,
                      "callGex": 6057477.48,
                      "putGex": 0,
                      "netGex": 6057477.48
                    },
                    {
                      "strike": 835,
                      "callGex": 16368272.72,
                      "putGex": -155.9,
                      "netGex": 16368116.82
                    },
                    {
                      "strike": 836,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "strike": 837,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "strike": 838,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "strike": 839,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "strike": 840,
                      "callGex": 5539703.89,
                      "putGex": -90.25,
                      "netGex": 5539613.64
                    },
                    {
                      "strike": 845,
                      "callGex": 3425021.38,
                      "putGex": 0,
                      "netGex": 3425021.38
                    },
                    {
                      "strike": 850,
                      "callGex": 13102137.63,
                      "putGex": -117.24,
                      "netGex": 13102020.39
                    },
                    {
                      "strike": 855,
                      "callGex": 1194025.55,
                      "putGex": 0,
                      "netGex": 1194025.55
                    },
                    {
                      "strike": 860,
                      "callGex": 1418947.19,
                      "putGex": -278.07,
                      "netGex": 1418669.12
                    },
                    {
                      "strike": 865,
                      "callGex": 1230521.53,
                      "putGex": 0,
                      "netGex": 1230521.53
                    },
                    {
                      "strike": 870,
                      "callGex": 827192.5,
                      "putGex": 0,
                      "netGex": 827192.5
                    },
                    {
                      "strike": 875,
                      "callGex": 6364097.54,
                      "putGex": 0,
                      "netGex": 6364097.54
                    },
                    {
                      "strike": 880,
                      "callGex": 641743.75,
                      "putGex": 0,
                      "netGex": 641743.75
                    },
                    {
                      "strike": 885,
                      "callGex": 231010.72,
                      "putGex": 0,
                      "netGex": 231010.72
                    },
                    {
                      "strike": 890,
                      "callGex": 201285.87,
                      "putGex": 0,
                      "netGex": 201285.87
                    },
                    {
                      "strike": 895,
                      "callGex": 695642.16,
                      "putGex": 0,
                      "netGex": 695642.16
                    },
                    {
                      "strike": 900,
                      "callGex": 802081.21,
                      "putGex": 0,
                      "netGex": 802081.21
                    },
                    {
                      "strike": 905,
                      "callGex": 121042.11,
                      "putGex": 0,
                      "netGex": 121042.11
                    },
                    {
                      "strike": 910,
                      "callGex": 56223.71,
                      "putGex": 0,
                      "netGex": 56223.71
                    },
                    {
                      "strike": 915,
                      "callGex": 61902.84,
                      "putGex": -0.22,
                      "netGex": 61902.62
                    },
                    {
                      "strike": 920,
                      "callGex": 132501.6,
                      "putGex": -0.1,
                      "netGex": 132501.5
                    },
                    {
                      "strike": 925,
                      "callGex": 3817.59,
                      "putGex": 0,
                      "netGex": 3817.59
                    },
                    {
                      "strike": 930,
                      "callGex": 4830.26,
                      "putGex": 0,
                      "netGex": 4830.26
                    },
                    {
                      "strike": 935,
                      "callGex": 347.63,
                      "putGex": 0,
                      "netGex": 347.63
                    },
                    {
                      "strike": 940,
                      "callGex": 6816,
                      "putGex": 0,
                      "netGex": 6816
                    },
                    {
                      "strike": 945,
                      "callGex": 4439.14,
                      "putGex": 0,
                      "netGex": 4439.14
                    },
                    {
                      "strike": 950,
                      "callGex": 27842.09,
                      "putGex": 0,
                      "netGex": 27842.09
                    },
                    {
                      "strike": 955,
                      "callGex": 149.68,
                      "putGex": 0,
                      "netGex": 149.68
                    },
                    {
                      "strike": 960,
                      "callGex": 177.49,
                      "putGex": 0,
                      "netGex": 177.49
                    },
                    {
                      "strike": 965,
                      "callGex": 213.22,
                      "putGex": 0,
                      "netGex": 213.22
                    },
                    {
                      "strike": 970,
                      "callGex": 105.65,
                      "putGex": 0,
                      "netGex": 105.65
                    },
                    {
                      "strike": 975,
                      "callGex": 104.36,
                      "putGex": 0,
                      "netGex": 104.36
                    },
                    {
                      "strike": 980,
                      "callGex": 164.44,
                      "putGex": 0,
                      "netGex": 164.44
                    },
                    {
                      "strike": 985,
                      "callGex": 830.38,
                      "putGex": 0,
                      "netGex": 830.38
                    },
                    {
                      "strike": 990,
                      "callGex": 351.08,
                      "putGex": 0,
                      "netGex": 351.08
                    },
                    {
                      "strike": 995,
                      "callGex": 194.65,
                      "putGex": 0,
                      "netGex": 194.65
                    },
                    {
                      "strike": 1000,
                      "callGex": 247.1,
                      "putGex": 0,
                      "netGex": 247.1
                    }
                  ],
                  "disclaimer": "GEX from dealer gamma positioning (OptionFlow feed); approximate, educational use."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/gex/{symbol}/heatmap": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Get 2D gamma exposure heatmap matrix",
        "description": "Returns 2D matrix of dealer gamma exposure across strikes and expiration dates. Parameter `metric` ('net', 'call', or 'put') is accepted for compatibility and echoed back; cells always compute call, put, and net gamma. Default ±35% strike band around spot applies when neither strikeMin nor strikeMax is specified; when one bound is given, the search is one-sided. Capped at 5,000 cells (sets `truncated: true`).",
        "operationId": "gex_heatmap",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/gex/SPY/heatmap?metric=net\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/gex/SPY/heatmap?metric=net\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/gex/SPY/heatmap?metric=net\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Underlying equity ticker symbol.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9.\\-]{1,10}$",
              "example": "SPY"
            }
          },
          {
            "name": "metric",
            "in": "query",
            "required": false,
            "description": "Gamma exposure metric: 'net', 'call', or 'put' (reserved / no-op parameter accepted for compatibility; echoes back in response with no effect on computation as cells always provide call, put, and net gamma).",
            "schema": {
              "type": "string",
              "enum": [
                "net",
                "call",
                "put"
              ],
              "default": "net"
            }
          },
          {
            "name": "strikeMin",
            "in": "query",
            "required": false,
            "description": "Lower strike price boundary in USD. strikeMin > strikeMax returns 400 invalid_range.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "strikeMax",
            "in": "query",
            "required": false,
            "description": "Upper strike price boundary in USD.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "minDte",
            "in": "query",
            "required": false,
            "description": "Minimum DTE horizon filter (alias: dteMin, default 0).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "maxDte",
            "in": "query",
            "required": false,
            "description": "Maximum DTE horizon filter (alias: dteMax, 0-730, default 60).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 730,
              "default": 60
            }
          }
        ],
        "responses": {
          "200": {
            "description": "2D gamma exposure matrix.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GexHeatmapResponse"
                },
                "example": {
                  "symbol": "SPY",
                  "stockPrice": 778.92,
                  "metric": "net",
                  "gammaFlip": 779.51,
                  "callWallStrike": 780,
                  "putWallStrike": 778,
                  "asOf": "2026-10-09T19:32:20.682Z",
                  "expirations": [
                    "2026-10-09",
                    "2026-10-12",
                    "2026-10-13"
                  ],
                  "cells": [
                    {
                      "expiration": "2026-10-09",
                      "strike": 510,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "expiration": "2026-10-09",
                      "strike": 515,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    },
                    {
                      "expiration": "2026-10-09",
                      "strike": 520,
                      "callGex": 0,
                      "putGex": 0,
                      "netGex": 0
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/flow": {
      "get": {
        "tags": [
          "Flow"
        ],
        "summary": "Get options flow trades",
        "description": "Returns recent options flow trade prints (large trades, filtered by premium). Limit defaults to 50 (max 500); minPremium defaults to 10000. Default sort order is premium descending; pass sort=time for timestamp descending. A market-wide query (without symbol) spanning more than 3 weekday trading sessions returns 400 out_of_range (FlowMaxMarketWideSessions = 3); split wide queries across multiple requests or narrow with symbols. Database query timeouts return 503 query_timeout with a Retry-After header.",
        "operationId": "flow",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/flow?symbol=AAPL&limit=50\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/flow?symbol=AAPL&limit=50\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/flow?symbol=AAPL&limit=50\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "description": "Underlying equity ticker symbol (alias: ticker).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbols",
            "in": "query",
            "required": false,
            "description": "Comma-separated list of symbols (alias: tickers, max 20). Exceeding 20 returns 400 invalid_parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sentiment",
            "in": "query",
            "required": false,
            "description": "Filter by derived trade sentiment ('bullish', 'bearish', or 'neutral'). Neutral includes prints with no sentiment tags.",
            "schema": {
              "type": "string",
              "enum": [
                "bullish",
                "bearish",
                "neutral"
              ]
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "Filter by execution fill side relative to prevailing bid/ask ('ask', 'bid', or 'mid').",
            "schema": {
              "type": "string",
              "enum": [
                "ask",
                "bid",
                "mid"
              ]
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Filter by option contract type ('call' or 'put', alias: optionType).",
            "schema": {
              "type": "string",
              "enum": [
                "call",
                "put"
              ]
            }
          },
          {
            "name": "executionType",
            "in": "query",
            "required": false,
            "description": "Filter by trade routing structure ('sweep', 'block', or 'split', alias: execution).",
            "schema": {
              "type": "string",
              "enum": [
                "sweep",
                "block",
                "split"
              ]
            }
          },
          {
            "name": "minPremium",
            "in": "query",
            "required": false,
            "description": "Minimum trade premium in dollars (defaults to $10,000 for large prints; keeps per-symbol queries fast; explicit values below 10000 remain supported).",
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 10000
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Number of flow records to return (1 to 500, default 50; values > 500 are clamped to 500 and plan max_rows).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order of returned trade prints ('premium' for premium descending, 'time' for executedAt descending; defaults to 'premium').",
            "schema": {
              "type": "string",
              "enum": [
                "premium",
                "time"
              ],
              "default": "premium"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Window start date in YYYY-MM-DD format (alias: fromDate). Older than 7 days returns 400 out_of_range. Clamped to plan history_days. When omitted, the window starts at `to` (a `to` alone is one session; a `to` past the newest session means the newest session) or, with neither, the newest session.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Window end date in YYYY-MM-DD format (alias: toDate). When omitted: with symbol(s), the newest session; market-wide (no symbols), the `from` session, so a `from` alone is one session; with neither `from` nor `to`, the newest session.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Array of options flow trades.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlowResponse"
                },
                "example": {
                  "asOf": "2026-10-09T19:34:09.078Z",
                  "retentionDays": 7,
                  "fromDate": "2026-10-09",
                  "toDate": "2026-10-09",
                  "count": 10000,
                  "countCapped": true,
                  "prints": [
                    {
                      "executedAt": "2026-10-09T18:01:18.053Z",
                      "ticker": "AAPL",
                      "optionSymbol": "",
                      "optionType": "put",
                      "strike": 330,
                      "expiration": "2026-11-27",
                      "dte": 49,
                      "side": "ask",
                      "sentiment": "bearish",
                      "executionType": "split",
                      "premium": 5158800,
                      "size": 5732,
                      "price": 9,
                      "underlyingPrice": 335.39,
                      "otmPct": 1.607084289931125,
                      "volume": 9988,
                      "openInterest": 16,
                      "opening": true,
                      "delta": -0.3894177072387585,
                      "impliedVolatility": 25.31,
                      "isETFOrIndex": false
                    },
                    {
                      "executedAt": "2026-10-09T17:51:55.467Z",
                      "ticker": "AAPL",
                      "optionSymbol": "",
                      "optionType": "call",
                      "strike": 350,
                      "expiration": "2026-11-20",
                      "dte": 42,
                      "side": "unknown",
                      "sentiment": "neutral",
                      "executionType": "block",
                      "premium": 2968875,
                      "size": 5075,
                      "price": 5.85,
                      "underlyingPrice": 334.945,
                      "otmPct": 4.494767797698129,
                      "volume": 6381,
                      "openInterest": 17591,
                      "opening": false,
                      "delta": 0.3332500957498555,
                      "impliedVolatility": 24.47,
                      "isETFOrIndex": false
                    },
                    {
                      "executedAt": "2026-10-09T15:13:17.145Z",
                      "ticker": "AAPL",
                      "optionSymbol": "",
                      "optionType": "call",
                      "strike": 125,
                      "expiration": "2029-01-19",
                      "dte": 833,
                      "side": "ask",
                      "sentiment": "bullish",
                      "executionType": "split",
                      "premium": 1665150,
                      "size": 75,
                      "price": 222.02,
                      "underlyingPrice": 334.24,
                      "otmPct": -62.601723312589755,
                      "volume": 99,
                      "openInterest": 48,
                      "opening": true,
                      "delta": 0.97882120744085,
                      "impliedVolatility": 42.25,
                      "isETFOrIndex": false
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/flow/net": {
      "get": {
        "tags": [
          "Flow"
        ],
        "summary": "Get 1-minute net flow bars and summary",
        "description": "Returns cumulative 1-minute grain net flow bars and session volume/dollar totals for a single ticker. `minPremium` defaults to $10,000, which also filters trades in `summary.volume`. Date windows default to newest session; future `to` is cut back; `from` after newest session returns 400 out_of_range. Date parameters are subject to 7-day retention and plan history clamping.",
        "operationId": "flow_net",
        "x-min-plan": "basic",
        "x-codeSamples": [
          {
            "lang": "curl",
            "source": "curl -s -H \"Authorization: Bearer $WSO_API_KEY\" \\\n  \"https://api.wheelstrategyoptions.com/v1/flow/net?symbol=AAPL\"",
            "label": "cURL"
          },
          {
            "lang": "Python",
            "source": "import os, requests\n\nresp = requests.get(\n    \"https://api.wheelstrategyoptions.com/v1/flow/net?symbol=AAPL\",\n    headers={\"Authorization\": f\"Bearer {os.environ['WSO_API_KEY']}\"}\n)\nprint(resp.json())",
            "label": "Python (requests)"
          },
          {
            "lang": "JavaScript",
            "source": "async function main() {\n  const resp = await fetch(\"https://api.wheelstrategyoptions.com/v1/flow/net?symbol=AAPL\", {\n    headers: { Authorization: `Bearer ${process.env.WSO_API_KEY}` }\n  });\n  const data = await resp.json();\n  console.log(data);\n}\n\nmain();",
            "label": "Node.js (fetch)"
          }
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": true,
            "description": "Underlying equity ticker symbol (alias: ticker). Missing symbol returns 400 missing_symbol.",
            "schema": {
              "type": "string",
              "example": "AAPL"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Window start date in YYYY-MM-DD format (alias: fromDate). Older than 7 days returns 400 out_of_range. Clamped to plan history_days. When omitted, the window starts at `to` (a `to` alone is one session; a `to` past the newest session means the newest session) or, with neither, the newest session.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Window end date in YYYY-MM-DD format (alias: toDate). Defaults to the `from` session (a `from` alone is one session); with neither `from` nor `to`, the newest session.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "minPremium",
            "in": "query",
            "required": false,
            "description": "Minimum trade premium in dollars (defaults to 10000).",
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 10000
            }
          }
        ],
        "responses": {
          "200": {
            "description": "1-minute net flow bars and session aggregate summary.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Limit-Clamped": {
                "$ref": "#/components/headers/X-Limit-Clamped"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetFlowResponse"
                },
                "example": {
                  "ticker": "AAPL",
                  "retentionDays": 7,
                  "mode": "cumulative",
                  "points": [
                    {
                      "t": "2026-10-09T13:30:00Z",
                      "netCallPremium": -98374,
                      "netPutPremium": 588294,
                      "netVolume": 307
                    },
                    {
                      "t": "2026-10-09T13:31:00Z",
                      "netCallPremium": -351715,
                      "netPutPremium": 1414439,
                      "netVolume": -109
                    },
                    {
                      "t": "2026-10-09T13:32:00Z",
                      "netCallPremium": 353009,
                      "netPutPremium": 1640725,
                      "netVolume": -114
                    }
                  ],
                  "summary": {
                    "volume": 313048,
                    "ncp": 1019351,
                    "npp": 8160195,
                    "spot": 336.81
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/public/announcement": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "Public announcement broadcast",
        "description": "Returns the active site announcement banner if currently configured and within its scheduled window. No authentication. Responses may be cached for up to 60 seconds.",
        "operationId": "public_announcement",
        "security": [],
        "responses": {
          "200": {
            "description": "Current announcement or null if none active.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAnnouncementResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/public/plans": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "Public plans and pricing metadata",
        "description": "Returns the active plans (limits and displayed prices), the enabled metered endpoints with their minimum plan, whether billing is open, and the trial length. No authentication. Responses may be cached for up to 5 minutes.",
        "operationId": "public_plans",
        "security": [],
        "responses": {
          "200": {
            "description": "Plans and endpoint catalogue.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPlansResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "503": {
            "description": "Catalogue unavailable. Error code: `service_unavailable`.",
            "headers": {
              "X-Request-ID": {
                "$ref": "#/components/headers/X-Request-ID"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIError"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "wso_live_…",
        "description": "WSO API Bearer Token (format: wso_live_<43_chars><6_checksum>)."
      }
    },
    "headers": {
      "X-RateLimit-Limit": {
        "description": "Maximum number of allowed requests in the current 1-minute window.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Remaining requests allowed in the current 1-minute window.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Reset": {
        "description": "Time in seconds until the rate limit bucket fully refills.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Request-ID": {
        "description": "Unique request identifier. Echoes a valid client-supplied request ID or contains a server-generated UUID for tracing.",
        "schema": {
          "type": "string"
        }
      },
      "X-Limit-Clamped": {
        "description": "Returned with value 'true' when results were clamped by account tier row or history limits. Can appear on 200 responses as well as downstream handler 4xx/5xx responses.",
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        }
      },
      "Retry-After": {
        "description": "Number of seconds to wait before retrying a rate-limited request.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Data-Source": {
        "description": "Present only when the response was served from stored data because the live provider was unavailable (value database-fallback).",
        "schema": {
          "type": "string",
          "enum": [
            "database-fallback"
          ]
        }
      },
      "WWW-Authenticate": {
        "description": "Specifies Bearer authentication challenge.",
        "schema": {
          "type": "string",
          "example": "Bearer realm=\"wso-api\""
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad Request. The request body, query parameters, or path values violated validation constraints.",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "X-Limit-Clamped": {
            "$ref": "#/components/headers/X-Limit-Clamped"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Unauthorized. Missing, malformed, or invalid API key credential.",
        "headers": {
          "WWW-Authenticate": {
            "$ref": "#/components/headers/WWW-Authenticate"
          },
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Forbidden. Rejection reasons: `subscription_required`, `subscription_inactive`, `trial_ended`, `plan_upgrade_required` (with `required_plan`), `wrong_credential_type`, `origin_forbidden` (origin authentication failed).",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            },
            "examples": {
              "subscription_required": {
                "value": {
                  "error": "subscription_required",
                  "message": "Subscription required: subscription_required",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_sub"
                }
              },
              "trial_ended": {
                "value": {
                  "error": "trial_ended",
                  "message": "Your trial has ended. Subscribe to keep using the API.",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_trial"
                }
              },
              "plan_upgrade_required": {
                "value": {
                  "error": "plan_upgrade_required",
                  "message": "Current plan does not allow access to this endpoint",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_upgrade",
                  "required_plan": "basic"
                }
              },
              "wrong_credential_type": {
                "value": {
                  "error": "wrong_credential_type",
                  "message": "Firebase ID tokens cannot be used on /v1; use an API key",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_cred"
                }
              },
              "origin_forbidden": {
                "value": {
                  "error": "origin_forbidden",
                  "message": "Access denied: origin authentication failed",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_orig"
                }
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "Not Found. Requested resource, ticker symbol, or option contract does not exist.",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "X-Limit-Clamped": {
            "$ref": "#/components/headers/X-Limit-Clamped"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "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.)",
        "headers": {
          "Allow": {
            "description": "Allowed HTTP methods for this resource.",
            "schema": {
              "type": "string"
            }
          },
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            },
            "example": {
              "error": "method_not_allowed",
              "message": "Method not allowed",
              "status": 405,
              "timestamp": "2026-10-09T18:00:00Z",
              "request_id": "c7a8b320-1a2b-4c3d-8e4f-5a6b7c8d9e0f"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "Too Many Requests. Rejection reasons: `rate_limited` (per-minute limit), `too_many_concurrent_requests` (in-flight cap), `too_many_auth_failures`.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "InternalError": {
        "description": "Internal Server Error. Unhandled internal server or database error.",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "X-Limit-Clamped": {
            "$ref": "#/components/headers/X-Limit-Clamped"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "BadGateway": {
        "description": "Bad Gateway. Upstream market data provider failure.",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "ServiceUnavailable": {
        "description": "Service Unavailable. Backing database, cache, or external provider connection unavailable.",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "X-Limit-Clamped": {
            "$ref": "#/components/headers/X-Limit-Clamped"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      },
      "ForbiddenRank0": {
        "description": "Forbidden. Rejection reasons: `wrong_credential_type` (session token presented on API route), `origin_forbidden` (origin authentication failed).",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            },
            "examples": {
              "wrong_credential_type": {
                "value": {
                  "error": "wrong_credential_type",
                  "message": "Firebase ID tokens cannot be used on /v1; use an API key",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_cred"
                }
              },
              "origin_forbidden": {
                "value": {
                  "error": "origin_forbidden",
                  "message": "Access denied: origin authentication failed",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_orig"
                }
              }
            }
          }
        }
      },
      "ForbiddenStarter": {
        "description": "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).",
        "headers": {
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            },
            "examples": {
              "subscription_required": {
                "value": {
                  "error": "subscription_required",
                  "message": "Subscription required: subscription_required",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_sub"
                }
              },
              "trial_ended": {
                "value": {
                  "error": "trial_ended",
                  "message": "Your trial has ended. Subscribe to keep using the API.",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_trial"
                }
              },
              "subscription_inactive": {
                "value": {
                  "error": "subscription_inactive",
                  "message": "Subscription required: subscription_inactive",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_inact"
                }
              },
              "wrong_credential_type": {
                "value": {
                  "error": "wrong_credential_type",
                  "message": "Firebase ID tokens cannot be used on /v1; use an API key",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_cred"
                }
              },
              "origin_forbidden": {
                "value": {
                  "error": "origin_forbidden",
                  "message": "Access denied: origin authentication failed",
                  "status": 403,
                  "timestamp": "2026-10-09T20:00:00Z",
                  "request_id": "req_sample_403_orig"
                }
              }
            }
          }
        }
      },
      "TooManyRequestsRank0": {
        "description": "Too Many Requests. Rejection reasons: `rate_limited` (exceeded per-minute rate limit or per-IP rate limit), `too_many_auth_failures` (edge lockout).",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-Request-ID": {
            "$ref": "#/components/headers/X-Request-ID"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/APIError"
            }
          }
        }
      }
    },
    "schemas": {
      "APIError": {
        "type": "object",
        "description": "Standard RFC 7807-inspired error response envelope returned on all HTTP 4xx and 5xx responses.",
        "properties": {
          "error": {
            "type": "string",
            "description": "Machine-readable error classification code.",
            "enum": [
              "account_suspended",
              "endpoint_not_allowed",
              "endpoint_unavailable",
              "entitlement_unavailable",
              "internal_error",
              "ip_blocked",
              "invalid_auth",
              "invalid_body",
              "invalid_key",
              "invalid_page",
              "invalid_parameter",
              "invalid_range",
              "maintenance",
              "method_not_allowed",
              "missing_auth",
              "missing_symbol",
              "missing_symbols",
              "not_found",
              "origin_forbidden",
              "out_of_range",
              "plan_upgrade_required",
              "query_timeout",
              "query_too_broad",
              "rate_limited",
              "service_unavailable",
              "subscription_inactive",
              "subscription_required",
              "symbol_not_found",
              "too_many_auth_failures",
              "too_many_concurrent_requests",
              "too_many_filters",
              "too_many_symbols",
              "trial_ended",
              "upstream_error",
              "wrong_credential_type"
            ]
          },
          "message": {
            "type": "string",
            "description": "Human-readable diagnostic description of the error."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "timestamp": {
            "type": "string",
            "description": "ISO 8601 UTC timestamp of error generation.",
            "format": "date-time"
          },
          "request_id": {
            "type": "string",
            "description": "Unique request identifier. Echoes client-supplied request ID or contains a server-generated UUID for tracing."
          },
          "required_plan": {
            "type": "string",
            "description": "Minimum plan (for example 'basic') required to access the endpoint, present on plan_upgrade_required 403 errors."
          }
        },
        "required": [
          "error",
          "message",
          "status",
          "timestamp",
          "request_id"
        ],
        "x-error-codes": [
          {
            "code": "account_suspended",
            "status": 403,
            "description": "This account cannot use the API right now. Contact us for details."
          },
          {
            "code": "endpoint_not_allowed",
            "status": 403,
            "description": "This endpoint is not available for your account."
          },
          {
            "code": "endpoint_unavailable",
            "status": 503,
            "description": "This endpoint is temporarily unavailable. Retry later."
          },
          {
            "code": "entitlement_unavailable",
            "status": 503,
            "description": "Account entitlement database or subscription cache is temporarily unreachable."
          },
          {
            "code": "internal_error",
            "status": 500,
            "description": "An unexpected server error occurred while processing the request. Retry with exponential backoff."
          },
          {
            "code": "ip_blocked",
            "status": 403,
            "description": "Requests from this network are not accepted. Contact us if you believe this is an error."
          },
          {
            "code": "invalid_auth",
            "status": 401,
            "description": "Authorization header format is invalid. Must use the 'Bearer wso_live_...' scheme with a separating space."
          },
          {
            "code": "invalid_body",
            "status": 400,
            "description": "Request body is malformed JSON, unreadable, contains unrecognized fields, or exceeds 1 MiB."
          },
          {
            "code": "invalid_key",
            "status": 401,
            "description": "API key does not exist or was revoked. Generate a new key in the developer dashboard."
          },
          {
            "code": "invalid_page",
            "status": 400,
            "description": "Pagination page parameter exceeds allowable bounds (e.g. page > 100)."
          },
          {
            "code": "invalid_parameter",
            "status": 400,
            "description": "Query or path parameter failed format, type, or constraint validation (e.g. malformed symbol or bad limit)."
          },
          {
            "code": "invalid_range",
            "status": 400,
            "description": "Numerical or date range constraint violated (e.g. min exceeds max, or date range exceeds allowable span)."
          },
          {
            "code": "maintenance",
            "status": 503,
            "description": "The API is undergoing maintenance. Retry after the Retry-After interval."
          },
          {
            "code": "method_not_allowed",
            "status": 405,
            "description": "HTTP method is not supported on this endpoint. Consult Allow response header."
          },
          {
            "code": "missing_auth",
            "status": 401,
            "description": "Authorization header is missing or empty. Provide an API key via Bearer authentication."
          },
          {
            "code": "missing_symbol",
            "status": 400,
            "description": "Required equity symbol or option contract parameter was omitted."
          },
          {
            "code": "missing_symbols",
            "status": 400,
            "description": "Required symbols parameter for batch request was omitted or empty."
          },
          {
            "code": "not_found",
            "status": 404,
            "description": "Endpoint route does not exist or requested option contract was not found in active chain records."
          },
          {
            "code": "origin_forbidden",
            "status": 403,
            "description": "Request rejected because origin authentication failed. All requests must route through the configured Cloudflare edge proxy."
          },
          {
            "code": "out_of_range",
            "status": 400,
            "description": "Requested date window exceeds retention horizon (e.g. 7-day flow retention) or market-wide window cap."
          },
          {
            "code": "plan_upgrade_required",
            "status": 403,
            "description": "The requested endpoint requires a higher tier plan than your current active plan. Response includes required_plan."
          },
          {
            "code": "query_timeout",
            "status": 503,
            "description": "Database execution budget exceeded for complex query or statement timeout. Retry with narrower parameters."
          },
          {
            "code": "query_too_broad",
            "status": 400,
            "description": "Market-wide query is insufficiently constrained; narrow search filters or specify symbol."
          },
          {
            "code": "rate_limited",
            "status": 429,
            "description": "Account rate limit exceeded (or unauthenticated/public IP rate limit exceeded). Respect the Retry-After header before retrying."
          },
          {
            "code": "service_unavailable",
            "status": 503,
            "description": "Underlying market data cache, database, or verifier is temporarily unavailable."
          },
          {
            "code": "subscription_inactive",
            "status": 403,
            "description": "Account subscription is inactive, unpaid, or canceled. Update payment methods in the dashboard."
          },
          {
            "code": "subscription_required",
            "status": 403,
            "description": "An active paid subscription plan is required to access data endpoints. Subscribe via the dashboard."
          },
          {
            "code": "symbol_not_found",
            "status": 404,
            "description": "Underlying equity ticker symbol is unrecognized or has no options market data coverage."
          },
          {
            "code": "too_many_auth_failures",
            "status": 429,
            "description": "Client IP temporarily throttled due to repeated authentication failures."
          },
          {
            "code": "too_many_concurrent_requests",
            "status": 429,
            "description": "Account in-flight concurrency ceiling exceeded. Reduce concurrent calls or wait for active requests to complete."
          },
          {
            "code": "too_many_filters",
            "status": 400,
            "description": "Screener request exceeds maximum permitted filter predicates count (up to 50 filters)."
          },
          {
            "code": "too_many_symbols",
            "status": 400,
            "description": "Batch request exceeds maximum permitted symbols limit (up to 20 symbols)."
          },
          {
            "code": "trial_ended",
            "status": 403,
            "description": "Your trial has ended. Subscribe to keep using the API."
          },
          {
            "code": "upstream_error",
            "status": 502,
            "description": "Upstream market data provider returned an error and fallback stored data is unavailable."
          },
          {
            "code": "wrong_credential_type",
            "status": 403,
            "description": "A Firebase ID token or dashboard session credential was sent to /v1; use an API key (wso_live_...) instead. Legacy wsk_ keys return invalid_key (401)."
          }
        ]
      },
      "HealthResponse": {
        "type": "object",
        "description": "Service health check response.",
        "properties": {
          "status": {
            "type": "string",
            "description": "Service health status ('healthy')."
          },
          "version": {
            "type": "string",
            "description": "Current binary deployment version string."
          }
        },
        "required": [
          "status",
          "version"
        ]
      },
      "ReadyChecks": {
        "type": "object",
        "description": "Health status of upstream storage backends.",
        "properties": {
          "market_db": {
            "type": "string",
            "description": "Market data PostgreSQL connection pool status ('ok' or 'error')."
          },
          "control_db": {
            "type": "string",
            "description": "Control plane PostgreSQL connection pool status ('ok', 'error', or 'not_configured')."
          }
        },
        "required": [
          "market_db",
          "control_db"
        ]
      },
      "ReadyResponse": {
        "type": "object",
        "description": "Readiness probe verifying backend dependency health.",
        "properties": {
          "status": {
            "type": "string",
            "description": "Readiness evaluation ('ready' or 'not_ready')."
          },
          "version": {
            "type": "string",
            "description": "Current binary build version."
          },
          "checks": {
            "$ref": "#/components/schemas/ReadyChecks",
            "description": "Detailed subsystem dependency check results."
          },
          "ip_limits": {
            "type": "string",
            "description": "Status of Cloudflare origin IP rate limiting ('enabled' or 'disabled')."
          }
        },
        "required": [
          "status",
          "version",
          "checks",
          "ip_limits"
        ]
      },
      "VerifyResponse": {
        "type": "object",
        "description": "Authentication verification and account entitlement payload.",
        "properties": {
          "key_id": {
            "type": "integer",
            "description": "Control plane database identifier of the API key."
          },
          "key_prefix": {
            "type": "string",
            "description": "Key prefix identifier for dashboard display (first 16 characters)."
          },
          "status": {
            "type": "string",
            "description": "Authentication state ('authenticated')."
          },
          "plan": {
            "type": [
              "string",
              "null"
            ],
            "description": "Account subscription plan id (for example 'basic'), returned even if subscription is currently inactive."
          },
          "subscription_status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Current Stripe subscription status ('active', 'trialing', 'past_due', etc.)."
          },
          "entitled": {
            "type": "boolean",
            "description": "Whether the key holder is entitled to access paid data endpoints."
          },
          "entitlement_reason": {
            "type": "string",
            "description": "Reason code if unentitled ('subscription_required', 'subscription_inactive', etc.)."
          }
        },
        "required": [
          "key_id",
          "key_prefix",
          "status",
          "entitled",
          "entitlement_reason"
        ]
      },
      "UsageRateLimit": {
        "type": "object",
        "description": "Account per-minute rate limit tier.",
        "properties": {
          "requests_per_minute": {
            "type": "integer",
            "description": "Maximum allowed requests per minute."
          }
        },
        "required": [
          "requests_per_minute"
        ]
      },
      "UsageConcurrency": {
        "type": "object",
        "description": "Account concurrent request lease cap.",
        "properties": {
          "max": {
            "type": "integer",
            "description": "Maximum number of simultaneous in-flight requests allowed."
          }
        },
        "required": [
          "max"
        ]
      },
      "UsageResponse": {
        "type": "object",
        "description": "Current account usage (requests today) and active limits.",
        "properties": {
          "plan": {
            "type": [
              "string",
              "null"
            ],
            "description": "Current active plan id (for example 'basic'), or null."
          },
          "subscription_status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Subscription status string ('active', 'trialing', 'past_due', etc.)."
          },
          "entitled": {
            "type": "boolean",
            "description": "Whether the account is currently entitled to execute paid API operations."
          },
          "date": {
            "type": "string",
            "description": "Current date in America/New_York (YYYY-MM-DD format) defining the counting day for requests.today.",
            "format": "date"
          },
          "rate_limit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UsageRateLimit"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rate limiting configuration, null if account has no active plan."
          },
          "concurrency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UsageConcurrency"
              },
              {
                "type": "null"
              }
            ],
            "description": "Concurrency limitation configuration, null if account has no active plan."
          },
          "requests": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UsageRequests"
              },
              {
                "type": "null"
              }
            ],
            "description": "Daily request usage breakdown, null if account has no active plan."
          }
        },
        "required": [
          "entitled",
          "date"
        ],
        "example": {
          "plan": "basic",
          "subscription_status": "active",
          "entitled": true,
          "date": "2026-10-10",
          "requests": {
            "today": 42,
            "reset_at": "2026-10-11T04:00:00Z",
            "reset_unix": 1791691200
          },
          "rate_limit": {
            "requests_per_minute": 300
          },
          "concurrency": {
            "max": 5
          }
        }
      },
      "QuoteResponse": {
        "type": "object",
        "description": "Current or database fallback stock quote.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock ticker symbol (uppercase)."
          },
          "name": {
            "type": "string",
            "description": "Company or index name."
          },
          "price": {
            "type": "number",
            "description": "Current equity price in USD."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of quote snapshot, or null if unknown or when falling back without a recorded timestamp.",
            "format": "date-time"
          }
        },
        "required": [
          "symbol",
          "name",
          "price"
        ]
      },
      "OptionQuote": {
        "type": "object",
        "description": "US equity option contract quote and Greek sensitivities.",
        "properties": {
          "optionSymbol": {
            "type": "string",
            "description": "Standard OCC option symbology (e.g. `SPY270917C00800000`)."
          },
          "underlying": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "expiration": {
            "type": "string",
            "description": "Contract expiration date in YYYY-MM-DD format.",
            "format": "date"
          },
          "strike": {
            "type": "number",
            "description": "Option strike price in USD."
          },
          "side": {
            "type": "string",
            "description": "Contract side ('call' or 'put').",
            "enum": [
              "call",
              "put"
            ]
          },
          "bid": {
            "type": [
              "number",
              "null"
            ],
            "description": "Best bid price in USD."
          },
          "ask": {
            "type": [
              "number",
              "null"
            ],
            "description": "Best ask price in USD."
          },
          "mid": {
            "type": [
              "number",
              "null"
            ],
            "description": "Midpoint between bid and ask in USD."
          },
          "last": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded contract price in USD."
          },
          "volume": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total trading volume in contracts during the current trading session."
          },
          "openInterest": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total open interest contracts from previous market session settlement."
          },
          "iv": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied volatility expressed as a percentage (e.g. 28.5% is returned as 28.5)."
          },
          "delta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option delta sensitivity (-1.0 to 1.0)."
          },
          "gamma": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option gamma sensitivity."
          },
          "theta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option theta sensitivity representing expected 1-day premium decay in USD."
          },
          "vega": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option vega sensitivity representing premium change per 1% move in implied volatility."
          },
          "rho": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option rho sensitivity."
          },
          "underlyingPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying equity spot price in USD at the time of quote calculation."
          },
          "spreadPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bid-ask spread expressed as percentage of midpoint: (ask - bid) / mid * 100 without ABS; null when ask < bid (inverted market)."
          },
          "dte": {
            "type": "integer",
            "description": "Days to expiration calculated relative to current calendar date."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of contract quote calculation.",
            "format": "date-time"
          }
        },
        "required": [
          "optionSymbol",
          "underlying",
          "expiration",
          "strike",
          "side",
          "dte"
        ]
      },
      "OptionQuotesBatchResponse": {
        "type": "object",
        "description": "Batch lookup response containing quotes for up to 20 option contracts.",
        "properties": {
          "quotes": {
            "type": "array",
            "description": "Array of returned option contract quotes.",
            "items": {
              "$ref": "#/components/schemas/OptionQuote"
            }
          },
          "missing": {
            "type": "array",
            "description": "Array of requested option symbols that were not found in the database.",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "quotes",
          "missing"
        ]
      },
      "ExpirationEntry": {
        "type": "object",
        "description": "Available option expiration date and calculated days to expiry.",
        "properties": {
          "expiration": {
            "type": "string",
            "description": "Expiration date in YYYY-MM-DD format.",
            "format": "date"
          },
          "dte": {
            "type": "integer",
            "description": "Days to expiration from today."
          }
        },
        "required": [
          "expiration",
          "dte"
        ]
      },
      "ExpirationsResponse": {
        "type": "object",
        "description": "Option expiration schedule for an underlying stock.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of expirations snapshot.",
            "format": "date-time"
          },
          "expirations": {
            "type": "array",
            "description": "List of active expiration dates sorted chronologically.",
            "items": {
              "$ref": "#/components/schemas/ExpirationEntry"
            }
          }
        },
        "required": [
          "symbol",
          "expirations"
        ]
      },
      "ChainResponse": {
        "type": "object",
        "description": "Filtered option chain matrix.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "underlyingPrice": {
            "type": "number",
            "description": "Underlying spot price on the first returned contract row in USD."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of chain snapshot.",
            "format": "date-time"
          },
          "truncated": {
            "type": "boolean",
            "description": "True when more contracts match than were returned (use nextCursor)."
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque cursor to fetch the next page of results, or null when all results have been returned."
          },
          "contracts": {
            "type": "array",
            "description": "Array of option contracts matching filter parameters.",
            "items": {
              "$ref": "#/components/schemas/OptionQuote"
            }
          }
        },
        "required": [
          "symbol",
          "underlyingPrice",
          "truncated",
          "contracts"
        ]
      },
      "EarningsEntry": {
        "type": "object",
        "description": "Corporate earnings event calendar entry. May fall back to stock_info rows with unknown timing and null consensus estimates.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Equity ticker symbol."
          },
          "name": {
            "type": "string",
            "description": "Company name."
          },
          "earningsDate": {
            "type": "string",
            "description": "Earnings announcement date in YYYY-MM-DD format.",
            "format": "date"
          },
          "timing": {
            "type": "string",
            "description": "Announcement timing session ('bmo' [before market open], 'amc' [after market close], 'during', or 'unknown' when session timing is unconfirmed)."
          },
          "fiscalQuarter": {
            "type": [
              "string",
              "null"
            ],
            "description": "Fiscal quarter identifier (e.g. 'Q3 2026'). Note: currently unpopulated/null by upstream data providers."
          },
          "epsEstimated": {
            "type": [
              "number",
              "null"
            ],
            "description": "Consensus estimated earnings per share in USD. May be null if consensus estimates are unavailable from upstream."
          },
          "revenueEstimated": {
            "type": [
              "number",
              "null"
            ],
            "description": "Consensus estimated quarterly revenue in USD. Note: currently unpopulated/null by upstream data providers."
          }
        },
        "required": [
          "symbol",
          "name",
          "earningsDate",
          "timing"
        ]
      },
      "EarningsResponse": {
        "type": "object",
        "description": "Calendar of corporate earnings announcements across the requested date window.",
        "properties": {
          "from": {
            "type": "string",
            "description": "Window start date in YYYY-MM-DD format.",
            "format": "date"
          },
          "to": {
            "type": "string",
            "description": "Window end date in YYYY-MM-DD format.",
            "format": "date"
          },
          "truncated": {
            "type": "boolean",
            "description": "Indicates whether returned results hit the query limit."
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque cursor to fetch the next page of results, or null when all results have been returned."
          },
          "results": {
            "type": "array",
            "description": "List of earnings announcement events.",
            "items": {
              "$ref": "#/components/schemas/EarningsEntry"
            }
          }
        },
        "required": [
          "from",
          "to",
          "truncated",
          "results"
        ]
      },
      "DividendEntry": {
        "type": "object",
        "description": "Corporate dividend calendar event.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Equity ticker symbol."
          },
          "name": {
            "type": "string",
            "description": "Company name."
          },
          "exDate": {
            "type": "string",
            "description": "Ex-dividend date in YYYY-MM-DD format.",
            "format": "date"
          },
          "payDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Dividend distribution payment date in YYYY-MM-DD format.",
            "format": "date"
          },
          "amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Dividend payout amount per share in USD."
          },
          "yieldPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": "Annualized dividend yield percentage."
          },
          "frequency": {
            "type": "string",
            "description": "Distribution frequency (e.g. 'quarterly', 'monthly', 'annual', or empty string)."
          }
        },
        "required": [
          "symbol",
          "name",
          "exDate",
          "frequency"
        ]
      },
      "DividendsResponse": {
        "type": "object",
        "description": "Calendar of corporate dividend ex-dates across the requested date window.",
        "properties": {
          "from": {
            "type": "string",
            "description": "Window start date in YYYY-MM-DD format.",
            "format": "date"
          },
          "to": {
            "type": "string",
            "description": "Window end date in YYYY-MM-DD format.",
            "format": "date"
          },
          "truncated": {
            "type": "boolean",
            "description": "Indicates whether returned results hit the query limit."
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque cursor to fetch the next page of results, or null when all results have been returned."
          },
          "results": {
            "type": "array",
            "description": "List of dividend calendar events.",
            "items": {
              "$ref": "#/components/schemas/DividendEntry"
            }
          }
        },
        "required": [
          "from",
          "to",
          "truncated",
          "results"
        ]
      },
      "IVContext": {
        "type": "object",
        "description": "Implied volatility metrics and historical percentile context.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Equity ticker symbol."
          },
          "currentIV": {
            "type": "number",
            "description": "Current annualized implied volatility percentage (defaults to 0 when missing)."
          },
          "ivr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied volatility rank (0-100) relative to 52-week high and low."
          },
          "ivp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied volatility percentile (0-100); null when fewer than 20 historical observations exist."
          },
          "ivHigh52w": {
            "type": "number",
            "description": "Highest annualized IV recorded in the trailing 52 weeks (defaults to 0 when missing)."
          },
          "ivLow52w": {
            "type": "number",
            "description": "Lowest annualized IV recorded in the trailing 52 weeks (defaults to 0 when missing)."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "Calculation snapshot date in YYYY-MM-DD format.",
            "format": "date"
          }
        },
        "required": [
          "symbol",
          "currentIV",
          "ivHigh52w",
          "ivLow52w"
        ]
      },
      "TopIvStock": {
        "type": "object",
        "description": "Equity ranked by high implied volatility or high IV rank (excludes stocks with IV > 200%).",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock ticker symbol."
          },
          "name": {
            "type": "string",
            "description": "Company name."
          },
          "stockIV": {
            "type": "number",
            "description": "Current implied volatility percentage."
          },
          "ivr": {
            "type": [
              "number",
              "null"
            ],
            "description": "IV Rank percentage (0 to 100)."
          },
          "ivChange1w": {
            "type": [
              "number",
              "null"
            ],
            "description": "1-week change in implied volatility points."
          },
          "marketCap": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Market capitalization in USD."
          },
          "logoUrl": {
            "type": "string",
            "description": "Company logo CDN image URL."
          }
        },
        "required": [
          "symbol",
          "name",
          "stockIV",
          "logoUrl"
        ]
      },
      "TopIvStocksResponse": {
        "type": "object",
        "description": "Ranked stocks by implied volatility metrics.",
        "properties": {
          "stocks": {
            "type": "array",
            "description": "List of top IV stocks.",
            "items": {
              "$ref": "#/components/schemas/TopIvStock"
            }
          }
        },
        "required": [
          "stocks"
        ]
      },
      "GexStrikeRow": {
        "type": "object",
        "description": "Gamma exposure metrics aggregated at a single option strike price.",
        "properties": {
          "strike": {
            "type": "number",
            "description": "Option strike price in USD."
          },
          "callGex": {
            "type": "number",
            "description": "Call option gamma exposure across open contracts. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "putGex": {
            "type": "number",
            "description": "Put option gamma exposure across open contracts. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "netGex": {
            "type": "number",
            "description": "Net gamma exposure at strike (callGex + putGex). Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          }
        },
        "required": [
          "strike",
          "callGex",
          "putGex",
          "netGex"
        ]
      },
      "GexResponse": {
        "type": "object",
        "description": "Dealer gamma exposure (GEX) profile and key volatility thresholds.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "stockPrice": {
            "type": "number",
            "description": "Current underlying stock spot price in USD."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of GEX calculation.",
            "format": "date-time"
          },
          "regime": {
            "type": "string",
            "description": "Sign of net dealer gamma: 'positive' (net dealer gamma > 0), 'negative' (net dealer gamma < 0), or 'neutral' (net dealer gamma == 0). See flipRegime for the spot-vs-flip view.",
            "enum": [
              "positive",
              "negative",
              "neutral"
            ]
          },
          "flipRegime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Market regime derived from spot relative to gammaFlip: 'positive' when stockPrice > gammaFlip, 'negative' when stockPrice < gammaFlip, 'neutral' when stockPrice == gammaFlip, or null when there is no gammaFlip.",
            "enum": [
              "positive",
              "negative",
              "neutral",
              null
            ]
          },
          "netGex": {
            "type": "number",
            "description": "Net dealer gamma exposure across all strikes. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "totalCallGex": {
            "type": "number",
            "description": "Aggregate call gamma exposure across all strikes. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "totalPutGex": {
            "type": "number",
            "description": "Aggregate put gamma exposure across all strikes. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "gammaFlip": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price level in USD where net gamma transitions between positive and negative regimes."
          },
          "callWallStrike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike with highest positive gamma exposure; falls back to strike with highest absolute gamma if no regime wall exists."
          },
          "putWallStrike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike with highest negative gamma exposure; falls back to strike with highest absolute gamma if no regime wall exists."
          },
          "strikes": {
            "type": "array",
            "description": "Per-strike gamma exposure breakdown.",
            "items": {
              "$ref": "#/components/schemas/GexStrikeRow"
            }
          },
          "disclaimer": {
            "type": "string",
            "description": "Educational modeling and positioning disclaimer."
          }
        },
        "required": [
          "symbol",
          "stockPrice",
          "regime",
          "netGex",
          "totalCallGex",
          "totalPutGex",
          "strikes",
          "disclaimer"
        ]
      },
      "GexHeatmapCell": {
        "type": "object",
        "description": "Individual 2D strike and expiration gamma exposure data point.",
        "properties": {
          "expiration": {
            "type": "string",
            "description": "Expiration date in YYYY-MM-DD format.",
            "format": "date"
          },
          "strike": {
            "type": "number",
            "description": "Strike price in USD."
          },
          "callGex": {
            "type": "number",
            "description": "Call option gamma exposure for the expiration/strike cell. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "putGex": {
            "type": "number",
            "description": "Put option gamma exposure for the expiration/strike cell. Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          },
          "netGex": {
            "type": "number",
            "description": "Net gamma exposure for the expiration/strike cell (callGex + putGex). Signed dealer gamma exposure as published by the upstream feed (calls positive, puts negative)."
          }
        },
        "required": [
          "expiration",
          "strike",
          "callGex",
          "putGex",
          "netGex"
        ]
      },
      "GexHeatmapResponse": {
        "type": "object",
        "description": "2D strike-by-expiration gamma exposure matrix.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "stockPrice": {
            "type": "number",
            "description": "Current stock spot price in USD."
          },
          "metric": {
            "type": "string",
            "description": "Gamma exposure metric: 'net', 'call', or 'put' (accepted for compatibility; echoed back with no effect on computation)."
          },
          "gammaFlip": {
            "type": [
              "number",
              "null"
            ],
            "description": "Zero-gamma flip price level in USD."
          },
          "callWallStrike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Major call wall strike price in USD."
          },
          "putWallStrike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Major put wall strike price in USD."
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of calculation.",
            "format": "date-time"
          },
          "expirations": {
            "type": "array",
            "description": "List of expiration dates included along Y-axis.",
            "items": {
              "type": "string"
            }
          },
          "cells": {
            "type": "array",
            "description": "2D matrix cells containing strike and expiration gamma values.",
            "items": {
              "$ref": "#/components/schemas/GexHeatmapCell"
            }
          },
          "truncated": {
            "type": "boolean",
            "description": "Indicates whether the 5,000-cell cap was hit; omitted when false."
          }
        },
        "required": [
          "symbol",
          "stockPrice",
          "metric",
          "expirations",
          "cells"
        ]
      },
      "FlowTradePrint": {
        "type": "object",
        "description": "Printed option trade record.",
        "properties": {
          "executedAt": {
            "type": "string",
            "description": "ISO 8601 UTC timestamp of trade print.",
            "format": "date-time"
          },
          "ticker": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "optionSymbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Standard OCC option symbol from the feed. When the feed has none it is built from the contract details, except for index underlyings (SPX, NDX, RUT, VIX and similar), whose weekly and PM-settled series use different roots; those stay null."
          },
          "optionType": {
            "type": "string",
            "description": "Option contract type ('call' or 'put')."
          },
          "strike": {
            "type": "number",
            "description": "Contract strike price in USD."
          },
          "expiration": {
            "type": "string",
            "description": "Expiration date in YYYY-MM-DD format.",
            "format": "date"
          },
          "dte": {
            "type": "integer",
            "description": "Days to expiration at time of trade execution."
          },
          "side": {
            "type": "string",
            "description": "Execution fill side relative to prevailing bid/ask ('ask', 'bid', 'mid', or 'unknown')."
          },
          "sentiment": {
            "type": "string",
            "description": "Rule-derived trade sentiment ('bullish', 'bearish', or 'neutral')."
          },
          "executionType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Execution routing structure ('sweep', 'block', 'split', or null)."
          },
          "premium": {
            "type": "number",
            "description": "Total traded order notional premium in USD."
          },
          "size": {
            "type": "integer",
            "description": "Number of option contracts traded."
          },
          "price": {
            "type": "number",
            "description": "Option execution price per share in USD."
          },
          "underlyingPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying spot price in USD at the time of the print, as reported by the feed. For index options without a feed price it is filled with the latest stored index price from the same New York session (approximate); otherwise null."
          },
          "otmPct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Percentage distance out-of-the-money relative to underlying spot price."
          },
          "volume": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Cumulative contract volume today at execution."
          },
          "openInterest": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Prior day settled open interest contracts."
          },
          "opening": {
            "type": "boolean",
            "description": "Boolean indicating trade is likely an opening position; true when size > open interest or day volume > open interest."
          },
          "delta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option delta sensitivity at trade execution."
          },
          "impliedVolatility": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied volatility percentage at trade execution (e.g. 25.31)."
          },
          "isETFOrIndex": {
            "type": "boolean",
            "description": "True if underlying instrument is an ETF or cash index."
          }
        },
        "required": [
          "executedAt",
          "ticker",
          "optionType",
          "strike",
          "expiration",
          "dte",
          "side",
          "sentiment",
          "premium",
          "size",
          "price",
          "opening",
          "isETFOrIndex"
        ]
      },
      "FlowResponse": {
        "type": "object",
        "description": "Options flow prints response.",
        "properties": {
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "Feed timestamp of the newest trade in the entire feed (flow.go:219-230)."
          },
          "retentionDays": {
            "type": "integer",
            "description": "Flow retention horizon in days (fixed at 7)."
          },
          "fromDate": {
            "type": "string",
            "description": "Window start date in YYYY-MM-DD format.",
            "format": "date"
          },
          "toDate": {
            "type": "string",
            "description": "Window end date in YYYY-MM-DD format.",
            "format": "date"
          },
          "count": {
            "type": "integer",
            "description": "Total matches in the window before limit, capped at 10,000."
          },
          "countCapped": {
            "type": "boolean",
            "description": "True when the total matches in the window reached 10,000."
          },
          "prints": {
            "type": "array",
            "description": "List of executed flow prints.",
            "items": {
              "$ref": "#/components/schemas/FlowTradePrint"
            }
          }
        },
        "required": [
          "retentionDays",
          "fromDate",
          "toDate",
          "count",
          "countCapped",
          "prints"
        ]
      },
      "NetFlowPoint": {
        "type": "object",
        "description": "1-minute net option premium flow bar.",
        "properties": {
          "t": {
            "type": "string",
            "description": "ISO 8601 UTC timestamp indicating the START of the 1-minute aggregation bucket."
          },
          "netCallPremium": {
            "type": "number",
            "description": "Cumulative net call premium in USD (call buy premium - call sell premium)."
          },
          "netPutPremium": {
            "type": "number",
            "description": "Cumulative net put premium in USD (put buy premium - put sell premium)."
          },
          "netVolume": {
            "type": "integer",
            "description": "Cumulative net option contract volume."
          }
        },
        "required": [
          "t",
          "netCallPremium",
          "netPutPremium",
          "netVolume"
        ]
      },
      "NetFlowSummary": {
        "type": "object",
        "description": "Aggregated summary of net option order flow across the query window.",
        "properties": {
          "volume": {
            "type": "integer",
            "description": "Total option contracts traded across the query window."
          },
          "ncp": {
            "type": "number",
            "description": "Net call premium total in USD."
          },
          "npp": {
            "type": "number",
            "description": "Net put premium total in USD."
          },
          "spot": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying equity spot price in USD."
          }
        },
        "required": [
          "volume",
          "ncp",
          "npp"
        ]
      },
      "NetFlowResponse": {
        "type": "object",
        "description": "1-minute grain cumulative net flow bars and session summary.",
        "properties": {
          "ticker": {
            "type": "string",
            "description": "Underlying equity ticker symbol."
          },
          "retentionDays": {
            "type": "integer",
            "description": "Flow retention horizon in days (7)."
          },
          "mode": {
            "type": "string",
            "description": "Accumulation mode ('cumulative')."
          },
          "points": {
            "type": "array",
            "description": "Time-series of 1-minute net flow bars.",
            "items": {
              "$ref": "#/components/schemas/NetFlowPoint"
            }
          },
          "summary": {
            "$ref": "#/components/schemas/NetFlowSummary",
            "description": "Window cumulative summary totals."
          }
        },
        "required": [
          "ticker",
          "retentionDays",
          "mode",
          "points",
          "summary"
        ]
      },
      "FilterResult": {
        "type": "object",
        "description": "Individual screened option contract candidate row matching multi-factor criteria.",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Underlying stock ticker symbol."
          },
          "type": {
            "type": "string",
            "description": "Option side ('call' or 'put').",
            "enum": [
              "call",
              "put"
            ]
          },
          "expiration": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contract expiration timestamp in ISO 8601 UTC format.",
            "format": "date-time"
          },
          "strike": {
            "type": "number",
            "description": "Contract strike price in USD."
          },
          "yieldPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": "Income yield percentage, counting only extrinsic value (the intrinsic part of an in-the-money premium is not income). Covered calls: (bid - max(0, spot - strike)) / spot * 100. Cash-secured puts: (bid - max(0, strike - spot)) / (strike - bid) * 100. Both floored at 0. Null when there is no bid (or bid <= 0) or no stock price, and for puts when strike - bid <= 0. Filters and sorts on this field use the same value."
          },
          "bidPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Best bid price per share in USD."
          },
          "volume": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Daily contract trading volume."
          },
          "openInterest": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Open interest contract count from prior settlement."
          },
          "delta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option contract delta Greek (signed: negative for puts [-1.0 to 0.0], positive for calls [0.0 to 1.0])."
          },
          "annualizedReturn": {
            "type": [
              "number",
              "null"
            ],
            "description": "Annualized percentage return: yieldPercent / dte * 365, with dte counted in days on the New York calendar. Null when yieldPercent is null, or the contract expires today or has expired (0 when the yield is 0). Filters and sorts on this field use the same value."
          },
          "lastUpdatedDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp when contract row was last refreshed.",
            "format": "date-time"
          },
          "optionKey": {
            "type": "string",
            "description": "Unique option OCC symbol key."
          },
          "probability": {
            "type": [
              "number",
              "null"
            ],
            "description": "Model-derived probability of expiring out of the money (OTM) (0.0 to 1.0, approximately 1 - |delta|)."
          },
          "yesterdayMark": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous trading day closing midpoint mark in USD."
          },
          "thirtyDayAverageVolume": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day moving average daily contract volume."
          },
          "thirtyDayAverageIV": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day moving average implied volatility fraction."
          },
          "thirtyDayAveragePremium": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day moving average notional contract premium in USD."
          },
          "premiumChange1dPct": {
            "type": [
              "number",
              "null"
            ],
            "description": "1-day percentage change in contract premium."
          },
          "volumeZScore30d": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day z-score of current volume relative to historical mean."
          },
          "openInterestZScore30d": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day z-score of current open interest relative to historical mean."
          },
          "volumeStdDev30d": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day standard deviation of volume."
          },
          "openInterestStdDev30d": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-day standard deviation of open interest."
          },
          "volumeHistorySamples30d": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Count of non-null historical volume samples in the 30-day rolling window."
          },
          "openInterestHistorySamples30d": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Count of non-null historical open interest samples in the 30-day window."
          },
          "contractScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "Composite attractiveness ranking score."
          },
          "premium": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total contract premium in USD (bidPrice * 100 per contract)."
          },
          "lastPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last trade execution price per share in USD."
          },
          "lastTradeDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 8601 UTC timestamp of last trade fill.",
            "format": "date-time"
          },
          "askPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Best ask price per share in USD."
          },
          "stockPrice": {
            "type": [
              "number",
              "null"
            ],
            "description": "Current underlying stock spot price in USD."
          },
          "impliedVolatility": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option implied volatility expressed as a percentage (e.g. 75.2 = 75.2%)."
          },
          "vega": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option vega Greek."
          },
          "gamma": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option gamma Greek."
          },
          "theta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option theta Greek (daily decay in USD)."
          },
          "earningsDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Next corporate earnings announcement date in ISO 8601 UTC format.",
            "format": "date-time"
          },
          "marketCap": {
            "type": [
              "number",
              "null"
            ],
            "description": "Company market capitalization in USD."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company industry classification."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company economic sector classification."
          },
          "peRatio": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to earnings ratio."
          },
          "rating": {
            "type": [
              "string",
              "null"
            ],
            "description": "Analyst consensus letter rating (e.g. 'A+', 'B', 'C')."
          },
          "consensus": {
            "type": [
              "string",
              "null"
            ],
            "description": "Analyst consensus recommendation (e.g. 'Buy', 'Hold', 'Strong Buy')."
          },
          "overallScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "Composite fundamental health score (1 to 5)."
          },
          "discountedCashFlowScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "DCF valuation score (1 to 5)."
          },
          "returnOnEquityScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "ROE financial score (1 to 5)."
          },
          "returnOnAssetsScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "ROA efficiency score (1 to 5)."
          },
          "debtToEquityScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "Debt leverage score (1 to 5)."
          },
          "priceToEarningsScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "P/E valuation score (1 to 5)."
          },
          "priceToBookScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "P/B valuation score (1 to 5)."
          },
          "rsi": {
            "type": [
              "number",
              "null"
            ],
            "description": "14-day Relative Strength Index (0 to 100)."
          },
          "stockIV": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying equity 30-day implied volatility percentage."
          },
          "ivr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying 52-week IV Rank (0 to 100)."
          },
          "lowestStockIV": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week lowest underlying IV percentage."
          },
          "highestStockIV": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week highest underlying IV percentage."
          },
          "lowestStockIVDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date of 52-week lowest IV in YYYY-MM-DD format.",
            "format": "date"
          },
          "highestStockIVDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date of 52-week highest IV in YYYY-MM-DD format.",
            "format": "date"
          },
          "fiftyTwoWeekLow": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week low equity price in USD."
          },
          "fiftyTwoWeekHigh": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week high equity price in USD."
          },
          "fiftyDayAverage": {
            "type": [
              "number",
              "null"
            ],
            "description": "50-day moving average stock price in USD."
          },
          "twoHundredDayAverage": {
            "type": [
              "number",
              "null"
            ],
            "description": "200-day moving average stock price in USD."
          },
          "dividendYield": {
            "type": [
              "number",
              "null"
            ],
            "description": "Annualized dividend yield percentage (e.g. 0.60 = 0.60%)."
          },
          "nextDividendDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Next projected or declared ex-dividend date in YYYY-MM-DD format.",
            "format": "date"
          },
          "nextDividendIsEstimated": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True if ex-dividend date is projected from historical cadence, false if declared by issuer."
          },
          "nextDividendPaymentDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Next dividend distribution payment date in YYYY-MM-DD format.",
            "format": "date"
          },
          "nextDividendAmount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Upcoming dividend distribution per share in USD."
          },
          "dividendFrequency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Dividend payout frequency ('Quarterly', 'Semi-Annual', 'Monthly', etc.)."
          },
          "logoUrl": {
            "type": "string",
            "description": "Company logo image URL."
          }
        },
        "required": [
          "symbol",
          "type",
          "strike",
          "optionKey",
          "logoUrl"
        ]
      },
      "ScreenResponse": {
        "type": "object",
        "description": "Paginated candidate contracts returned by the options screener.",
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching contracts (capped at 1,000; -1 if count timed out)."
          },
          "countCapped": {
            "type": "boolean",
            "description": "True if matching contracts reached the maximum count cap of 1,000 (indicating count is a lower-bound ceiling rather than the exact total count; use hasMore to check if subsequent pages exist)."
          },
          "hasMore": {
            "type": "boolean",
            "description": "True if additional candidate pages are available beyond the current page."
          },
          "results": {
            "type": "array",
            "description": "List of matching option contract results.",
            "items": {
              "$ref": "#/components/schemas/FilterResult"
            }
          }
        },
        "required": [
          "count",
          "countCapped",
          "hasMore",
          "results"
        ]
      },
      "FilterItem": {
        "type": "object",
        "description": "Individual filter or sorting predicate applied to candidate contracts.\n\n### Grammar & Rules\n- **Sort Directions**: Accepted values are `asc`, `desc`, `ascending`, `descending`. Nil or empty string defaults to `asc`. Default sort order when no sort filter is supplied is `option_key ASC` (or `expiration ASC, strike ASC, option_key ASC` when a single symbol is pinned). Supplying an explicit sort filter (e.g. `contractScore desc`) is recommended. Sortable fields include `lastUpdatedDate`.\n- **Value-less Operations**: Only `excludeEarnings`, `cleanupLiquidity`, `lastTradeToday`, and `lastTradeRecent` accept `false`, `\"false\"`, `\"off\"`, `\"no\"`, `\"0\"` (and numeric `0`) to disable them. Passing `false` to other operations like `strikeFilter` returns 400 `invalid_parameter`; `nextDividendIsEstimated` with `false` filters contracts where `is_estimated` is false; `premiumIncreasing` with `\"off\"` returns 400 `invalid_parameter`. NUL byte check skips value-less op values.\n- **Date Layouts & Keywords**: Accepted keywords are `today`, `tomorrow`, `yesterday`, and `now` on all date fields. Accepted date formats include ISO 8601 / RFC 3339, `YYYY-MM-DD`, `YYYY/MM/DD`, `MM/DD/YYYY`, and `YYYYMMDD`. Day offsets are limited to `±36500`.\n- **Integer Fields**: `volume`, `openInterest`, `volumeHistorySamples30d`, and `openInterestHistorySamples30d`. Whole int32 values bind exactly; other finite numbers are allowed.\n- **In/Exclude Operations**: `in` and `exclude` accept lists of strings, numbers, or nulls (null entries are dropped). They are rejected on computed fields, `expirationDays`, `nextDividendDays`, `dividendDays`, and the IsEstimated fields (`nextDividendIsEstimated`, `dividendIsEstimated`).\n- **String Matching**: `like` is case-sensitive except on `consensus` (which uses ILIKE). NUL bytes in any string value are rejected with 400 `invalid_parameter`.\n- **Special / Computed Fields**:\n  - `cushion`, `moneyness`, and `strikeFilter` comparison fields evaluate `strike OP stockPrice * (1 + value)` (fractional, not side-aware); as sort keys they are side-aware percentages. The put/call `strikeFilter` operation is recommended.\n  - `premium` filter compares the per-share bid price (`bidPrice`) when comparing against a constant value, whereas column-to-column comparisons and the `FilterResult.premium` response field use total contract premium (`bidPrice * 100`).\n  - `excludeEarnings`: Default contract mode drops contracts whose expiration falls within ±7 days of the company's earnings date; `\"symbol\"` mode drops underlyings reporting earnings within the next 7 days.\n  - `lastTradeRecent`: Filters contracts traded within the last 4 calendar days.\n  - `lastUpdatedDate`: Sort-only field; filtering on it returns 400 `invalid_parameter`.\n- **Column-to-Column Comparisons**: Right-hand side expressions may reference candidate contract and equity fields: `stockPrice`, `fiftyDayAverage`, `twoHundredDayAverage`, `fiftyTwoWeekLow`, `fiftyTwoWeekHigh`, `volumeZScore`, `volumeZScore30d`, `openInterestZScore`, `openInterestZScore30d`, `premium`, `thirtyDayAveragePremium`, `dividendYield`, `nextDividendDate`, `dividendDays`, `nextDividendDays`, `nextDividendAmount`, `dividendAmount`, `nextDividendPaymentDate`, `dividendPaymentDate`, `dividendFrequency`, `nextDividendIsEstimated`, `dividendIsEstimated`, `dividendDate`, and `exDividendDate`.\n- **Liquidity Default**: A default filter `openInterest > 10` is applied automatically unless the request filters on open interest or uses `cleanupLiquidity`.",
        "properties": {
          "field": {
            "type": "string",
            "description": "Field name or alias to evaluate. Grouped by field kind:\n- **Text**: `symbol`, `symbols`, `type`, `industry`, `sector`, `rating`, `consensus`, `dividendFrequency`\n- **Date**: `expiration`, `lastTradeDate`, `earningsDate`, `nextDividendDate`, `nextDividendPaymentDate`\n- **Numeric**: `strike`, `stockPrice`, `askPrice`, `bidPrice`, `yieldPercent`, `volume`, `openInterest`, `delta`, `gamma`, `theta`, `vega`, `annualizedReturn`, `probability`, `contractScore`, `premium`, `lastPrice`, `bidAskSpreadPct`, `bidAskSpreadAbs`, `marketCap`, `peRatio`, `rsi`, `stockIV`, `ivr`, `dividendYield`, `nextDividendAmount`, `expirationDays` (aliases: `dte`, `daysToExpiration`), `thirtyDayAverageVolume`, `volumeZScore30d`, `openInterestZScore30d`\n- **Boolean**: `nextDividendIsEstimated`, `premiumIncreasing`, `premiumIncreasing30d`\n- **Special / Computed**: `cushion`, `moneyness`, `strikeFilter`, `symbolType` ('stock' or 'etf'), `nextDividendDays`, `earnings` (operation excludeEarnings), `liquidity` (operation cleanupLiquidity), `put`/`call` (operation strikeFilter)",
            "enum": [
              "annualizedReturn",
              "askPrice",
              "bidAskSpread",
              "bidAskSpreadAbs",
              "bidAskSpreadDollar",
              "bidAskSpreadPct",
              "bidAskSpreadPercent",
              "bidPrice",
              "call",
              "consensus",
              "contractScore",
              "cushion",
              "daysToExpiration",
              "debtToEquityScore",
              "delta",
              "discountedCashFlowScore",
              "dividendFrequency",
              "dividendIsEstimated",
              "dividendYield",
              "dividendamount",
              "dividenddate",
              "dividenddays",
              "dividendpaymentdate",
              "dte",
              "earnings",
              "earningsDate",
              "exdividenddate",
              "expiration",
              "expirationDays",
              "expiration_days",
              "fiftyDayAverage",
              "fiftyTwoWeekHigh",
              "fiftyTwoWeekLow",
              "gamma",
              "highestStockIV",
              "impliedVolatility",
              "industry",
              "iv",
              "ivr",
              "lastPrice",
              "lastTradeDate",
              "lastUpdatedDate",
              "liquidity",
              "lowestStockIV",
              "markOneDayAgo",
              "marketCap",
              "moneyness",
              "nextDividendAmount",
              "nextDividendDate",
              "nextDividendDays",
              "nextDividendIsEstimated",
              "nextDividendPaymentDate",
              "openInterest",
              "openInterestHistorySamples30d",
              "openInterestStdDevDiff",
              "openInterestStdDevDiff30d",
              "openInterestZScore",
              "openInterestZScore30d",
              "overallScore",
              "peRatio",
              "premium",
              "premiumChange1dPct",
              "premiumIncreasing",
              "premiumIncreasing30d",
              "priceToBookScore",
              "priceToEarningsScore",
              "probability",
              "put",
              "rating",
              "returnOnAssetsScore",
              "returnOnEquityScore",
              "rsi",
              "sector",
              "spread",
              "spreadAbs",
              "spreadPct",
              "stockIV",
              "stockPrice",
              "stockType",
              "strike",
              "strikeFilter",
              "symbol",
              "symbolType",
              "symbols",
              "theta",
              "thirtyDayAverageIV",
              "thirtyDayAveragePremium",
              "thirtyDayAverageVolume",
              "twoHundredDayAverage",
              "type",
              "vega",
              "volume",
              "volumeHistorySamples30d",
              "volumeStdDevDiff",
              "volumeStdDevDiff30d",
              "volumeZScore",
              "volumeZScore30d",
              "yieldPercent"
            ]
          },
          "operation": {
            "type": "string",
            "description": "Comparison or filtering operation:\n- Comparison: `gt`, `gte`, `lt`, `lte`, `eq` (symbolic equivalents: `>`, `>=`, `<`, `<=`, `=`, `==`)\n- Substring text matching: `like` (text columns only)\n- Set membership: `in`, `exclude` (comma-separated string or array)\n- Specialized operations: `strikeFilter` (with factor on 'put'/'call'), `excludeEarnings` (on 'earnings': default/omitted value drops contracts expiring within ±7 days of the earnings date; with value \"symbol\" or \"ticker\" drops underlyings reporting earnings within the next 7 days), `cleanupLiquidity` (on 'liquidity'), `lastTradeToday`, `lastTradeRecent` (on 'lastTradeDate')\n- Ordering: `sort` (with value 'asc' or 'desc')",
            "enum": [
              "<",
              "<=",
              "=",
              "==",
              ">",
              ">=",
              "cleanupLiquidity",
              "eq",
              "exclude",
              "excludeEarnings",
              "gt",
              "gte",
              "in",
              "lastTradeRecent",
              "lastTradeToday",
              "like",
              "lt",
              "lte",
              "sort",
              "strikeFilter"
            ]
          },
          "value": {
            "description": "Filter comparison target value, threshold, date string, boolean, or array for in/exclude operations (numbers allowed in in/exclude lists).",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              },
              {
                "type": "array",
                "items": {
                  "type": [
                    "string",
                    "number",
                    "null"
                  ]
                }
              }
            ]
          }
        },
        "required": [
          "field",
          "operation"
        ]
      },
      "ScreenRequest": {
        "type": "object",
        "description": "Multi-criteria screener request payload.\n\nPaging precedence: body `perPage` > body `pageSize` > body `limit` > `?pageSize` > `?perPage` > `?limit`. Query parameters apply only when body paging values are <= 0. Body `page` <= 0 defaults to 1. Screening is not plan-clamped; results are silently capped at 100 contracts per page.\n\nStrict validation: Unknown top-level body keys return 400 `invalid_body` listing accepted keys (case-insensitive). Filter rejections return 400 `invalid_parameter` with message format `filter N (field \"f\", operation \"op\"): reason (and K more)` or `<aliasKey>: reason`.",
        "properties": {
          "filters": {
            "type": "array",
            "description": "List of filter and sort predicates (up to 50 filters).",
            "maxItems": 50,
            "items": {
              "$ref": "#/components/schemas/FilterItem"
            }
          },
          "page": {
            "type": "integer",
            "description": "Page number (1-based; values <= 0 default to 1)."
          },
          "pageSize": {
            "type": "integer",
            "description": "Results per page (defaults to 10; values <= 0 default to 10; values > 100 are capped silently to 100)."
          },
          "perPage": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Candidate contracts per page. Takes highest precedence among paging fields."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Candidate contracts per page. Evaluated after perPage and pageSize."
          },
          "symbols": {
            "description": "Top-level filter shorthand: comma-separated symbols string or array of symbols. Comma-delimited strings are trimmed and uppercased exactly like the array form (e.g. 'aapl, msft' ≡ ['AAPL', 'MSFT']). An empty array or blank string adds no symbol filter (all symbols).",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "symbol": {
            "type": "string",
            "description": "Top-level filter shorthand for single ticker symbol (ignored if 'symbols' is present)."
          },
          "type": {
            "type": "string",
            "enum": [
              "call",
              "put"
            ],
            "description": "Top-level filter shorthand for contract type."
          },
          "deltaMin": {
            "type": "number",
            "description": "Top-level shorthand for delta filter (signed: puts are negative [-1.0 to 0.0], calls are positive [0.0 to 1.0]). |delta| > 1 returns 400 invalid_parameter; deltaMin > deltaMax returns 400 invalid_range."
          },
          "deltaMax": {
            "type": "number",
            "description": "Top-level shorthand for delta filter (signed: puts are negative [-1.0 to 0.0], calls are positive [0.0 to 1.0]). |delta| > 1 returns 400 invalid_parameter; deltaMin > deltaMax returns 400 invalid_range."
          },
          "dteMin": {
            "type": "integer",
            "description": "Top-level shorthand for DTE >= dteMin. Inverted ranges (dteMin > dteMax) return 400 invalid_range."
          },
          "dteMax": {
            "type": "integer",
            "description": "Top-level shorthand for DTE <= dteMax. Inverted ranges (dteMin > dteMax) return 400 invalid_range."
          },
          "expirationDaysMin": {
            "type": "integer",
            "description": "Top-level shorthand for expirationDays >= expirationDaysMin. Inverted ranges return 400 invalid_range."
          },
          "expirationDaysMax": {
            "type": "integer",
            "description": "Top-level shorthand for expirationDays <= expirationDaysMax. Inverted ranges return 400 invalid_range."
          },
          "yieldPercentMin": {
            "type": "number",
            "description": "Top-level shorthand for yieldPercent >= yieldPercentMin."
          },
          "openInterestMin": {
            "type": "integer",
            "description": "Top-level shorthand for openInterest >= openInterestMin."
          },
          "volumeMin": {
            "type": "integer",
            "description": "Top-level shorthand for volume >= volumeMin."
          },
          "bidAskSpreadPctMax": {
            "type": "number",
            "description": "Top-level shorthand for bidAskSpreadPct <= bidAskSpreadPctMax."
          },
          "bidAskSpreadAbsMax": {
            "type": "number",
            "description": "Top-level shorthand for bidAskSpreadAbs <= bidAskSpreadAbsMax."
          }
        },
        "additionalProperties": false
      },
      "PublicAnnouncement": {
        "type": "object",
        "description": "Active public announcement broadcast.",
        "properties": {
          "text": {
            "type": "string",
            "example": "Scheduled maintenance on Sunday 02:00-04:00 UTC."
          },
          "level": {
            "type": "string",
            "enum": [
              "info",
              "warning",
              "critical"
            ],
            "example": "info"
          },
          "link": {
            "type": "string",
            "example": "https://status.wheelstrategyoptions.com"
          }
        },
        "required": [
          "text",
          "level"
        ]
      },
      "PublicAnnouncementResponse": {
        "type": "object",
        "properties": {
          "announcement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PublicAnnouncement"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "announcement"
        ]
      },
      "PublicPlansResponse": {
        "type": "object",
        "properties": {
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPlan"
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicEndpoint"
            }
          },
          "checkout_open": {
            "type": "boolean",
            "example": false
          },
          "billing_enabled": {
            "type": "boolean",
            "example": false
          },
          "trial": {
            "$ref": "#/components/schemas/TrialInfo"
          },
          "contact_url": {
            "type": "string",
            "example": "https://wheelstrategyoptions.com/contact"
          }
        },
        "required": [
          "plans",
          "endpoints",
          "checkout_open",
          "billing_enabled",
          "trial"
        ]
      },
      "TrialInfo": {
        "type": "object",
        "description": "Trial terms offered to new accounts.",
        "properties": {
          "days": {
            "type": "integer",
            "example": 14
          },
          "card_required": {
            "type": "boolean",
            "example": false
          }
        },
        "required": [
          "days",
          "card_required"
        ],
        "additionalProperties": false
      },
      "PromoInfo": {
        "type": "object",
        "description": "Promotional pricing available on the plan.",
        "properties": {
          "monthly_cents": {
            "type": "integer",
            "example": 4900
          },
          "months": {
            "type": "integer",
            "example": 3
          }
        },
        "required": [
          "monthly_cents",
          "months"
        ],
        "additionalProperties": false
      },
      "PublicPlan": {
        "type": "object",
        "description": "An active API plan as returned by GET /public/plans.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Plan identifier."
          },
          "display_name": {
            "type": "string",
            "description": "Human-readable plan name."
          },
          "rank": {
            "type": "integer",
            "description": "Plan rank (higher includes more); endpoint access compares an endpoint's minimum rank with this."
          },
          "price_monthly_cents": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Displayed monthly price in US cents, or null when no price is published."
          },
          "price_yearly_cents": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Displayed yearly price in US cents, or null when no yearly price is published."
          },
          "promo": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PromoInfo"
              },
              {
                "type": "null"
              }
            ],
            "description": "Promotional pricing available on the plan, present whenever promo terms are configured."
          },
          "requests_per_minute": {
            "type": "integer",
            "description": "Per-minute request limit."
          },
          "max_concurrency": {
            "type": "integer",
            "description": "Maximum concurrent in-flight requests."
          },
          "max_rows": {
            "type": "integer",
            "description": "Maximum rows per request on clamped endpoints."
          },
          "history_days": {
            "type": "integer",
            "description": "Maximum historical lookback in days on endpoints with date windows."
          }
        },
        "required": [
          "id",
          "display_name",
          "rank",
          "requests_per_minute",
          "max_concurrency",
          "max_rows",
          "history_days"
        ]
      },
      "PublicEndpoint": {
        "type": "object",
        "description": "An enabled metered endpoint as returned by GET /public/plans.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Endpoint identifier (matches the operationId)."
          },
          "method": {
            "type": "string",
            "description": "HTTP method."
          },
          "pattern": {
            "type": "string",
            "description": "Route pattern, e.g. /v1/chain/{symbol}."
          },
          "min_plan": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lowest plan id that can call the endpoint, or null when any account can."
          }
        },
        "required": [
          "id",
          "method",
          "pattern"
        ]
      },
      "UsageRequests": {
        "type": "object",
        "description": "Daily request counter and reset schedule.",
        "properties": {
          "today": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total requests counted towards usage today. Incremented for authenticated requests that reach endpoint handlers (including successful responses and downstream handler errors, but excluding early pipeline rejections such as 401 invalid key, 403 unentitled, and 429 rate limit/concurrency rejections). Resets daily at midnight America/New_York (ET), or null if unavailable."
          },
          "reset_at": {
            "type": "string",
            "description": "RFC3339 timestamp of next counter reset at 00:00 America/New_York.",
            "format": "date-time"
          },
          "reset_unix": {
            "type": "integer",
            "description": "Unix timestamp (seconds) of next counter reset."
          }
        },
        "required": [
          "reset_at",
          "reset_unix"
        ]
      }
    }
  }
}
