Sports Betting & Money-Printer Alerts
Sports-betting intelligence for bots and bettors: live odds, guaranteed-profit
arbitrage, +EV detection, player props, injury reports, and the new
money-printer alert lane — historical odds, public betting percentages, sharp
consensus, and steam/CLV alerts. All endpoints read free public feeds (The Odds
API free tier + ESPN scoreboards); no API key is required to start, and a
PRY_ODDS_API_KEY upgrades the odds feed to 10+ bookmakers.
What it scrapes
| Source | Data |
|---|---|
| The Odds API (free tier) + ESPN scoreboards | Live odds across 12+ bookmakers (Pinnacle, DraftKings, FanDuel, BetMGM, …), 20+ sports, markets h2h / spreads / totals / outrights |
| Odds API history feed + ESPN | Historical closing/open odds for past events |
| Public betting-percentage feeds | Share of bets and share of money on each side |
| Sharp books (Pinnacle, Circa, BetOnline) | CLV-aware consensus lines |
| ESPN | Player stats, scores, injury reports |
Endpoints
Router: routers/sports_data.py · tag: Sports Data
| Method | Path | Summary |
|---|---|---|
| GET | /v1/sports/odds | Live betting odds across bookmakers |
| GET | /v1/sports/odds/{event_id} | Multi-sportsbook odds comparison for one event |
| GET | /v1/sports/stats/{player} | Player stats (ESPN) |
| GET | /v1/sports/scores | Final / live scores for a day (ESPN) |
| GET | /v1/sports/arbitrage | Guaranteed-profit arbitrage across bookmakers |
| GET | /v1/sports/plus-ev | Positive-EV betting opportunities vs a sharp book |
| GET | /v1/sports/props | Player prop betting lines (points, yards, strikeouts, …) |
| GET | /v1/sports/injuries | Injury report for a sport or team |
| GET | /v1/sports/live | Live in-play odds |
| GET | /v1/sports/historical | Historical betting odds for past events |
| GET | /v1/sports/betting-percentages | Public betting percentages (bets & money share) |
| GET | /v1/sports/sharp-consensus | Sharp consensus lines (CLV-aware) |
| GET | /v1/sports/alerts | Money-printer alerts (line moves, steam, CLV) |
GET /v1/sports/odds
Query params: event_query (substring filter, e.g. celtics), sport
(nba, nfl, mlb, nhl, epl, … or all), limit (1–100, default 20).
curl -X GET "http://localhost:8005/v1/sports/odds?sport=nba&limit=2" \
-H "Authorization: Bearer <key>"
Response (200):
{
"success": true,
"sport": "nba",
"limit": 2,
"data": [
{
"event": "Boston Celtics @ New York Knicks",
"commence_time": "2026-08-17T00:30:00Z",
"bookmaker": "draftkings",
"market": "h2h",
"outcomes": [{"name": "Boston Celtics", "price": 1.48}, {"name": "New York Knicks", "price": 2.75}]
}
]
}
GET /v1/sports/arbitrage
Query params: sport (default all), min_yield_pct (default 0.5).
curl -X GET "http://localhost:8005/v1/sports/arbitrage?sport=nba&min_yield_pct=1.0" \
-H "Authorization: Bearer <key>"
Response (200):
{
"success": true,
"sport": "nba",
"min_yield_pct": 1.0,
"data": [
{
"event": "Boston Celtics @ New York Knicks",
"market": "h2h",
"book_a": {"bookmaker": "draftkings", "outcome": "Boston Celtics", "decimal": 2.10},
"book_b": {"bookmaker": "fanduel", "outcome": "New York Knicks", "decimal": 2.02},
"yield_pct": 2.4,
"implied_total_pct": 97.6
}
]
}
GET /v1/sports/alerts (money-printer lane)
Query params: alert_type (line_move | steam | clv | injury | empty for all),
sport (default all), limit (1–100, default 20).
curl -X GET "http://localhost:8005/v1/sports/alerts?alert_type=steam&sport=nfl" \
-H "Authorization: Bearer <key>"
Response (200):
{
"success": true,
"alert_type": "steam",
"sport": "nfl",
"data": [
{
"event": "Chiefs @ Bills",
"market": "h2h",
"type": "steam",
"side": "Chiefs",
"from_price": 1.91,
"to_price": 1.80,
"bookmakers": ["pinnacle", "circa"],
"observed_at": "2026-08-16T19:40:00Z"
}
]
}
MCP tools
The Pry MCP server exposes the sports lane as eleven tools:
| Tool | Backing endpoint |
|---|---|
pry_odds | GET /v1/sports/odds |
pry_arbitrage | GET /v1/sports/arbitrage |
pry_plus_ev | GET /v1/sports/plus-ev |
pry_props | GET /v1/sports/props |
pry_injuries | GET /v1/sports/injuries |
pry_live_odds | GET /v1/sports/live |
pry_scores | GET /v1/sports/scores |
pry_historical_odds | GET /v1/sports/historical |
pry_betting_percentages | GET /v1/sports/betting-percentages |
pry_sharp_consensus | GET /v1/sports/sharp-consensus |
pry_alerts | GET /v1/sports/alerts |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "pry_arbitrage",
"arguments": {"sport": "nba", "min_yield_pct": 1.0}
}
}
Who uses this
- Betting bots — sweep
arbitragefor guaranteed profit, filter withplus_ev. - Sweat/steam trackers — subscribe to
alerts(steam,clv,line_move) instead of polling. - Backtesters —
historicalclosing lines vs market closes. - Content tools —
props,injuries, andscoresfor odds pages and daily recaps.
Next steps
- Full endpoint reference: API Overview
- MCP Integration — run the tools from Claude / Cursor / Hermes