Sports Odds Aggregator — Multi-Book Lines & Line-Shop avatar

Sports Odds Aggregator — Multi-Book Lines & Line-Shop

Pricing

from $0.015 / game odds record

Go to Apify Store
Sports Odds Aggregator — Multi-Book Lines & Line-Shop

Sports Odds Aggregator — Multi-Book Lines & Line-Shop

Live sports betting odds aggregated across DraftKings, Bovada, Pinnacle & FanDuel (no login/key): moneyline, spread, totals & player props for NFL, NBA, WNBA, MLB, NHL, college & soccer. Best-line line-shopping, implied & no-vig fair probabilities, and arbitrage detection.

Pricing

from $0.015 / game odds record

Rating

0.0

(0)

Developer

Yuliia Kulakova

Yuliia Kulakova

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Sports Odds Aggregator — 4-book lines with no-vig, best-line, arbitrage & line-movement

4-book lines (DraftKings, FanDuel, Bovada, Pinnacle) with no-vig, best-line, arbitrage & line-movement — no login.

Sports Odds Aggregator

Enjoying this Actor? If it's useful, please leave a ⭐️ rating and a short review — it genuinely helps. Something not working right? Open an issue on the Actor's Issues tab — I actively maintain this Actor and respond fast to fix problems and help you get things working.

Pull moneyline, spread and total plus player props for the same game across four independent sportsbooks, side by side, so you can line-shop for the best price, see de-vigged fair probabilities, and catch arbitrage — then track how those lines move over time.

Built for bettors doing line-shopping and value scanning, odds / analytics products that need a clean multi-book feed, and model builders who want fair (no-vig) probabilities and a sharp reference price (Pinnacle) as inputs.

This is a deep analytics aggregator across four real books — not a "one row per book" dump and not a claim to carry every book on the market. It carries the four books that are genuinely reachable without a login or paid API, and does the math on top of them properly. Read the Honest limitations section before you buy — book count and live odds are called out plainly.

No login. No paid third-party odds API. DraftKings, Bovada and Pinnacle are fully keyless and work with no proxy. FanDuel needs a US Apify proxy (a US datacenter proxy is enough) and is emitted as null with a warning when one isn't configured.


Key features

  • Four books, side by side per gameDraftKings (opening + closing lines), FanDuel (US proxy required), Bovada (largest US-facing offshore book), and Pinnacle — the low-margin sharp reference book used for fair-value anchoring.
  • Every price in three formatsAmerican, decimal and fractional are emitted on every outcome (american, decimal, fractional), plus impliedProbability. oddsFormat sets your display preference; all three are always present.
  • No-vig fair probabilities — de-vigged probabilities per book and a consensus, with the book margin (overroundPct). Pinnacle's low overround makes it a clean fair-value anchor.
  • Best line per outcome — the highest-payout book and price for each side (analytics.*.best), with isBestPrice flags in flat/rows output. This is the core of line-shopping.
  • Arbitrage detection — risk-free arb across books, 2-way (moneyline / total) and 3-way (soccer home / draw / away), with roiPct, invSum and the stake split per outcome.
  • Alternate-line ladders — full alternate spread/total ladders from Pinnacle under each book's alternateLines when includeAlternateLines is on (other books expose only the main line).
  • Line-movement monitoring — with monitoringMode, the actor persists last-seen prices in a named key-value store and attaches lineMovement[] (previousPrice, priceChange, moveDirection, firstSeenPrice) across scheduled runs — plus DraftKings opening vs closing lines.
  • Player props (Bovada) — over/under lines (passing / rushing / receiving / pitcher / batter, etc.), yes/no markets, and outright list markets such as Anytime Touchdown Scorer and First TD Scorer.
  • Edge-threshold filtersminArbPct and minBestEdgePct emit only games with a real arbitrage ROI or best-line edge vs the no-vig fair price.
  • 15+ leagues — NFL, NCAAF, NBA, WNBA, NCAAB, NCAAW, MLB, NHL, MMA, and top soccer (EPL, UEFA Champions League, UEFA Europa League, MLS, La Liga, Serie A, Bundesliga, Ligue 1).

Modes

ModeWhat you get
games (default)One record per upcoming game with every book's moneyline / spread / total side by side + best-line, no-vig and arbitrage analytics.
eventThe same rich record for a single game by eventId (from games output; optionally with playerProps attached).
player-propsOne record per player per stat market (Bovada): line, over/under (or yes/no, or outright) prices, and book margin.
best-lineLine-shopping view: per market/outcome, the best book & price, the full field, edge vs consensus, and the no-vig fair probability.

outputMode: "events" (default) keeps the nested per-game shape. outputMode: "rows" flattens games / event / best-line into one row per book × market × outcome (spreadsheet-friendly).


Supported sports / leagues

Keys follow the-odds-api convention; short aliases (nba, nfl, mlb, nhl, epl, ncaaw, uel, …) also work.

americanfootball_nfl, americanfootball_ncaaf, basketball_nba, basketball_wnba, basketball_ncaab, basketball_ncaaw, baseball_mlb, icehockey_nhl, mma_mixed_martial_arts, soccer_epl, soccer_uefa_champs_league, soccer_uefa_europa_league, soccer_usa_mls, soccer_spain_la_liga, soccer_italy_serie_a, soccer_germany_bundesliga, soccer_france_ligue_one.

Soccer moneyline is 3-way (home / draw / away) and arbitrage requires all three legs. Books are matched to the game schedule by normalized team names + date; a book that hasn't posted a game or market is returned as null — never faked.


Input

FieldTypeDefaultDescription
modestring enumgamesgames / event / player-props / best-line.
sportstring""Convenience single sport key (merged into sports).
sportsarray[]One or more sport/league keys. Empty + empty sportbaseball_mlb.
eventIdstring""Event id (the eventId from games output) for event mode.
eventIdsarray[]Multiple event ids for event mode.
booksarray[]Restrict to draftkings / bovada / pinnacle / fanduel. Empty = all available.
marketsarray[]Restrict to moneyline / spread / total. Empty = all.
oddsFormatstring enumamericanDisplay preference: american / decimal / fractional. All three are always emitted.
outputModestring enumeventsevents (nested per game) or rows (flat, one row per outcome).
lookAheadDaysinteger3Days ahead to include games (1–60). Auto-extends up to 60 days if the near window is empty (e.g. off-season).
includeStartedEventsbooleanfalseInclude in-progress / finished games (with live/final scores).
dateFromstring""YYYY-MM-DD lower bound (UTC). Overrides look-ahead when set.
dateTostring""YYYY-MM-DD upper bound (UTC).
playersarray[]player-props: keep only players whose name contains any of these.
statContainsarray[]player-props: keep only stats containing any of these (e.g. passing, rushing).
maxPropsPerEventinteger200Cap props read per game.
includePlayerPropsbooleanfalseevent mode: also attach the game's Bovada props under playerProps[].
computeBestLinebooleantrueBest (highest-payout) price per outcome + isBestPrice flags.
computeNoVigbooleantrueDe-vigged fair probabilities and the book margin per market.
computeArbitragebooleantrueDetect risk-free arbitrage across books (ROI% + stake split).
includeOpeningLinesbooleantrueInclude DraftKings opening lines alongside closing.
includeAlternateLinesbooleanfalseAttach full alternate spread/total ladders (Pinnacle) under each book's alternateLines.
monitoringModebooleanfalseTrack line movement across scheduled runs (named KV store) and attach lineMovement[].
minArbPctinteger0Only emit games whose best cross-book arbitrage ROI ≥ this % (0 = off).
minBestEdgePctinteger0Only emit games with a best-line edge vs the no-vig fair price ≥ this % (0 = off).
maxItemsinteger50Max output records for the whole run.
maxEventsPerSportinteger0Cap games per sport (0 = no cap).
pinnacleApiKeystring""Optional override of Pinnacle's built-in data key.
fanduelApiKeystring""Optional override of FanDuel's built-in data key.
proxyConfigurationobject{ "useApifyProxy": false }Optional for DK/Bovada/Pinnacle; required (US) for FanDuel. A US datacenter proxy suffices.

Example inputs

Games for one sport (keyless — 3 books; FanDuel needs a US proxy):

{ "mode": "games", "sport": "baseball_mlb", "maxItems": 10 }

Single event with player props attached:

{ "mode": "event", "sport": "americanfootball_nfl", "eventId": "401816790", "includePlayerProps": true }

Line-shopping / best-line across two sports:

{ "mode": "best-line", "sports": ["americanfootball_nfl", "basketball_nba"], "markets": ["moneyline", "total"], "maxItems": 100 }

All four books (FanDuel via US proxy) with alternate ladders and line-movement monitoring:

{
"mode": "games",
"sport": "americanfootball_nfl",
"includeAlternateLines": true,
"monitoringMode": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyCountry": "US" }
}

Output

Game record (games mode, events output — trimmed, real values)

{
"recordType": "game",
"sport": "baseball_mlb",
"league": "MLB",
"eventId": "401816790",
"eventName": "Toronto Blue Jays at Cleveland Guardians",
"startTime": "2026-09-03T17:10:00Z",
"startDate": "2026-09-03",
"homeTeam": { "displayName": "Cleveland Guardians", "abbreviation": "CLE" },
"awayTeam": { "displayName": "Toronto Blue Jays", "abbreviation": "TOR" },
"bookmakers": ["draftkings", "bovada", "fanduel", "pinnacle"],
"bookCount": 4,
"books": {
"draftkings": {
"moneyline": {
"home": { "american": -107, "decimal": 1.9346, "fractional": "100/107", "impliedProbability": 0.5169 },
"away": { "american": -112, "decimal": 1.8929, "fractional": "25/28", "impliedProbability": 0.5283 }
},
"total": { "line": 8, "over": { "american": -110 }, "under": { "american": -110 } },
"lastUpdated": "2026-09-03T09:19:24Z"
},
"bovada": { "moneyline": { "home": { "american": -110 }, "away": { "american": -110 } } },
"fanduel": { "moneyline": { "home": { "american": -108 }, "away": { "american": -108 } } },
"pinnacle": { "moneyline": { "home": { "american": -105 }, "away": { "american": -105 } } }
},
"analytics": {
"moneyline": {
"best": {
"home": { "book": "pinnacle", "american": -105, "decimal": 1.9524 },
"away": { "book": "pinnacle", "american": -105, "decimal": 1.9524 }
},
"consensusImplied": { "home": 0.5169, "away": 0.5283 },
"noVig": {
"draftkings": { "home": 0.4945, "away": 0.5055, "overroundPct": 4.52 },
"pinnacle": { "home": 0.5, "away": 0.5, "overroundPct": 2.44 }
},
"arbitrage": { "exists": false, "invSum": 1.0244 }
}
},
"scrapedAt": "2026-09-03T09:19:25Z"
}

When includeAlternateLines is on, Pinnacle's entry also carries "alternateLines": { "spread": [{ "line": 1, "isAlternate": true, "home": {…}, "away": {…} }], "total": [{ "line": 6.5, "isAlternate": true, "over": {…}, "under": {…} }] }. When monitoringMode is on, each game record also carries a lineMovement[] array (see fields below).

Player-prop record (player-props mode — field shape)

Props come from Bovada. propType is one of over-under, yes-no or outright; the price legs vary by type (over/under, yes/no, or a single price). Field names below are exact; the examples illustrate the record shape.

{
"recordType": "player-prop",
"sport": "americanfootball_nfl",
"league": "NFL",
"eventId": "401816790",
"eventName": "…",
"startTime": "…",
"book": "bovada",
"player": "Drake Maye",
"team": "NE",
"statGroup": "Passing Props",
"statType": "Passing Yards",
"propType": "over-under",
"line": 235.5,
"over": { "american": -115, "decimal": 1.8696, "fractional": "20/23", "impliedProbability": 0.5349 },
"under": { "american": -105, "decimal": 1.9524, "fractional": "20/21", "impliedProbability": 0.5122 },
"overroundPct": 4.71,
"scrapedAt": "…"
}

Outright list markets (e.g. Anytime Touchdown Scorer) emit one record per player with "propType": "outright" and a single "price": { "american": …, "decimal": …, "fractional": …, "impliedProbability": … } instead of over/under legs.

Field reference

Game / event record: recordType ("game"), sport, league, leagueName, eventId, eventName, shortName, startTime, startDate, status, state, completed, venue, homeTeam / awayTeam (displayName, shortName, abbreviation, nickname, id, logo), homeScore / awayScore, bookmakers (books that priced the game), bookCount, books, analytics, scrapedAt.

Per book (books.<book>): moneyline / spread / total (each price = american, decimal, fractional, impliedProbability; spread/total carry line and point), openingMoneyline / openingSpread / openingTotal (DraftKings only, with includeOpeningLines), alternateLines (Pinnacle, with includeAlternateLines), lastUpdated (real odds-fetch timestamp, never the start time).

Analytics: moneyline / spread / total, each with best ({ book, american, decimal } per outcome), line (spread/total), consensusImplied / consensusNoVig, noVig (per book, incl. overroundPct), and arbitrage (exists, roiPct, invSum, stake, books, ways).

lineMovement[] (monitoringMode): book, market, outcome, currentPrice, previousPrice, priceChange, moveDirection (lengthened / shortened / unchanged), firstSeenPrice, firstSeenAt, previousSeenAt.

Flat rows: recordType ("odds-row"), sport, league, eventId, eventName, homeTeam, awayTeam, startTime, book, market, outcome, team, point, priceAmerican, priceDecimal, priceFractional, impliedProbability, noVigProbability, isBestPrice, scrapedAt.

best-line: recordType ("best-line"), sport, league, eventId, eventName, startTime, homeTeam, awayTeam, market, line, outcomes[] (outcome, team, point, best, field[], consensusImplied, noVigProbability, edgePct), bookCount, arbitrage, scrapedAt.

player-prop: recordType ("player-prop"), sport, league, eventId, eventName, startTime, book, player, team, statGroup, statType, propType, line, overroundPct, scrapedAt, plus over/under (over-under), yes/no (yes-no), or price (outright).


Pricing

This actor uses pay-per-event: each output record type is priced separately. A full game-odds record (all books side by side + best-line, no-vig and arbitrage analytics) is the primary event; best-line records, player props and flat odds rows are each priced per item, plus a small actor-start fee. You pay only for what a run produces — cap a run with maxItems, maxEventsPerSport and lookAheadDays, and narrow it with books, markets and the minArbPct / minBestEdgePct edge filters to keep record counts (and cost) tight. Exact per-event prices are shown on this Actor's Apify Store page. Platform usage (compute & proxy) is billed to the account running the Actor at Apify's standard rates.


Use cases

  • Line-shopping — for each game and market, get the best available price and the book offering it, so you always bet the number instead of leaving value on the table.
  • Arbitrage & value scanning — surface risk-free arbitrage (2-way and 3-way soccer) and best-line edges vs the no-vig fair price; use minArbPct / minBestEdgePct to see only games worth acting on.
  • Odds feeds for models — a clean, normalized multi-book feed with implied and no-vig probabilities and a sharp reference (Pinnacle) as model inputs, in a stable JSON schema.
  • Line-movement tracking — run on a schedule with monitoringMode to record how each book's price moves over time (previous price, change, direction, first-seen price), plus DK opening vs closing.

Honest limitations

Please read this before you buy — this actor deliberately under-promises on book count and live odds.

  • Four books, not five-plus. The actor carries DraftKings, FanDuel, Bovada and Pinnacle — the four books that are genuinely reachable without a login or paid API. It does not claim to carry every book on the market.
  • BetMGM and Caesars are not offered — genuinely unreachable without a login or paid access, not omitted by choice. Both are documented, not faked.
  • FanDuel requires a US Apify proxy. FanDuel is geo-restricted and needs a US IP — enable proxyConfiguration (a US datacenter proxy is sufficient; residential also works). The other three books work with no proxy at all. Without a US proxy, FanDuel is emitted as null and the run logs a warning — honest, never faked.
  • Live / in-play odds are not included. This is a pre-match feed plus DraftKings opening and closing snapshots. includeStartedEvents surfaces in-progress/final games with the last posted line and scores, but true changing in-play prices are not shipped — they were not verifiably reachable keyless at build time, so they were deferred rather than shipped unvalidated. Live is on the roadmap.
  • Tennis and golf are not supported. Their schedules are tournament-level (outright/futures) events with no per-match moneyline/spread/total game lines, so there is nothing to line-shop in this actor's schema. They would need a different (outrights) backbone.
  • Coverage depends on the slate. Off-season leagues may have DraftKings lines weeks out while other books haven't posted yet — those books are honestly null until they open. Pinnacle prices most but not all games (e.g. 7 of 9 in a sample MLB slate). Soccer carries DK + Pinnacle; FanDuel exposes no soccer lobby and Bovada's soccer coupons are inconsistent.

Positioning: the deepest analytics aggregator across four real, keyless-reachable books — not "every book, every market." If you need BetMGM/Caesars, live in-play prices, or tennis/golf, this actor is not the right fit today.


FAQ

Do I need an API key or account? No. There is no login and no paid odds API — everything works with built-in defaults. You can optionally override Pinnacle's and FanDuel's keys via pinnacleApiKey / fanduelApiKey.

Do I need a proxy? Not for DraftKings, Bovada or Pinnacle — they work with no proxy. FanDuel does need a US proxy; without one it comes back as null.

Which books will I actually get? In-season and with a US proxy, up to four (DK, FanDuel, Bovada, Pinnacle). Keyless with no proxy, three (DK, Bovada, Pinnacle). Any book that hasn't priced a given game is null.

What is "no-vig"? The sportsbook's margin (the vig / overround) removed, leaving fair implied probabilities that sum to 100%. It's the standard way to estimate a true price. overroundPct reports the margin the book was charging.

How do I track line movement? Turn on monitoringMode and run the actor on a schedule. It persists last-seen prices in a named key-value store and attaches a lineMovement[] array (previous price, change, direction, first-seen price) on each subsequent run.

Can I get a flat, spreadsheet-friendly export? Yes — set outputMode: "rows" for one row per book × market × outcome (with isBestPrice and noVigProbability on each row).

Is this legal? The actor reads public, keyless market data and performs no login or paywall circumvention. Odds are factual market data. It is for informational/analytical use only — you are responsible for complying with betting laws in your jurisdiction and each site's terms. Not affiliated with any of the sportsbooks or data sources referenced.