Sports Betting Odds Scraper
Pricing
from $2.10 / 1,000 odds scrapeds
Sports Betting Odds Scraper
Scrape live sports betting odds for NFL, NBA, MLB, NHL, soccer, UFC, and more: moneyline, spread, and totals from real sportsbooks, no API key needed.
Pricing
from $2.10 / 1,000 odds scrapeds
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Sports Betting Odds Scraper
Sports Betting Odds Scraper is an Apify Actor that extracts live sports betting odds — moneyline, spread, and totals — for NFL, NBA, MLB, NHL, college football/basketball, MLS, Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, the Champions League, Europa League, UFC, and PGA Tour, no API key or sportsbook account required.
| Pass one or more league keys and get every scheduled or live event back as clean rows — one per bookmaker, per market, per outcome — with both American and decimal prices, live scores, venue, and game status included on every row. |
Copy to your AI assistant
Use the Apify Actor "parsebird/sports-betting-odds-scraper" (call it via ApifyClient) to scrape sports betting odds. Example: const { ApifyClient } = require('apify-client'); const client = new ApifyClient({ token: '<APIFY_TOKEN>' }); const run = await client.actor('parsebird/sports-betting-odds-scraper').call({ leagues: ['nfl', 'nba'], oddsFormat: 'american', maxItems: 0 }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); Inputs: leagues (array, required, default ["nfl"], valid values nfl/ncaaf/nba/wnba/ncaam/ncaaw/mlb/nhl/mls/epl/laliga/seriea/bundesliga/ligue1/ucl/uel/ufc/pga), dates (string, optional, "YYYYMMDD" or "YYYYMMDD-YYYYMMDD" UTC, defaults to today), oddsFormat (string, "american" or "decimal", default "american"), maxItems (integer, default 0 = no cap). Each output row is one outcome from one bookmaker for one market (h2h/spreads/totals) on one event: league, leagueName, eventId, eventName, commenceTime, status, completed, venue, homeTeam, homeTeamAbbr, homeScore, awayTeam, awayTeamAbbr, awayScore, bookmaker, marketKey, outcomeName, price, priceAmerican, priceDecimal, point, oddsFormat, details, fetchedAt. API docs: https://apify.com/parsebird/sports-betting-odds-scraper/api. Get a token at https://console.apify.com/settings/integrations.
What does Sports Betting Odds Scraper do?
This sports odds API pulls moneyline (h2h), point spread, and totals (over/under) betting lines for 18 leagues in one run. It's built for anyone who needs structured odds data without scraping individual sportsbook sites or paying for a dedicated odds API:
- 🏈 18 leagues in one Actor — NFL, NCAA Football, NBA, WNBA, NCAA Men's/Women's Basketball, MLB, NHL, MLS, Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, UEFA Champions League, UEFA Europa League, UFC, and PGA Tour. Pass multiple league keys to scrape them all in a single run.
- 💰 Three market types per event — moneyline, point spread, and totals, each returned in both American (
-110,+150) and decimal (1.91,2.50) formats regardless of which one you select. - 📅 Flexible date filtering — leave
datesempty for today's slate, or pass a single day or aYYYYMMDD-YYYYMMDDrange to pull odds for a specific window. - 🏟️ Live game context on every row — venue, game status, and live/final scores are included alongside the odds, so you don't need a second data source to know what's happening in the game.
- 🔌 No API key, no sportsbook login — the Actor fetches publicly available odds feeds directly; you just run it.
- ⚙️ Runs on Apify's platform — schedule recurring runs (e.g. every morning before kickoff), trigger it via the Apify API or webhooks, and connect it to Make, Zapier, or n8n to pipe odds straight into a spreadsheet, database, or Slack channel.
What data can you extract from sports betting odds?
| Field | Description |
|---|---|
league / leagueName | League key (e.g. nfl) and display name (e.g. "NFL") |
eventId / eventName | Unique event ID and matchup name |
commenceTime | Scheduled kickoff/tip-off time (UTC, ISO 8601) |
status / completed | Game status (scheduled, in-progress, final) and a completed flag |
venue | Venue name |
homeTeam / awayTeam (+ Abbr, Score) | Team names, abbreviations, and live/final scores |
bookmaker | Sportsbook the line came from |
marketKey | h2h (moneyline), spreads, or totals |
outcomeName | Team name, or Over/Under for totals |
priceAmerican / priceDecimal / price | Odds in both formats, plus price matching your selected oddsFormat |
point | Spread or total line (null for moneyline) |
details | Human-readable line summary, e.g. "TEN -4.5" |
fetchedAt | Timestamp the row was scraped |
How to scrape sports betting odds with Sports Betting Odds Scraper
- Go to the Actor page and click Try for free.
- Under Leagues, select one or more leagues (defaults to
nfl). - Optionally set Dates to a single day or range — leave empty for today.
- Optionally choose an Odds format and a Max items cap.
- Click Start and download the results as JSON, CSV, or Excel once the run finishes — or pull them via the API.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| leagues | array | Yes | ["nfl"] | League keys. Valid: nfl, ncaaf, nba, wnba, ncaam, ncaaw, mlb, nhl, mls, epl, laliga, seriea, bundesliga, ligue1, ucl, uel, ufc, pga. Pass multiple to scrape several leagues in one run. |
| dates | string | No | today | YYYYMMDD for a single day or YYYYMMDD-YYYYMMDD for a range, all UTC. Leave empty for today's slate. |
| oddsFormat | string | No | american | american or decimal. Both priceAmerican and priceDecimal are always included on every row regardless. |
| maxItems | integer | No | 0 | Maximum rows (quotes) to return. 0 = no cap. Each row is one outcome from one bookmaker for one market. |
Output example
{"league": "nfl","leagueName": "NFL","eventId": "401872656","eventName": "New England Patriots at Seattle Seahawks","commenceTime": "2026-09-10T00:20Z","status": "STATUS_SCHEDULED","completed": false,"venue": "Lumen Field","homeTeam": "Seattle Seahawks","homeTeamAbbr": "SEA","homeScore": null,"awayTeam": "New England Patriots","awayTeamAbbr": "NE","awayScore": null,"bookmaker": "Draft Kings","marketKey": "h2h","outcomeName": "Seattle Seahawks","price": -205,"priceAmerican": -205,"priceDecimal": 1.4878,"point": null,"oddsFormat": "american","details": "SEA -3.5","fetchedAt": "2026-05-18T12:00:01.234Z"}
Download results as JSON, CSV, HTML, or Excel, or pull them programmatically via the Apify API — see the API tab for ready-made code snippets.
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("parsebird/sports-betting-odds-scraper").call(run_input={"leagues": ["nfl", "nba"],"oddsFormat": "american","maxItems": 0,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["eventName"], item["bookmaker"], item["marketKey"], item["price"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('parsebird/sports-betting-odds-scraper').call({leagues: ['nfl', 'nba'],oddsFormat: 'american',maxItems: 0,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use cases
- Line shopping — compare moneyline, spread, and totals across bookmakers for the same event to find the best price.
- Odds movement tracking — schedule recurring runs and diff snapshots to see how lines move before kickoff.
- Sports betting content and models — feed structured odds into a prediction model, newsletter, or betting content site.
- Arbitrage and value-bet screening — combine
priceDecimalacross bookmakers to spot pricing gaps. - Live score dashboards —
homeScore/awayScore/statusgive you live game context alongside the odds in one dataset.
How it works
- The Actor resolves each requested league key to its sport/league identifiers and fetches the current (or date-filtered) event schedule.
- For every event, it fetches the bookmaker odds feed for that specific game — moneyline, spread, and totals, per bookmaker.
- Each bookmaker/market/outcome combination becomes one output row, with American and decimal prices computed for both.
- Rows are pushed to the dataset as they're found, up to your
maxItemscap (if set).
How much does it cost to scrape sports betting odds?
Sports Betting Odds Scraper uses Pay-Per-Event (PPE) pricing — you're charged per odds row returned, not per compute unit, so cost scales directly with the data you get.
| Event | Price per event | Price per 1,000 |
|---|---|---|
| Odds row scraped | $0.0021 – $0.0025 | $2.10 – $2.50 (varies by plan: Free $2.50, Bronze $2.40, Silver $2.30, Gold $2.10) |
A typical NFL game with one bookmaker and all three markets (moneyline, spread, totals) is about 6 rows — under $0.02. Scraping a full Sunday slate across every bookmaker ESPN surfaces usually costs a few dollars. Every Apify account includes free platform credits to try it before you commit.
Is it legal to scrape sports betting odds?
Yes — this Actor only reads publicly available odds data, the same information visible on public sports and odds pages, without logging into any account or bypassing paywalls. Scraping publicly accessible data is generally legal, but you're responsible for how you use the data and for complying with the target sites' terms of service. See the Apify blog on web scraping legality for more.
Other sports scrapers from ParseBird
- Flashscore Live Football Matches — live scores, match events, stats, and lineups for football matches.
- UFC Scraper — fighter profiles, event fight cards, and division rankings from UFC.com.
FAQ
How fresh is the odds data?
Every run fetches odds live at request time — there's no caching. The fetchedAt field on each row records exactly when it was scraped.
Which bookmaker does the data come from?
Lines are sourced from the sportsbook partner(s) available for each event and league; the bookmaker field tells you which one produced each row. Coverage and the number of bookmakers per event varies by league and event — major US leagues typically have the deepest coverage.
Why don't some events have odds yet?
Bookmakers typically don't post lines until a few days before an event. Preseason, early-season, and far-future dates (via the dates range) commonly return zero rows for a given event until its line is posted — this is a data availability limit, not an error.
Why does PGA Tour return few or no rows?
PGA Tour events are field-based tournaments (dozens of players), not head-to-head matchups, so the h2h/spreads/totals market structure this Actor uses doesn't apply the same way it does to team sports. pga is included for completeness but coverage is limited.
Can I get odds for a specific past or future date?
Yes — set dates to YYYYMMDD for one day or YYYYMMDD-YYYYMMDD for a range, in UTC.
Can I schedule recurring runs? Yes. Use Apify's Scheduler to run this Actor daily, hourly, or at any interval, and combine it with webhooks or integrations to push fresh odds wherever you need them.
Does this work with the Apify API and integrations? Yes — every input parameter is available via the API, and the Actor connects to Make, Zapier, n8n, Google Sheets, and more.
I found a bug or a league that's not covered — what do I do? Open an issue on the Actor's Issues tab with the league and date you ran — reports are addressed quickly.