Skew Strategy API - 25-Delta Risk Reversal Signal - FlashAlpha Lab API
Lab API Skew

Skew Strategy API

Pure-signal read of 25-delta skew (put vs call wing richness and the risk reversal) for one expiry. No structure is selected; best_structures is always empty and decision is neutral.

Endpoint

GET /v1/strategies/skew/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Growth plan+

Parameters

Name In Required Default Description
symbolpathyes - Underlying symbol.
expiryquerynonearest upcoming expiryyyyy-MM-dd. The expiry to read.
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/strategies/skew/SPY"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/strategies/skew/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(f"{data['regime']} rr25={data['metrics']['risk_reversal_25d']}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/strategies/skew/SPY",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(`${data.regime} rr25=${data.metrics.risk_reversal_25d}`);

Response

Returns the standard strategy decision envelope. This is a pure-signal endpoint, so best_structures is always empty and decision is neutral. Only metrics and regime change per strategy.

{
  "strategy": "skew",
  "symbol": "SPY",
  "timestamp": "2026-06-05T14:32:11Z",
  "decision": "neutral",
  "score": 55,
  "confidence": 0.81,
  "regime": "put_skew",
  "best_structures": [],
  "metrics": {
    "expiry": "2026-06-19",
    "days_to_expiry": 14,
    "atm_iv": 0.142,
    "call_iv_25d": 0.131,
    "put_iv_25d": 0.168,
    "risk_reversal_25d": -0.037,
    "skew_slope": -0.18,
    "dominant_wing": "put",
    "sample_count": 42,
    "underlying_price": 589.12
  },
  "risk_flags": [],
  "why": ["25-delta puts trade 3.7 vol points over 25-delta calls (put-skewed)."],
  "avoid_if": ["Sample is thin or the wings cannot both be priced."],
  "data_quality": { "score": 88, "warnings": [] }
}

Strategy-specific fields

Notable metrics keys (in addition to the always-present underlying_price):

Metric
expiry
days_to_expiry
atm_iv
call_iv_25d
put_iv_25d
risk_reversal_25d
skew_slope
dominant_wing
sample_count
underlying_price

regime values: put_skew, call_skew, flat_skew; plus no_skew_data (insufficient-data case).

Errors

Status error When
400invalid_expiryexpiry is present but not yyyy-MM-dd.
403tier_restrictedCaller is below the Growth plan.
404symbol_not_foundNo market data for the symbol.

About

This strategy is a pure-signal read of 25-delta skew for a single expiry: it reports put vs call wing richness, the 25-delta risk reversal, ATM and 25-delta IVs, the skew slope, and the dominant wing. No trade structure is selected.

It returns the standard strategy decision envelope shared by all Strategy Signals endpoints, but as a signal-only read best_structures is always empty and decision is neutral. When both 25-delta wings cannot be priced, it returns decision: insufficient_data with regime: no_skew_data.

Common Use Cases

  • Read the skew regime - use regime to classify an expiry as put-skewed, call-skewed, or flat and pick the right wing to fade
  • Trade only clean signals - act when decision is candidate and skip no_setup reads without review
  • Drop in the proposed structure - pull best_structures[] for a risk-reversal or wing-credit spread sized to the skew dislocation
  • Rank the watchlist - sort a universe by score to surface symbols with the most extreme wing richness
  • Size on conviction - scale exposure by score and confidence rather than treating every steep skew alike
  • Respect the guardrails - honor risk_flags[] and require a clean data_quality before acting on a thin-wing fit

Related reading

Complementary endpoints

Ready to build?

Get your free API key and start pulling live options data in 30 seconds.