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 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.

  • 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.
  • 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.
  • 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_typestringno
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.