Sports Scores & Odds Scraper — NBA, NFL, MLB, NHL, Soccer +15
Pricing
from $2.00 / 1,000 game scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
303
Total users
37
Monthly active users
17 minutes ago
Last modified
Categories
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
| Column | Example |
|---|---|
date | 2026-03-15T23:00Z |
league / sport | nba · basketball |
awayTeam / awayScore / awayRecord | Minnesota Timberwolves · 103 · 41-27 |
homeTeam / homeScore / homeRecord | Oklahoma City Thunder · 116 · 53-15 |
homeWinner / awayWinner | true / false |
status / statusDetail / completed | STATUS_FINAL · Final · true |
venue / venueCity / attendance | Paycom Center · Oklahoma City |
oddsDetails / spread / overUnder | OKC -6.5 · -6.5 · 215.5 |
homeMoneyline / awayMoneyline | -280 / +230 |
broadcasts | ["ESPN"] |
division / round | Men's Singles · Quarterfinal |
setScores | 6-3, 7-6(4) — home player first, tiebreaks in brackets |
homeSets / awaySets | [6,7] / [3,6] |
homeCountry / awayCountry | Italy / Austria |
fieldSize / leaderName / leaderScore | 120 · 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:
| Request | Tournaments | Match rows |
|---|---|---|
atp + wta, today | 6 | 215 |
atp, Wimbledon week 1 | 2 | 735 |
wta, Wimbledon week 1 | 4 | 832 |
atp, a whole month | 8 | 1,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+dateTopulls a historical range in a single run. This is the feature most single-day scrapers don't have.teammatches both full names and abbreviations, soBOSandCelticsboth work.withOddsOnlyis aggressive: odds exist for some leagues only, and usually only near game time. Expect it to filter heavily.maxItemsis your cost ceiling. Set it deliberately.
Pricing
Pay per event — you pay for games returned, not for runtime.
| Event | Price |
|---|---|
| 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.
nullmeans "not published", not "no line exists". - Tennis and MMA have no real home/away side; the two participants are still placed in the
home/awaycolumns so the schema stays identical across leagues, andsetScoresis always written home-player-first. - For tennis,
homeScore/awayScoreare sets won, with the game-by-game detail insetScores,homeSetsandawaySets. A set still in progress can read0-0. - Golf and F1 are a field rather than a pairing, so each returns one row per event carrying
fieldSize,leaderNameandleaderScore(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.