> ## Documentation Index
> Fetch the complete documentation index at: https://docs.backquant.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Strike ladder

> Dealer exposure by strike and expiry for every greek, and the dealer position in contracts.

The grid behind the terminal's HEATMAP: one metric per call (`gex`, `dex`,
`vanna`, `charm`, `vega`, `oi` or `pos`), with a row per strike and a column
per expiry, plus each strike's total over every expiry in scope.

`pos` is the dealer position itself, in contracts: where dealers are longest
and shortest, by strike and by expiry. With `positioning=flow` (the default
for BTC and ETH) it is measured from the tape; see
[How flow is measured](/concepts/positioning#how-flow-is-measured).

```bash theme={null}
curl -H "X-API-Key: $KEY" \
  "https://api.backquant.com/v2/gex/ladder?symbol=BTCUSDT&metric=pos&expiry=week"
```

`expiry` takes `all`, `0dte`, `front`, `week`, `month`, ISO dates or tokens
such as `30OCT26`. Every expiry in the response carries both forms.

## See also

<CardGroup cols={2}>
  <Card title="Dealer positioning" href="/concepts/positioning" icon="bookmark" />

  <Card title="Strike profile" href="/api/v2/gex/strike-profile" icon="chart-column" />
</CardGroup>


## OpenAPI

````yaml GET /gex/ladder
openapi: 3.1.0
info:
  title: BackQuant API v2
  description: >-

    # BackQuant API v2


    Options + gamma-exposure focused public API. Built on the same data the

    BackQuant Pro Terminal renders - pre-computed every 30s, served from cache.


    ## What's in v2


    * **Discovery**: `/v2/symbols` (universe + per-symbol freshness + supported
      endpoint list), `/v2/expiries` (active expiry tokens with DTE), `/v2/status`
      (per-symbol-per-category health with thresholds + overall classification).
    * **GEX**: composable levels (HVL / call wall / put support / max-pain /
      expected move / gamma-flip zones), strike profile with typed expiry
      filter, expiry profile, strike × expiry heatmap with downsampling,
      greek time-heatmap with DTE/OI/IV filters, history (cursor-paginated),
      Postgres-backed stress history, **per-expiry max-pain with pain curve**.
    * **Options**: filtered options chain with two-layer projection (top-level
      `?fields=` and per-contract `?include=oi,iv,greeks,bid_ask,volume,gex`)
      plus moneyness filter (`?moneyness_min=0.9&moneyness_max=1.1`), expiry
      summary table, full IV suite (surface / term structure / 25Δ-10Δ skew /
      curves / **single-expiry smile** / IV-RV history / VRP), expected move,
      **Breeden-Litzenberger probability density and surface**, typed greek
      profiles (delta / theta / vanna / charm / vega), strike × time charm/vega
      surfaces, strike × expiry 3D greek surface, OI by expiry + history,
      put/call ratio (intraday or daily), 0DTE & weekly premium tide,
      dated-futures term structure.
    * **Liquidation**: heatmap + leverage-tiered distribution.

    * **Multi**: `/v2/multi/gex/levels` - bundled multi-symbol read across the
      universe in one round-trip, with the same `?include=` model as the
      single-symbol endpoint.

    ## Authentication


    Every v2 route (except `/v2/openapi.json`, `/v2/docs`, `/v2/redoc`, and

    `/v2/health`) requires the `X-API-Key` header.


    ```

    X-API-Key: bq_live_your_api_key_here

    ```


    **Get your API key at
    [backquant.com/api-access](https://backquant.com/api-access).**


    The same key works across v1 and v2 - if you already have a v1 key, no

    re-issuance is needed.


    ## Rate limits


    Two budgets, both derived from your subscription tier: a **monthly request

    allowance** per account, and a **per-minute burst** per key. Size your

    integration against the monthly figure - sustained polling at the burst rate

    exhausts the month early.


    | Plan                      | Monthly allowance | Burst    | Sustained   |

    |---------------------------|-------------------|----------|-------------|

    | Starter (Terminal Yearly) | 10,000 req/month  | 10/min   | ~333/day    |

    | Standard (Crypto API)     | 250,000 req/month | 60/min   | ~8,300/day  |

    | Pro (Terminal + API)      | 1,000,000/month   | 120/min  | ~33,000/day |

    | Enterprise                | custom            | 600/min  | custom      |


    Headers `X-RateLimit-Limit / -Remaining / -Reset` (burst) and

    `X-Quota-Limit / -Used / -Remaining / -Period` (monthly) are included in

    every response; the rate-limit triple is echoed inside `meta.rate_limit`

    when populated by middleware. Exceeding either budget returns `429`.


    The live ladder is served at `GET /v2/meta` under `rate_limits`.


    ## Response envelope


    ```json

    {
      "success": true,
      "data": { ... },
      "meta": {
        "version": "2.0",
        "timestamp": "2026-04-29T12:00:00.000Z",
        "request_id": "req_…",
        "symbol": "BTCUSDT",
        "spot_price": 67213.5,
        "computed_at": "2026-04-29T11:59:48.000Z",
        "freshness_seconds": 12.0,
        "source": ["deribit","bybit","okx","binance","derive","thalex","delta_india","delta","bullish","paradex"],
        "exchanges_filtered": ["deribit","bybit"]
      }
    }

    ```


    ## Errors


    ```json

    {
      "success": false,
      "error": {
        "code": "NOT_FOUND",
        "message": "No data for BTCUSDT"
      },
      "meta": { "version": "2.0", "timestamp": "..." }
    }

    ```


    | Code                  | When |

    |-----------------------|------|

    | `UNAUTHORIZED`        | Missing or invalid API key |

    | `FORBIDDEN`           | Subscription doesn't allow API access |

    | `NOT_FOUND`           | Symbol/expiry/etc. not present in cache |

    | `VALIDATION_ERROR`    | Bad query parameters |

    | `RATE_LIMIT_EXCEEDED` | Per-tier limit hit |

    | `UPSTREAM_ERROR`      | Cache or DB temporarily unreachable |

    | `INTERNAL_ERROR`      | Anything else |
        
  version: '2.13'
servers: []
security: []
tags:
  - name: Meta
    description: Unauthenticated metadata + endpoint catalog (planning your integration)
  - name: Discovery
    description: Symbol catalog, active expiries, and service status
  - name: GEX
    description: Gamma exposure analytics
  - name: Options
    description: Options chain, IV, greeks, probability, premium tide
  - name: Liquidation
    description: Liquidation heatmap and distribution
  - name: Multi
    description: Bundled multi-symbol endpoints (single round-trip across the universe)
  - name: COT
    description: >-
      CFTC Commitments of Traders: futures positioning by trader category
      (public CFTC data)
  - name: Filings
    description: >-
      SEC Form 4 insider trades and 13F holders for MSTR, COIN, HOOD and IBIT
      (public SEC data)
paths:
  /gex/ladder:
    get:
      tags:
        - GEX
      summary: 'Strike ladder: dealer exposure by strike x expiry'
      description: >-
        Dealer exposure per strike and per expiry for one metric, the grid
        behind the terminal's HEATMAP. Every value is dealer position x greek
        per contract, summed per (strike, expiry):


        * `gex` - $ of delta dealers must trade per 1% move

        * `dex` - $ delta

        * `vanna` - $ of delta per +1 vol point

        * `charm` - $ of delta per day of time passing

        * `vega` - $ per +1 vol point

        * `oi` - open interest in contracts (unsigned)

        * `pos` - the dealer position itself, in contracts


        `cells` has one row per strike in `strikes` and one column per expiry in
        `expiries` (the nearest `expiries`, default 8). `total` is each strike
        summed over every expiry in scope, including those beyond the columns,
        and `top` / `king` rank strikes by it. For `gex`, `levels` carries the
        gamma flip and walls by the same rule as /v2/gex/levels.


        **Positioning (default: flow).** `flow` uses BackQuant's measured dealer
        position (BTC and ETH); `std` the textbook convention (call:+OI,
        put:-OI). See `meta.extra.positioning`; `oi` is unsigned.


        `expiry` scopes which expiries count: `all`, `0dte`, `front`, `week` (7
        days), `month` (31 days), or a comma list of ISO dates or tokens like
        `30OCT26`. `span` keeps strikes within spot x (1 +/- span); `group`
        merges strikes into buckets about that many strike steps wide. Every
        venue in the chain is included.
      operationId: get_gex_ladder_gex_ladder_get
      parameters:
        - name: symbol
          in: query
          required: false
          schema:
            enum:
              - BTCUSDT
              - ETHUSDT
              - SOLUSDT
              - HYPEUSDT
            type: string
            description: 'Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.'
            default: BTCUSDT
            title: Symbol
          description: 'Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.'
        - name: metric
          in: query
          required: false
          schema:
            enum:
              - gex
              - dex
              - vanna
              - charm
              - vega
              - oi
              - pos
            type: string
            description: 'Which exposure: gex, dex, vanna, charm, vega, oi or pos.'
            default: gex
            title: Metric
          description: 'Which exposure: gex, dex, vanna, charm, vega, oi or pos.'
        - name: positioning
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Dealer positioning model. **`flow`** (default) is BackQuant's
              measured dealer model, available for BTC/ETH; it falls back to
              `std` when it cannot be produced for a symbol. **`std`** is the
              textbook convention (call:+OI / put:-OI). The response reports
              which model actually ran in `meta.extra.positioning`.
            default: flow
            title: Positioning
          description: >-
            Dealer positioning model. **`flow`** (default) is BackQuant's
            measured dealer model, available for BTC/ETH; it falls back to `std`
            when it cannot be produced for a symbol. **`std`** is the textbook
            convention (call:+OI / put:-OI). The response reports which model
            actually ran in `meta.extra.positioning`.
        - name: expiry
          in: query
          required: false
          schema:
            type: string
            maxLength: 400
            description: >-
              all, 0dte, front, week, month, or a comma list of ISO dates /
              tokens (30OCT26).
            default: all
            title: Expiry
          description: >-
            all, 0dte, front, week, month, or a comma list of ISO dates / tokens
            (30OCT26).
        - name: expiries
          in: query
          required: false
          schema:
            type: integer
            maximum: 24
            minimum: 0
            description: How many of the nearest expiries get their own column.
            default: 8
            title: Expiries
          description: How many of the nearest expiries get their own column.
        - name: span
          in: query
          required: false
          schema:
            anyOf:
              - type: number
                maximum: 0.5
                minimum: 0.005
              - type: 'null'
            description: Strikes within spot x (1 +/- span). Default 0.12.
            title: Span
          description: Strikes within spot x (1 +/- span). Default 0.12.
        - name: group
          in: query
          required: false
          schema:
            type: integer
            maximum: 20
            minimum: 1
            description: Merge strikes into buckets about this many strike steps wide.
            default: 1
            title: Group
          description: Merge strikes into buckets about this many strike steps wide.
        - name: X-API-Key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: X-Api-Key
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '401':
          description: Invalid or missing API key
          content:
            application/json:
              example:
                success: false
                error:
                  code: UNAUTHORIZED
                  message: Invalid API key
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '404':
          description: No data available for the requested resource
          content:
            application/json:
              example:
                success: false
                error:
                  code: NOT_FOUND
                  message: No data for BTCUSDT
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '422':
          description: Validation error on query parameters
          content:
            application/json:
              example:
                success: false
                error:
                  code: VALIDATION_ERROR
                  message: Invalid request parameters
                  details:
                    errors: []
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              example:
                success: false
                error:
                  code: RATE_LIMIT_EXCEEDED
                  message: Rate limit exceeded. Try again later.
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
      security:
        - ApiKeyAuth: []
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your BackQuant API key (same key as v1)

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.