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

`GET https://api.skylit.ai/v1/gex/levels`

API: Heatseeker. Credits: 1.

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.

## Authentication

Send your Skylit API key as a bearer token: `Authorization: Bearer <key>`. No other header is accepted.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `symbols` | query | string | yes | One ticker, or a comma-separated list for a single cross-asset call (e.g. `SPY` or `SPY,SPX,QQQ`). Each is returned as an element of `data.symbols`. |
| `metric` | query | string | no | Which Greek exposure to return per strike. (one of `gamma`, `vanna`; default `gamma`) |
| `maxStrikes` | query | integer | no | Maximum number of strikes around spot to return. (default `92`; min 1; max 400) |
| `maxExpirations` | query | integer | no | How many of the nearest expirations to net into each strike's `value`. Ignored when `expirations` is set. (default `5`; min 1; max 60) |
| `expirations` | query | string | no | Net each strike over exactly these expirations (`YYYY-MM-DD`, comma-separated) — one for a single-expiration heatmap (`2026-05-22`) or several for a custom set (`2026-05-22,2026-06-19`). Supersedes `maxExpirations`, and reaches any expiration the snapshot has, not just the nearest ones. Requested dates the symbol does not have are ignored; the `expirations` array in the response lists what was actually used. If none of them match, the response is `404` with `code: expiration_not_found` and the available dates in the message. On `/v1/heatmap`, expirations that have already expired are not available (they are trimmed from the live snapshot) — replay them with `/v1/historical` instead. |

## Example request

```bash
curl "https://api.skylit.ai/v1/gex/levels?symbols=SPY,SPX,QQQ" \
  -H "Authorization: Bearer $SKYLIT_API_KEY"
```

## Responses

### 200

Levels per symbol.

Shape (placeholder values):

```json
{
  "data": {
    "symbols": [
      {
        "symbol": "string",
        "asOf": "string",
        "spot": 0,
        "previousClose": 0,
        "kingNode": {
          "strike": 0,
          "value": 0,
          "nodeType": "king",
          "distancePct": 0
        },
        "levels": [
          {
            "strike": 0,
            "value": 0,
            "nodeType": "king",
            "distancePct": 0
          }
        ]
      }
    ]
  },
  "meta": {
    "metric": "gamma",
    "resolution": "1m",
    "mode": "live",
    "cached": false
  }
}
```

### 400

Request validation failed.

### 401

Missing or invalid API key.

### 402

Out of credits (`insufficient_credits`).

### 404

Unknown symbol, no data available, or none of the requested
`expirations` exist for the symbol (`code: expiration_not_found`).
