Surface Anomaly Strategy API - Rich/Cheap IV Wings vs SVI Fit - FlashAlpha Lab API
Lab API Surface Anomaly

Surface Anomaly Strategy API

Compares observed IVs against the calibrated SVI fit for an expiry to find rich/cheap wings (per-strike residuals, fit quality, cheap-convexity score), and proposes the obvious vertical-credit sale on a rich wing.

Endpoint

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

Parameters

Name In Required Default Description
symbolpathyes - Underlying symbol.
expiryquerynonearest fitted SVI sliceyyyy-MM-dd. The expiry slice to analyse.
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/strategies/surface-anomaly/SPY?expiry=2026-06-19"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/strategies/surface-anomaly/SPY",
    params={"expiry": "2026-06-19"},
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(f"{data['decision']} ({data['regime']}) score={data['score']}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/strategies/surface-anomaly/SPY?expiry=2026-06-19",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(`${data.decision} (${data.regime}) score=${data.score}`);

Response

Returns the standard strategy decision envelope. Every Strategy Signals endpoint returns this same shape; only metrics and regime change per strategy.

{
  "strategy": "surface_anomaly",
  "symbol": "SPY",
  "timestamp": "2026-06-05T14:32:11Z",
  "decision": "candidate",
  "score": 72,
  "confidence": 0.83,
  "regime": "rich_put_wing",
  "best_structures": [
    {
      "rank": 1,
      "structure": "short_put_spread",
      "expiry": "2026-06-19",
      "legs": [
        { "action": "sell", "type": "put", "strike": 580, "delta": -0.25, "premium": 3.10, "quantity": 1 },
        { "action": "buy",  "type": "put", "strike": 570, "delta": -0.13, "premium": 1.80, "quantity": 1 }
      ],
      "credit": 1.30,
      "debit": null,
      "max_profit": 1.30,
      "max_loss": 8.70,
      "breakevens": [578.70],
      "edge_score": 72,
      "liquidity_score": 0.88
    }
  ],
  "metrics": {
    "expiry": "2026-06-19",
    "put_wing_richness": 1.4,
    "call_wing_richness": -0.2,
    "dominant_wing": "put",
    "fit_quality_score": 0.94,
    "underlying_price": 589.12
  },
  "risk_flags": [],
  "why": ["Observed put-wing IVs sit 1.4 vol points above the SVI fit."],
  "avoid_if": ["The fitted slice is stale or the residuals collapse intraday."],
  "data_quality": { "score": 90, "warnings": [] }
}

Strategy-specific fields

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

Metric
expiry
put_wing_richness
call_wing_richness
dominant_wing
sample_count
forward
per_strike_residuals
fit_quality_score
cheap_convexity_score
underlying_price

regime values: rich_put_wing, rich_call_wing, flat_residuals; plus no_fitted_surface (insufficient-data case).

Errors

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

About

This strategy compares observed implied volatilities against the calibrated SVI fit for an expiry to surface rich or cheap wings. It reports per-strike residuals, a fit-quality score, and a cheap-convexity score, and where a wing is rich it proposes the obvious vertical-credit sale.

It returns the standard strategy decision envelope shared by all Strategy Signals endpoints. When no fitted SVI slice is available, it short-circuits with decision: insufficient_data and regime: no_fitted_surface.

Common Use Cases

  • Spot the dislocation - read regime to find rich or cheap IV wings relative to the fitted surface for relative-value trades
  • Trade only clean signals - act when decision is candidate and skip no_setup reads where the residual is noise
  • Drop in the proposed structure - pull best_structures[] for a vertical-credit spread on the rich wing or a debit on the cheap one
  • Rank the watchlist - sort by score to surface the largest surface mispricings across a universe
  • Size on conviction - scale the trade by score and confidence rather than a fixed clip
  • Respect the guardrails - honor risk_flags[] and require a clean data_quality before trusting a thin-fit residual

Related reading

Complementary endpoints

Ready to build?

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