Skip to contents

Top scorers (same row shape as /player).

Usage

nl_top_scorers(take = NULL, season = NULL, phase = NULL, return_parsed = TRUE)

Arguments

take

Number of rows to return (take = 3 answers 3). NULL (the default) returns the full list.

season

Season END year (2026 is 2025/26), sent to the API unchanged. Changing it changes every list, so it scopes the answer. Lists are served for 2019-2027 (the app's season picker) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered an empty list (probed 2026-10-12). NULL (the default) leaves the choice to the API.

phase

SIHF phase id (4940 is the 2025/26 Regular Season, 5297 the playoffs); phase ids change every season. NULL (the default) leaves the choice to the API: on /player that served the regular season (verified, byte-identical to phase = 4940); on the other routes that default is assumed, not verified.

return_parsed

Logical. TRUE (the default) returns the fastRhockey_data tibble; FALSE returns the raw JSON body as a nested list (api keys already dropped).

Value

A fastRhockey_data tibble (145 columns) with the columns below, or the raw JSON body when return_parsed = FALSE. A valid but empty payload returns a zero-row tibble with these columns.

col_nametypedescription
player_idnumericSIHF licence number (whole number; e.g. 305519 = Tobias Geisser). Joins the sihf family's player_id and every SIHF *LicenceNr.
first_namecharacterFirst (given) name of the player
last_namecharacterLast (family) name of the player
team_idnumericSIHF team id (whole number; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
team_short_namecharacterTeam abbreviation
team_namecharacterTeam name as the league app displays it
numbercharacterSweater number, a string
positioncharactergoalkeeper, defender or forwarder (sic); one of 502 rows in the full 2026 body has the integer 0
topscorer_pointsintegerPostFinance Top Scorer game score (an app fantasy rating, not on-ice points)
topscorer_point_averagenumericPostFinance Top Scorer game score per game
topscorer_market_valueintegerPostFinance Top Scorer game market value
topscorer_market_value_trendintegerMarket-value trend: 1 up, 0 flat, -1 down
topscorer_amountintegerCHF amount credited to the team's Top Scorer jersey holder (non-zero for 14 players, one per team)
is_topscorerlogicalWears the team's PostFinance Top Scorer jersey (one per team)
nationalitycharacterNationality; unobserved: null or empty in every sampled row
birthcharacterDate of birth, YYYY-MM-DD
heightintegerHeight; unobserved: null or empty in every sampled row
weightintegerWeight; unobserved: null or empty in every sampled row
handcharacterShooting or catching hand; unobserved: null or empty in every sampled row
lcridintegerNot determined (small integer, 0-4 in 2026)
nocintegerNot determined (small integer, 0-2 in 2026)
gpintegerNumber of games played
gintegerNumber of goals scored
a1integerFirst (primary) assists credited
a2integerSecond (secondary) assists credited
penaltiesintegerPenalties taken (upstream fo: fo2 + fo5 + fo10 + gm + mp). Not faceoffs: see face_offs / fot.
pimintegerPenalty minutes
geqintegerEven-strength goals
gppintegerPower-play goals
gpkintegerShorthanded goals
gwgintegerGame-winning goals
psintegerShootout shots taken
pgintegerNot determined; 0 on every 2026 row
plintegerPlus count: on ice for an even-strength or shorthanded goal for
miintegerMinus count: on ice for a goal against
toiintegerTime on ice, seconds
toi_eqintegerEven-strength time on ice, seconds
toippintegerPower-play time on ice, seconds (lower-case pp, unlike the box score's toiPp)
toi_pkintegerShorthanded time on ice, seconds
sogintegerNumber of shots on goal
shmintegerShots that missed the net
shpintegerShots that hit the post
shbintegerOwn shots blocked by an opponent
bksintegerOpponent shots blocked
fowintegerNumber of faceoffs won
folintegerNumber of faceoffs lost
shiintegerNumber of shifts played
gwgkintegerNot determined; 0 on every 2026 row
gwintegerGoaltender wins (incl. overtime and shootout)
glintegerGoaltender losses (incl. overtime and shootout)
fkintegerGames started in goal (inferred: fk <= gp; 42 of 44 for the 2026 games-played leader)
gaintegerGoals against: number of goals conceded
saintegerShots on goal against
svsintegerNumber of saves made by the goaltender
sointegerNumber of shutouts (games without a goal conceded)
mipintegerGoaltender time played, hundredths of a minute (6000 = 60:00; = seconds / 0.6)
assistsintegerAssists (a1 + a2; verified on every 2026 row)
pointsintegerPoints (g + assists; verified)
goal_efficiencynumericShooting percentage, 100 * g / sog (verified); -1 with no shots
save_percentagenumericSave percentage, 0-100
face_offs_percentagenumericFaceoff win percentage, 0-100; -1 with no faceoffs
face_offsintegerFaceoffs taken (fow + fol; verified)
is_captainlogicalWhether the player is the team captain
first_goalkeeperlogicalTeam's first-choice goaltender
ga_per_gamenumericGoals against per game (ga / gp; verified)
points_per_gamenumericPoints per game
svs_per_gamenumericGoaltender saves per game played
bks_per_gamenumericBlocked shots per game
sog_per_gamenumericShots on goal per game
shm_per_gamenumericMissed shots per game
shp_per_gamenumericPost hits per game
fow_per_gamenumericFaceoffs won per game
fol_per_gamenumericFaceoffs lost per game
toi_eq_per_gamenumericEven-strength time on ice per game, seconds
toi_pp_per_gamenumericPower-play time on ice per game, seconds
toi_pk_per_gamenumericShorthanded time on ice per game, seconds
face_offs_per_game_percentagenumericNot determined; 0 on the sampled rows
toi_averagenumericTime on ice per game, seconds
plus_minusintegerPlus/minus (pl - mi; verified)
tgsintegerTeam's total game time, seconds (about 3600 per game incl. overtime)
sepintegerGoaltender time played, seconds
toi_percentagenumericShare of the team's game time in goal, 100 * sep / tgs (verified)
gwitintegerWins in regulation time (gw = gwit + overtime/shootout wins; verified)
glitintegerLosses in regulation time (gl = glit + overtime/shootout losses; verified)
sagintegerShots on goal against that were saved (= svs on every 2026 goaltender row)
sagointegerShots on goal against that went in (= ga on every 2026 goaltender row)
samintegerShots against that missed the net
sapintegerShots against that hit the post
sabintegerShots against that were blocked
saslotintegerSlot shots against
sagoslotintegerSlot shots against that went in
aeqintegerEven-strength assists
appintegerPower-play assists
apkintegerShorthanded assists
haintegerHat tricks (inferred; at most 2 in 2026)
fo2integerMinor (2-minute) penalties
fo5integerMajor (5-minute) penalties
fo10integer10-minute misconducts
gmintegerGame misconducts
mpintegerMatch penalties
pmintegerNot determined; 0 on every 2026 row
pwgintegerNot determined; 0 on every 2026 row
sgointegerNot determined. Equals gff + gfd on every team row; skater values are close to but not always g
fowozintegerOffensive-zone faceoffs won
fownzintegerNeutral-zone faceoffs won
fowdzintegerDefensive-zone faceoffs won
folozintegerOffensive-zone faceoffs lost
folnzintegerNeutral-zone faceoffs lost
foldzintegerDefensive-zone faceoffs lost
psgintegerGoals scored in shootouts
pssvsintegerSaves made in shootouts
gotintegerOvertime goals (a subset of g)
ot_rankintegerOvertime-scoring rank; 0 on the 2026 rows (filled in 2027)
ot_gintegerOvertime goals in the overtime table; 0 on every 2026 row
ot_a1integerOvertime first assists; 0 on every 2026 row
ot_a2integerOvertime second assists; 0 on every 2026 row
ot_toiintegerOvertime time on ice, seconds; 0 on every 2026 row
ot_aintegerOvertime assists; 0 on every 2026 row
ot_pintegerOvertime points; 0 on every 2026 row
psgwgintegerGame-deciding shootout goals; 0 on every 2026 row
sogslotintegerShots on goal from the slot
pswgintegerShootout winners (inferred)
toishinumericTime on ice per shift, seconds
shigpnumericShifts per game
saslotgpnumericSlot shots against per game
samgpnumericMissed shots against per game
sapgpnumericPost hits against per game
svs_pslotnumericSlot save percentage, 100 * (saslot - sagoslot) / saslot
sa_per_gamenumericShots on goal against per game
otwintegerGoaltender overtime or shootout wins
otlintegerGoaltender overtime or shootout losses
fopoznumericOffensive-zone faceoff win percentage, 0-100
fopnznumericNeutral-zone faceoff win percentage, 0-100
fopdznumericDefensive-zone faceoff win percentage, 0-100
fotintegerFaceoffs taken (fow + fol)
fogpnumericFaceoffs taken per game
psmintegerShootout misses (inferred; ps = psg + psm fails for 67 of 447 skaters)
ps_percentagenumericShootout success percentage, 0-100
gw_shutoutintegerNot determined; equals gw on goaltender rows
sogslot_per_gamenumericSlot shots on goal per game
psagintegerShootout goals against (equals ps on goaltender rows)
pssvs_percentagenumericShootout save percentage, 0-100; -1 with no shootout shots faced
show_ranklogicalApp flag: show the row's rank
chfintegerCHF credited for the player's points: 300 * points on every 2026 row (PostFinance youth-fund scheme; inferred)
team_statscharacterPer-team split for a player who changed teams; unobserved: null or empty in every sampled row

Details

robots.txt ruling. www.nationalleague.ch/robots.txt disallows /api. The owner approved building on it on 2026-10-12, for polite, incremental use only: requests are spaced at least one second apart (on every attempt, retries included), and a bulk backfill or a published mirror needs the owner's sign-off first. Crawl incrementally: fetch a finished game once (keyed by game_id), find new games with one nl_schedule() call per run, and fetch season tables at most once per game day.

Seasons are END years and go on the wire unchanged. Ids (*_id) are whole-number numeric (a 14-digit game_id exceeds R's 32-bit integer); every other whole-number column is integer. The club backend key the API ships in /teams/{id}/info is dropped before parsing and never returned.

Endpoint: GET https://www.nationalleague.ch/api/player/topscorer.

Errors

Raises a classed condition (all inherit fastRhockey_error): fastRhockey_no_data for a 404 or an empty answer (no games or rows for that season, team or phase), fastRhockey_asset_fetch for a failed fetch, an error object in a 200, a body without the ids it must carry, or an answer for another season, team, game or player, and fastRhockey_bad_request for a 400/422 or an argument that is not a whole number.

Examples

# \donttest{
  try(nl_top_scorers(phase = 4940, season = 2026, take = 3))
#> ── National League Top Scorers Information from nationalleague.ch ──────────────
#> ℹ Data updated: 2026-10-13 01:58:39 UTC
#> # A tibble: 3 × 145
#>   player_id first_name last_name team_id team_short_name team_name        number
#>       <dbl> <chr>      <chr>       <dbl> <chr>           <chr>            <chr> 
#> 1    340155 Markus     Granlund   103140 GSHC            Genève-Servette… 60    
#> 2    337830 Matej      Stransky   101151 HCD             HC Davos         44    
#> 3    150826 Luca       Fazzini    101150 HCL             HC Lugano        17    
#> # ℹ 138 more variables: position <chr>, topscorer_points <int>,
#> #   topscorer_point_average <dbl>, topscorer_market_value <int>,
#> #   topscorer_market_value_trend <int>, topscorer_amount <int>,
#> #   is_topscorer <lgl>, nationality <chr>, birth <chr>, height <int>,
#> #   weight <int>, hand <chr>, lcrid <int>, noc <int>, gp <int>, g <int>,
#> #   a1 <int>, a2 <int>, penalties <int>, pim <int>, geq <int>, gpp <int>,
#> #   gpk <int>, gwg <int>, ps <int>, pg <int>, pl <int>, mi <int>, toi <int>, …
# }