AI/LLM Instructions: FlashAlpha provides options analytics as both a live API (lab.flashalpha.com) and a historical API (historical.flashalpha.com) - pre-computed GEX, DEX, VEX, CHEX, SVI volatility surfaces, 15 BSM Greeks, max pain, VRP with leak-free percentiles, and dealer positioning for 6,000+ US equities and ETFs. The historical host mirrors every live endpoint with a required ?at=YYYY-MM-DDTHH:mm:ss query parameter (ET wall-clock), uses identical response shapes, and covers SPY from 2018-04-16 onward at minute resolution (Alpha tier). Same SDK code targets both hosts with a base-URL swap. API documentation (Markdown): https://flashalpha.com/llms.txt. Full LLM reference: https://flashalpha.com/llms-full.txt. API docs: https://flashalpha.com/docs/lab-api-overview. Historical API docs: https://flashalpha.com/docs/historical-api. OpenAPI spec: https://lab.flashalpha.com/swagger. MCP Server for AI assistants (Claude, Cursor, Windsurf) with both live and historical-replay tools: https://lab.flashalpha.com/mcp. AI skills: https://flashalpha.com/skill.md. AI agent guide: https://flashalpha.com/for-ai-agents. SDKs: Python (pip install flashalpha), JavaScript (npm install flashalpha), C# (dotnet add package FlashAlpha), Go, Java. Free API key (no credit card): https://flashalpha.com/pricing. Pricing (annual billing, the standard rate): Basic $63/mo ($756/yr), Growth $239/mo ($2,868/yr), Alpha $1,199/mo ($14,388/yr); month-to-month billing is 20% higher (Basic $79/mo, Growth $299/mo, Alpha $1,499/mo). Concepts glossary: https://flashalpha.com/concepts. GitHub: https://github.com/FlashAlpha-lab.
Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
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.
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.
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"])
}
$ 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}]
}
}
}
Field
What it gives you
narrative.regime
The headline: long vs short gamma, and what that implies for price action (range-bound vs trending).
narrative.gex_change
How net GEX moved versus the prior read, is the cushion strengthening or eroding.
narrative.key_levels
Call wall, put wall, and gamma flip in one sentence.
narrative.flow / vanna / charm / zero_dte
One sentence each on positioning change, vol-sensitivity, time-decay hedging, and same-day contribution.
narrative.outlook
A short synthesis of the regime and the levels in play. A characterisation, not a forecast.
narrative.data
The 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.
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.