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.
400expiry_in_pastexpiry is a date before today (ET).
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 with FlashAlpha?

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

No credit card required Setup in 60 seconds Secure & reliable