A Discord bot for tracking sports betting props with live ESPN updates. Add your bets, get real-time stat tracking as games progress, and see P&L summaries — all delivered via Direct Message so your tracking is private and works anywhere.
- 📸 AI Bet Slip Parsing — Upload a bet slip image and PropBot auto-extracts all your bets
- 📊 Live Stat Tracking — Real-time player stats from ESPN (free, no API key required)
- 🔔 DM Monitoring — Live updates sent to your DMs as games progress (no channel spam)
- 📈 Odds Comparison — Compare lines across sportsbooks (BYOK: bring your own Odds API key)
- 🎰 Parlay Support — Track multi-leg parlays, auto-settle when all games finish
- 🗄️ Zero-Config DB — SQLite, no external database needed
All bet tracking is user-scoped and delivered via DM:
- Commands work in DMs or any server — no channel setup required
/monitor startsends live updates directly to your DMs- Each user has their own independent monitor (start/stop without affecting others)
- Bet history is private to you, not tied to a server
Servers are optional — useful for discovery, but PropBot doesn't need to post to channels.
| Sport | Coverage |
|---|---|
| NBA | Full box score, all stats |
| NCAAB | Full box score, all stats |
| NFL | Passing/rushing/receiving yards, TDs |
| MLB | Hits, strikeouts (partial) |
| NHL | Goals, assists, saves (partial) |
| Stat | Command Key | Description |
|---|---|---|
| Points | points or pts |
Player points |
| Rebounds | rebounds or reb |
Total rebounds |
| Assists | assists or ast |
Assists |
| 3-Pointers | threePointers or 3pm |
3PT made |
| Steals | steals or stl |
Steals |
| Blocks | blocks or blk |
Blocks |
| Turnovers | turnovers or to |
Turnovers |
| PRA | pra |
Points + Rebounds + Assists |
| RA | ra |
Rebounds + Assists |
| PA | pa |
Points + Assists |
| PR | pr |
Points + Rebounds |
/prop add player:Anthony Edwards stat:threePointers line:3.5 direction:over game:TOR@MIN wager:20
/prop add player:Nikola Jokic stat:pra line:52.5 direction:over game:LAL@DEN wager:50 odds:-110
/parlay wager:25 legs:Edwards O3.5 3PM, Randle O6.5 REB, Murray O25.5 PTS
/parlay wager:50 legs:Jokic O52.5 PRA, LeBron O25.5 PTS odds:+450
/track slip:[attach image]
/track text:"Edwards 3PM over 3.5 -115, Jokic PRA over 52.5 -110, wager $25"
/monitor start — DM updates every 5 minutes (default)
/monitor start interval:2 — DM updates every 2 minutes
/monitor stop
/monitor status
Updates are sent to your DMs — no channel permission required.
/status — All your active bets
/status slip:3 — Specific slip
/odds game:"Lakers vs Nuggets" market:spreads
/odds game:MIN sport:nba market:h2h
/settings oddskey:YOUR_ODDS_API_KEY
/settings timezone:America/Los_Angeles
/settings — View current settings
- Node.js 20+
- A Discord bot token (guide)
- OpenAI API key (optional, for
/trackslip parsing) - The Odds API key (optional, per-user BYOK for
/odds)
git clone https://github.com/yourusername/propbot
cd propbot
npm installcp .env.example .envEdit .env:
DISCORD_TOKEN=your-discord-bot-token
DISCORD_CLIENT_ID=your-discord-client-id
OPENAI_API_KEY=your-openai-key # Optional: for /track
ENCRYPTION_KEY=$(openssl rand -hex 32) # Required: for encrypting user keys
DATABASE_PATH=./data/propbot.dbCommands are registered globally (work in DMs + all servers):
npm run registerFor guild-specific registration (instant, good for testing):
GUILD_ID=your-guild-id npm run registernpm run build && npm start
# or for development:
npm run dev# Build
docker build -t propbot .
# Run
docker run -d \
--name propbot \
--restart unless-stopped \
-e DISCORD_TOKEN=your-token \
-e DISCORD_CLIENT_ID=your-client-id \
-e OPENAI_API_KEY=your-openai-key \
-e ENCRYPTION_KEY=your-32-byte-hex \
-v propbot_data:/app/data \
propbotBoth platforms support Docker-based deployment. Set the environment variables in their dashboard and point to this repo. The SQLite database persists on a mounted volume.
- You add a prop with
/prop addand specify thegame:argument (e.g.TOR@MIN) - PropBot looks up the ESPN game ID for that matchup today
- Run
/monitor start— PropBot will DM you updates every N minutes - When the game is
final, PropBot evaluates all legs, settles the slip, and DMs you the result
The /parlay command parses free-text legs but can't always auto-link each player to a game. For reliable tracking:
- Use
/parlayto create the slip (it stores the legs) - The monitor will attempt matching — or use
/prop addper leg for explicit game linking
src/
├── index.ts — Bot entrypoint, command dispatch
├── register-commands.ts — One-time Discord command registration
├── commands/ — Slash command handlers (all DM-capable)
│ ├── prop.ts — /prop (add/list/remove)
│ ├── parlay.ts — /parlay
│ ├── track.ts — /track (AI vision parsing)
│ ├── monitor.ts — /monitor (start/stop/status) — DMs updates to user
│ ├── status.ts — /status
│ ├── odds.ts — /odds (BYOK)
│ └── settings.ts — /settings
├── services/
│ ├── espn.ts — ESPN API (free, no key)
│ ├── odds-api.ts — The Odds API (BYOK)
│ ├── slip-parser.ts — AI vision parsing (OpenAI GPT-4o)
│ ├── prop-tracker.ts — Leg evaluation engine
│ └── monitor.ts — Per-user game monitoring loop (DM delivery)
├── models/ — TypeScript types
├── db/ — SQLite (better-sqlite3)
└── utils/ — Embeds, constants, crypto
| Variable | Required | Description |
|---|---|---|
DISCORD_TOKEN |
✅ | Bot token from Discord Developer Portal |
DISCORD_CLIENT_ID |
✅ | Application ID from Discord Developer Portal |
ENCRYPTION_KEY |
✅ | 64-char hex string for AES-256 encryption of user keys |
OPENAI_API_KEY |
Optional | Required for /track slip image parsing |
DATABASE_PATH |
Optional | Path to SQLite file (default: ./data/propbot.db) |
MONITOR_INTERVAL_MINUTES |
Optional | Default monitor interval in minutes (default: 5) |
When adding the bot to a server, it needs:
Send MessagesEmbed LinksRead Message HistoryUse Slash Commands
For DM delivery (required for /monitor):
- Enable Message Content Intent in the Discord Developer Portal → Bot settings
OAuth2 scopes: bot, applications.commands
Note: If a user has DMs disabled from server members, PropBot will silently skip DM delivery for the monitor. The bot will log a warning server-side.
- TODO:
/leaderboard— opt-in P&L rankings shown in a server channel
MIT — go build something cool.