Football Scraper: Live Scores, Results, Lineups & Odds avatar

Football Scraper: Live Scores, Results, Lineups & Odds

Pricing

from $3.00 / 1,000 matches

Go to Apify Store
Football Scraper: Live Scores, Results, Lineups & Odds

Football Scraper: Live Scores, Results, Lineups & Odds

Football (soccer) live scores, results and fixtures for 1,000+ leagues from Flashscore, with optional goals and cards, lineups, match statistics with xG, head-to-head and bookmaker odds from about 30 countries.

Pricing

from $3.00 / 1,000 matches

Rating

0.0

(0)

Developer

Keelwright

Keelwright

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Football Scraper: live scores, results, lineups and odds

Get football (soccer) matches from Flashscore as clean JSON, CSV or Excel: live scores, results and fixtures for 1,000+ competitions in 100+ countries, from the Premier League, LaLiga and the Champions League down to regional and youth leagues. Add goals and cards minute by minute, lineups, match statistics with xG, head-to-head and odds from about 30 countries when you need them.

  • Every match of the day in one request. One run reads the whole daily list (often 1,000+ matches on a weekend), with Flashscore's top leagues listed first.
  • Scores the way football is played. Half-time and second-half scores, the 90-minute score, extra time and penalty shootouts kept apart, red cards, and the team that went through in cup ties.
  • Live minute. For live matches you get the running minute (67', 45+), plus the period.
  • Deep data on request. Goalscorers with assists, cards with reasons, substitutions, formations, starting elevens with player ratings, xG, possession, shots, passes and 30 more statistics.
  • Odds comparison. 1X2, over/under 2.5 and both teams to score from up to 20 bookmakers per country, with opening prices, best and average price and implied probabilities; optionally every market (handicaps, correct score, halves).
  • Only what changed. Run it on a schedule and get only the matches whose score, status or red cards changed since the last run.

What can I use football data for?

  • Live score apps, widgets and bots: feed a website, Discord/Telegram bot or dashboard with scores and minute-by-minute events.
  • Betting models and odds research: collect opening and current prices with xG, statistics, form and results to build and test models.
  • Fantasy, tipping and prediction games: settle picks automatically from final scores, scorers, cards and penalty shootouts.
  • Sports analytics and journalism: lineups, formations, player ratings and team statistics for match reports and scouting.
  • Alerts: get notified (email, Slack, webhook) when your team kicks off, scores or gets a red card.

How to scrape football matches

  1. Click Try for free.
  2. Choose the days: Past days for results, Upcoming days for fixtures, both at 0 for today only.
  3. Optionally narrow down by status (live, finished, scheduled), Top leagues only, competitions, countries or teams.
  4. Tick the extra data you need: goals and cards, statistics, lineups, head-to-head, odds.
  5. Click Start and download the results as JSON, CSV, Excel or HTML, or read them through the API.

Pick competitions the way Flashscore names them: England: Premier League, Spain: LaLiga, Germany: Bundesliga, Europe: Champions League, or paste the competition URL from flashscore.com (for example https://www.flashscore.com/football/england/premier-league/). A name without a country matches that name in every country. If a name fits nothing, the run log suggests the closest names.

Follow live matches: set Match status to Live, turn on Only new or changed matches and schedule the run every 1 to 5 minutes. Each run then returns only the matches whose score, status or red cards changed.

Already know the matches? Paste Flashscore match URLs (or their 8-character ids) into Match URLs or ids. Those rows always include goals, cards, substitutions, round, venue and referee.

Input example

{
"daysAhead": 3,
"competitions": ["England: Premier League", "Spain: LaLiga", "Europe: Champions League"],
"includeLineups": true,
"includeHeadToHead": true,
"includeOdds": true,
"oddsCountries": ["GB"],
"maxItems": 200
}

What data do you get?

Every row is one match.

FieldWhat it holds
matchId, urlFlashscore match id and link
status, statusDetail, resultTypescheduled, live, finished, interrupted, postponed, cancelled or abandoned; the detail (e.g. 2nd Half, After Penalties); regular, extra-time, penalties, walkover or awarded
startTimeKick-off time (ISO 8601, UTC)
competitionName with stage (e.g. Champions League - League phase), country or region, ids and link
home, awayTeam name, three-letter code, Flashscore team id, link and logo
scoreGoals, text score (2-1, 1-1 (4-3 pen.), 3-2 (a.e.t.)), first half, second half, 90 minutes, extra time and penalty shootout
winner, advancedhome, away or draw; in knockout ties, the team that went through
redCardsRed cards per team
liveWhile the match is live: the running minute
noteFlashscore's note, e.g. Postponed due to bad weather or Neutral location
round, referee, venue, attendance, tvChannels, eventsWith Goals, cards and match info: round (e.g. Round 12), referee, stadium with city and capacity, attendance, TV channels, and every goal (with assist and score), penalty, card (with reason), substitution and shootout kick
statisticsWith Match statistics: about 35 statistics for the match and each half, including xG, xGOT, possession, shots, big chances, corners, passes, tackles, duels and saves
lineupsWith Lineups: formation, team rating, coach, starting eleven and substitutes with shirt number, nationality, goalkeeper and captain marks and player rating
headToHeadWith Head-to-head: earlier meetings, each team's last 10 matches with result, and form strings such as WWDLW
oddsWith Bookmaker odds: 1X2 per bookmaker (opening and current) with best, average and implied probability; over/under 2.5 and both teams to score; optionally all markets

Output example

A row from the daily list:

{
"matchId": "2yMLTDQr",
"url": "https://www.flashscore.com/match/football/2yMLTDQr/",
"status": "finished",
"statusDetail": "Finished",
"resultType": "regular",
"startTime": "2026-10-20T16:45:00.000Z",
"competition": {
"name": "Champions League - League phase",
"country": "Europe",
"id": "xGrwqq16",
"seasonId": "tfRdlhP9",
"stageId": "vT1iNRGq",
"url": "https://www.flashscore.com/football/europe/champions-league/"
},
"home": {
"id": "MsbmracL",
"name": "Fenerbahce",
"shortCode": "FEN",
"participantId": "MR1IhODO",
"url": "https://www.flashscore.com/team/fenerbahce/MsbmracL/",
"logoUrl": "https://static.flashscore.com/res/image/data/drRgiLlC-llnQ8REs.png"
},
"away": {
"id": "viXGgnyB",
"name": "Slavia Prague",
"shortCode": "SLA",
"participantId": "CjsSCRbt",
"url": "https://www.flashscore.com/team/slavia-prague/viXGgnyB/",
"logoUrl": "https://static.flashscore.com/res/image/data/nsu4mohT-8nl9JmVC.png"
},
"score": {
"home": 2,
"away": 2,
"text": "2-2",
"firstHalf": {
"home": 2,
"away": 1
},
"secondHalf": {
"home": 0,
"away": 1
},
"regularTime": {
"home": 2,
"away": 2
},
"extraTime": null,
"penalties": null
},
"winner": "draw",
"advanced": null,
"redCards": {
"home": 0,
"away": 0
},
"live": null,
"note": null,
"scrapedAt": "2026-10-21T13:20:44.582Z"
}

The same match with all extra data turned on (lists shortened with "…"):

{
"matchId": "2yMLTDQr",
"url": "https://www.flashscore.com/match/football/2yMLTDQr/",
"status": "finished",
"statusDetail": "Finished",
"resultType": "regular",
"startTime": "2026-10-20T16:45:00.000Z",
"competition": {
"name": "Champions League - League phase",
"country": "Europe",
"id": "xGrwqq16",
"seasonId": "tfRdlhP9",
"stageId": "vT1iNRGq",
"url": "https://www.flashscore.com/football/europe/champions-league/"
},
"round": "Round 3",
"home": {
"id": "MsbmracL",
"name": "Fenerbahce",
"shortCode": "FEN",
"participantId": "MR1IhODO",
"url": "https://www.flashscore.com/team/fenerbahce/MsbmracL/",
"logoUrl": "https://static.flashscore.com/res/image/data/drRgiLlC-llnQ8REs.png"
},
"away": {
"id": "viXGgnyB",
"name": "Slavia Prague",
"shortCode": "SLA",
"participantId": "CjsSCRbt",
"url": "https://www.flashscore.com/team/slavia-prague/viXGgnyB/",
"logoUrl": "https://static.flashscore.com/res/image/data/nsu4mohT-8nl9JmVC.png"
},
"score": {
"home": 2,
"away": 2,
"text": "2-2",
"firstHalf": {
"home": 2,
"away": 1
},
"secondHalf": {
"home": 0,
"away": 1
},
"regularTime": {
"home": 2,
"away": 2
},
"extraTime": null,
"penalties": null
},
"winner": "draw",
"advanced": null,
"redCards": {
"home": 0,
"away": 0
},
"live": null,
"note": null,
"referee": {
"name": "De Burgos R.",
"countryCode": "ESP"
},
"venue": {
"name": "Chobani Stadium Fenerbahce Sukru Saracoglu",
"city": "Istanbul",
"capacity": 47430
},
"attendance": 40124,
"tvChannels": null,
"events": [
{
"period": "1st Half",
"minute": 4,
"addedTime": null,
"minuteText": "4'",
"team": "home",
"type": "goal",
"player": {
"id": "YsDqjj95",
"name": "Aydin O.",
"url": "https://www.flashscore.com/player/aydin-oguz/YsDqjj95/"
},
"assist": {
"id": "EqBuG0nE",
"name": "Skriniar M.",
"url": "https://www.flashscore.com/player/skriniar-milan/EqBuG0nE/"
},
"scoreAfter": "1-0"
},
{
"period": "1st Half",
"minute": 21,
"addedTime": null,
"minuteText": "21'",
"team": "home",
"type": "substitution",
"player": {
"id": "0p2cXdQ4",
"name": "Peprah K.",
"url": "https://www.flashscore.com/player/peprah-kojo/0p2cXdQ4/"
},
"playerOut": {
"id": "6LBvaQoh",
"name": "Ake N.",
"url": "https://www.flashscore.com/player/ake-nathan/6LBvaQoh/"
},
"reason": "Injury"
},
{
"period": "1st Half",
"minute": 31,
"addedTime": null,
"minuteText": "31'",
"team": "home",
"type": "yellow-card",
"player": {
"id": "IkmsHsOR",
"name": "Kante N.",
"url": "https://www.flashscore.com/player/kante-n-golo/IkmsHsOR/"
},
"reason": "Tripping"
},
"…"
],
"statistics": {
"match": {
"expectedGoals": {
"home": 1.07,
"away": 1.49
},
"ballPossession": {
"home": 49,
"away": 51
},
"totalShots": {
"home": 15,
"away": 15
},
"shotsOnTarget": {
"home": 4,
"away": 4
},
"bigChances": {
"home": 2,
"away": 3
},
"cornerKicks": {
"home": 3,
"away": 5
},
"passes": {
"home": {
"percent": 82,
"successful": 341,
"total": 415
},
"away": {
"percent": 83,
"successful": 353,
"total": 425
}
},
"…": "…"
},
"firstHalf": "…",
"secondHalf": "…"
},
"lineups": {
"home": {
"formation": "4-2-3-1",
"rating": 6.7,
"coach": {
"id": "zwnXom20",
"name": "Kartal I.",
"country": "Turkey",
"url": "https://www.flashscore.com/player/kartal-ismail/zwnXom20/"
},
"startingLineup": [
{
"id": "6LBvaQoh",
"name": "Ake N.",
"number": 15,
"country": "Netherlands",
"goalkeeper": false,
"captain": false,
"rating": 6.3,
"url": "https://www.flashscore.com/player/ake-nathan/6LBvaQoh/",
"formationPlace": 4
},
"…"
],
"substitutes": [
{
"id": "27Mq9DwT",
"name": "Cetin T.",
"number": 13,
"country": "Turkey",
"goalkeeper": true,
"captain": false,
"rating": null,
"url": "https://www.flashscore.com/player/cetin-tarik/27Mq9DwT/"
},
"…"
]
},
"away": "…"
},
"headToHead": {
"meetings": [
{
"matchId": "GOf2vGtf",
"date": "2024-11-28T20:00:00.000Z",
"competition": "Europa League",
"country": "Europe",
"home": "Slavia Prague",
"away": "Fenerbahce",
"homeGoals": 1,
"awayGoals": 2,
"score": "1-2",
"winner": "away"
},
"…"
],
"homeRecent": [
{
"matchId": "0Ogw62Yh",
"date": "2026-10-17T16:00:00.000Z",
"competition": "Super Lig",
"country": "Turkey",
"home": "Fenerbahce",
"away": "Alanyaspor",
"homeGoals": 3,
"awayGoals": 0,
"score": "3-0",
"winner": "home",
"result": "win"
},
"…"
],
"awayRecent": ["…"],
"homeForm": "WLWWW",
"awayForm": "DLWWW"
},
"odds": {
"countries": ["GB", "IT"],
"bookmakers": ["bet365", "BetMGM.uk", "Betfred", "…"],
"matchResult": {
"best": {
"home": 1.67,
"draw": 5.3,
"away": 7.5
},
"average": {
"home": 1.407,
"draw": 5.036,
"away": 6.735
},
"impliedProbability": {
"home": 0.6719,
"draw": 0.1877,
"away": 0.1404
},
"bookmakers": 33,
"byBookmaker": [
{
"bookmaker": "bet365",
"home": 1.4,
"draw": 5.25,
"away": 7,
"homeOpening": 1.8,
"drawOpening": 3.7,
"awayOpening": 4.2
},
"…"
]
},
"overUnder25": {
"best": {
"over": 1.57,
"under": 3
},
"average": {
"over": 1.392,
"under": 2.826
},
"impliedProbability": {
"over": 0.67,
"under": 0.33
},
"bookmakers": 32
},
"bothTeamsToScore": {
"best": {
"yes": 1.65,
"no": 2.4
},
"average": {
"yes": 1.572,
"no": 2.28
},
"impliedProbability": {
"yes": 0.5919,
"no": 0.4081
},
"bookmakers": 30
},
"markets": [
{
"market": "asian-handicap",
"period": "first-half",
"bookmaker": "bet365",
"selections": [
{
"selection": "home",
"odds": 1.23,
"opening": 1.45,
"active": true,
"line": 0
},
{
"selection": "away",
"odds": 4,
"opening": 2.68,
"active": true,
"line": 0
},
"…"
]
},
"…"
]
},
"scrapedAt": "2026-10-21T13:20:44.582Z"
}

How much does it cost?

You pay only for the matches you get (pay per event); Apify platform usage is included.

WhatPrice
Match from the daily list$3.00 per 1,000 matches
Match with extra data (any extra-data option, or a match URL)$8.00 per 1,000 matches
Run start$0.05 per 1,000 runs

Examples:

  • All matches in Flashscore's top leagues on a weekend (about 60): about $0.18.
  • Every match of a busy Saturday worldwide (about 2,000): about $6.00.
  • 100 matches with goals, lineups, statistics, head-to-head and odds: about $0.80.

You can cap any run with Max results or with the maximum cost per run in the run options; the run stops cleanly at the limit. Apify's free plan includes $5 of monthly credit, enough for about 1,600 matches from the daily list.

Tips

  • Days are in UTC. Results stay available for 7 days back; fixtures for 7 days ahead.
  • Top leagues first. Rows from Flashscore's top leagues come first, so a small Max results still gives you the big matches.
  • Live matches across midnight. With Live as the only status, matches that started before midnight UTC and are still going are included.
  • Lineups are published about an hour before kick-off; earlier, lineups is null. Statistics are loaded once a match has started.
  • Odds for matches that have started. The current price is the last one the bookmakers listed, which can be an in-play price. For pre-match closing odds, run before kick-off (for example on a schedule with Upcoming days). Opening prices are always included.
  • More bookmakers. The UK has the most bookmakers (about 20). Add Italy, Spain or France to compare more; a bookmaker that appears in several countries is listed once.
  • Coverage of extra data follows Flashscore. Big leagues have everything; lower and youth leagues may lack statistics, lineups or odds. A part that doesn't exist for a match is null.
  • Integrations. Send results to Google Sheets, Slack, Zapier, Make or your own webhook with Apify integrations, or call the Actor through the API.

FAQ

How fresh are live scores? Each run reads Flashscore's live data at that moment, which usually updates within seconds of a goal. Schedule runs as often as every minute.

Can I get older matches? The daily list covers the last 7 days. For older matches, use their Flashscore match URLs.

How are penalty shootouts counted? score.home and score.away are goals (after extra time when it was played) without the shootout. The shootout is in score.penalties, and winner says who won the match.

Do I need a proxy? No. Flashscore answers Apify's servers directly. The proxy option is there in case that changes.

Is it legal to scrape Flashscore? This Actor collects publicly available sports data: scores, statistics, lineups, published odds and the public names of professional athletes. It does not log in or collect private information. Check the source's terms and your local laws for your use case, especially for commercial use.

Something is missing or broken? Open an issue in the Issues tab with the run link, and it will be looked at.

Football Scraper is an independent tool. It is not affiliated with, endorsed by or connected to Flashscore or Livesport s.r.o. Odds are shown for information only.