Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
Flow-Signed GEX (polarity=flow): Are Dealers Long or Short Gamma From Today's Tape?
FlashAlpha's flow-signed GEX mode (?polarity=flow) signs each strike's dealer gamma by the measured dealer position from today's classified options tape, not the calls-positive/puts-negative convention. See whether dealers are genuinely long gamma (pinning, vol suppression) or short gamma (vol amplification) on /v1/flow/gex, levels and live - derived purely from quote-rule NBBO aggressor classification, with no open-interest assumptions.
If you are searching for "are dealers long or short gamma today", "flow-signed GEX", "dealer gamma from the options tape", or "how to measure dealer positioning without open interest assumptions", this is the reference for FlashAlpha's polarity=flow mode. The short version: the standard convention tells you the market's structural gamma; flow polarity tells you the gamma dealers actually took on from today's classified order flow.
3
Endpoints that accept ?polarity=flow
0
Open-interest assumptions in the signed gamma
09:30 ET
Dealer position is session-cumulative from the open
Lee-Ready
Quote-rule NBBO aggressor classification
Two Ways to Sign Dealer Gamma
Every gamma exposure number rests on one hidden choice: what sign to attach to each strike's gamma. FlashAlpha now exposes both conventions on the same endpoints, selected with a single query parameter.
Mode
How each strike is signed
What it answers
convention (default)
Calls contribute positive gamma, puts contribute negative gamma - the standard market convention.
Are dealers actually long or short gamma from today's flow?
The convention mode is what almost every GEX tool prints. It is useful, stable, and easy to reason about, but it assumes dealers sit on the opposite side of all customer positioning in a fixed way. Flow polarity drops that assumption entirely and reads the dealer's side directly from the tape.
Why this is different
Convention GEX answers "what is the structural gamma of this chain?" Flow-signed GEX answers "given who bought and sold today, are dealers long or short gamma right now?" The first is a property of open contracts; the second is a property of the live tape. You want both, and now you can request either with one parameter.
Selecting a mode is one parameter. Omit it (or pass ?polarity=convention) and you get the existing behavior, byte for byte. Pass ?polarity=flow and the same endpoint re-signs its gamma from measured dealer inventory. Anything else returns 400 {"error":"invalid_polarity"}.
Read this first. Flow polarity is a derived signal off the classified options tape, not exchange-audited dealer accounting. The dealer side is inferred from quote-rule (Lee-Ready-style) NBBO aggressor classification, and dealer_pos is the session-cumulative inventory change since the 09:30 ET open, not the dealer's absolute book. Read the sign and its intraday shifts as a relative signal. The JSON sample below is an illustrative shape, not live data.
How Flow Polarity Is Computed
Flow polarity is deliberately simple and fully mechanical. For each strike, on both the call and put side:
Dealer position from classified flow
$$ \text{dealer\_pos} = -\,(\text{customer\_buys} - \text{customer\_sells}) = \text{customer\_sells} - \text{customer\_buys} $$
Flow-signed dollar gamma per strike
$$ \text{GEX}_{\text{strike}} = \text{dealer\_pos} \cdot \Gamma \cdot m \cdot S^{2} \cdot 0.01 $$
where m is the contract multiplier (100 for equity options) and S is spot.
The logic is the market-maker's mirror. When customers buy options, dealers are on the other side and end up short those options (short gamma). When customers sell, dealers end up long (long gamma). So dealer_pos is simply the negative of net customer buying, and each strike's dealer gamma dollars are that position multiplied by the contract's gamma, the multiplier, and the squared spot (scaled to a 1% move).
Three properties make this a clean, assumption-free measurement:
Untraded strikes contribute exactly 0. A strike with no classified session trades has dealer_pos = 0 and adds nothing to the surface. Flow polarity only counts what actually traded.
Midpoint trades are discarded. Only trades classifiable as buyer-initiated or seller-initiated count. Prints that sit inside the spread with no clear aggressor are dropped, not guessed.
Position is session-cumulative from the 09:30 ET open.dealer_pos is the net dealer inventory change accumulated since today's open, starting from zero - not an estimate of the dealer's absolute book.
How Trades Are Classified
The buy/sell tagging is a quote-rule aggressor classification against the concurrent NBBO (a Lee-Ready-style method). A print near the ask is buyer-initiated, a print near the bid is seller-initiated, and a print in the middle of the spread is treated as indeterminate and excluded. There is no tick-rule fallback and no midpoint imputation: if the aggressor is ambiguous, the trade simply does not contribute to dealer_pos.
What flow polarity explicitly does not use:
Not used
Why it matters
Open interest
The surface is built from classified volume alone. It does not consult settled OI, the effective-OI simulator, or the 0.43 open/close confidence weight used by the default flow surface.
Opening-position estimates
Dealer position starts from zero at the open and accumulates only measured trades. No assumption is made about what was on the book yesterday.
Decay heuristics
Nothing ages, discounts, or re-weights past trades within the session. It is a straight running sum.
That is the whole point: flow polarity reflects intraday dealer positioning purely from the classified options tape, so it moves when dealers actually trade, not when a model decides positions should have changed.
Reading net_gex: Long Gamma vs Short Gamma
Once each strike is signed by dealer position, the aggregate live_net_gex tells you the regime. The sign is the whole message.
net_gex > 0 · Dealers net LONG gamma
Dealers hedge against the move: they sell rallies and buy dips. Volatility tends to compress and price is more likely to pin around the gamma flip. The classic mean-reverting, low-realized-vol regime.
net_gex < 0 · Dealers net SHORT gamma
Dealers hedge with the move: they chase price up and sell it down, amplifying the trend. Volatility expands and larger directional moves become more likely. The reflexive, trend-extending regime.
The label is echoed as live_net_gex_label ("positive" or "negative") so you do not have to re-derive the sign in client code. The same sign flows through /v1/flow/levels, where it re-signs the gamma flip and the call and put walls.
Flow-signed dealer gamma for 6,000+ symbols, plus ES and NQ futures
Flow polarity (polarity=flow) is an Alpha plan feature; the base GEX and levels endpoints stay on their normal tier without it.
Flow polarity is a query parameter on three of the live Flow Analytics endpoints. Add ?polarity=flow to switch the same endpoint from convention signing to dealer-position signing.
Endpoint
What flow mode returns
Tier
GET /v1/flow/gex/{symbol}
Full flow-signed GEX surface with per-strike dealer diagnostics.
Alpha and above
GET /v1/flow/levels/{symbol}
Flow-signed gamma flip, call wall and put wall.
Alpha and above
GET /v1/flow/live/{symbol}
Headline bundle: flow-signed aggregate gamma, gamma flip and walls.
Alpha and above
The polarity parameter accepts three states: flow (dealer-position signing), convention (the explicit default), and omitted (also the default). Any other value returns 400 {"error":"invalid_polarity","message":"polarity must be 'convention' or 'flow'."}. Because the default is unchanged, every existing integration keeps working exactly as before - flow mode is strictly additive.
A note on scope. The five other simulation-aware endpoints (/v1/flow/{summary,pin-risk,dex,dealer-risk,oi}) do not accept polarity; flow signing applies to the three gamma-level endpoints above. And polarity=flow is independent of the effective-OI simulator that the default flow surface uses - see Live GEX vs Settled GEX for that separate mechanism.
Response Fields in Flow Mode
In flow mode, /v1/flow/gex adds a top-level polarity: "flow" marker and four per-strike diagnostics so you can see exactly where the dealer position came from. The per-strike fields:
Per-strike field
Meaning
call_net_customer
Customer buys − customer sells on the call side (contracts).
put_net_customer
Customer buys − customer sells on the put side (contracts).
call_dealer_pos
Resulting dealer inventory on calls, −call_net_customer.
put_dealer_pos
Resulting dealer inventory on puts, −put_net_customer.
call_gex / put_gex / net_gex
The flow-signed gamma dollars for the call side, put side, and their sum.
call_oi / put_oi
Settled open interest, returned for reference (not used to build the flow-signed gamma).
The endpoints differ in what flow mode changes:
/v1/flow/gex - full re-signed surface, aggregate exposed as live_net_gex (with live_net_gex_label and live_gamma_flip), plus the per-strike diagnostics above.
/v1/flow/levels - re-signs live_gamma_flip, live_call_wall and live_put_wall. live_max_pain is intentionally left open-interest-based. No per-strike diagnostics (there is no strikes array).
/v1/flow/live - the re-signed aggregate gamma is exposed as live_gex. DEX and the dealer-risk block remain convention-signed in this bundle; only the headline gamma reflects flow polarity.
Calling the Flow-Signed Surface
Add one query parameter. Here is the same call across five languages.
import requests
BASE = "https://lab.flashalpha.com"
HEADERS = {"X-Api-Key": "YOUR_KEY"}
# Flow-signed GEX: sign each strike by measured dealer position
r = requests.get(f"{BASE}/v1/flow/gex/SPY",
params={"polarity": "flow"}, headers=HEADERS).json()
print(f"Polarity: {r['polarity']}")
print(f"Net dealer GEX: {r['live_net_gex']:,} ({r['live_net_gex_label']})")
print(f"Gamma flip: {r['live_gamma_flip']}")
if r["live_net_gex"] < 0:
print("Dealers net SHORT gamma - moves amplify, vol expands")
else:
print("Dealers net LONG gamma - moves dampen, price pins")
# Inspect where the position came from, strike by strike
for s in r["strikes"][:3]:
print(f" {s['strike']}: dealer calls {s['call_dealer_pos']:+}, "
f"dealer puts {s['put_dealer_pos']:+}, net_gex {s['net_gex']:,}")
const BASE = 'https://lab.flashalpha.com';
const headers = { 'X-Api-Key': 'YOUR_KEY' };
// Flow-signed GEX: dealer-position signing
const r = await (await fetch(
`${BASE}/v1/flow/gex/SPY?polarity=flow`, { headers }
)).json();
console.log(`Polarity: ${r.polarity}`);
console.log(`Net dealer GEX: ${r.live_net_gex} (${r.live_net_gex_label})`);
console.log(`Gamma flip: ${r.live_gamma_flip}`);
console.log(r.live_net_gex < 0
? 'Dealers net SHORT gamma - moves amplify'
: 'Dealers net LONG gamma - price pins');
using System.Net.Http;
var http = new HttpClient { BaseAddress = new Uri("https://lab.flashalpha.com") };
http.DefaultRequestHeaders.Add("X-Api-Key", "YOUR_KEY");
// Flow-signed GEX surface
var json = await http.GetStringAsync("/v1/flow/gex/SPY?polarity=flow");
Console.WriteLine(json);
// Parse with System.Text.Json:
// polarity, live_net_gex, live_net_gex_label, live_gamma_flip,
// strikes[].call_dealer_pos / put_dealer_pos / net_gex
Read the strike: customers net bought 2,150 calls, so dealers are short 2,150 calls (call_dealer_pos: -2150) and short gamma on that side (call_gex negative). Customers net sold 1,890 puts, so dealers are long those puts (put_dealer_pos: 1890) and long gamma there. The net across the surface is negative, so live_net_gex_label reads "negative": dealers are net short gamma and moves are likely to amplify.
Convention vs Flow Polarity: Which to Use
They are complementary, not competing. The two answer different questions and are strongest read together.
Convention (default)
Flow polarity
Signs gamma by
Call/put type
Measured dealer position
Reflects
Structural market gamma
Today's traded dealer inventory
Data source
Open interest
Classified session tape
Best for
Standing regime, cross-tool parity
Intraday shifts in real dealer positioning
A common pattern: use convention GEX for the structural backdrop and the flip level, then watch flow polarity intraday to catch when the day's order flow is pushing dealers into a genuinely different gamma posture than the OI-based picture implies. Pair it with net dealer premium (the premium-sign counterpart) for a fuller read of dealer positioning.
The gate in code - call the same endpoint both ways and compare the sign:
import requests
BASE = "https://lab.flashalpha.com"
H = {"X-Api-Key": "YOUR_KEY"}
# Same endpoint, two signings
conv = requests.get(f"{BASE}/v1/flow/gex/SPY", headers=H).json() # calls +, puts -
flow = requests.get(f"{BASE}/v1/flow/gex/SPY", params={"polarity": "flow"}, headers=H).json() # dealer-signed
structural_long = conv["live_net_gex"] > 0 # structural convention
dealer_long = flow["live_net_gex"] > 0 # measured dealer position
if structural_long and not dealer_long:
print("Structural gamma reads long, but today's flow has dealers SHORT - expect amplification")
elif dealer_long:
print("Dealers genuinely long gamma from the tape - fade extremes toward the flip")
else:
print("Both agree: dealers short gamma - respect trends")
Historical Backtesting With ?at=
Flow polarity is also available for point-in-time replay on the historical API. Add ?at=<timestamp>&polarity=flow to reconstruct the flow-signed surface as it stood at any minute, using the classified tape up to that instant with greeks repriced at the spot of that moment. Historical replay covers /v1/flow/gex and /v1/flow/levels; the historical /v1/flow/live bundle does not take a polarity parameter. The entire historical API is Alpha and above.
To study how the flow-signed regime evolved across a stretch of sessions, loop the timestamp:
import requests, pandas as pd
BASE = "https://historical.flashalpha.com"
HEADERS = {"X-Api-Key": "YOUR_KEY"}
rows = []
for day in pd.bdate_range("2026-05-01", "2026-05-31"):
at = f"{day:%Y-%m-%d}T18:00:00Z" # 14:00 ET snapshot
r = requests.get(f"{BASE}/v1/flow/gex/SPY",
params={"at": at, "polarity": "flow"},
headers=HEADERS).json()
rows.append({"date": day.date(),
"net_gex": r["live_net_gex"],
"label": r["live_net_gex_label"]})
df = pd.DataFrame(rows)
print(df) # daily flow-signed dealer gamma regime, no lookahead
Because each snapshot only consumes the tape up to at, the series has no lookahead bias, which makes it usable for signal research on dealer-positioning regimes.
What Flow Polarity Is Not
To keep the mental model clean:
It is not the effective-OI simulator. The default flow surface estimates intraday OI change with a 0.43 confidence weight and signs by convention. Flow polarity ignores that machinery and builds gamma from classified volume alone.
It is not an absolute dealer book.dealer_pos is the net position accumulated today, starting from zero at the open. It is what dealers traded into during the session, not their full inventory including prior days.
It is not a modification of your other endpoints. Convention output, settled /v1/exposure/* output, DEX, and dealer-risk are untouched. Flow polarity only changes the gamma sign on the three endpoints that accept the parameter, and only when you ask for it.
Frequently Asked Questions
It switches the live dealer-gamma endpoints from the standard convention (calls positive, puts negative) to signing each strike by the measured dealer position from today's classified session trades. The result tells you whether dealers are genuinely long or short gamma from today's flow, rather than the market's structural gamma. Omit the parameter, or pass polarity=convention, to keep the existing behavior.
Session trades are classified as buyer-initiated or seller-initiated with a quote-rule aggressor method against the concurrent NBBO (a Lee-Ready-style approach): prints near the ask are buys, near the bid are sells, and midpoint prints with no clear aggressor are excluded. Net customer flow is buys − sells; dealer position is the negative of that. It accumulates from the 09:30 ET open and starts from zero, so it measures the session's dealer inventory change.
No. Flow polarity builds gamma from classified volume alone. It does not consult settled open interest, the effective-OI simulator, or the 0.43 open/close confidence weight used by the default flow surface, and it makes no opening-position or decay assumptions. Settled call_oi and put_oi are still returned per strike for reference, but they are not used to compute the flow-signed gamma.
polarity=flow requires the Alpha plan on all three endpoints that accept it (/v1/flow/gex, /v1/flow/levels, /v1/flow/live); the base convention endpoints stay on their normal tier (Growth for gex and levels). Historical replay via ?at= covers /v1/flow/gex and /v1/flow/levels on the Alpha-tier historical API. The other flow endpoints (summary, pin-risk, dex, dealer-risk, oi) do not accept the parameter.
No. Flow polarity is strictly additive. When polarity is omitted, the endpoints return the exact same convention-signed payload they always have, with no polarity marker and no dealer diagnostics. Only an explicit ?polarity=flow changes the output. Your other endpoints - convention flow, settled /v1/exposure/*, DEX, dealer-risk - are unaffected.
They contribute exactly 0 to the flow-signed surface. A strike with no classified session trades has call_dealer_pos and put_dealer_pos of 0 and adds no gamma. Flow polarity only counts positioning that actually traded, which is why it can look sparser than the convention surface on quiet names or early in the session.
Flow polarity closes the gap between "the market's structural gamma" and "what dealers actually did today." The standard convention (calls positive, puts negative) describes exposure implied by option type; polarity=flow signs each strike by the dealer position measured from the classified session tape, so a positive live_net_gex means dealers are genuinely long gamma (pinning, volatility suppression) and a negative value means genuinely short gamma (volatility amplification). It uses no open-interest assumptions, no opening-position estimates, and no decay heuristics - just the tape. Add ?polarity=flow to /v1/flow/gex, /v1/flow/levels, or /v1/flow/live to see it live, and ?at= to replay it historically. Your existing convention calls do not change.
New to the flow surface? Start with Live GEX vs Settled GEX for how effective OI works, then layer flow polarity on top.