curl "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26" \
-H "X-API-Key: gex_sk_your_key_here"
import requests
resp = requests.get(
"https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26",
headers={"X-API-Key": "gex_sk_your_key_here"},
)
data = resp.json()["data"]
markers = data["markers"]
meta = data["metadata"]
print(f"Spot: {meta['current_price']:,.2f}")
if markers["flip_points"]:
print(f"Gamma flip: {markers['flip_points'][0]['strike']:,.2f}")
print(f"Max volatility:{markers['volatility_point']['price']:,.2f}")
print(f"Max stability: {markers['stability_point']['price']:,.2f}")
print(f"Net GEX: {markers['totals']['net_gex']:+,.0f}")
print(f"Bias: {markers['asymmetry']['bias']}")
# Top 5 strikes by absolute GEX
gex = data["gex_data"]
rows = sorted(
zip(gex["strikes"], gex["net_gex"]),
key=lambda r: abs(r[1]),
reverse=True,
)
for strike, net in rows[:5]:
print(f"Strike {strike:>8,.0f}: net GEX = {net:+,.0f}")
const url = "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26";
const resp = await fetch(url, {
headers: { "X-API-Key": "gex_sk_your_key_here" },
});
const { data } = await resp.json();
console.log("Spot:", data.metadata.current_price);
console.log("Flip:", data.markers.flip_points[0]?.strike);
console.log("Totals:", data.markers.totals);
console.log("Strikes returned:", data.gex_data.strikes.length);
{
"data": {
"gex_data": {
"strikes": [70000, 72000],
"call_gex": [4000000, 50000000],
"put_gex": [16500000, 5000000],
"net_gex": [-12500000, 45000000],
"total_gex": [-12500000, 45000000]
},
"markers": {
"flip_points": [{ "label": "F", "strike": 71500, "value": 0, "source": "gamma_profile" }],
"max_pain": { "label": "MP", "strike": 72000, "value": 50000000 },
"totals": { "net_gex": 32500000, "call_gex": 54000000, "put_gex": 21500000, "absolute_gex": 75500000, "absolute_gex_power": 0.7 }
},
"metadata": {
"basecoin": "BTC",
"exchange": "all",
"expiration_date": "25APR26",
"current_price": 71800,
"timestamp": "2026-04-14T10:00:00Z"
},
"levels": {
"spot": 71800, "flip": 71500, "flip_count": 1, "regime": "positive",
"net_gex": 32500000, "abs_gex": 75500000,
"call_gex": 54000000, "put_gex": 21500000,
"p1_strike": 72000, "p1_gex": 45000000,
"n1_strike": 70000, "n1_gex": -12500000,
"max_pain": 72000
}
},
"meta": {
"timestamp": "2026-04-14T10:00:00+00:00",
"exchange": "all",
"coin": "BTC",
"exchange_resolved": "combined",
"market": "crypto",
"symbol": "BTC",
"as_of": "2026-04-14T10:00:00Z",
"oi_as_of": "2026-04-14",
"data_source": "live",
"is_live": true,
"market_open": true,
"next_open": null,
"units": "USD per 1% move of the underlying",
"docs_url": "https://docs.gammaflip.io/data-dictionary",
"expiration": "25APR26",
"expiration_iso": "2026-04-25",
"rate_limit": {
"limit": 500,
"remaining": 492,
"reset": "2026-04-15T00:00:00+00:00"
}
}
}
{
"error": "no_data",
"message": "No data available for BTC 25APR26 on all."
}
Endpoints
GEX by Strike (Enhanced)
GEX data by strike price with key markers (gamma flip, max pain, walls) and aggregate totals
GET
/
gex
/
by-strike-enhanced
/
{exchange}
/
{coin}
/
{expiration}
curl "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26" \
-H "X-API-Key: gex_sk_your_key_here"
import requests
resp = requests.get(
"https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26",
headers={"X-API-Key": "gex_sk_your_key_here"},
)
data = resp.json()["data"]
markers = data["markers"]
meta = data["metadata"]
print(f"Spot: {meta['current_price']:,.2f}")
if markers["flip_points"]:
print(f"Gamma flip: {markers['flip_points'][0]['strike']:,.2f}")
print(f"Max volatility:{markers['volatility_point']['price']:,.2f}")
print(f"Max stability: {markers['stability_point']['price']:,.2f}")
print(f"Net GEX: {markers['totals']['net_gex']:+,.0f}")
print(f"Bias: {markers['asymmetry']['bias']}")
# Top 5 strikes by absolute GEX
gex = data["gex_data"]
rows = sorted(
zip(gex["strikes"], gex["net_gex"]),
key=lambda r: abs(r[1]),
reverse=True,
)
for strike, net in rows[:5]:
print(f"Strike {strike:>8,.0f}: net GEX = {net:+,.0f}")
const url = "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26";
const resp = await fetch(url, {
headers: { "X-API-Key": "gex_sk_your_key_here" },
});
const { data } = await resp.json();
console.log("Spot:", data.metadata.current_price);
console.log("Flip:", data.markers.flip_points[0]?.strike);
console.log("Totals:", data.markers.totals);
console.log("Strikes returned:", data.gex_data.strikes.length);
{
"data": {
"gex_data": {
"strikes": [70000, 72000],
"call_gex": [4000000, 50000000],
"put_gex": [16500000, 5000000],
"net_gex": [-12500000, 45000000],
"total_gex": [-12500000, 45000000]
},
"markers": {
"flip_points": [{ "label": "F", "strike": 71500, "value": 0, "source": "gamma_profile" }],
"max_pain": { "label": "MP", "strike": 72000, "value": 50000000 },
"totals": { "net_gex": 32500000, "call_gex": 54000000, "put_gex": 21500000, "absolute_gex": 75500000, "absolute_gex_power": 0.7 }
},
"metadata": {
"basecoin": "BTC",
"exchange": "all",
"expiration_date": "25APR26",
"current_price": 71800,
"timestamp": "2026-04-14T10:00:00Z"
},
"levels": {
"spot": 71800, "flip": 71500, "flip_count": 1, "regime": "positive",
"net_gex": 32500000, "abs_gex": 75500000,
"call_gex": 54000000, "put_gex": 21500000,
"p1_strike": 72000, "p1_gex": 45000000,
"n1_strike": 70000, "n1_gex": -12500000,
"max_pain": 72000
}
},
"meta": {
"timestamp": "2026-04-14T10:00:00+00:00",
"exchange": "all",
"coin": "BTC",
"exchange_resolved": "combined",
"market": "crypto",
"symbol": "BTC",
"as_of": "2026-04-14T10:00:00Z",
"oi_as_of": "2026-04-14",
"data_source": "live",
"is_live": true,
"market_open": true,
"next_open": null,
"units": "USD per 1% move of the underlying",
"docs_url": "https://docs.gammaflip.io/data-dictionary",
"expiration": "25APR26",
"expiration_iso": "2026-04-25",
"rate_limit": {
"limit": 500,
"remaining": 492,
"reset": "2026-04-15T00:00:00+00:00"
}
}
}
{
"error": "no_data",
"message": "No data available for BTC 25APR26 on all."
}
What it returns
For a specific expiration, this endpoint returns:- GEX per strike — call, put, net, and total dealer gamma exposure at each listed strike
- Key markers — gamma flip point, max pain, largest positive/negative GEX strikes (walls), max-volatility and max-stability price levels, spot reference, and aggregate totals
- Asymmetry metrics — upside vs. downside GEX imbalance and bias direction
- Metadata — current price, strike range, timestamp, exchange/coin/expiration
- Levels — a flat
levelsobject (flip, regime, walls, totals, max pain, ATM IV), defined in the data dictionary. The same object is returned on its own by/levels
Path parameters
string
required
Crypto:
bybit, deribit, okx, derive, binance, all / combined, or a subset
such as deribit+derive. TradFi tickers: tradfi (all and combined are
aliases). See Markets and exchanges.string
required
Symbol, for example
BTC, ETH, QQQ. Case-insensitive.string
required
Expiration date in
DDMMMYY format (e.g., 25APR26), as an ISO date
(2026-04-25), or TOTAL to combine all expirations into a single view.Query parameters
string
default:"full"
full (default, unchanged) returns the per-strike arrays, markers and
metadata. levels returns only levels and metadata: a compact answer
for scripts and LLM agents (a full TOTAL payload is tens of KB). Any other
value returns 400 invalid_param with valid_values.number
With
view=full, keeps only strikes within ±range_pct % of spot in the
per-strike arrays. Must be in (0, 50]; otherwise 400 invalid_param with
max_value: 50. Without it, you get the full strike range as before. It has no
effect with view=levels, which has no per-strike arrays.Response shape
{
"data": {
"gex_data": {
"strikes": [64000, 65000, 66000, ...],
"call_gex": [0, 0, 0, ...],
"put_gex": [0, 0, 0, ...],
"net_gex": [0, 0, 0, ...],
"total_gex": [0, 0, 0, ...]
},
"markers": {
"flip_points": [{ "label": "F", "strike": 74359.02, "value": 0, "source": "gamma_profile" }],
"max_pain": { "label": "MP", "strike": 73500, "value": 5009961.93 },
"absolute_max": [{ "label": "A1", "strike": 73500, "value": 5009961.93 }, ...],
"positive_max": [{ "label": "P1", "strike": 75000, "value": 2438676.77 }, ...],
"negative_max": [{ "label": "N1", "strike": 73500, "value": -4385894.65 }, ...],
"spot": { "strike": 74032.81, "value": 0 },
"stability_point": { "label": "Max Stability", "price": 76000, "gex": 9738048.19 },
"volatility_point": { "label": "Max Volatility", "price": 73000, "gex": -6025085.01 },
"totals": {
"call_gex": 10647784.38,
"put_gex": 13321643.60,
"net_gex": -2673859.22,
"absolute_gex": 23969427.97,
"absolute_gex_power": 0.444
},
"asymmetry": {
"upside_gex": 8354828.92,
"downside_gex": 15614599.06,
"asymmetry_ratio": -0.303,
"bias": "bullish",
"upside_distance": 1075.95,
"downside_distance": 872.48
}
},
"metadata": {
"basecoin": "BTC",
"exchange": "deribit",
"expiration_date": "15APR26",
"current_price": 74032.81,
"data_points": 26,
"strike_range": { "min": 64000, "max": 82000 },
"enhanced": true,
"gamma_profile_source": true,
"timestamp": "2026-04-14T22:42:25.330317Z",
"timestamp_ms": 1776202945330
}
}
}
data.levels sits next to gex_data, markers and metadata and is purely
additive; markers is unchanged. Example, trimmed:
"levels": {
"spot": 74032.81, "flip": 74359.02, "flip_count": 1, "regime": "negative",
"net_gex": -2673859.22, "abs_gex": 23969427.97,
"p1_strike": 75000, "n1_strike": 73500, "max_pain": 73500, "atm_iv": 0.46
}
Field guide
gex_data— parallel arrays; indexiacross all arrays refers to the same strike.total_gex=call_gex - put_gexaggregated on dealers’ side.flip_points— price level(s) where net dealer GEX crosses zero. Above the flip, dealer hedging is positive-gamma (stabilising); below, it’s negative-gamma (amplifying).absolute_max/positive_max/negative_max— ranked lists of the largest absolute, positive, and negative GEX strikes. These are the “walls” where hedging flows concentrate.stability_point— max-stability level: the peak of the net-gamma profile (a price, not a strike).volatility_point— max-volatility level: the trough of the net-gamma profile (a price, not a strike).asymmetry— imbalance between upside and downside dealer exposure;biasis a qualitative read (bullish/bearish/neutral).
TOTAL aggregates all expirations for the given coin. Useful for getting an
“all-positioning” view; individual expiration views are more precise for
timing-specific trades.Response meta
Every data response (this endpoint,/levels and
term-oi) carries a self-describing meta. The keys
below are additive: meta.exchange, meta.coin and meta.expiration keep their
existing values.
| Field | Meaning |
|---|---|
as_of | Time the data reflects. ISO 8601 UTC with Z, second precision |
oi_as_of | Session date (YYYY-MM-DD) of the open interest used. TradFi open interest settles once a day, so intraday it is the previous session |
data_source | live, eod, … (crypto is always live) |
is_live | true when the data is a live snapshot |
market_open | Whether the market is open (always true for crypto) |
next_open | Next market open (TradFi); null for crypto |
units | "USD per 1% move of the underlying" |
docs_url | Link to the data dictionary |
exchange_resolved | Canonical venue after aliasing: tradfi, deribit, combined, deribit+derive, … |
market | crypto or tradfi |
symbol | The symbol queried (same as coin) |
expiration_iso | The expiration as YYYY-MM-DD (null for TOTAL) |
meta.timestamp is when the response was generated. meta.rate_limit shows your
quota (this call counts as 1 request).
Errors
error
Exchange not recognized, or it does not match the coin’s market. The body
includes
valid_exchanges.error
The expiration is not listed. The body includes
nearest_expirations
(up to five ISO dates closest to the one you sent, or the earliest five if the value is not a date).error
view or range_pct is invalid. The body includes valid_values or max_value.error
Your plan does not include this coin’s market. The body includes
markets_in_plan.error
The coin belongs to a market your plan doesn’t cover. See
market_not_in_plan.
error
No data for this coin/exchange/expiration combination. Common cause: the
expiration doesn’t exist on that exchange (use
/expirations/ first).curl "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26" \
-H "X-API-Key: gex_sk_your_key_here"
import requests
resp = requests.get(
"https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26",
headers={"X-API-Key": "gex_sk_your_key_here"},
)
data = resp.json()["data"]
markers = data["markers"]
meta = data["metadata"]
print(f"Spot: {meta['current_price']:,.2f}")
if markers["flip_points"]:
print(f"Gamma flip: {markers['flip_points'][0]['strike']:,.2f}")
print(f"Max volatility:{markers['volatility_point']['price']:,.2f}")
print(f"Max stability: {markers['stability_point']['price']:,.2f}")
print(f"Net GEX: {markers['totals']['net_gex']:+,.0f}")
print(f"Bias: {markers['asymmetry']['bias']}")
# Top 5 strikes by absolute GEX
gex = data["gex_data"]
rows = sorted(
zip(gex["strikes"], gex["net_gex"]),
key=lambda r: abs(r[1]),
reverse=True,
)
for strike, net in rows[:5]:
print(f"Strike {strike:>8,.0f}: net GEX = {net:+,.0f}")
const url = "https://api.gammaflip.io/api/v1/gex/by-strike-enhanced/all/BTC/25APR26";
const resp = await fetch(url, {
headers: { "X-API-Key": "gex_sk_your_key_here" },
});
const { data } = await resp.json();
console.log("Spot:", data.metadata.current_price);
console.log("Flip:", data.markers.flip_points[0]?.strike);
console.log("Totals:", data.markers.totals);
console.log("Strikes returned:", data.gex_data.strikes.length);
{
"data": {
"gex_data": {
"strikes": [70000, 72000],
"call_gex": [4000000, 50000000],
"put_gex": [16500000, 5000000],
"net_gex": [-12500000, 45000000],
"total_gex": [-12500000, 45000000]
},
"markers": {
"flip_points": [{ "label": "F", "strike": 71500, "value": 0, "source": "gamma_profile" }],
"max_pain": { "label": "MP", "strike": 72000, "value": 50000000 },
"totals": { "net_gex": 32500000, "call_gex": 54000000, "put_gex": 21500000, "absolute_gex": 75500000, "absolute_gex_power": 0.7 }
},
"metadata": {
"basecoin": "BTC",
"exchange": "all",
"expiration_date": "25APR26",
"current_price": 71800,
"timestamp": "2026-04-14T10:00:00Z"
},
"levels": {
"spot": 71800, "flip": 71500, "flip_count": 1, "regime": "positive",
"net_gex": 32500000, "abs_gex": 75500000,
"call_gex": 54000000, "put_gex": 21500000,
"p1_strike": 72000, "p1_gex": 45000000,
"n1_strike": 70000, "n1_gex": -12500000,
"max_pain": 72000
}
},
"meta": {
"timestamp": "2026-04-14T10:00:00+00:00",
"exchange": "all",
"coin": "BTC",
"exchange_resolved": "combined",
"market": "crypto",
"symbol": "BTC",
"as_of": "2026-04-14T10:00:00Z",
"oi_as_of": "2026-04-14",
"data_source": "live",
"is_live": true,
"market_open": true,
"next_open": null,
"units": "USD per 1% move of the underlying",
"docs_url": "https://docs.gammaflip.io/data-dictionary",
"expiration": "25APR26",
"expiration_iso": "2026-04-25",
"rate_limit": {
"limit": 500,
"remaining": 492,
"reset": "2026-04-15T00:00:00+00:00"
}
}
}
{
"error": "no_data",
"message": "No data available for BTC 25APR26 on all."
}