An intelligent NBA prop betting analysis tool that evaluates betting opportunities using real-time statistics and the Kelly Criterion.
PropWise helps sports bettors identify profitable NBA player prop bets by combining live player statistics with advanced financial algorithms. It fetches real-time data from the NBA Stats API, calculates hit rates based on recent and career performance, computes expected value, and allocates capital optimally using the Kelly Criterion.
Instead of manually analyzing hundreds of daily props, get instant evaluations with confidence scores and optimal bet sizing.
- Real-Time NBA Data - Fetches live player statistics via official NBA Stats API
- Smart Analysis - Evaluates props using Kelly Criterion for optimal capital allocation
- Hit Rate Calculation - Analyzes last 10 games (60% weight) and career stats (40% weight)
- Expected Value (EV) - Computes EV for each betting opportunity
- Edge Detection - Identifies bets with positive edge vs. implied probability
- Multi-Sportsbook Support - Compare odds across DraftKings, FanDuel, BetMGM, William Hill
- Bet Tracking - Track placed bets and view historical performance
- Player Caching - Efficient batching system minimizes API calls
| Category | Technology |
|---|---|
| Frontend | React 18, TypeScript 5, Vite 5 |
| Styling | Tailwind CSS 3.4, Framer Motion |
| Backend | Flask 3.0, Python 3.11+ |
| Data | NBA Stats API, The Odds API |
| Proxy | Zyte API (bypasses rate limits) |
| Production | Gunicorn, Render.com |
- Node.js 18+
- Python 3.11+
- Zyte API key
- The Odds API key
# Clone the repository
git clone https://github.com/coleschaffer/PropWise.git
cd PropWise
# Install frontend dependencies
npm install
# Install backend dependencies
cd backend && pip install -r requirements.txt && cd ..
# Configure environment
cp .env.example .envEdit .env with your API keys:
ZYTE_API_KEY=your_zyte_api_key
ODDS_API_KEY=your_odds_api_key
VITE_BACKEND_URL=http://localhost:5001
VITE_ODDS_API_KEY=your_odds_api_key# Terminal 1: Start backend
cd backend && python server.py
# Runs on http://localhost:5001
# Terminal 2: Start frontend
npm run dev
# Runs on http://localhost:5173PropWise/
├── src/
│ ├── components/ # React components
│ │ ├── BetCard.tsx # Individual bet display
│ │ ├── PortfolioSummary.tsx # Allocation summary
│ │ └── BetHistory.tsx # Historical bets
│ ├── services/
│ │ ├── scoring.ts # Hit rate & EV calculation
│ │ ├── allocation.ts # Kelly Criterion
│ │ ├── nbaApiService.ts # NBA stats fetching
│ │ └── oddsApiService.ts # Odds API integration
│ └── types/ # TypeScript interfaces
├── backend/
│ ├── server.py # Flask API server
│ └── requirements.txt # Python dependencies
├── NBA API for WebApp/ # Custom NBA Stats client
└── backtest-worker/ # Historical data collection
- Fetches live props from The Odds API (~1,658 daily props)
- Deduplicates to ~250 unique players
- Batches player stat requests (20/batch with delays)
- Uses Zyte proxy to bypass NBA API rate limits
- Hit Rate - % of games player exceeded/stayed under the line
- Confidence Score - Weighted: 60% recent (10 games) + 40% career
- Implied Probability - Derived from sportsbook odds
- Edge - Hit Rate minus Implied Probability
- Expected Value -
EV = (Hit Rate × Decimal Odds) - 1 - Kelly Criterion - Optimal bet size for bankroll growth
| Endpoint | Description |
|---|---|
GET /health |
Health check |
GET /api/player/<name> |
Get player stats |
GET /api/player/<name>/game-logs?games=10 |
Recent game logs |
GET /api/player/<name>/career |
Career statistics |
GET /api/search?q=<query> |
Search players |
GET /api/current-season |
Current NBA season |
Configured for Render.com deployment:
- Push code to GitHub
- Connect repo to Render
- Render auto-detects
render.yaml - Add environment variables in dashboard
MIT License