SofaScore API endpoint
Returns a competition season's top players for every statistic category SofaScore ranks (for football about 30 categories such as rating, goals, assists, expected goals, tackles and saves; for basketball points, rebounds, assists and more), each with the ranked players, their team and the value. The category set depends on the sport and competition, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season` and `playoffs`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50). Get `id` from search and `season` from tournament-seasons.
/sofascore/tournament-top-playersQuery parameters:
id: required. Numeric SofaScore unique-tournament (competition) id, e.g. 17 for the Premier League.season: required. Numeric SofaScore season id from sofascore/tournament-seasons, e.g. 96668.type: optional enum. Allowed values: overall, regular_season, playoffs. Defaults to overall. Football competitions publish overall; the NBA publishes regular_season and playoffs. A type the competition does not publish answers 404 (for example overall for the NBA, or any type for a season that has not started).limit: optional integer, 1 to 50. Rows per category. Omit it to return every row (SofaScore ranks at most 50 players per category).Notable response behavior:
categories keeps SofaScore's order and holds one entry per statistic, each with key, count and players. The category set depends on the sport and the competition, so read it from the response rather than assuming it. Premier League 2026/27 returns 32 categories: rating, goals, expectedGoals, assists, expectedAssists, goalsAssistsSum, kilometersCoveredPer90, numberOfSprintsPer90, topSpeed, penaltyGoals, freeKickGoal, scoringFrequency, totalShots, shotsOnTarget, bigChancesMissed, bigChancesCreated, accuratePasses, keyPasses, accurateLongBalls, successfulDribbles, penaltyWon, tackles, interceptions, clearances, possessionLost, yellowCards, redCards, saves, goalsPrevented, mostConceded, leastConceded and cleanSheet. The Champions League returns 30 (no per-90 distance or sprint categories), and the NBA 24 (rating, points, rebounds, assists, steals, blocks, threePointsMade, plusMinus and more).rank is the position in SofaScore's list for that category. For mostConceded and leastConceded the list order is not strictly by value.value is the category's headline figure (for mostConceded and leastConceded it is goals conceded). details holds any secondary figures SofaScore sends with it, such as penaltiesTaken for penaltyGoals, and is omitted when there are none. played_enough tells whether the player met SofaScore's minimum-appearances rule for ranked lists.redCards or cleanSheet early in a season); a response with no categories at all is treated as an upstream error.limit. For a sortable table of every player use sofascore/tournament-player-statistics.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 17,
"season_id": 96668,
"type": "overall",
"sport": "football",
"category_count": 32,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/17/season/96668/top-players/overall",
"fetched_at": "2026-10-07T14:00:00Z",
"categories": [
{
"key": "goals",
"count": 1,
"players": [
{
"rank": 1,
"value": 5,
"appearances": 5,
"played_enough": true,
"player": { "id": 839956, "name": "Erling Haaland", "short_name": "E. Haaland", "slug": "erling-haaland", "position": "F" },
"team": { "id": 17, "name": "Manchester City", "slug": "manchester-city" }
}
]
}
]
}
}
| Field | Filled in, of 32 checked | Values in the sample |
|---|---|---|
| key | 32 | |
| count | 32 | 9 to 40, median 40 |
| players | 32 | median 40 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore unique-tournament (competition) id | 17 | |
| season | string | Yes | Numeric SofaScore season id | 96668 | |
| type | string | No | overall | Statistics scope. Defaults to overall Allowed values: overall, regular_season, playoffs. | overall |
| limit | integer | No | Rows per category, 1 to 50. Omit to return every row Minimum: 1. Maximum: 50. | 5 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/tournament-top-players?id=17&season=96668&type=overall&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 17,
"season_id": 96668,
"type": "overall",
"sport": "football",
"category_count": 32,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/17/season/96668/top-players/overall",
"fetched_at": "2026-10-07T14:00:00Z",
"categories": [
{
"key": "goals",
"count": 1,
"players": [
{
"rank": 1,
"value": 5,
"appearances": 5,
"played_enough": true,
"player": {
"id": 839956,
"name": "Erling Haaland",
"short_name": "E. Haaland",
"slug": "erling-haaland",
"position": "F"
},
"team": {
"id": 17,
"name": "Manchester City",
"slug": "manchester-city"
}
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.tournamentTopPlayersResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.TournamentTopPlayersResponse | No | ||||
| data.categories | array | No | TopPlayerCategory record, 22 fields: count, key, players. Described under SofaScore team top players API. | |||
| data.category_count | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.season_id | integer | No | ||||
| data.source_url | string | No | ||||
| data.sport | string | No | football | |||
| data.tournament_id | integer | No | ||||
| data.type | string | No | overall | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/sofascore/tournament-top-players?id=17&season=96668&type=overall&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"