Sports Betting & Money-Printer Alerts
Sports-betting intelligence for bots and bettors: live odds, guaranteed-profit
arbitrage, +EV detection, player props, injury reports, the new
money-printer alert lane — historical odds, public betting percentages, sharp
consensus, and steam/CLV alerts — and the 112-sportsbook coverage lane. The
odds engine reads free public feeds (The Odds API free tier + ESPN scoreboards)
and scrapes 112 sportsbooks across 5 categories (US, offshore, EU, UK, Asian)
directly via intelligent fallback — more sources than any other odds service,
with no paid odds API. No API key is required to start, and a
PRY_ODDS_API_KEY upgrades the Odds API feed to its full bookmaker list.
What it scrapes
| Source | Data |
|---|---|
| 112 sportsbooks (US/offshore/EU/UK/Asian), scraped directly via intelligent fallback | Best-price odds for any sport/market across the whole registry — more books than OddsJam, no paid odds API |
| 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/books | Aggregated odds across the 112-book sportsbook registry |
| GET | /v1/sports/books/coverage | Sportsbook coverage-registry statistics (112 books, 5 categories) |
| GET | /v1/scrape/methods | Sportsbook scraping-method registry |
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 "https://api.pryscraper.com/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 "https://api.pryscraper.com/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 "https://api.pryscraper.com/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"
}
]
}
GET /v1/sports/books (112-sportsbook lane)
Query params: sport (default nba), market (default h2h), limit (1–500,
default 50).
Aggregates odds across every reachable book in the 112-book registry — US, offshore, EU, UK, and Asian books scraped directly through Pry's intelligent fallback chain (no paid odds API). Per-book degradation: a dead or blocked book contributes nothing and never blanks the result.
curl -X GET "https://api.pryscraper.com/v1/sports/books?sport=nba&market=h2h&limit=5" \
-H "Authorization: Bearer <key>"
Response (200):
{
"success": true,
"sport": "nba",
"market": "h2h",
"limit": 5,
"data": [
{
"sport": "nba",
"event": "Lakers @ Celtics",
"market": "h2h",
"book": "DraftKings",
"book_id": "draftkings",
"home": "Los Angeles Lakers",
"away": "Boston Celtics",
"home_odds": 1.91,
"away_odds": 2.10,
"source": "books:draftkings"
}
]
}
GET /v1/sports/books/coverage returns the registry statistics (total, by
category, by method, geo-required split) — no params. GET /v1/scrape/methods
returns the extraction-method registry (json, next_data, nuxT,
init_state, html, browser).
MCP tools
The Pry MCP server exposes the sports lane as fifteen 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 |
pry_books | GET /v1/sports/books |
pry_book_coverage | GET /v1/sports/books/coverage |
pry_scrape_methods | GET /v1/scrape/methods |
pry_all_sources | (MCP local dispatch — sports_data.odds.get_odds_multi(sources="all")) |
{
"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. - Odds aggregators —
bookssweeps all 112 sportsbooks (US/offshore/EU/UK/Asian) for best price,book_coverageaudits the registry,all_sourcesmerges every reachable feed for one event.
Next steps
- Full endpoint reference: API Overview
- MCP Integration — run the tools from Claude / Cursor / Hermes