SofaScore API endpoint
Returns one page (30 matches) of a player's matches, each with the player's own numbers merged in: `statistics` (football: rating and minutes_played; basketball: points, rebounds, assists and more), `incident_counts` (goals, assists, yellow and red cards, penalty goals), `on_bench` for an unused substitute and `played_for_team_id` (club or national team). Page 0 is the most recent window and can include upcoming fixtures (status type `notstarted`); matches inside a page run oldest first. Follow `has_next_page` for older pages; a page past the end returns 404.
/sofascore/player-eventsReturns one page of a player's matches from SofaScore, with the player's own numbers merged into each match.
Query parameters:
id: required. Numeric SofaScore player id, e.g. 839956. Get it from sofascore-search or sofascore-team-players.page: optional integer. Zero-based page number. Defaults to 0.Notable response behavior:
0 is the most recent window and can include upcoming fixtures (status.type notstarted); matches inside a page run oldest first. Follow has_next_page for older pages; a page past the end returns 404.statistics holds the player's numbers in that match (football: rating, minutes_played; basketball: points, rebounds, assists, rating and more) and is absent when the player did not play. incident_counts holds counts such as goals, assists, yellow_cards, red_cards, penalty_goals. on_bench is true only for an unused substitute. played_for_team_id is the club or national team the player represented.| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| event | 30 | |
| played_for_team_id | 30 | |
| statistics | 25 | |
| incident_counts | 18 | |
| on_bench | 2 | true in 2 of 2 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore player id | 839956 | |
| page | integer | No | 0 | Zero-based page number. Defaults to 0 Minimum: 0. | 0 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/player-events?id=839956&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"player_id": 839956,
"page": 0,
"has_next_page": true,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/player/839956/events/last/0",
"fetched_at": "2026-10-07T00:00:00Z",
"events": [
{
"event": {
"id": 16363867,
"slug": "sunderland-manchester-city",
"start_timestamp": 1789909200,
"start_time": "2026-09-20T13:00:00Z",
"status": {
"code": 100,
"description": "Ended",
"type": "finished"
},
"winner_code": 1,
"tournament": {
"id": 1,
"name": "Premier League",
"slug": "premier-league",
"category": "England",
"unique_tournament_id": 17,
"unique_tournament_name": "Premier League"
},
"home_team": {
"id": 17,
"name": "Manchester City",
"short_name": "Man City",
"slug": "manchester-city"
},
"away_team": {
"id": 41,
"name": "Sunderland",
"short_name": "Sunderland",
"slug": "sunderland"
},
"home_score": {
"current": 5,
"period1": 3,
"period2": 2
},
"away_score": {
"current": 3,
"period1": 2,
"period2": 1
}
},
"played_for_team_id": 17,
"statistics": {
"rating": 8.2,
"minutes_played": 90
},
"incident_counts": {
"goals": 2
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.playerEventsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.PlayerEventsResponse | No | ||||
| data.count | integer | No | ||||
| data.events | array | No | ||||
| data.events[].event | sofascore.EventSummary | No | EventSummary record, 38 fields: away_score, away_team, home_score, home_team, id, slug, start_time, start_timestamp, status, tournament, winner_code. Described under SofaScore live events API. | |||
| data.events[].incident_counts | object | No | IncidentCounts holds counts of the player's match incidents, for example goals, assists, yellow_cards, red_cards and penalty_goals. | |||
| data.events[].on_bench | boolean | No | OnBench is true only when the player was an unused substitute. | |||
| data.events[].played_for_team_id | integer | No | 17 | PlayedForTeamID is the team the player represented in the match. | ||
| data.events[].statistics | object | No | Statistics holds the player's numbers in the match (football: rating and minutes_played; basketball: points, rebounds and more). It is absent when the player did not play or the match has not started. | |||
| data.fetched_at | string | No | ||||
| data.has_next_page | boolean | No | ||||
| data.page | integer | No | ||||
| data.player_id | integer | No | 839956 | |||
| 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/player-events?id=839956&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"