analyze_goalie_streams
🥅 Which goalie to stream this week, from public data.
Every NHL goalie is scored for a window of days. The score combines how many starts he is likely to get, how dangerous the attacks he faces are, and how well he stopped the puck last season. The formula is printed in every response, so you can check any number.
Usage
Ask naturally:
"Which goalie should I stream this week?"
"Goalie streams for Oct 12–18, my goalie is Shesterkin"
"Stream me a goalie, assume the top 150 are taken"Or call it directly:
json
{
"roster_text": "Igor Shesterkin",
"start": "2026-10-12",
"look_ahead_days": 7,
"top_n": 8,
"assume_rostered": 150
}Parameters
All optional.
| Parameter | Type | Default | Description |
|---|---|---|---|
look_ahead_days | Number | 7 | Window length in days, 1–14 |
start | String | today | First day of the window, YYYY-MM-DD |
top_n | Number | 8 | How many candidates to return (max 25) |
roster_text | String | — | Your roster, pasted. Your goalies are shown under your_goalies and left out of the candidates |
assume_rostered | Number | off | Treat the top N on the draft board as rostered in your league and leave them out, e.g. 150 for 12 teams. See Tools overview |
How the score works
stream score (0–100) = expected starts against four × 55
+ (100 − average opponent attack) × 0.25
+ save % percentile × 0.2
expected starts = games in the window × last season's start share- Start share. The share of his club's games he played last season. A 72% starter on a three-game week projects 2.2 starts. His club's games are not all his.
- Opponent attack. Each opponent's goals for per game, ranked across the league: 0 is the weakest attack and 100 the most dangerous. A night against an attack below 40 counts as a soft night.
- Save % percentile. Last season's save % ranked against goalies with 20+ games. A goalie with fewer games has no percentile and counts as 50, because a five-game .930 says little.
The same score ranks goalies in get_streaming_recommendations (with position_filter: "G") and in ice, so all three tools name the same goalie first.
Example response
Trimmed to two candidates and two nights each:
json
{
"window": { "start": "2026-10-12", "end": "2026-10-18", "days": 7, "label": "Oct 12 – 18" },
"your_goalies": [{ "name": "Shesterkin", "club": "NYR", "games": 3, "stream_score": 56 }],
"candidates": [
{
"name": "Saros", "club": "NSH", "games": 3,
"nights": [
{ "date": "2026-10-13", "opponent": "VGK", "home": true, "attack": 58 },
{ "date": "2026-10-15", "opponent": "SJS", "home": true, "attack": 45 }
],
"soft_nights": 1, "avg_opponent_attack": 42,
"start_share": 0.72, "expected_starts": 2.2,
"gaa": 3.16, "save_pct": 0.894, "wins": 28,
"save_pct_percentile": 42, "stream_score": 53,
"reason": "3 games, 1 against weak attacks; started 72% of NSH's games last season"
},
{
"name": "Hildeby", "club": "TBL", "games": 3,
"soft_nights": 3, "avg_opponent_attack": 16,
"start_share": 0.24, "expected_starts": 0.7,
"save_pct": 0.914, "save_pct_percentile": 96, "stream_score": 50,
"reason": "3 games, 3 against weak attacks; started 24% of TBL's games last season"
}
],
"take": "Saros (NSH): 3 games, 1 against weak attacks, and he started 72% of his team's games last season at .894. Best stream on the board."
}Hildeby's week is softer and his save % is better, but as a backup he projects less than one start. Saros's workload wins.
Limits
The response states these every time:
- Starters are not announced in public data. Start share is last season's, so it's a proxy for who plays, not a lineup. Check the confirmed starter on game day.
- League availability is unknowable. Candidates are goalies not on the roster you pasted, and outside the top N of the board when you pass
assume_rostered. - Early season. Until the new season has games, opponent strength comes from last season's final standings.
Related
- Tools overview: every tool, and how
assume_rosteredworks get_streaming_recommendationswithposition_filter: "G": the same goalie order inside the general streaming list
