GammaFlip.io Data API

The Data API from GammaFlip.io — 3 operation(s) for data.

GitHub OpenAPI

Operations 3

GET /levels/{exchange}/{coin} Levels for the latest snapshot #
GET /gex/term-oi/{exchange}/{coin} GEX term structure and Open Interest #
GET /gex/by-strike-enhanced/{exchange}/{coin}/{expiration} GEX by strike with key markers #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/gammaflip-io:gammaflip-io-data-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

gammaflip-io-data-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: GammaFlip GEX Data API
  version: 1.0.0
  description: 'Programmatic access to Gamma Exposure (GEX) data for crypto options

    (Bybit, Deribit, OKX, Derive, Binance) 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: []
tags:
- name: Data
paths:
  /levels/{exchange}/{coin}:
    get:
      operationId: getLevels
      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.'
      tags:
      - Data
      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'
  /gex/term-oi/{exchange}/{coin}:
    get:
      operationId: getTermOi
      summary: GEX term structure and Open Interest
      description: 'Returns OI and GEX per expiration date, broken down by exchange.


        Use `all` as `exchange` to get aggregated data across all exchanges.

        This is the most common endpoint for building term-structure dashboards.

        Counts as 1 request.'
      tags:
      - Data
      parameters:
      - $ref: '#/components/parameters/Exchange'
      - $ref: '#/components/parameters/Coin'
      responses:
        '200':
          description: Term structure data
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - meta
                properties:
                  data:
                    type: object
                  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 for this coin/exchange
          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'
  /gex/by-strike-enhanced/{exchange}/{coin}/{expiration}:
    get:
      operationId: getByStrikeEnhanced
      summary: GEX by strike with key markers
      description: 'Returns GEX data broken down by strike price, plus key markers (gamma flip, max

        pain, positive/negative walls, max-volatility and max-stability price levels, spot

        reference, aggregate totals) and a flat `levels` object.


        Pass `TOTAL` as `expiration` to get all expirations combined. Use `view=levels`

        for a compact response without per-strike arrays, or `range_pct` to trim the

        strike arrays around spot. Counts as 1 request.'
      tags:
      - Data
      parameters:
      - $ref: '#/components/parameters/Exchange'
      - $ref: '#/components/parameters/Coin'
      - name: expiration
        in: path
        required: true
        description: Expiration in `DDMMMYY` format (e.g., `25APR26`), an ISO date (`2026-04-25`) or `TOTAL` for all expirations.
        schema:
          type: string
          example: 25APR26
      - $ref: '#/components/parameters/View'
      - $ref: '#/components/parameters/RangePct'
      responses:
        '200':
          description: GEX by strike data
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - meta
                properties:
                  data:
                    type: object
                    description: 'With `view=full`: `gex_data`, `markers`, `metadata` and `levels`.

                      With `view=levels`: `levels` and `metadata` only.

                      '
                    properties:
                      levels:
                        $ref: '#/components/schemas/Levels'
                  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:
  schemas:
    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'
    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%).
    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'
    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
          - binance
          - 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.
  parameters:
    RangePct:
      name: range_pct
      in: query
      required: false
      description: 'With `view=full`, keep only strikes within +/- this percent of spot in the

        per-strike arrays. Number in (0, 50]. No effect with `view=levels`.

        '
      schema:
        type: number
        exclusiveMinimum: 0
        maximum: 50
    Exchange:
      name: exchange
      in: path
      required: true
      description: 'Crypto: `bybit`, `deribit`, `okx`, `derive`, `binance`, `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
    View:
      name: view
      in: query
      required: false
      description: '`full` (default) returns per-strike arrays, markers and metadata. `levels`

        returns only `levels` and `metadata`.

        '
      schema:
        type: string
        enum:
        - full
        - levels
        default: full
    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
  responses:
    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'
    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'
    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'
    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).

        '