RotoWire Odds Scraper - Lines, Props & Futures avatar

RotoWire Odds Scraper - Lines, Props & Futures

Pricing

from $6.22 / 1,000 game rows

Go to Apify Store
RotoWire Odds Scraper - Lines, Props & Futures

RotoWire Odds Scraper - Lines, Props & Futures

Scrape RotoWire betting odds across 10 sports. Moneyline, spread and totals from nine sportsbooks per game, plus player props, full market breakdowns, injury reports, futures, and computed hold, fair probability and arbitrage.

Pricing

from $6.22 / 1,000 game rows

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

ParseForge

RotoWire Odds Scraper - Lines, Props & Futures

Scrape RotoWire's betting odds across 10 sports. Every game comes with moneyline, spread and total from up to nine sportsbooks side by side, RotoWire's own de-vigged win percentages and projected scores, plus optional player props, full market breakdowns, injury reports and futures. No login, no API key, no proxy. Export to CSV, JSON, Excel, or XML.

RotoWire publishes what most odds feeds charge for: every book it tracks quoted on the same game, in one table, with a fair-probability column already computed. This reads those tables directly and returns each game as one row with every quoting book nested under it. Measured live: nine books on an MLB slate, eight on NFL week 1, where Fanatics had not yet posted.

Who uses itWhat they scrape RotoWire for
Bettors and handicappersLine shopping across every book at once, instead of opening nine tabs
Odds-comparison sitesA nine-book price grid per game, refreshed on a schedule
Quants and modellersDe-vigged probabilities and projected scores as model inputs
Affiliate and media teamsSuper Bowl, conference and award futures for odds pages
Arbitrage and +EV toolsCross-book price gaps, with the arbitrage check already run

What it does

This Actor reads RotoWire's betting tables and returns each game, fight or tournament entry as one row. Every game row carries:

  • 🏟️ Game identity: teams, abbreviations, logos, start time, day, week or slate date, and the RotoWire URL.
  • 💰 Up to nine sportsbooks per game: DraftKings, FanDuel, BetMGM, Caesars, BetRivers, Hard Rock, Fanatics, theScore and Circa Sports, each with moneyline, spread and total. booksQuoting says how many priced that particular game.
  • 📐 Every price restated: American odds, decimal odds, implied probability and profit per $100, so you never convert by hand.
  • 🎯 RotoWire's own model: de-vigged win percentage, cover percentage and over/under percentage per side, plus a projected score.
  • 🥇 Best price across books: which book has the best moneyline, spread and total, and at what number.
  • 🧮 Optional analytics: bookmaker hold per book, fair probability, what line shopping is worth in basis points, and a cross-book arbitrage check with the stake split.
  • 📋 Optional depth: every market RotoWire lists for the game, player props, both teams' injury reports, and futures.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

Sports covered

SportSlate is keyed byMarket breakdownPlayer propsFutures
NFLWeekYesYesYes
College Football (NCAAF)WeekYesYes
NBADateYesYes
College Basketball (NCAAB)DateYesYes
MLBDateYesYes
NHLDateYesYes
WNBADateYesYes
Soccer — 11 competitionsDate + leagueYes
Golf (PGA)EventYes
MMA (UFC)EventYes

Soccer covers the Premier League, Championship, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, Europa League, Super Cup and the World Cup.

Leave the slate fields empty and each sport uses the slate RotoWire is currently showing — the next date or week with games on it, not simply today. That makes a scheduled run self-maintaining.

What you can do with RotoWire odds

🥇 Shop every line across every book.

Every game row already carries each quoting book plus a best block naming which one has the best number on each side. Sort by lineShopping.shoppingGainBps to see where shopping is actually worth something.

🧮 Measure the vig, and find the sharp book.

The line-shopping block computes each book's hold on the moneyline. Across NFL week 1, Circa Sports came out lowest in 12 of 16 games, at a mean hold of 3.55% against BetRivers' 5.43% — the kind of comparison a sharp bettor pays for, computed on every row.

⚖️ Screen for arbitrage.

Turn on onlyArbitrage and the run keeps only games where the best price on each side, across every quoting book, guarantees a profit — with the stake split already worked out.

🏆 Build a futures page.

Turn on futures and get Super Bowl, conference, division, win-total, playoff and award markets, one row per book quote, ready to drop into an odds table.

🎯 Pull NFL player props at scale.

Turn on props and each NFL game brings back every prop RotoWire lists — passing, rushing, receiving, touchdown scorers — with each book's price. How many depends on how close kickoff is: across one NFL week we measured 10 to 20 props on distant games and 131 and 153 on the two imminent ones.

Why choose this scraper

What you get
Every book, in one rowNot one book, not an unnamed aggregate. Up to nine named books quoted on the same game, in one row, with booksQuoting telling you how many.
No login or API keyRotoWire's betting tables are public. Nothing to authenticate, nothing to expire.
No proxy costIt ran clean from a plain datacenter IP, so no proxy is configured and no proxy line hits your bill.
Fair probability includedRotoWire's de-vigged win percentage per side, plus our own no-vig calculation from the best prices.
Arbitrage already checkedThe cross-book arbitrage test and stake split are computed for you, not left as an exercise.
Slate defaults itselfLeave the date blank and it picks up whatever slate RotoWire is showing. Schedule it and forget it.
Opt-in extras, off by defaultMarket breakdowns, props, injuries, futures and analytics are five separate checkboxes. Leave them off and you are never billed for them.
Filters that cut before billingPrice bands, spread and total ranges, team lists and time windows run before anything is written, so filtered-out games cost nothing.

How it compares

Be clear about the trade-off before you pick this one.

This Actor reads RotoWire, not the sportsbooks themselves. RotoWire refreshes its tables on its own schedule, so these are near-live prices rather than tick-by-tick book feeds. If you need sub-second line movement straight from a book's own API, a single-book scraper will serve you better. What you get instead is every book RotoWire tracks normalised into one row, with the fair-probability and best-price work already done.

FeatureParseForgescrapemintzhorexharvest
Up to nine named books in one game rowYesPartialPartialPartial
De-vigged win probability per sideYesNoPaid extraNo
Cross-book arbitrage check + stake splitYesNoPaid extraNo
Bookmaker hold per bookYesNoNoNo
Player propsOptionalNoPaid extraNo
Futures marketsOptionalNoNoNo
Team injury reportsOptionalNoNoNo
Price per 1,000 game rows$7.00$12.00$10.00$5.00
Price per 1,000 player propsIncluded in the per-game rate$50.00

We sit mid-market on the headline rate and well under the field on the extras: zhorex bills player props and fair-odds enrichment at $50 per 1,000 each, where both are folded into this Actor's per-game price or offered as a cheap checkbox.

What a game row looks like

Every game returns as one JSON row. Here is a real record with seven of the nine books trimmed out:

{
"resultType": "game",
"sport": "mlb",
"sportName": "MLB",
"gameId": "2940857",
"url": "https://www.rotowire.com/betting/mlb/game/detroit-tigers-vs-tampa-bay-rays-odds-2026-08-25-2940857",
"matchup": "TB @ DET",
"startTime": "2026-08-25T18:40:00",
"startTimeEastern": "2026-08-25 18:40:00",
"startDate": "2026-08-25",
"dayOfWeek": "TUE",
"startTimeLabel": "Aug 25 6:40pm",
"home": {
"abbr": "DET", "name": "Detroit Tigers", "nickname": "Tigers",
"logo": "https://assets.rotowire.com/images/teamlogo/baseball/100DET.png?v=8",
"projectedScore": 3.5
},
"away": {
"abbr": "TB", "name": "Tampa Bay Rays", "nickname": "Rays",
"logo": "https://assets.rotowire.com/images/teamlogo/baseball/100TB.png?v=8",
"projectedScore": 4.2
},
"odds": {
"draftkings": {
"bookName": "DraftKings",
"moneyline": {
"home": 116, "away": -125,
"homeDecimal": 2.16, "awayDecimal": 1.8,
"homeImpliedProbability": 0.46296, "awayImpliedProbability": 0.55556,
"homeWinPercent": 45.5, "awayWinPercent": 54.5,
"homePayoutPer100": 116, "awayPayoutPer100": 80
},
"spread": {
"home": 1.5, "away": -1.5,
"homePrice": -157, "awayPrice": 130,
"homeCoverPercent": 58.4, "awayCoverPercent": 41.6
},
"total": {
"points": 7.5, "overPrice": -105, "underPrice": -114,
"overPercent": 49, "underPercent": 51
},
"projectedScore": { "home": 3.5, "away": 4.2 },
"offers": { "moneyline": true, "spread": true, "total": true, "otherMarkets": true }
}
},
"best": {
"moneyline": {
"home": { "price": 117, "book": "betrivers" },
"away": { "price": -125, "book": "draftkings" }
},
"spread": {
"home": { "line": 1.5, "price": -150, "book": "hardrock" },
"away": { "line": -1.5, "price": 140, "book": "hardrock" }
},
"total": {
"over": { "points": 7.5, "price": 100, "book": "hardrock" },
"under": { "points": 7.5, "price": -110, "book": "hardrock" }
}
},
"booksQuoting": 9,
"hasMoneyline": true,
"hasSpread": true,
"hasTotal": true,
"scrapedAt": "2026-08-25T16:20:11.402Z"
}

With Add line-shopping analytics on, each row also carries:

{
"lineShopping": {
"booksQuotingMoneyline": 8,
"moneylineHoldByBook": {
"draftkings": 4.286, "fanduel": 4.154, "mgm": 4.733, "caesars": 4.127,
"betrivers": 5.128, "hardrock": 3.979, "thescore": 3.979, "circasports": 3.253
},
"lowestMoneylineHoldPercent": 3.253,
"averageMoneylineHoldPercent": 4.205,
"fairProbability": { "home": 0.63012, "away": 0.36988 },
"shoppingGainBps": {
"moneylineHome": 370.4, "moneylineAway": 600,
"spreadHome": 314.5, "spreadAway": 301.5,
"over": 443, "under": 443
},
"arbitrage": {
"moneyline": { "exists": false, "roiPercent": -1.982, "stakeSplit": null },
"total": { "exists": false, "roiPercent": -2.381, "stakeSplit": null }
}
}
}

Golf returns one row per golfer with outright, top-5, top-20, round-leader and make-cut markets. MMA returns one row per fight with both fighters and every method-of-victory market — decision, KO, submission, round-by-round and whether it goes the distance. Futures return one row per book quote, with the market, the selection and the price.

Configure the run

Pick your sports, and optionally the slate. Everything else is a filter or a checkbox. The Input tab lists every parameter.

Tonight's MLB slate, nine books per game:

{ "sports": ["mlb"], "maxItems": 200 }

NFL week 1 with player props, injuries and the analytics block:

{
"sports": ["nfl"], "weeks": ["1"],
"includePlayerProps": true, "includeTeamInjuries": true, "includeLineShopping": true,
"maxItems": 50
}

Only close games with a big total, across two sports:

{
"sports": ["nba", "college-basketball"],
"maxSpread": 3, "minTotal": 220, "onlyWithOdds": true
}

Hunt for cross-book arbitrage:

{ "sports": ["mlb", "nhl"], "onlyArbitrage": true, "maxItems": 500 }

Super Bowl and conference futures, DraftKings and FanDuel only:

{ "sports": ["nfl"], "includeFutures": true, "sportsbooks": ["draftkings", "fanduel"] }

Premier League and MLS on one date:

{ "sports": ["soccer"], "soccerLeagues": ["epl", "mls"], "dates": ["2026-08-29"] }

Filters run on the complete row before the optional blocks are trimmed off, so you can filter on a market you did not buy — screen by total points without paying for the analytics column.

Pricing

Pay-per-event. You are billed per row written, plus a small charge for each slate page fetched and a $0.054 run-start fee. Filtered-out games cost nothing.

EventPriceWhen it fires
Run start$0.054Once per run
Slate scan$0.010Each listing page fetched — one per date, week, soccer league or futures page
Game row$0.007Each game, fight or golfer row written
Market breakdown$0.012Only with Add the full market breakdown on, once per game
Player props$0.020Only with Add player props on, once per game
Team injuries$0.004Only with Add team injury reports on, once per team, reused across that team's games
Futures row$0.002Only with Add futures markets on, per book quote written
Line-shopping analytics$0.002Only with Add line-shopping analytics on, per row
Game rows collectedApproximate cost
100$0.77
1,000$7.12
10,000$70.75

The five optional events are off by default. A run that leaves them off pays only the run-start fee, one slate scan per page, and $0.007 per game row.

Why $7 per 1,000 and not $1. Measured on the platform, this Actor's own cost per 1,000 rows is a fraction of a cent — it is HTTP-only with no proxy and no browser. We price on what the row is worth rather than what it costs us: every quoting book, both sides, three markets, de-vigged probabilities and best-price attribution in a single row. Two competitors sit above us at $10 and $12, one below at $5, and the closest thing to our analytics block is billed elsewhere at $50 per 1,000.

Free users

Free-plan runs return up to 25 rows as a preview. Upgrade your Apify plan to collect the full slate.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the RotoWire Odds Scraper.
  3. Pick your sports, 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.

Use with AI agents (MCP)

Give an AI agent live access to nine-book betting 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/rotowire-scraper"

Then prompt it in plain language:

  • "Pull tonight's MLB slate and tell me which book has the best price on each underdog."
  • "Get NFL week 1 with the analytics block and list any game where the books disagree by more than 400 basis points."
  • "Fetch Super Bowl futures and show me the best price on each team across all books."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/rotowire-scraper" to collect betting odds from RotoWire. Input: { "sports": ["nfl","nba","mlb","nhl","wnba","soccer","college-football","college-basketball","golf","mma"], "dates": ["YYYY-MM-DD"], "weeks": ["1"], "includeLineShopping": true, "maxItems": <n> }. Each row is one game with every quoting sportsbook nested under it — moneyline, spread and total, in American and decimal odds, with implied and de-vigged probabilities and the best price per side. Optional blocks add player props, full market breakdowns, injury reports and futures. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why did I get no rows?

The sport is probably between seasons. RotoWire only publishes a slate when there are games on it — the NBA and NHL tables return nothing in August. The log says so explicitly. Pass an explicit dates or weeks value to reach a slate that has games.

Why are some books missing from a game?

Not every book prices every game. booksQuoting tells you how many did, and minBooksQuoting filters out thin markets. Fanatics is the usual absentee: it priced every MLB game and almost every golfer we measured, and none of NFL week 1.

Why does a fight only have a moneyline?

RotoWire prices method-of-victory markets on main-card fights and leaves preliminary fights at moneyline only. Main events come back with all eleven markets.

Why is makeCut missing from a golf event?

Tournaments with no cut — the TOUR Championship, for one — have no make-cut market to quote.

Can I filter which sportsbook gets fetched?

No. RotoWire ignores a book parameter on its own endpoints — we measured it returning a byte-identical response — so sportsbooks trims the row after the fetch. It makes the output narrower, not the run cheaper.

Why fewer rows than I asked for?

Your filters removed them, the slate is smaller than your maxItems, or you are on the free plan, which stops at 25 rows. The log says which.

A run stopped early.

It hit the run timeout and wrote what it had rather than being killed with rows in memory. Narrow the sports or the slate, or raise the timeout.

FAQ

QuestionAnswer
Do I need a RotoWire account or subscription?No. The betting tables this Actor reads are public.
Do I need a proxy?No. It ran clean from a plain datacenter IP, so no proxy is configured and none is billed.
How many sportsbooks does it return?Up to nine: DraftKings, FanDuel, BetMGM, Caesars, BetRivers, Hard Rock, Fanatics, theScore and Circa Sports. Only the books that priced a given game appear on its row.
Are these live odds?They are RotoWire's published prices, refreshed on RotoWire's schedule. Near-live, not tick-by-tick.
Can I get historical odds?Only as far back as RotoWire still serves a slate for that date. It is not an archive.
Does it cover college sports?Yes, both college football and college basketball, keyed by week and date respectively.
Does it do player props?Yes, on NFL, as an opt-in checkbox. Counts grow as kickoff nears: 10-20 per game a fortnight out, over 150 on an imminent game. RotoWire publishes props for no other sport.
What is the arbitrage check?It takes the best price on each side across every book quoting the game and tests whether the implied probabilities sum below 100%. When they do, you get the ROI and the stake split.
Is tennis supported?No. RotoWire has a tennis betting page but its table returned no matches on any date we probed, so we left it out rather than ship a dead option.
How many rows per run?Free plan: 25. Paid: as many as the slates you select contain.
Is this an official RotoWire product?No. It is unofficial and reads only public RotoWire pages.

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 RotoWire or any sportsbook named in its output. It collects only publicly available data. Odds are informational and are not betting advice; you are responsible for complying with RotoWire's terms, with applicable gambling law in your jurisdiction, and with data-protection law including GDPR and CCPA.