market-results
Every market a book offered on a game, graded against what actually happened:
one row per (game, operator, market, selection) carrying the settled
outcome and the pre-game closing price when one was observed. Typically
≈ 12,000 rows per game — the dataset for answering “would this bet have won?”
at scale.
Fetching
Section titled “Fetching”curl -s "https://api.betflux.ai/v1/games/MLB_BOS_NYY_20260715/market-results" \ -H "Authorization: Bearer $BETFLUX_API_KEY" -o results.parquetOne Parquet file per game. The CLI/SDK also accept a date range and filter
locally (--operator, --market-type, --team, --side, --outcome):
betflux get market-results --league MLB \ --date-from 2026-07-01 --date-to 2026-07-07 --outcome WONGrading semantics
Section titled “Grading semantics”NCAAM files are available. Its MSF feed supplies box-score facts, including
final scores and structural halves, but no play-by-play. Missing facts and
questions requiring unavailable play evidence remain INDETERMINATE.
NCAAM overtime and operator-specific settlement coverage have not been
comprehensively verified; the documented NBA/NFL second-half overtime policy
does not establish a NCAAM policy. Provider finality and historical fact gaps
also remain validation limits. Treat file availability separately from a
promise that every selection can be settled.
outcomeisWON,LOST,PUSH, orINDETERMINATE. Grading never guesses:WON/LOST/PUSHare only produced from a concrete settled value traced to an authoritative source (box scores, play-by-play, or the official score); anything the sources can’t answer exactly isINDETERMINATErather than a coin flip.settled_valueis the concrete value the outcome was computed from (the player’s points, the final total, …) for numeric questions;settled_value_bool(1/0) is set instead for yes/no questions. Both are null onINDETERMINATErows.closing_odds/closing_implied/closing_tscome from the latest eligible quote strictly beforegame_start, using the same active-status, valid-price, and recognized-market completeness rules as closing-lines. Both market and selection must be explicitly active. The quote’s price, threshold and timestamp stay together; a later suspension does not replace an eligible quote.- All three closing fields are null when no eligible pre-game quote exists,
including live-only, all-suspended, or missing-status histories. The row
remains present; grading still depends on a supported selection and
sufficient result evidence. Exclude null
closing_oddsfrom closing-price ROI calculations. graded_attimestamps the grading run.- FanDuel NBA and NFL second-half markets include evidenced overtime. Fourth quarters and explicit regulation markets exclude overtime. Windows needing unavailable overtime timing or incomplete scoring evidence stay indeterminate.
- Tied leaders in player most-stat markets are
INDETERMINATE, with null settled values. Their sportsbook payout can require a dead-heat reduction, which this dataset does not yet represent.PUSHmeans a returned stake; it is not a substitute for fractional settlement. - FanDuel MLB full-game score markets require evidence of sufficient innings
for their settlement rules. Moneylines have a shorter minimum than run lines
and totals; totals already exceeded remain decidable. Missing completion
evidence and uncertain scheduled-short-game exceptions produce
INDETERMINATEwith null settled values. - FanDuel ordinary full-game batter totals, milestones, and tiers require an
official plate appearance. Pinch-hitters with a plate appearance are eligible;
a starting-lineup position alone is insufficient. Zero appearances produce
INDETERMINATEbecause this dataset does not represent voids, and missing participation evidence also remains unresolved. These rules are scoped to the covered FanDuel products; other operators and specific plate-appearance products retain their separate rules. market_keyisOPERATOR:market_external_id— the same join key closing-lines and sportsbook-lines carry, so(game_id, market_key, selection_external_id)matches a market-results row to its closing-lines row(s) exactly.sideis a list column (a selection can carry multiple side tokens); the SDK’ssidefilter does membership matching.
The nullable close is the v3 market-results contract. Historical v2 artifacts
could fall back to a live observation when no pre-game quote existed, placing a
timestamp at or after game_start in these pre-game fields. During the rebuild
and serving cutover, apply closing_ts < game_start when reading v2 data; once
v3 or later is served, the equivalent live-only rows have all three closing fields null.
The v4 rebuild retains the v3 nullable-close contract and adds these overtime and tied-leader corrections, plus the MLB eligibility checks above. Earlier artifact versions require rebuilding; changing a client-side filter cannot repair their settlement outcomes.
Columns
Section titled “Columns”| Column | Type | Nullable | Description |
|---|---|---|---|
game_id | string | no | |
league | string | no | |
game_date | string | no | Calendar date (Parquet date, YYYY-MM-DD). |
game_start | string | no | UTC timestamp (Parquet timestamptz). |
home_team | string | no | |
away_team | string | no | |
operator | string | no | |
market_external_id | string | no | |
market_type | string | no | |
period | string | no | |
structure | string | no | |
market_name | string | no | |
selection_external_id | string | no | |
selection_name | string | yes | |
side | string[] | yes | |
spread | number | yes | |
total | number | yes | |
market_metric | string[] | yes | |
selection_metric | string | yes | |
market_player_ids | string[] | yes | |
selection_player_ids | string[] | yes | |
closing_odds | integer | yes | American odds of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists. |
closing_implied | number | yes | Implied probability (vig included, 0-1) of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists. |
closing_ts | string | yes | Timestamp of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists. |
outcome | string | no | WON, LOST, PUSH (stake returned), or INDETERMINATE. Tied leaders in most-stat markets are INDETERMINATE while fractional settlement is unsupported. |
settled_value | number | yes | |
settled_value_bool | integer | yes | |
graded_at | string | no | UTC timestamp (Parquet timestamptz). |
market_key | string | no | Global market identity: `OPERATOR:market_external_id` — the operator code plus the operator's own market id. Join key across closing-lines, market-results and sportsbook-lines. |