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 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.
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. - From
dataset_versionv8, a book with no observation for the game in the 24 hours beforegame_starthas no closing fields, as in closing-lines: its last quote is stale, not a close. Its selections are still graded. - From
dataset_versionv9, 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_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. Selections first listed at or aftergame_start(live-only, null closing fields) have no closing-lines row from closing-lines v6 onward; join with aLEFT JOINwhen you need them.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 | Market type, e.g. SPREAD, MONEYLINE, TOTAL, PLAYER_METRIC_OVER_UNDER. |
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. |
is_mainline | boolean | yes | True 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_version | string | yes | Version 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. |