SofaScore API endpoint
Returns a tennis match's per-game momentum series: for each game of each set a `value` (positive favours the home player or team, negative the away side) and whether a break of serve `break_occurred`. An empty `games` list is a valid response (a live match with no completed game yet). Returns 404 when SofaScore has no tennis power data for the match, which includes matches that have not started and sports other than tennis.
/sofascore/event-tennis-powerQuery parameters:
id: required. Numeric SofaScore event (match) id of a tennis match, e.g. 17257382.Notable response behavior:
games lists one entry per game with its set and game number, a value and break_occurred. A positive value favours the home player or team and a negative value the away side (the home player who won a tie-break scored 65). Values seen ranged from about -83 to 65; SofaScore does not document the scale.break_occurred is true for a game in which the receiver broke serve.games array is a valid response (a live match with no completed game yet).404 when SofaScore has no tennis power data for the match. This includes matches that have not started, table tennis and other sports, and unknown ids.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"event_id": 17257382,
"source_url": "https://api.sofascore.com/api/v1/event/17257382/tennis-power",
"fetched_at": "2026-10-07T17:00:00Z",
"count": 30,
"games": [
{
"set": 1,
"game": 1,
"value": 18.446341100609,
"break_occurred": false
},
{
"set": 1,
"game": 2,
"value": -54.22,
"break_occurred": false
},
{
"set": 1,
"game": 3,
"value": 47.4,
"break_occurred": false
},
"...",
{
"set": 1,
"game": 13,
"value": 65,
"break_occurred": false
}
]
}
}
| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| set | 30 | 1 to 3, median 2 |
| game | 30 | 1 to 13, median 5 |
| value | 30 | -82.98 to 65, median -19.66 |
| break_occurred | 30 | true in 3 of 30 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore tennis event (match) id | 17257382 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/event-tennis-power?id=17257382" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"event_id": 17257382,
"source_url": "https://api.sofascore.com/api/v1/event/17257382/tennis-power",
"fetched_at": "2026-10-07T17:00:00Z",
"count": 30,
"games": [
{
"set": 1,
"game": 1,
"value": 18.446341100609,
"break_occurred": false
},
{
"set": 1,
"game": 2,
"value": -54.22,
"break_occurred": false
},
{
"set": 1,
"game": 3,
"value": 47.4,
"break_occurred": false
},
"...",
{
"set": 1,
"game": 13,
"value": 65,
"break_occurred": false
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.eventTennisPowerResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.EventTennisPowerResponse | No | ||||
| data.count | integer | No | ||||
| data.event_id | integer | No | 17257382 | |||
| data.fetched_at | string | No | ||||
| data.games | array | No | ||||
| data.games[].break_occurred | boolean | No | ||||
| data.games[].game | integer | No | 3 | |||
| data.games[].set | integer | No | 1 | |||
| data.games[].value | number | No | -54.2 | Value is SofaScore's momentum number for the game. Positive favours the home player or team, negative the away side. | ||
| data.source_url | string | No | ||||
| 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-tennis-power?id=17257382" \
-H "x-api-key: $CRAWLORA_API_KEY"