gexbot api
state

gex profile

Based on classified orderflow, this endpoint nets out imbalanced calls against imbalanced puts to locate areas of significant imbalanced exposure. It helps identify high/low gamma nodes and call/put gamma regimes.

GET/{ticker}/state/{category}State Tier

chart

Powers the gex profile chart.

Based on classified orderflow, this endpoint nets out imbalanced calls against imbalanced puts to locate areas of significant imbalanced exposure. It helps identify high/low gamma nodes and call/put gamma regimes.

Subscription

Requires a State subscription or higher.

Request

Example: /SPX/state/gex_zero

Headers

NameTypeDescription
AuthorizationstringRequired. Format: "Bearer <YOUR_API_KEY>"
User-AgentstringRequired. Identify your client application.
AcceptstringRequired. Set to "application/json".

Path parameters

NameTypeDescription
tickerstringDesired ticker symbol (e.g., SPX).
categorystringGEX aggregation category: full, gex_full, zero, gex_zero, one, or gex_one.

Response

FieldTypeDescription
timestampintegerThe Unix timestamp of when the data was generated.
tickerstringThe ticker symbol for the requested asset.
min_dteintegerThe days-to-expiration (DTE) for the nearest expiry.
sec_min_dteintegerThe days-to-expiration (DTE) for the next expiry.
spotnumberThe spot price of the underlying asset at the time of calculation. null when spot data is not available to the caller.
zero_gammanumberThe center of the options complex, according to a spline interpolation on gex by volume.
major_pos_volnumberThe strike with the largest positive GEX imbalance (call GEX).
major_pos_oinumberNot applicable for State model, which is based on volume.
major_neg_volnumberThe strike with the largest negative GEX imbalance (put GEX).
major_neg_oinumberNot applicable for State model, which is based on volume.
strikesarrayAn array of strike data. Each inner array contains [strike, gex by volume, gex by open interest, priors]. "GEX by Volume" here refers to the GEX imbalance.
sum_gex_volnumberThe total GEX imbalance (net GEX) based on volume.
sum_gex_oinumberNot applicable for State model.
delta_risk_reversalnumberVestigial metric, discontinued.
max_priorsarraySix [strike, gex] pairs. Entry 0 is the current pair. Entries 1 to 5 are the strikes with the largest GEX imbalance change over the 1, 5, 10, 15 and 30 minute lookbacks. The /maxchange route returns the same six pairs as current, one, five, ten, fifteen and thirty. The array is empty when the producer omits the field.
{
  "timestamp": 1753283591,
  "ticker": "SPX",
  "min_dte": 0,
  "sec_min_dte": 1,
  "spot": 6326.45,
  "zero_gamma": 0,
  "major_pos_vol": 6345,
  "major_pos_oi": 0,
  "major_neg_vol": 6280.08,
  "major_neg_oi": 0,
  "strikes": [
    [
      6110,
      -0.09,
      0,
      [
        -0.09,
        -0.09,
        -0.17,
        -0.17,
        -0.22
      ]
    ],
    [
      6115,
      -0.01,
      0,
      [
        -0.01,
        -0.01,
        -0.01,
        -0.01,
        0
      ]
    ],
    [
      6540,
      0,
      0,
      [
        0,
        0,
        0,
        0,
        0
      ]
    ]
  ],
  "sum_gex_vol": -597.68386,
  "sum_gex_oi": 0,
  "delta_risk_reversal": 0,
  "max_priors": [
    [
      6340,
      -29.431
    ],
    [
      6335,
      97.079
    ],
    [
      6330,
      -257.694
    ],
    [
      6325,
      381.286
    ],
    [
      6340,
      -811.011
    ],
    [
      6340,
      -355.997
    ]
  ]
}
{
  "type": "object",
  "properties": {
    "timestamp": {
      "type": "integer",
      "format": "int64"
    },
    "ticker": {
      "type": "string",
      "minLength": 2,
      "maxLength": 6
    },
    "min_dte": {
      "type": "integer"
    },
    "sec_min_dte": {
      "type": "integer"
    },
    "spot": {
      "type": ["number", "null"],
      "format": "double"
    },
    "zero_gamma": {
      "type": "number"
    },
    "major_pos_vol": {
      "type": "number"
    },
    "major_pos_oi": {
      "type": "number"
    },
    "major_neg_vol": {
      "type": "number"
    },
    "major_neg_oi": {
      "type": "number"
    },
    "strikes": {
      "type": "array",
      "items": {
        "type": "array"
      }
    },
    "sum_gex_vol": {
      "type": "number"
    },
    "sum_gex_oi": {
      "type": "number"
    },
    "delta_risk_reversal": {
      "type": "number"
    },
    "max_priors": {
      "type": "array",
      "maxItems": 6,
      "items": {
        "type": "array",
        "minItems": 2,
        "maxItems": 2,
        "items": {
          "type": "number"
        }
      }
    }
  },
  "additionalProperties": false
}
type: object
properties:
  timestamp:
    type: integer
    format: int64
  ticker:
    type: string
    minLength: 2
    maxLength: 6
  min_dte:
    type: integer
  sec_min_dte:
    type: integer
  spot:
    type: [number, 'null']
    format: double
  zero_gamma:
    type: number
  major_pos_vol:
    type: number
  major_pos_oi:
    type: number
  major_neg_vol:
    type: number
  major_neg_oi:
    type: number
  strikes:
    type: array
    items:
      type: array
  sum_gex_vol:
    type: number
  sum_gex_oi:
    type: number
  delta_risk_reversal:
    type: number
  max_priors:
    type: array
    maxItems: 6
    items:
      type: array
      minItems: 2
      maxItems: 2
      items:
        type: number
additionalProperties: false

Errors

Most error responses have the body {"error": "<message>"}. A 401 response has no body. A 403 response from the API key product check also has no body.

StatusBodyWhen
400{"error": "User-Agent not found."}The request has no User-Agent header.
400{"error": "Authorization header not found."}The request has no Authorization header.
400{"error": "Invalid ticker format."} or {"error": "Unknown ticker symbol: <ticker>"}The ticker is not a known symbol.
400{"error": "Invalid category package combination."}The category is not a state category.
401(no body)The API key is not valid.
403{"error": "User is not subscribed."}The account has no subscription.
403{"error": "User does not have permission to access this endpoint."}The account does not have REST API access.
403{"error": "Classic package does not have access."}The account has a Classic subscription. This route needs State or higher.
403{"error": "Commercial child access is suspended."}The commercial seat that owns the API key is suspended.
429{"error": "Rate limit exceeded."}The account has used its quota for this endpoint. See rate limits.
500{"error": "Failed to get redis chart data: null or zero length"}The server has no live data for the ticker and category.
500{"error": "Failed to get chart data."}The server could not decode the data. Retry the request.

On this page