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.
- Period-by-period scores that reconcile with the final score, asserted on every finished game in the tests.
- How the game was decided.
decidedByisregulation,overtimeorshootout, andregulationcarries 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
stageDetailnaming the stage such asSECOND_PERIODorAFTER_PENALTIES. - Teams and competition with IDs, three-letter codes, logos and the Flashscore URL.
raw: all 47 original feed fields.
- Choose the days to fetch (
0for today,-1for yesterday), then optionally filter countries or competitions. - Run the Actor in matches mode for scores and results, or use matchDetails with match IDs for detailed hockey data.
- Open the dataset to review the games, then export JSON, CSV or Excel, or retrieve the results through the API.
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"
}| 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. |
$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.
- 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".
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.
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.
- Flashscore Football Scraper: fixtures, live scores and results from every league
- Flashscore Tennis Scraper: ATP, WTA and Challenger matches with point by point
- Flashscore Basketball Scraper: NBA, EuroLeague and every league, by quarter
- Flashscore Baseball Scraper: MLB, NPB and KBO with inning-by-inning line scores
- 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.