BetMGM Scraper - Live Sports Odds, Markets & Player Props
Pricing
from $1.50 / 1,000 results
BetMGM Scraper - Live Sports Odds, Markets & Player Props
Scrape BetMGM (betmgm.com) live and upcoming sports betting odds. Extract events, moneylines, spreads, totals, player props, scores and start times. Get decimal and American odds for sportsbook monitoring, market comparison and odds analysis.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Features
Share
Collect live and upcoming sportsbook odds from BetMGM (betmgm.com) as clean rows: one row per market with decimal and American odds, every selection, scores and start times.
Why This Scraper?
- One row per market. Each row carries the headline selection plus a full
quoteobject listing every selection with decimal odds, American odds, implied probability and line. - Live and upcoming events. Filter to events in play now or upcoming only, with current score, period scores and clock for live games.
- Every market on demand. Moneylines, spreads, totals and player props for each event when you turn on all markets.
- Two ways in. Search by sport, region, competition or text, or paste event links.
- State boards. Pick the US state whose odds board you want to read.
- Final scores of past games. Turn on Final scores of past games to also get one row per finished game with the final score, winner and venue, linked to the odds event id where the game matches one.
- Recurring updates. Incremental mode labels rows NEW, UPDATED or REAPPEARED and skips unchanged rows, so scheduled runs only deliver what moved.
Use Cases
- Odds comparison: line up BetMGM prices against other books in a spreadsheet or model.
- Line movement tracking: schedule runs and keep only the rows whose odds changed.
- Betting research: build datasets of spreads, totals and player props across sports.
- Live dashboards: feed in-play scores and prices into alerts.
- Results and model back-testing: pair past final scores with the odds you collected.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
recordKey | betmgm:00000000:0000000000 |
eventId | 00000000 |
event | Team A at Team B |
homeTeam / awayTeam | Team B / Team A |
homeScore / awayScore | 0 / 0 |
sport | Basketball |
competition | NBA |
competitionFull | USA - NBA |
startTime | 2026-01-01T00:00:00.000Z |
eventStatus | scheduled |
market | Moneyline |
canonical | moneyline |
line | -3.5 |
isMainLine | true |
outcome | Team A |
odds | 1.91 |
americanOdds | -110 |
lastOdds | 1.91 |
quote.selections[] | name, role, decimal, american, impliedProbability, line |
periods | per-period scores |
stats | event statistics |
url | event page |
Odds rows carry recordType = odds; final-score rows (opt in) carry recordType = result, recordKey = result:<game id>, homeTeam / awayTeam, homeScore / awayScore, score, winner (home, away or draw), venue, sport, competition, startTime, status = final, source = espn.com and eventId (the linked odds event id, or null when no odds event matches).
How to Use
- Pick Search events or Event URLs.
- Choose sports and filters, or paste event links.
- Set Max items (default 20) and optionally turn on Fetch all markets.
- Run the actor and open the dataset.
Basketball odds, headline markets:
{ "mode": "search", "sports": ["basketball"], "maxItems": 20 }
Every market of live soccer events:
{ "mode": "search", "sports": ["soccer"], "stage": "live", "fetchDetails": true, "maxItems": 100 }
One event by link:
{ "mode": "url", "urls": ["https://www.betmgm.com/en/sports/events/team-a-at-team-b-00000000"] }
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("<ACTOR_ID>").call(run_input={"mode": "search", "sports": ["basketball"], "maxItems": 20})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["event"], row["market"], row["americanOdds"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('<ACTOR_ID>').call({ mode: 'search', sports: ['basketball'], maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length);
Final scores of past games
Turn on Final scores of past games and set Results: days back (1 to 14, default 2) to add one row per finished game to the dataset. Notes:
- Source and coverage. The sportsbook publishes no list of finished games, so final scores are read from the public scoreboard of espn.com, one request per league per day. Covered: NFL, NBA, WNBA, MLB, NHL, college football, men's and women's college basketball, MLS, NWSL and the main soccer leagues and cups (Premier League, Championship, FA Cup, League Cup, La Liga, Bundesliga, Serie A, Ligue 1, Eredivisie, Primeira Liga, Liga MX, Brasileirao, Argentine league, Champions League, Europa League, Conference League, Nations League, World Cup qualifying, friendlies, Concacaf and Copa Libertadores). Tennis, golf, boxing, cricket, Formula 1 and other sports return no final scores.
- Finished games only. Live games, upcoming games, and postponed or canceled games are never returned.
- Search mode only. The Sports and Text filter inputs narrow the results; region, competition, stage and state filters do not apply to final scores. URL mode ignores this option.
- Linking to odds.
eventIdis filled when a current or just-ended odds event (seen in this run or remembered by incremental mode) matches by team names and a start time within a few hours; otherwise it isnull. - Max items. About half of Max items is held for final scores while the odds are collected, so a small cap returns both kinds of rows. Every result row is a normal dataset item.
- Incremental mode. A result row is NEW the first time, UPDATED only if its status or final score changes, and never reported as EXPIRED. The results settings are not part of the remembered scope, so changing the days back does not restart the baseline.
- If the scores cannot be read. When every score read is refused and nothing else was collected, the run ends FAILED with a clear message instead of an empty success. When odds rows were collected, the run succeeds and the status message says the scores could not be read.
Basketball odds plus final scores of the last three days:
{ "mode": "search", "sports": ["basketball"], "includeResults": true, "resultsDaysBack": 3, "maxItems": 40 }
Tips
- Search mode returns each event's headline markets. Turn on Fetch all markets for spreads, totals and player props.
- Use Main lines only to keep just the moneyline row of each event.
- Use the same State key on every scheduled run when you use incremental mode.
Send results into your apps (MCP connectors)
Select one or more MCP connectors authorized under your Apify settings to receive a readable summary of the rows. Notion gets a page per row when you add a parent page. Your dataset is never changed by the export.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | Search events or read event links. |
sports | array | [] | Sport names or ids. Empty = all sports. |
regionIds | array | [] | Optional region ids. |
competitionIds | array | [] | Optional competition ids. |
searchTerm | string | empty | Keep events whose name, league or region contains this text. |
stage | string | all | All, live only or upcoming only. |
state | string | NY | US state odds board. |
mainLinesOnly | boolean | false | Keep only each event's main line. |
urls | array | [] | Event page links, links carrying fixtureIds=, or ids (20101854, 2:7913596) for URL mode; non-event links are skipped with a warning. |
fetchDetails | boolean | false | Load every market for each event. |
includeResults | boolean | false | Also return final scores of finished games (search mode). |
resultsDaysBack | integer | 2 | Days back for final scores, 1 to 14. |
maxPages | integer | empty | Page limit for search mode. Does not cap results; Max items does. |
maxItems | integer | 20 | Stop after this many rows. 0 = no limit. |
resumeFromRunId | string | empty | Skip rows an earlier run already collected. |
incrementalMode | boolean | false | Label rows NEW, UPDATED or REAPPEARED and skip unchanged rows. |
emitUnchanged | boolean | false | Also output unchanged rows. |
emitExpired | boolean | true | Report markets no longer offered as EXPIRED in URL mode. |
stateKey | string | empty | Name of the remembered baseline. |
ignoreFieldsForChanges | array | [] | Fields that never count as a change. |
proxy | object | Datacenter proxy | Connection settings. Residential is recommended for the most reliable results. |
mcpConnectors | array | [] | Connectors to send a summary to. |
notionParentPageUrl | string | empty | Notion parent page for the export. |
maxNotifyListings | integer | 50 | Cap on rows sent to each connector. |
Connection and proxy
The datacenter proxy is the default and works on every Apify plan. Residential is recommended for the most reliable results, especially for large or frequent runs: choose it in the Proxy configuration field. Leave the field empty and the actor still uses the datacenter proxy.
If a connection is refused or keeps failing, the actor switches to a more robust one on its own. Residential traffic used by that automatic switch is billed to your Apify plan. Apify free plans do not include residential proxies: on a free plan the run logs a warning and continues on a backup connection, and the run fails with a clear message if that connection cannot load the pages either. To use your own proxies, enter their URLs in the Proxy configuration field.
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"recordKey": "betmgm:00000000:0000000000","eventId": "00000000","event": "Team A at Team B","homeTeam": "Team B","awayTeam": "Team A","sport": "Basketball","competition": "NBA","startTime": "2026-01-01T00:00:00.000Z","eventStatus": "scheduled","market": "Moneyline","canonical": "moneyline","isMainLine": true,"outcome": "Team A","odds": 1.91,"americanOdds": -110,"quote": {"selections": [{"name": "Team A","role": "away","decimal": 1.91,"american": -110,"impliedProbability": 0.5236,"line": null},{"name": "Team B","role": "home","decimal": 1.91,"american": -110,"impliedProbability": 0.5236,"line": null}]}}
Plan Requirement
The default connection is Apify Proxy, and it needs a plan that includes proxy access. If your Apify plan does not include proxy access, the run fails with a clear message instead of returning an empty result; a paid plan with proxy access is required. The actor switches connection automatically when one is refused and tells you in the run log what it used.
FAQ
How much does a run cost?
You pay per row written to the dataset (odds rows and final-score rows alike) plus a small start fee. Set Max items to bound the spend.
Is it legal to scrape BetMGM (betmgm.com)?
The actor reads publicly listed odds. Check the site's terms and the rules that apply to you before using the data.
Can I schedule it?
Yes. Use incremental mode with a fixed State key so each run delivers only changed rows.
Why did my run return nothing?
The filters may match no events right now, for example Live only when no game is in play.
Can I use it with AI tools?
Yes. Connect the dataset through the Apify MCP server or send rows to your apps with the connectors above.
π Want more sports data?
Pair this actor with these related scrapers from the same team:
| β½ FanDuel Odds Scraper Scrape FanDuel sportsbook odds, including moneylines, spreads, totals, player props and... | β½ DraftKings Scraper Scrape DraftKings Sportsbook odds, game lines, team totals, player and game props... |
| β½ bet365 Odds Scraper Scrape bet365 live in-play and pre-match odds across 20+ sports. Extract fixture... | β½ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse) Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it... |
| β½ SofaScore Scraper β½ Live Scores, Stats, Players & Odds Pull structured sports data from SofaScore across football, basketball, tennis, and 20+... | β½ Sportsbet AU Scraper π
Sports Odds & Racing Prices Scrape sportsbet.com.au odds: events, markets, selections and prices for AFL, NRL... |
π Browse all abotapi scrapers
π¬ Support
- π Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- π οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
- β Enjoying it? A quick review on the actor page helps other users find it.