Sports API - Live Scores, Stats & Odds (Soccer, NBA, NHL, NFL)
Pricing
from $0.10 / 1,000 results
Sports API - Live Scores, Stats & Odds (Soccer, NBA, NHL, NFL)
Live scores, results and fixtures for soccer, basketball, hockey, American football, baseball, handball and volleyball: statistics, goals and cards, lineups, odds from every bookmaker, head-to-head, league tables and team schedules. Ask by date, league or team; no ids needed.
Pricing
from $0.10 / 1,000 results
Rating
0.0
(0)
Developer
Akhil rajesh
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
Get live scores, results, fixtures and league tables for soccer (football), basketball, ice hockey, American football, baseball, handball and volleyball as clean JSON. Each match can come with statistics, goals and cards, lineups, injured players, odds from every bookmaker with the opening price, and head-to-head. Ask in plain terms, such as a date, a league ("Premier League", "NBA", "NHL") or a team ("Arsenal", "Lakers"). You don't need to look up or copy any ids.
- Every match of a day, for several sports in one run. Live, finished and scheduled matches, 7 days back or forward. The best-known competitions come first: the World Cup, the Champions League, the big five leagues, MLS, the NBA, EuroLeague, the NHL, KHL, NFL and MLB. A small Max results keeps the matches that matter most.
- Soccer stats and match details in the same row. Expected goals (xG), possession, shots, passes, corners and saves, for the match and each half. Goals with scorers and assists, cards and substitutions. Formations, lineups with player ratings, and missing players.
- Basketball, hockey, NFL and MLB box-score data. Shooting percentages, rebounds and assists; shots on goal, power plays and faceoffs; yards and first downs; hits, errors and home runs. Quarter, period and inning scores.
- Odds that show how the market moved. Every bookmaker's price with its opening price, the average and the best: 1X2 in soccer, handball and hockey, the money line elsewhere. For finished matches that's the closing price. Turn on All odds markets for over/under, both teams to score, handicaps and correct score.
- League tables. Overall, home, away and form tables, with conferences, divisions and groups, points, goal difference, form and the zone each place leads to.
- Seasons and teams. Every result and fixture of a league or cup season, older seasons included, and any team's latest results and next fixtures.
- Only what changed. On a schedule, output only new matches and matches whose score, status, red cards or odds moved.
No login, no API key and no proxy is needed. Runs are fast: a day's first 100 matches take about 2 seconds, 100 matches with every detail about 30 seconds, a whole Premier League season (380 matches) about 5 seconds.
What you get for each match
| Field | Example |
|---|---|
sport, country, competition | soccer, England, Premier League |
round | Round 7, Quarter-finals (in Competitions and Teams modes, and for match links) |
homeTeam, awayTeam, logos and links | France, Belgium |
status, statusDetail | finished, live ("2nd Half", "3rd Quarter", "Half Time", "Break Time"), postponed, cancelled... |
homeScore, awayScore, score | 4, 1, "4-1"; "1-1 (3-5 pen.)", "2-1 AET", "3-2 OT", "4-3 (1-0 SO)" |
periods | each half, quarter, period, inning or set: {"period": "1st Half", "home": 0, "away": 1}, extra time and shoot-outs last |
regularTimeHome, extraTimeHome, shootoutHome | the score after 90 minutes (what 1X2 bets settle on), after extra time, and the shoot-out |
redCardsHome, advancing, note | soccer red cards; which side goes through a knockout tie; "First leg result: 1-1. Aggregate: 1-6." |
hitsHome, errorsHome, homePitcher | baseball hits, errors and the pitchers of record |
referee, venue, city, attendance | Walsh N., Stade de France, Paris - Saint-Denis, 75389 |
possessionHome, shotsHome, expectedGoalsHome, reboundsHome, shotsOnGoalHome, totalYardsHome... | each sport's main statistics as columns; statistics lists them all, for the match and each period |
events | goals (scorer, assists, score after), cards and reasons, substitutions, hockey penalties, touchdowns and field goals, shoot-out attempts |
lineups, homeFormation, missingPlayers | starting players and substitutes with numbers, captains, goalkeepers and ratings; coaches; injured and suspended players |
oddsHome, oddsDraw, oddsAway, oddsOpeningHome, oddsBestHome, oddsBookmakers, odds | 1.494 (average), 1.506 (opening), 1.55 (best), 20 bookmakers, each bookmaker's price |
headToHead, homeForm, awayForm | earlier meetings with wins and draws; each team's last 10 results before the match, such as DWWLLWWWWW (newest first) |
Standings rows have rank, team, played, wins, draws, losses, scoredFor, scoredAgainst, scoreDifference, points, winningPercentage, form and zone, with groupLevel and group for conferences, divisions and groups. Hockey tables add overtime and shootout wins and losses. Team rows have the team's form, wins, draws and losses, and its next match.
How to use it
Pick what to get under What to get and the Sports, then fill in the section for it. Every field has a sensible default.
Live scores and results by day
{ "mode": "matches", "sports": ["soccer", "basketball", "hockey"], "date": "yesterday", "includeStatistics": true, "includeOdds": true }
date accepts today, yesterday, tomorrow or a date like 2026-10-05 (UTC), up to 7 days back or forward. days reads several days at once. Filter by status (live, finished, scheduled), competitions or teams. To follow live scores, use "status": ["live"]. It reads what's being played now, including matches that began before midnight UTC.
A weekend day can have more than 1,000 soccer matches (1,007 on Sunday 2026-10-04), so raise maxResults (100 by default) to get them all. When there are more matches than maxResults, it is shared among the sports, and each sport's best-known competitions come first, then live matches, then the rest by start time.
One league, one country, one team
{ "mode": "matches", "sports": ["soccer"], "date": "today", "days": 3, "competitions": ["Premier League", "Champions League"] }
Write a competition as Flashscore names it ("LaLiga", "Serie A", "NBA", "NHL", "EuroLeague"). Add the country when the name exists in several countries ("England: Championship", "Brazil: Serie A"), or give a country alone ("Spain") for all its competitions. "Premier League" means England's. teams keeps the matches of the teams you name. A team name never matches the women's, youth or reserve side unless you write it ("Arsenal W", "Real Madrid B").
Exact matches by link
{ "mode": "matches", "matchUrls": ["https://www.flashscore.com/match/EmmmJQ3L/"], "includeStatistics": true, "includeEvents": true, "includeLineups": true }
Links work for live and upcoming matches as well as finished ones, of any date.
Every match of a season
{ "mode": "competitions", "competitions": ["Premier League"], "seasons": ["2024/2025"], "teams": ["Arsenal"], "maxResults": 100 }
Leave seasons empty for the current season, with all its fixtures still to come. The latest results come first, then the next fixtures. "status": ["finished"] keeps results only, ["scheduled"] fixtures only. Seasons are written 2024/2025, or 2025 for leagues played within one year (MLS, MLB, NPB). A link to one season (…/premier-league-2024-2025/) reads that season.
League tables
{ "mode": "standings", "sports": ["soccer", "basketball", "hockey"], "competitions": ["Premier League", "NBA", "NHL"], "standingsTables": ["overall", "home", "away"] }
The NBA and NHL give their conference and division tables, and a cup's group stage gives each group. Max results counts rows per table and never cuts a conference, division or group short.
A team's results and fixtures
{ "mode": "teams", "sports": ["soccer", "basketball"], "teams": ["Real Madrid", "Los Angeles Lakers"], "maxMatchesPerTeam": 20, "includeStatistics": true }
You get a row for each team (form, wins, draws, losses, next opponent), then its latest results and next fixtures, half of each.
Match details and coverage
Turn on what you need; each detail is fetched only when asked for. Coverage measured on a Sunday's first matches in each sport (2026-10-04):
| Sport | Statistics | Events | Lineups | Odds |
|---|---|---|---|---|
| Soccer (150 matches, top leagues and lower ones) | 59% | 79% | 45% | 82% |
| Basketball (60) | 95% | none in this sport | 97% | 95% |
| Ice hockey (60) | 95% | 95% | 95% | 93% |
| American football (30) | 50% | 100% | none | 100% |
| Baseball (30) | 67% | none in this sport | 70% | 93% |
| Handball and volleyball (30 each) | none | none | rare | 17-43% |
Top competitions have every detail. Lower leagues, youth and women's football have fewer. Head-to-head and form are there for nearly every match. Every row has the score and each period's score.
Only new or changed matches, on a schedule
Turn on Only new or changed matches and schedule the run, for example every 5 minutes for live scores, or every morning for yesterday's results. Each run then outputs only matches that are new since the last run of the same search, or whose status, score, period scores or red cards changed, or whose average odds moved by 5% or more since they were last output (odds that fail to load are no change). Each row is marked changeType: "new" or "updated", and unchanged matches are neither output nor charged. When you follow live matches this way, a match that has ended since the last run is delivered once more with its final score, and a match whose details didn't all load comes again once they do. In Teams mode a team's row comes again only when its form, record or next match changed. Max results caps what each run outputs, shared among the sports or competitions; on a busy day the rest come in the following runs. Each search keeps its own history automatically. Give several schedules the same History name to share one; runs that overlap keep each other's entries.
Use it as a sports API or from AI agents
Call it from your own code like any Apify Actor. This call waits for the run and returns the rows directly:
curl -X POST "https://api.apify.com/v2/acts/akhil_rajesh~sports-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{ "mode": "matches", "sports": ["soccer", "basketball"], "status": ["live"], "includeOdds": true }'
Through the Apify MCP server, assistants such as Claude, ChatGPT and Cursor can run this Actor as a tool. Add https://mcp.apify.com?tools=akhil_rajesh/sports-scraper as an MCP server, then ask in plain words, for example "what's the Premier League table, and who plays this weekend?" or "show tonight's NBA games with the odds". Every input is plain text, such as names, dates or "live", so an agent never has to look up ids.
Sample output
A finished match with every detail (lists shortened):
{"recordType": "match","sport": "soccer","matchId": "EmmmJQ3L","matchUrl": "https://www.flashscore.com/match/EmmmJQ3L/","country": "Europe","competition": "UEFA Nations League - League A","startTime": "2026-10-05T18:45:00Z","status": "finished","statusDetail": "Finished","homeTeam": "France","awayTeam": "Belgium","homeScore": 4,"awayScore": 1,"score": "4-1","winner": "home","periods": [{"period": "1st Half", "home": 0, "away": 1}, {"period": "2nd Half", "home": 4, "away": 0}],"referee": "Walsh N.","venue": "Stade de France","attendance": 75389,"expectedGoalsHome": 1.96, "expectedGoalsAway": 0.59,"possessionHome": 66, "possessionAway": 34,"shotsHome": 23, "shotsAway": 5,"cornersHome": 9, "cornersAway": 2,"statistics": [{"period": "Match", "group": "Top stats", "name": "Expected goals (xG)", "home": "1.96", "away": "0.59", "homeValue": 1.96, "awayValue": 0.59}],"events": [{"period": "1st Half", "time": "35'", "team": "away", "type": "Goal", "player": "Lukebakio D.", "assist": "Lavia R.", "scoreHome": 0, "scoreAway": 1},{"period": "2nd Half", "time": "57'", "team": "away", "type": "Yellow Card", "player": "Lavia R.", "detail": "Tripping, misses next match"}],"homeFormation": "1-4-3-3","lineups": {"home": {"formation": "1-4-3-3", "rating": 7.2, "players": [{"name": "Akliouche M.", "number": 18, "starter": true, "rating": 7.2}], "coaches": [{"name": "Zidane Z."}]}},"missingPlayers": [{"team": "away", "player": "Courtois T.", "reason": "Rest", "club": "Real Madrid"}],"oddsMarket": "HOME_DRAW_AWAY","oddsHome": 1.494, "oddsDraw": 4.497, "oddsAway": 5.598,"oddsOpeningHome": 1.506, "oddsBestHome": 1.55, "oddsBookmakers": 20,"headToHead": {"homeWins": 14, "draws": 6, "awayWins": 5, "meetings": [{"date": "2026-09-28T18:45:00Z", "home": "Belgium", "away": "France", "winner": "away", "score": "0-1"}]},"homeForm": "DWWLLWWWWW","awayForm": "WLWLWWWDDW"}
You can download the dataset as JSON, CSV, Excel or HTML. The Output tab has ready-made tables for matches, match details, odds, standings and teams.
How much does it cost to scrape sports data?
This Actor uses pay-per-event pricing, and platform usage is included, so there's nothing else to pay. You pay for each row returned, plus $0.001 each time a run starts. A match that comes with details costs $0.002 more, whatever your plan. That one price covers statistics, events, lineups, odds and head-to-head together. The price per row depends on your Apify plan:
| Your plan | Per 1,000 rows | Per 1,000 matches with details |
|---|---|---|
| Free | $0.25 | $2.25 |
| Starter | $0.20 | $2.20 |
| Scale | $0.15 | $2.15 |
| Business and above | $0.10 | $2.10 |
| Run | Rows | On Free | On Business |
|---|---|---|---|
| Today's first 100 soccer matches, scores only (the default input) | 100 | $0.026 | $0.011 |
| 20 matches of three sports with statistics and odds (the example input) | 20 | $0.046 | $0.043 |
| 100 soccer matches with every detail | 100 | $0.226 | $0.211 |
| A whole Premier League season, results and fixtures | 380 | $0.096 | $0.039 |
| Five league tables (Premier League, LaLiga, NBA, NHL, NFL) | 228 | $0.058 | $0.024 |
Matches your filters leave out, and unchanged matches when Only new or changed matches is on, are not charged. To cap spending, set Max results or a maximum cost per run in the run options; the Actor stops cleanly at the limit.
Input
| Field | Default | What it does |
|---|---|---|
mode | matches | matches, competitions, standings or teams |
sports | soccer | soccer, basketball, hockey, american-football, baseball, handball, volleyball |
date | today | Matches mode: today, yesterday, tomorrow or YYYY-MM-DD (UTC), up to 7 days away |
days | 1 | Matches mode: how many days from date |
status | all | live, finished, scheduled |
competitions | none | Names, Country: Name, countries or Flashscore links: a filter in Matches mode, what to read in Competitions and Standings modes |
teams | none | Names or Flashscore team links: a filter in Matches and Competitions modes, the teams to read in Teams mode |
matchUrls | none | Exact matches by Flashscore link or 8-character id |
includeStatistics | off | Statistics for the match and each period |
includeEvents | off | Goals, cards, substitutions, penalties, touchdowns... |
includeLineups | off | Formations, lineups, coaches and missing players |
includeOdds | off | Match-winner odds from every bookmaker, with opening prices |
includeAllOddsMarkets | off | Also over/under, both teams to score, double chance, handicaps, correct score... |
includeHeadToHead | off | Earlier meetings and each team's last 10 matches |
seasons | current | Competitions and Standings modes: 2024/2025 or 2025 |
standingsTables | overall | Standings mode: overall, home, away, form |
maxMatchesPerTeam | 20 | Teams mode: latest results and next fixtures per team |
onlyChanges | off | Only matches that are new or changed since the last run of the same search |
historyName | automatic | The store that remembers earlier runs |
maxResults | 100 | Most matches to return (rows per table in Standings mode, whole groups), shared among sports, competitions or teams |
proxy | none | Optional; not needed |
FAQ
Where does the data come from? Flashscore's public data feeds for scores, statistics, events, lineups, head-to-head, standings and season results, and Flashscore's odds comparison for odds.
How live is "live"? Each run reads the scores as they stand at that moment. Flashscore serves its day lists from a cache up to five minutes old, so the run applies the site's own live update feeds on top, as the site does: in a check of 41 live matches, every score and status then matched the match's own up-to-the-second feed, against 23 from the list alone. For a running feed, schedule the Actor every few minutes with Only new or changed matches on.
Which sports and leagues are covered? Seven sports, with every competition Flashscore lists in them, worldwide: one Sunday in October 2026 had 1,007 soccer matches in 287 competitions, from the Nations League to regional leagues. Tennis has its own Actor, the Tennis API.
Why is a score "1-1 (3-5 pen.)" and not 1-2? A penalty shoot-out isn't added to the score in soccer and handball; it's in shootoutHome and shootoutAway, and winner names the side that won it. Hockey writes a shootout win as a goal, as the NHL does: 3-3 and a won shootout is 4-3.
What are regularTimeHome and regularTimeAway? The score at the end of regular time (90 minutes in soccer, 60 in hockey, four quarters), before extra time or overtime. 1X2 bets settle on it.
Why do some matches have no statistics or lineups? Lower leagues, youth and many women's competitions aren't covered with them, and basketball, baseball, handball and volleyball have no event list. Their scores, period scores, odds and head-to-head are still there. The coverage table above has the figures.
What does "home" mean at a neutral ground? "Home" and "away" are the two sides as the site lists them; note says when the ground was neutral.
Can I get older seasons? Yes, through Competitions mode with seasons. Matches by date reach 7 days back.
What if Flashscore doesn't answer? Each request is tried four times. A run that couldn't load anything you asked for fails, says what didn't load and why (for example HTTP 503), and charges nothing for the missing data, so run it again a few minutes later. When only part of it didn't load, you get the rest, and the status message names what to run again. "Not found" always means Flashscore answered and has no such competition, team or match.
How are competition and team names matched? With the site's search: the same name first (spaces and case aside, so La Liga is LaLiga), then a name that holds every word you typed (Libertadores is the Copa Libertadores, and one letter off is forgiven). The run says which it read. A name the search doesn't know is "Not found", never swapped for the search's best-known suggestion. A name that exists only in a sport you didn't choose (NBA with only soccer chosen) is read anyway, and the run says so.
Other Actors by this developer
- Tennis API - Live Scores, Stats & Odds (ATP, WTA, ITF): tennis scores, statistics, point-by-point, odds and rankings
- Google Hotels Scraper - Hotel Price Tracker & Comparison: hotel prices from Google Hotels, with booking-site rates and price tracking
- SEEK, JobStreet & JobsDB Jobs Scraper: jobs in Australia, New Zealand and six Asian markets
- Indeed Jobs Scraper - Canada, US, UK, Australia & More: job listings from Indeed in eight countries
- Price Tracker Canada - Best Buy, Walmart, Canada Computers: live price comparison across major Canadian retailers
Disclaimer
This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Flashscore, any league or any team. It reads publicly available data at a modest pace. Use the data in line with the source's terms and the laws that apply to you.