bandwagon. Data

Reference

Version 1.0.0. Generated from openapi.json (OpenAPI 3.1), which also drives client generators.

Catalog · Schedules · Sentiment · Index · Odds · Markets · Meta

Envelope

{ "data": …, "meta": { "generated_at": "…", "tier": "free" | "pro", "as_of"?: "YYYY-MM-DD", "next_cursor"?: string | null } }
{ "error": { "code": "…", "message": "…" } }

Catalog

Leagues, teams, people, rosters. Reference data from public and primary sources with provenance.

GET /data/v1/leagues List leagues

The leagues the catalog covers, with their active team counts.

curl "https://bandwagon.fyi/data/v1/leagues" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/teams List teams

Active teams, ordered by slug. Filter by league.

parameterintype
leaguequerystring ^[a-z0-9]{2,16}$League id, e.g. nfl.
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/teams" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/teams/{slug} Get a team

One team by slug, with its league and $tag.

parameterintype
slug requiredpathstring ^[a-z0-9-]{1,80}$URL slug, e.g. kansas-city-chiefs.
curl "https://bandwagon.fyi/data/v1/teams/<slug>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/teams/{slug}/roster Get a team's roster

Players and staff on the team for a season: open roster entries only. Each entry names its source.

parameterintype
slug requiredpathstring ^[a-z0-9-]{1,80}$URL slug, e.g. kansas-city-chiefs.
seasonqueryintegerSeason by its starting year (2026 for NFL 2026 and for the 2026–27 Premier League). Default: the current season.
curl "https://bandwagon.fyi/data/v1/teams/<slug>/roster" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/people/{slug} Get a person

A player or coach by slug: biography, where they are now and where they have been.

parameterintype
slug requiredpathstring ^[a-z0-9-]{1,80}$URL slug, e.g. kansas-city-chiefs.
curl "https://bandwagon.fyi/data/v1/people/<slug>" \
  -H "Authorization: Bearer bwk_…"

Schedules

Games: schedules and results, scraped from public league pages on a timer.

GET /data/v1/games List games

Schedules and results in start-time order, with date filters. Scores come from public league pages on a timer and are not official or real-time.

parameterintype
leaguequerystring ^[a-z0-9]{2,16}$League id.
teamquerystring ^[a-zA-Z0-9-]{1,80}$Team slug or $tag id.
fromquerystring (date-time)Games starting at or after this instant (ISO 8601). Default: now minus 7 days.
toquerystring (date-time)Games starting before this instant. Default: from plus 30 days.
statusqueryscheduled | live | final | postponed
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/games" \
  -H "Authorization: Bearer bwk_…"

Sentiment

Daily ▲/▼ stance counts per tag, split fans / neutrals, house accounts excluded, with sample sizes.

GET /data/v1/sentiment/current Current sentiment for a league's teams

The newest snapshot for each team of the league as of `meta.as_of` (yesterday on the free tier, today on pro), fans and neutrals side by side with sample sizes. Teams without a snapshot are omitted.

parameterintype
league requiredquerystring ^[a-z0-9]{2,16}$League id: every active team of the league.
curl "https://bandwagon.fyi/data/v1/sentiment/current" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/sentiment/{tag} Current sentiment for one tag

The newest snapshot for a team or person, by $tag id or slug, as of `meta.as_of`.

parameterintype
tag requiredpathstring ^[a-zA-Z0-9-]{1,80}$$tag id (CHIEFS) or team / person slug (kansas-city-chiefs).
curl "https://bandwagon.fyi/data/v1/sentiment/<tag>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/sentiment/{tag}/history Sentiment history for one tag

One row per day and segment between `from` and `to`, with counts, score and sample size. At most 366 days per request.

parameterintype
tag requiredpathstring ^[a-zA-Z0-9-]{1,80}$$tag id (CHIEFS) or team / person slug (kansas-city-chiefs).
fromquerystring (date)First day (YYYY-MM-DD). Default: 30 days before `to`.
toquerystring (date)Last day. Capped at `meta.as_of` for your tier.
segmentqueryfan | neutral
curl "https://bandwagon.fyi/data/v1/sentiment/<tag>/history" \
  -H "Authorization: Bearer bwk_…"

Index

The Bandwagon Index: weekly team confidence among neutrals and fans, per league. See /developers/index.

GET /data/v1/index/{league} The Bandwagon Index, current week

The latest published week for a league: every team that met the minimum sample, ranked, with movers. Method: /developers/index.

parameterintype
league requiredpathstring ^[a-z0-9]{2,16}$League id, e.g. nfl, epl.
curl "https://bandwagon.fyi/data/v1/index/<league>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/index/{league}/history The Bandwagon Index, past weeks

Published rows, newest week first, then by rank. Filter to one team for its trajectory.

parameterintype
league requiredpathstring ^[a-z0-9]{2,16}$League id, e.g. nfl, epl.
teamquerystring ^[a-zA-Z0-9-]{1,80}$Team slug: that team's rows only.
fromquerystring (date)Earliest week_start.
toquerystring (date)Latest week_start.
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/index/<league>/history" \
  -H "Authorization: Bearer bwk_…"

Odds

Bandwagon's model lines: win probability, spread, total and no-vig moneyline per game, from Bandwagon's own team ratings over the results it collects. Bandwagon's model, not a sportsbook line; Bandwagon does not accept wagers. Method: /odds/methodology.

GET /data/v1/odds Current model lines

The newest stored line for each game in the window: win probability (home, and draw where possible), spread (the home side's), total, no-vig moneylines, the ratings behind them, and the previous line for movement. Lines are recomputed after every result and nightly, never on request. Bandwagon's model, not a sportsbook line; Bandwagon does not accept wagers.

parameterintype
leaguequerystring ^[a-z0-9]{2,16}$League id of a league with model lines (nfl, cfb, nba, cbb, wcbb, wnba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, mls, nwsl). Default: every covered league.
fromquerystring (date-time)Games starting at or after this instant. Default: six hours ago.
toquerystring (date-time)Games starting before this instant. Default: from plus 7 days; at most 31 days after from.
statusqueryscheduled | live | finalDefault: scheduled and live. Finished games carry their closing line.
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/odds" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/odds/games/{game} Current model line for one game

The newest stored line for a game and the previous one. A finished game answers with its closing line and the result.

parameterintype
game requiredpathstring ^[A-Z0-9]{2,24}$Game id, e.g. CHIEFSSEAHAWKS261101.
curl "https://bandwagon.fyi/data/v1/odds/games/<game>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/odds/games/{game}/history Line history for one game (pro)

Every stored line of a game, oldest first, with the reason each one was stored (nightly, result, roster, manual). Pro keys only; free keys get 403.

parameterintype
game requiredpathstring ^[A-Z0-9]{2,24}$
limitqueryinteger
inputsquery0 | 11 adds each stored line's `inputs`; they are left out of the history by default to keep it small.
curl "https://bandwagon.fyi/data/v1/odds/games/<game>/history" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/odds/{league} Current model lines for a league

The newest stored line for each of the league's games in the window, with the league's current team ratings and its latest backtest (the accuracy record). `paused` is null while the league's lines are being recomputed; when the recompute has failed the same way on two nights it says since when, why and when it will be retried, and the lines shown are from before.

parameterintype
league requiredpathstring ^[a-z0-9]{2,16}$League id, e.g. nfl, epl.
fromquerystring (date-time)Games starting at or after this instant. Default: six hours ago.
toquerystring (date-time)Games starting before this instant. Default: from plus 7 days; at most 31 days after from.
statusqueryscheduled | live | final
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/odds/<league>" \
  -H "Authorization: Bearer bwk_…"

Markets

Prediction-market prices from Kalshi and Polymarket for games and seasons, next to Bandwagon's model: de-vigged probabilities with the time each price was read, championship and win-total prices by team, and the record of market versus model. Market prices from Kalshi and Polymarket, shown for analysis. Bandwagon does not take or place wagers. Method: /markets/methodology.

GET /data/v1/markets Current market probabilities by game

For each game in the window that has a mapped prediction market: the de-vigged home / draw / away probability at Kalshi and Polymarket with the time each price was read, Bandwagon's model probability for the same game, and the gap between them in points. Free keys are delayed 15 minutes. Market prices from Kalshi and Polymarket, shown for analysis. Bandwagon does not take or place wagers.

parameterintype
leaguequerystring ^[a-z0-9]{2,16}$League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl. Default: every league.
fromquerystring (date-time)Games starting at or after this instant. Default: six hours ago.
toquerystring (date-time)Games starting before this instant. Default: from plus 3 days; at most 14 days after from.
cursorquerystringThe previous page's meta.next_cursor.
limitqueryintegerItems per page, 1–200.
curl "https://bandwagon.fyi/data/v1/markets" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/markets/games/{game} Market probabilities for one game

The game's de-vigged probabilities at each source, the model's, the gaps, and the underlying markets (source market id, which result 'yes' is, price, volume, liquidity, mapping confidence). A finished game answers with its closing prices.

parameterintype
game requiredpathstring ^[A-Z0-9]{2,24}$Game id, e.g. PANTHERSPACKERS261030.
curl "https://bandwagon.fyi/data/v1/markets/games/<game>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/markets/games/{game}/history Market probability history for one game (pro)

Every stored de-vigged probability for the game, oldest first, per source. A row is stored when the number moved by half a point or an hour passed. Pro keys only; free keys get 403.

parameterintype
game requiredpathstring ^[A-Z0-9]{2,24}$Game id, e.g. PANTHERSPACKERS261030.
limitqueryinteger
curl "https://bandwagon.fyi/data/v1/markets/games/<game>/history" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/markets/futures/{league} Championship and win-total prices by team

For each team with a season-long market: the championship price and the win-total line nearest even at each source (with price times), the markets' rank of the team for the title, and beside them Bandwagon's rating rank and Index confidence. Raw prices, not normalized: a field adds to a little over 100%. Free keys are delayed 15 minutes.

parameterintype
league requiredpathstring ^[a-z0-9]{2,16}$League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl.
teamquerystring ^[a-z0-9-]{1,80}$A team slug: only that team.
curl "https://bandwagon.fyi/data/v1/markets/futures/<league>" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/markets/futures/{league}/{team}/history Season-long price history for one team (pro)

Every stored price of the team's championship or win-total market at each source, newest first. Pro keys only; free keys get 403.

parameterintype
league requiredpathstring ^[a-z0-9]{2,16}$League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl.
team requiredpathstring ^[a-z0-9-]{1,80}$
kindquerychampion | win_total
limitqueryinteger
curl "https://bandwagon.fyi/data/v1/markets/futures/<league>/<team>/history" \
  -H "Authorization: Bearer bwk_…"

GET /data/v1/markets/accuracy Market versus model record

Brier score, log loss and straight-up record per source, league, kind and period for resolved markets, with the model's numbers on the same games (subject 'model'). Rewritten nightly, published including where the market is better than the model.

curl "https://bandwagon.fyi/data/v1/markets/accuracy" \
  -H "Authorization: Bearer bwk_…"

Meta

This document.

GET /data/v1/openapi.json This API as OpenAPI 3.1

curl "https://bandwagon.fyi/data/v1/openapi.json"