Player season stats
A player's totals for one season: appearances, minutes and rating, plus grouped numbers for scoring, shooting, passing, defending, duels and discipline. Use it for season stat tables, player comparisons or fantasy tools.
https://api.soccer-data.co/v1/players/{player_id}/stats
- season_id is required. Leaving it out returns 400 BAD_REQUEST.
- If you pass a competition_id that the season doesn't belong to, you get 400 SEASON_COMPETITION_MISMATCH.
- expected_goals and expected_assists only add up appearances that had xG data. xg_matches says how many that was, and it can be lower than appearances. Both are null when none of the player's matches had xG.
- Percentage fields are numbers such as 76.7, meaning 76.7%.
- How much detail you get depends on the competition. GET /coverage/leagues shows what each league has.
The player's id, like player_…. Find one with the ID guide.
The season to total up. Get it from a competition's seasons list, or use the competition's current_season_id.
Count only matches in this competition.
regular counts league and group-stage matches only. playoff counts knockout and play-off matches only. all counts every match the player appeared in.
regularplayoffallThe player these totals belong to.
The season the totals cover.
The player's team for these totals.
G, D, M or F. An empty string when the position isn't known.
The player's rating for the season. Null when there isn't one.
Matches the player took part in.
Matches the player started.
Total minutes on the pitch.
Goals scored.
Assists.
Goals plus assists.
Share of shots turned into goals, as a percentage.
Penalties taken.
Penalties scored.
Big chances set up for team-mates.
Big chances the player failed to score.
Season xG, summed over the appearances counted in xg_matches. Null when none of them had xG.
Season xA, on the same basis as expected_goals. Null when none of the appearances had xG.
Appearances that had xG data. Can be lower than appearances.
All shots.
Shots on target.
Shots that missed the target.
Passes attempted.
Passes that reached a team-mate.
Passes that didn't.
Accurate passes as a percentage of all passes.
Passes that led to a shot.
Crosses that found a team-mate.
Accurate crosses as a percentage.
Accurate passes in the player's own half.
Accurate passes in the opponent's half.
Accurate passes in the final third.
Tackles made.
Passes intercepted.
Ground duels won.
Share of ground duels won, as a percentage. Null when not recorded.
Aerial duels won.
Share of aerial duels won, as a percentage. Null when not recorded.
All duels won.
Share of all duels won, as a percentage. Null when not recorded.
Dribbles that beat an opponent.
Share of dribbles that succeeded, as a percentage. Null when not recorded.
Yellow cards.
All red cards, including second yellows.
Straight red cards.
Penalties the player earned.
Penalties the player gave away.
curl "https://api.soccer-data.co/v1/players/player_ul3vc6om97u5/stats?season_id=season_98l95mxugqs9" \ -H "X-Api-Key: $SOCCER_DATA_KEY"
const res = await fetch("https://api.soccer-data.co/v1/players/player_ul3vc6om97u5/stats?season_id=season_98l95mxugqs9", {
headers: { "X-Api-Key": process.env.SOCCER_DATA_KEY },
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://api.soccer-data.co/v1/players/player_ul3vc6om97u5/stats",
params={"season_id": "season_98l95mxugqs9"},
headers={"X-Api-Key": os.environ["SOCCER_DATA_KEY"]},
)
data = res.json()["data"]
$data = Http::withHeaders(['X-Api-Key' => env('SOCCER_DATA_KEY')])
->get('https://api.soccer-data.co/v1/players/player_ul3vc6om97u5/stats', ['season_id' => 'season_98l95mxugqs9'])
->json('data');
{
"data": {
"player_id": "player_ul3vc6om97u5",
"season_id": "season_98l95mxugqs9",
"team_id": "team_f0ibhxdw7hs5",
"position": "F",
"rating": 7.64,
"appearances": 31,
"starts": 21,
"minutes_played": 2225,
"scoring": {
"goals": 7,
"assists": 5,
"goals_assists_sum": 12,
"goal_conversion_percentage": 9.86,
"penalties_taken": 2,
"penalty_goals": 2,
"big_chances_created": 12,
"big_chances_missed": 6,
"expected_goals": 5.31,
"expected_assists": 2.04,
"xg_matches": 9
},
"shooting": {
"total_shots": 71,
"shots_on_target": 27,
"shots_off_target": 29
},
"passing": {
"total_passes": 773,
"accurate_passes": 593,
"inaccurate_passes": 180,
"pass_accuracy": 76.7,
"key_passes": 63,
"accurate_crosses": 21,
"accurate_crosses_percentage": 24.4,
"accurate_own_half_passes": 168,
"accurate_opposition_half_passes": 425,
"accurate_final_third_passes": 262
},
"defending": {
"tackles": 41,
"interceptions": 16
},
"duels": {
"ground_duels_won": 112,
"ground_duels_won_percentage": 46.3,
"aerial_duels_won": 9,
"aerial_duels_won_percentage": 30.0,
"total_duels_won": 121,
"total_duels_won_percentage": 44.8,
"successful_dribbles": 38,
"successful_dribbles_percentage": 47.5
},
"discipline": {
"yellow_cards": 2,
"red_cards": 0,
"direct_red_cards": 0,
"penalty_won": 2,
"penalty_conceded": 0
}
}
}
### GET /players/{player_id}/stats
Player season stats
A player's totals for one season: appearances, minutes and rating, plus grouped numbers for scoring, shooting, passing, defending, duels and discipline. Use it for season stat tables, player comparisons or fantasy tools.
- season_id is required. Leaving it out returns 400 BAD_REQUEST.
- If you pass a competition_id that the season doesn't belong to, you get 400 SEASON_COMPETITION_MISMATCH.
- expected_goals and expected_assists only add up appearances that had xG data. xg_matches says how many that was, and it can be lower than appearances. Both are null when none of the player's matches had xG.
- Percentage fields are numbers such as 76.7, meaning 76.7%.
- How much detail you get depends on the competition. GET /coverage/leagues shows what each league has.
Query parameters:
- `season_id` (string, required): The season to total up. Get it from a competition's seasons list, or use the competition's current_season_id.
- `competition_id` (string): Count only matches in this competition.
- `stage` (string, default "all", one of regular, playoff, all): regular counts league and group-stage matches only. playoff counts knockout and play-off matches only. all counts every match the player appeared in.
Response fields:
- `data.player_id` (string): The player these totals belong to.
- `data.season_id` (string): The season the totals cover.
- `data.team_id` (string): The player's team for these totals.
- `data.position` (string): G, D, M or F. An empty string when the position isn't known.
- `data.rating` (number|null): The player's rating for the season. Null when there isn't one.
- `data.appearances` (integer): Matches the player took part in.
- `data.starts` (integer): Matches the player started.
- `data.minutes_played` (integer): Total minutes on the pitch.
- `data.scoring.goals` (integer): Goals scored.
- `data.scoring.assists` (integer): Assists.
- `data.scoring.goals_assists_sum` (integer): Goals plus assists.
- `data.scoring.goal_conversion_percentage` (number): Share of shots turned into goals, as a percentage.
- `data.scoring.penalties_taken` (integer): Penalties taken.
- `data.scoring.penalty_goals` (integer): Penalties scored.
- `data.scoring.big_chances_created` (integer): Big chances set up for team-mates.
- `data.scoring.big_chances_missed` (integer): Big chances the player failed to score.
- `data.scoring.expected_goals` (number|null): Season xG, summed over the appearances counted in xg_matches. Null when none of them had xG.
- `data.scoring.expected_assists` (number|null): Season xA, on the same basis as expected_goals. Null when none of the appearances had xG.
- `data.scoring.xg_matches` (integer): Appearances that had xG data. Can be lower than appearances.
- `data.shooting.total_shots` (integer): All shots.
- `data.shooting.shots_on_target` (integer): Shots on target.
- `data.shooting.shots_off_target` (integer): Shots that missed the target.
- `data.passing.total_passes` (integer): Passes attempted.
- `data.passing.accurate_passes` (integer): Passes that reached a team-mate.
- `data.passing.inaccurate_passes` (integer): Passes that didn't.
- `data.passing.pass_accuracy` (number): Accurate passes as a percentage of all passes.
- `data.passing.key_passes` (integer): Passes that led to a shot.
- `data.passing.accurate_crosses` (integer): Crosses that found a team-mate.
- `data.passing.accurate_crosses_percentage` (number): Accurate crosses as a percentage.
- `data.passing.accurate_own_half_passes` (integer): Accurate passes in the player's own half.
- `data.passing.accurate_opposition_half_passes` (integer): Accurate passes in the opponent's half.
- `data.passing.accurate_final_third_passes` (integer): Accurate passes in the final third.
- `data.defending.tackles` (integer): Tackles made.
- `data.defending.interceptions` (integer): Passes intercepted.
- `data.duels.ground_duels_won` (integer): Ground duels won.
- `data.duels.ground_duels_won_percentage` (number|null): Share of ground duels won, as a percentage. Null when not recorded.
- `data.duels.aerial_duels_won` (integer): Aerial duels won.
- `data.duels.aerial_duels_won_percentage` (number|null): Share of aerial duels won, as a percentage. Null when not recorded.
- `data.duels.total_duels_won` (integer): All duels won.
- `data.duels.total_duels_won_percentage` (number|null): Share of all duels won, as a percentage. Null when not recorded.
- `data.duels.successful_dribbles` (integer): Dribbles that beat an opponent.
- `data.duels.successful_dribbles_percentage` (number|null): Share of dribbles that succeeded, as a percentage. Null when not recorded.
- `data.discipline.yellow_cards` (integer): Yellow cards.
- `data.discipline.red_cards` (integer): All red cards, including second yellows.
- `data.discipline.direct_red_cards` (integer): Straight red cards.
- `data.discipline.penalty_won` (integer): Penalties the player earned.
- `data.discipline.penalty_conceded` (integer): Penalties the player gave away.
Example: curl "https://api.soccer-data.co/v1/players/player_ul3vc6om97u5/stats?season_id=season_98l95mxugqs9" -H "X-Api-Key: $SOCCER_DATA_KEY"