SofaScore API endpoint
Returns one team's touch locations in a football match as `player_points` (outfield players) and `goalkeeper_points`, each point an `x` and `y` on SofaScore's 0-100 pitch scale. `team_id` must be the home or away team of the event; get both ids from the event endpoint. Returns 404 when SofaScore has no heatmap for that team in that match, which includes teams that did not play it, unstarted matches and sports other than football.
/sofascore/event-team-heatmapQuery parameters:
id: required. Numeric SofaScore event (match) id, e.g. 16363867.team_id: required. Numeric SofaScore team id of the match's home or away side, e.g. 17. Get both ids from the event endpoint.Notable response behavior:
player_points are outfield touches and goalkeeper_points the goalkeeper's, each an x and y on SofaScore's 0-100 pitch scale.404 when SofaScore has no heatmap for that team in that match: a team that did not play it, an unstarted match, or a sport other than football.| Field | Filled in, of 722 checked |
|---|---|
| x | 500 |
| y | 500 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore event (match) id | 16363867 | |
| team_id | string | Yes | Numeric SofaScore team id of the home or away side | 17 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/event-team-heatmap?id=16363867&team_id=17" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"event_id": 16363867,
"team_id": 17,
"source_url": "https://api.sofascore.com/api/v1/event/16363867/heatmap/17",
"fetched_at": "2026-07-08T00:00:00Z",
"player_points": [
{
"x": 47.6,
"y": 55.9
},
{
"x": 56.8,
"y": 77.2
},
{
"x": 52.7,
"y": 33.6
}
],
"goalkeeper_points": [
{
"x": 9,
"y": 29.7
},
{
"x": 4.4,
"y": 55.9
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.eventTeamHeatmapResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.EventTeamHeatmapResponse | No | ||||
| data.event_id | integer | No | 16363867 | |||
| data.fetched_at | string | No | ||||
| data.goalkeeper_points | array | No | ||||
| data.goalkeeper_points[].x | number | No | 47.6 | |||
| data.goalkeeper_points[].y | number | No | 55.9 | |||
| data.player_points | array | No | ||||
| data.player_points[].x | number | No | 47.6 | |||
| data.player_points[].y | number | No | 55.9 | |||
| data.source_url | string | No | ||||
| data.team_id | integer | No | 17 | |||
| 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/event-team-heatmap?id=16363867&team_id=17" \
-H "x-api-key: $CRAWLORA_API_KEY"