Leagues reference

Every league Goalfeed has code for, its upstream data source, and an honest tier — not every league that has a client is one you can actually get a Home Assistant event from today.

Minimal working example

List the teams Goalfeed knows about for a league (useful for building watch.* config or a team picker):

bash
curl -s "http://localhost:8080/api/teams?leagueId=1" | python3 -m json.tool

Three tiers, stated plainly

TierMeaningLeagues
Live Registered in the 1-second/1-minute polling loop. A score change fires a real Home Assistant goal event and a WebSocket event message. NHL, MLB, CFL, NFL
API only A full client and service exist and answer /api/games/history, /api/upcoming, and /api/teams, but the league is never registered in main.go's live polling loop. No goal event will ever fire for it. IIHF
Untracked WIP Code exists, compiles, and is wired into both main.go and the web API locally — but the source files are not committed to git, so they are not part of any tagged release or the public repository as published. Not something you can install today. Olympic Men's Hockey, Olympic Women's Hockey

Per-league detail

LeagueIDUpstream sourceWhat's detectedTier
NHL1 api-web.nhle.com — an undocumented, unofficial NHL API Score change → one goal event per point (correct for hockey, where every goal is one point) Live
MLB2 statsapi.mlb.com — the unofficial MLB Stats API Score change → one event per run Live
CFL5 cflscoreboard.cfl.ca, plus a third-party sports-betting live-tracker widget feed (betstream.betgenius.com) for play detail — not a CFL-operated API Score change → one event per point — a converted touchdown (7 points) fires seven events, not one Live
NFL6 ESPN's public site.api.espn.com site API, plus ESPN's "Fastcast" WebSocket for lower-latency in-game push updates Same raw score-diff as CFL — a touchdown-plus-conversion fires seven events Live
IIHF4 realtime.iihf.com Nothing — not polled by the background tickers at all API only
Olympic Men's Hockey7 olympics.com's internal WMR API, hard-coded to the 2026 Winter Games endpoint (wmr-owg2026) — will need a code change for future Games, not a generic/configurable integration Score change → one event per goal. This is also the only league service that populates Event.Type and Event.Description — see the WebSocket reference Untracked WIP
Olympic Women's Hockey8 Same as above Same as above Untracked WIP
EPL is not a league here

League ID 3 is reserved for EPL (English Premier League / soccer) in models/league.go, and the bundled web UI still has a leftover EPL icon/color mapping in its event-feed component. There is no clients/leagues/epl or services/leagues/epl package at all — it is an unused constant, not a supported or partially-supported league. Nothing about EPL/soccer belongs in a Goalfeed config file.

All upstream sources are unofficial

Every API above is the same undocumented, unversioned endpoint each league's own website or app uses — not a published, contractually stable public API. Any of them can change shape or disappear without notice, and Goalfeed has no fallback if one does. See Architecture for why this is the project's biggest operational risk, not just a footnote.

Next

Set which teams to watch per league — configuration reference. Understand why score-diff detection has the consequences it does — Architecture.