Endpoint Playground
Returns the penalties a player has taken, newest first: the totals (`attempts`, `scored`) and, per penalty, the outcome (`goal`, `miss`, `post` or `save`), the zone of the goal (for example `low-right`, `high-left`, `close-high`), the x and y position in the goal mouth on SofaScore's 0 to 100 scale, the expected-goals value when available and the match. Returns 404 for players with no recorded penalties, such as most goalkeepers and defenders.
14 Oct 2026: 61 penalties; 6 fields had a value in every checked item and 1 varied between items.
Sample value profiles: outcome: goal (52), save (5), post (3) and 1 more; zone: “low-right” and 8 other values.
curl 'https://api.crawlora.net/api/v1/sofascore/player-penalty-history?id=839956' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| id | string | Yes | 839956 | Numeric SofaScore player id |
{
"code": 200,
"msg": "OK",
"data": {
"player_id": 839956,
"source_url": "https://api.sofascore.com/api/v1/player/839956/penalty-history",
"fetched_at": "2026-10-07T00:00:00Z",
"attempts": 61,
"scored": 52,
"count": 1,
"penalties": [
{
"id": 6086510,
"outcome": "goal",
"zone": "low-left",
"x": 32.8,
"y": 96.83,
"xg": 0.7884,
"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
}
}
}
]
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.