Overview Authentication Rate Limits Endpoints WebSocket Errors Discord Bot Plans Assets
API Reference

Greeks Analytics API

Greeks provides derived options analytics — not raw market data. Every endpoint computes actionable signals in real-time: Greeks, GEX, unusual flow, max pain, and full market overviews.

Base URL
https://greeks.pro
All responses are JSON with Content-Type: application/json.

What you can build

  • Real-time options flow scanners and unusual activity alerts
  • Gamma exposure dashboards for market makers and traders
  • Max pain calculators for expiration week strategies
  • Full-stack options analytics platforms with live WebSocket feeds
  • Algorithmic signals from IV surface and term structure data

Common Parameters

All analytics endpoints share these query parameters:

ParameterTypeRequiredDescription
symbol
string
string Required Any US stock or ETF ticker symbol (e.g. AAPL, SPY, TSLA). Case-insensitive.
expiration
int64 | "all"
string Optional Unix timestamp for a specific expiration date, or "all" to include every available expiration. Omit for nearest expiry only.

Security

Authentication

All API requests require a valid API key. Keys follow the format grk_<48 hex characters> and are scoped to your user account and plan tier.

Never expose your API key in client-side code or public repositories. Keys can be rotated at any time from your Settings page.

Methods

You can authenticate using any of three methods. HTTP header methods are preferred.

Header (preferred)
X-API-Key: grk_abc123…
Bearer Token
Authorization: Bearer grk_abc123…
Query Parameter (WebSocket only)
?key=grk_abc123…
Required for WebSocket connections where headers cannot be set.
# Using X-API-Key header (recommended) curl https://greeks.pro/api/analytics/maxpain \ -H "X-API-Key: grk_your_key_here" \ -G -d "symbol=AAPL"
const res = await fetch('https://greeks.pro/api/analytics/maxpain?symbol=AAPL', { headers: { 'X-API-Key': 'grk_your_key_here' } }); const data = await res.json(); console.log(data);
import requests res = requests.get( 'https://greeks.pro/api/analytics/maxpain', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'AAPL'} ) data = res.json()

Quotas

Rate Limits & Quotas

Rate limits are enforced per user account using a sliding 60-second window. Daily quotas reset at midnight UTC.

Response Headers

Every response includes rate limit metadata in the headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per 60-second window
X-RateLimit-RemainingRequests remaining in current window
X-Daily-LimitMaximum requests allowed per day
X-Daily-RemainingRequests remaining today
Retry-AfterSeconds to wait before retrying (only on 429 responses)

Plan Limits

Plan Requests / min Requests / day
Free 10 600
Trader 60 5,000
Pro 300 50,000
Institutional 1,000 Unlimited
When rate limited (429), wait the number of seconds in Retry-After before retrying. Exponential backoff is recommended for server-side integrations.

REST API

Endpoints

All endpoints are read-only GET requests that return derived analytics computed from live options chain data.

GET /api/analytics/maxpain Free+
Returns the max pain strike for each expiration — the price at which options sellers collectively pay out the least. Useful for identifying magnetic price levels heading into expiration week.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol (e.g. AAPL)
expiration int64 | "all" Optional Unix timestamp or "all" for all expirations
curl "https://greeks.pro/api/analytics/maxpain?symbol=NDAQ&expiration=all" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/maxpain?symbol=NDAQ&expiration=all', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const { symbol, spotPrice, results } = await res.json();
import requests data = requests.get( 'https://greeks.pro/api/analytics/maxpain', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'NDAQ', 'expiration': 'all'} ).json()
Response Schema
{ "symbol": "NDAQ", "spotPrice": 81.40, "timestamp": 1748390400, "results": [ { "expiration": 1748390400, // unix timestamp "dte": 7, // days to expiration "maxPainStrike": 80, // strike in dollars "totalPainAtMax": 1284000, // aggregate pain at max pain strike "spotDistance": 1.40, // spot - maxPainStrike "spotDistancePct": 1.72 // percent distance from spot } ] }
GET /api/analytics/greeks Trader+
Returns full Black-Scholes Greeks for every options contract on the chain: delta, gamma, theta, vega, rho, implied volatility, theoretical price and mispricing. Ideal for building scanner tools or risk dashboards.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
expiration int64 | "all" Optional Filter to a specific expiration date
curl "https://greeks.pro/api/analytics/greeks?symbol=NDAQ&expiration=1773964800" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/greeks?symbol=NDAQ&expiration=1773964800', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const { contracts } = await res.json(); // Filter ITM calls with delta > 0.5 const hotCalls = contracts.filter(c => c.type === 'call' && c.delta > 0.5);
import requests data = requests.get( 'https://greeks.pro/api/analytics/greeks', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'NDAQ', 'expiration': 1773964800} ).json()
Response Schema
{ "symbol": "NDAQ", "spotPrice": 81.40, "timestamp": 1748390400, "contracts": [ { "contractSymbol": "NDAQ250516C00080000", "type": "call", "strike": 80, "expiration": 1747353600, "dte": 7, "iv": 0.2341, // implied volatility (decimal) "delta": 0.6821, "gamma": 0.0821, "theta": -0.0412, // daily theta decay "vega": 0.0523, "rho": 0.0128, "theoreticalPrice": 1.92, "mispricing": 0.08, // market - theoretical "inTheMoney": true } ] }
GET /api/analytics/gex Trader+
Returns Gamma Exposure (GEX) and Delta Exposure (DEX) by strike. GEX quantifies the hedging pressure market makers must apply — positive GEX stabilizes price, negative GEX amplifies moves. The gamma flip level is the strike where net GEX crosses zero.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
expiration int64 | "all" Optional Recommended: use "all" for accurate aggregate GEX
symbols string Optional Comma-separated list of tickers for a bulk request (max 20). When present, symbol is ignored. Returns a map of symbol → GEXResponse. Counted against per-symbol quota for each ticker.
curl "https://greeks.pro/api/analytics/gex?symbol=NDAQ&expiration=all" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/gex?symbol=NDAQ&expiration=all', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const { totalNetGEX, gammaFlip, strikes } = await res.json(); const regime = totalNetGEX > 0 ? 'Stable' : 'Volatile';
import requests data = requests.get( 'https://greeks.pro/api/analytics/gex', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'NDAQ', 'expiration': 'all'} ).json() regime = 'Stable' if data['totalNetGEX'] > 0 else 'Volatile'
Response Schema
{ "symbol": "NDAQ", "spotPrice": 81.40, "timestamp": 1748390400, "totalNetGEX": 4821000, // positive = dealers long gamma (market stabilizing) "gammaFlip": 78.50, // strike where net GEX = 0 "strikes": [ { "strike": 80, "callGEX": 2100000, // call gamma exposure (positive) "putGEX": -840000, // put gamma exposure (negative) "netGEX": 1260000, "callDEX": 980000, "putDEX": -610000, "netDEX": 370000 } ] }
GET /api/analytics/flow Trader+
Detects unusual options activity by scanning for contracts where volume significantly exceeds open interest — a signal that new positions are being opened. Returns ranked signals with severity classification.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
expiration int64 | "all" Optional Use "all" to scan all expirations for maximum coverage
curl "https://greeks.pro/api/analytics/flow?symbol=NDAQ&expiration=all" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/flow?symbol=NDAQ&expiration=all', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const { signals } = await res.json(); // Get high-severity signals only const highAlert = signals.filter(s => s.severity === 'high');
import requests data = requests.get( 'https://greeks.pro/api/analytics/flow', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'NDAQ', 'expiration': 'all'} ).json() high_signals = [s for s in data['signals'] if s['severity'] == 'high']
Response Schema
{ "symbol": "NDAQ", "spotPrice": 81.40, "timestamp": 1748390400, "signals": [ { "contractSymbol": "NDAQ250516C00085000", "type": "call", // "call" | "put" "strike": 85, "expiration": 1747353600, "dte": 7, "volumeOIRatio": 8.42, // volume / open interest "iv": 0.3812, "signal": "unusual_volume", // "unusual_volume" | "opening_position" "severity": "high" // "high" | "medium" } ] }
GET /api/analytics/overview Pro+
Returns the full market overview in a single call — sentiment analysis, GEX summary, max pain, expected moves, IV term structure, IV surface, and top unusual flow. This is the most comprehensive endpoint and powers the full dashboard.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
expiration int64 | "all" Optional Recommended: "all" for full accuracy across all metrics
curl "https://greeks.pro/api/analytics/overview?symbol=NDAQ&expiration=all" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/overview?symbol=NDAQ&expiration=all', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const overview = await res.json(); console.log(overview.sentiment.sentiment); // "bullish" | "bearish" | "neutral"
import requests overview = requests.get( 'https://greeks.pro/api/analytics/overview', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'NDAQ', 'expiration': 'all'} ).json()
Response Schema
{ "symbol": "NDAQ", "spotPrice": 81.40, "timestamp": 1748390400, "riskFreeRate": 0.0525, "sentiment": { "sentiment": "bullish", // "bullish" | "bearish" | "neutral" "putCallVolumeRatio": 0.612, "putCallOIRatio": 0.784 }, "gexSummary": { "totalNetGEX": 4821000, "gammaFlip": 78.50 }, "maxPain": [ { "expiration": 1747353600, "dte": 7, "maxPainStrike": 80, "totalPainAtMax": 1284000, "spotDistance": 1.40, "spotDistancePct": 1.72 } ], "expectedMoves": [ { "dte": 7, "atmStrike": 81, "lowerBound": 79.20, "upperBound": 83.60, "moveAmount": 2.20, "movePercent": 2.70 } ], "termStructure": [ { "dte": 7, "atmIV": 0.2341, "expiration": 1747353600 } ], "ivSurface": [ /* 2D array of {strike, dte, iv} */ ], "topFlow": [ { "contractSymbol": "NDAQ250516C00085000", "type": "call", "strike": 85, "dte": 7, "volumeOIRatio": 8.42, "iv": 0.3812, "signal": "unusual_volume", "severity": "high" } ] }
GET /api/analytics/snapshot Trader+
Returns a lightweight snapshot of the most important options metrics for a symbol — gamma flip, total GEX, max pain, sentiment, and put/call ratio. Uses only the nearest expiration for speed. Ideal for bots, dashboards, and mobile clients that need key signals without the full overview payload.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
curl "https://greeks.pro/api/analytics/snapshot?symbol=AAPL" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/snapshot?symbol=AAPL', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const snap = await res.json(); console.log(snap.sentiment, snap.gammaFlip);
import requests snap = requests.get( 'https://greeks.pro/api/analytics/snapshot', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'AAPL'} ).json()
Response Schema
{ "symbol": "AAPL", "spotPrice": 213.50, "timestamp": 1748390400, "gammaFlip": 210.00, // strike where net GEX = 0 "totalGEX": 48210000, // positive = stabilizing, negative = amplifying "maxPain": 212.50, "sentiment": "bullish", // "bullish" | "bearish" | "neutral" "putCallRatio": 0.62 }
GET /api/analytics/levels Trader+
Returns key options-derived price levels — gamma flip, call wall, put wall, max pain, and major strikes with significant open interest. Useful for identifying structural support/resistance levels implied by options positioning.
Parameters
ParameterTypeRequiredDescription
symbol string Required Ticker symbol
curl "https://greeks.pro/api/analytics/levels?symbol=SPY" \ -H "X-API-Key: grk_your_key_here"
const res = await fetch( 'https://greeks.pro/api/analytics/levels?symbol=SPY', { headers: { 'X-API-Key': 'grk_your_key_here' } } ); const lvl = await res.json(); console.log(`Call wall: ${lvl.callWall}, Put wall: ${lvl.putWall}`);
import requests lvl = requests.get( 'https://greeks.pro/api/analytics/levels', headers={'X-API-Key': 'grk_your_key_here'}, params={'symbol': 'SPY'} ).json()
Response Schema
{ "symbol": "SPY", "spotPrice": 582.14, "timestamp": 1748390400, "gammaFlip": 575.00, // strike where net GEX = 0 "callWall": 590.00, // strike with highest call gamma exposure "putWall": 570.00, // strike with highest (most negative) put GEX "maxPain": 580.00, "majorStrikes": [570, 575, 580, 585, 590] // strikes with significant OI (max 10) }
GET /api/public/max-pain

Returns max pain for the nearest expiration. No auth required. Rate limited to 10 requests/hour per IP. Response headers include X-RateLimit-Limit and X-RateLimit-Remaining.

Query param: symbol — one of: SPY, QQQ, AAPL, TSLA, NVDA, AMZN, MSFT, META, AMD, GOOGL, IWM, GLD, COIN, PLTR, SOFI

GET /api/public/max-pain?symbol=SPY { "symbol": "SPY", "spotPrice": 582.14, "expiration": 1774051200, "dte": 3, "maxPainStrike": 580, "maxPainDistancePct": 0.37, "timestamp": 1741651234 }
WS /ws/analytics Pro+
Real-time analytics streaming over WebSocket. The server pushes fresh derived data at your configured interval — no polling required. One active session per API key. See the WebSocket Protocol section for the full protocol reference.
Connection URL
wss://greeks.pro/ws/analytics?key=grk_your_key_here
Subscribe Message
{ "symbol": "AAPL", // required "interval": 5, // seconds between pushes (min: 3, default: 5) "subscribe": ["overview", "gex", "flow"] // omit for all streams }

Embeddable Widget

Embed a live options screener on any website with a single <iframe>. No account required. Auto-refreshes every 5 minutes.

<iframe src="https://greeks.pro/widget" width="700" height="400" frameborder="0" style="border-radius:12px" title="Greeks Options Screener" ></iframe>

Real-time

WebSocket Protocol

The analytics WebSocket provides a continuous push feed of derived data. Connect, subscribe, and receive structured JSON messages — no polling loop required.

One session per API key. Opening a second connection closes the first. If you receive close code 4001, do not attempt to reconnect — another session is already active.

Message Types

All server-to-client messages are JSON objects with a kind field:

kindWhen sentData field
subscribedImmediately after successful subscriptionObject with interval and streams[]
overviewEvery interval (if subscribed)Full overview object (same as REST)
greeksEvery interval (if subscribed)Greeks object
gexEvery interval (if subscribed)GEX object
flowEvery interval (if subscribed)Flow signals
maxpainEvery interval (if subscribed)Max pain results
errorOn validation or server errorError message string

Close Codes

CodeMeaningAction
1000Normal closeSafe to reconnect
1001Server shutdownReconnect with backoff
1006Abnormal / connection lostReconnect with backoff
4001Duplicate session detectedDo NOT reconnect

Full Client Example

class GreeksStream { constructor(apiKey, symbol, opts = {}) { this.apiKey = apiKey; this.symbol = symbol; this.interval = opts.interval || 5; this.streams = opts.streams || ['overview', 'gex', 'flow']; this.handlers = {}; this.ws = null; this._noDuplicate = false; } on(kind, fn) { this.handlers[kind] = fn; return this; // chainable } connect() { const url = `wss://greeks.pro/ws/analytics?key=${this.apiKey}`; this.ws = new WebSocket(url); this.ws.onopen = () => { this.ws.send(JSON.stringify({ symbol: this.symbol, interval: this.interval, subscribe: this.streams })); }; this.ws.onmessage = (e) => { const msg = JSON.parse(e.data); if (this.handlers[msg.kind]) { this.handlers[msg.kind](msg.data, msg); } }; this.ws.onclose = (e) => { if (e.code === 4001) { console.warn('Duplicate session — not reconnecting'); this._noDuplicate = true; return; } // Reconnect with backoff for other close codes if (!this._noDuplicate) { setTimeout(() => this.connect(), 3000); } }; this.ws.onerror = (err) => console.error('WS error', err); } disconnect() { if (this.ws) this.ws.close(); } } // Usage const stream = new GreeksStream('grk_your_key_here', 'AAPL', { interval: 5, streams: ['overview', 'gex', 'flow'] }); stream .on('subscribed', (data) => console.log('Streaming', data.streams)) .on('overview', (data) => updateDashboard(data)) .on('gex', (data) => updateGEXChart(data.strikes)) .on('flow', (data) => renderFlowTable(data.signals)) .on('error', (msg) => console.error('Server error:', msg)) .connect();

Errors

Error Codes

All errors return a JSON body: {"error": "message"}. HTTP status codes follow standard conventions.

Status Meaning Recommended Action
400 Invalid or missing request parameters Inspect error field and fix request params (e.g. missing symbol)
401 Invalid or missing API key Check the key format (grk_…) and redirect user to login if needed
403 Insufficient plan for this endpoint Show an upgrade prompt — user's plan doesn't include this endpoint
403 Symbol limit reached User has reached the max tracked symbols for their plan; prompt to upgrade
429 Rate limit exceeded Read Retry-After header and wait that many seconds before retrying
500 Internal server error (data fetch failed) Retry with exponential backoff — usually a transient data source unavailability

Error Handling Example

async function fetchWithRetry(url, key, maxRetries = 3) { for (let attempt = 0; attempt < maxRetries; attempt++) { const res = await fetch(url, { headers: { 'X-API-Key': key } }); if (res.status === 429) { const wait = parseInt(res.headers.get('Retry-After') || '60'); await new Promise(r => setTimeout(r, wait * 1000)); continue; } if (res.status === 401) { window.location.href = '/login'; throw new Error('Unauthorized'); } if (res.status === 403) { const { error } = await res.json(); showUpgradePrompt(error); throw new Error(error); } if (res.status >= 500 && attempt < maxRetries - 1) { await new Promise(r => setTimeout(r, Math.pow(2, attempt) * 1000)); continue; } return res.json(); } }
import time, requests def fetch_with_retry(url, key, max_retries=3): for attempt in range(max_retries): r = requests.get(url, headers={'X-API-Key': key}) if r.status_code == 429: wait = int(r.headers.get('Retry-After', 60)) time.sleep(wait) continue if r.status_code == 403: raise PermissionError(r.json()['error']) if r.status_code >= 500 and attempt < max_retries - 1: time.sleep(2 ** attempt) continue r.raise_for_status() return r.json()

Community & Tools

Discord Bot

Bring institutional-grade options analytics directly to your Discord server. Our bot provides real-time data, GEX, Max Pain, and flow detection via simple slash commands.

Invite Bot to Server Join our Community

Available Commands

CommandDescriptionExample
/overview <symbol>Full options dashboard snapshot (Sentiment, GEX, Max Pain, Walls, Regime)./overview SPY
/gex <symbol>Gamma Exposure profile, net GEX, Gamma Flip, and top key strikes./gex TSLA
/flow <symbol>Unusual options activity (smart money flow detection)./flow NVDA
/maxpain <symbol>Max Pain levels and spot distance for upcoming expirations./maxpain AAPL
/greeks <symbol>Top option contract Greeks in the ATM range./greeks AMZN

Pro+ Feature

Discord Alerts

Configure alerts that watch analytics signals for any supported symbol and fire a Discord webhook when your conditions are met. Available on Pro (5 alerts) and Institutional (unlimited).

Pro plan or higher required. Alerts are not available on Free or Trader plans. Upgrade to Pro to get started.

How it works

The alert engine runs inside the backend process and polls all enabled alerts every 60 seconds. For each unique symbol it fetches one analytics snapshot, evaluates every alert's conditions against it, and fires the Discord webhook for any alert whose conditions are met and whose cooldown has expired. All state (last_fired_at, fire_count_today, full history) is persisted in the database — a server restart will never re-trigger a stale alert.

HTTP API

MethodRouteDescription
GET/api/alertsList your alerts
POST/api/alertsCreate an alert
PUT/api/alerts/:idUpdate an alert
DELETE/api/alerts/:idDelete an alert and its history
PATCH/api/alerts/:id/toggleEnable or disable without a full edit
POST/api/alerts/:id/testFire webhook immediately — bypasses cooldown and conditions
GET/api/alerts/:id/historyLast 50 delivery history entries
POST/api/alerts/:id/duplicateClone an alert (counts toward plan limit)
POST/api/alerts/:id/snoozePause an alert — body {"hours": 4}; 0 to unsnooze

Alert object

{ "id": "uuid", "name": "SPY Gamma Flip Alert", "symbol": "SPY", "enabled": true, "logic": "AND", // "AND" | "OR" "conditions": [...], "webhooks": [ { "url": "https://discord.com/api/webhooks/...", "use_rich_embed": true, "message_template": "" } ], "cooldown_minutes": 30, "max_fires_per_day": 0, // 0 = unlimited "market_hours_only": false, // skip outside NYSE hours "snoozed_until": null, // ISO timestamp or null "last_fired_at": "2026-03-12T03:08:00Z", "fire_count_today": 1, "created_at": "2026-03-11T20:00:00Z" }

Validation rules

FieldRule
symbolNon-empty, uppercase, must be a supported ticker
logicAND or OR
conditions1–20 items; each must have a valid type and all required params
webhooksArray of webhook objects; each url must start with https://discord.com/api/webhooks/. Falls back to legacy webhook_url if omitted.
webhooks[].use_rich_embedIf true, sends a Discord embed with price/GEX fields instead of a plain text message
webhooks[].message_templateOptional. Overrides the default message. Supports {{symbol}}, {{spot_price}}, {{alert_name}}, {{fired_at}}, {{conditions_met}}
cooldown_minutes5–1440 (5 minutes to 24 hours)
max_fires_per_dayDaily fire cap. 0 = unlimited
market_hours_onlyIf true, alert only fires during NYSE hours (9:30–16:00 ET, Mon–Fri)
plan limitHTTP 403 if you already have MaxAlerts configured (5 on Pro)

Discord Alerts

Condition Types

Each condition in the conditions array is a JSON object with a type field plus type-specific parameters. Conditions are evaluated against the latest analytics snapshot for the alert's symbol.

Price / Spot

typeParametersDescription
spot_crosses_leveldirection above/below, value floatSpot crosses a fixed price level
spot_pct_changedirection up/down, value %, window_minutes intSpot moved X% in last N minutes
spot_vs_gamma_flipdirection above/belowSpot crosses the Gamma Flip strike
gamma_flip_distance_pctoperator lt/gt, value %Spot is within X% of Gamma Flip

GEX / Gamma

typeParametersDescription
gex_sign_changeto positive/negativeNet GEX changes sign
gex_below_thresholdvalue float (billions)Net GEX below X billion
gex_pct_changedirection up/down, value %, window_minutes intNet GEX changed X% in N minutes
delta_exposure_crossesdirection above/below, value floatNet DEX crosses threshold
vega_exposure_crossesdirection above/below, value floatTotal vega exposure crosses threshold

Max Pain

typeParametersDescription
max_pain_distance_pctoperator lt/gt, value %Spot-to-MaxPain distance less or greater than X%
max_pain_strike_changenoneMax Pain strike changes (repositioning detected)

Volatility

typeParametersDescription
iv_atm_crossesdirection above/below, value %ATM IV of nearest expiry crosses X%
iv_spikepct_change %, window_minutes intATM IV spiked X% in N minutes
skew_crossesdirection, value %, dte int25-delta skew (put IV − call IV) crosses X%
term_structure_inversiondte_near int, dte_far intIV at near DTE greater than IV at far DTE (backwardation)
expected_move_pct_crossesdirection, value %, dte intExpected move % for DTE crosses X%

Flow / Positioning

typeParametersDescription
flow_signalcontract_type call/put/any, severity high/medium/any, min_vol_oi_ratio floatUnusual flow signal detected
multiple_flow_signalsmin_count int, window_minutes int, severityN+ flow signals in X minutes
put_call_ratio_crossesdirection above/below, value floatP/C volume ratio crosses threshold
oi_change_pctoperator gt/lt, value %, contract_type call/put/netOI changed X% (new positioning detected)

Walls / Levels

typeParametersDescription
call_wall_distance_pctoperator lt/gt, value %Spot distance from Call Wall
put_wall_distance_pctoperator lt/gt, value %Spot distance from Put Wall
call_put_wall_compressionmax_range_pct %Distance between Call and Put Walls less than X% of spot

Example condition object

// Spot crosses above $500 { "type": "spot_crosses_level", "direction": "above", "value": 500 } // Net GEX turns negative { "type": "gex_sign_change", "to": "negative" } // ATM IV spikes more than 10% in the last 30 minutes { "type": "iv_spike", "pct_change": 10, "window_minutes": 30 } // Spot is within 1% of the Gamma Flip { "type": "gamma_flip_distance_pct", "operator": "lt", "value": 1 }

Discord Alerts

Message Template

The message_template field supports dynamic variables using {{variable}} syntax. When an alert fires, each variable is replaced with the live value from the analytics snapshot. Unknown variables are replaced with an empty string.

Available variables

VariableDescriptionExample
{{symbol}}Ticker symbolSPY
{{spot_price}}Current spot price563.42
{{gamma_flip}}Gamma Flip strike560.00
{{net_gex}}Net GEX in billions+$2.14B
{{max_pain}}Max Pain strike558
{{put_call_ratio}}P/C volume ratio0.82
{{atm_iv}}ATM implied volatility18.4%
{{call_wall}}Call Wall strike570.00
{{put_wall}}Put Wall strike550.00
{{sentiment}}Overall market sentimentBULLISH
{{expected_move_pct}}Expected move as % of spot1.8%
{{fired_at}}Time the alert fired (UTC)03:08 UTC
{{conditions_met}}List of conditions that evaluated truespot_crosses_level(above)
{{alert_name}}Name of the alertSPY Gamma Flip Alert

Rich embed vs plain text

Each webhook in the webhooks array has its own use_rich_embed flag. When true, the engine sends a formatted Discord embed card with fields for Symbol, Spot Price, Gamma Flip, Net GEX, Max Pain, Sentiment, and Conditions Triggered — plus your message_template rendered as the content field above the embed. When false, only the rendered template text is sent as plain content. You can mix rich and plain webhooks within the same alert (e.g., one channel gets a rich embed, another gets a plain message).

Example template

[{{symbol}}] Alert: {{alert_name}} Spot: {{spot_price}} | Sentiment: {{sentiment}} Gamma Flip: {{gamma_flip}} | Net GEX: {{net_gex}} Max Pain: {{max_pain}} | Expected Move: {{expected_move_pct}} Call Wall: {{call_wall}} | Put Wall: {{put_wall}} P/C Ratio: {{put_call_ratio}} | ATM IV: {{atm_iv}} Conditions: {{conditions_met}} Fired at: {{fired_at}}

Example Discord embed payload

{ "content": "[SPY] Alert: Gamma Flip Alert\n\nSpot: 563.42 | Sentiment: BEARISH\n...", "embeds": [{ "title": "[ALERT] Gamma Flip Alert", "color": 15158332, "fields": [ { "name": "Symbol", "value": "SPY", "inline": true }, { "name": "Spot Price", "value": "$563.42", "inline": true }, { "name": "Gamma Flip", "value": "$560.00", "inline": true }, { "name": "Net GEX", "value": "-$1.76B", "inline": true }, { "name": "Max Pain", "value": "$558", "inline": true }, { "name": "Sentiment", "value": "BEARISH", "inline": true }, { "name": "Conditions Triggered", "value": "spot_vs_gamma_flip(below)", "inline": false } ], "footer": { "text": "greeks.pro" }, "timestamp": "2026-03-12T03:08:00Z" }] }
i
Embed color is green for bullish conditions, red for bearish, and blue for neutral/informational. Determined automatically from the sentiment field of the snapshot.

Pricing

Plans & Limits

Each plan unlocks progressively more endpoints and higher rate limits. All plans can access any supported US stock or ETF ticker symbol.

Free Trader Pro Institutional
Requests / min 10 60 300 1,000
Requests / day 600 5,000 50,000 Unlimited
Max Pain
Greeks
GEX / DEX
Unusual Flow
Full Overview
WebSocket Stream
SLA / Priority Support
View Pricing & Upgrade
Reference

Supported Assets

All 68 assets below are verified against our live data source and return valid options chains. Every symbol can be used as the symbol parameter in any API endpoint.

Coverage verified — each ticker is tested against Yahoo Finance on a rolling basis. Data includes options chains, spot price, Greeks, GEX, max pain, and unusual flow. Tickers are denominated in USD.
Index & Broad Market ETFs
SPYS&P 500 ETF
QQQNasdaq 100 ETF
IWMRussell 2000 ETF
DIADow Jones ETF
VOOVanguard S&P 500
VTITotal Market ETF
Mega Cap & Technology
AAPLApple
MSFTMicrosoft
NVDANVIDIA
GOOGLAlphabet
AMZNAmazon
METAMeta
TSLATesla
NFLXNetflix
AVGOBroadcom
AMDAMD
Financials
JPMJPMorgan Chase
GSGoldman Sachs
MSMorgan Stanley
BACBank of America
VVisa
MAMastercard
CCitigroup
WFCWells Fargo
Energy
XOMExxonMobil
CVXChevron
COPConocoPhillips
OXYOccidental
SLBSLB
XLEEnergy Sector ETF
Healthcare & Biotech
JNJJohnson & Johnson
UNHUnitedHealth
PFEPfizer
LLYEli Lilly
ABBVAbbVie
MRNAModerna
XBIBiotech ETF
Industrials & Defense
BABoeing
CATCaterpillar
GEGE Aerospace
LMTLockheed Martin
RTXRTX Corp
HONHoneywell
Retail & Consumer
WMTWalmart
COSTCostco
HDHome Depot
TGTTarget
NKENike
SBUXStarbucks
MCDMcDonald's
ETFs — Fixed Income, Commodities & Sectors
TLT20yr Treasury ETF
GLDGold ETF
SLVSilver ETF
HYGHigh Yield Bond ETF
LQDCorp Bond ETF
EEMEmerging Markets ETF
XLKTech Sector ETF
XLFFinancial Sector ETF
Cloud, Growth & Crypto-Adjacent
CRMSalesforce
PLTRPalantir
SNOWSnowflake
NETCloudflare
DDOGDatadog
CRWDCrowdStrike
COINCoinbase
MSTRMicroStrategy
SOFISoFi Technologies
UBERUber
Need a ticker not listed here?
Contact us at greeks.pro/contact — any US-listed equity or ETF with liquid options can be added on request.