One address, three endings

Everything is a URL you can open in a browser. Add your key. Change f= to change the format, b= to change the board. Add week= and version= to fetch exactly what you used on Tuesday.

# This hour's NFL board as a spreadsheet file
GET https://betbetter.world/data/feed.aspx?b=nfl&f=board.csv&key=bbd_live_…

# Same thing for an app
GET https://betbetter.world/data/feed.aspx?b=nfl&f=board.json&key=bbd_live_…

# Excel workbook (board + dictionary tab)
GET https://betbetter.world/data/feed.aspx?b=nfl&f=board.xlsx&key=bbd_live_…

# A specific week and version
GET https://betbetter.world/data/feed.aspx?b=nfl&f=board.csv&week=w01&version=2&key=…

# Everything graded so far (final pre-kick row per game)
GET https://betbetter.world/data/feed.aspx?b=nfl&f=history.csv&key=…
200 OK · X-BB-Week: w01 · X-BB-Version: 2 · X-BB-Published: 2026-09-08T11:00:00Z · X-BB-Source: board

The key can also travel as a header: Authorization: Bearer bbd_live_… is accepted wherever key= is. Opened from your feed page while signed in, no key is needed at all.

Google Sheets and Excel

Google Sheets

In any cell: =IMPORTDATA("https://betbetter.world/data/feed.aspx?b=nfl&f=board.csv&key=bbd_live_…"). Sheets refreshes it about hourly. Put it on its own tab and build your work on other tabs that reference it.

Excel (Windows and Mac)

Data → From Web → paste the same address → Load. Right-click the table → Refresh, or set Query Properties → refresh every 60 minutes. Excel 365 also accepts =WEBSERVICE(...) for a single value.

Numbers, LibreOffice, anything else

Download the CSV or XLSX and open it. Same columns, same numbers.

Board columns

See the columns with real numbers on any board page: this week's games, market lines, gap, versions and last week in full.

Every row is one game. Column names never change between boards; a column that doesn't apply to a sport is simply empty.

ColumnExampleMeaning
game_idnfl-20260913-nyj-tenStable id; same across every version and file
kickoff_utc2026-09-13T17:00:00ZScheduled kickoff
away / homeNew York Jets / Tennessee TitansFull names; away_abbr / home_abbr where known
spread_home-10.5Model spread, home side; negative = home favoured
total44.8Model total points
win_prob_home0.585Moneyline win probability, calibrated — this is the number we publish, track and grade, the same one our own board runs on. Soccer adds win_prob_draw
model-only (raw)—Not in this file. The raw model number before the market anchor and calibration is an odds-feed field, labelled “model-only (raw), for odds feeds”; ask us and we add it to your licence
fair_ml_home / fair_ml_away-141 / +141No-vig American price implied by the probability
fair_spread_price / fair_total_price-104 / -110Fair price at the model line
market_spread_home / market_total / market_ml_*-9.5 / 45.0Consensus market line at publish time, so you see the gap
h1_spread_home / h1_total / h1_win_prob_home-5.5 / 22.5 / 0.57First-half numbers where modelled
sd_margin / sd_total13.1 / 10.4Model uncertainty in points; use it to size confidence
published_utc2026-09-08T11:00:14ZWhen this row's numbers were published
version / week_key2 / w01Version of the week's board this row belongs to; w01.. weekly, dYYYY-MM-DD daily
sourceboardboard = every-game emitter; predictions = every-game margin/total table; selections = partial board while a league's every-game feed is being connected
feed_refbbd-12-3f9a1cYour licence reference, on every row of every file

Player props file

Every board with player markets also publishes a props file: f=props.csv, props.json or props.xlsx (same key, same address). One row per player and market at the main line, the line most books quote; ties go to the line nearest our projection. Yes/no markets (anytime scorer, anytime TD, anytime try) use line 0.5. Last week's props are free: f=props-free.csv.

ColumnExampleMeaning
player · teamPatrick Mahomes · KCPlayer name as the books list it; team when known
market · market_labelplayer_pass_yds · Passing yardsMarket key and its plain-English name
line274.5The main line
projection · sd281.4 · 42.0Our expected value for the stat and our uncertainty around it
prob_over · prob_under0.564 · 0.436Our chance the player goes over / under the line
fair_over_price · fair_under_price-129 · +129Those chances as American odds, no margin
market_over_price · market_under_price · n_books-115 · -105 · 6Consensus book prices at publish time and how many books quoted the line
game_id · kickoff_utc · away · home—Same game keys as the board file, so props join to games
published_utc · version · week_key · model_version · feed_ref—As on the board file

Game markets file

Every board also publishes a game-markets file: f=markets.csv, markets.json or markets.xlsx (same key, same address; week= and version= work as on the board). One row per market, side and line for every game-level market the model prices beyond the headline spread, total and moneyline: team totals, first and second halves, quarters, first-5-innings (baseball), periods (hockey), corners and both-teams-to-score (soccer), set winners and game handicaps (tennis). Main lines and alternate lines are both included, flagged by is_alternate. Versioned exactly like the board.

ColumnExampleMeaning
market · market_label · periodteam_total_h1 · Team total (1st half) · h1Normalised key, plain-English name, period
side · teamover · Kansas City ChiefsThe side priced (home, away, draw, over, under, yes, no); team for team totals
line · is_alternate13.5 · 0The line; 1 marks an alternate line
model_prob · fair_price0.571 · -133Our chance this side wins at this line, and that chance as American odds with no margin
market_price · n_books-110 · 5Consensus book price at publish and how many books quoted it
projection27.4Our projected margin or total behind spread/total markets
game_id · kickoff_utc · away · home · published_utc · version · week_key · model_version · feed_ref—As on the board file

Fantasy projections file

NFL and AFL boards also publish a fantasy file: f=fantasy.csv, fantasy.json or fantasy.xlsx (same key, same address). One row per player for the coming week or round. NFL rows carry projected points under standard, half-PPR, full-PPR, DraftKings and FanDuel scoring plus the projected stat line (passing, rushing, receiving); AFL rows carry AFL Fantasy points. The file is replaced by each model run rather than versioned, so updated_utc is its timestamp.

ColumnExampleMeaning
player · team · positionAmon-Ra St. Brown · DET · WRAs the model lists them
scoringstd | half_ppr | pprWhich formats the points columns cover
fpts · fpts_half_ppr · fpts_ppr · fpts_dk · fpts_fd17.0 · 22.3 · 27.6 · 27.9 · 22.5Projected points under standard, half-PPR, PPR, DraftKings and FanDuel scoring (AFL Fantasy points sit in fpts)
pass_yds · pass_tds · pass_int · rush_yds · rush_tds · receptions · rec_yds · rec_tds—The projected stat line behind the points (NFL)
season · updated_utc · week_key · feed_ref—Season, model-run timestamp, the board week, your licence reference

Versions and timestamps

A week's board is published as version 1 (the opening board), then re-published as a new version whenever the model re-runs and numbers move. Every version is kept. versions.json lists them; version= fetches one. Each row's published_utc is the audit trail: the number, and when it existed.

GET /data/feed.aspx?b=cfb&f=versions.json
{"board":"cfb","week_key":"w03","current_version":3,"versions":[{"version":1,"published_utc":"2026-09-06T02:14:00Z","games":87,"note":"Opening board"}, …]}

Kickoff freezes a game: its last pre-kick row is the one that gets graded and the one that appears in history.csv.

Other files

f=Needs keyWhat it is
board.csv / .json / .xlsxyesThe current (or requested) week's board
history.csv / .jsonyesFinal pre-kick row for every past game we hold for the board
markets.csv / .json / .xlsxyesGame markets: team totals, halves, quarters, first-5-innings, corners, BTTS, set winners; main + alternate lines, versioned
fantasy.csv / .json / .xlsxyesFantasy projections for the coming week or round (NFL, AFL)
free.csv / .xlsx / .jsonnoLast completed week, final version. The try-before-you-pay file
ledger.csvnoClosing-line ledger: every published line, the closing price, and whether it beat the close
metrics.csvnoGraded record per market, closing-line summary, RMSE against the book where computed. Current season only. Where a season has a gap, one coverage_note row says which weeks are missing
versions.json / status.jsonnoVersion list for a week; live status for every board

JSON shape

{
  "board": "nfl", "board_name": "NFL", "week_key": "w01", "version": 2,
  "published_utc": "2026-09-08T11:00:14Z", "source": "board", "games": 16, "feed_ref": "bbd-12-3f9a1c",
  "rows": [ { "game_id": "nfl-20260913-nyj-ten", "kickoff_utc": "2026-09-13T17:00:00Z", "away": "New York Jets", "home": "Tennessee Titans",
              "spread_home": -10.5, "total": 44.8, "win_prob_home": 0.585, "fair_ml_home": -141, "fair_ml_away": 141, … } ]
}

Numbers are numbers (not strings). Missing values are null. Response headers repeat week, version, publish time and source, and an ETag lets you poll cheaply with If-None-Match (304 when nothing changed).

Webhooks

Save an https address on your feed page and we POST to it every time a board version is published. Body:

{"event":"board.version","board":"nfl","week_key":"w01","version":2,"published_utc":"2026-09-08T11:00:14Z","games":16,"note":"Injury re-run","url":"https://betbetter.world/data/feed.aspx?b=nfl&f=board.json&week=w01&version=2"}

Headers: X-BB-Timestamp (unix seconds) and X-BB-Signature = HMAC-SHA256(secret, timestamp + "." + body) in hex. The secret is shown on your feed page. Respond 2xx within 10 seconds; we retry on the next run.

Rate limits and fair use

Boards and seasons

BoardCodeSeasonNow
NFLnflSep to FebLive 15 games this week
College football (FBS)cfbAug to JanLive 40 games this week
NBAnbaOct to JunPreview full board switching on
College basketballcbbNov to AprOff season
WNBAwnbaMay to OctLive 2 games this week
NHLnhlOct to JunLive 12 games this week
MLBmlbMar to OctLive 4 games this week
AFLaflMar to SepOff season
NRLnrlMar to OctPreview full board switching on
Premier LeagueeplAug to MayLive 10 games this week
La LigalaligaAug to MayLive 7 games this week
BundesligabundesligaAug to MayLive 7 games this week
Serie AserieaAug to MayLive 10 games this week
Ligue 1ligue1Aug to MayLive 8 games this week
MLSmlsyear-roundLive 16 games this week
EFL ChampionshipeflchampAug to MayLive 10 games this week
BrasileirãobrasileiraoApr to DecLive 17 games this week
A-LeaguealeagueOct to MayPreview full board switching on
Tennis (ATP + WTA)tennisyear-roundLive 25 games this week
UFC / MMAufcyear-roundLive 10 games this week
Cricketcricketyear-roundLive 2 games this week

Status

GET /data/feed.aspx?f=status.json returns every board's latest week, version, game count and publish time. Right now: 16 boards live, 195 games on this week's boards, last publish Tue 6 Oct, 8:05 am ET. Something wrong? hello@betbetter.world, one business day.

Changelog

Bet Better Pty Ltd · ABN 66 670 726 691 · LicenceModel output is information, not advice.