Theta Vantage provides a REST API for programmatic access to options analytics. Live market data uses one tools catalog (GET /api/v1/tools + GET|POST /api/v1/tools/{name}) — the same executors as remote MCP and in-app Athena. Historical heatmaps, the daily report, and chat stay on dedicated REST routes.
Authentication
All API requests require an API key. Generate one from your Account Settings page (PRO tiers only).
Method 1: Header Authentication (Recommended)
Include your key in every request using the X-API-Key header:
curl -H "X-API-Key: tvk_YOUR_KEY_HERE" \
"https://thetavantage.com/api/v1/status"
Method 2: Query Parameter Authentication
Alternatively, pass it as a query parameter api_key:
curl "https://thetavantage.com/api/v1/status?api_key=tvk_YOUR_KEY_HERE"
Note: Both methods work identically. Query parameters are useful for browser testing or when HTTP headers are difficult to set. Header authentication is recommended for production applications.
Rate Limits
- 60 requests per minute per API key (sliding window) across the data endpoints (status, tools, historical heatmap)
- 15 requests per minute for heavy tools (
get_fundamentals,get_earnings_calendar,get_iv_rank,get_wheel_strategy,get_income_projections,search_x_discourse) in themcp-heavybucket — the same cadence as chat - 15 requests per minute for
POST /api/v1/chat, tracked in its own bucket — chat and data limits are independent - Rate limit headers are included in every response:
X-RateLimit-Limit— the limit that applies to this endpointX-RateLimit-Remaining— requests left in the current windowX-RateLimit-Reset— seconds until the window resets
Base URL
https://thetavantage.com/api/v1
Status
Test your API key and check connectivity.
GET /api/v1/status
Example (Header):
curl -H "X-API-Key: tvk_YOUR_KEY" https://thetavantage.com/api/v1/status
Example (Query Parameter):
curl "https://thetavantage.com/api/v1/status?api_key=tvk_YOUR_KEY"
Response:
{
"status": "ok",
"api_version": "v1",
"user": {
"email": "[email protected]",
"name": "Your Name",
"tier": "pro"
},
"rateLimit": { "limit": 60 },
"timestamp": "2026-02-14T19:00:00.000Z"
}
Response fields:
| Field | Type | Description |
|---|---|---|
status | string | Always "ok" when the key is valid |
api_version | string | API version string ("v1") |
user.email | string | Account email for the key |
user.name | string|null | Display name on the account |
user.tier | string | Subscription tier (e.g. pro, admin) |
rateLimit.limit | number | Data-endpoint rate limit (requests per minute) |
timestamp | string | ISO 8601 timestamp |
Tools catalog
Lists the same gateway data tools as MCP tools/list and Athena chat. Chat and report are not in this catalog.
GET /api/v1/tools
Example:
curl -H "X-API-Key: tvk_YOUR_KEY" https://thetavantage.com/api/v1/tools
Response: { "ok": true, "tools": [ { "name", "description", "parameters" } ], "timestamp" }
Live schemas come from the gateway. If the catalog is unreachable, the static snapshot is returned.
Tool execute
Runs one catalog tool. Query string (GET) or JSON body (POST) becomes execute arguments. Booleans, numbers, and JSON arrays/objects in the query string are coerced. Skip api_key — it is only for auth.
GET /api/v1/tools/{name}?symbol=SPY&…
POST /api/v1/tools/{name}
Examples:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/tools/get_greek_exposure?symbol=SPY&greek=gamma"
curl -X POST "https://thetavantage.com/api/v1/tools/get_stock_quote" \
-H "X-API-Key: tvk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"symbol":"SPY"}'
Success: { "ok": true, "tool": "get_greek_exposure", "data": { … }, "timestamp" }
data is the parsed gateway result string (JSON object, or { "text": "…" } if the result is not JSON).
Errors: UNKNOWN_TOOL (404), TOOL_ERROR (400), TOOL_TIMEOUT (504), RATE_LIMIT_EXCEEDED (429), INVALID_API_KEY (401), INSUFFICIENT_TIER (403), GATEWAY_ERROR / GATEWAY_UNAVAILABLE (502).
What replaced GEX / DEX / VEX / charm / live heatmap
| Old REST path | Use instead |
|---|---|
GET /api/v1/gex | get_greek_exposure with greek=gamma |
GET /api/v1/vex | get_greek_exposure with greek=vanna |
GET /api/v1/charm | get_greek_exposure with greek=charm |
GET /api/v1/dex | get_greek_heatmap with greek=delta |
GET /api/v1/gamma-profile | get_gamma_profile |
GET /api/v1/key-levels | get_key_levels |
GET /api/v1/max-pain | get_max_pain |
GET /api/v1/heatmap (live) | get_greek_heatmap (greek=gamma|vanna|delta) |
Historical heatmaps remain on REST below. Chat and report remain on /api/v1/chat and /api/v1/report.
The catalog includes quotes, chains, flow, tide, history, fundamentals, news, IV rank, indicators, strategies, and X search. See MCP for the full tool table. Heavy tools share the 15/min mcp-heavy bucket.
Historical Heatmap
Returns a strike × expiration Greek exposure grid for a past trading date, using the same data pipeline as the Greek Heatmap playback feature. Historical option chains are fetched from the gateway, spot prices come from daily bars, and GEX/VEX/DEX are computed server-side. Live heatmaps use get_greek_heatmap on the tools catalog; this route is the historical export.
Note:
trade_datemust be a market session (weekday that is not a US equity holiday). Weekends and holidays return404 NO_DATA(e.g. Memorial Day 2026 is2026-05-25).
GET /api/v1/heatmap/historical?symbol=AAPL&trade_date=2026-05-26
| Parameter | Required | Default | Description |
|---|---|---|---|
symbol | Yes | — | Ticker symbol |
trade_date | Yes | — | Trading date in YYYY-MM-DD format (date alias also accepted). Must be a session day. |
greek | No | gamma | Greek type: gamma, vanna, or delta |
range | No | 0.10 | Price range as a fraction (e.g. 0.05 = ±5% from spot) |
expiration | No | all | Filter to a single expiration (YYYY-MM-DD) |
expiration_dates | No | all | Comma-separated expiration filters (expirations alias also accepted) |
expiration_date_gte | No | — | Minimum expiration date filter (YYYY-MM-DD) |
expiration_date_lte | No | — | Maximum expiration date filter (YYYY-MM-DD) |
Example (Header):
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/heatmap/historical?symbol=AAPL&trade_date=2026-05-26&greek=gamma&range=0.10"
Example with expiration range:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/heatmap/historical?symbol=AAPL&trade_date=2026-05-26&expiration_date_gte=2026-05-26&expiration_date_lte=2026-05-29"
Response fields: A strike × expiration grid with symbol, greek, current_price, range, summary (totals, top cells), expirations, strikes, and grid cells (strike, expiration, gex, vex, dex, display_value, volumes, has_data), plus:
| Field | Type | Description |
|---|---|---|
trade_date | string | The trading date requested |
current_price | number | Spot close on that trading date |
summary.cache | object | Options/bars cache hit metadata for the request (single-date endpoint only; the batch endpoint exposes cache stats at the top-level summary instead) |
Historical Heatmap (Batch)
Load multiple trading dates in one request. Each date maps to a heatmap response or null when no options data exists for that session (weekends, holidays, or missing history).
GET /api/v1/heatmap/historical/batch?symbol=AAPL&trade_dates=2026-05-26,2026-05-27,2026-05-28
| Parameter | Required | Default | Description |
|---|---|---|---|
symbol | Yes | — | Ticker symbol |
trade_dates | Yes | — | Comma-separated trading dates (YYYY-MM-DD). Max 30 dates. (dates alias also accepted) |
greek | No | gamma | Greek type: gamma, vanna, or delta |
range | No | 0.10 | Price range as a fraction |
expiration | No | all | Filter to a single expiration (YYYY-MM-DD) |
expiration_dates | No | all | Comma-separated expiration filters |
expiration_date_gte | No | — | Minimum expiration date filter |
expiration_date_lte | No | — | Maximum expiration date filter |
Example:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/heatmap/historical/batch?symbol=AAPL&trade_dates=2026-05-26,2026-05-27,2026-05-28,2026-05-29"
Response fields:
| Field | Type | Description |
|---|---|---|
symbol | string | Ticker |
greek | string | Greek type used |
range | number | Price range fraction |
results | object | Map of trade_date → full heatmap object or null |
summary.total_dates | number | Number of dates requested |
summary.dates_with_data | number | Dates that returned a non-null heatmap |
summary.options_cache_hits | number | Cached historical options fetches |
summary.options_cache_misses | number | Fresh historical options fetches |
summary.bars_cache_hits | number | Cached bar fetches |
summary.bars_cache_misses | number | Fresh bar fetches |
timestamp | string | ISO 8601 timestamp |
Each non-null value under results is a complete historical heatmap object (grid + summary), plus trade_date and current_price on the object itself. The map key always matches trade_date. Dates with no options data or no usable spot price are null. Per-entry heatmaps do not include summary.cache; cache metadata is aggregated in the batch-level summary above.
Example response (truncated):
{
"symbol": "AAPL",
"greek": "gamma",
"range": 0.1,
"results": {
"2026-05-26": {
"symbol": "AAPL",
"greek": "gamma",
"trade_date": "2026-05-26",
"current_price": 198.42,
"range": 0.1,
"strikes": [195, 200, 205],
"expirations": ["2026-05-30", "2026-06-06"],
"grid": [
{
"strike": 200,
"expiration": "2026-05-30",
"gex": 1250000,
"vex": 0,
"dex": 0,
"display_value": 1250000,
"call_volume": 4200,
"put_volume": 3100,
"total_volume": 7300,
"has_data": true
}
],
"summary": {
"total_exposure": 4500000,
"max_cell_exposure": 1250000,
"total_volume": 18200,
"strikes_count": 12,
"expirations_count": 2,
"cells_count": 24
},
"timestamp": "2026-06-14T12:00:00.000Z"
},
"2026-05-25": null
},
"summary": {
"total_dates": 2,
"dates_with_data": 1,
"options_cache_hits": 1,
"options_cache_misses": 1,
"bars_cache_hits": 2,
"bars_cache_misses": 0
},
"timestamp": "2026-06-14T12:00:00.000Z"
}
Daily Report
Returns an AI-generated daily trading report with mode assessment, positioning guidance, alert levels, scenario pathing, strategist's narrative, multi-timeframe technical analysis, and a social-ready formatted text. The endpoint fetches live options and quote data, calculates key levels, then generates the report via AI.
Note: Response time is typically 5–15 seconds due to AI generation.
GET /api/v1/report?symbol=SPY
| Parameter | Required | Default | Description |
|---|---|---|---|
symbol | Yes | — | Ticker symbol (e.g. SPY, AAPL, QQQ) |
expiration | No | nearest weekly | Filter key levels to a specific expiration (YYYY-MM-DD) |
Example (Header):
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/report?symbol=SPY"
Example (Query Parameter):
curl "https://thetavantage.com/api/v1/report?symbol=SPY&api_key=tvk_YOUR_KEY"
Response fields:
| Field | Type | Description |
|---|---|---|
symbol | string | Ticker |
price | object | Full price snapshot (see below) |
expiration | string | Expiration used for key level calculations |
report | object | AI-generated report (see below) |
key_levels | object | Options-derived key levels (see below) |
timeframe_analysis | object|null | Multi-timeframe technical indicators (see below). Null if indicators unavailable. |
formatted_text | string | Social-ready formatted text (same as the copy-to-clipboard output) |
timestamp | string | ISO 8601 timestamp |
price object:
| Field | Type | Description |
|---|---|---|
current | number | Current spot price |
change | number | Dollar change from previous close |
change_percent | number | Percentage change from previous close |
previous_close | number | Previous closing price |
open | number | Today's open price |
high | number | Today's high |
low | number | Today's low |
volume | number | Today's volume |
report object:
| Field | Type | Description |
|---|---|---|
mode | string | Trading mode: green, yellow, yellow-improving, yellow-deteriorating, red |
modeLabel | string | Human-readable mode label (e.g. "YELLOW (Improving)") |
modeRationale | string | One-line explanation for the mode |
tiers | object | 4-tier signal breakdown: tier1Regime, tier2Trend, tier3Timing, tier4Flow (each green/yellow/red) |
dashboard | object | One-line signal summaries: regime, trend, timing, flow |
narrative | object | headline, story, keyWatch, invalidation |
positioning | object | stance, stanceRationale, dailyCapPercent, dailyCapRationale, perTradeGuidance |
alertLevels | array | Price levels sorted descending: price, level, type (trim/breakout/current/nibble/eject), action, tier |
scenarios | object | bull, base, bear — each with probability, trigger, target, action (probabilities sum to 100) |
optionsStatus | string | active, watching, avoid, or no_signal |
gammaRegime | string | positive or negative |
gammaContext | string | Explanation of current gamma environment |
masterEjectLevel | number | Exit-all price level |
upgradeConditions | array | Conditions that would upgrade the mode |
downgradeConditions | array | Conditions that would downgrade the mode |
key_levels object:
| Field | Type | Description |
|---|---|---|
call_wall | number | Highest call OI strike (resistance) |
put_wall | number | Highest put OI strike (support) |
hedge_wall | number | Dealer hedging flip point |
max_pain | number | Minimum total option pain strike |
key_gamma_strike | number | Zero gamma crossing point |
expected_move | object | upper, lower, percent |
days_to_expiration | number | DTE for the expiration used |
timeframe_analysis object (null if unavailable):
| Field | Type | Description |
|---|---|---|
timeframes | array | Per-timeframe technical analysis (Monthly, Weekly, Daily, 4H, 1H) |
alignment | object | Overall alignment status across all timeframes |
Each item in timeframes:
| Field | Type | Description |
|---|---|---|
timeframe | string | Label (e.g. "Monthly", "Weekly", "Daily", "4H", "1H") |
interval | string | Interval type for lookups |
bx_trender | object | BX-Trender regime and momentum: trend, signal ("buy"/"sell"/null), long_term, short_term |
rsi | object | RSI: value (0-100 or null), status ("overbought"/"oversold"/"neutral") |
smi | object | SMI: value, signal, crossover ("bullish_cross"/"bearish_cross"/"none"), zone ("above_zero"/"below_zero") |
structure | object | Market structure: pattern (description), trend ("bullish"/"bearish"/"neutral") |
ema | object | EMA analysis: status ("above"/"below"/"between"), description |
verdict | object | Overall verdict: bias ("bullish"/"bearish"/"neutral"), strength ("strong"/"moderate"/"weak") |
alignment object:
| Field | Type | Description |
|---|---|---|
isAligned | boolean | Whether all timeframes agree |
bias | string | Overall bias: "bullish", "bearish", "mixed", or "neutral" |
bullishCount | number | Number of bullish timeframes |
bearishCount | number | Number of bearish timeframes |
summary | string | Human-readable alignment summary |
Example response (truncated):
{
"symbol": "SPY",
"price": {
"current": 598.23,
"change": 2.15,
"change_percent": 0.36,
"previous_close": 596.08,
"open": 596.50,
"high": 599.00,
"low": 595.80,
"volume": 45230000
},
"expiration": "2026-02-21",
"report": {
"mode": "yellow-improving",
"modeLabel": "YELLOW (Improving)",
"modeRationale": "Daily leading weekly recovery, but weekly trend still red.",
"narrative": {
"headline": "Gamma flip at $600 is the key pivot today.",
"story": "Price is consolidating just below the key gamma strike...",
"keyWatch": "$600 gamma strike",
"invalidation": "Close below $593"
},
"scenarios": {
"bull": { "probability": 30, "trigger": "Break above $600", "target": "$605", "action": "Add to longs" },
"base": { "probability": 50, "trigger": "Chop $595-600", "target": "$597.50", "action": "Hold" },
"bear": { "probability": 20, "trigger": "Lose $593", "target": "$588", "action": "Cut longs" }
},
"alertLevels": [
{ "price": 605, "level": "Call Wall", "type": "trim", "action": "Take 50% off", "tier": "T1" }
]
},
"key_levels": {
"call_wall": 605.00,
"put_wall": 593.00,
"hedge_wall": 597.00,
"max_pain": 597.00,
"key_gamma_strike": 600.00,
"expected_move": { "upper": 604.50, "lower": 591.50, "percent": 1.08 },
"days_to_expiration": 5
},
"timeframe_analysis": {
"timeframes": [
{
"timeframe": "Daily",
"interval": "daily",
"bx_trender": { "trend": "bullish", "signal": "buy", "long_term": 18.4, "short_term": 7.2 },
"rsi": { "value": 55.2, "status": "neutral" },
"smi": { "value": 12.5, "signal": 8.3, "crossover": "bullish_cross", "zone": "above_zero" },
"structure": { "pattern": "Higher Highs / Higher Lows", "trend": "bullish" },
"ema": { "status": "above", "description": "Price above 8/21/55 EMA" },
"verdict": { "bias": "bullish", "strength": "moderate" }
}
],
"alignment": {
"isAligned": false,
"bias": "mixed",
"bullishCount": 3,
"bearishCount": 2,
"summary": "3/5 timeframes bullish"
}
},
"formatted_text": "$SPY ▫️ $598.23 (+0.36%)\n🟡 YELLOW (Improving)\n\nGamma flip at $600 is the key pivot today.\n...",
"timestamp": "2026-02-14T19:00:00.000Z"
}
AI Chat
Ask natural-language questions about the options market and get answers grounded in live Theta Vantage data. Behind the scenes the assistant decides which data it needs and pulls it — quotes, option chain, Greek exposure, market tide, options flow, IV rank, max pain, technical indicators, key levels, fundamentals, news, and price history — before answering. The tools_used field tells you which data sources were consulted.
This is the only POST endpoint in the API, and it is the only one that accepts a JSON request body.
Note: Response time is typically 5–30 seconds depending on how much data the assistant pulls. Responses are not streamed — the full answer is returned at once.
POST /api/v1/chat
Rate limit: 15 requests per minute per API key, tracked in a separate bucket from the 60/min data endpoints — chat usage does not consume your data endpoint allowance, and vice versa. The X-RateLimit-* headers on a chat response reflect the chat bucket.
Request body:
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Your question (max 4,000 characters) |
symbol | string | No | Ticker to focus the answer on (e.g. SPY). Helps the assistant pick the right data without you naming it in the prompt. |
history | array | No | Prior turns for a multi-turn conversation: [{ "role": "user" | "assistant", "content": "…" }]. The last 20 messages are used; other roles are ignored. |
Example (Header):
curl -X POST "https://thetavantage.com/api/v1/chat" \
-H "X-API-Key: tvk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "What is the current SPY market tide and does it support a bullish stance?",
"symbol": "SPY"
}'
Example (multi-turn):
curl -X POST "https://thetavantage.com/api/v1/chat" \
-H "X-API-Key: tvk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "And where is the call wall?",
"symbol": "SPY",
"history": [
{ "role": "user", "content": "What is the SPY gamma environment?" },
{ "role": "assistant", "content": "SPY is in positive gamma above 598..." }
]
}'
Response fields:
| Field | Type | Description |
|---|---|---|
response | string | The assistant's answer (Markdown) |
model | string | Model that generated the answer |
tools_used | array | Distinct data tools the assistant called, in call order (empty if it answered without pulling data) |
usage | object|null | prompt_tokens, completion_tokens |
timestamp | string | ISO 8601 timestamp |
Response:
{
"response": "SPY's market tide is net positive today — call premium is leading put premium by roughly 2:1 into the afternoon...",
"model": "grok-4-fast",
"tools_used": ["get_market_tide", "get_stock_quote"],
"usage": { "prompt_tokens": 2418, "completion_tokens": 386 },
"timestamp": "2026-02-14T19:00:00.000Z"
}
Endpoint-specific errors:
| Status | Error Code | Description |
|---|---|---|
| 400 | MISSING_PARAMETER | prompt was empty or not provided |
| 400 | INVALID_PARAMETER | Body was not valid JSON, or prompt exceeded 4,000 characters |
| 405 | Method not allowed | Only POST is supported on this endpoint |
| 502 | AI_SERVICE_ERROR | AI service returned an error |
| 504 | AI_TIMEOUT | AI generation exceeded the timeout — retry |
Error Responses
All endpoints return errors in a consistent format:
{
"error": "ERROR_CODE",
"message": "Human-readable description of the error."
}
| Status | Error Code | Description |
|---|---|---|
| 400 | MISSING_PARAMETER | Required parameter not provided |
| 400 | INVALID_PARAMETER | Parameter value is invalid |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key is valid but tier is insufficient (FREE tier) |
| 404 | SYMBOL_NOT_FOUND | Symbol does not exist or has no options data |
| 404 | NO_DATA | No data available for the given parameters |
| 429 | RATE_LIMITED | Rate limit exceeded — wait and retry |
| 502 | UPSTREAM_ERROR | Gateway or data provider error |
| 502 | AI_PARSE_ERROR | AI returned an unparseable response (retry) |
| 503 | SERVICE_UNAVAILABLE | AI service is not configured |
Quick Start
- Generate an API key from your Account Settings page (requires PRO tier)
- Test connectivity with the status endpoint:
curl -H "X-API-Key: tvk_YOUR_KEY" https://thetavantage.com/api/v1/status
- List tools, then execute one:
curl -H "X-API-Key: tvk_YOUR_KEY" https://thetavantage.com/api/v1/tools
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/tools/get_greek_exposure?symbol=SPY&greek=gamma"
- Get key levels for trading decisions:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/tools/get_key_levels?symbol=AAPL"
- Live strike×expiration heatmap via the catalog:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/tools/get_greek_heatmap?symbol=QQQ&greek=gamma&range=0.05"
- Load historical GEX by expiration for a past trading date:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/heatmap/historical?symbol=AAPL&trade_date=2026-05-26"
- Generate a daily report with AI analysis:
curl -H "X-API-Key: tvk_YOUR_KEY" \
"https://thetavantage.com/api/v1/report?symbol=SPY"
- Ask the AI assistant a question grounded in live data:
curl -X POST "https://thetavantage.com/api/v1/chat" \
-H "X-API-Key: tvk_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"prompt":"Is SPY gamma positive or negative right now?","symbol":"SPY"}'
All responses include a
timestampfield in ISO 8601 format. Data is live during market hours and cached briefly outside trading sessions.
Use Cases & Integrations
The Theta Vantage API returns standard JSON over HTTPS, making it easy to integrate with any language, framework, or platform.
AI Agents & LLM Tools
Feed real-time Greek exposure and key level data directly into AI agent frameworks:
- OpenClaw — Register Theta Vantage endpoints as tools for autonomous trading agents. Give your agent real-time GEX, key levels, and gamma profile data to make informed decisions.
- LangChain / LangGraph — Build custom tools that call the API and return structured market data to your LLM chains. Example: a tool that fetches key levels and gamma environment before generating a trade thesis.
- CrewAI — Equip your market analyst agents with live Greek exposure data. A "Risk Analyst" agent can monitor gamma profile shifts while a "Strategist" agent acts on key level changes.
- OpenAI Function Calling / GPTs — Define API endpoints as functions for ChatGPT or custom GPTs to call. Users can ask natural language questions like "What's the GEX picture for SPY right now?" and get live data.
- Claude / Cursor MCP (Model Context Protocol) — Connect the remote MCP server with a Pro
tvk_key. Same tools catalog as/api/v1/tools: MCP. Chat and daily report are REST-only and are not MCP tools.
Example: OpenClaw tool definition
@tool("get_gamma_exposure")
def get_gex(symbol: str) -> dict:
"""Fetch real-time gamma exposure data for a stock symbol."""
response = requests.get(
f"https://thetavantage.com/api/v1/tools/get_greek_exposure?symbol={symbol}&greek=gamma",
headers={"X-API-Key": os.environ["TV_API_KEY"]}
)
return response.json()
Custom Dashboards & Alerts
- Grafana / Datadog — Poll endpoints on a schedule and visualize GEX trends, key level movements, and gamma profile shifts over time.
- Google Sheets / Excel — Use
IMPORTDATAor Power Query to pull key levels and max pain into spreadsheets for tracking. - Discord / Slack Bots — Post daily key levels or gamma environment alerts to your trading channels.
- Retool / Streamlit — Build internal tools that display heatmaps and exposure data alongside your portfolio.
Trading Systems
- Algorithmic Trading — Use gamma profile and key levels to set dynamic support/resistance zones for entries and exits.
- Risk Management — Monitor GEX and VEX shifts to adjust position sizing based on dealer hedging pressure.
- Backtesting — Pull current Greek data to compare against historical patterns and validate strategies.
Tip:
get_gamma_profileincludes regime / zero-gamma fields that tell you whether dealers are in a positive or negative gamma regime — a key signal for volatility expectations.