> ## 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.

# Constant-maturity vol

> ATM vol, 25- and 10-delta risk reversals and butterflies at fixed tenors from 7 days to 1 year, with static-arbitrage checks.

The vol desk's view of the surface: ATM, the 25- and 10-delta call and put
vols, risk reversals and butterflies at 7, 14, 30, 60, 90, 120, 180, 270 and
365 days. Fixed tenors compare cleanly across time and across coins, where
listed expiries roll.

Each expiry's ATM and wings are read off its quoted smile at Black-76
forward-delta strikes; each tenor interpolates total variance linearly in
time between the two fitted expiries around it. Nothing is extrapolated: a
tenor or a wing the quotes do not reach is null.

Every response also carries the static-arbitrage checks on each fitted
smile (`butterfly_free`, `calendar_free`, `min_density_g`) and a summary in
`arbitrage`. The full method is on
[Vol surface methodology](/concepts/vol-surface).

```json theme={null}
{
  "tenors": [
    { "tenor_days": 30, "atm_iv": 35.53, "iv_25c": 35.35, "iv_25p": 37.59,
      "iv_10c": 36.23, "iv_10p": 41.72, "rr_25": -2.24, "bf_25": 0.94,
      "rr_10": -5.49, "bf_10": 3.45, "bracket_dte": [26.15, 47.15] }
  ],
  "arbitrage": { "butterfly_free": true, "calendar_free": true, "violations": [] }
}
```

Vols in percent. `rr` is call minus put, so it is negative when puts are
bid; [`/v2/options/iv/skew`](/api/v2/options/iv/skew) reports put minus call.
Current values only, refreshed with the surface about every 30 seconds.

## See also

<CardGroup cols={2}>
  <Card title="Vol surface methodology" href="/concepts/vol-surface" icon="book" />

  <Card title="Single-expiry smile" href="/api/v2/options/iv/smile" icon="chart-line" />
</CardGroup>


## OpenAPI

````yaml GET /options/iv/constant-maturity
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:
  /options/iv/constant-maturity:
    get:
      tags:
        - Options
      summary: 'Constant-maturity vol: ATM, risk reversals, butterflies'
      description: >-
        ATM vol and the 25- and 10-delta wings at fixed tenors (7, 14, 30, 60,
        90, 120, 180, 270 and 365 days), from the expiries whose smile fitted on
        the surface, including the long-dated ones past its grid. Per expiry,
        ATM is the vol at the forward and each wing the vol at the strike of
        that delta (Black-76 forward deltas; a put's delta is read on the
        call-equivalent axis, so the 25-delta put sits at call delta 0.75), read
        off the expiry's quoted smile with total variance linear in
        log-moneyness between neighbouring quotes. Each point's total variance
        is then interpolated linearly in time between the two expiries that
        bracket the tenor. No extrapolation: a tenor outside the fitted
        expiries, or a wing beyond the quoted strikes, is null.


        Conventions, all in vol points: `rr_25` = 25-delta call vol minus
        25-delta put vol (negative when puts are bid), `bf_25` = their average
        minus ATM; the same for 10-delta. Note `/v2/options/iv/skew` reports put
        minus call.


        `expiries` gives the same numbers at each fitted expiry's own maturity
        with its quote count `n_quotes` and static-arbitrage checks;
        `bracket_dte` names the expiries each tenor sits between. `arbitrage`
        summarises the checks over every fitted smile: `butterfly_free`
        (Durrleman's density condition g(k) >= 0 across each expiry's quoted
        strikes), `calendar_free` (total variance does not fall from one fitted
        expiry to the next across their common strikes) and any `violations`.
        Current values, refreshed with the surface every 30 seconds.
      operationId: get_iv_constant_maturity_options_iv_constant_maturity_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: 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.