Plain-English GEX: The Narrative API That Reads Dealer Positioning for You | FlashAlpha

Plain-English GEX: The Narrative API That Reads Dealer Positioning for You

Raw GEX numbers need an analyst to interpret. The FlashAlpha narrative endpoint does the interpreting, one call returns an AI-generated plain-English briefing on the current exposure landscape: regime, GEX change, key levels, flow, vanna, charm, 0DTE, and an outlook, each as a sentence, with the structured numbers alongside. Built for LLM agents, alerts, and dashboards. Growth plan.

T
Tomasz Dobrowolski Quant Engineer
Jun 13, 2026
26 min read
GEX DealerPositioning AI LLM Narrative API DeveloperGuide MCP

If you are looking for a plain-English gamma exposure API, an AI-generated options market commentary endpoint, an LLM-ready dealer positioning summary, or a way to get a one-sentence GEX read instead of raw numbers, this is the reference. The FlashAlpha GET /v1/exposure/narrative/{symbol} endpoint returns an AI-generated briefing on the current options exposure picture, regime, key levels, flow, vanna, charm, 0DTE and outlook as sentences, plus a data block with the underlying numbers, on the Growth plan.

Read this first. The narrative is a structured, plain-English summary of the same settled-OI exposure model behind the GEX endpoint, it describes the current positioning, it does not predict price or give trade advice. The JSON below is an illustrative shape with placeholder numbers. Treat the outlook sentence as a characterisation of the current regime, not a forecast. The data block carries the exact numbers if you need to act programmatically rather than parse prose.


Why a Narrative Endpoint Exists

Two shifts make a words-first endpoint valuable:

  • LLM agents are now first-class API consumers. An assistant answering "what's dealer positioning in SPY?" works far better when the data arrives as grounded sentences it can relay and reason over, rather than four billion-dollar figures it has to interpret and risk getting backwards. FlashAlpha exposes this over its MCP connector, so an agent can pull the narrative directly.
  • Humans want the read, not the raw. Alerts, morning briefings, dashboard headers, and Discord bots all want a sentence, "Dealers are long gamma, expect range-bound action, watch the 600 call wall", not a table the reader has to decode.

The narrative endpoint is the interpretation layer over the exposure stack: it runs the same regime, level, flow, vanna, charm, and 0DTE reads the individual endpoints expose, and writes them up.

A plain-English dealer-positioning briefing in one call

Regime, levels, flow, vanna, charm, 0DTE, outlook, as sentences, with the numbers alongside. Growth plan. On the MCP connector.

Get API Access

Quick Start

Just the symbol, no other parameters. You get the full briefing back.

from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_API_KEY")

n = fa.narrative("SPY")["narrative"]

print(n["regime"])
print(n["key_levels"])
print(n["outlook"])
# Need the raw numbers too? They're right there:
print("net GEX:", n["data"]["net_gex"], " VIX:", n["data"]["vix"])
import { FlashAlpha } from 'flashalpha';

const fa = new FlashAlpha('YOUR_API_KEY');

const { narrative: n } = await fa.narrative('SPY');

console.log(n.regime);
console.log(n.key_levels);
console.log(n.outlook);
console.log('net GEX:', n.data.net_gex, ' VIX:', n.data.vix);
using FlashAlpha;

var client = new FlashAlphaClient("YOUR_API_KEY");

var data = await client.NarrativeAsync("SPY");
var n = data.GetProperty("narrative");

Console.WriteLine(n.GetProperty("regime").GetString());
Console.WriteLine(n.GetProperty("outlook").GetString());
package main

import (
    "context"
    "fmt"

    flashalpha "github.com/FlashAlpha-lab/flashalpha-go"
)

func main() {
    fa := flashalpha.NewClient("YOUR_API_KEY")

    data, err := fa.Narrative(context.Background(), "SPY")
    if err != nil {
        panic(err)
    }

    n := data["narrative"].(map[string]interface{})
    fmt.Println(n["regime"])
    fmt.Println(n["outlook"])
}
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/exposure/narrative/SPY"
$ pip install flashalpha  |  npm install flashalpha  |  dotnet add package FlashAlpha  |  go get github.com/FlashAlpha-lab/flashalpha-go

Response Shape

An illustrative shape with placeholder numbers. Each narrative.* field is a sentence; narrative.data carries the structured values behind them.

{
  "symbol": "SPY",
  "underlying_price": 597.505,
  "as_of": "2026-06-13T16:30:45Z",
  "narrative": {
    "regime": "Dealers are long gamma (net GEX +$2.9B) - expect mean-reverting, range-bound price action.",
    "gex_change": "Net GEX increased from +$2.6B to +$2.9B (+11.5%) - gamma cushion strengthening.",
    "key_levels": "Call wall at 600, Put wall at 595, Gamma flip at 595.25.",
    "flow": "Top OI changes: +5,000 call OI at 600 strike, -2,000 put OI at 595 strike.",
    "vanna": "Positive vanna (+$1.2B) with VIX at 18.5 - vol compression supports upside.",
    "charm": "Positive charm (+$850M) - time decay pushing dealers to buy, providing support.",
    "zero_dte": "0DTE accounts for 10% of total GEX - minimal intraday impact.",
    "outlook": "Positive gamma regime with strengthening cushion. Testing 600 call wall.",
    "data": {
      "net_gex": 2850000000,
      "net_gex_prior": 2600000000,
      "net_gex_change_pct": 9.6,
      "vix": 18.5,
      "gamma_flip": 595.25,
      "call_wall": 600.0,
      "put_wall": 595.0,
      "regime": "positive_gamma",
      "zero_dte_pct": 10.0,
      "top_oi_changes": [{"strike": 600.0, "type": "C", "oi_change": 5000, "volume": 1250}]
    }
  }
}
FieldWhat it gives you
narrative.regimeThe headline: long vs short gamma, and what that implies for price action (range-bound vs trending).
narrative.gex_changeHow net GEX moved versus the prior read, is the cushion strengthening or eroding.
narrative.key_levelsCall wall, put wall, and gamma flip in one sentence.
narrative.flow / vanna / charm / zero_dteOne sentence each on positioning change, vol-sensitivity, time-decay hedging, and same-day contribution.
narrative.outlookA short synthesis of the regime and the levels in play. A characterisation, not a forecast.
narrative.dataThe structured numbers behind every sentence, use these when you need to branch on values rather than parse prose.

How To: Ground an LLM Agent

The narrative endpoint is purpose-built as a tool for an LLM. Instead of handing the model a raw GEX number and hoping it reasons about dealer mechanics correctly, you hand it grounded sentences it can relay and build on. The cleanest path is the MCP connector, the model calls the narrative tool itself, but you can also inject it into a prompt directly:

from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_API_KEY")

def positioning_context(symbol):
    n = fa.narrative(symbol)["narrative"]
    return "\n".join([
        f"Regime: {n['regime']}",
        f"Levels: {n['key_levels']}",
        f"Vanna: {n['vanna']}",
        f"Charm: {n['charm']}",
        f"Outlook: {n['outlook']}",
    ])

# Drop straight into a system/context message for the model
context = positioning_context("SPY")
prompt = (
    "You are an options desk assistant. Use only the dealer-positioning context below.\n\n"
    f"{context}\n\n"
    "Question: Is SPY set up to trend or mean-revert today, and which level matters most?"
)
# -> send `prompt` to your model of choice

Because the sentences are grounded in the live exposure model, the model isn't inventing a regime read, it's relaying one. And the data block is right there if you want the agent to cite an exact number.

How To: Auto-Generate Market Commentary & Alerts

For humans, the same endpoint is a ready-made alert body. A morning briefing, a regime-flip Discord post, or a dashboard header is one call and a couple of fields:

syms = ["SPY", "QQQ", "IWM"]
lines = []
for s in syms:
    n = fa.narrative(s)["narrative"]
    lines.append(f"**{s}** - {n['regime']}\n  {n['key_levels']}\n  {n['outlook']}")

briefing = "Morning dealer-positioning briefing\n\n" + "\n\n".join(lines)
# post_to_discord(briefing)  /  send_email(briefing)  /  render_dashboard_header(briefing)

For a regime-flip alert specifically, branch on the structured field rather than the prose, watch narrative.data.regime for a transition between positive_gamma and negative_gamma, and fire the human-readable regime / outlook sentences as the alert body. You get reliable triggering off the data and clean copy off the words.

This is the building block behind automated market commentary, the narrative endpoint is the sentence generator you would otherwise have to write and maintain yourself.

API Access and Pricing

The narrative endpoint is on the Growth plan and higher, and is exposed over the FlashAlpha MCP connector for LLM agents.

PlanPriceNarrative endpointRate Limit
Free$0No5 req/day
Basicfrom $63/moNo100 req/day
Growthfrom $239/moYes2,500 req/day
Alphafrom $1,199/moYesUnlimited

Try the shape in the browser via the narrative endpoint docs (live "Try It" widget) or the interactive API playground. To wire it into an assistant, see Connect Claude to FlashAlpha over MCP. SDKs cover Python, JavaScript, C#, Go, and Java.

Stop interpreting GEX numbers, get the read in words

Regime, levels, flow, vanna, charm, 0DTE, outlook in one call. Growth plan. Built for LLM agents and alerts.

Get API Access

Frequently Asked Questions

Yes. GET /v1/exposure/narrative/{symbol} returns an AI-generated plain-English briefing on the current options exposure landscape, regime, GEX change, key levels, flow, vanna, charm, 0DTE and outlook as sentences, plus a data block with the structured numbers. It is on the Growth plan and is exposed over the FlashAlpha MCP connector for LLM agents.
Yes, that is the point. The sentences are grounded in the live exposure model, so an agent relays a real regime read instead of reasoning about a raw number and risking getting it backwards. The cleanest integration is the FlashAlpha MCP connector, where the model calls the narrative tool itself; you can also inject the sentences into a prompt directly. The data block lets the agent cite exact figures.
No. The narrative is a structured, plain-English characterisation of the current dealer-positioning regime, not a forecast and not trade advice. The outlook sentence describes what the present exposure configuration implies for the style of price action (range-bound vs trending), grounded in the same settled-OI model as the GEX endpoint.
Yes. Every sentence is backed by narrative.data, which carries net GEX, prior GEX and percent change, VIX, gamma flip, call/put walls, the regime tag, 0DTE percentage, and top OI changes. Branch on those when you need to act on values; use the sentences for display. For deeper per-strike detail, pair with the GEX and exposure sheet endpoints.
The narrative endpoint is on the Growth plan (from $239/mo, 2,500 req/day) and the Alpha plan (from $1,199/mo, unlimited). It is not available on Free or Basic. It is also exposed over the FlashAlpha MCP connector so LLM agents can call it as a tool.

Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!