SofaScore API endpoint
Returns a competition season's top teams for every team statistic category SofaScore ranks (for football about 30 categories such as average rating, goals scored, possession, shots and clean sheets; for basketball points, pace, ratings and more), each with the ranked teams 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 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-teamsQuery 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 (its overall is 404). A type the competition does not publish, or a season that has not started, answers 404.limit: optional integer, 1 to 50. Rows per category. Omit it to return every row (one per team, 20 for the Premier League and 36 for the Champions League).Notable response behavior:
categories keeps SofaScore's order, one entry per statistic with key, count and teams. The set depends on the sport. Football returns 32 categories: avgRating, goalsScored, goalsConceded, bigChances, bigChancesMissed, kilometersCovered, numberOfSprints, hitWoodwork, yellowCards, redCards, averageBallPossession, accuratePasses, accurateLongBalls, accurateCrosses, shots, shotsOnTarget, successfulDribbles, tackles, interceptions, clearances, corners, fouls, penaltyGoals, penaltyGoalsConceded, cleanSheets, expectedGoals, expectedGoalsOnTarget, expectedAssists, goalsPrevented, touches, keyPasses and defensiveContributions. The NBA returns 22 (points, pointsAgainst, plusMinus, pace, offensiveRating, defensiveRating, netRating and more).value is the category's headline figure and matches the number of matches it covers. details holds secondary figures when SofaScore sends them (for example penaltiesTaken for penaltyGoals) and is omitted otherwise.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-teams/overall",
"fetched_at": "2026-10-07T14:00:00Z",
"categories": [
{
"key": "avgRating",
"count": 1,
"teams": [
{
"rank": 1,
"value": 7.896,
"matches": 5,
"team": { "id": 17, "name": "Manchester City", "slug": "manchester-city", "country": "England" }
}
]
}
]
}
}
| Field | Filled in, of 34 checked | Values in the sample |
|---|---|---|
| key | 34 | |
| count | 34 | 20 |
| teams | 34 | median 20 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-teams?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-teams/overall",
"fetched_at": "2026-10-07T14:00:00Z",
"categories": [
{
"key": "avgRating",
"count": 1,
"teams": [
{
"rank": 1,
"value": 7.896,
"matches": 5,
"team": {
"id": 17,
"name": "Manchester City",
"slug": "manchester-city",
"country": "England"
}
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.tournamentTopTeamsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.TournamentTopTeamsResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].count | integer | No | ||||
| data.categories[].key | string | No | avgRating | |||
| data.categories[].teams | array | No | ||||
| data.categories[].teams[].details | object | No | ||||
| data.categories[].teams[].matches | integer | No | 5 | |||
| data.categories[].teams[].rank | integer | No | 1 | |||
| data.categories[].teams[].team | sofascore.TeamRef | No | TeamRef record, 6 fields: country, id, name, national, short_name, slug. Described under SofaScore venue API. | |||
| data.categories[].teams[].value | number | No | 7.896 | |||
| 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-teams?id=17&season=96668&type=overall&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"