Developers menu
Developers / LIVE / Expected move and close odds
Markdown copyExpected 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.
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
| Name | What it does | Default | Error |
|---|---|---|---|
| symquery · SPX | SPX only. | SPX | spx_only |
| dayquery · string | A finished session, YYYY-MM-DD; leave it out for today. | today | bad_day, not_finished |
| timequery · string | With day: the ET minute, HH:MM, 09:31 to 15:59. | 10:00 | bad_time |
| errorsquery · 200 | 200: an error answers 200 with the same body and the real status in X-FirmTape-Status, for clients that cannot read a status. | ||
| keyquery · string | Legacy: 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.
| Field | Meaning | Unit |
|---|---|---|
| sym"SPX" | SPX. | |
| daystring | The ET trading day. | |
| sessionstring | open, closed or stale. | |
| as_ofstring | The reading's time, ISO 8601 in New York time. | |
| as_of_unixinteger | The same, Unix seconds. | |
| age_sinteger | Seconds since the reading. | seconds |
| pricenumber | null | SPX at the reading. | index points |
| minutes_leftinteger | Minutes to 16:00 ET; 0 when closed. | minutes |
| left_to_closeobject | null | Twice the ATM straddle from here to 16:00; null when closed or unpriced. | |
| left_to_close.pointsnumber | null | The expected move left. | index points |
| left_to_close.lownumber | null | Price minus it. | index points |
| left_to_close.highnumber | null | Price plus it. | index points |
| left_to_close.sourcestring | Where the straddle came from. | |
| left_to_close.notestring | What it measured over the archive. | |
| close_oddsobject | null | The 0DTE chain's odds for the close, with 30 or more minutes left; null otherwise. | |
| close_odds.frame_tstring | null | The ladder frame's ET minute. | |
| close_odds.range_80array | The 10th and 90th percentile of the close. | index points |
| close_odds.middle_halfarray | The 25th and 75th percentile. | index points |
| close_odds.mediannumber | null | The median close. | index points |
| close_odds.beyond_pctobject | Odds, percent, that the close ends beyond each level, away from spot. | |
| close_odds.beyond_pct.flipnumber | null | Beyond the flip. | percent |
| close_odds.beyond_pct.call_wallnumber | null | Beyond the call wall. | percent |
| close_odds.beyond_pct.put_wallnumber | null | Beyond the put wall. | percent |
| close_odds.notestring | How the odds are made and how they held. | |
| close_odds_notestring | Why close_odds is absent. | |
| levelsobject | The volume book's levels at the reading. | |
| levels.flipnumber | null | Flip. | index points |
| levels.call_wallnumber | null | Call wall. | index points |
| levels.put_wallnumber | null | Put wall. | index points |
| levels.bookstring | volume. | |
| levels_atstring | A finished day: the levels minute. | |
| last_secondobject | A finished day: the levels at the last second. | |
| last_second.flipnumber | null | Flip. | index points |
| last_second.call_wallnumber | null | Call wall. | index points |
| last_second.put_wallnumber | null | Put wall. | index points |
| outcomeobject | With day: what the close did. | |
| outcome.closenumber | null | The close. | index points |
| outcome.close_as_ofstring | Its time. | |
| outcome.inside_left_to_closeboolean | null | Whether the close landed inside the expected move. | |
| outcome.inside_range_80boolean | null | Inside the 80% range. | |
| outcome.inside_middle_halfboolean | null | Inside the middle half. | |
| outcome.vs_mediannumber | null | Close minus the median. | index points |
Errors
| Status | Code | What to do |
|---|---|---|
| 400 | spx_only, bad_day, not_finished, bad_time | A parameter is wrong. Send sym=SPX or leave it out. |
| 401 | no_key, bad_key | No key, or an unknown or revoked one. Send Authorization: Bearer <key> with a key of the product's scope. |
| 403 | live_required | No LIVE plan. Start or renew LIVE; pricing names the page. |
| 404 | no_data | No reading for that day. Ask again after next_update_s, or pick another day. |
| 429 | rate_limited, too_many_places | Over 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.