Sofascore Live Scores & Fixtures Scraper avatar

Sofascore Live Scores & Fixtures Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Sofascore Live Scores & Fixtures Scraper

Sofascore Live Scores & Fixtures Scraper

Scrape live scores, fixtures, and results from Sofascore across 21 sports — football, tennis, basketball, and more. Get period scores, tennis points, live match minutes, winners, seeds, and optional betting odds in clean JSON. Filter by tournament, pick any date, and export or automate via API.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Banea Teodor

Banea Teodor

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Categories

Share

What does Sofascore Live Scores & Fixtures Scraper do?

This Actor extracts live scores, fixtures, and final results from Sofascore — one of the world's largest sports data platforms — across 21 sports: football, tennis, basketball, ice hockey, cricket, esports, MMA, and more. One run returns everything currently in play, or a full day's card of scheduled, live, and finished matches, as clean normalized JSON: period-by-period scores, tennis set/game/point states, live match minutes, tournament context, and optionally live betting odds.

It talks to Sofascore's JSON API directly — no browser, no screenshots — so runs finish in seconds and cost cents.

Why use this Actor?

  • Every sport, one schema — a tennis match, a football game, and an NBA game come back with identical field sets. Build one pipeline, cover 21 sports.
  • Real live detail — in-play tennis returns sets, games, and the current point ("40"–"15"); football returns the live match minute and per-half scores; finished matches carry the winner.
  • Fixtures and results by date — any past date returns final results, any future date returns the schedule. Sofascore's own priority ordering puts top competitions (Champions League, ATP, NBA) first.
  • Live betting odds included — optionally attach the featured "Full time" market: opening and current decimal odds for home/draw/away.
  • Fast, filtered runs — the tournament filter ("Premier League", "ATP", "NBA", or a country) skips non-matching competitions before fetching them, so filtered runs are cheaper and faster.
  • Built for pipelines — every row always has every field (null when a sport doesn't have it), ISO 8601 dates, numeric scores, absolute URLs.

How much does it cost?

You pay per event returned. Scraping all live football right now (~25–80 events) costs about a cent; a full day of top-flight fixtures with maxEvents: 200 finishes in under a minute. Use maxEvents to put a hard ceiling on any run — unlimited runs without a tournament filter are automatically capped at 10,000 events. Turning on includeOdds adds one request per event, which makes runs slower but not more expensive per result.

Input

FieldTypeDescriptionExample
modestringlive (everything in play now, default) or scheduled (a day's fixtures and results)."live"
sportsarraySports to scrape. The result cap is split evenly between them.["football", "tennis"]
datedateDay to scrape in scheduled mode (default: today). Past = results, future = schedule."2026-08-27"
tournamentFilterstringOnly competitions whose tournament, category, or country name contains this text."Champions League"
includeOddsbooleanAttach the featured "Full time" betting market (decimal odds, opening + current).false
maxEventsintegerHard cap on returned events (= billed results).200

An empty input works: it returns live football.

Output

One row per match:

{
"eventId": 14025044,
"sport": "football",
"url": "https://www.sofascore.com/football/match/aek-athens-levski-sofia/QobsRgb#id:14025044",
"tournamentName": "UEFA Champions League, Playoff Round",
"uniqueTournamentId": 7,
"uniqueTournamentName": "UEFA Champions League",
"categoryName": "Europe",
"countryName": null,
"seasonName": "UEFA Champions League 26/27",
"round": 636,
"roundName": "Playoff round",
"statusType": "finished",
"statusDescription": "Ended",
"startTime": "2026-08-26T18:00:00.000Z",
"liveMinute": null,
"winner": "home",
"homeTeamId": 2687,
"homeTeamName": "AEK Athens",
"homeTeamCountry": "Greece",
"homeTeamSeed": null,
"awayTeamId": 2342,
"awayTeamName": "Levski Sofia",
"awayTeamCountry": "Bulgaria",
"awayTeamSeed": null,
"homeScore": 4,
"awayScore": 0,
"homeScoreDisplay": 4,
"awayScoreDisplay": 0,
"homePeriodScores": [3, 1],
"awayPeriodScores": [0, 0],
"homeScorePenalties": null,
"awayScorePenalties": null,
"homePoint": null,
"awayPoint": null,
"groundType": null,
"firstToServe": null,
"oddsMarketName": "Full time",
"homeOdds": 1.5,
"drawOdds": 3.75,
"awayOdds": 6.0,
"homeOddsInitial": 1.44,
"drawOddsInitial": 4.0,
"awayOddsInitial": 6.5,
"oddsSuspended": false,
"scrapedAt": "2026-08-27T14:30:00.000Z",
"runId": "AbC123..."
}

Field notes:

  • Period scores are per period: football halves ([3, 1] = 3 first-half goals, 1 second-half), basketball quarters, tennis games per set.
  • Tennis rows fill homePoint/awayPoint (current game), groundType (surface), firstToServe, and seeds; homeScore counts sets won.
  • liveMinute is the current match minute for clock sports in play, computed the way Sofascore's own clock works.
  • winner is "home", "away", or "draw" once decided.
  • Odds are decimal (converted from Sofascore's fractional values); drawOdds is null on two-way markets like tennis. Events without a market keep null odds rather than being dropped.
  • Fields a sport doesn't have are null, never omitted — the shape is identical on every row.

Tips and tricks

  • Live scores dashboard: schedule the Actor every few minutes with mode: "live" and your sports — eventId is stable, so downstream you can upsert by it.
  • Results backfill: loop mode: "scheduled" over past dates to build a historical results dataset with final scores and winners.
  • One competition only: tournamentFilter: "Premier League" (or "ATP", "NBA", "Wimbledon", a country name) — filtered tournaments are skipped before fetching, so this is also the cheapest way to run.
  • Odds movement tracking: run with includeOdds on a schedule and diff homeOdds against homeOddsInitial by eventId.
  • Multi-sport runs split maxEvents evenly across the selected sports, so one busy sport can't crowd out the others.

Integrations

The dataset works with every Apify integration: export to JSON, CSV, Excel, push to Google Sheets, trigger webhooks on finish, or query via the Apify API from Python/Node. Typical setups: a scheduled live-scores feed into a Slack webhook, or the Apify API pulling each day's results into a stats model.