Sports Odds Scraper — NFL, NBA, MLB, NHL + Prediction Markets
Pricing
from $10.00 / 1,000 result rows
Sports Odds Scraper — NFL, NBA, MLB, NHL + Prediction Markets
Scrape today's sportsbook lines (spread, total, moneyline, vig-free win probability) for NFL, NBA, MLB, NHL, college and soccer from ESPN's public scoreboard, side by side with Polymarket and Kalshi win probabilities for the same games. Public APIs, no login, JSON rows.
Pricing
from $10.00 / 1,000 result rows
Rating
0.0
(0)
Developer
Galter Time
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Sports Odds Scraper — NFL, NBA, MLB, NHL & soccer lines with prediction-market probabilities
Get today's sports odds as JSON in one run: for every game on the slate, the sportsbook spread, total and moneylines (from ESPN's public scoreboard feed), a vig-free win probability, live status and score — and, uniquely, the Polymarket and Kalshi win probabilities for the same game with the gap versus the book. No login, no API keys, no sportsbook scraping that breaks every week.

What can you do with sports odds data?
- Build an odds board or model input — one row per game, 14 leagues (NFL, NCAAF, NBA, WNBA, NCAAB, MLB, NHL, MLS, Premier League, Champions League, La Liga, Bundesliga, Serie A, Ligue 1).
- Spot where prediction markets disagree with the book —
polymarket_vs_book_pts/kalshi_vs_book_ptsin probability points;OUTPUT.largest_edgeslists the biggest. - Track lines over time — schedule the Actor hourly on game days and diff
spread/over_under. - Feed dashboards, sheets, alerts and AI agents — stable schema, MCP-ready.
How to scrape NFL odds (quick start)
Defaults return the current slate for NFL, NBA, MLB and NHL with prediction markets attached.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("galterapp/sports-odds-scraper").call(run_input={"leagues": ["nfl"], "dates": ["20260913"]})for g in client.dataset(run["defaultDatasetId"]).iterate_items():print(g["short_name"], g["line"], g["over_under"], g["book_prob_home"], g["polymarket_prob_home"])
const { ApifyClient } = require('apify-client');const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('galterapp/sports-odds-scraper').call({ leagues: ['nba', 'nhl'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
curl -X POST "https://api.apify.com/v2/acts/galterapp~sports-odds-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "content-type: application/json" -d '{"leagues":["mlb"]}'
Sample row
{"league":"nfl","game_id":"401772510","short_name":"KC @ BUF","start_time":"2026-09-13T20:25Z","status":"Scheduled","home_team":"Buffalo Bills","away_team":"Kansas City Chiefs","book":"ESPN BET","line":"BUF -2.5","spread":-2.5,"over_under":47.5,"home_moneyline":-135,"away_moneyline":115,"book_prob_home":0.553,"book_vig_pct":4.0,"polymarket_prob_home":0.57,"kalshi_prob_home":0.56,"polymarket_vs_book_pts":1.7,"kalshi_vs_book_pts":0.7,"polymarket_url":"https://polymarket.com/event/nfl-kc-buf-2026-09-13","ts":1788400000}
Input
| Field | Default | Meaning |
|---|---|---|
leagues | nfl, nba, mlb, nhl | any of the 14 supported leagues |
dates | current slate | list of YYYYMMDD |
includePredictionMarkets | true | attach Polymarket/Kalshi home-win probabilities |
maxResults | 200 | rows returned (and paid for) |
How the numbers are computed
book_prob_home= home moneyline probability ÷ (home + away probabilities) — the vig is removed;book_vig_pctis the overround.- Prediction-market probabilities come from the most liquid game market whose text names both teams and closes within 3 days of kickoff;
*_vs_book_pts= market − book, in points. - Off-season leagues return no games (not an error). Lines appear when ESPN publishes them, typically 1–6 days before kickoff.
Notes
- Public JSON endpoints only (ESPN scoreboard, Polymarket Gamma, Kalshi trade API). Nothing stored, no accounts.
- Not betting advice. Availability of the venues depends on your jurisdiction.
- Pricing: pay per game row. A full four-league day is typically 15–40 rows.