Bovada Odds Scraper - Lines, Props, Futures & Live Scores
Pricing
from $7.10 / 1,000 event odds rows
Bovada Odds Scraper - Lines, Props, Futures & Live Scores
Scrape Bovada sportsbook odds across 25 sports: moneylines, spreads, totals, alternate lines, props, futures and live scores. American, decimal and fractional prices, plus implied probability, vig and fair price. No login, no proxy.
Pricing
from $7.10 / 1,000 event odds rows
Rating
0.0
(0)
Developer
ParseForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Bovada Odds Scraper - Lines, Props, Futures & Live Scores
Scrape Bovada sportsbook odds across all 25 sports. Moneylines, spreads, totals, alternate lines, player props, futures and live scores, each event returned as one flat row with American, decimal and fractional prices. No login, no API key, no cookies, and no proxy. Export to CSV, JSON, Excel, or XML.
Bovada publishes no odds API and no data feed. This reads the same public endpoints the bovada.lv site itself calls, and adds the numbers the site never shows you: implied probability, the book's hold, and the vig-free fair price on every market.
Point it at NFL betting lines, NBA betting lines, soccer, MLB, NHL, tennis, UFC or any of the other 25 sports Bovada prices, and every event comes back as one row you can sort, filter and export.
| Who uses it | What they scrape Bovada for |
|---|---|
| Odds comparison sites | A full sportsbook price sheet, refreshed on a schedule |
| Arbitrage and +EV bettors | Vig-free fair prices to screen against other books |
| Sports data teams | Historical closing lines built from repeated runs |
| Quants and modellers | Market-implied probabilities as model features |
| Affiliates and tipsters | Live lines for pages, alerts, and newsletters |
What it does
This Actor collects Bovada's public betting markets and returns each event as one flat row. Point it at a league, a whole sport, a Bovada URL, or ask for every in-play game at once. Every row carries:
- 🏷️ Event identity: Bovada event ID, URL, description, sport, league, region, competition ID, and the full breadcrumb.
- ⏱️ Timing: kickoff as ISO and epoch, hours until start, and Bovada's own last-modified stamp so you can tell a stale price from a fresh one.
- 🏟️ Teams: home and away names, short names, and competitor IDs, with the home/away flag resolved for you.
- 💵 Headline numbers as sortable columns: moneyline home/away/draw, spread and its price, total and its over/under prices.
- 📊 Every market Bovada serves: ID, name, key, market type, period, status, same-game-parlay flag, and each outcome with American, decimal and fractional odds plus the handicap.
- 📜 Settlement rules where Bovada publishes them: the
notesfield carries the small print on props and propositions — "Settles Yes if Canada officially postpones…", "Must fight in 2026 for action". - 🎯 Flags that matter: live (Bovada's in-play-betting flag), streaming available, SGP-eligible, teaser-allowed, and per-market and per-outcome open/suspended status.
- 🧮 Value metrics (optional): a built-in odds converter and vig calculator on every price — implied probability, the book's hold and vig, vig-free probabilities, break-even fair price, and Hong Kong / Malay / Indonesian formats alongside the standard three.
- 🔴 Live scores (optional): current score, period, game clock, and the score of every period already played, where Bovada's scoreboard covers the event.
- 📈 Line movement (optional): what each price was on the previous run and how far it moved.
Results export to CSV, JSON, Excel, or XML, or stream from the API.
What you can do with Bovada data
⚖️ Find arbitrage and positive-EV bets.
Switch on value metrics and every outcome arrives with its vig-free fair price. Compare that against another book's number and the edge is a subtraction, not a spreadsheet formula.
📉 Build your own closing-line history.
Bovada publishes no historical odds. Run this on a schedule and each run stamps lastModified and scrapedAt; switch on line movement and each run also reports the delta against the previous one.
🔍 Price a whole slate at once.
One run over /football/nfl returns every game with moneyline, spread and total already lifted into columns you can sort in the dataset preview.
🏆 Track futures all season.
Championship winners, conference and division odds, cup-group winners, most-regular-season-wins and make-the-playoffs markets — verified on Bovada's NBA board, with up to 30 priced outcomes on a single row.
🔴 Watch in-play games.
Ask for live events only and pair them with live scores to see the price and the scoreboard in the same row.
Why choose this scraper
| What you get | |
|---|---|
| No login, ever | No account, no cookies, no session to keep alive. Nothing to get banned. |
| No proxy cost | Bovada's public endpoints answer this Actor directly, so there is no proxy line on your bill. |
| All 25 sports | Football, soccer, basketball, baseball, hockey, tennis, UFC/MMA, golf, boxing, cricket, esports, table tennis, darts, snooker, motor sports, politics, entertainment and the rest. |
| Priced per event, not per line | One NBA game with its three main markets costs one event, not six outcomes. |
| Three odds formats standard | American, decimal and fractional on every price, with Hong Kong, Malay and Indonesian available. |
| Maths the book does not show | Implied probability, hold, vig, and the vig-free fair price per market — an odds converter and vig calculator built into every row. |
| Opt-in extras, off by default | Alternate lines, props, live scores, value metrics, line movement and tidy rows are each a checkbox. Leave them off and you are never billed for them. |
| Filters that cut noise before billing | Date window, team, league, market, odds range, streaming and SGP. Only matching events are written and billed. |
How it compares
Be clear about the trade-off before you pick this one.
This Actor reads Bovada only. It is not a multi-book aggregator. If you need one row with five books' prices side by side, use an aggregator — and note that most of them carry Bovada as one of the books, priced per line.
The competing odds scrapers on Apify bill per odds line. This one bills per event, and an event carries every market and outcome it has. The table below compares on what each Actor publicly states it does — two of the three do not publish their input schema, so anything not stated is marked as such rather than guessed.
| Feature | ParseForge | scrapemint | automation-lab |
|---|---|---|---|
| Works with no login or cookies | Yes | Yes | Yes |
| Source | Bovada | Multi-book | Bovada |
| Sports covered | All 25 | NFL, NBA, WNBA, MLB, NHL, UFC, college, top soccer | Not stated |
| Pre-match odds | Yes | Yes | Yes |
| In-play (live) odds | Yes | No, pregame only | Yes |
| Futures and outright markets | Optional | No | Yes |
| Alternate lines | Optional | Not stated | Not stated |
| Player and game props | Optional | Not stated | Not stated |
| Live scores and game clock | Optional | Not stated | Not stated |
| Implied probability, hold, vig-free price | Optional | Not stated | Not stated |
| Line movement vs previous run | Optional | Separate Actor | Not stated |
| Billing unit | Per event | Per odds line | Per item |
| 18-game NBA slate, main markets | $0.19 | ~$1.30 | Price not published |
Priced on the published rates: 18 events at $0.007 plus the run-start fee and one league scan, against 108 odds lines at $0.012. The per-event unit is what makes the difference — the gap widens on props, where one MLB game alone carries 120 markets and would be 120 lines elsewhere.
Where they may beat us. scrapemint returns several books in one normalized schema; if you want cross-book comparison in a single dataset without joining runs, that is a real advantage this Actor does not offer.
What a Bovada event looks like
Every event returns as one flat JSON row. Here is a real record, markets and competitors trimmed to one each:
{"eventId": "25568702","url": "https://www.bovada.lv/football/nfl/new-england-patriots-seattle-seahawks-202609092020","description": "New England Patriots @ Seattle Seahawks","eventType": "game","sport": "Football","league": "NFL","leagueId": "241","breadcrumb": ["Football", "NFL"],"startTime": "2026-09-10T00:20:00.000Z","startTimestamp": 1788999600,"hoursUntilStart": 367.76,"lastModified": "2026-08-25T09:50:54.114Z","status": "U","statusLabel": "upcoming","isLive": false,"hasStreaming": false,"availableSGP": true,"teaserAllowed": true,"homeTeam": "Seattle Seahawks","awayTeam": "New England Patriots","homeTeamShort": "Seahawks","awayTeamShort": "Patriots","marketsAdvertised": 65,"marketsReturned": 3,"outcomesReturned": 6,"displayGroups": ["Game Lines"],"moneylineHome": "-185","moneylineAway": "+160","moneylineHomeDecimal": 1.5405,"spreadHome": -3.5,"spreadHomeOdds": "-110","totalPoints": 44.5,"totalOverOdds": "-105","totalUnderOdds": "-115","markets": [{"marketId": "496075082","description": "Point Spread","key": "2W-HCAP","period": "Game","status": "O","isAlternate": false,"availableSGP": true,"outcomeCount": 2,"overround": 1.047619,"holdPercent": 4.5454,"vigPercent": 4.7619,"outcomes": [{"outcomeId": "2290781944","description": "New England Patriots","side": "away","american": "-110","decimal": 1.9091,"fractional": "10/11","handicap": 3.5,"impliedProbability": 0.523809,"noVigProbability": 0.5,"fairDecimal": 2,"fairAmerican": 100,"hongKong": 0.9091,"malay": 0.9091,"indonesian": -1.1}]}],"scrapedAt": "2026-08-25T16:34:15.021Z"}
marketsAdvertised is Bovada's own count for the event and marketsReturned is what it actually served. The two differ when Bovada advertises markets it does not publish to logged-out clients, or when you left an optional block switched off. Both numbers are on every row so you always know which you are looking at.
Every field you get
| Group | Fields |
|---|---|
| Identity | eventId, url, eventPath, description, eventType, isFutures |
| Classification | sport, sportCode, league, leagueId, leaguePath, region, breadcrumb, competitionId |
| Timing | startTime, startTimestamp, hoursUntilStart, lastModified, scrapedAt |
| State | status, statusLabel, isLive, hasStreaming, availableSGP, teaserAllowed, denySameGame |
| Teams | homeTeam, awayTeam, homeTeamShort, awayTeamShort, homeCompetitorId, awayCompetitorId, awayTeamFirst, competitorCount, competitors[] |
| Headline odds | moneylineHome, moneylineAway, moneylineDraw, moneylineHomeDecimal, moneylineAwayDecimal, spreadHome, spreadHomeOdds, spreadAway, spreadAwayOdds, totalPoints, totalOverOdds, totalUnderOdds |
| Counts | marketsAdvertised, marketsReturned, outcomesReturned, displayGroups |
| Per market | marketId, description, key, descriptionKey, marketTypeId, status, block, displayGroup, isAlternate, singleOnly, availableSGP, notes, periodId, period, periodAbbreviation, isLivePeriod, isMainPeriod, outcomeCount |
| Per outcome | outcomeId, description, status, type, side, competitorId, american, decimal, fractional, handicap |
| Value metrics (optional) | overround, holdPercent, vigPercent per market; impliedProbability, noVigProbability, fairDecimal, fairAmerican, hongKong, malay, indonesian per outcome |
| Live score (optional) | homeScore, awayScore, gameStatus, hasStarted, isFinal, period, periodNumber, gameClock, clockSeconds, clockIsTicking, numberOfPeriods, currentPeriodHome, currentPeriodAway, periodScores[], scoreUpdatedAt, sportDetails |
| Line movement (optional) | lineMovement[] with market, outcome, previousAmerican, currentAmerican, deltaAmerican, previousSeenAt; plus lineMovementCount |
Configure the run
Drive the Actor from four source types, alone or together: leaguePaths, sports, startUrls, and scrapeAllLive. Filters run against the complete event before optional blocks are trimmed, so you can filter on prop odds without paying for the prop block. The Input tab lists every parameter.
A full NFL and NBA slate with the main markets:
{ "leaguePaths": ["/football/nfl", "/basketball/nba"], "maxEvents": 100 }
One MLB game sheet with every prop, priced for value:
{ "leaguePaths": ["/baseball/mlb"], "includePropMarkets": true, "includeAlternateLines": true, "includeValueMetrics": true, "maxEvents": 15 }
Every in-play event across all sports, with the scoreboard, skipping the simulated feeds:
{ "scrapeAllLive": true, "eventStatus": "live", "includeLiveScores": true, "excludeKeywords": ["eFootball", "eBasketball", "MERLIN"], "maxEvents": 200 }
NBA futures and season props, every priced outcome:
{ "leaguePaths": ["/basketball/nba-futures"], "includeFutures": true, "includeValueMetrics": true }
This weekend's soccer only, big underdogs, in tidy one-row-per-outcome form:
{ "sports": ["/soccer"], "startsBefore": "3d", "minAmericanOdds": 300, "outputOddsRows": true, "maxEvents": 300 }
Track how the NFL board moves, run on a schedule:
{ "leaguePaths": ["/football/nfl"], "includeLineMovement": true, "maxEvents": 50 }
Pricing
Pay-per-event. You are billed per event row written, plus a $0.054 run-start fee and a small scan fee per league coupon opened. Filtered-out events cost nothing.
| Event | Price | When it fires |
|---|---|---|
| Run start | $0.054 | Once per run |
| League scan | $0.004 | Each league or sport coupon opened |
| Event odds row | $0.007 | Each event row written |
| Futures book | $0.006 | Each futures coupon opened, with Include futures on |
| Alternate lines | $0.004 | Only with Alternate lines on, and only when the event has them |
| Prop markets | $0.005 | Only with Prop markets on, and only when the event has them |
| Live score | $0.003 | Only with Live scores on, and only when Bovada's scoreboard actually returns data for that event |
| Value metrics | $0.002 | Only with Value metrics on, per event |
| Line movement | $0.003 | Only with Line movement on, per event compared |
| Odds row (tidy) | $0.0005 | Only with one row per outcome on, per extra row |
| Events collected | Approximate cost |
|---|---|
| 100 | $0.77 |
| 1,000 | $7.09 |
| 10,000 | $70.13 |
The seven optional events are off by default. A run that leaves them off pays the run-start fee, one scan per league, and $0.007 per event — nothing else.
One caution on tidy rows. outputOddsRows writes one row per outcome, and an event with props carries hundreds. Measured: fifteen MLB games with props and alternate lines on produced 10,606 tidy rows, adding $5.30 to a $5.63 run. Switch it on deliberately, and cap maxEvents when you do.
A note on whole-sport runs. Asking for a whole sport and the optional market blocks makes Bovada's coupon enormous — /soccer with every market attached is 55 MB. The Actor detects that and splits the sport into its leagues automatically, which is faster and cheaper, but it does mean one league scan per league rather than one for the sport.
Why we cost more than the per-line scrapers on some jobs. We are cheaper on main markets — an 18-game NBA slate runs $0.19 here against roughly $1.30 per-line — and we can cost more on a deep prop run, because we return markets they do not have at all. What the price buys is the whole board, the maths, and the scores, not a bigger row count.
Free users
Free-plan runs return up to 10 events as a preview. Upgrade your Apify plan to collect up to 100,000 events per run.
Run it
- Create a free Apify account with $5 in credit.
- Open the Bovada Odds Scraper.
- Enter a league path such as
/football/nfl, add any filters, and click Start. - Export the results as CSV, Excel, JSON, or XML from the Dataset tab.
Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python. Schedule it to build your own line history.
Use with AI agents (MCP)
Give an AI agent live access to sportsbook odds through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/bovada-scraper"
Then prompt it in plain language:
- "Pull tonight's NBA lines from Bovada and list the games where the book's hold is under 4%."
- "Get every NFL game this week with the spread, the total, and the vig-free fair price."
- "Which MLB batter props does Bovada price for tonight's games?"
Copy this into ChatGPT, Claude, or Cursor to start:
Use the Apify Actor "parseforge/bovada-scraper" to collect Bovada sportsbook odds. Input: { "leaguePaths": ["/football/nfl"], "maxEvents": <n>, "includeValueMetrics": true }. It returns one row per event with moneyline, spread and total lifted into columns, plus every market and outcome in American, decimal and fractional odds. Optional blocks: includeAlternateLines, includePropMarkets, includeLiveScores, includeValueMetrics, includeLineMovement, outputOddsRows, includeFutures. Call it with the ApifyClient and my APIFY_TOKEN.
Troubleshooting
Why am I getting no results?
Check the league path. /football/nfl is right; /nfl is not. Open the Bovada page in a browser and copy the path from the URL, or pass the whole URL in startUrls. Leagues out of season return an empty coupon — that is Bovada, not the Actor.
Why fewer events than I asked for?
Your filters removed them, or the league has fewer events on the board. startsBefore, minAmericanOdds and teamKeywords cut hard. The log prints how many events were scanned versus written.
Why is marketsReturned lower than marketsAdvertised?
Either an optional block is off — main markets only is the default — or Bovada advertises markets it does not serve to logged-out clients. Switch on alternate lines and props to get everything it does serve.
Why is a big soccer or tennis run slower than I expected?
Bovada serves no pagination and no date filter, so a large league arrives as one document. Game lines stay small — all 1,154 soccer events fit in 3.3 MB — but the full market set does not, which is why whole-sport requests are split into leagues when you switch the optional blocks on.
An event says isLive: true but has not started.
That is Bovada's own flag and it means in-play betting is enabled for the event, not that the ball is in play. Pair it with the live-score block and read hasStarted or gameStatus when you need the actual state of the game.
Why is liveScore empty on some rows?
Bovada's scoreboard is a separate service from the odds board, and a record only exists once an event is close to starting. Measured on the same afternoon: basketball, baseball and soccer — all with games that day — returned a scoreboard for 3 of 3 events, while NFL and NHL fixtures weeks out returned almost none, and cricket answered 404 outright. Rows with no scoreboard get a null liveScore and are not billed for the live-score event, so switching the block on out of season costs you nothing.
Why do I get no live events?
There may genuinely be none. Bovada's in-play board empties out in the quiet hours; the same request returns 148 events at a busy hour and zero at a dead one. Run it against eventStatus: "all" to confirm the league is alive.
Line movement reports nothing on the first run.
By design. The first run records the baseline and reports no movement; the second run onwards compares against it. It compares against the previous run of this Actor on your account, so keep the schedule steady.
A field stopped filling.
Bovada changed its response shape. Email us with your run ID if a column goes empty.
FAQ
| Question | Answer |
|---|---|
| Do I need a Bovada account? | No. It reads the public endpoints the bovada.lv site itself calls. |
| Do I need a proxy? | No. There is no proxy line on your bill. |
| Does Bovada have an official odds API? | No. There is no public feed and no developer programme, which is why this exists. |
| Which sports are covered? | All 25 Bovada lists, including politics and entertainment propositions. |
| Do I get player props? | Yes, where Bovada prices them, with Prop markets on. Measured: one MLB game carried 60 batter props, 14 pitcher props and 120 markets in total; soccer carried goalscorer, corners, cards and combo props; esports carried kill props; UFC fight props. |
| Do I get futures? | Yes, with Include futures on: championship, conference, division, season props and awards, with every priced outcome. |
| Can I get historical odds? | Not retroactively — Bovada publishes none. Schedule the Actor and you build your own history from that point on. |
What is holdPercent? | The book's cut on that market. Sum the implied probabilities of every outcome; the excess over 100% is the margin. |
| How fast is it? | On the platform: 400 soccer events with every market and value metrics took 155 seconds; 10 NFL and NHL games with main markets took under 5 seconds. |
| How many events per run? | Free plan: 10. Paid: up to 100,000, bounded by what Bovada has on the board. |
| Is this an official Bovada product? | No. It is unofficial and reads only public data. |
Related actors
- FanDuel Sportsbook Odds Scraper: the same job on FanDuel, for cross-book comparison.
- TheSportsDB Scraper: teams, players, fixtures and results to join onto your odds.
- Equibase Scraper: horse racing entries, results and past performances.
- Reddit Posts Scraper: posts from any subreddit, search, or URL.
Browse the full ParseForge collection for more scrapers.
🆘 Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.
⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Bovada. It collects only publicly available odds data and no personal data. Gambling laws differ by jurisdiction — you are responsible for using this data in compliance with Bovada's terms and the laws that apply to you. Nothing here is betting advice.
