Skip to content
Product Documentation

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.

Terminal window
curl -s "https://api.betflux.ai/v1/games/MLB_BOS_NYY_20260715/market-results" \
-H "Authorization: Bearer $BETFLUX_API_KEY" -o results.parquet

One Parquet file per game. The CLI/SDK also accept a date range and filter locally (--operator, --market-type, --team, --side, --outcome):

Terminal window
betflux get market-results --league MLB \
--date-from 2026-07-01 --date-to 2026-07-07 --outcome WON

NCAAM and NCAAF files are available. Their stats feeds supply box-score facts, including final scores and period totals, but no play-by-play. Full-game player props can use available box totals; period player props and questions about drive or scoring order need evidence these feeds do not supply. Missing facts and questions requiring unavailable play evidence remain INDETERMINATE. College overtime and operator-specific settlement coverage have not been comprehensively verified; the documented NBA/NFL second-half overtime policy does not establish a NCAAM or NCAAF policy. Provider finality and historical fact gaps also remain validation limits. Treat file availability separately from a promise that every selection can be settled.

  • outcome is WON, LOST, PUSH, or INDETERMINATE. Grading never guesses: WON/LOST/PUSH are 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 is INDETERMINATE rather than a coin flip.
  • settled_value is 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 on INDETERMINATE rows.
  • closing_odds / closing_implied / closing_ts come from the latest eligible quote strictly before game_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_odds from closing-price ROI calculations.
  • From dataset_version v8, a book with no observation for the game in the 24 hours before game_start has no closing fields, as in closing-lines: its last quote is stale, not a close. Its selections are still graded.
  • From dataset_version v9, that test is per operator event, so a book’s deleted and relisted event for one game no longer lets the old event’s quote close (closing-lines).
  • graded_at timestamps 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. PUSH means 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 INDETERMINATE with 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 INDETERMINATE because 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_key is OPERATOR: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. Selections first listed at or after game_start (live-only, null closing fields) have no closing-lines row from closing-lines v6 onward; join with a LEFT JOIN when you need them.
  • side is a list column (a selection can carry multiple side tokens); the SDK’s side filter 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.

ColumnTypeNullableDescription
game_idstringno
leaguestringno
game_datestringnoCalendar date (Parquet date, YYYY-MM-DD).
game_startstringnoUTC timestamp (Parquet timestamptz).
home_teamstringno
away_teamstringno
operatorstringno
market_external_idstringno
market_typestringnoMarket type, e.g. SPREAD, MONEYLINE, TOTAL, PLAYER_METRIC_OVER_UNDER.
periodstringno
structurestringno
market_namestringno
selection_external_idstringno
selection_namestringyes
sidestring[]yes
spreadnumberyes
totalnumberyes
market_metricstring[]yes
selection_metricstringyes
market_player_idsstring[]yes
selection_player_idsstring[]yes
closing_oddsintegeryesAmerican odds of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists.
closing_impliednumberyesImplied probability (vig included, 0-1) of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists.
closing_tsstringyesTimestamp of the last eligible active quote strictly before game_start; null when no eligible pre-game quote exists.
outcomestringnoWON, LOST, PUSH (stake returned), or INDETERMINATE. Tied leaders in most-stat markets are INDETERMINATE while fractional settlement is unsupported.
settled_valuenumberyes
settled_value_boolintegeryes
graded_atstringnoUTC timestamp (Parquet timestamptz).
market_keystringnoGlobal 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.
is_mainlinebooleanyesTrue when the graded selection belongs to the operator's primary (non-alternate) full-game spread, moneyline or total at its closing quote. Period lines, team totals and props are false. Null on games built before v5.
dataset_versionstringyesVersion of the dataset this game's file was built at, e.g. `v5`. Games in one pull can differ: versions of a compatibility line only add columns or carry documented changes (see `versions` on /v1/datasets). Columns added after a game's version read null for it. Files built before this column existed lack it entirely (null when read with DuckDB `union_by_name = true`); the `X-Betflux-Dataset-Version` response header still names their version.