Hockey League Scraper — SHL, AHL, DEL & 15 more
Under maintenancePricing
Pay per usage
Hockey League Scraper — SHL, AHL, DEL & 15 more
Under maintenanceScrape standings, schedules and player stats from 18 hockey leagues across Europe and North America. Writes clean JSON/CSV to your own S3 or Cloudflare R2. Built by The Hockey Brain (https://www.thehockeybrain.com) for scheduled production use.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
The Hockey Brain
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
European + North American Hockey League Scraper
Production-ready multi-league hockey data Actor from The Hockey Brain.
Scrapes standings, schedules, player/goalie stats, and game results from 18 professional hockey leagues, then writes bronze JSON/CSV to S3-compatible storage (Cloudflare R2, AWS S3, Hetzner Object Storage, MinIO, …).
Features
- One Actor, many leagues — select
sourcein input - Daily incremental modes (
update/both) plustest/fullwhere supported - Playwright where needed (e.g. Metal Ligaen); HTTP/API for HockeyTech, SIHF, CSV portals
- Designed for schedules (cron) — no interactive UI required
- Storage via standard S3 env vars (easy R2 / AWS cutover)
Supported leagues (source)
source | League | Region | Typical stack |
|---|---|---|---|
met | Metal Ligaen | Denmark | Playwright |
shl | SHL | Sweden | HTTP / CSV |
ha | HockeyAllsvenskan | Sweden | HTTP / CSV |
sdhl | SDHL | Sweden | HTTP |
sui | National League | Switzerland | SIHF API |
elh | Tipsport Extraliga | Czechia | HTTP |
ahl | AHL | North America | HockeyTech API |
echl | ECHL | North America | HockeyTech API |
del | PENNY DEL | Germany | HTTP / API |
del2 | DEL2 | Germany | HTTP / API |
skl | Tipsport / Maxa | Slovakia | HTTP |
magnus | Ligue Magnus | France | HTTP |
eihl | EIHL | UK | HTTP |
phl | TAURON PHL | Poland | HTTP |
ice | ICE HL | Austria | hockeydata |
erste | Alps / Erste | AT/AT/IT | hockeydata |
swehockey | stats.swehockey.se | Sweden | date checkpoint + game_id set in R2 |
nhl | NHL API | North America | catch-up from last by_date in R2 |
Not in this Actor (yet): Elite Prospects full scrape (
ep), Norwegian EHL bulk — separate Actors / internal jobs.
Input
{"source": "shl","mode": "update","runPipeline": false}
| Field | Type | Default | Description |
|---|---|---|---|
source | enum | met | League id (table above) |
mode | enum | update | update, both, test, full, daily, full-all |
runPipeline | boolean | true | Run MotherDuck load after scrape when a pipeline exists |
For Store / SaaS buyers, set runPipeline: false and read only from your own S3/R2 — MotherDuck is optional.
Authentication & storage (Actor environment)
Set these in Actor Settings → Environment variables (mark keys as secret):
| Variable | Required | Description |
|---|---|---|
S3_ENDPOINT or HETZNER_ENDPOINT | yes | e.g. https://<account>.r2.cloudflarestorage.com or Hetzner |
S3_ACCESS_KEY or HETZNER_ACCESS_KEY | yes | Access key |
S3_SECRET_KEY or HETZNER_SECRET_KEY | yes | Secret key |
S3_REGION or HETZNER_REGION | no | Default auto (R2) / eu-central (Hetzner) |
MOTHERDUCK_TOKEN | no | Only if runPipeline: true |
Per-league bucket overrides (optional): MET_S3_BUCKET, SHL_S3_BUCKET, HA_S3_BUCKET, AHL_S3_BUCKET, …
Default bronze buckets use league prefixes (met-scraper, shl-raw, ahl-scraper, …). Override per source if you prefer your own names.
Output
- Files in your S3/R2 bucket (league-specific prefixes)
- Dataset row on success:
{"source": "shl","mode": "update","modeFallbackApplied": false,"runPipeline": false,"status": "ok","storage": "https://<account>.r2.cloudflarestorage.com"}
If you pass an unsupported mode for a source, the Actor falls back to a safe
source-specific default and sets modeFallbackApplied: true.
Memory & cost guidance
| Source class | Suggested memory | Notes |
|---|---|---|
| HTTP / API / CSV | 1024 MB | SHL, HA, AHL, ECHL, DEL, … |
| Playwright | 2048 MB | met |
Avoid large manual runs on Apify Free (~$5/mo). Prefer Schedules.
Scheduling (recommended)
Create one Apify Schedule per league (cron UTC). Example SHL daily:
- Cron:
0 8 * * * - Input:
{"source":"shl","mode":"update","runPipeline":false} - Memory: 1024 MB
Create one schedule per league. Start weekly; move to daily after you have measured compute cost.
Commercial positioning
Use this Actor as a reliable ingestion layer rather than a one-off scrape:
- Stable source ids and explicit run modes.
- S3/R2-first output (no lock-in to a vendor analytics stack).
- Deterministic success row in dataset for monitoring and support.
- No buyer dependency on MotherDuck when
runPipeline: false.
Suggested buyer offer
- Pay-per-event: $0.99 per successful league scrape (
league-scrape-completed). - Buyer also pays Apify platform compute for the run.
- Recommended schedule: weekly per league to start; daily after proving costs.
- Starter packaging: 1–2 leagues, weekly.
- Growth: 3–6 leagues, daily schedules, setup support.
- Pro: 7+ leagues, source mix optimization and runbook customization.
Legal / ToS
Scrapers target public stats pages and official APIs. Buyers must ensure their use complies with each site’s terms and applicable law. Respect robots/rate limits; do not overload source sites. This Actor is provided as-is for analytics / research pipelines.
Changelog
- 0.4 — Public identity is The Hockey Brain (
https://www.thehockeybrain.com). Crawler User-Agents point at the project site, not a personal GitHub account. - 0.1 — Multi-league dispatcher; S3/R2-ready env aliases.
Support
Product: The Hockey Brain
Contact: thehockeybrain.com/contact