Skip to content

About

Scrape ice hockey games from Flashscore: fixtures, live scores, final results, period-by-period scores, overtime and shootout outcomes, and match statistics. NHL, KHL, SHL and ever

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

Flashscore Hockey Scraper - Live Scores, Periods & Stats

Ice hockey results from Flashscore as clean JSON: fixtures, live scores, final results, the score in every period, and whether a game was settled in regulation, overtime or a shootout. NHL, KHL, SHL, Liiga and the leagues below them. No login, no API key and no proxy. $0.001 per game.

What data you get

  • Period-by-period scores that reconcile with the final score, asserted on every finished game in the tests.
  • How the game was decided. decidedBy is regulation, overtime or shootout, and regulation carries the score after three periods. This matters more than it sounds: a shootout win adds one goal to the published total that belongs to no period, so a naive sum is off by one on exactly those games. Anything you build on goal totals, from a model to a league table, needs that distinction.
  • Status from Flashscore's own stage codes, so a game in the second period reads as live, with stageDetail naming the stage such as SECOND_PERIOD or AFTER_PENALTIES.
  • Teams and competition with IDs, three-letter codes, logos and the Flashscore URL.
  • raw: all 47 original feed fields.

How to use

  1. Choose the days to fetch (0 for today, -1 for yesterday), then optionally filter countries or competitions.
  2. Run the Actor in matches mode for scores and results, or use matchDetails with match IDs for detailed hockey data.
  3. Open the dataset to review the games, then export JSON, CSV or Excel, or retrieve the results through the API.

Output example

A game decided in a shootout. Note that the periods total 3-3 while the published score is 4-3:

{
  "matchId": "GQSdbs3B",
  "url": "https://www.flashscore.com/match/GQSdbs3B/",
  "sport": "hockey",
  "status": "finished",
  "stage": "finished",
  "stageDetail": "AFTER_PENALTIES",
  "stageCode": 3,
  "stageDetailCode": 11,
  "startTime": "2026-09-04T16:30:00.000Z",
  "lastUpdate": "2026-09-04T18:49:55.000Z",
  "note": null,
  "tournament": {
    "name": "ELJ",
    "fullName": "CZECH REPUBLIC: ELJ",
    "country": "Czech Republic",
    "phase": null,
    "id": "tKYKpUho",
    "stageId": "jNPXsCBq",
    "path": "/hockey/czech-republic/elj/",
    "url": "https://www.flashscore.com/hockey/czech-republic/elj/"
  },
  "home": {
    "name": "Poruba U20",
    "fullName": "Poruba U20",
    "id": "nufW9uwp",
    "slug": "poruba",
    "url": "https://www.flashscore.com/team/poruba/nufW9uwp/",
    "code": "POR",
    "image": "https://static.flashscore.com/res/image/data/lUNc497k-8M2BM1rJ.png"
  },
  "away": {
    "name": "Kladno U20",
    "fullName": "Kladno U20",
    "id": "Khhv8J7d",
    "slug": "kladno",
    "url": "https://www.flashscore.com/team/kladno/Khhv8J7d/",
    "code": "KLA",
    "image": "https://static.flashscore.com/res/image/data/bFkieS7k-GvfgbSG9.png"
  },
  "score": {
    "home": 4,
    "away": 3,
    "periods": [
      {
        "period": "P1",
        "home": 0,
        "away": 0
      },
      {
        "period": "P2",
        "home": 1,
        "away": 3
      },
      {
        "period": "P3",
        "home": 2,
        "away": 0
      },
      {
        "period": "OT",
        "home": 0,
        "away": 0
      }
    ],
    "regulation": {
      "home": 3,
      "away": 3
    },
    "decidedBy": "shootout"
  },
  "winner": "home",
  "inPlay": false,
  "ok": true,
  "dayOffset": -1,
  "scrapedAt": "2026-09-05T19:25:33.348Z"
}

Input

Field Type Default Description
mode string matches matches for fixtures, live scores and results; matchDetails for period scores, statistics and head to head.
days array ["0"] Day offsets from today, from -7 to 7. A North American evening game lands on the following UTC day.
status array all scheduled, live, finished, postponed, cancelled or interrupted.
countries array all For example USA, Canada, Sweden, Finland, Russia.
tournamentFilter string — Case-insensitive regular expression on the competition name, e.g. nhl.
matchIds array — Details mode: match IDs or full flashscore.com/match/... URLs.
details array all three Details mode: summary, statistics, h2h.
maxItems integer 0 Stop after this many rows; 0 means no limit.
maxConcurrency integer 5 Parallel requests in details mode.
timeoutSecs integer 30 Per-request timeout.
proxyConfiguration object off Optional. Not needed in normal use.

Pricing

$0.001 per game, and $0.01 per game in details mode however many sections you request. Games that fail or have no data are free.

Paid Apify plans pay less: 10% off on Bronze, 20% on Silver and 30% on Gold and higher tiers.

Apify also charges a run-start fee of $0.00005 per started GB of allocated memory (minimum one event), including runs that produce no chargeable results.

Use cases

  • Modelling: period-level scoring rates, and overtime and shootout frequency, with the shootout goal kept out of the run of play where it belongs.
  • Live scoreboards and bots: poll for in-progress scores and push updates.
  • Fantasy and prediction games: fixtures in, results out, including the games that go past regulation.
  • Media: daily digests with the period breakdown.
  • AI agents: a tool that answers "which games went to overtime last night".

Integrations

curl -X POST "https://api.apify.com/v2/acts/clearfetch~flashscore-hockey-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"days": ["-1"], "countries": ["USA", "Canada"]}'
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("clearfetch/flashscore-hockey-scraper").call(run_input={"days": ["-1"]})

for game in client.dataset(run["defaultDatasetId"]).iterate_items():
    periods = " ".join(f'{p["period"]} {p["home"]}-{p["away"]}' for p in game["score"]["periods"] or [])
    print(game["home"]["name"], game["score"]["home"], "-", game["score"]["away"],
          game["away"]["name"], f'({game["score"]["decidedBy"]})', periods)

Works with the Apify integrations for n8n, Make, Zapier, Google Sheets, Slack and webhooks, with scheduled runs, and with AI agents through the Apify MCP server.

FAQ

Why do the periods not add up on some games? Because it went to a shootout, and the winner's published total includes the shootout point, which belongs to no period. decidedBy tells you which games those are, and the tests assert the difference is exactly one goal.

Do I need a proxy? No. A proxy input exists for completeness.

Is this legal? It reads the same public endpoints a browser reads, with no login and no personal data. Scores are facts. What you do with the data, including redistribution, is your responsibility.

More tools from clearfetch

Changelog

  • 1.0.1 (2026-09) — match links copied from the browser work in details mode. Flashscore's current links carry the match ID in ?mid=, after team names that were being read as the ID; a link with no ID in it is now skipped with a message saying where to find one.
  • 1.0.0 (2026-09) — first release: games mode with day ranges and filters, period scores with regulation and overtime separated, shootout outcomes identified, details mode with statistics and head to head.

About

Scrape ice hockey games from Flashscore: fixtures, live scores, final results, period-by-period scores, overtime and shootout outcomes, and match statistics. NHL, KHL, SHL and ever

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors