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

# Implied volatility

> Continuous constant-maturity implied volatility for one tenor, delta and option type. Each point is interpolated in total variance between the two listed expiries that bracket the tenor, so the series never jumps on an expiry roll. Values are decimal (0.37 = 37 vol points).

**History window.** How far back you can read depends on your billing plan: 1 month on monthly billing, 1 year on quarterly, 3 years on annual. A `start` earlier than your window (or no `start` at all) is moved forward to the window start, and the `Sandmark-Data-Window-Start` response header says where it began. An `end` before the window start returns `403`.

> [!TIP]
>
> New to the series? [Continuous implied volatility](https://docs.sandmark.com/concepts/implied-volatility.md) explains what one point
> means and how it is built.


## OpenAPI

````yaml GET /v1/timeseries/iv
openapi: 3.0.3
info:
  title: Sandmark Volatility API
  version: 1.0.0
  description: >-
    Continuous implied and realised volatility for crypto options, with the
    reference data to query it.
  contact:
    name: Sandmark
    url: https://sandmark.com
servers:
  - url: https://api.sandmark.com/volatility
    description: Production
security:
  - apiKey: []
tags:
  - name: Reference
    description: Assets, frequencies and expiries.
  - name: Timeseries
    description: Continuous IV and RV series.
paths:
  /v1/timeseries/iv:
    get:
      tags:
        - Timeseries
      summary: Implied volatility
      description: >-
        Continuous constant-maturity implied volatility for one tenor, delta and
        option type. Each point is interpolated in total variance between the
        two listed expiries that bracket the tenor, so the series never jumps on
        an expiry roll. Values are decimal (0.37 = 37 vol points).


        **History window.** How far back you can read depends on your billing
        plan: 1 month on monthly billing, 1 year on quarterly, 3 years on
        annual. A `start` earlier than your window (or no `start` at all) is
        moved forward to the window start, and the `Sandmark-Data-Window-Start`
        response header says where it began. An `end` before the window start
        returns `403`.
      operationId: getImpliedVolTimeseries
      parameters:
        - name: asset
          in: query
          required: true
          schema:
            type: string
            enum:
              - DER.BTC_USD
              - DER.ETH_USD
              - DER.BTC_USDC
              - DER.ETH_USDC
              - DER.SOL_USDC
              - DER.XRP_USDC
              - DER.AVAX_USDC
              - DER.TRX_USDC
              - DER.HYPE_USDC
              - OKX.BTC_USD
              - OKX.ETH_USD
              - BIN.BTC_USDT
              - BIN.ETH_USDT
              - BYB.BTC_USDT
              - BYB.ETH_USDT
          description: >-
            Underlying identifier, `VENUE.BASE_QUOTE`. `DER` is Deribit; `OKX`,
            `BIN` (Binance) and `BYB` (Bybit) are the other venues.
            `DER.BTC_USD` and `DER.ETH_USD` are the inverse contracts and carry
            the deepest history; the `_USDC` underlyings are linear.
          example: DER.BTC_USD
        - name: frequency
          in: query
          required: true
          schema:
            type: string
            enum:
              - 1h
          description: >-
            Sampling frequency of the stored series. `GET /v1/frequencies` lists
            the available values.
          example: 1h
        - name: option_type
          in: query
          required: true
          schema:
            type: string
            enum:
              - C
              - P
          description: >-
            `C` for calls, `P` for puts. At 50 delta both legs carry the same
            IV.
          example: C
        - name: tenor_label
          in: query
          required: true
          schema:
            type: string
            enum:
              - 1d
              - 1w
              - 2w
              - 1m
              - 2m
              - 3m
              - 6m
              - 9m
              - 1y
          description: >-
            Constant-maturity tenor: `1d`, `1w`, `2w`, `1m`, `2m`, `3m`, `6m`,
            `9m` or `1y`.
          example: 1m
        - name: delta_target_pct
          in: query
          required: true
          schema:
            type: integer
            enum:
              - 5
              - 10
              - 15
              - 20
              - 25
              - 30
              - 35
              - 40
              - 45
              - 50
          description: >-
            Absolute delta in percent. `50` is at-the-money; `25` with `P` is
            the 25-delta put.
          example: 50
        - name: start
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: >-
            Inclusive lower bound, ISO 8601 UTC (for example
            `2026-11-01T00:00:00Z`). Defaults to the start of your history
            window.
          example: '2026-10-20T00:00:00Z'
        - name: end
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: >-
            Inclusive upper bound, ISO 8601 UTC. Defaults to the latest stored
            observation.
          example: '2026-11-01T00:00:00Z'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 5000
            default: 500
          description: >-
            Maximum rows to return. Rows are ordered **newest first**, so
            `limit` keeps the most recent observations inside `start`..`end`.
            Page backwards by moving `end`.
        - name: iv_source_col
          in: query
          required: false
          schema:
            type: string
            enum:
              - IV_MARK
              - IV_MARK_COMPUTED
            default: IV_MARK
          description: >-
            Which published vol surface to read. `IV_MARK` is the default and
            the surface used across Sandmark. `IV_MARK_COMPUTED` is the
            alternative surface; the two differ by about 0.08 vol points on
            average. Keep one value for a whole analysis.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IvSeriesResponse'
              example:
                series: iv
                row_count: 2
                data:
                  - UNDERLYING_ID: DER.BTC_USD
                    DATETIME: '2026-11-06T22:00:00Z'
                    OPTION_TYPE: C
                    FREQUENCY: 1h
                    TENOR_LABEL: 1m
                    TENOR_DAYS: 30
                    DELTA_TARGET: 0.5
                    DELTA_TARGET_PCT: 50
                    DTE: 30
                    DELTA: 0.5036
                    IV: 0.3732
                    IV_LO: 0.3688
                    IV_HI: 0.3767
                    DTE_LO: 20.42
                    DTE_HI: 48.42
                    ATM_DIST: 0.0036
                    METHODOLOGY: total_variance_interp
                    METHOD: iv_C_50_delta_30d
                    METRIC_FAMILY: continuous_iv
                    IV_SOURCE_COL: IV_MARK
                    LOAD_TS: '2026-11-06T22:25:28'
                  - UNDERLYING_ID: DER.BTC_USD
                    DATETIME: '2026-11-06T21:00:00Z'
                    OPTION_TYPE: C
                    FREQUENCY: 1h
                    TENOR_LABEL: 1m
                    TENOR_DAYS: 30
                    DELTA_TARGET: 0.5
                    DELTA_TARGET_PCT: 50
                    DTE: 30
                    DELTA: 0.5021
                    IV: 0.3719
                    IV_LO: 0.3671
                    IV_HI: 0.3758
                    DTE_LO: 20.46
                    DTE_HI: 48.46
                    ATM_DIST: 0.0021
                    METHODOLOGY: total_variance_interp
                    METHOD: iv_C_50_delta_30d
                    METRIC_FAMILY: continuous_iv
                    IV_SOURCE_COL: IV_MARK
                    LOAD_TS: '2026-11-06T21:25:31'
          headers:
            Sandmark-Data-Window-Start:
              description: >-
                Earliest timestamp your plan can read, ISO 8601 UTC. Use it to
                tell a clamped `start` from a real gap in the data.
              schema:
                type: string
                format: date-time
        '400':
          description: '`start` or `end` is not a valid ISO 8601 timestamp.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                statusCode: 400
                message: >-
                  start must be an ISO 8601 timestamp such as
                  2026-11-01T00:00:00Z; got 'yesterday'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                statusCode: 401
                message: >-
                  Access denied due to missing subscription key. Make sure to
                  include subscription key when making requests to an API.
        '403':
          description: '`end` falls before the start of your data window.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                statusCode: 403
                message: >-
                  end is before your data window, which starts at
                  2026-10-07T23:00:00Z
        '422':
          description: A parameter failed validation. `detail` names the field.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '429':
          description: >-
            Rate limit exceeded. Retry after the number of seconds in
            `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                statusCode: 429
                message: Rate limit is exceeded. Try again in 12 seconds.
components:
  schemas:
    IvSeriesResponse:
      type: object
      required:
        - series
        - row_count
        - data
      properties:
        series:
          type: string
          enum:
            - iv
        row_count:
          type: integer
          description: Number of rows in `data`.
        data:
          type: array
          items:
            $ref: '#/components/schemas/IvRow'
          description: Newest first.
    Error:
      type: object
      properties:
        statusCode:
          type: integer
          example: 403
        message:
          type: string
      required:
        - statusCode
        - message
    ValidationError:
      type: object
      properties:
        detail:
          type: array
          items:
            type: object
            properties:
              loc:
                type: array
                items:
                  type: string
              msg:
                type: string
              type:
                type: string
    IvRow:
      type: object
      properties:
        UNDERLYING_ID:
          type: string
          example: DER.BTC_USD
        DATETIME:
          type: string
          format: date-time
          description: Bar close, UTC.
        OPTION_TYPE:
          type: string
          enum:
            - C
            - P
        FREQUENCY:
          type: string
          example: 1h
        TENOR_LABEL:
          type: string
          example: 1m
        TENOR_DAYS:
          type: number
          description: Constant-maturity tenor in days.
        DELTA_TARGET_PCT:
          type: integer
          example: 25
        DELTA_TARGET:
          type: number
          example: 0.25
        DELTA:
          type: number
          description: Delta actually achieved by the interpolated point.
        DTE:
          type: number
          description: Days to expiry of the constant-maturity point (equals `TENOR_DAYS`).
        IV:
          type: number
          description: Implied volatility, **decimal** (0.37 = 37%).
        IV_LO:
          type: number
          description: IV of the listed expiry just before the tenor.
        IV_HI:
          type: number
          description: IV of the listed expiry just after the tenor.
        DTE_LO:
          type: number
          description: Days to expiry of the bracketing expiry before the tenor.
        DTE_HI:
          type: number
          description: Days to expiry of the bracketing expiry after the tenor.
        ATM_DIST:
          type: number
          description: Distance between achieved and target delta.
        METHODOLOGY:
          type: string
          example: total_variance_interp
        METHOD:
          type: string
          example: iv_C_50_delta_30d
        METRIC_FAMILY:
          type: string
          example: continuous_iv
        IV_SOURCE_COL:
          type: string
          enum:
            - IV_MARK
            - IV_MARK_COMPUTED
        LOAD_TS:
          type: string
          description: When the row was written, UTC.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your Sandmark API key.

````

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