ESPN-Fantasy-Football-Waivers
Docker app from SirBusta's Repository
Overview
Readme
View on GitHub![]()
ESPN Fantasy Football Waivers
ESPN Fantasy Football doesn't email you when waivers run. This does. After each waiver run, you get one email listing every claim in your league: who picked up whom, who they dropped and what they bid.
[My League] Waivers processed: 3 claims
Wed Nov 4, 9:00 AM PST
Taco Corp: Added (waivers) Gardner Minshew II (QB, ARI) ($21 FAAB)
Taco Corp: Dropped Tanner McKee (QB, PHI)
Wed Nov 4, 9:00 AM PST
Gridiron Gang: Added (waivers) Tyler Goodson (RB, DAL) ($0 FAAB)
Gridiron Gang: Dropped Dameon Pierce (RB, PHI)
...
- Works with public and private leagues, with or without FAAB.
- Can also include free-agent pickups, drops and trades.
- Reads your league's waiver schedule from ESPN and checks 5 minutes after each waiver run, then once a minute until ESPN has processed it, so there's nothing to look up. (Fixed times or every 15 minutes also work.)
- Sends a short "No waiver claims today" email when nothing went through, so you know it's working. These stop by themselves when the season ends and start again after next season's draft.
- Never emails the same move twice, retries when ESPN is slow, and emails you once if it can't reach your league (for example, when your cookies expire).
- Runs as a small Docker container. There's an Unraid Community Applications template.
Unofficial tool; not affiliated with or endorsed by ESPN.
What you need
Your league ID. Open your league on fantasy.espn.com. It's the number after
leagueId= in the address bar.
Two ESPN cookies, for private leagues (most leagues are private). ESPN doesn't allow automated logins, so the app uses your browser's login cookies:
- Log in at espn.com in Chrome or Edge.
- Press F12, open the Application tab, then Cookies >
https://fantasy.espn.com(orhttps://www.espn.com; both show the same cookies). - Type
espn_s2in the Filter box and click the row. Copy the full value from the panel below the list, since the table cuts it off. Leave "Show URL-decoded" unticked. - Do the same for
SWID. It looks like{1A2B3C4D-...}; copy it with the curly braces.
The cookies usually last about a year. Don't click "Log out" on espn.com in that browser, which can end the session early. If they stop working, the app emails you; copy fresh ones and restart it.
An email account to send from. Any SMTP server works. For Gmail, turn on 2-Step Verification, then create an App Password at https://myaccount.google.com/apppasswords and use it (typed without spaces) as the SMTP password. Your normal Gmail password won't work.
Install on Unraid
- On the Apps tab, search for ESPN Fantasy Football Waivers and click Install.
- Fill in your league ID, cookies and email settings. Leave Check times on
auto; it follows your league's waiver schedule. - To confirm email works, set Send test email on start to
true, click Apply and check your inbox. Then set it back tofalse.
Open the container's Logs to see what it's doing. A healthy start looks like:
ESPN Fantasy Football Waivers 1.1.0 starting.
Watching league 123456 (latest season) for WAIVER, 5 min after each of the league's waiver runs.
Connected to 'My League' (2026 season, week 9 of 17, next waiver run Fri Nov 6, 9:00 AM PST). First run: recorded 25 existing transactions without emailing; only new ones will be sent.
Next check: Fri Nov 6, 9:05 AM PST (after the Fri Nov 6, 9:00 AM PST waiver run)
Between seasons
When your league's final week is over, you get one "Season's over" email, and the "No waiver claims today" emails stop. The app keeps checking once a day, quietly. When the league manager renews the league for the new season and you draft, the emails start again on their own.
Install with Docker
Runs anywhere Docker does: a Linux server, a Raspberry Pi 4 or 5 (64-bit OS), a Synology, QNAP or TrueNAS NAS, or Docker Desktop on Windows or a Mac (it only checks while that computer is on and awake). The image is built for both amd64 and arm64.
Make a folder for it and download two files into it:
.env.example, saved as.env, anddocker-compose.yml. On Linux or a Mac:mkdir espn-fantasy-football-waivers && cd espn-fantasy-football-waivers curl -fsSL -o .env https://raw.githubusercontent.com/SirBusta/espn-fantasy-football-waivers/main/.env.example curl -fsSLO https://raw.githubusercontent.com/SirBusta/espn-fantasy-football-waivers/main/docker-compose.ymlOpen
.envin a text editor and fill in your league ID, cookies and email settings. SetTZto your time zone (for exampleAmerica/Los_Angeles; list of names), or the emails show New York time.Check that your league ID and cookies work. This prints your league's recent activity without sending anything:
docker run --rm --env-file .env ghcr.io/sirbusta/espn-fantasy-football-waivers:latest python notifier.py --dry-runSend a test email to check the email settings:
docker run --rm --env-file .env ghcr.io/sirbusta/espn-fantasy-football-waivers:latest python notifier.py --test-emailStart it. It keeps running in the background and starts again after a reboot:
docker compose up -dWithout Docker Compose, this does the same:
docker run -d --name espn-fantasy-football-waivers --restart always --env-file .env -v "$(pwd)/data:/data" ghcr.io/sirbusta/espn-fantasy-football-waivers:latest
The data folder it creates remembers which moves you've been emailed about;
keep it when updating.
See what it's doing: docker logs -f espn-fantasy-football-waivers (Ctrl+C
to stop watching). A healthy start looks like the log in the Unraid section above.
Change a setting: edit .env, then docker compose up -d again.
Update to a new version:
docker compose pull && docker compose up -d
(Without Compose: docker pull the image, then docker rm -f espn-fantasy-football-waivers
and run the docker run -d ... command again.)
Settings
| Setting | Default | Notes |
|---|---|---|
LEAGUE_ID |
required | From your league's URL |
ESPN_S2, SWID |
blank | Required for private leagues |
EMAIL_TO |
required | Several addresses: comma separated, no spaces |
SMTP_HOST / SMTP_PORT / SMTP_SECURITY |
smtp.gmail.com / 587 / starttls |
starttls on 587 or ssl on 465 |
SMTP_USER / SMTP_PASSWORD |
Login for the sending account | |
EMAIL_FROM |
SMTP_USER |
Sender address |
NOTIFY_TYPES |
WAIVER |
Any of WAIVER (waiver claims), FA (free-agent pickups), TRADE, DROP (drops without a pickup), e.g. WAIVER,DROP or WAIVER,FA,TRADE,DROP. With auto, moves made between waiver runs come in the next waiver run's email; use interval to get them within POLL_MINUTES |
CHECK_TIMES |
auto |
auto: after each of the league's waiver runs. Or fixed 24-hour HH:MM times in TZ, e.g. 09:15,13:00. Or interval: every POLL_MINUTES |
AUTO_DELAY_MINUTES |
5 | With auto, how long after each scheduled waiver run to check. If ESPN hasn't processed it yet, it checks every minute until it has |
CHECK_DAYS |
every day | Days for fixed CHECK_TIMES, e.g. Wed,Thu,Fri,Sat,Sun |
POLL_MINUTES |
15 | How often to check with interval |
NOTIFY_WHEN_EMPTY |
true | Email "No waiver claims today" after a waiver run with nothing new (not with interval); paused between seasons |
TZ |
America/New_York |
Time zone for check times and emails (Unraid sets this for you) |
SEND_TEST_EMAIL |
false | Send a test email each time the container starts |
SEND_ON_FIRST_RUN |
false | Email the existing recent activity the first time it starts |
SEASON |
latest | Year the season started. Blank follows the league's latest season |
RETRIES / RETRY_MINUTES |
3 / 15 | If a scheduled check fails, try again this many times, this far apart |
ALERT_AFTER_FAILURES |
RETRIES+1, or 8 with interval |
Failed checks in a row before the one-time alert email |
PUID / PGID |
99 / 100 | Owner of the data folder (Unraid's nobody:users) |
How it works
The app uses the community espn_api
library to read your league's activity feed, the same list you see under
League > Recent Activity on ESPN. It remembers which moves it has already
emailed in /data/state.json. If an email fails to send, it tries again on the
next check.
ESPN's API is unofficial and can change without notice. If it stops working after an ESPN update, check for a newer version of this app.
Development
pip install -r requirements.txt pytest
pytest
Pushes to main publish the edge image. Tagging vX.Y.Z (matching the
VERSION file) publishes X.Y.Z and latest, and creates a GitHub release
from CHANGELOG.md.
The Unraid template is in the BudMinder repository, which Community Applications reads for all of SirBusta's apps. Change it there.
Support
Questions: the Unraid forum support thread (you don't need Unraid to ask there). Bugs: there or on GitHub Issues.
License
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/sirbusta/espn-fantasy-football-waivers:latestRuntime arguments
- Network
bridge- Shell
bash- Privileged
- false
Template configuration
Remembers which moves you've already been emailed about.
- Target
- /data
- Default
- /mnt/user/appdata/espn-fantasy-football-waivers
- Value
- /mnt/user/appdata/espn-fantasy-football-waivers
Open your league on fantasy.espn.com: it's the number after leagueId= in the address bar, e.g. 123456.
- Target
- LEAGUE_ID
Private leagues only (most are). Log in at espn.com in Chrome or Edge, press F12, open Application > Cookies > https://fantasy.espn.com, type espn_s2 in the Filter box and click the row. Copy the whole value from the panel below the list (the table cuts it off), with 'Show URL-decoded' unticked. Don't click Log out on espn.com in that browser afterward, or the cookie stops working.
- Target
- ESPN_S2
Private leagues only. Same place as espn_s2: filter for SWID and copy its value, including the curly braces, e.g. {1A2B3C4D-...}.
- Target
- SWID
Who gets the emails. Separate several addresses with commas, no spaces.
- Target
- EMAIL_TO
Mail server to send through. Gmail: smtp.gmail.com (port 587, starttls). Outlook/Hotmail: smtp-mail.outlook.com (587, starttls). iCloud: smtp.mail.me.com (587, starttls). Yahoo: smtp.mail.yahoo.com (465, ssl).
- Target
- SMTP_HOST
- Default
- smtp.gmail.com
- Value
- smtp.gmail.com
587 for starttls, 465 for ssl.
- Target
- SMTP_PORT
- Default
- 587
- Value
- 587
starttls (port 587), ssl (port 465) or none.
- Target
- SMTP_SECURITY
- Default
- starttls|ssl|none
- Value
- starttls
Login for the account the emails are sent from, usually its full email address.
- Target
- SMTP_USER
Most providers need an app password here, not your normal password. Gmail: turn on 2-Step Verification, then create one at myaccount.google.com/apppasswords and type it without spaces. iCloud and Yahoo have app passwords in their account security settings too.
- Target
- SMTP_PASSWORD
Sender address. Leave blank to use the SMTP username.
- Target
- EMAIL_FROM
auto (recommended): check 5 minutes after each of your league's waiver runs, using the schedule ESPN reports, then every minute until ESPN has processed the run. Or fixed 24-hour HH:MM times in your server's time zone, e.g. 09:15 or 09:15,13:00 (with Check days). Or interval to check every 15 minutes all week.
- Target
- CHECK_TIMES
- Default
- auto
- Value
- auto
Only for fixed Check times: days to check, comma separated, no spaces, e.g. Wed,Thu,Fri,Sat,Sun. Blank means every day. Not needed with auto.
- Target
- CHECK_DAYS
Any of WAIVER (waiver claims), FA (free-agent pickups), TRADE (trades) and DROP (players dropped without a pickup), comma separated, no spaces, e.g. WAIVER,DROP or WAIVER,FA,TRADE,DROP. With Check times set to auto, pickups, drops and trades made between waiver runs come in the next waiver run's email; set Check times to interval to get them within 15 minutes.
- Target
- NOTIFY_TYPES
- Default
- WAIVER
- Value
- WAIVER
Set to true, apply, and check your inbox to confirm the email settings work. Set back to false afterward. To check the league ID and cookies, open the container's Logs: 'Connected to' followed by your league's name means they work.
- Target
- SEND_TEST_EMAIL
- Default
- false|true
- Value
- false
Send a short 'No waiver claims today' email after a waiver run with no claims, so you know it's working. Paused automatically between seasons. Not sent with Check times set to interval.
- Target
- NOTIFY_WHEN_EMPTY
- Default
- true|false
- Value
- true
How often to check with Check times set to interval (or in a league without waivers).
- Target
- POLL_MINUTES
- Default
- 15
- Value
- 15
Blank follows your league's latest season automatically, including before it's renewed for the new year.
- Target
- SEASON
With Check times set to auto: how long after each scheduled waiver run to check. ESPN usually starts within a couple of minutes; if it hasn't processed the run yet, the app checks once a minute until it has.
- Target
- AUTO_DELAY_MINUTES
- Default
- 5
- Value
- 5
true emails the league's recent activity the first time it starts, instead of only new moves.
- Target
- SEND_ON_FIRST_RUN
- Default
- false|true
- Value
- false
If a scheduled check can't reach ESPN, how many times to try again.
- Target
- RETRIES
- Default
- 3
- Value
- 3
Wait between retries.
- Target
- RETRY_MINUTES
- Default
- 15
- Value
- 15
Failed checks in a row before the one-time 'can't reach your league' email. Blank: after a fixed-time check's retries, or 8 checks (2 hours) otherwise.
- Target
- ALERT_AFTER_FAILURES
User ID that owns the Data folder. 99 (nobody) is the Unraid default.
- Default
- 99
- Value
- 99
Group ID that owns the Data folder. 100 (users) is the Unraid default.
- Default
- 100
- Value
- 100