§ 03 — schema · data catalogue

What you actually get
when you query foot.io.

Every table, every column, every relationship. All data is versioned, cross-referenced, and exposed via REST + MCP.

matches
308,570 rows
Every match ever played in tracked competitions — full-time, half-time, extra time, and penalty scores.
match_datehome_team_idaway_team_id home_scoreaway_scorekick_off home_score_htaway_score_hthome_score_aet away_score_aethome_penaltiesaway_penalties matchdaystageattendance statusreferee_idstadium_idseason_id
players
49,419 rows
Biographical data with Wikidata/Transfermarkt/FBref/StatsBomb cross-references.
namefull_namedate_of_birth country_idsecond_nationality_idposition detailed_positionheight_cmweight_kg preferred_footphoto_urlis_retiredexternal_ids
player_season_stats
70,517 rows
Per-season metrics including advanced FBref analytics (xG, xAG, progressive actions, SCA/GCA).
appearancesgoalsassists xgxagminutes_played shotsshots_on_targetkey_passes progressive_passesprogressive_carriesshot_creating_actions goal_creating_actionspasses_completedtackles interceptionsaerials_wondribbles_completed yellow_cardsred_cardsclean_sheetssaves
shot_events NEW
6,844 rows
Per-shot expected goals with pitch coordinates, body part, outcome. Growing from StatsBomb open data.
match_idplayer_idminute xgx_pitchy_pitch body_partshot_typeoutcome is_on_targetdistance_mangle_degassisted_by_player_id
match_lineups NEW
12,355 rows
Starting XI + substitutes per match with minutes played and positions.
match_idteam_idplayer_id is_startershirt_numberposition_played minutes_playedrating
player_market_values
614,796 rows
Historical Transfermarkt valuations — track a player's value trajectory.
player_idvalue_datevalue_euros source
transfers
157,186 rows
Every tracked transfer with fees (EUR), type, and loan end dates.
player_idfrom_team_idto_team_id transfer_datetransfer_typefee_euros fee_is_estimatedloan_end_date
match_events
373,179 rows
Minute-by-minute goals, cards, subs, penalties, own goals, VAR decisions.
match_idteam_idplayer_id related_player_idevent_typeminute added_timedetailis_extra_time
betting_odds NEW
43,048 rows
Pre-match closing odds across 1X2, O/U 2.5, Asian handicap from Bet365, Pinnacle, William Hill.
match_idbookmakermarket home_oddsdraw_oddsaway_odds over_oddsunder_oddsline
standings
30,144 rows
League positions per season. Computed from matches; includes form strings and point deductions.
season_idteam_idposition playedwondrawnlost goals_forgoals_againstgoal_difference pointspoints_deductionform
player_injuries
143,022 rows
Career-long injury timelines with reason, days missed, games missed.
player_idinjury_reasonfrom_date end_datedays_missedgames_missed
teams
4,100 rows
Clubs and national teams with identifiers, logos, colors, founded year.
nameshort_namecode country_idfounded_yearstadium_id logo_urlcolorsis_national_team
stadiums NEW
5,166 rows
Venue names, capacities, GPS coordinates, surface, opened year — via Wikidata SPARQL.
namecitycountry_id capacitylatitudelongitude opened_yearsurface
referees NEW
153 rows
Match officials with country, DOB, and Wikidata cross-references.
namecountry_iddate_of_birth external_ids
competitions
81 rows
Leagues, cups, super cups, internationals by tier, gender, country.
namecountry_idcompetition_type tiergenderage_groupis_active
entity_aliases
cross-ref
The secret sauce — every name variation across sources maps to one canonical ID. "Man Utd" = "Manchester United" = "MUFC".
entity_typeentity_idaliassource_id