SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds avatar

SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds

Pricing

from $1.00 / 1,000 results

Go to Apify Store
SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds

SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds

From $1/1K. Pull structured sports data from SofaScore across football, basketball, tennis, and 20+ sports. Search by keyword, paste URLs, fetch live matches, or download fixtures by date. Returns scores, stats, lineups, incidents, odds, teams, players, tournaments, and more.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

451

Total users

85

Monthly active users

8 days ago

Last modified

Share

SofaScore Scraper: Live Scores, Stats, Lineups & Odds

SofaScore Scraper turns SofaScore into a clean sports data API. Get live scores, full match statistics, lineups with player ratings, goals and cards, betting odds, league tables, team squads and player profiles for football, basketball, tennis and 20+ other sports. Search by name, paste links, grab every live match, or download a whole day of fixtures, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Four ways to find data. Search by keyword, paste SofaScore links, pull every live match, or list all fixtures on a date. No need to build URLs by hand.
  • Four record types, fully expanded. Matches, teams, players and tournaments each come with 100+ named fields, plus the complete source object so nothing is lost.
  • Match depth on demand. Switch statistics, lineups, incidents, odds, fan votes and head-to-head history on or off per run, and pay only for what you use.
  • League tables and squads. Tournament records can carry full standings; team records can carry the whole squad.
  • 20+ sports. Football, basketball, tennis, ice hockey, American football, baseball, cricket, rugby, MMA and more.
  • Built for schedules. Incremental mode returns only new and changed matches on recurring runs, and a refused run fails loudly instead of returning an empty dataset.

Use Cases

  • Sports betting and odds research: collect pre-match odds, fan prediction votes and head-to-head records to build and backtest models.
  • Live score apps and dashboards: feed live matches, incidents and statistics into your own site, bot or alerting tool.
  • Fantasy sports and scouting: track player ratings, positions, market values and squad changes across leagues.
  • Sports analytics and data science: build historical datasets of results, xG-bearing statistics and lineups for machine learning.
  • Media and content teams: generate match previews, reports and league tables automatically.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
type"match" (also "team", "player", "tournament")
id10000001
sport"football"
name"Home Team - Away Team"
homeTeam / awayTeam"Home Team" / "Away Team"
homeScore / awayScore2 / 1
homeScoreHalftime / awayScoreHalftime1 / 0
statusType"finished"
startTimestamp1700000000
tournament / season / round"Sample League" / "24/25" / 12
venue / venueCity"Sample Stadium" / "Sample City"
referee / attendance"Referee Name" / 40000
urlSofaScore link to the match, team, player or tournament
statisticspossession, shots, passes, xG (when enabled)
lineupsstarters, subs, formations, player ratings (when enabled)
incidentsgoals, cards, substitutions (when enabled)
oddspre-match markets (when enabled)
votesfan prediction poll: home / draw / away (when enabled)
headToHeadpast meetings and managers' record (when enabled)
standingsfull league table on tournament records (when enabled)
squadfull player list on team records (when enabled)
position / shirtNumber / marketValueplayer records: "F" / 10 / 50000000
rawthe complete source object

Team records also carry the manager, venue, capacity, colours and crest; player records carry the photo, preferred foot, contract end and market value currency; tournament records carry the tier, title holder and record title winner.

How to Use

  1. Pick a mode: search (by name), url (paste links), live (every live match now) or scheduled (all fixtures on a date).
  2. Fill in the fields for that mode, and switch on the match details you need.
  3. Set Max items to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search for a team:

{
"mode": "search",
"searchQueries": ["Real Madrid"],
"searchType": "team",
"maxItems": 5
}

Every live football and tennis match right now:

{
"mode": "live",
"sports": ["football", "tennis"],
"includeStatistics": true,
"includeIncidents": true
}

All fixtures for a date, plus the next two days:

{
"mode": "scheduled",
"sports": ["football"],
"date": "2024-06-15",
"daysAhead": 2,
"maxItems": 200
}

Paste links (match, team, player, tournament):

{
"mode": "url",
"urls": [
"https://www.sofascore.com/team/football/real-madrid/2829",
"https://www.sofascore.com/player/lionel-messi/12994"
]
}

Match links must include the numeric id: copy the address bar on a match page (it ends with #id:<number>), or use an /event/<number> link.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/sofascore-scraper").call(run_input={"mode": "live", "sports": ["football"]})
for match in client.dataset(run["defaultDatasetId"]).iterate_items():
print(match["name"], match["homeScore"], match["awayScore"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/sofascore-scraper').call({ mode: 'live', sports: ['football'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How maxItems shapes a scheduled run

A single day of football holds several hundred fixtures across roughly a hundred competitions. Scheduled mode collects a day competition by competition, most important first (world and continental, then major national leagues, then the long tail), and stops once maxItems is reached. A capped run therefore returns the day's most prominent fixtures. To get the entire day, raise maxItems or set it to 0. Competitions are taken whole, so a run can return slightly more than maxItems.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice.
  • Incremental mode (incrementalMode) is for scheduled runs over the same scope. Each record is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole scope, and only with emitExpired). stateKey names or shares the stored state. With incremental mode off, output is exactly as before.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch, url, live, or scheduled.
searchQueriesarray["Real Madrid"]Names to look up (search mode).
searchTypestringallRestrict a search to team, player, tournament, or match.
urlsarraysampleSofaScore links (url mode).
sportsarray["football"]Sports for live and scheduled modes.
datestringtodayYYYY-MM-DD for scheduled mode.
daysAheadinteger0Extra days after date.
includeStatisticsbooleantrueMatch and player statistics.
includeLineupsbooleantrueMatch lineups and ratings.
includeIncidentsbooleantrueGoals, cards, substitutions.
includeOddsbooleanfalsePre-match odds markets.
includeVotesbooleanfalseFan prediction poll per match.
includeH2HbooleanfalseHead-to-head history per match.
includeStandingsbooleantrueTournament league tables.
includeSquadbooleanfalseFull team squads.
maxItemsinteger20Stop after this many records (0 = no limit).
resumeFromRunIdstring(none)Continue one interrupted run.
incrementalModebooleanfalseReturn only new and changed records on scheduled runs.
stateKeystring(none)Name or share an incremental-mode state.
emitUnchangedbooleanfalseAlso return (and bill) unchanged records.
emitExpiredbooleanfalseAlso return (and bill) expired records.
proxyobjectApify ProxyConnection settings.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"type": "match",
"id": 10000001,
"sport": "football",
"name": "Home Team - Away Team",
"homeTeam": "Home Team",
"awayTeam": "Away Team",
"homeTeamLogo": "https://img.sofascore.com/api/v1/team/2000001/image",
"awayTeamLogo": "https://img.sofascore.com/api/v1/team/2000002/image",
"homeScore": 2,
"awayScore": 1,
"statusType": "finished",
"winnerCode": 1,
"startTimestamp": 1700000000,
"tournament": "Sample League",
"season": "24/25",
"round": 12,
"venue": "Sample Stadium",
"referee": "Referee Name",
"attendance": 40000,
"country": "Country",
"url": "https://www.sofascore.com/football/match/home-team-away-team/AbCdEf#id:10000001",
"statistics": [{ "period": "ALL", "groups": [] }],
"incidents": [{ "incidentType": "goal", "time": 23, "player": { "name": "Player Name" } }],
"raw": {}
}

Plan Requirement

The default proxy setting works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, the residential proxy group gives more headroom; pick it under Connection. If your Apify plan does not include proxy access, the run fails with a clear message instead of returning an empty result; a paid plan with proxy access is required.

FAQ

How much does it cost?

You pay per record returned, with optional match details billed only when you switch them on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.

This actor collects only publicly available sports data. You are responsible for how you use it: follow SofaScore's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Sports results and statistics are generally facts, but logos, photos and odds may be subject to third-party rights.

Can I get only new or changed matches on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records, and unchanged ones are not billed.

Why did a run return fewer matches than a full day?

Scheduled mode stops at Max items, most important competitions first. Set it higher, or to 0, to collect the whole day.

Why did my run fail instead of returning an empty dataset?

If the site refuses every request, the run stops with a clear message so "no matches today" is never confused with "nothing could be read". Run it again in a few minutes. If only some sports or dates could be read, you still get what was found.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more sports data?

Pair this actor with these related scrapers from the same team:

⚽ OneFootball Scraper
Scrape public OneFootball data including football news, upcoming fixtures, match results...
⚽ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse)
Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it...
⚽ Globo Esporte Scraper
Scrape public sports content from ge.globo.com, including news, videos, matches and feed...
⚽ JioHotstar Scraper
Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes...
⚽ Whatnot Scraper
Scrape Whatnot live and upcoming shows, queued items and lots, and seller profiles...
⚽ BookMyShow Scraper
Scrape BookMyShow movies and live events by city, category or URL. Extract genres...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.