Developers menu

Developers / LIVE / Expected move and close odds

Markdown copy

Expected move and close odds

SPX's expected move left to the close (twice the ATM straddle) and the 0DTE chain's own odds for the close, as READOUTS shows them; with day, the same at a minute of a finished session against what the close did.

GET/api/v1/expected_move
Plan LIVEKey scope liveLimit 120 a minute per key; a 304 is freeVersion 1.0.0Since 2026-10-03

This endpoint serves

Plan: LIVE. LIVE: today's session every second, alerts, ASK, the levels API and the platform integrations, and 5 LAB credits a month. Every finished session is free in REPLAY. Pricing.

Parameters

NameWhat it doesDefaultError
symquery · SPXSPX only.SPXspx_only
dayquery · stringA finished session, YYYY-MM-DD; leave it out for today.todaybad_day, not_finished
timequery · stringWith day: the ET minute, HH:MM, 09:31 to 15:59.10:00bad_time
errorsquery · 200200: an error answers 200 with the same body and the real status in X-FirmTape-Status, for clients that cannot read a status.
keyquery · stringLegacy: the key in the address, for platforms that cannot send headers. Prefer the header.

Response

The expected move and the odds; with day, the outcome too.

FieldMeaningUnit
sym"SPX"SPX.
daystringThe ET trading day.
sessionstringopen, closed or stale.
as_ofstringThe reading's time, ISO 8601 in New York time.
as_of_unixintegerThe same, Unix seconds.
age_sintegerSeconds since the reading.seconds
pricenumber | nullSPX at the reading.index points
minutes_leftintegerMinutes to 16:00 ET; 0 when closed.minutes
left_to_closeobject | nullTwice the ATM straddle from here to 16:00; null when closed or unpriced.
left_to_close.pointsnumber | nullThe expected move left.index points
left_to_close.lownumber | nullPrice minus it.index points
left_to_close.highnumber | nullPrice plus it.index points
left_to_close.sourcestringWhere the straddle came from.
left_to_close.notestringWhat it measured over the archive.
close_oddsobject | nullThe 0DTE chain's odds for the close, with 30 or more minutes left; null otherwise.
close_odds.frame_tstring | nullThe ladder frame's ET minute.
close_odds.range_80arrayThe 10th and 90th percentile of the close.index points
close_odds.middle_halfarrayThe 25th and 75th percentile.index points
close_odds.mediannumber | nullThe median close.index points
close_odds.beyond_pctobjectOdds, percent, that the close ends beyond each level, away from spot.
close_odds.beyond_pct.flipnumber | nullBeyond the flip.percent
close_odds.beyond_pct.call_wallnumber | nullBeyond the call wall.percent
close_odds.beyond_pct.put_wallnumber | nullBeyond the put wall.percent
close_odds.notestringHow the odds are made and how they held.
close_odds_notestringWhy close_odds is absent.
levelsobjectThe volume book's levels at the reading.
levels.flipnumber | nullFlip.index points
levels.call_wallnumber | nullCall wall.index points
levels.put_wallnumber | nullPut wall.index points
levels.bookstringvolume.
levels_atstringA finished day: the levels minute.
last_secondobjectA finished day: the levels at the last second.
last_second.flipnumber | nullFlip.index points
last_second.call_wallnumber | nullCall wall.index points
last_second.put_wallnumber | nullPut wall.index points
outcomeobjectWith day: what the close did.
outcome.closenumber | nullThe close.index points
outcome.close_as_ofstringIts time.
outcome.inside_left_to_closeboolean | nullWhether the close landed inside the expected move.
outcome.inside_range_80boolean | nullInside the 80% range.
outcome.inside_middle_halfboolean | nullInside the middle half.
outcome.vs_mediannumber | nullClose minus the median.index points

Errors

StatusCodeWhat to do
400spx_only, bad_day, not_finished, bad_timeA parameter is wrong. Send sym=SPX or leave it out.
401no_key, bad_keyNo key, or an unknown or revoked one. Send Authorization: Bearer <key> with a key of the product's scope.
403live_requiredNo LIVE plan. Start or renew LIVE; pricing names the page.
404no_dataNo reading for that day. Ask again after next_update_s, or pick another day.
429rate_limited, too_many_placesOver a limit. Wait Retry-After seconds; poll with If-None-Match, a 304 is free.

Every code: Errors.

Caching

Answers carry an ETag: send it back as If-None-Match and an unchanged reading answers 304 with no body, not counted against the limit.

Changes

  • 2026-10-03 Added.

OpenAPI operation getExpectedMove in /docs/developers/openapi.json.

Measurements of dealer positioning, never a forecast or a trade call. This page is built from FirmTape's public contract, the same files the OpenAPI document is built from; the tests hold them against the route code. Markdown: /docs/developers/live/expected-move.md.