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

# Levels for the latest snapshot

> Where are we now: flip, regime, walls, totals, stability and volatility levels,
max pain and ATM IV for the latest snapshot, as one flat object. Small payload,
the first call for a script or an LLM agent. Counts as 1 request.




## OpenAPI

````yaml /openapi.yaml get /levels/{exchange}/{coin}
openapi: 3.1.0
info:
  title: GammaFlip GEX API
  version: 1.0.0
  description: >
    Programmatic access to Gamma Exposure (GEX) data for crypto options

    (Bybit, Deribit, OKX, Derive) and US options (the `tradfi` exchange).


    API access is a plan entitlement (`api_access`). The trial includes it

    (50 requests/day); other plans with API access get 500 requests/day.

    Only `/gex/...`, `/levels/...` and the `/history/...` query endpoints count

    against the quota; `/exchanges`, `/coins`, `/expirations/...`, `/me` and

    `/history/coverage` are free. History file downloads use a separate daily

    bucket of file credits (trial 20, other plans 200). A `429` carries no

    `Retry-After` header: use `X-RateLimit-Reset`, `X-History-Files-Reset` or
    `/me`.


    All GEX values are USD per 1% move of the underlying. Field definitions:

    https://docs.gammaflip.io/data-dictionary
  contact:
    name: GammaFlip Support
    email: admin@gammaflip.io
    url: https://gammaflip.io
servers:
  - url: https://api.gammaflip.io/api/v1
    description: Production
security:
  - ApiKeyAuth: []
paths:
  /levels/{exchange}/{coin}:
    get:
      tags:
        - Data
      summary: Levels for the latest snapshot
      description: >
        Where are we now: flip, regime, walls, totals, stability and volatility
        levels,

        max pain and ATM IV for the latest snapshot, as one flat object. Small
        payload,

        the first call for a script or an LLM agent. Counts as 1 request.
      operationId: getLevels
      parameters:
        - $ref: '#/components/parameters/Exchange'
        - $ref: '#/components/parameters/Coin'
        - name: expiration
          in: query
          required: false
          description: >-
            `TOTAL` (default), an expiration code (`17OCT26`) or an ISO date
            (`2026-10-17`).
          schema:
            type: string
            default: TOTAL
        - name: compare
          in: query
          required: false
          description: >
            Comma-separated `1d`, `7d`, `30d`. Adds `data.compare` with, for
            each period, the

            last stored capture on or before the session date N days ago and its
            deltas to the

            live levels. `TOTAL` only; venue subsets have no history. The
            reference date is

            the New York date for TradFi and the UTC date for crypto.
          schema:
            type: string
            example: 1d,7d,30d
      responses:
        '200':
          description: Levels
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - meta
                properties:
                  data:
                    allOf:
                      - $ref: '#/components/schemas/Levels'
                      - type: object
                        properties:
                          expiration:
                            type: string
                            example: TOTAL
                          expiration_iso:
                            type:
                              - string
                              - 'null'
                          compare:
                            type: object
                            description: >
                              Only with `?compare=`. One key per requested
                              period; `null` when

                              there is no history that far back. Each value is a
                              history row plus

                              `delta` (live minus past for `spot`, `flip`,
                              `net_gex`, `abs_gex`,

                              `p1_strike`, `n1_strike`, `s_price`, `v_price`;
                              `null` when missing).
                            additionalProperties:
                              oneOf:
                                - type: 'null'
                                - allOf:
                                    - $ref: '#/components/schemas/HistoryLevelsRow'
                                    - type: object
                                      properties:
                                        delta:
                                          type: object
                                          additionalProperties:
                                            type:
                                              - number
                                              - 'null'
                  meta:
                    $ref: '#/components/schemas/DataMeta'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: No data available
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          description: TradFi data temporarily unavailable (`market_unavailable`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  parameters:
    Exchange:
      name: exchange
      in: path
      required: true
      description: >
        Crypto: `bybit`, `deribit`, `okx`, `derive`, `all` / `combined`, or a
        `+`-joined

        subset such as `deribit+derive`. TradFi tickers: `tradfi` (`all` and
        `combined`

        are aliases). Use `/exchanges` for the live list.
      schema:
        type: string
        examples:
          - all
          - deribit+derive
          - tradfi
    Coin:
      name: coin
      in: path
      required: true
      description: >-
        Symbol (case-insensitive), for example `BTC` or `QQQ`. Use `/coins` for
        the list.
      schema:
        type: string
        example: BTC
  schemas:
    Levels:
      type: object
      description: >
        The levels of one GEX snapshot. GEX values are USD per 1% move of the

        underlying; `call_gex` and `put_gex` are non-negative, `net_gex =
        call_gex - put_gex`.

        Missing values are `null`. See the data dictionary.
      properties:
        spot:
          type:
            - number
            - 'null'
          description: Underlying price at capture.
        flip:
          type:
            - number
            - 'null'
          description: >-
            Primary gamma-flip price (`flip_points[0]`), the net-gamma sign
            change nearest to spot.
        flip_count:
          type: integer
          description: Number of zero crossings in the profile.
        regime:
          type:
            - string
            - 'null'
          enum:
            - positive
            - negative
            - null
          description: '`positive` if `spot >= flip`.'
        net_gex:
          type:
            - number
            - 'null'
          description: Sum of call_gex minus sum of put_gex.
        abs_gex:
          type:
            - number
            - 'null'
          description: Sum of call_gex plus sum of put_gex.
        call_gex:
          type:
            - number
            - 'null'
        put_gex:
          type:
            - number
            - 'null'
        call_oi_total:
          type:
            - number
            - 'null'
          description: Sum of call open interest in contracts.
        put_oi_total:
          type:
            - number
            - 'null'
          description: Sum of put open interest in contracts.
        p1_strike:
          type:
            - number
            - 'null'
          description: Strike with the largest positive net GEX.
        p1_gex:
          type:
            - number
            - 'null'
        p2_strike:
          type:
            - number
            - 'null'
        p2_gex:
          type:
            - number
            - 'null'
        n1_strike:
          type:
            - number
            - 'null'
          description: Strike with the most negative net GEX.
        n1_gex:
          type:
            - number
            - 'null'
        n2_strike:
          type:
            - number
            - 'null'
        n2_gex:
          type:
            - number
            - 'null'
        a1_strike:
          type:
            - number
            - 'null'
          description: Strike with the largest absolute GEX (call + put).
        a1_gex:
          type:
            - number
            - 'null'
        a2_strike:
          type:
            - number
            - 'null'
        a2_gex:
          type:
            - number
            - 'null'
        s_price:
          type:
            - number
            - 'null'
          description: Max-stability level, the peak of the net-gamma profile (a price).
        s_gex:
          type:
            - number
            - 'null'
        v_price:
          type:
            - number
            - 'null'
          description: Max-volatility level, the trough of the net-gamma profile (a price).
        v_gex:
          type:
            - number
            - 'null'
        max_pain:
          type:
            - number
            - 'null'
          description: Per-expiration max-pain strike; `null` for TOTAL.
        atm_iv:
          type:
            - number
            - 'null'
          description: ATM implied volatility as a decimal (0.18 = 18%).
    HistoryLevelsRow:
      type: object
      description: >
        One stored `TOTAL` snapshot. `type` is `close` only for the last capture
        of a

        completed session. `oi_date` is the session whose open interest the row
        used.

        The levels fields follow the `Levels` schema (`max_pain` is `null` for
        `TOTAL`, so always `null` in the levels series;

        a single-expiration snapshot may set it).
      allOf:
        - type: object
          properties:
            schema_version:
              type: integer
              example: 1
            timestamp_utc:
              type: string
              format: date-time
              example: '2026-10-05T20:15:00Z'
            session_date:
              type: string
              format: date
              description: UTC date (crypto) or New York trading date (TradFi).
              example: '2026-10-05'
            type:
              type: string
              enum:
                - intraday
                - close
            exchange:
              type: string
              example: tradfi
            symbol:
              type: string
              example: QQQ
            oi_date:
              type:
                - string
                - 'null'
              format: date
              description: Session whose open interest was used.
              example: '2026-10-02'
        - $ref: '#/components/schemas/Levels'
    DataMeta:
      type: object
      description: >
        Self-describing `meta` of data responses (`/levels`, `/gex/...`). Keys
        are

        additive; `exchange`, `coin` and `expiration` keep their existing
        values.
      properties:
        timestamp:
          type: string
          format: date-time
          example: '2026-10-06T15:15:04.120000+00:00'
        exchange:
          type: string
          description: The exchange as requested (lowercased).
          example: all
        coin:
          type: string
          example: QQQ
        expiration:
          type: string
          description: >-
            Expiration code as used (`TOTAL` or `DDMMMYY`). Only on
            expiration-scoped endpoints.
          example: TOTAL
        expiration_iso:
          type:
            - string
            - 'null'
          description: Expiration as `YYYY-MM-DD`; `null` for `TOTAL`.
          example: null
        exchange_resolved:
          type: string
          description: >-
            Canonical venue after aliasing (`tradfi`, `deribit`, `combined`,
            `deribit+derive`, ...).
          example: tradfi
        market:
          type: string
          enum:
            - crypto
            - tradfi
        symbol:
          type: string
          example: QQQ
        as_of:
          type:
            - string
            - 'null'
          format: date-time
          description: Time the data reflects. ISO 8601 UTC with `Z`, second precision.
          example: '2026-10-06T15:15:00Z'
        oi_as_of:
          type:
            - string
            - 'null'
          description: Session date (`YYYY-MM-DD`) of the open interest used.
          example: '2026-10-05'
        data_source:
          type:
            - string
            - 'null'
          description: '`live`, `eod`, ... (crypto is always `live`).'
          example: live
        is_live:
          type:
            - boolean
            - 'null'
        market_open:
          type:
            - boolean
            - 'null'
          description: Always `true` for crypto.
        next_open:
          type:
            - string
            - 'null'
          description: Next market open (TradFi); `null` for crypto.
        units:
          type: string
          example: USD per 1% move of the underlying
        docs_url:
          type: string
          example: https://docs.gammaflip.io/data-dictionary
        rate_limit:
          $ref: '#/components/schemas/RateLimit'
    Error:
      type: object
      description: >
        Standard error body. `error` is a stable slug safe to branch on;
        `message` is human-readable prose that may change and must not be
        parsed. Errors are never wrapped in the data/meta envelope used by
        successful responses. Some errors add hint fields.
      required:
        - error
        - message
      properties:
        error:
          type: string
          enum:
            - unauthorized
            - subscription_required
            - market_not_in_plan
            - rate_limit_exceeded
            - invalid_exchange
            - invalid_pair
            - invalid_expiration
            - invalid_param
            - no_data
            - unsupported_coin
            - market_unavailable
            - history_not_available
            - range_too_large
            - no_snapshot
            - no_file
            - files_unavailable
            - history_files_limit_exceeded
            - method_not_allowed
          example: invalid_exchange
        message:
          type: string
          example: Exchange 'kraken' is not available.
        current_tier:
          type: string
          description: With `subscription_required` and `market_not_in_plan`.
          example: trial
        valid_exchanges:
          type: array
          items:
            type: string
          description: With `invalid_exchange`, `invalid_pair` and `history_not_available`.
          example:
            - deribit
            - bybit
            - okx
            - derive
            - combined
        nearest_expirations:
          type: array
          items:
            type: string
          description: >-
            With `invalid_expiration`; up to five ISO dates closest to the
            request (the earliest five if the value is not a date).
          example:
            - '2026-10-17'
            - '2026-10-19'
        valid_values:
          type: array
          items:
            type: string
          description: >-
            With `invalid_param` for `view`, `granularity`, `file` and
            `compare`.
          example:
            - full
            - levels
        max_value:
          type: number
          description: With `invalid_param` for `range_pct`.
          example: 50
        max_window_days:
          type: integer
          description: With `range_too_large`.
          example: 31
        nearest_timestamps:
          type: array
          items:
            type: string
            format: date-time
          description: With `no_snapshot`; up to three capture times closest to `at`.
          example:
            - '2026-10-05T20:15:00Z'
            - '2026-10-05T13:45:00Z'
        market:
          type: string
          description: With `market_not_in_plan`; the market the requested coin belongs to.
          enum:
            - crypto
            - tradfi
          example: tradfi
        markets_in_plan:
          type: array
          items:
            type: string
          description: With `market_not_in_plan`.
        supported_crypto:
          type: array
          items:
            type: string
          description: >-
            With `unsupported_coin`; crypto coins listed by at least one
            exchange.
          example:
            - BTC
            - ETH
            - HYPE
            - SOL
            - XRP
        supported_tradfi:
          type: array
          items:
            type: string
          description: With `unsupported_coin`; US tickers we track.
          example:
            - QQQ
            - SPX
            - SPY
        rate_limit:
          allOf:
            - $ref: '#/components/schemas/RateLimit'
          description: >-
            With `rate_limit_exceeded` and `history_files_limit_exceeded`;
            mirrors the X-RateLimit-* headers.
    RateLimit:
      type: object
      properties:
        limit:
          type: integer
          example: 500
        remaining:
          type: integer
          example: 487
        reset:
          type: string
          format: date-time
          example: '2026-04-15T00:00:00+00:00'
  responses:
    BadRequest:
      description: >
        `invalid_exchange`, `invalid_pair`, `invalid_expiration` or
        `invalid_param`,

        with hint fields (`valid_exchanges`, `nearest_expirations`,
        `valid_values`, `max_value`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: >
        Missing or invalid credential, or a credential that does not resolve to
        a user. Both return `unauthorized`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >
        `subscription_required` (the plan has no API access) or
        `market_not_in_plan`

        (the plan does not include the coin's market).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: |
        Daily rate limit exceeded. No `Retry-After` header is sent: use
        `X-RateLimit-Reset` or `GET /me`.
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
        X-RateLimit-Remaining:
          schema:
            type: integer
            example: 0
        X-RateLimit-Reset:
          schema:
            type: string
            format: date-time
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: |
        API key prefixed with `gex_sk_`. Create one in your
        [account dashboard](https://gammaflip.io/account).

````

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