Flashscore Matches Scraper: Scores, Timeline and Odds avatar

Flashscore Matches Scraper: Scores, Timeline and Odds

Pricing

from $0.35 / 1,000 matches

Go to Apify Store
Flashscore Matches Scraper: Scores, Timeline and Odds

Flashscore Matches Scraper: Scores, Timeline and Odds

Scrape Flashscore matches for football, tennis and basketball into one row per match: teams, score, half-time and period scores, status, start time and winner, for any day up to 7 days back or ahead. Add goals, cards and substitutions, and UK bookmaker odds. JSON, CSV or Excel. By MrBridge

Pricing

from $0.35 / 1,000 matches

Rating

0.0

(0)

Developer

MrBridge

MrBridge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Features

Limited permissions

Share

Flashscore Matches Scraper

Flashscore Matches Scraper collects football, tennis and basketball matches from Flashscore (https://www.flashscore.com), one clean row per match, ready for JSON, CSV or Excel. It reads the public match feeds of the site, so no account and no API key are needed. Each row gives the teams or players, the tournament, the start time, the status, the score, the half-time score, the winner and a link to the match page. You can add the timeline of incidents of football matches and the betting odds of each match.

Pick football, keep today as the day and set maxItems to 20: the Actor returns 20 matches with their tournament, kick-off time, status and score. Turn on the timeline to get each goal, card and substitution with its minute and player, or turn on the odds to get the prices that operators listed in the United Kingdom show for the match.

What is Flashscore Matches Scraper?

Flashscore is a live-score website that lists the matches of thousands of tournaments, with scores updated during play. The Actor reads its day feeds for you. It selects sports and days, applies your league filter, removes duplicates and returns one structured row per match. The first 23 columns follow a fixed sports-matches layout, documented below, so the rows are easy to compare with other sources that use the same layout.

What data can I extract with it?

One row per match: source, match ID, match link, sport, country, tournament and its ID, season, round, start time, normalized status and status as Flashscore writes it, elapsed minute of a live match, home and away team with their IDs, score, half-time score, winner and scrape time. Then the Flashscore columns: tournament stage ID, tournament category, tournament link, country ID, score of each period, note, last update time, and the optional timeline and odds.

How can I use the results?

  • Build a results archive of the leagues you follow, one day at a time.
  • Feed a dashboard or a newsletter with today's fixtures and yesterday's scores.
  • Study how often home teams win in a tournament, using the winner and half-time columns.
  • Track the goals, cards and substitutions of finished football matches.
  • Compare the odds shown by several operators for the same match, as information for your own analysis.

How to use it

  1. Open the Actor in Apify Console.
  2. Pick the sports and the days, and add leagues if you want to narrow the list.
  3. Set maxItems, then start the run. Rows appear in the dataset as they are delivered.

Input

FieldMeaningDefault
sportsfootball, tennis, basketball. At least one["football"]
dateOffsetsDays from today (UTC): 0 is today, -1 yesterday, 1 tomorrow. Integers from -7 to 7[0]
datesCalendar days as YYYY-MM-DD, within 7 days of today (UTC). Added to dateOffsetsempty
leaguesKeep only these tournaments, up to 100. Empty keeps all (see the four forms below)empty
maxItemsHard cap on match rows returned and billed, 1 to 10000100
includeTimelineAdd the timeline of incidents of football matchesfalse
includeOddsAdd the betting odds of each matchfalse
oddsMarketsMarkets kept in odds. At least one. ALL keeps every marketHOME_DRAW_AWAY, HOME_AWAY, OVER_UNDER, BOTH_TEAMS_TO_SCORE, DOUBLE_CHANCE

The Console form pre-fills sports with football, dateOffsets with 0 and maxItems with 20. Example input:

{
"sports": [
"football"
],
"dateOffsets": [
0
],
"maxItems": 20
}

leagues is a local filter on the matches read. Case is ignored and a match is kept when it fits any entry. Each entry takes one of four forms:

  • the full header as Flashscore shows it, for example ALGERIA: Ligue 2
  • the tournament ID, for example MJijSTCe
  • the tournament path, with or without the slashes, for example /football/algeria/ligue-2/ or football/algeria/ligue-2
  • the tournament path without the sport, for example algeria/ligue-2

oddsMarkets accepts HOME_DRAW_AWAY, HOME_AWAY, OVER_UNDER, BOTH_TEAMS_TO_SCORE, DOUBLE_CHANCE, DRAW_NO_BET, ODD_OR_EVEN, CORRECT_SCORE, HALF_FULL_TIME, ASIAN_HANDICAP, EUROPEAN_HANDICAP and ALL. It is used only when includeOdds is on. The default keeps the rows light, because one full answer can hold more than 1 700 odds and most of them are correct scores.

Invalid input ends the run successfully with one BAD_INPUT row in the errors dataset that lists every problem, and no match row.

Output

Matches go to the default dataset, one row per match. Problems go to a separate errors dataset and are never billed. The OUTPUT record of the key-value store summarizes the run. The dataset has three views: overview, timeline and odds.

The first 23 columns are the common layout, in this order:

FieldTypeMeaning
sourcestringAlways Flashscore
matchIdstringFlashscore match ID, the key of the row
urlstring or nullFlashscore page of the match
sportstringfootball, tennis or basketball
countrystring or nullCountry or region of the tournament
tournamentstring or nullTournament name
tournamentIdstring or nullFlashscore tournament ID
seasonnullNull for rows of the day feed
roundnullNull for rows of the day feed
startTimestring or nullISO 8601 in UTC
statusstringscheduled, live, finished, postponed, cancelled, abandoned, interrupted or unknown
statusRawstring or nullThe status as Flashscore writes it
minutenullNull for rows of the day feed
homeTeam, awayTeamstring or nullTeam, or player in tennis
homeTeamId, awayTeamIdstring or nullFlashscore IDs
homeScore, awayScoreinteger or nullFinal or current score
homeScoreHalfTime, awayScoreHalfTimeinteger or nullHalf-time score
winnerstring or nullhome, away or draw for a finished match
scrapedAtstringTime the row was built, ISO 8601 in UTC

Then the Flashscore columns:

FieldTypeMeaning
tournamentStageIdstring or nullFlashscore ID of the tournament stage
tournamentCategorystring or nullCategory of the tournament, such as the tennis tour or the country group
tournamentUrlstring or nullFlashscore page of the tournament
countryIdstring or nullFlashscore ID of the country or category group
periodScoresarrayScore of each period (half, set or quarter), objects { period, home, away }. [] when absent
notestring or nullNote of Flashscore on the match, for example a disqualification
updatedAtstring or nullLast update of the match on Flashscore, ISO 8601 in UTC
timelinearray or nullIncidents of a football match, see below
oddsarray or nullBetting odds, see below

Every field is always present, with null when Flashscore gives no value, and [] for periodScores when absent.

This is one real row from the example input above, built by the Actor from stored Flashscore responses:

{
"source": "Flashscore",
"matchId": "K0CceoUN",
"url": "https://www.flashscore.com/match/K0CceoUN/",
"sport": "football",
"country": "Algeria",
"tournament": "Ligue 2",
"tournamentId": "MJijSTCe",
"season": null,
"round": null,
"startTime": "2026-11-06T14:00:00.000Z",
"status": "finished",
"statusRaw": "Finished",
"minute": null,
"homeTeam": "Azazga",
"homeTeamId": "p8oVs3AG",
"awayTeam": "MSP Batna",
"awayTeamId": "21SPlgRt",
"homeScore": 3,
"awayScore": 2,
"homeScoreHalfTime": 1,
"awayScoreHalfTime": 1,
"winner": "home",
"scrapedAt": "2026-11-07T12:00:00.000Z",
"tournamentStageId": "dtbtP8nA",
"tournamentCategory": "Algeria",
"tournamentUrl": "https://www.flashscore.com/football/algeria/ligue-2/",
"countryId": "18",
"periodScores": [
{
"period": 1,
"home": 1,
"away": 1
},
{
"period": 2,
"home": 2,
"away": 1
}
],
"note": null,
"updatedAt": "2026-11-06T15:57:32.000Z",
"timeline": null,
"odds": null
}

The example comes from a test fixture captured on 2026-11-06, so the scores and statuses are those of that day.

Timeline

Set includeTimeline to true to fill timeline for football matches that have started. Each element is one incident:

FieldMeaning
idIncident ID
periodPeriod name, for example 1st Half
sidehome or away
minute, addedTime, minuteTextMinute, added time and the minute as Flashscore shows it
type, typeCodeIncident type, such as Goal, Yellow Card or Substitution - Out, and its code
player, playerId, playerUrlThe player concerned
reasonReason, when Flashscore gives one
homeScore, awayScoreScore after the incident, when it applies
relatedLinked players, such as the assist of a goal or the player coming on
{
"id": "vBqDdB2c",
"period": "1st Half",
"side": "home",
"minute": 43,
"addedTime": null,
"minuteText": "43'",
"type": "Goal",
"typeCode": 3,
"player": "Orsini N.",
"playerId": "UyqTS9An",
"playerUrl": "https://www.flashscore.com/player/orsini-nicolas/UyqTS9An/",
"reason": null,
"homeScore": 1,
"awayScore": 0,
"related": [
{
"type": "Assistance",
"player": "Bogarin R.",
"playerId": "tpCGHIpe",
"playerUrl": "https://www.flashscore.com/player/bogarin-rodrigo/tpCGHIpe/"
}
]
}
  • timeline is [] for a football match that is scheduled, postponed or cancelled, and no request is made for it.
  • timeline is null when you did not ask for it, for tennis and basketball rows, and when the summary of the match could not be read.

Odds

Set includeOdds to true to fill odds for every match that is not cancelled, postponed or abandoned. Each element is one price of one operator:

FieldMeaning
bookmakerId, bookmakerOperator ID and name. The name is null when Flashscore does not list it
marketMarket, such as HOME_DRAW_AWAY or OVER_UNDER
scopePart of the match the price covers, such as FULL_TIME or FIRST_HALF
outcomehome, draw or away for the result markets, home_or_draw, draw_or_away or home_or_away for double chance. Null for the other markets
participanthome or away when the price belongs to one side
selectionThe selection of the market, for example OVER for an over/under price
handicapThe line, as a number, for handicap and over/under markets
winnerRaw text of the source for a half-time/full-time price, for example 1/1
score, bothTeamsToScoreSet for correct score and both-teams-to-score prices
odds, openingOddsCurrent and opening decimal odds. openingOdds is null when there is no opening price
activeWhether the price is still open
{
"bookmakerId": 14,
"bookmaker": "10bet",
"market": "HOME_DRAW_AWAY",
"scope": "FIRST_HALF",
"outcome": "home",
"participant": "home",
"selection": null,
"handicap": null,
"winner": null,
"score": null,
"bothTeamsToScore": null,
"odds": 3.95,
"openingOdds": 3.2,
"active": false
}
  • odds is [] when no price was kept by your oddsMarkets choice, or when no operator shows a price.
  • odds is null when you did not ask for it, for a cancelled, postponed or abandoned match, and when the odds could not be read.
  • Operators without prices give nothing and bonus offers are never returned.

Billing

One match event is billed per delivered row. One match-timeline event is billed on top for a row delivered with a non-empty timeline, and one match-odds event for a row delivered with at least one odds element. Errors, duplicates, filtered-out matches, empty timelines and empty odds are never billed. The Pricing tab of the Actor shows the current prices.

When the platform moves a run to another server or restarts it while it works, the run picks up where it was. A match already returned is neither returned nor billed again.

Limits

  • season, round and minute are null for the rows of the day feed.
  • The day is the day of Flashscore. The feed covers 7 days before to 7 days after today (UTC). dates are added to dateOffsets, so today is part of the selection only when dateOffsets holds 0, which the Console form pre-fills.
  • A match close to midnight can appear in two day feeds. It is returned once.
  • The timeline exists for football only. Tennis and basketball rows keep timeline null.
  • Odds are seen from the United Kingdom: the operators and markets are those shown there. Finished matches carry closing odds. Basketball matches often have no odds.
  • oddsMarkets needs at least one market when includeOdds is on.
  • If the day feed answers 401, the run records a TARGET_BLOCKED row with httpStatus 401, which means the feed signature was refused.
  • If the host of the odds or the summary host refuses three requests in a row, only that option stops. The rows already read are kept, the option stays null for the rest of the run, and oddsStoppedBy or timelineStoppedBy says blocked in the OUTPUT record.
  • A run with both options sends about two more requests per match than a run without them, so it lasts longer. For large runs, raise the run timeout.
  • Each run is a snapshot of Flashscore at that moment. Scores and odds move, so two runs a minute apart can differ.

Run summary and early stops

The OUTPUT record counts requests, pages, matches, errors and the add-ons: timelinesEmitted, timelinesCharged, timelineRequests, oddsEmitted, oddsCharged and oddsRequests. extraByEvent gives the emitted and charged count of each add-on event.

stoppedBy says why a run ended early. It keeps the first reason only.

  • null: all the requested work was done.
  • maxItems: the maxItems cap was reached.
  • chargeLimit: the maximum charge set for the run was reached.
  • deadline: the run reached its internal time limit.
  • circuitOpen: too many blocked responses in a row.
  • pageBudget: the request budget of the run was spent.
  • badInput: reserved value of the run summary. This Actor never sets it, because Flashscore answers are sorted into blocked, rate limited, not found or failed. An input the Actor cannot use is reported before any request, as a single BAD_INPUT row in the errors dataset, and stoppedBy stays null.
  • fetchFailed: the last walk ended on a page that could not be fetched. failedWalks lists the first 20 failed walks.

Every business error is written to the errors dataset with a kind: BAD_INPUT, TARGET_BLOCKED, RATE_LIMITED, FETCH_FAILED, UPSTREAM_ERROR, SCHEMA_CHANGED, LISTING_INVALID or NOT_FOUND. The OUTPUT record counts errors in errorsByKind.

Frequently asked questions

Why do I get fewer matches than maxItems?

The days and sports you chose hold fewer matches than the cap, or your leagues narrow the list. When Flashscore has no more matching matches, the run ends with stoppedBy set to null.

Why is odds empty on some rows?

Basketball matches often have no odds from the operators listed in the United Kingdom, and a cancelled, postponed or abandoned match gets no odds request. Check odds for null (not obtained) and [] (nothing kept).

Is there a similar Actor for another site?

Yes, SofaScore Sports Scraper returns the same 23 first columns, so rows from both sources fit in one table. SofaScore adds the venue, the referee, the managers and the line-ups, but no odds. Both return a football timeline, only this Actor returns odds.

Can I use Flashscore Matches Scraper via MCP?

Yes. Any Apify Actor can be called from an MCP client through the Apify MCP server. See the Apify MCP documentation for the setup.

Your feedback

We are always working on improving our Actors. If you have technical feedback for Flashscore Matches Scraper or found a bug, please create an issue on the Actor's Issues tab.

More free tools, scrapers, MCP servers and data studies from the same team: mr-bridge.com.

The data comes from the public pages of Flashscore (https://www.flashscore.com) and belongs to its owners. Flashscore has its own terms of use, and it may restrict automated access or commercial reuse. Odds are given as information and are not betting advice. Before you rely on the output, in particular for commercial use, confirm that your use is permitted by the terms that apply. You remain responsible for how you use the results and for complying with the source's terms and with the laws that apply to you.