---
title: "Key levels (classified nodes) for one or more symbols"
method: GET
path: "/v1/gex/levels"
tags: ["Heatmap"]
---

# Key levels (classified nodes) for one or more symbols

`GET /v1/gex/levels`

## Request

- Base URL: `https://api.skylit.ai`
- URL: `https://api.skylit.ai/v1/gex/levels`
- Auth: HTTP bearer

The strikes Skylit classifies as nodes (king, gatekeeper, pika, barney,
significant) for up to 10 symbols, strongest first, with each level's
distance from spot. Same live source, filters and 5-second cache as
`/v1/heatmap`; 1 credit per request.

Each symbol also carries `summary`: total net exposure, the strongest
positive and negative strikes (the walls), and the flip level where
cumulative net exposure changes sign. It is computed from the strikes
this request returned, so widen `maxStrikes` for a wider view.

A call that cannot finish within 20 seconds answers `504`
`gateway_timeout` (refunded); retry, or request fewer symbols.

## Query parameters

- `symbols` string, required
- `metric` 'gamma' | 'vanna'
- `maxStrikes` union
  - integer
  - 'all'
- `maxExpirations` union
  - integer
  - 'all'
- `includeEmpty` boolean
- `expirations` string

## Response `200`

Levels per symbol.

- object
  - `data` object
    - `symbols` object[]
      - `asOf` string, date-time
      - `kingNode` Level
        - `distancePct` number, required: Percent distance from spot (negative = below).
        - `nodeType` 'king' | 'gatekeeper' | 'pika' | 'barney' | 'significant', required
        - `strike` number, required
        - `value` number, required: Net exposure at this strike for the selected metric.
      - `levels` Level[]
        - `distancePct` number, required: Percent distance from spot (negative = below).
        - `nodeType` 'king' | 'gatekeeper' | 'pika' | 'barney' | 'significant', required
        - `strike` number, required
        - `value` number, required: Net exposure at this strike for the selected metric.
      - `previousClose` number
      - `spot` number
      - `summary` LevelsSummary: Digest of the returned strikes for the selected `metric`. Covers only the strikes between `lowStrike` and `highStrike` (set by `maxStrikes`, `maxExpirations` and `expirations`), never the whole chain.
        - `flip` union, required: Where the running sum of `value`, from the lowest returned strike upward, changes sign (linear interpolation between the bracketing strikes; the crossing nearest spot when there are several). Null when the running sum never changes sign within the window.
          - object
            - `distancePct` number, required: Percent distance from spot (negative = below).
            - `level` number, required
          - unknown
        - `highStrike` number, required: Highest returned strike.
        - `lowStrike` number, required: Lowest returned strike.
        - `negativeWall` union, required: The strike with the most negative value, or null when none is negative.
          - Level
            - `distancePct` number, required: Percent distance from spot (negative = below).
            - `nodeType` 'king' | 'gatekeeper' | 'pika' | 'barney' | 'significant', required
            - `strike` number, required
            - `value` number, required: Net exposure at this strike for the selected metric.
          - unknown
        - `netExposure` number, required: Sum of `value` over the returned strikes.
        - `positiveWall` union, required: The strike with the largest positive value, or null when none is positive.
          - Level
            - `distancePct` number, required: Percent distance from spot (negative = below).
            - `nodeType` 'king' | 'gatekeeper' | 'pika' | 'barney' | 'significant', required
            - `strike` number, required
            - `value` number, required: Net exposure at this strike for the selected metric.
          - unknown
      - `symbol` string
  - `meta` Meta
    - `attribution` Attribution: Whether and how this response's data may be published. See `/legal/api#sharing`. An Agent or MCP client should never publish data where `shareable` is false, regardless of `shareClass`. `required`, `license`, `shareable` and `shareClass` are always sent on `/v1/options/*` and absent from the short form.
      - `license` 'personal' | 'commercial' | 'connected_app'
      - `required` boolean
      - `shareClass` 'derived' | 'derived_levels_only' | 'raw': "raw" (e.g. option quotes, greeks) must never be auto-published.
      - `shareable` boolean
      - `terms` string, uri
      - `text` string, required
      - `url` string, uri, required
    - `cached` boolean, required: True if served from the in-process cache.
    - `delayMinutes` integer: The delay applied when `delayed` is true.
    - `delayed` boolean: True when your plan's data is delayed and this latest-data request was served as of `delayMinutes` ago (mode is then `historical`). Absent on real-time plans.
    - `metric` 'gamma' | 'vanna', required
    - `mode` 'live' | 'historical', required
    - `resolution` '1s' | '1m', required: Time resolution of the data served: "1s" when every symbol came from 1-second data, "1m" when any came from minute-resolution history.

## Other responses

- `400`: Request validation failed.
- `401`: Missing API key (`unauthorized`), sent by the gateway.
- `402`: Out of credits (`insufficient_credits`).
- `403`: Unknown, revoked or expired key (`forbidden`, from the gateway), or an admin-suspended account (`account_suspended`).
- `404`: Unknown symbol, no data available, or none of the requested `expirations` exist for the symbol (`code: expiration_not_found`).
- `429`: Per-minute rate limit exceeded.
- `503`: Heatmap data is temporarily unavailable.
- `504`: The request did not finish in time (`gateway_timeout`). Refunded; retry, or narrow the request.

---

[API](https://skmtc.dev/skylit/apis/skylit-public-api.md) · [All operations](https://skmtc.dev/skylit/apis/skylit-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skylit/apis/skylit-public-api/revisions/890b0ea4e6f5?raw)
