Sports Odds Scraper: NFL, NBA, MLB & Soccer Lines avatar

Sports Odds Scraper: NFL, NBA, MLB & Soccer Lines

Pricing

$2.00 / 1,000 sports odds rows

Go to Apify Store
Sports Odds Scraper: NFL, NBA, MLB & Soccer Lines

Sports Odds Scraper: NFL, NBA, MLB & Soccer Lines

Pregame odds for NFL, NBA, WNBA, MLB, NHL, UFC, college and top soccer leagues: moneyline, spread and total per game in one normalized schema, American or decimal format. Keyless public feed, no proxy, no browser. One row per game, pay per row.

Pricing

$2.00 / 1,000 sports odds rows

Rating

5.0

(1)

Developer

Ken M

Ken M

Maintained by Community

Actor stats

1

Bookmarked

281

Total users

110

Monthly active users

5 days ago

Last modified

Categories

Share

Sports Odds Scraper

Pregame odds for the major leagues in one clean, normalized schema. Pick your sports and get one row per upcoming game with moneyline, point spread and total (over/under), in American, decimal, fractional or implied probability format, with team names and start time — from a keyless public feed, no login and no API key.

Covers NFL, college football, NBA, WNBA, college basketball, MLB, NHL, UFC and the top soccer leagues (Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, Europa League) — plus any other league ESPN covers via a sport/league path like soccer/bra.1.

Built for odds trackers and alert bots, sports content sites, model builders and bettors who want structured pregame numbers on a schedule instead of screenshotting a sportsbook.

What you get for each game

  • home, away, commenceTime, sport
  • markets[]: moneyline (h2h), spreads and totals, each outcome carrying the price in your chosen format plus the decimal price and the line/point
  • Soccer moneylines include the Draw outcome
  • books with per-outcome price attribution (currently one bookmaker feed, typically DraftKings)
  • dedupe (on by default): scheduled runs only emit games they have not seen before, so a cron run works as a new-games feed

Example output

{
"sport": "mlb",
"home": "Philadelphia Phillies",
"away": "New York Mets",
"commenceTime": "2026-07-16T23:00Z",
"books": ["draftkings"],
"markets": [
{ "key": "h2h", "label": "Moneyline", "outcomes": [
{ "name": "Philadelphia Phillies", "point": null, "prices": { "draftkings": { "price": -136, "decimal": 1.7353 } } },
{ "name": "New York Mets", "point": null, "prices": { "draftkings": { "price": 116, "decimal": 2.16 } } }
]},
{ "key": "totals", "label": "Total", "outcomes": [
{ "name": "Over", "point": 9.5, "prices": { "draftkings": { "price": -110, "decimal": 1.9091 } } },
{ "name": "Under", "point": 9.5, "prices": { "draftkings": { "price": -110, "decimal": 1.9091 } } }
]}
]
}

Pricing

$0.002 per game row. Games without published odds are skipped and never charged, and the first 2 rows of every run are free. A full MLB slate across every market costs about 3 cents.

How to run it via API

curl -X POST "https://api.apify.com/v2/acts/scrapemint~sports-odds-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sports": ["mlb", "nba", "soccer_epl"], "oddsFormat": "decimal", "dedupe": false}'

Frequently asked questions

Where do the odds come from? ESPN's public scoreboard feeds, which carry a bookmaker's pregame lines (typically DraftKings) for each game. The feed is keyless and stable; this actor normalizes it into one schema across sports.

Why one bookmaker now? Sportsbooks block direct automated access to their own endpoints (this actor used to read DraftKings and Pinnacle directly until both walls went up). The scoreboard feed is the reliable public path; cross-book best price and arbitrage fields remain in the schema and light up automatically if a second provider ever appears in the feed.

Do you have live/in-play odds or player props? No — pregame moneyline, spread and total. includeStartedEvents keeps rows for games already underway, but prices are the pregame closes.

My scheduled run returns fewer rows than expected. Dedupe is on by default: each game is emitted once. Set "dedupe": false to get the full slate every run, for example to track lines day by day.

Tennis, golf, F1, esports? Not available from the current source; those inputs return a free explanatory row rather than silently vanishing.

More tools from Scrapemint