Sofascore Match Stats Scraper - Live Scores, Odds & Lineups avatar

Sofascore Match Stats Scraper - Live Scores, Odds & Lineups

Pricing

from $10.00 / 1,000 match summaries

Go to Apify Store
Sofascore Match Stats Scraper - Live Scores, Odds & Lineups

Sofascore Match Stats Scraper - Live Scores, Odds & Lineups

Scrape Sofascore match data for 11 sports: score, statistics, lineups, xG shot maps, player ratings, head-to-head and odds. Search by team, match ID or live. Export CSV, Excel, JSON or API. No login or API key. 22 fields per match, 7 optional extras.

Pricing

from $10.00 / 1,000 match summaries

Rating

0.0

(0)

Developer

RecordsData

RecordsData

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

20 hours ago

Last modified

Share

PunkRecordsData

Sofascore Match Stats Scraper collects Sofascore match data for 11 sports: score, status, tournament, team statistics, lineups, shot maps with xG, player ratings, head-to-head and odds. Enter a team name, a match ID or pick live matches, get one row per match, export CSV, Excel, JSON or API. No login, no API key. Pay per match and per extra, never for failed or empty rows.

Sofascore Match Stats Scraper turns Sofascore's match pages into clean, typed rows. Each match returns 22 fields, and you choose up to 7 optional extras (statistics, lineups, shot map, player ratings, head-to-head, odds, pre-match form). It is built for sports analysts, fantasy and betting-research tools, sports media and LLM agents that need structured match data instead of screenshots.

⚽ Sofascore match scraper: what does it do?

  • Find the recent and upcoming matches of a team by name (for example "Real Madrid").
  • Fetch specific matches by Sofascore event ID.
  • Pull every match that is live right now in one of 11 sports.
  • Add statistics, lineups, shot maps with expected goals (xG), best-player ratings, head-to-head record, bookmaker odds and pre-match form to the same row.
  • Export the dataset as CSV, Excel, JSON or XML, or read it through the Apify API.

Supported sports: football, basketball, tennis, American football, ice hockey, baseball, rugby, esports, volleyball, handball and table tennis.

πŸ“Š Sofascore data you can extract

FieldTypeExample
matchIdinteger14081798
tournament, countrystringLaLiga, Spain
homeTeam, awayTeamstringReal Madrid, Getafe
homeScore, awayScorenumber0, 1
status, statusTypestringEnded
startTimeISO date2026-03-02T20:00:00.000Z
hasXgbooleantrue
statisticsarray{"group":"Match overview","stat":"Ball possession","home":"77%","away":"23%"}
lineupsobjectformation, starting XI, substitutes, missing players per team
shotmaparrayplayer, minute, shot type, body part, situation, xG, xGOT
playerRatingsobjectbest home and best away player with rating
h2hRecordobjecthome wins, away wins, draws
oddsarrayfull-time result market, fractional odds
pregameFormobjectaverage rating, league position, last results per team
imageUrl, slug, scrapedAtstringteam crest URL, match slug, scrape time

An extra you did not enable is returned as "Not Requested". An extra Sofascore does not have for that match is returned as "N/A" (list fields with no entries are left out of the row) and it is not billed. Success rows carry no error field.

🧾 Sofascore scraper sample output

One match from the 2026-10-04 cloud verification run (team search "Real Madrid", all 7 extras on, 10 matches delivered), shortened to a few items per list:

{
"imageUrl": "https://www.sofascore.com/api/v1/team/2829/image",
"matchId": 14081798,
"slug": "getafe-real-madrid",
"tournament": "LaLiga",
"country": "Spain",
"homeTeam": "Real Madrid",
"awayTeam": "Getafe",
"homeScore": 0,
"awayScore": 1,
"status": "Ended",
"statusType": "finished",
"startTime": "2026-03-02T20:00:00.000Z",
"hasXg": true,
"statistics": [
{ "group": "Match overview", "stat": "Ball possession", "home": "77%", "away": "23%" }
],
"lineups": {
"home": { "formation": "4-2-3-1", "startingXI": [{ "name": "Thibaut Courtois", "position": "G", "jerseyNumber": "1", "rating": 6.5 }] },
"away": { "formation": "5-4-1" }
},
"shotmap": [
{ "player": "Mauro Arambarri", "team": "away", "minute": 90, "shotType": "save", "bodyPart": "right-foot", "xg": 0.0115, "xgot": 0.1852 }
],
"playerRatings": {
"bestHomePlayer": { "name": "Federico Valverde", "rating": "7.4" },
"bestAwayPlayer": { "name": "David Soria", "rating": "9.7" }
},
"h2hRecord": { "homeWins": 8, "awayWins": 2, "draws": 0 },
"odds": [{ "outcome": "1", "odds": "9/25" }, { "outcome": "X", "odds": "15/4" }, { "outcome": "2", "odds": "17/2" }],
"pregameForm": { "home": { "avgRating": "7.08", "leaguePosition": 2, "recentForm": ["W", "W", "W", "W", "L"] } },
"scrapedAt": "2026-10-04T05:48:17.681Z"
}

In that run the 10 matches carried 46 to 53 statistic lines each. Pre-match form was available for 6 of the 10 matches, and the other 4 were returned as "N/A" and not billed.

πŸ’° How much does it cost to scrape Sofascore?

Pay per event. You are charged only for rows that were saved and extras that returned real data. Error rows, "not found" rows and empty extras are free. Prices at the standard (FREE) tier:

EventPrice
Match summary (base row)$0.01
Match statistics$0.01
Lineup record$0.01125
Shot map$0.015
Player ratings$0.01
Head-to-head record$0.01
Betting odds$0.01
Pre-match form$0.01

With only the default extra (statistics) a match costs $0.02, so 1,000 matches cost about $20. Statistics is one event per match, whatever the number of statistic lines (46 to 53 in the verification run). With all seven extras on, a match costs up to $0.08625, and the verification run of 10 matches billed 10 of each event except pre-match form (6). Higher Apify plans get lower prices on lineups and shot maps. Set a maximum run cost in the run options and the Actor stops cleanly when it is reached ("Stopped at your max charge limit").

πŸš€ How to scrape Sofascore matches in 3 steps

  1. Open the Actor and type a team name (default "Real Madrid"), or paste Sofascore event IDs, or switch on Live matches only and choose a sport.
  2. Turn on the extras you need. Statistics is on by default, the rest are off.
  3. Click Start, then download the dataset as CSV, Excel, JSON or XML.

βš™οΈ Input

FieldMeaning
teamNamesTeam names to look up. Default ["Real Madrid"].
eventIdsSpecific Sofascore match IDs, from a match URL ending in id:12345678.
liveOnly + sportFetch every live match in the chosen sport.
maxItemsMaximum matches. Default 10. Free users are capped at 10.
includeStatistics ... includePregameFormSeven extra toggles, each billed per match that has data.
{
"teamNames": ["Real Madrid"],
"maxItems": 10,
"includeStatistics": true,
"includeLineups": true
}

If you fill Event IDs and leave Team names at its default, the default is skipped, so you get only the IDs you asked for.

πŸ“¦ Output

One dataset row per match, with an overview view and an all-fields view. A match that cannot be loaded produces a row with an error message and is never billed. If a search matches nothing, the run finishes successfully with a clear status message and a cost of zero.

βš–οΈ Sofascore scraper vs alternatives

Prices read from the public Apify Store listing on 2026-10-03:

ActorMain event priceNotes
abotapi/sofascore-scraper$0.002 per itemplus $0.0008 enrichment and a $0.08 start fee
crawlstone/sofascore-football-scraper$0.008 per resultfootball only
parseforge/sofascore-live-scraper$0.0335 per resultextras $0.003 to $0.01 each
This Actor$0.01 per match7 optional extras, 11 sports, no start fee

Several alternatives are cheaper per row. This Actor costs more per match than the cheapest ones and gives you separate lineups, xG shot maps, player ratings and odds, billed only when Sofascore returns them.

πŸ’Ό Use cases

  • Post-match recap graphics and articles with real statistics.
  • Feeding lineups, ratings and head-to-head history into fantasy or prediction models.
  • Tracking bookmaker odds next to results for betting research.
  • Building a multi-sport match database from one consistent schema.

πŸ”Œ Run via API, schedule and integrations

curl -X POST "https://api.apify.com/v2/acts/recordsdata~sofascore-match-stats-scraper/runs?token=YOUR_TOKEN" \
-H "content-type: application/json" \
-d '{"teamNames":["Real Madrid"],"maxItems":10}'

Use the Apify client for Python or JavaScript, schedule runs, and connect the dataset to Zapier, Make, n8n, Google Sheets or webhooks. AI agents can call the Actor through the Apify MCP server.

The Actor reads publicly available match data and does not log in or collect personal accounts. You are responsible for using the data in line with Sofascore's terms and local law. Odds are informational only, not betting advice. This is an independent tool, not affiliated with Sofascore.

❓ Frequently asked questions

Why does my run fail with HTTP 403 or "blocked"? In October 2026 Sofascore started answering HTTP 403 with reason "challenge" on its api.sofascore.com host. The Actor now reads www.sofascore.com/api/v1 with a Firefox browser fingerprint through a residential proxy, which returned data in the verification run. If Sofascore still refuses the requests, the run ends as FAILED with a clear message, delivers 0 rows and charges nothing. Try again later.

Why did I get 0 results? The team name did not match a Sofascore team, or the team has no matches. The run succeeds with a status message and costs nothing. Check the spelling or use an event ID.

Can I get matches for a calendar date? No. Sofascore's date schedule endpoint returned 404 for every date tested. Use a team name, live mode or an event ID.

Does it work for sports other than football? Yes, 11 sports are supported. Shot maps exist for football, basketball and handball only.

Are odds live? They are Sofascore's bookmaker odds for the full-time result at the moment of the run.

Why is pregameForm "N/A"? Sofascore keeps pre-match form only around the match date, and N/A extras are not billed.

How do I find a match ID? It is the number after id: in a Sofascore match URL.

Do I need a Sofascore account or cookies? No.

πŸ”— Want more sports data? Other PunkRecordsData scrapers

πŸ†˜ Support

Questions or a missing field? Open the Issues tab or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-04