Sofascore Match Stats Scraper - Live Scores, Odds & Lineups
Pricing
from $10.00 / 1,000 match summaries
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
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
| Field | Type | Example |
|---|---|---|
matchId | integer | 14081798 |
tournament, country | string | LaLiga, Spain |
homeTeam, awayTeam | string | Real Madrid, Getafe |
homeScore, awayScore | number | 0, 1 |
status, statusType | string | Ended |
startTime | ISO date | 2026-03-02T20:00:00.000Z |
hasXg | boolean | true |
statistics | array | {"group":"Match overview","stat":"Ball possession","home":"77%","away":"23%"} |
lineups | object | formation, starting XI, substitutes, missing players per team |
shotmap | array | player, minute, shot type, body part, situation, xG, xGOT |
playerRatings | object | best home and best away player with rating |
h2hRecord | object | home wins, away wins, draws |
odds | array | full-time result market, fractional odds |
pregameForm | object | average rating, league position, last results per team |
imageUrl, slug, scrapedAt | string | team 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:
| Event | Price |
|---|---|
| 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
- 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.
- Turn on the extras you need. Statistics is on by default, the rest are off.
- Click Start, then download the dataset as CSV, Excel, JSON or XML.
βοΈ Input
| Field | Meaning |
|---|---|
teamNames | Team names to look up. Default ["Real Madrid"]. |
eventIds | Specific Sofascore match IDs, from a match URL ending in id:12345678. |
liveOnly + sport | Fetch every live match in the chosen sport. |
maxItems | Maximum matches. Default 10. Free users are capped at 10. |
includeStatistics ... includePregameForm | Seven 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:
| Actor | Main event price | Notes |
|---|---|---|
| abotapi/sofascore-scraper | $0.002 per item | plus $0.0008 enrichment and a $0.08 start fee |
| crawlstone/sofascore-football-scraper | $0.008 per result | football only |
| parseforge/sofascore-live-scraper | $0.0335 per result | extras $0.003 to $0.01 each |
| This Actor | $0.01 per match | 7 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.
π‘οΈ Is it legal to scrape Sofascore?
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