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.
| parameter | in | type | |
|---|---|---|---|
league | query | string ^[a-z0-9]{2,16}$ | League id, e.g. nfl. |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
slug required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
slug required | path | string ^[a-z0-9-]{1,80}$ | URL slug, e.g. kansas-city-chiefs. |
season | query | integer | Season 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.
| parameter | in | type | |
|---|---|---|---|
slug required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
league | query | string ^[a-z0-9]{2,16}$ | League id. |
team | query | string ^[a-zA-Z0-9-]{1,80}$ | Team slug or $tag id. |
from | query | string (date-time) | Games starting at or after this instant (ISO 8601). Default: now minus 7 days. |
to | query | string (date-time) | Games starting before this instant. Default: from plus 30 days. |
status | query | scheduled | live | final | postponed | |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
league required | query | string ^[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`.
| parameter | in | type | |
|---|---|---|---|
tag required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
tag required | path | string ^[a-zA-Z0-9-]{1,80}$ | $tag id (CHIEFS) or team / person slug (kansas-city-chiefs). |
from | query | string (date) | First day (YYYY-MM-DD). Default: 30 days before `to`. |
to | query | string (date) | Last day. Capped at `meta.as_of` for your tier. |
segment | query | fan | 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.
| parameter | in | type | |
|---|---|---|---|
league required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
league required | path | string ^[a-z0-9]{2,16}$ | League id, e.g. nfl, epl. |
team | query | string ^[a-zA-Z0-9-]{1,80}$ | Team slug: that team's rows only. |
from | query | string (date) | Earliest week_start. |
to | query | string (date) | Latest week_start. |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
league | query | string ^[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. |
from | query | string (date-time) | Games starting at or after this instant. Default: six hours ago. |
to | query | string (date-time) | Games starting before this instant. Default: from plus 7 days; at most 31 days after from. |
status | query | scheduled | live | final | Default: scheduled and live. Finished games carry their closing line. |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
game required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
game required | path | string ^[A-Z0-9]{2,24}$ | |
limit | query | integer | |
inputs | query | 0 | 1 | 1 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.
| parameter | in | type | |
|---|---|---|---|
league required | path | string ^[a-z0-9]{2,16}$ | League id, e.g. nfl, epl. |
from | query | string (date-time) | Games starting at or after this instant. Default: six hours ago. |
to | query | string (date-time) | Games starting before this instant. Default: from plus 7 days; at most 31 days after from. |
status | query | scheduled | live | final | |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
league | query | string ^[a-z0-9]{2,16}$ | League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl. Default: every league. |
from | query | string (date-time) | Games starting at or after this instant. Default: six hours ago. |
to | query | string (date-time) | Games starting before this instant. Default: from plus 3 days; at most 14 days after from. |
cursor | query | string | The previous page's meta.next_cursor. |
limit | query | integer | Items 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.
| parameter | in | type | |
|---|---|---|---|
game required | path | string ^[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.
| parameter | in | type | |
|---|---|---|---|
game required | path | string ^[A-Z0-9]{2,24}$ | Game id, e.g. PANTHERSPACKERS261030. |
limit | query | integer |
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.
| parameter | in | type | |
|---|---|---|---|
league required | path | string ^[a-z0-9]{2,16}$ | League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl. |
team | query | string ^[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.
| parameter | in | type | |
|---|---|---|---|
league required | path | string ^[a-z0-9]{2,16}$ | League id: nfl, cfb, nba, nhl, mlb, epl, laliga, bundesliga, seriea, ligue1, ucl, mls, nwsl. |
team required | path | string ^[a-z0-9-]{1,80}$ | |
kind | query | champion | win_total | |
limit | query | integer |
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"