whoscored.com APIwhoscored.com ↗
Access WhoScored.com football data via API. Search players and teams, retrieve per-season stats including ratings, goals, pass success, and appearances.
curl -X GET 'https://api.parse.bot/scraper/fefeab4f-b650-45ef-9b05-42622fe3619a/search?query=Barcelona' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for players or teams by name. Returns player IDs, slugs, teams, and ages for players, and team IDs, slugs, names, and countries for teams. Player-only queries return an empty teams array and vice versa.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword (player or team name) |
{
"type": "object",
"fields": {
"teams": "array of team objects with team_id, slug, name, and country",
"players": "array of player objects with player_id, slug, name, team, and age"
},
"sample": {
"data": {
"teams": [],
"players": [
{
"age": 38,
"name": "Lionel Messi",
"slug": "lionel-messi",
"team": "Inter Miami CF",
"player_id": 11119
}
]
},
"status": "success"
}
}About the whoscored.com API
The WhoScored API exposes 3 endpoints for accessing football player and team data from WhoScored.com. Use the search endpoint to resolve player IDs and team IDs by name, then pull full seasonal performance records — including ratings, goals, appearances, and pass success rates — via get_player_stats and get_team_stats. Each stats endpoint returns structured per-tournament records with a dynamic column manifest.
Search Players and Teams
The search endpoint accepts a query string and returns two arrays: players and teams. Player results include player_id, slug, name, team, and age. Team results include team_id, slug, name, and country. When the query matches only players, the teams array is empty, and vice versa. The numeric IDs returned here are the required inputs for the two stats endpoints.
Player Statistics
get_player_stats accepts a player_id and returns playerTableStats, an array of seasonal records broken down by tournament. Each record maps to the columns listed in statColumns — fields like rating, goals, appearances, and pass success percentage. The paging object describes the total result set if multiple pages are available. Because stats are grouped per tournament, a player active in multiple competitions in the same season will produce multiple rows.
Team Statistics
get_team_stats mirrors the player stats structure but for a given team_id. The teamTableStats array contains one record per tournament the team participated in, covering metrics such as rating, goals scored, possession, and pass success. The statColumns array acts as the column key for interpreting each record, so the field set is self-describing. Use the paging object to detect whether additional pages exist for teams with long histories.
- Track a player's rating and goal tally across multiple seasons and competitions using
get_player_stats - Compare pass success rates between two teams in the same league via
get_team_stats - Resolve player IDs from shirt names or partial name queries using the
searchendpoint before pulling stats - Build a season-over-season performance chart for a club using
teamTableStatsrecords - Monitor appearance counts and ratings for scouting shortlists by polling
get_player_statsperiodically - Identify which tournaments a team participated in and their per-competition stats from a single
get_team_statscall - Cross-reference player age from
searchresults with performance metrics to analyze development trends
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 250 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does WhoScored have an official public developer API?+
What does the `statColumns` field tell me, and do I need it?+
statColumns is an ordered array of column names that correspond positionally to the values in each record within playerTableStats or teamTableStats. You need it to interpret the stat records correctly, because the records themselves do not include field names inline — the column manifest is what maps each position to its meaning.Does the API return individual match events or lineups?+
Are there any gaps in tournament or league coverage for stats results?+
paging object will indicate if only a single page of results is available.