> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scrapeunblocker.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SofaScore plugin

> SofaScore live scores, fixtures, results and stats as clean JSON for 26 sports - a day's matches or those live now, one match with statistics, lineups, incidents and odds, teams, players and competitions by id, link or name, and search across all of them.

The **SofaScore** plugin returns live scores, fixtures, results and statistics from SofaScore (sofascore.com) as structured JSON. It is six endpoints:

* **`/sports/sofascore-events`** - a sport's matches on one day in your time zone, or the matches in progress right now, biggest competitions first, optionally for one country or competition and one status.
* **`/sports/sofascore-match`** - one match with the sections you ask for: statistics, lineups, incidents, head-to-head, odds, momentum, form, votes, managers, best players, shot map, commentary and highlights.
* **`/sports/sofascore-search`** - teams, players, competitions, matches, managers, referees and venues for a name, optionally within one sport.
* **`/sports/sofascore-team`** - a team (or a tennis player, MMA fighter and other individual competitors) with its last and next matches, squad, competitions and transfers.
* **`/sports/sofascore-player`** - a player with season statistics for any competition, last matches with the player's rating, transfers, attributes and national-team record.
* **`/sports/sofascore-tournament`** - a competition and season with standings, rounds, last and next matches, top players and top teams.

All 26 SofaScore sports are covered: `football`, `basketball`, `tennis`, `ice-hockey`, `american-football`, `baseball`, `handball`, `volleyball`, `cricket`, `rugby`, `futsal`, `table-tennis`, `esports`, `darts`, `snooker`, `mma`, `aussie-rules`, `waterpolo`, `floorball`, `bandy`, `badminton`, `beach-volley`, `minifootball`, `padel`, `motorsport` and `cycling`. Common names work too (`soccer`, `hockey`, `nba`, `nfl`, `ufc`, `f1` and the like). Motorsport and cycling are races, not matches, so they have no day list; search, teams, players and competitions work for them.

Teams, players and competitions can be given as an id, a sofascore.com link or a plain name. A name is resolved with the site's own search (the best match, within `sport` when you pass it), and the response echoes it as `resolvedFrom`. Each call is billed as one request, however many reads it takes. No SofaScore account is involved.

> [!NOTE]
>
> Try it in the dashboard first: [app.scrapeunblocker.com/dashboard/plugins](https://app.scrapeunblocker.com/dashboard/plugins). You get a live results view plus a copy-paste snippet.

## Matches on a day, or live now

```
POST /sports/sofascore-events
```

| Field | Required | Notes |
| - | - | - |
| `sport` | no | The sport, see the list above. Default `football`. |
| `date` | no | The day as `YYYY-MM-DD`, or `today`, `yesterday` or `tomorrow` in `timezone`. Default today. |
| `timezone` | no | Time zone the day is read in: an IANA name (`Europe/London`, `America/New_York`) or a UTC offset (`+02:00`). Default `UTC`. SofaScore's own day lists span about a day either side; the plugin keeps exactly your day. |
| `live` | no | `true` for the matches in progress right now (`date` is then ignored). Default `false`. |
| `status` | no | Keep only `live`, `upcoming` or `finished` matches. Default `all`. |
| `country` | no | Only one country or category, by name, slug, ISO code or id: `england`, `Spain`, `US`, and for tennis `ATP` or `WTA`. |
| `tournament` | no | Only one competition: an id, a sofascore.com tournament link or a name such as `Premier League` or `NBA`. Give `country` or `tournament`, not both. |
| `max_results` | no | Matches to return, `1`-`500`, the biggest competitions first. Default `100`. |

```bash cURL theme={null}
# A day's matches in your time zone
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-events?sport=football&date=2026-11-01&timezone=Europe/London&max_results=20" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"

# Tennis matches in progress right now
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-events?sport=tennis&live=true" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

day = su.sofascore_events(sport="football", date="2026-11-01", timezone="Europe/London", max_results=20)
live = su.sofascore_events(sport="tennis", live=True)
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const day = await su.sofascoreEvents({ sport: "football", date: "2026-11-01", timezone: "Europe/London", maxResults: 20 });
const live = await su.sofascoreEvents({ sport: "tennis", live: true });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$day = $su->sofascoreEvents(['sport' => 'football', 'date' => '2026-11-01', 'timezone' => 'Europe/London', 'max_results' => 20]);
$live = $su->sofascoreEvents(['sport' => 'tennis', 'live' => true]);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

day = su.sofascore_events(sport: "football", date: "2026-11-01", timezone: "Europe/London", max_results: 20)
live = su.sofascore_events(sport: "tennis", live: true)
```

A day list usually takes 1-4 s.

### Response

```json theme={null}
{
  "sport": "football",
  "date": "2026-11-01",
  "timezone": "Europe/London",
  "live": false,
  "status": "all",
  "resultsCollected": 20,
  "hasMore": true,
  "events": [
    {
      "id": 16363907,
      "customId": "HQfh",
      "slug": "liverpool-fc-arsenal",
      "url": "https://www.sofascore.com/football/match/liverpool-fc-arsenal/HQfh#id:16363907",
      "sport": "football",
      "tournament": {
        "id": 17,
        "name": "Premier League",
        "slug": "premier-league",
        "url": "https://www.sofascore.com/football/tournament/england/premier-league/17",
        "sport": "football",
        "category": { "id": 1, "name": "England", "slug": "england", "countryCode": "EN" }
      },
      "season": { "id": 96668, "name": "Premier League 26/27", "year": "26/27" },
      "round": 9,
      "status": { "code": 100, "type": "finished", "description": "Ended" },
      "startTime": "2026-11-01T16:30:00Z",
      "startTimestamp": 1793550600,
      "homeTeam": {
        "id": 44,
        "name": "Liverpool FC",
        "shortName": "Liverpool",
        "nameCode": "LIV",
        "slug": "liverpool",
        "url": "https://www.sofascore.com/football/team/liverpool/44",
        "national": false,
        "gender": "M",
        "country": "England",
        "countryCode": "EN"
      },
      "awayTeam": {
        "id": 42,
        "name": "Arsenal",
        "shortName": "Arsenal",
        "nameCode": "ARS",
        "slug": "arsenal",
        "url": "https://www.sofascore.com/football/team/arsenal/42",
        "national": false,
        "gender": "M",
        "country": "England",
        "countryCode": "EN"
      },
      "homeScore": { "current": 0, "period1": 0, "period2": 0, "normaltime": 0 },
      "awayScore": { "current": 1, "period1": 1, "period2": 0, "normaltime": 1 },
      "winner": "away"
    }
  ]
}
```

| Field | Notes |
| - | - |
| `id` / `customId` / `url` | The match id (pass it as `match` to [Match](#match)), the site's short id and the match link. |
| `tournament` | The competition: `id`, `name`, `url`, `category` (country or circuit) and, for group stages and tennis draws, `stage`. |
| `season` / `round` | Season id, name and year, and the round number. |
| `status` | `type` is `notstarted`, `inprogress`, `finished`, `postponed` or `canceled`; `description` is the site's text, such as `2nd half` or `2nd set`. |
| `startTime` / `startTimestamp` | Kick-off in ISO 8601 (UTC) and as Unix seconds. |
| `homeTeam` / `awayTeam` | `id`, `name`, `shortName`, `nameCode`, `url`, `country`. Tennis players and other individual competitors are teams on SofaScore. |
| `homeScore` / `awayScore` | `current` plus each period (`period1`, `period2`, ...), and `normaltime` / `overtime` / `penalties` when they apply. |
| `winner` | `home`, `away` or `draw` once decided. |
| `homeRedCards` / `awayRedCards` / `seeds` / `firstToServe` / `venue` / `referee` | When the site has them (red cards in football, seeds and the first server in tennis). |
| `resultsCollected` / `hasMore` | Matches returned, and whether the day has more than `max_results`. |

A live list has the same match fields with `status.type` `inprogress`; call it again to follow the scores.

## Match

```
POST /sports/sofascore-match
```

| Field | Required | Notes |
| - | - | - |
| `match` | yes | The match id (e.g. `16363907`, from the events or search results) or a sofascore.com match link. A link without `#id:` names the pairing; the match in progress, else the next, else the latest is used. |
| `include` | no | Sections to add, comma separated (the SDKs also take a list): `statistics`, `lineups`, `incidents`, `h2h`, `odds`, `momentum`, `pregame_form`, `votes`, `managers`, `best_players`, `shotmap`, `commentary`, `highlights`, or `all` / `none`. Default `statistics,lineups,incidents`. |

```bash cURL theme={null}
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-match?match=16363907&include=statistics,lineups,incidents,odds" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

match = su.sofascore_match("16363907", include=["statistics", "lineups", "incidents", "odds"])
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const match = await su.sofascoreMatch("16363907", { include: "statistics,lineups,incidents,odds" });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$match = $su->sofascoreMatch('16363907', ['include' => 'statistics,lineups,incidents,odds']);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

match = su.sofascore_match("16363907", include: %w[statistics lineups incidents odds])
```

A match usually takes 1-3 s, a little more with `include=all`.

### Response

```json theme={null}
{
  "event": {
    "id": 16363907,
    "url": "https://www.sofascore.com/football/match/liverpool-fc-arsenal/HQfh#id:16363907",
    "status": { "code": 100, "type": "finished", "description": "Ended" },
    "homeTeam": { "id": 44, "name": "Liverpool FC", "nameCode": "LIV" },
    "awayTeam": { "id": 42, "name": "Arsenal", "nameCode": "ARS" },
    "homeScore": { "current": 0, "period1": 0, "period2": 0, "normaltime": 0 },
    "awayScore": { "current": 1, "period1": 1, "period2": 0, "normaltime": 1 },
    "winner": "away",
    "venue": { "id": 579, "name": "Anfield", "city": "Liverpool", "country": "England", "capacity": 61276 },
    "referee": { "id": 79884, "name": "Andy Madley", "country": "England", "games": 469, "yellowCards": 1471, "redCards": 36 }
  },
  "statistics": [
    {
      "period": "ALL",
      "groups": [
        {
          "name": "Match overview",
          "items": [
            { "key": "ballPossession", "name": "Ball possession", "home": "56%", "away": "44%", "homeValue": 56, "awayValue": 44 },
            { "key": "expectedGoals", "name": "Expected goals", "home": "1.05", "away": "0.96", "homeValue": 1.05, "awayValue": 0.96 },
            { "key": "totalShotsOnGoal", "name": "Total shots", "home": "17", "away": "10", "homeValue": 17, "awayValue": 10 }
          ]
        }
      ]
    }
  ],
  "lineups": {
    "confirmed": true,
    "home": {
      "formation": "4-2-3-1",
      "players": [
        {
          "id": 243609,
          "name": "Alisson",
          "position": "G",
          "shirtNumber": 1,
          "substitute": false,
          "rating": 6.7,
          "marketValue": { "value": 16500000, "currency": "EUR" },
          "statistics": { "totalPass": 22, "accuratePass": 15, "minutesPlayed": 90 }
        }
      ],
      "missingPlayers": [
        { "player": { "id": 1008402, "name": "Conor Bradley", "position": "D" }, "type": "missing", "description": "Knee Injury" }
      ]
    },
    "away": { "formation": "4-2-3-1", "players": [], "missingPlayers": [] }
  },
  "incidents": [
    { "type": "goal", "class": "regular", "time": 16, "isHome": false, "homeScore": 0, "awayScore": 1, "player": { "name": "Martin Ødegaard" } },
    { "type": "card", "class": "yellow", "time": 55, "isHome": false, "playerName": "Noni Madueke", "reason": "Foul" }
  ],
  "odds": [
    {
      "market": "Full time",
      "group": "1X2",
      "period": "Full-time",
      "live": false,
      "suspended": false,
      "choices": [
        { "name": "1", "odds": 2.88, "fractional": "47/25", "initialOdds": 3.25, "change": -1, "winning": false },
        { "name": "X", "odds": 3.5, "fractional": "5/2", "initialOdds": 3.5, "change": 0, "winning": false },
        { "name": "2", "odds": 2.4, "fractional": "7/5", "initialOdds": 2.1, "change": 1, "winning": true }
      ]
    }
  ]
}
```

Shortened: lists are cut and fields left out.

| Section | Notes |
| - | - |
| `event` | The match in the events shape, plus `venue` and `referee` when known. |
| `statistics` | Per period (`ALL`, `1ST`, `2ND`, ...) and group: each item has `key`, `name`, the `home` / `away` text and the `homeValue` / `awayValue` numbers. |
| `lineups` | `confirmed`, and per side the `formation`, every player with position, shirt number, rating and match `statistics`, and `missingPlayers` with the reason. |
| `incidents` | Goals, cards, substitutions, VAR decisions, injury time and periods, oldest first. |
| `h2h` | Team and manager records against each other, and the last 10 meetings in `previousMeetings`. |
| `odds` | Every market with decimal (`odds`) and `fractional` odds, the opening odds and the winning choice once settled. |
| `momentum` / `pregame_form` / `votes` / `managers` | Attack momentum by minute, recent form and table position before the match, fan votes and both managers. |
| `best_players` | The player of the match and the best rated per side. |
| `shotmap` | Every shot with xG, xGOT, body part, situation and coordinates. |
| `commentary` / `highlights` | The text commentary and video highlight links. |
| `unavailable` | Sections the site does not have for this match, such as statistics before kick-off. |

## Search

```
POST /sports/sofascore-search
```

| Field | Required | Notes |
| - | - | - |
| `query` | yes | A team, player, competition, match, manager, referee or venue name, at least 2 characters: `real madrid`, `sinner`, `premier league`, `arsenal chelsea`. |
| `sport` | no | Keep to one sport. |
| `type` | no | `all` (mixed, best match first), `teams`, `players`, `tournaments`, `matches`, `managers`, `referees` or `venues`. Default `all`. |
| `page` | no | 1-based results page to start from, `1`-`5`; the site serves 20 per page. Default `1`. |
| `max_results` | no | Results to collect across pages, `1`-`100`. Default `20`. |

```bash cURL theme={null}
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-search?query=haaland&sport=football&max_results=5" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

hits = su.sofascore_search("haaland", sport="football", max_results=5)
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const hits = await su.sofascoreSearch("haaland", { sport: "football", maxResults: 5 });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$hits = $su->sofascoreSearch('haaland', ['sport' => 'football', 'max_results' => 5]);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

hits = su.sofascore_search("haaland", sport: "football", max_results: 5)
```

### Response

```json theme={null}
{
  "query": "haaland",
  "sport": "football",
  "type": "all",
  "page": 1,
  "resultsCollected": 5,
  "hasMore": false,
  "results": [
    {
      "type": "player",
      "id": 839956,
      "name": "Erling Haaland",
      "shortName": "E. Haaland",
      "slug": "erling-haaland",
      "url": "https://www.sofascore.com/football/player/erling-haaland/839956",
      "position": "F",
      "jerseyNumber": "9",
      "country": "Norway",
      "countryCode": "NO",
      "team": {
        "id": 17,
        "name": "Manchester City",
        "nameCode": "MCI",
        "slug": "manchester-city",
        "url": "https://www.sofascore.com/football/team/manchester-city/17",
        "national": false,
        "gender": "M"
      },
      "sport": "football",
      "followers": 1089698,
      "rank": 1
    },
    {
      "type": "player",
      "id": 1126486,
      "name": "Markus Haaland",
      "shortName": "M. Haaland",
      "slug": "markus-haaland",
      "url": "https://www.sofascore.com/football/player/markus-haaland/1126486",
      "position": "M",
      "jerseyNumber": "14",
      "country": "Norway",
      "countryCode": "NO",
      "team": {
        "id": 1760,
        "name": "BK Häcken",
        "nameCode": "BKH",
        "slug": "bk-hacken",
        "url": "https://www.sofascore.com/football/team/bk-hacken/1760",
        "national": false,
        "gender": "M"
      },
      "sport": "football",
      "followers": 263,
      "rank": 2
    }
  ]
}
```

Shortened to two of the five results.

| Field | Notes |
| - | - |
| `rank` | The result's place in the list, best match first. |
| `type` | `team`, `player`, `tournament`, `match`, `manager`, `referee` or `venue`. |
| `id` / `name` / `slug` / `url` | Pass the `id` to [Team](#team), [Player](#player), [Tournament](#tournament) or [Match](#match). |
| `sport` / `country` / `followers` | The sport, the country and the number of SofaScore followers. |
| `position` / `jerseyNumber` / `team` | A player's playing position (`F`, `M`, `D`, `G`), shirt number and team. |
| `category` | A competition's country or circuit. |
| `resultsCollected` / `hasMore` | Results returned, and whether there are more pages. |

A match result carries the same fields as a match in the events list.

## Team

```
POST /sports/sofascore-team
```

| Field | Required | Notes |
| - | - | - |
| `team` | yes | The team (or a tennis player, MMA fighter and other individual competitors): an id (e.g. `2829`), a sofascore.com team link, or a name such as `Real Madrid`. |
| `sport` | no | The sport, to resolve a name within it. |
| `include` | no | Sections to add, comma separated (the SDKs also take a list): `last_matches`, `next_matches`, `squad`, `tournaments`, `transfers`, or `all` / `none`. Default `last_matches,next_matches`. |

```bash cURL theme={null}
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-team?team=Real%20Madrid&include=last_matches,squad" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

team = su.sofascore_team("Real Madrid", include=["last_matches", "squad"])
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const team = await su.sofascoreTeam("Real Madrid", { include: ["last_matches", "squad"] });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$team = $su->sofascoreTeam('Real Madrid', ['include' => 'last_matches,squad']);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

team = su.sofascore_team("Real Madrid", include: %w[last_matches squad])
```

### Response

```json theme={null}
{
  "team": {
    "id": 2829,
    "name": "Real Madrid",
    "shortName": "Real Madrid",
    "nameCode": "RMA",
    "url": "https://www.sofascore.com/football/team/real-madrid/2829",
    "country": "Spain",
    "sport": "football",
    "category": { "id": 32, "name": "Spain", "slug": "spain", "countryCode": "ES" },
    "primaryTournament": { "id": 8, "name": "LaLiga", "url": "https://www.sofascore.com/football/tournament/spain/laliga/8" },
    "manager": { "id": 53418, "name": "José Mourinho", "country": "Portugal" },
    "venue": { "id": 754, "name": "Bernabéu", "city": "Madrid", "country": "Spain", "capacity": 83186 },
    "foundationDate": "1902-03-06",
    "followers": 7685272,
    "pregameForm": { "avgRating": "7.95", "position": 3, "value": "27", "form": ["L", "W", "W", "W", "W"] }
  },
  "last_matches": [
    { "id": 16421098, "url": "https://www.sofascore.com/football/match/real-racing-club-real-madrid/EgbsKgb#id:16421098", "status": { "type": "finished" } }
  ],
  "squad": [
    {
      "id": 826643,
      "name": "Kylian Mbappé",
      "position": "F",
      "shirtNumber": 10,
      "height": 180,
      "preferredFoot": "Right",
      "dateOfBirth": "1998-12-20",
      "country": "France",
      "marketValue": { "value": 212000000, "currency": "EUR" },
      "contractUntil": "2029-06-30"
    }
  ],
  "resolvedFrom": "Real Madrid"
}
```

Shortened: matches are in the full events shape, and `last_matches` / `next_matches` hold up to 30 each (most recent first and soonest first). `tournaments` lists the competitions the team plays, `transfers` the players in and out with fee and date.

## Player

```
POST /sports/sofascore-player
```

| Field | Required | Notes |
| - | - | - |
| `player` | yes | An id (e.g. `12994`), a sofascore.com player link, or a name such as `Lionel Messi`. |
| `sport` | no | The sport, to resolve a name within it. |
| `include` | no | Sections to add, comma separated (the SDKs also take a list): `seasons`, `season_stats`, `last_matches`, `transfers`, `attributes`, `national_team`, or `all` / `none`. Default `season_stats,last_matches`. |
| `tournament` | no | For `season_stats`: the competition id (see the `seasons` section). Default the player's first listed competition. |
| `season` | no | For `season_stats`: a season id or its year as SofaScore writes it (`26/27`, `2026`). Default the latest. |

```bash cURL theme={null}
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-player?player=Lionel%20Messi&include=season_stats,last_matches,transfers" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

player = su.sofascore_player("Lionel Messi", include=["season_stats", "last_matches", "transfers"])
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const player = await su.sofascorePlayer("Lionel Messi", { include: ["season_stats", "last_matches", "transfers"] });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$player = $su->sofascorePlayer('Lionel Messi', ['include' => 'season_stats,last_matches,transfers']);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

player = su.sofascore_player("Lionel Messi", include: %w[season_stats last_matches transfers])
```

### Response

```json theme={null}
{
  "player": {
    "id": 12994,
    "name": "Lionel Messi",
    "url": "https://www.sofascore.com/football/player/lionel-messi/12994",
    "position": "F",
    "positionsDetailed": ["ST", "RW", "AM"],
    "shirtNumber": 10,
    "height": 169,
    "preferredFoot": "Left",
    "dateOfBirth": "1987-06-24",
    "country": "Argentina",
    "marketValue": { "value": 16300000, "currency": "EUR" },
    "contractUntil": "2028-12-31",
    "team": { "id": 337602, "name": "Inter Miami CF", "url": "https://www.sofascore.com/football/team/inter-miami-cf/337602" },
    "followers": 2884331
  },
  "season_stats": {
    "tournament": { "id": 242, "name": "MLS" },
    "season": { "id": 86668, "name": "MLS 2026", "year": "2026" },
    "type": "overall",
    "statistics": { "rating": 8.3866666666667, "goals": 26, "assists": 13, "expectedAssists": 12.2696849, "bigChancesCreated": 24, "totalPasses": 1207 }
  },
  "last_matches": [
    {
      "id": 15171757,
      "url": "https://www.sofascore.com/football/match/inter-miami-cf-new-england-revolution/labsccKc#id:15171757",
      "winner": "away",
      "playedFor": "away",
      "playerStatistics": { "rating": 8.5, "minutesPlayed": 90 },
      "playerIncidents": { "goals": 1, "assists": 1 }
    }
  ],
  "resolvedFrom": "Lionel Messi"
}
```

Shortened. `season_stats.statistics` holds every figure SofaScore keeps for that competition and season (rating, goals, expected goals, assists, passes, duels, saves and the rest). Each of the `last_matches` (up to 30, most recent first) is a full match with the side the player `playedFor`, the player's rating and minutes, and goals or assists. `seasons` lists each competition with its seasons (to pick `tournament` and `season`), `attributes` the attacking, technical, tactical, defending and creativity scores, `national_team` caps, goals and debut.

## Tournament

```
POST /sports/sofascore-tournament
```

| Field | Required | Notes |
| - | - | - |
| `tournament` | yes | The competition: an id (e.g. `17`), a sofascore.com tournament link (its `#id:` picks the season), or a name such as `Premier League` or `NBA`. |
| `sport` | no | The sport, to resolve a name within it. |
| `season` | no | A season id or its year as SofaScore writes it (`26/27`, `2026`). Default the current one. |
| `include` | no | Sections to add, comma separated (the SDKs also take a list): `seasons`, `standings`, `rounds`, `last_matches`, `next_matches`, `top_players`, `top_teams`, or `all` / `none`. Default `standings,last_matches,next_matches`. |

```bash cURL theme={null}
curl -X POST "https://api.scrapeunblocker.com/sports/sofascore-tournament?tournament=Premier%20League&include=standings,top_players" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
```

```python Python theme={null}
from scrapeunblocker import Client

su = Client()  # reads SCRAPEUNBLOCKER_KEY

league = su.sofascore_tournament("Premier League", include=["standings", "top_players"])
```

```ts Node.js theme={null}
import { ScrapeUnblockerClient } from "scrapeunblocker";

const su = new ScrapeUnblockerClient(); // reads SCRAPEUNBLOCKER_KEY

const league = await su.sofascoreTournament("Premier League", { include: ["standings", "top_players"] });
```

```php PHP theme={null}
use ScrapeUnblocker\Client;

$su = new Client(); // reads SCRAPEUNBLOCKER_KEY

$league = $su->sofascoreTournament('Premier League', ['include' => 'standings,top_players']);
```

```ruby Ruby theme={null}
require "scrapeunblocker"

su = ScrapeUnblocker::Client.new # reads SCRAPEUNBLOCKER_KEY

league = su.sofascore_tournament("Premier League", include: %w[standings top_players])
```

### Response

```json theme={null}
{
  "tournament": {
    "id": 17,
    "name": "Premier League",
    "url": "https://www.sofascore.com/football/tournament/england/premier-league/17",
    "sport": "football",
    "category": { "id": 1, "name": "England", "slug": "england", "countryCode": "EN" },
    "tier": 1,
    "titleHolder": { "id": 42, "name": "Arsenal" },
    "titleHolderTitles": 14,
    "mostTitles": 20,
    "mostTitlesTeams": [{ "id": 35, "name": "Manchester United" }],
    "lowerDivisions": [{ "id": 18, "name": "Championship" }],
    "startDate": "2026-08-21",
    "endDate": "2027-05-30",
    "followers": 1187436
  },
  "season": { "id": 96668, "name": "Premier League 26/27", "year": "26/27" },
  "standings": [
    {
      "name": "Premier League 26/27",
      "type": "total",
      "rows": [
        {
          "position": 1,
          "team": { "id": 42, "name": "Arsenal", "nameCode": "ARS" },
          "matches": 9,
          "wins": 8,
          "draws": 0,
          "losses": 1,
          "scoresFor": 14,
          "scoresAgainst": 5,
          "scoreDiff": "+9",
          "points": 24,
          "promotion": "Champions League"
        }
      ]
    }
  ],
  "resolvedFrom": "Premier League"
}
```

Shortened. `standings` holds every table of the season (groups and conferences each have one). `rounds` lists the season's rounds, `last_matches` (most recent first) and `next_matches` (soonest first) up to 30 matches each in the events shape, `top_players` and `top_teams` the top 10 in each statistic (rating, goals, assists, expected goals and so on), and `seasons` every season with its id.

## Errors

| Status | Meaning |
| - | - |
| `400` | Invalid parameters, e.g. no `query` / `match` / `team` / `player` / `tournament`, an unknown `sport`, a day list for motorsport or cycling, both `country` and `tournament`, or `max_results` out of range. |
| `404` | No such match, team, player, competition or season, or an unknown `country` or `tournament` in the events filter. |
| `502` | SofaScore refused every attempt or did not answer in time. Retry. |

A section the site does not have for an entity is named in `unavailable`, not an error; a section whose read failed is named in `failedSections`.

## What you can build

* **Live score feeds** - follow every match in progress for a sport, with scores by period and the status, and refresh it on a timer.
* **Fixtures and results databases** - collect each day's matches across sports, countries and time zones.
* **Match analytics** - expected goals, shot maps, lineups with player ratings, momentum and incidents for scouting or betting models.
* **Odds tracking** - opening and current odds for every market of a match.
* **Player and team profiles** - squads with market values and contracts, season statistics, transfers and form.
* **League tables** - standings, top scorers and top teams for any competition and season.

## Next steps

> [card] [Open the plugins](https://app.scrapeunblocker.com/dashboard/plugins)
>
> Run a SofaScore day list and grab the JSON.

> [card] [Get an API key](https://scrapeunblocker.com/pricing)
>
> Free trial available on the pricing page.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.