SofaScore API Scraper
Pricing
from $1.00 / 1,000 dataset rows
SofaScore API Scraper
Scrape live scores, scheduled fixtures, match detail and search results directly from SofaScore's public backend API.
What does SofaScore API Scraper do?
SofaScore API Scraper pulls live scores, fixtures and results, deep match detail, league tables, and team & player data straight from SofaScore's own backend REST API — the same one the official mobile app talks to. It covers football, basketball, tennis, ice hockey, cricket, esports, motorsport and every other sport SofaScore tracks. Because it hits the API directly instead of rendering pages, it's fast, cheap, and returns clean structured JSON rather than scraped HTML.
Run it on the Apify platform for scheduling, a REST API to pull results, webhooks and integrations, and one-click dataset export to JSON, CSV or Excel — no script to babysit.
Features
- Live scores for any sport, updated in real time.
- Fixtures & results by date range, or by league season.
- Full match detail enriched on demand with:
- Statistics — possession, shots, passes, xG and more
- Lineups — formations, starters/bench, per-player match ratings
- Incidents — goals, cards, substitutions, period markers
- Odds — pre-match betting markets
- Win-probability votes — crowd 1 / X / 2 tallies
- Head-to-head — historical record between the two teams
- League tables (standings) — full or home/away splits.
- Team profiles — venue, manager, colours, and the full squad.
- Player profiles — position, market value, height, preferred foot, contract.
- Search — resolve any team, player or tournament name to its SofaScore ID.
- Paste-a-URL mode — drop in any SofaScore match/team/player/tournament link and it's routed automatically.
- 15+ sports, one Actor.
How to use
- Click Try for free / Start on the Actor page.
- Pick a Mode (see the table below).
- Fill in the fields that mode needs — most are dropdowns or ID pickers.
- Click Start and open the Dataset tab when it finishes (export as JSON, CSV, Excel, HTML…).
Finding IDs: run search mode first (e.g. "real madrid") to get the numeric entityId for a team, player or tournament — then feed it to team, player, standings or tournament mode. Or just paste the page URL into url mode and skip IDs entirely.
Modes, with input → output examples
Every dataset row carries a kind field identifying its shape (event, event_detail, search_result, standings_row, team, player). Wherever SofaScore has a matching web page, the row also carries a url linking to it (standings rows additionally include a tournamentUrl).
live — live scores
{ "mode": "live", "sport": "football" }
{"kind": "event", "id": 16860578, "slug": "port-city-fc-golden-warriors-fc","startTimestamp": 1755532800, "sport": "football", "tournament": "NPSL","homeTeam": "Port City FC", "awayTeam": "Golden Warriors FC","homeScore": 1, "awayScore": 0, "statusType": "inprogress", "statusDescription": "2nd half"}
scheduled — fixtures & results by date
{ "mode": "scheduled", "sport": "football", "dateFrom": "2026-08-18", "dateTo": "2026-08-18", "maxPages": 3 }
Returns one event row per match on each day in the range (same shape as live). Turn on fetchEventDetails to fan out to full match detail per event.
event_detail — full match detail, with enrichments
{"mode": "event_detail", "eventIds": ["16363633"],"includeStatistics": true, "includeLineups": true, "includeIncidents": true,"includeVotes": true, "includeH2H": true, "includeOdds": true}
{"kind": "event_detail", "id": 16363633, "homeTeam": "Arsenal", "awayTeam": "Coventry City","homeScore": 3, "awayScore": 0, "statusType": "finished","statistics": [{ "period": "ALL", "groups": [{ "groupName": "Match overview","statisticsItems": [{ "name": "Ball possession", "home": "64%", "away": "36%", "key": "ballPossession" }] }] }],"lineups": { "confirmed": true, "home": { "formation": "4-2-3-1","players": [{ "player": { "name": "David Raya", "position": "G" }, "statistics": { "rating": 7 } }] } },"incidents": [{ "incidentType": "period", "text": "FT", "homeScore": 3, "awayScore": 0, "time": 90 }],"odds": [{ "marketName": "Full time", "choices": [{ "name": "1", "fractionalValue": "1/5", "winning": true }] }],"votes": { "vote1": 110530, "voteX": 8116, "vote2": 7638 },"h2h": { "teamDuel": { "homeWins": 1, "awayWins": 0, "draws": 0 } },"url": "https://www.sofascore.com/event/16363633"}
Each enrichment toggle nests SofaScore's native payload under a key of the same name (statistics, lineups, incidents, odds, votes, h2h). Enabling any of them fetches full match detail automatically. The same toggles work in live, scheduled, tournament and url modes.
standings — league table
{ "mode": "standings", "uniqueTournamentId": 17, "standingsType": "total" }
{"kind": "standings_row", "tournament": "Premier League", "uniqueTournamentId": 17,"standingsType": "total", "position": 1, "teamId": 17, "team": "Manchester City","matches": 3, "wins": 3, "draws": 0, "losses": 0, "scoresFor": 7, "scoresAgainst": 2,"points": 9, "promotion": "Champions League","url": "https://www.sofascore.com/football/team/manchester-city/17","tournamentUrl": "https://www.sofascore.com/football/tournament/england/premier-league/17"}
One row per team. Leave seasonId empty for the current season, or set it for a historical table. standingsType can be total, home or away.
tournament — a league season's fixtures & results
{ "mode": "tournament", "uniqueTournamentId": 17, "eventsSpan": "last", "maxPages": 3 }
Returns event rows for a whole league season — eventsSpan: "last" for played results, "next" for upcoming fixtures. Combine with the enrichment toggles for a full stats sweep of a competition.
team — team profile (+ optional squad)
{ "mode": "team", "teamId": 42, "includeSquad": true }
{"kind": "team", "id": 42, "name": "Arsenal", "country": "England","primaryTournament": "Premier League", "managerName": "Mikel Arteta","venue": "Emirates Stadium", "venueCapacity": 60704,"squad": [{ "id": 804508, "name": "Viktor Gyökeres", "position": "F", "jerseyNumber": "14" }],"url": "https://www.sofascore.com/football/team/arsenal/42","team": { "…": "full native SofaScore team object nested here" }}
player — player profile
{ "mode": "player", "playerId": 804508 }
{"kind": "player", "id": 804508, "name": "Viktor Gyökeres", "position": "F","team": "Arsenal", "country": "Sweden", "height": 187, "preferredFoot": "Right","marketValue": 61000000, "marketValueCurrency": "EUR","url": "https://www.sofascore.com/player/viktor-gyokeres/804508","player": { "…": "full native SofaScore player object nested here" }}
search — resolve names to IDs
{ "mode": "search", "searchQuery": "real madrid" }
{ "kind": "search_result", "resultType": "team", "entityId": 2829, "entityName": "Real Madrid", "sport": "football" }{ "kind": "search_result", "resultType": "player", "entityId": 826643, "entityName": "Kylian Mbappé", "teamId": 2829 }
url — paste any SofaScore link
{ "mode": "url", "urls": ["https://www.sofascore.com/team/football/arsenal/42","https://www.sofascore.com/player/viktor-gyokeres/804508"] }
Match, team, player and tournament links are each routed to the right fetch and returned in their matching kind shape.
Input reference
| Field | Type | Used by | Description |
|---|---|---|---|
mode | select | all | live, scheduled, event_detail, search, standings, tournament, team, player, url |
sport | select | live, scheduled | Sport slug (football, basketball, tennis, …) |
dateFrom / dateTo | date | scheduled | YYYY-MM-DD range (inclusive) |
maxPages | integer | scheduled, tournament | Pages to sweep |
eventIds | array | event_detail | Match IDs to fetch |
searchQuery | string | search | Team / player / tournament name |
urls | array | url | SofaScore links to route |
uniqueTournamentId | integer | standings, tournament | League ID (17 = Premier League) |
seasonId | integer | standings, tournament | Optional; current season if empty |
standingsType | select | standings | total / home / away |
eventsSpan | select | tournament | last (results) / next (fixtures) |
teamId | integer | team | Team ID |
includeSquad | boolean | team | Also fetch the squad |
playerId | integer | player | Player ID |
fetchEventDetails | boolean | live, scheduled, tournament | Fan out to full match detail |
includeStatistics / includeLineups / includeIncidents / includeOdds / includeVotes / includeH2H | boolean | event modes | Per-match enrichments (auto-enable detail fetch) |
maxItems | integer | all | Stop after N rows (0 = unlimited) |
requestDelaySecs | number | all | Delay between API calls |
proxyConfiguration | object | all | Residential proxy on by default (see below) |
Pricing
Pay-per-result, charged only for what's actually produced (plus standard Apify platform usage):
- $1 per 1,000 dataset rows ($0.001/row) — every event, standings, team, player or search row.
- $0.50 per 1,000 enrichments ($0.0005 each) — one charge per per-match enrichment fetched (
statistics,lineups,incidents,odds,votes,h2h). A plain run with no enrichments is billed at the row rate only; a match with all six enrichments on costs the row plus six enrichment charges (~$0.004 total).
Use maxItems / maxPages, and enable only the enrichments you need, to cap spend on wide sweeps.
Tips
- Run
searchonce to grab the IDs you need, or skip IDs entirely withurlmode. - For a fast overview, leave enrichments off; switch them on only when you need the depth.
page=1is the first page of scheduled events for a date —page=0always returns empty (an undocumented API quirk).- Residential proxy is enabled by default because the API is fronted by Cloudflare and blocks datacenter IPs; leave it on unless you're running from an IP Cloudflare already trusts.
- Schedule the Actor (hourly/daily) via Apify Schedules for always-fresh data.
FAQ & disclaimer
This Actor calls SofaScore's public, unauthenticated backend API (no login or key, access-control-allow-origin: *). It's provided for research and legitimate data-integration use; you're responsible for complying with SofaScore's Terms of Service in your jurisdiction. SofaScore doesn't officially license API access, so treat this as an unofficial integration.
Found a bug or need a custom field/endpoint? Open an issue in the Actor's Issues tab.
Did you find this useful?
⭐ Rate this Actor on Apify! Your feedback helps other users find it and helps us keep improving it.