Sports Scores & Odds Scraper — NBA, NFL, MLB, NHL, Soccer +15 avatar

Sports Scores & Odds Scraper — NBA, NFL, MLB, NHL, Soccer +15

Pricing

from $2.00 / 1,000 game scrapeds

Go to Apify Store
Sports Scores & Odds Scraper — NBA, NFL, MLB, NHL, Soccer +15

Sports Scores & Odds Scraper — NBA, NFL, MLB, NHL, Soccer +15

Scrape live scores, fixtures, historical results and betting odds across 19 leagues in one dataset: teams, scores, records, venue, status, moneyline, spread and over/under.

Pricing

from $2.00 / 1,000 game scrapeds

Rating

0.0

(0)

Developer

Pixflor

Pixflor

Maintained by Community

Actor stats

0

Bookmarked

303

Total users

37

Monthly active users

17 minutes ago

Last modified

Share

Live scores, upcoming fixtures, historical results and betting odds — 19 leagues, one schema, one run. Tennis and MMA come back match by match — 215 ATP/WTA matches on an ordinary weekday, with set scores and tiebreaks — not as a tournament name.

No API key. No login. Pick your leagues, set a date range, export CSV or JSON.


Leagues covered

Basketball NBA · WNBA · NCAA Men's Football NFL · NCAA Baseball MLB Hockey NHL Soccer Premier League · La Liga · Serie A · Bundesliga · Ligue 1 · Champions League · MLS Combat UFC Tennis ATP · WTA Motorsport Formula 1 Golf PGA

Mix them freely — a single run can pull NBA, Premier League and F1 into the same table, because every league returns identical columns.


What you get

ColumnExample
date2026-03-15T23:00Z
league / sportnba · basketball
awayTeam / awayScore / awayRecordMinnesota Timberwolves · 103 · 41-27
homeTeam / homeScore / homeRecordOklahoma City Thunder · 116 · 53-15
homeWinner / awayWinnertrue / false
status / statusDetail / completedSTATUS_FINAL · Final · true
venue / venueCity / attendancePaycom Center · Oklahoma City
oddsDetails / spread / overUnderOKC -6.5 · -6.5 · 215.5
homeMoneyline / awayMoneyline-280 / +230
broadcasts["ESPN"]
division / roundMen's Singles · Quarterfinal
setScores6-3, 7-6(4) — home player first, tiebreaks in brackets
homeSets / awaySets[6,7] / [3,6]
homeCountry / awayCountryItaly / Austria
fieldSize / leaderName / leaderScore120 · Ben Kohles · -8

Individual sports return every match, not the tournament name

Most sports scrapers treat a tennis tournament as a single row — the event name, a date, and nothing else — because that is what the obvious endpoint hands back. The matches are nested a level deeper, and this Actor walks them out.

Measured on 22 October 2026, one ordinary weekday with no Grand Slam running:

RequestTournamentsMatch rows
atp + wta, today6215
atp, Wimbledon week 12735
wta, Wimbledon week 14832
atp, a whole month81,126

Every row carries both players, the winner, set-by-set scores with tiebreaks preserved (6-3, 7-6(4)), the round (Qualifying 1st Round, Quarterfinal), the division (Men's Singles, Women's Doubles) and both players' countries.

The same applies to combat sports: a UFC card comes back as every bout on it, not one row for the headline fight.


Typical uses

  • Historical datasets. Set a date range and pull a whole month of results in one run — a 5-day NBA range returns ~40 games.
  • Model training and backtesting. Scores, records and closing odds in the same row.
  • Live dashboards. Schedule it every few minutes with Live now selected.
  • Sports content and newsletters. Yesterday's results, formatted, automatically.
  • Odds monitoring. Filter to Only games with betting odds and track line movement.

Example input

Yesterday's finished games across the big four:

{
"leagues": ["nba", "nfl", "mlb", "nhl"],
"dateFrom": "2026-03-15",
"dateTo": "2026-03-15",
"statusFilter": "final"
}

A month of Premier League history:

{
"leagues": ["epl"],
"dateFrom": "2026-03-01",
"dateTo": "2026-03-31",
"sortBy": "date",
"maxItems": 500
}

One team, all season:

{ "leagues": ["nba"], "team": "Celtics", "dateFrom": "2026-01-01", "dateTo": "2026-04-01" }

Settings that matter

  • Leave both dates empty to get the current scoreboard — today's games and what's next.
  • dateFrom + dateTo pulls a historical range in a single run. This is the feature most single-day scrapers don't have.
  • team matches both full names and abbreviations, so BOS and Celtics both work.
  • withOddsOnly is aggressive: odds exist for some leagues only, and usually only near game time. Expect it to filter heavily.
  • maxItems is your cost ceiling. Set it deliberately.

Pricing

Pay per event — you pay for games returned, not for runtime.

EventPrice
Actor start$0.002 per run
Game scraped$0.002 each

1,000 games ≈ $2.00.


Reliability

Plain HTTP against a public JSON API — no HTML parsing, no headless browser, no bot-detection workarounds. Website redesigns don't affect it.

Every request retries with exponential backoff, and one league failing degrades the run instead of ending it — you still get the others, and the log names the one that was missing.


Notes

  • Data is provided as-is for research and analysis, with no warranty of accuracy or timeliness. It is not betting advice.
  • Leagues have off-seasons. An empty result for a date range usually means there were no fixtures, not that something broke — the log tells you which leagues returned nothing.
  • Odds coverage varies by league and is typically populated close to game time. null means "not published", not "no line exists".
  • Tennis and MMA have no real home/away side; the two participants are still placed in the home/away columns so the schema stays identical across leagues, and setScores is always written home-player-first.
  • For tennis, homeScore/awayScore are sets won, with the game-by-game detail in setScores, homeSets and awaySets. A set still in progress can read 0-0.
  • Golf and F1 are a field rather than a pairing, so each returns one row per event carrying fieldSize, leaderName and leaderScore (for F1, the race winner and the grid size). Before a race or round starts there is no field yet, so you get the fixture row.

Questions or a bug?

Open an issue on the Issues tab with your input JSON and the run ID — that's usually enough to reproduce it immediately.