SofaScore Scraper | Live Scores & Match Data API avatar

SofaScore Scraper | Live Scores & Match Data API

Pricing

from $0.90 / 1,000 results

Go to Apify Store
SofaScore Scraper | Live Scores & Match Data API

SofaScore Scraper | Live Scores & Match Data API

[💰 $0.9 / 1K] Scrape live scores, fixtures, lineups, statistics, odds, and standings from SofaScore. Search by team/player/tournament, paste match links, or pull every live or scheduled match across any sport.

Pricing

from $0.90 / 1,000 results

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

SofaScore Scraper

Scrape SofaScore — live scores, fixtures, lineups, statistics, odds, and standings — by team, player, or tournament keyword, by pasting match links, or by pulling every live or scheduled match for any sport.

Search, paste links, or pull every live/scheduled match, then enrich each one with statistics, lineups, incidents, odds, fan votes, standings, and squads — with built-in change-tracking for recurring monitoring campaigns.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

parsebird/sofascore-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/sofascore-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: mode (string, "search"/"url"/"live"/"scheduled"), searchQueries (string array, default ["Real Madrid"], search mode), searchType ("all"/"team"/"player"/"tournament"/"match"), urls (string array, url mode — team/player/tournament/match links; match links need "#id:<number>" or "/event/<number>"), sports (string array, default ["football"], live/scheduled modes), date (string, "YYYY-MM-DD" or "today", scheduled mode), daysAhead (integer, default 0), includeStatistics/includeLineups/includeIncidents (boolean, default true), includeOdds/includeVotes/includeSquad (boolean, default false), includeStandings (boolean, default true), maxItems (integer, default 20, 0=unlimited), resumeFromRunId (string, continue an interrupted crawl), incrementalMode (boolean, tags records NEW/CHANGED/UNCHANGED), stateKey (string, name a monitoring campaign), emitUnchanged/emitExpired (boolean, default false). Output fields vary by type ("match"/"team"/"player"/"tournament"): id, name, sport, homeTeam/awayTeam, homeScore/awayScore, statusType, startTimestamp, tournament/uniqueTournament, season, round, venue, referee, statistics/lineups/incidents/odds/votes/standings/squad (when enabled), url, raw. Full actor spec: fetch build via GET https://api.apify.com/v2/acts/parsebird~sofascore-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations

What does SofaScore Scraper do?

This Actor scrapes SofaScore, the live-score platform covering football, tennis, basketball, and dozens of other sports, by rendering its internal API in a real browser — SofaScore blocks plain HTTP requests at the network-fingerprint level, so a browser is required to get through reliably.

  • 🔎 Four modes — search by team/player/tournament/match keyword, paste SofaScore links directly, pull every match live right now, or every scheduled fixture across a date range
  • 📊 Deep enrichment, opt-in — statistics, lineups with player ratings, incidents (goals/cards/subs), pre-match odds, fan prediction votes, full league standings, and complete squads
  • 🔁 Incremental monitoring — tag every record NEW, CHANGED, or UNCHANGED against a previous run sharing the same stateKey, so recurring campaigns only pay attention to what actually moved
  • ▶️ Resumable crawls — pass a previous run's ID via resumeFromRunId to continue an interrupted large crawl without re-fetching or re-billing what it already collected
  • ⏱️ Scheduling — run this Actor on a timer via Apify Scheduler for live-score monitoring or daily fixture digests
  • 🔌 API access — trigger runs and pull results programmatically via the Apify API or client libraries
  • 📊 Flexible export — download results as JSON, CSV, or Excel, or query them via API

What data can you extract from SofaScore?

FieldDescription
typematch, team, player, or tournament
name / homeTeam / awayTeamMatch or entity name
homeScore / awayScore / homeScoreHalftime / awayScoreHalftimeScores, full-time and half-time
statusType / winnerCodeMatch state (notstarted, inprogress, finished) and result
tournament / uniqueTournament / season / roundCompetition context
venue / venueCity / latitude / longitude / referee / attendanceMatch logistics
statistics / lineups / incidents / odds / votesMatch detail, when enabled
standings / squadTournament table / team roster, when enabled
urlDirect link back to the SofaScore page

Input parameters

ParameterTypeRequiredDefaultDescription
modestringNosearchsearch, url, live, or scheduled
searchQueriesstring arrayNo["Real Madrid"]Keywords to resolve (search mode)
searchTypestringNoallRestrict a query to team, player, tournament, or match
urlsstring arrayNosample linksSofaScore links (url mode)
sportsstring arrayNo["football"]Sports for live and scheduled modes
datestringNotodayYYYY-MM-DD for scheduled mode
daysAheadintegerNo0Extra days after date
includeStatisticsbooleanNotrueMatch and player statistics
includeLineupsbooleanNotrueMatch lineups and ratings
includeIncidentsbooleanNotrueGoals, cards, substitutions
includeOddsbooleanNofalsePre-match odds markets
includeVotesbooleanNofalseFan prediction poll per match
includeStandingsbooleanNotrueTournament league tables
includeSquadbooleanNofalseFull team squads
maxItemsintegerNo20Stop after this many records. 0 = no limit
resumeFromRunIdstringNoContinue one interrupted crawl
incrementalModebooleanNofalseRecurring change detection
stateKeystringNoName/share an incremental-mode monitoring campaign
emitUnchangedbooleanNofalseAlso return (and bill) UNCHANGED entities
emitExpiredbooleanNofalseAlso return (and bill) EXPIRED entities
proxyobjectNoApify proxyConnection settings

Output example

{
"type": "match",
"id": 16246416,
"sport": "football",
"name": "Indonesia - Vietnam",
"homeTeam": "Indonesia",
"awayTeam": "Vietnam",
"homeScore": 0,
"awayScore": 2,
"statusType": "inprogress",
"winnerCode": null,
"startTimestamp": 1785763800,
"tournament": "ASEAN Championship, Group A",
"uniqueTournament": "ASEAN Championship",
"season": "2026",
"round": 4,
"venue": "Pakansari Stadium",
"venueCity": "Bogor Regency",
"referee": "Timothy Danaskos",
"country": "Asia",
"url": "https://www.sofascore.com/football/match/vietnam-indonesia/EWbsaQc#id:16246416",
"hasXg": false,
"incidents": [{ "incidentType": "goal", "time": 23, "player": { "name": "Player Name" } }],
"raw": {}
}

Download results in JSON, CSV, or Excel directly from the Apify Console, or pull them programmatically via the API.

Use cases

  • Live-score monitoring — poll mode: "live" on a schedule to power a dashboard or alerting pipeline
  • Fixture digests — pull mode: "scheduled" for the day (plus daysAhead) to build a daily or weekly preview
  • Competitor/brand research — pull a team or player's full profile, squad, and standings context in one call
  • Change-tracked monitoring — run incrementalMode on a schedule with a shared stateKey to get only what changed since the last check, instead of re-processing everything every time
  • Betting/analytics research — combine includeOdds and includeVotes with match statistics for pre-match analysis

How to scrape SofaScore with this Actor

  1. Go to the SofaScore Scraper page on Apify Store
  2. Click Try for free — new users get a free trial to test the Actor before paying
  3. Pick a mode — search by keyword, paste links, live, or scheduled
  4. Toggle the enrichments you need (statistics, lineups, incidents, odds, votes, standings, squad)
  5. Set maxItems to cap the run size (or 0 for unlimited)
  6. Click Start — the Actor renders SofaScore's own API in a real browser and normalizes every result
  7. When the run finishes, download your data as JSON, CSV, or Excel, or fetch it via the API

Use with the Apify API

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("parsebird/sofascore-scraper").call(run_input={
"mode": "live",
"sports": ["football"],
"includeStatistics": True,
"includeIncidents": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['name']} - {item['homeScore']}:{item['awayScore']} ({item['statusType']})")

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('parsebird/sofascore-scraper').call({
mode: 'live',
sports: ['football'],
includeStatistics: true,
includeIncidents: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.log(`${item.name} - ${item.homeScore}:${item.awayScore} (${item.statusType})`);
});

See the Apify API documentation for full reference, or the Actor's API tab for ready-to-run request snippets in more languages.

How much does it cost to scrape SofaScore?

This Actor uses Pay-per-event pricing with two events — you only pay for records actually returned, with no separate platform rental fee.

EventPrice per event (Free plan)Price per 1,000
record-scraped$0.0015$1.50
detail-enrichment$0.0009$0.90

record-scraped is charged once per match, team, player, or tournament pushed to the dataset. detail-enrichment is charged once more on top, only when at least one enrichment (statistics, lineups, incidents, odds, votes, standings, or squad) was actually attached. A 1,000-match run with statistics and incidents enabled costs about $2.40 on the Free plan. Start with the free trial and a low maxItems to preview results before scaling up.

FAQ

Why does SofaScore need a browser instead of a simple API call? SofaScore blocks non-browser HTTP clients at the network-fingerprint level — the same request that returns real data from a browser returns a 403 from a plain HTTP library. This Actor renders every request in a real headless browser to get through reliably.

Why does this Actor default to a country-pinned residential proxy? SofaScore also blocks by IP reputation: even a real headless browser gets a 403 from a datacenter IP, and an unpinned residential proxy pool can return a similarly flagged IP. Pinning to a specific country's residential pool (US by default) reliably avoids this — confirmed by direct testing on Apify's own infrastructure.

How does searchType: "match" work? SofaScore's own search only returns match results for match-shaped queries (e.g. "Real Madrid Barcelona" or "Real Madrid vs Barcelona"), not for a single team/player name — that's how the underlying search behaves, not a limitation of this Actor.

What happens with mode: "scheduled" under the hood? SofaScore's site no longer exposes a single "all matches for date X" endpoint — it first looks up which tournaments have matches that day, then fetches each tournament's events for that date separately. This Actor reproduces that same two-step lookup, which makes scheduled mode slower than live or url mode, especially across many sports or several daysAhead.

How does incremental mode decide NEW vs. CHANGED vs. UNCHANGED? Each record's content (excluding the raw upstream object) is hashed and compared against the previous run that used the same stateKey. No previous record with that ID → NEW. Same ID but a different hash → CHANGED. Same ID and hash → UNCHANGED (returned only if emitUnchanged is on). An ID seen in the previous run but absent from this one is EXPIRED (returned only if emitExpired is on, as a minimal placeholder record since fresh data for it isn't available).

What exactly does resumeFromRunId skip? It reads the referenced run's dataset, builds a set of already-pushed type:id pairs, and skips those specific entities in this run — so a crawl that got cut off partway (e.g. a timeout on a huge scheduled run) can continue without re-fetching or re-billing what it already collected.

Can I schedule recurring runs? Yes. Use Apify's Scheduler to run this Actor on a timer — pair it with incrementalMode and a fixed stateKey for change-tracked monitoring.

Is it legal to scrape SofaScore? SofaScore's match, team, and player pages are publicly viewable without a login. You're responsible for complying with SofaScore's Terms of Service for your specific use case. See Apify's blog post on the legality of web scraping for general background.

Can I access results via API? Yes. Every run's dataset is available through the Apify API and client libraries (Python, JavaScript) — see the Actor's API tab for ready-made snippets.

Something not working? Open an issue on the Actor's Issues tab in Apify Console — the ParseBird team monitors it directly.

Other sports and monitoring Actors from ParseBird: