SofaScore API endpoint
Returns one SofaScore ranking list: the rank, previous rank, points and the ranked team, player or competition, plus when the list was last updated. Choose the `type` id from sofascore-ranking-types, for example 5 for the ATP men's singles ranking or 2 for the FIFA men's national team ranking. Optional `limit` returns only the first rows of long lists (tennis lists hold 500 rows). MMA division rankings use rank 0 for the reigning champion.
/sofascore/rankingsQuery parameters:
type: required integer ranking id. Allowed values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46. List them with names through sofascore/ranking-types; any other id is rejected with 400 before a request is made.limit: optional integer, 1 to 500. Returns only the first N rows of the list. Omit it to return every row (tennis and padel lists hold 500 rows, the FIFA list 211).Notable response behavior:
rank is SofaScore's rank. In the MMA division rankings (ids 11 to 22 and 40 to 46) rank 0 is the reigning champion and ranks 1 to 15 (1 to 10 for Fight Nation Championship) are the ranked contenders. previous_rank, best_rank, points, previous_points, next_win_points, max_points and tournaments_played appear only on rankings that publish them; a present 0 is meaningful.entity.type is team, player or unique_tournament. League coefficients (id 1) rank competitions: entity is the league, label is the association's country and year is the coefficient season. Padel partners share the same rank. MMA rows add the competitor's win/draw/loss record.points mean different things per ranking: FIFA/UEFA/rugby points, ATP/WTA points, UTR rating (id 34, 35) or padel points. The live tennis rankings (ids 7, 8) add next_win_points and max_points.total_rows is the size of the whole list and count the number of rows returned after limit.updated_at.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"type": 5,
"name": "ATP men's singles ranking",
"sport": "tennis",
"entity_type": "player",
"updated_timestamp": 1791327637,
"updated_at": "2026-10-06T23:00:37Z",
"total_rows": 500,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/rankings/type/5",
"fetched_at": "2026-10-07T14:00:00Z",
"rankings": [
{
"rank": 1,
"previous_rank": 1,
"best_rank": 1,
"points": 11000,
"previous_points": 11000,
"tournaments_played": 19,
"label": "Jannik Sinner",
"entity": {
"id": 206570,
"type": "player",
"name": "Jannik Sinner",
"short_name": "J. Sinner",
"slug": "sinner-jannik",
"sport": "tennis",
"gender": "M",
"country": "Italy",
"country_code": "IT"
}
}
]
}
}
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| rank | 40 | 1 to 40, median 20 |
| previous_rank | 40 | 1 to 40, median 20 |
| best_rank | 40 | 1 to 33, median 10 |
| points | 40 | 1,275 to 11,000, median 2,200 |
| previous_points | 40 | 1,275 to 11,000, median 2,145 |
| tournaments_played | 40 | 4 to 32, median 24 |
| label | 40 | “Jannik Sinner” and 39 other values |
| entity | 40 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | integer | Yes | Ranking id from sofascore-ranking-types Allowed values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46. | 5 | |
| limit | integer | No | Return only the first N rows, 1 to 500. Omit to return every row Minimum: 1. Maximum: 500. | 10 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/rankings?type=5&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"type": 5,
"name": "ATP men's singles ranking",
"sport": "tennis",
"entity_type": "player",
"updated_timestamp": 1791327637,
"updated_at": "2026-10-06T23:00:37Z",
"total_rows": 500,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/rankings/type/5",
"fetched_at": "2026-10-07T14:00:00Z",
"rankings": [
{
"rank": 1,
"previous_rank": 1,
"best_rank": 1,
"points": 11000,
"previous_points": 11000,
"tournaments_played": 19,
"label": "Jannik Sinner",
"entity": {
"id": 206570,
"type": "player",
"name": "Jannik Sinner",
"short_name": "J. Sinner",
"slug": "sinner-jannik",
"sport": "tennis",
"gender": "M",
"country": "Italy",
"country_code": "IT"
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.rankingsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.RankingsResponse | No | ||||
| data.count | integer | No | 500 | |||
| data.entity_type | string | No | player | |||
| data.fetched_at | string | No | ||||
| data.name | string | No | ATP men's singles ranking | |||
| data.rankings | array | No | ||||
| data.rankings[].best_rank | integer | No | ||||
| data.rankings[].entity | sofascore.RankingEntity | No | ||||
| data.rankings[].entity.country | string | No | Italy | |||
| data.rankings[].entity.country_code | string | No | IT | |||
| data.rankings[].entity.gender | string | No | M | |||
| data.rankings[].entity.id | integer | No | 720 | |||
| data.rankings[].entity.name | string | No | Jannik Sinner | |||
| data.rankings[].entity.national | boolean | No | ||||
| data.rankings[].entity.record | sofascore.WDLRecord | No | ||||
| data.rankings[].entity.record.draws | integer | No | ||||
| data.rankings[].entity.record.losses | integer | No | ||||
| data.rankings[].entity.record.wins | integer | No | ||||
| data.rankings[].entity.short_name | string | No | J. Sinner | |||
| data.rankings[].entity.slug | string | No | sinner-jannik | |||
| data.rankings[].entity.sport | string | No | tennis | |||
| data.rankings[].entity.type | string | No | player | |||
| data.rankings[].label | string | No | England | |||
| data.rankings[].max_points | number | No | ||||
| data.rankings[].next_win_points | number | No | ||||
| data.rankings[].playing_teams | integer | No | ||||
| data.rankings[].points | number | No | ||||
| data.rankings[].previous_points | number | No | ||||
| data.rankings[].previous_rank | integer | No | ||||
| data.rankings[].rank | integer | No | 1 | |||
| data.rankings[].total_teams | integer | No | ||||
| data.rankings[].tournaments_played | integer | No | ||||
| data.rankings[].year | string | No | 2027 | |||
| data.source_url | string | No | ||||
| data.sport | string | No | tennis | |||
| data.total_rows | integer | No | 500 | |||
| data.type | integer | No | 5 | |||
| data.updated_at | string | No | 2026-10-06T23:00:37Z | |||
| data.updated_timestamp | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/rankings?type=5&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"