Lab API
Expected Move
Expected Move API
Straddle-implied expected move per expiry, derived from ATM implied volatility. Generalizes the earnings-only expected move to any upcoming expiry.
Endpoint
Auth required (
X-Api-Key)
Rate Limited: Yes
Basic+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbol |
path | yes | - | Underlying ticker (case-insensitive; normalized to uppercase). |
expiry |
query | no | all expiries | Restrict the result to a single expiry, YYYY-MM-DD. Omit to receive every upcoming expiry. |
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/expected-move/SPY?expiry=2026-06-20"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/expected-move/SPY",
params={"expiry": "2026-06-20"},
headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(f"Expected move: {data['expected_moves'][0]['expectedMove']}")
const resp = await fetch(
"https://lab.flashalpha.com/v1/expected-move/SPY?expiry=2026-06-20",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Expected move: " + data.expected_moves[0].expectedMove);
Response
{
"symbol": "SPY",
"underlying_price": 542.18,
"as_of": "2026-06-05T14:32:10.123Z",
"expected_moves": [
{
"expiry": "2026-06-20",
"daysToExpiry": 15,
"atmIv": 0.1642,
"expectedMove": 17.6234,
"expectedMovePct": 3.2504,
"lowerBound": 524.5566,
"upperBound": 559.8034
}
]
}
Key Response Fields
| Field | Type | Description |
|---|---|---|
underlying_price | number | Spot price of the underlying |
as_of | string | Timestamp of the snapshot |
expected_moves[] | array | One entry per upcoming expiry, ordered by expiry |
daysToExpiry | integer | Calendar days to the expiry |
atmIv | number/null | ATM implied vol as a decimal, or null when no ATM IV can be derived |
expectedMove | number | 1-σ move in price terms |
expectedMovePct | number | Expected move as a percentage of spot |
lowerBound / upperBound | number | Implied range (spot ∓ expectedMove) |
Errors
| Status | Description |
|---|---|
400 | invalid_expiry - expiry query parameter is not a valid YYYY-MM-DD date |
403 | tier_restricted - Free plan. Requires Basic or higher |
404 | symbol_not_found - No data for the symbol. Message notes when the market is closed (9:30 AM – 4:00 PM ET) |
About
Returns the straddle-implied expected move per expiry, derived from ATM implied volatility. It generalizes the earnings-only expected move to any upcoming expiry, giving a 1-σ implied range for every expiration on the chain.
Top-level keys are snake_case (underlying_price, as_of, expected_moves) while the items inside expected_moves use camelCase. Each entry carries daysToExpiry, atmIv, expectedMove, expectedMovePct, and the lowerBound / upperBound of the implied range.
Common Use Cases
- Set targets and stops around the range - use
lowerBound/upperBoundas the 1-σ envelope when placing price targets and protective stops for an expiry - Size premium-selling structures - place iron-condor and credit-spread short strikes outside
expectedMoveso the structure clears the 1-σ band - Read the term structure of risk - compare
expectedMovePctacross theexpected_moves[]entries to see how implied risk scales withdaysToExpiry - Judge rich vs cheap - benchmark
atmIvandexpectedMovePctfor an expiry against recent history to decide whether to buy or sell the move - Frame an event-week trade - isolate the expiry that straddles a catalyst and size around its
expectedMoveto bracket the implied reaction - Trade calendars off the term structure - exploit a front-to-back gap in
expectedMovePctwhen near-dated implied move looks expensive relative to a later expiry
Related
Related reading
- Realized vs implied volatility & the risk premium - why the implied move tends to overstate the realized one
Complementary endpoints
- VRP - whether the implied move is rich versus realized
- Volatility - the ATM IV term structure behind the move
- Skew Term Structure - directional bias the symmetric move misses
- Earnings - the earnings-only expected move this endpoint generalizes
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.