Featured league example · not aggregate coverage
Premier League
single-league example · response shape, not coverage
home · awayscore · statuskickoff_utc · leaguesoccer data hub
Every soccer competition we serve behind one envelope and one key: live scores, pre-match and in-play odds, confirmed lineups, and stats down to xG. Same field names for each competition, so the parser you write once reads the next without a change. When you need one competition in depth — its season, its table, its fixtures — that competition has its own page.
Aggregate sport hub · choose a league before league-specific detail calls
250 req/day free (500 with GitHub). No credit card.
Soccer · one cross-competition envelope · a dedicated page per competition
US developers usually search "soccer"; elsewhere it is "football". See the Football Data API →
Featured league example · not aggregate coverage
single-league example · response shape, not coverage
home · awayscore · statuskickoff_utc · league13 seasons are on record, back to 2014-15 — 21,866 finished games you can query today. One route serves the full span. These figures are measured from the customer-facing routes listed below, so this page cannot silently drift from the product.
| Archive | Route | Seasons | Reaches back to | Finished games |
|---|---|---|---|---|
| English Premier League | /v1/matches | 13 | 2014-15 – 2026-27 | 4,610 |
| La Liga | /v1/matches | 13 | 2014-15 – 2026-27 | 4,629 |
| Serie A | /v1/matches | 13 | 2014-15 – 2026-27 | 4,611 |
| Bundesliga | /v1/matches | 13 | 2014-15 – 2026-27 | 3,724 |
| Ligue 1 | /v1/matches | 13 | 2014-15 – 2026-27 | 4,292 |
Edge and Pro reach everything listed above. Solo and Trio reach five seasons. Free covers the current season.
Unified schema
Canonical IDs, league keys, status and timestamps travel with the row. The hub describes shared fields; each league authority documents its own depth.
No featured-league field is promoted to a sport-wide guarantee.
Event surface
Event granularity differs by competition. Discover a match and league first, then use that authority’s event contract rather than assuming one featured feed applies everywhere.
/v1/matches/:id/odds?sport=footballPre-match + in-play odds across 16+ booksedge/v1/stored/matches/:id/lineupsStarting XI + bench when publishedfree/v1/stored/matches/:id/statsPossession, shots, passesfree/v1/matches/:id/statisticsPer-team match stats incl. expected goals (xG); the route is Free, the expected_goals field is Solo+freeWhat you can build
Each concept points to a real league authority, guide or reference. The phone mockups are product patterns, not claims that every league supplies identical depth.
soccer pattern 01
1 · home · away2 · score · status3 · kickoff_utc · leagueOne integration covers every competition you want to show.
Explore Premier League →soccer pattern 02
1 · home · away2 · score · status3 · kickoff_utc · leagueConfirmed lineups, formations, and live stats alongside the game.
Explore Premier League →soccer pattern 03
1 · home · away2 · score · status3 · kickoff_utc · leaguePer-player goals and assists across leagues in one feed, plus xG on the Solo plan and above.
Explore Premier League →soccer pattern 04
1 · home · away2 · score · status3 · kickoff_utc · leaguePre-match and in-play odds with against-the-spread splits.
Explore Premier League →soccer pattern 05
1 · home · away2 · score · status3 · kickoff_utc · leaguePlayer-season xG, xA, npxG and xG chain across twelve seasons, for season-over-season analysis. Needs the Solo plan or above.
Explore Premier League →soccer pattern 06
1 · home · away2 · score · status3 · kickoff_utc · leagueElo predictions, group standings, and xG for the tournament.
Explore Premier League →League directory
League pages own seasons, participants, examples and measured depth. This hub owns discovery across them.
| League authority | Role | Next step |
|---|
Coverage strength
Counts below describe published route rows on this hub, not a promise that every league fills every field.
League authorities
Published routes
Build patterns
FAQ answers
On the gateway at api.bigballsdata.com. Authenticate with the bearer token from /dashboard/keys.
| Method | Path | Returns | Plan |
|---|---|---|---|
| GET | /v1/leagues?sport=football | Every soccer league key you can filter by | Free |
| GET | /v1/matches?sport=football&league=epl | Live + scheduled fixtures (swap the league key) | Free |
| GET | /v1/standings?sport=football&league=epl | League table for any competition | Free |
| GET | /v1/matches/:id/odds?sport=football | Pre-match + in-play odds across 16+ books | Edge |
| GET | /v1/stored/matches/:id/lineups | Starting XI + bench when published | Free |
| GET | /v1/stored/matches/:id/stats | Possession, shots, passes | Free |
| GET | /v1/matches/:id/statistics | Per-team match stats incl. expected goals (xG); the route is Free, the expected_goals field is Solo+ | Free |
| GET | /v1/players/:id/stats?sport=football | Per-season player stats (goals, assists) | Free |
| GET | /v1/leagues/:id/xg-leaders | Season xG, xA and npxG leaderboard for the big five leagues | Solo |
| GET | /v1/matches/:id/events?sport=football | Goals, cards, substitutions | Free |
| GET | /v1/players/:id/club-form | Club season stats: appearances, goals, assists, minutes (top 5 leagues, 2025-26). The season-average match rating is Solo and up. | Free |
Every soccer stat field the API returns today — 82 in total, grouped by how they are produced. Each group carries its own freshness, because a sport is rarely uniformly current.
Written after the game ends — not a live in-game feed. Last ingested 2026-09-15.
Fields (42)
Written after the game ends — not a live in-game feed. Last ingested 2026-09-16.
Fields (40)
We build what people actually ask for. If a field you need is not on this page, tell us — requests are how we decide what to add next.
Player availability
Injury, lineup and participant availability vary by league and season. Missing rows stay missing; the hub does not borrow another league’s records.
Check the selected league authority and response timestamp before presenting a status as current.
Next up
Each league publishes its own schedule and its own season boundaries. Call the league you selected and read the status and kickoff on the rows it returns, rather than inferring a season from this hub.
GET /v1/leaguesChoose a real league key
/v1/leagues?sport=footballKeep league + season
GET /v1/matches/{id}Traverse canonical IDs
From response to product
This is visibly scoped to Premier League, single-league example · response shape, not coverage; it demonstrates the shared envelope without claiming that league represents all soccer.
Featured league example
single-league example · response shape, not coverage
home · awayscore · statuskickoff_utc · league{
"data": [
{
"id": "canonical-id-from-response",
"sport": "football",
"league": "selected-league-key",
"status": "finished",
"home": {
"name": "Home participant"
},
"away": {
"name": "Away participant"
},
"score": {
"home": null,
"away": null
}
}
],
"meta": {
"example_scope": "Premier League · single-league example · response shape, not coverage",
"note": "Shape example; request the API for current values."
}
}soccer resources
Every card is a real destination. League authorities remain separate from supporting product and documentation routes.
Real API example
The request deliberately omits a featured league when the route supports sport-wide discovery. Select a returned league key before league-specific calls.
curl -H "Authorization: Bearer $BBS_API_KEY" "https://api.bigballsdata.com/v1/leagues?sport=football"{
"data": [
{
"id": "canonical-id-from-response",
"sport": "football",
"league": "selected-league-key",
"status": "finished",
"home": {
"name": "Home participant"
},
"away": {
"name": "Away participant"
},
"score": {
"home": null,
"away": null
}
}
],
"meta": {
"example_scope": "Premier League · single-league example · response shape, not coverage",
"note": "Shape example; request the API for current values."
}
}import { BigBallSportsClient } from '@bigballsdata/sdk';
const client = new BigBallSportsClient(process.env.BBS_API_KEY!);
// Live matches across every soccer league in one call. Returns an empty array
// when nothing is in play — that is a valid answer, not an error.
const matches = await client.matches.list({ sport: 'football', status: 'live' });
if (matches.data.length === 0) console.log('No soccer matches in play right now.');
for (const m of matches.data) {
// Score lives on m.score ({home, away}), not m.scores.value.
console.log(m.league, m.home.name, 'v', m.away.name, m.score ? `${m.score.home}-${m.score.away}` : '-');
}MCP
An agent should discover soccer leagues, select one explicitly, then traverse matches and players by returned canonical IDs.
get_leaguessport: footballget_matchesleague: selected keyget_match_detailsmatch_id: returned UUIDData freshness
The hub never turns a single-league example into a current sport-wide claim, and it states no season of its own.
Source: League response
Source: Match response
Source: Dataset response
Source: Static label
Plan decision
Each row preserves its league or sport scope and resolves against the endpoint plan registry when that route has a canonical entry.
| Endpoint | Scope | Minimum plan |
|---|---|---|
| /v1/leagues?sport=football | Sport/shared | free |
| /v1/matches?sport=football&league=epl | League-specific | free |
| /v1/standings?sport=football&league=epl | League-specific | free |
| /v1/matches/:id/odds?sport=football | Sport/shared | edge |
| /v1/stored/matches/:id/lineups | Sport/shared | free |
| /v1/stored/matches/:id/stats | Sport/shared | free |
| /v1/matches/:id/statistics | Sport/shared | free |
| /v1/players/:id/stats?sport=football | Sport/shared | free |
| /v1/leagues/:id/xg-leaders | Sport/shared | solo |
| /v1/matches/:id/events?sport=football | Sport/shared | free |
| /v1/players/:id/club-form | Sport/shared | free |
Founder pricing
Prices and included dimensions come from the shared billing manifest; league coverage remains documented on each authority page.
100 requests per minute and 250 per day, free — the highest per-minute burst of any free sports API we checked. Burst is what matters when something asks several questions in a row and waits on each answer.
Connect your account to Claude, ChatGPT, Cursor, Perplexity or any other MCP-compatible tool and ask for soccer data in conversation — scores, standings, player stats and Elo ratings, with no API key to paste and no code to write. Your plan and limits carry over exactly as they do here.
Connect your AI tool →250 req/day free (500 with GitHub). Production starts at $49/mo. Live WebSocket push on Pro+.
Frequently asked
Yes, La Liga and Ligue 1, plus the Premier League, Bundesliga, Serie A, MLS, the Champions League, and the FIFA World Cup 2026. Call /v1/leagues?sport=football for the full, current list of league keys.
Yes. It covers scores, lineups, stats, standings, and scoring events. There is a free tier; pricing lists what each plan covers. The full minute-by-minute stream is Pro; odds require the Edge plan ($149/mo) or higher. Free keys get 250 req/day (500 with GitHub). No credit card.
Yes, on the Solo plan and above. /v1/matches/:id/statistics returns per-team expected goals (the route is Free; the expected_goals field is Solo+, so Free keys get the rest of the team stats without it), and /v1/leagues/:id/xg-leaders returns the player-season xG leaderboard (Solo+). /v1/stored/matches/:id/stats does not carry xG.
Yes. All 104 World Cup 2026 matches are part of the same soccer surface, with final odds, Elo-based match predictions, and final group standings from the completed tournament (June 11 - July 19, 2026). See the dedicated World Cup 2026 API page.
Yes, on a free key. Club season stats for the top 5 European leagues are available via GET /v1/players/:id/club-form. Returns appearances, goals, assists and minutes for the 2025-26 season; the season-average match rating is included from Solo up. WC2026 squad players are linked automatically.