1. API
  2. GEX API

GEX API

Dealer positioning,
by strike.

Net gamma exposure across the book, the strikes that pin it, the level where dealers flip from dampening moves to chasing them, and the same picture for zero-DTE. Returned as arrays, ready to chart.

7Endpoints in this family
5Matching MCP tools
60/minPer token, 1,000 an hour

A real response

This is what
comes back.

Captured from the live endpoint on 2026-09-08, lists cut to a few rows so it fits on a page. The shape is exactly what your code receives. Run it on your own ticker from the endpoint page.

GET /api/mcp/data/gex/SPY?detail=compact&strikes_around=8200, application/json
{
  "by_expiration": [
    {
      "call_gex": 1132995456.8335,
      "expiration": "2026-09-08",
      "flip_level": null,
      "max_gamma_strike": 770,
      "min_gamma_strike": 771,
      "put_gex": -1178772712.3059,
      "stock_price": 770.25,
      "total_gex": -45777255.4724
    },
    {
      "call_gex": 631787389.7441,
      "expiration": "2026-09-09",
      "flip_level": null,
      "max_gamma_strike": 766,
      "min_gamma_strike": 769,
      "put_gex": -735739062.8266,
      "stock_price": 770.25,
      "total_gex": -103951673.0825
    },
    {
      "call_gex": 488040962.8352,
      "expiration": "2026-09-10",
      "flip_level": 777.7584,
      "max_gamma_strike": 775,
      "min_gamma_strike": 770,
      "put_gex": -396093609.9746,
      "stock_price": 770.25,
      "total_gex": 91947352.8606
    }
  ],
  "call_gex": 12388200841.1688,
  "expirations_horizon_days": 90,
  "expirations_included": 16,
  "expirations_selected": [
    "2026-09-08",
    "2026-09-09",
    "2026-09-10"
  ],
  "expirations_through": "2026-11-20",
  "expirations_total": 32,
  "flip_degenerate": false,
  "flip_level": null,
  "gamma_flip": null,
  "gex_by_strike": [
    {
      "gex": -133889311.3072,
      "oi": 27515,
      "strike": 769
    },
    {
      "gex": -52445836.8019,
      "oi": 121480,
      "strike": 770
    },
    {
      "gex": -73315508.5296,
      "oi": 23312,
      "strike": 771
    }
  ],
  "gex_profile": [
    {
      "call_gex": 237808150.3447494,
      "net_gex": -133889311.30720633,
      "put_gex": -371697461.6519557,
      "strike": 769
    },
    {
      "call_gex": 980618910.3369881,
      "net_gex": -52445836.80189216,
      "put_gex": -1033064747.1388803,
      "strike": 770
    },
    {
      "call_gex": 253439508.7709778,
      "net_gex": -73315508.52959651,
      "put_gex": -326755017.3005743,
      "strike": 771
    }
  ],
  "gex_ratio": 0.7932,
  "implications": {
    "directional_bias": "Balanced (call/put GEX 0.79)",
    "net_to_gross": -0.1153,
    "pin_at_spot": false,
    "positioning": "largest strike $760.00 (-1.3%); call wall $775.00 (+0.6%); put wall $760.00 (-1.3%)",
    "regime_code": "negative",
    "support_resistance": "--",
    "volatility_regime": "Negative GEX (dealers amplify moves)"
  },
  "key_levels": {
    "call_wall": 775.0,
    "call_wall_unconstrained": false,
    "call_wall_value": 969364047.7614,
    "flip_degenerate": false,
    "flip_level": null,
    "key_strike": 760.0,
    "key_strike_net": 1376738203.7852,
    "max_pain": null,
    "put_wall": 760.0,
    "put_wall_unconstrained": false,
    "put_wall_value": 1809628588.0631,
    "spot": 770.25
  },
  "max_gex_strike": 760,
  "put_gex": -15618693641.3721,
  "stock_price": 770.25,
  "ticker": "SPY",
  "total_gex": -3230492800.2033,
  "total_gex_billions": -3.2305,
  "window": {
    "detail": "compact",
    "lists": {
      "gex_by_strike": {
        "rows_returned": 17,
        "rows_total": 329,
        "truncated": true
      },
      "gex_profile": {
        "rows_returned": 17,
        "rows_total": 329,
        "truncated": true
      }
    },
    "strikes_around": 8
  }
}

Every response is wrapped as {"success": true, "data": {...}}. Errors use the same envelope with an error string and a status code that means what it says.

Call it three ways. Same token, same JSON.

curlBearer token from Account, then API Access
curl -H "Authorization: Bearer avmcp_YOUR_TOKEN" \
     "https://apexvol.com/api/mcp/data/gex/SPY?detail=compact&strikes_around=8"
Pythonrequests, nothing else
import requests

headers = {"Authorization": "Bearer avmcp_YOUR_TOKEN"}
params = {"detail": "compact", "strikes_around": "8"}
r = requests.get("https://apexvol.com/api/mcp/data/gex/SPY", headers=headers, params=params)
r.raise_for_status()
data = r.json()["data"]
print(data["total_gex_billions"])
In Claude, Cursor or ChatGPTthrough the MCP server, no code
You

Where is the gamma flip on SPY right now?

The assistant calls get_gex and answers from the JSON above.

More prompts for this family in the prompt library. Set the server up in Claude Desktop, Claude Code, Cursor, ChatGPT, VS Code, Windsurf or Gemini CLI.

The family

7 endpoints,
one prefix.

All under https://apexvol.com/api/mcp/data. Each card opens a page with the parameters and their bounds, every response field, a real captured response and a console that runs it on your ticker.

Download as Markdown Copy for your AI

The Markdown twin of this family, sized for a context window.

Field by field

What each
number means.

total_gex, total_gex_billions
Net dealer gamma exposure across the included expirations, in dollars per one percent move.
call_gex, put_gex, gex_ratio
The two sides and their ratio. Calls carry positive gamma under the dealer-long-calls convention, puts negative.
flip_level, gamma_flip
The spot level where net gamma changes sign. Null when the book has no crossing inside the strike window, and flip_degenerate says why.
key_levels, max_gex_strike
The strikes with the largest absolute exposure, the ones that tend to act as magnets or walls.
gex_by_strike[]
Strike, net GEX and open interest for each strike in the window.
by_expiration[]
Call, put and total GEX per expiration with that expiration's own flip level.
expirations_horizon_days, expirations_included
How much of the book was counted: a 90-day horizon, capped at 16 expirations, stated on every response.
implications
A short plain-English read of the regime, the same text the terminal shows.

The same data, in plain English

5 MCP tools
wrap this family.

Connect the ApexVol MCP server and an assistant can call these by name. One URL, a sign-in, no token to paste.

  • get_gex
  • get_cross_index_gex
  • get_zero_dte
  • get_max_pain
  • get_volume_profile

Set it up in:

What people build

Three things
this is for.

Recipes that use this family:

Access

Auth
Bearer token, prefix avmcp_, created under Account, then API Access. Shown once, hashed at rest, rotates in one click.
Limits
60 requests a minute and 1,000 an hour per token, plus a monthly allowance by plan. Every response carries the remaining counts in headers.
Plans
Included with every paid or trial plan from $55 a month. Each endpoint follows the tier of its web feature; the cards above show which.
Spec
OpenAPI 3.1 at /docs/api/openapi.json, this family as one Markdown file, the whole reference at /llms-full.txt. Shared conventions, the error model and the changelog.

Questions

Asked before
the first call.

How is gamma exposure calculated?

Per strike: open interest times gamma times the contract multiplier times spot, summed for calls and puts under the standard assumption that dealers are long calls and short puts. The result is dollars of dealer hedging per one percent move. Every response states the expiration horizon used so the number is reproducible.

Which expirations are included?

By default every expiration inside a 90-day horizon, capped at 16, which the response reports as expirations_included and expirations_through. Pass expiration=YYYY-MM-DD to isolate one, or use /zero-dte for today's expiry.

What is the difference between compact and full detail?

Compact, the default for MCP clients, windows gex_by_strike around the current price so the payload fits in an assistant's context. Full, the default for REST callers, returns the entire strike range. Either can be chosen with detail=.

Does it work for SPX and NDX?

Yes. Index options are covered alongside equities and ETFs, and the flip and key levels are computed the same way. The stock_price on index responses is the forward for the expiration, which the docs explain.

Included with
every paid plan.

From $55 a month, tier-matched: your token queries the data your plan includes and Pro unlocks the full surface.

Real market data, not a sandbox. See it live on AAPL.