Skip to content

BallDontLie FIFA Source Research

Status: BallDontLie FIFA source code exists in pkg/source/balldontlie_fifa. This document maps the official API surface for the selected main tables and should guide any follow-up schema changes.

Primary docs:

Connection

ItemValue
Base URLhttps://api.balldontlie.io/fifa/worldcup/v1
AuthAuthorization: <api-key> request header
Supported seasons2018, 2022, 2026
Default season behaviorMost season-filtered endpoints default to 2026; players and rosters return all editions when seasons[] is omitted.
PaginationCursor pagination with per_page max 100 and cursor for most list endpoints.
Errors401 auth/tier, 400 bad request, 404 not found, 406 non-json, 429 rate limited, 500/503 service errors.

Tier Map

TierPriceRate limitIncluded selected endpoints
Free$0/mo5 requests/minteams, stadiums
ALL-STAR$9.99/mo60 requests/minteams, stadiums, group_standings
GOAT$39.99/mo600 requests/minAll FIFA World Cup endpoints, including matches, players, rosters, match_lineups, match_events, and match stats

Paid tiers are sport-specific. BallDontLie also offers a 48-hour GOAT trial for paid sports at the trial rate limit.

Main Table Coverage

Main tableCoveragePrimary endpointRequired tierExisting source table
TeamsYesGET /teamsFreeteams
StadiumsYesGET /stadiumsFreestadiums
Group standingsYesGET /group_standingsALL-STARgroup_standings
MatchesYesGET /matchesGOATmatches
PlayersYesGET /playersGOATplayers
Match eventsYesGET /match_eventsGOATmatch_events

The existing BallDontLie source also supports rosters, match_lineups, player_match_stats, team_match_stats, match_shots, match_momentum, match_best_players, match_avg_positions, and match_team_form.

Endpoint Map

Teams

GET /teams

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; default [2026].

Response fields include id, name, abbreviation, country_code, and confederation.

Stadiums

GET /stadiums

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; default [2026].

Response fields include id, name, city, country, capacity, latitude, and longitude.

Group Standings

GET /group_standings

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; default [2026].

Response fields include nested season, team, and group objects plus position, played, won, drawn, lost, goals_for, goals_against, goal_difference, and points.

Matches

GET /matches

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; default [2026].
match_ids[]Noint arrayFilter to specific match IDs.
team_ids[]Noint arrayFilter to matches involving any listed team.
per_pageNointegerPage size, max 100; default 25.
cursorNointeger/stringCursor for next page.

Response fields include match ID, match number, UTC datetime, status, nested season, stage, group, stadium, home/away teams, team-source placeholders, scores by period, penalties, referee, managers, attendance, and winner metadata where available.

Players

GET /players

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; when omitted, returns players across all editions.
team_ids[]Noint arrayFilter to players who appeared on listed teams.
searchNostringCase-insensitive substring match on player name.
per_pageNointegerPage size, max 100; default 25.
cursorNointeger/stringCursor for next page.

Response fields include id, name, short_name, position, date_of_birth, country_code, country_name, height_cm, and jersey_number.

Rosters

GET /rosters

Use this endpoint to tie players to teams and editions.

ParameterRequiredTypeUse
seasons[]Noint arrayAllowed values: 2018, 2022, 2026; when omitted, returns all editions.
team_ids[]Noint arrayFilter to team IDs.
player_ids[]Noint arrayFilter to player IDs.
per_pageNointegerPage size, max 100; default 25.
cursorNointeger/stringCursor for next page.

Response fields include nested season, team_id, nested player, position, appearances, starts, minutes_played, goals, assists, yellow_cards, red_cards, and avg_rating.

Match Lineups

GET /match_lineups

Use this endpoint if the connector later expands "players" into per-match participation.

ParameterRequiredTypeUse
match_ids[]Noint arrayFilter to match IDs.
team_ids[]Noint arrayFilter to team IDs.
per_pageNointegerPage size, max 100; default 25.
cursorNointeger/stringCursor for next page.

Match Events

GET /match_events

ParameterRequiredTypeUse
match_ids[]Noint arrayFilter to match IDs.
per_pageNointegerPage size, max 100; default 25.
cursorNointeger/stringCursor for next page.

Event data covers match incidents such as goals, cards, substitutions, VAR-style events, and shootout-related events when present in the provider payload.

Match Stats Endpoints

These are not in the requested main-table list, but the existing source already implements them and they are GOAT-tier according to the docs.

EndpointParametersExisting table
GET /player_match_statsmatch_ids[], player_ids[], team_ids[], per_page, cursorplayer_match_stats
GET /team_match_statsmatch_ids[], team_ids[], per_page, cursorteam_match_stats
GET /match_shotsmatch_ids[], player_ids[], per_page, cursormatch_shots
GET /match_momentummatch_ids[], per_page, cursormatch_momentum
GET /match_best_playersmatch_ids[], per_page, cursormatch_best_players
GET /match_avg_positionsmatch_ids[], team_ids[], per_page, cursormatch_avg_positions
GET /match_team_formmatch_ids[], per_page, cursormatch_team_form

Existing Connector Notes

  • Current URI: balldontlie-fifa://?api_key=<api-key>&season=2026.
  • Current connector sends Authorization and seasons[] on every table.
  • Current connector handles cursor pagination and lets ReadOptions.PageSize reduce page size below the default.
  • One follow-up to consider: players and rosters docs say omitted seasons[] has all-edition behavior, but the connector always sends the configured season. That is correct for the requested World Cup 2026 default.