Bovada Odds Scraper - Lines, Props, Futures & Live Scores avatar

Bovada Odds Scraper - Lines, Props, Futures & Live Scores

Pricing

from $7.10 / 1,000 event odds rows

Go to Apify Store
Bovada Odds Scraper - Lines, Props, Futures & Live Scores

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

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

ParseForge

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 itWhat they scrape Bovada for
Odds comparison sitesA full sportsbook price sheet, refreshed on a schedule
Arbitrage and +EV bettorsVig-free fair prices to screen against other books
Sports data teamsHistorical closing lines built from repeated runs
Quants and modellersMarket-implied probabilities as model features
Affiliates and tipstersLive 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 notes field 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, everNo account, no cookies, no session to keep alive. Nothing to get banned.
No proxy costBovada's public endpoints answer this Actor directly, so there is no proxy line on your bill.
All 25 sportsFootball, 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 lineOne NBA game with its three main markets costs one event, not six outcomes.
Three odds formats standardAmerican, decimal and fractional on every price, with Hong Kong, Malay and Indonesian available.
Maths the book does not showImplied 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 defaultAlternate 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 billingDate 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.

FeatureParseForgescrapemintautomation-lab
Works with no login or cookiesYesYesYes
SourceBovadaMulti-bookBovada
Sports coveredAll 25NFL, NBA, WNBA, MLB, NHL, UFC, college, top soccerNot stated
Pre-match oddsYesYesYes
In-play (live) oddsYesNo, pregame onlyYes
Futures and outright marketsOptionalNoYes
Alternate linesOptionalNot statedNot stated
Player and game propsOptionalNot statedNot stated
Live scores and game clockOptionalNot statedNot stated
Implied probability, hold, vig-free priceOptionalNot statedNot stated
Line movement vs previous runOptionalSeparate ActorNot stated
Billing unitPer eventPer odds linePer item
18-game NBA slate, main markets$0.19~$1.30Price 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

GroupFields
IdentityeventId, url, eventPath, description, eventType, isFutures
Classificationsport, sportCode, league, leagueId, leaguePath, region, breadcrumb, competitionId
TimingstartTime, startTimestamp, hoursUntilStart, lastModified, scrapedAt
Statestatus, statusLabel, isLive, hasStreaming, availableSGP, teaserAllowed, denySameGame
TeamshomeTeam, awayTeam, homeTeamShort, awayTeamShort, homeCompetitorId, awayCompetitorId, awayTeamFirst, competitorCount, competitors[]
Headline oddsmoneylineHome, moneylineAway, moneylineDraw, moneylineHomeDecimal, moneylineAwayDecimal, spreadHome, spreadHomeOdds, spreadAway, spreadAwayOdds, totalPoints, totalOverOdds, totalUnderOdds
CountsmarketsAdvertised, marketsReturned, outcomesReturned, displayGroups
Per marketmarketId, description, key, descriptionKey, marketTypeId, status, block, displayGroup, isAlternate, singleOnly, availableSGP, notes, periodId, period, periodAbbreviation, isLivePeriod, isMainPeriod, outcomeCount
Per outcomeoutcomeId, 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.

EventPriceWhen it fires
Run start$0.054Once per run
League scan$0.004Each league or sport coupon opened
Event odds row$0.007Each event row written
Futures book$0.006Each futures coupon opened, with Include futures on
Alternate lines$0.004Only with Alternate lines on, and only when the event has them
Prop markets$0.005Only with Prop markets on, and only when the event has them
Live score$0.003Only with Live scores on, and only when Bovada's scoreboard actually returns data for that event
Value metrics$0.002Only with Value metrics on, per event
Line movement$0.003Only with Line movement on, per event compared
Odds row (tidy)$0.0005Only with one row per outcome on, per extra row
Events collectedApproximate 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

  1. Create a free Apify account with $5 in credit.
  2. Open the Bovada Odds Scraper.
  3. Enter a league path such as /football/nfl, add any filters, and click Start.
  4. 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

QuestionAnswer
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.

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.