SofaScore Scraper [$1/1K 💰] Matches, Stats, Lineups & Odds avatar

SofaScore Scraper [$1/1K 💰] Matches, Stats, Lineups & Odds

Pricing

from $1.00 / 1,000 results

Go to Apify Store
SofaScore Scraper [$1/1K 💰] Matches, Stats, Lineups & Odds

SofaScore Scraper [$1/1K 💰] Matches, Stats, Lineups & Odds

SofaScore scraper for 24 sports: live scores, fixtures and results by day, match statistics, lineups with player ratings, incidents, odds, standings, teams, squads and player profiles. Paste any SofaScore URL or search by name. One flat price per row, every match detail included.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

6 hours ago

Last modified

Share

SofaScore Scraper

Export SofaScore matches, teams, players and leagues as clean rows. Live scores, fixtures and results for 24 sports, match statistics, lineups with player ratings, incidents, odds, standings, squads, transfers and player statistics for every season.

Paste any SofaScore URL, type a name, or pick a sport and a day. $1 per 1,000 rows, with every match detail included in that price. No login, no cookies and no proxy to set up.

Why Use This Scraper?

  • One price per row. A match row costs the same with or without statistics, lineups, incidents and odds. There is no extra charge per detail.
  • Any SofaScore URL works. Match, team, player, league and sport pages, current and older link formats, and translated pages that carry an #id.
  • Search by name. Type Real Madrid, Nikola Jokic or Serie A and get the data. You do not need to look up ids first.
  • Top leagues first. A day of football on SofaScore is about 8,000 matches, most of them youth and lower leagues. Day lists are sorted by how many people follow each league, so a 100-row run returns the Premier League, LaLiga and Serie A before a regional cup.
  • Made for schedules. daysBack and daysAhead count from the day the run starts, so one saved task returns yesterday's results or next week's fixtures every time it runs.
  • Spreadsheet-friendly. Scores, teams, league, round, venue, referee and the headline statistics (possession, xG, shots) sit in flat columns. The deep data stays nested in the same row.

Overview

The SofaScore Scraper is for sports analysts, betting modellers, fantasy and media teams, scouts and developers who need SofaScore data in a table or behind an API call.

A run returns six kinds of rows, and the input decides which: match, team, player, league, standing and playerSeasonStats. Every row has a type field, so a run that mixes kinds is easy to filter.

Two things work differently from what the site suggests:

  • Match details are part of the match row. Statistics, lineups, incidents and odds do not become rows of their own. A match with all of them is still one row at one price.
  • Athletes in one-against-one sports are team rows. SofaScore stores a tennis player, a darts player or a fighter as a team, so that is what you get back, with an athlete block for birth date, height, prize money and ranking.

Supported Inputs

URL types

URL typePatternExample
Match/{sport}/match/{teams}/{code}#id:{matchId}https://www.sofascore.com/football/match/manchester-united-tottenham-hotspur/IsK#id:16363879
Team/{sport}/team/{name}/{teamId}https://www.sofascore.com/football/team/arsenal/42
Player/{sport}/player/{name}/{playerId}https://www.sofascore.com/football/player/erling-haaland/839956
League/{sport}/tournament/{country}/{league}/{leagueId}https://www.sofascore.com/football/tournament/england/premier-league/17
Sport page/{sport} or /{sport}/{YYYY-MM-DD}https://www.sofascore.com/basketball

What each one returns:

You giveYou get
A match URL or match idOne match row with the details you chose
A sport page, or a sport and days (sports)Every match of those days, most-followed leagues first
A sport with liveOnlyThe matches in play right now
A league URLA league row, one standing row per team, one match row per match of the season, and optionally one playerSeasonStats row per player
A team URLA team row with squad, season statistics and transfers, and optionally the team's matches
A player URLA player row with statistics for every season and transfer history, and optionally the player's matches
A name (searchQueries)The best search hits, each returned as its own kind above

Older link formats still work (/team/football/arsenal/42, /player/erling-haaland/839956), and so do translated pages as long as the link carries an #id.

A match link without an id, such as sofascore.com/football/match/getafe-fc-barcelona/rgbsjhb, names two teams and not one match. The actor returns their match in play, otherwise their next one, otherwise their last one. Add the #id: part for an exact match.

Copy-pasteable startUrls

{
"startUrls": [
{ "url": "https://www.sofascore.com/football/match/manchester-united-tottenham-hotspur/IsK#id:16363879" },
{ "url": "https://www.sofascore.com/football/team/arsenal/42" },
{ "url": "https://www.sofascore.com/football/player/erling-haaland/839956" },
{ "url": "https://www.sofascore.com/football/tournament/england/premier-league/17" }
]
}

Search by name

{
"searchQueries": ["Real Madrid", "Nikola Jokic", "Serie A"],
"searchType": "all",
"maxResultsPerQuery": 1
}

A sport and a day

{
"sports": ["football"],
"dateFrom": "2026-10-10",
"maxItems": 200
}

Sports

Football, basketball, tennis, ice hockey, American football, baseball, volleyball, handball, table tennis, cricket, rugby, esports, MMA, futsal, badminton, darts, snooker, water polo, Aussie rules, floorball, minifootball, padel, bandy and beach volleyball.

Unsupported inputs

  • Motorsport and cycling. SofaScore stores them as race stages, not matches.
  • Other SofaScore pages, such as a manager or a country page. The run skips them and says so in the log.
  • Translated links without an #id. Use the English sofascore.com link for those.
  • Links from other sites.
  • Anything that needs a SofaScore account. The actor reads public data only.

Use Cases

AudienceUse case
Betting and trading modelsResults, statistics and odds with the opening and current price, per match and per market
Sports analytics teamsxG, shot maps with coordinates, lineups, player ratings and per-period statistics
Fantasy and media productsLive scores, confirmed lineups, ratings and incidents on a schedule
Scouts and recruitmentPlayer profiles, statistics for every season, market value, contract end and transfer history
ResearchersFull league seasons with standings and every match, current or historical
DevelopersA scheduled feed into a database, with matchId as the key

How It Works

How the SofaScore Scraper works

  1. Input. Give URLs, names, match ids, or a sport with days. They can be combined in one run.
  2. Resolve. Each URL is recognised as a match, team, player, league or sport page. Names go through SofaScore's search and the best hits are followed.
  3. Collect. The actor fetches the data for each item. A day list reads one page per country with matches that day and puts the most-followed leagues first.
  4. Add details. For each match it requests the details you chose, one request per option.
  5. Output. Rows land in the dataset, ready as JSON, CSV or Excel, or through the Apify API.

Input Configuration

Input fields

FieldTypeDefaultDescription
startUrlsarraynoneSofaScore match, team, player, league or sport page URLs
searchQueriesarraynoneTeam, player, league or match names
searchTypestringallall, teams, players, tournaments or matches
maxResultsPerQueryinteger5Search hits followed per name, 1 to 20
sportsarraynoneSports to list matches for, by day or live
liveOnlybooleanfalseOnly matches in play now
dateFrom, dateTostringtodayDays to list, YYYY-MM-DD in UTC, up to 31 days
daysBack, daysAheadinteger0Days before and after today, 0 to 30, used when no date is set
matchPeriodstringallall, finished or upcoming
matchDetailsarrayfour optionsSee the table below. [] returns scores only
leagueDataarrayinfo, standings, matchesAlso playerStats
seasonstringcurrent24/25, 2024/2025, 2024 or a season id
teamDataarraysquadAlso seasonStatistics, transfers, matches
playerDataarrayseasonStatistics, transferHistoryAlso nationalTeam, attributes, matches
matchIdsarraynoneSofaScore match ids
maxItemsinteger100Cap on rows saved. Free plan: 100 per run

At least one of startUrls, searchQueries, matchIds and sports is needed, otherwise the run fails with a message that says so. They can be combined in one run.

Details per match

Pick any of these in matchDetails. Each one is one more request per match, so a shorter list means faster runs and smaller rows.

OptionWhat it adds
venueStadium, city, capacity, referee, attendance, both managers
statisticsEvery statistic SofaScore shows, for the full match and per period, plus stats with the full-match figures keyed by name
lineupsFormation, starters and substitutes with rating, minutes and per-player statistics, missing players with the reason
incidentsGoals with assists, cards, substitutions, VAR decisions, period scores
oddsAll markets with opening and current odds in decimal and fractional form
h2hWins, draws and losses between the two teams and between the two managers
votesFan votes: who wins, both teams to score, first to score
shotmapEvery shot with player, coordinates, body part, situation and xG
bestPlayersThe top-rated players of the match
momentumThe attack-momentum graph, minute by minute
commentaryText commentary
averagePositionsAverage pitch position of each player
formLeague position, points and last five results of both teams before kick-off
streaksTeam streaks, overall and head-to-head
winProbabilitySofaScore's win probability, when it publishes one

Default: venue, statistics, lineups, incidents.

Statistics, incidents, shot map, top players, momentum, commentary and average positions exist only once a match has started, so they are not requested for fixtures. How much SofaScore records depends on the league: a Premier League match has all of the above, a regional youth match may have the score only.

A match row with the four default details is about 90 KB, and about 250 KB with all fifteen. Set matchDetails to [] or to ["statistics"] when you only need scores and headline figures.

Common scenarios

Today's football with statistics:

{
"sports": ["football"],
"matchDetails": ["statistics", "incidents"],
"maxItems": 200
}

Yesterday's results, every morning. Save this as a task and put it on a daily schedule:

{
"sports": ["football", "basketball"],
"daysBack": 1,
"matchPeriod": "finished",
"maxItems": 1000
}

Sports are read in the order you list them, and maxItems counts across all of them. To get a fair share of each sport, raise maxItems or run one sport per task.

Live scores with odds:

{
"sports": ["tennis"],
"liveOnly": true,
"matchDetails": ["statistics", "odds"]
}

A full league season:

{
"startUrls": [{ "url": "https://www.sofascore.com/football/tournament/england/premier-league/17" }],
"season": "24/25",
"leagueData": ["info", "standings", "matches", "playerStats"],
"matchDetails": ["statistics"],
"maxItems": 2000
}

Teams and players by name:

{
"searchQueries": ["Real Madrid", "Erling Haaland"],
"maxResultsPerQuery": 1,
"teamData": ["squad", "seasonStatistics", "transfers"],
"playerData": ["seasonStatistics", "transferHistory", "nationalTeam"]
}

Output Overview

Every row has a type: match, team, player, league, standing or playerSeasonStats. Filter on it when a run mixes kinds.

  • match: one row per match. Teams, score, league, round, status and start time are flat columns. The details you chose (statistics, lineups, incidents, odds and the rest) are nested in the same row.
  • team and player: one row per profile, with the squad, season statistics and transfers nested inside.
  • league: one row per league season, with the list of every season SofaScore has for it.
  • standing: one row per team of a league table.
  • playerSeasonStats: one row per player of a league season.

Fields SofaScore does not have for a row are null or an empty list. A fixture has no statistics yet, and a lower league may have the score only.

The dataset has table views for the Output tab: Overview, Matches, Standings, Teams and Players. Each shows the flat columns of that row type. The full nested rows are in the JSON export.

Output Samples

Match URL start: a match row

Shortened. The real row has 134 statistics lines, 40 lineup players and 24 incidents.

{
"type": "match",
"matchId": "16363879",
"url": "https://www.sofascore.com/football/match/manchester-united-tottenham-hotspur/IsK#id:16363879",
"sport": "football",
"country": "England",
"tournament": "Premier League",
"tournamentId": "17",
"season": "Premier League 26/27",
"round": "6",
"status": "finished",
"statusDescription": "Ended",
"startTime": "2026-10-10T16:30:00.000Z",
"homeTeam": "Manchester United",
"homeTeamId": "35",
"awayTeam": "Tottenham Hotspur",
"awayTeamId": "33",
"homeScore": 1,
"awayScore": 1,
"winner": "draw",
"homePeriodScores": [0, 1],
"awayPeriodScores": [0, 1],
"homeRedCards": 0,
"awayRedCards": 1,
"venue": "Old Trafford",
"venueCity": "Manchester",
"venueCapacity": 74879,
"referee": "Stuart Attwell",
"homeManager": "Michael Carrick",
"awayManager": "Roberto De Zerbi",
"stats": {
"ballPossession": { "home": 50, "away": 50 },
"expectedGoals": { "home": 0.77, "away": 1.56 },
"totalShotsOnGoal": { "home": 12, "away": 12 }
},
"statistics": [
{ "period": "ALL", "group": "Match overview", "name": "Ball possession", "key": "ballPossession", "home": "50%", "away": "50%", "homeValue": 50, "awayValue": 50 }
],
"lineups": {
"confirmed": true,
"home": {
"formation": "4-2-3-1",
"players": [
{ "id": "927083", "name": "Bryan Mbeumo", "position": "F", "shirtNumber": 19, "substitute": false, "captain": false, "rating": 8.5, "minutesPlayed": 90, "marketValue": 73000000, "marketValueCurrency": "EUR", "statistics": { "totalPass": 18, "accuratePass": 16 } }
],
"missingPlayers": []
}
},
"incidents": [
{ "type": "card", "class": "yellow", "time": 90, "addedTime": 8, "isHome": false, "reason": "Foul", "player": { "id": "1142335", "name": "Archie Gray" } }
],
"scrapedAt": "2026-10-10T18:35:44.000Z"
}

League URL start: a standing row

One of the 20 standings rows of a Premier League run.

{
"type": "standing",
"tournamentId": "17",
"tournament": "Premier League",
"sport": "football",
"country": "England",
"season": "Premier League 26/27",
"seasonId": "96668",
"group": "Premier League 26/27",
"position": 1,
"team": "Manchester City",
"teamId": "17",
"teamUrl": "https://www.sofascore.com/football/team/manchester-city/17",
"matches": 6,
"wins": 6,
"draws": 0,
"losses": 0,
"scoresFor": 16,
"scoresAgainst": 5,
"goalDifference": 11,
"points": 18,
"qualification": "Champions League",
"sourceUrl": "https://www.sofascore.com/football/tournament/england/premier-league/17",
"scrapedAt": "2026-10-11T22:45:02.070Z"
}

Key Output Fields

Every row

type, sport, sourceUrl, scrapedAt, and searchQuery when the row came from a name search.

Match

matchId, url, country, tournament, tournamentId, season, round, status, statusDescription, startTime, homeTeam, awayTeam, homeScore, awayScore, winner, homePeriodScores, awayPeriodScores, homeRedCards, awayRedCards, venue, venueCity, venueCapacity, referee, attendance, homeManager, awayManager.

Match details

One field per option you chose: statistics[] and stats, lineups, incidents[], odds[], h2h, votes, shotmap[], bestPlayers, momentum[], commentary[], averagePositions, form, streaks, winProbability.

Team

teamId, name, country, league, manager, venue, venueCapacity, foundedYear, followers, form, squad[], seasonStatistics, transfersIn[], transfersOut[]. Tennis players, darts players and fighters are team rows with an athlete block (birth date, height, plays, prize money, ranking).

Player

playerId, name, team, position, country, dateOfBirth, age, height, preferredFoot, marketValue, contractUntil, seasonStatistics[] (one entry per league season), transferHistory[].

League and standings

  • league: tournamentId, name, country, season, tier, titleHolder, mostTitlesTeams, startDate, endDate, seasonInfo (goals, home and away wins, draws, cards), seasons[].
  • standing: tournament, season, group, position, team, matches, wins, draws, losses, scoresFor, scoresAgainst, goalDifference, points, qualification.

Player statistics of a league season

playerSeasonStats: tournament, season, rank, player, team, and the figures. For football these are rating, appearances, minutesPlayed, goals, assists, expectedGoals and 17 more.

Player statistics for a league come in two shapes, because SofaScore publishes them in two shapes. Football leagues have a full table with every player. Other sports have leaderboards (the top 50 per figure), which this actor merges into one row per player.

FAQ

Do I need a proxy or a SofaScore account?

No. Leave everything else as it is and run.

How much does it cost?

EventPrice
Run start$0.005 per GB of memory (the default 1 GB run starts at $0.005)
Each row$0.001
  • 100 matches with statistics, lineups and incidents: about $0.10.
  • A football season (380 matches, 20 standings rows, 1 league row): about $0.40.
  • One team with its squad and transfers: $0.001.

Free Apify plans get up to 100 rows per run.

How fast is a run?

A day list reads one page per country with matches that day (about 200 requests for football), then the details per match. On 10 October 2026 a 100-match football run with the four default details took 20 seconds, and 3,000 matches took about two and a half minutes.

Why does a match have no lineups or statistics?

SofaScore does not record them for every league, and statistics do not exist before kick-off. The row still has teams, score, status and time.

Which day does a match belong to?

Days are UTC. A match that kicks off at 01:00 UTC on the 11th belongs to the 11th, even where local time still says the 10th.

Can I get historical seasons?

Yes. Give a league URL and a season such as 19/20. The league row lists every season SofaScore has for that league.

What are the odds?

The odds SofaScore displays, converted from fractional to decimal, with the opening price and whether each selection won.

How do I get only one kind of row?

Choose what each source returns: leagueData, teamData and playerData control which rows a league, team or player produces.

Can I get a live feed?

Each run is a snapshot. For a live feed, schedule the same task every few minutes and use matchId as the key.

Can it read data behind a SofaScore login?

No. The actor reads only what SofaScore shows to everyone. It does not sign in, and it has no access to account data such as favourites or notifications.

Support

Found a field that is missing or a URL that is not recognised? Open an issue on the actor's Issues tab with the input you used. Issues are answered within 1 to 2 business days.

Additional Services

Need a custom export shape, a scheduled feed straight into your database, or a scraper for another sports or odds site? Contact me through the actor page. Custom builds are available.

Explore More Scrapers

Full list at apify.com/memo23: job boards, review platforms, real-estate portals, flight prices and more, all pay-per-result.

🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor through the Apify MCP server or the Apify API (actor: memo23/sofascore-scraper).

Purpose: SofaScore data for 24 sports as typed JSON rows: matches with optional statistics, lineups, incidents and odds, plus teams, players, leagues and standings.

Minimal input:

{ "sports": ["football"], "maxItems": 50 }

Output: one dataset row per item, with type = match, team, player, league, standing or playerSeasonStats. A match row has matchId, url, sport, country, tournament, round, status, startTime, homeTeam, awayTeam, homeScore, awayScore, winner, venue, referee, stats {key: {home, away}}, statistics[], lineups {home, away}, incidents[], odds[].

Behaviors an agent should know:

  • Always set maxItems. The default is 100, and a full day of football is about 8,000 matches.
  • A match row with the default details is about 90 KB. Pass "matchDetails": [] for scores only, or ["statistics"] for scores and headline figures.
  • At least one of startUrls, searchQueries, matchIds or sports is required. A run with none of them fails at once with a message naming the fields. They can be combined in one run.
  • To resolve a name, pass it in searchQueries with maxResultsPerQuery: 1. No id lookup is needed first.
  • Days are UTC. dateFrom and dateTo take YYYY-MM-DD and cover up to 31 days. Without dates, daysBack and daysAhead count from today.
  • A URL that is not a match, team, player, league or sport page is skipped and named in the log. A run that finds nothing ends as succeeded with no rows.
  • Billing: $0.005 per GB of memory at run start, then $0.001 per row. Match details cost nothing extra. Free plans stop at 100 rows per run.
  • Tennis players, darts players and fighters come back as team rows.

⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Sofa IT d.o.o., the operator of SofaScore (sofascore.com), or any of its subsidiaries, nor by any league, club, federation or bookmaker whose data or odds appear in the output. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available match, team, player and league data. It uses no authenticated endpoints, no paid features and no content behind the sofascore.com login. Odds data is informational, and nothing in this actor's output is betting advice. Users are responsible for making sure their use complies with SofaScore's Terms of Service, applicable data-protection law (GDPR, CCPA and others), local gambling regulations, and any contractual obligations of their own organisation.


SEO Keywords

sofascore scraper, scrape SofaScore, SofaScore API, sofascore.com scraper, Apify SofaScore, live scores scraper, football data scraper, soccer data API, match statistics scraper, football lineups and player ratings, football odds data, xG data export, shot map data, league standings scraper, football fixtures and results, player statistics export, football transfers data, sports betting data, fantasy football data, basketball scores scraper, tennis live scores, sports data API