# Sports Odds Comparison Scraper - 6 Sportsbooks & Arbitrage (`parseforge/sports-odds-comparison-scraper`) Actor

Betting odds from Pinnacle, DraftKings, FanDuel, Bovada, BetRivers and Unibet on one row per game: best price, margin, arbitrage. Export CSV, Excel, JSON, XML.

- **URL**: https://apify.com/parseforge/sports-odds-comparison-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Sports, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.69 / 1,000 odds comparison rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## ⚖️ Sports Odds Comparison & Arbitrage Scraper

> 🚀 **Export sports betting odds from 13+ sportsbooks in seconds.** DraftKings, FanDuel, BetMGM, Caesars, bet365, Pinnacle, Bovada, Unibet and more, side by side, with the best price, margin, fair odds and sure bets.

This Actor reads the public odds boards of the sportsbooks, matches the same game across all of them (team names, home and away, kickoff), converts every price to one format, and gives you one clean row per game. In the other modes it returns the best price per outcome, value bets against the no-vig price of Pinnacle, or arbitrage opportunities with the exact stake split. No login, no API key and no browser.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Bettors, odds-comparison sites, tipsters, quants, sports-data teams | Line shopping, arbitrage scanning, value betting, closing-line research, odds feeds |

### 📋 What the Sports Odds Comparison & Arbitrage Scraper does

- 📚 **13 direct books:** DraftKings, FanDuel, BetMGM, Caesars, BetRivers, bet365, Unibet US, Fanatics, Hard Rock Bet, Bally Bet, theScore Bet, Pinnacle, Bovada and Unibet (Kambi). About 14 more European bookmakers per football match can be added.
- 🏈 **15 leagues:** NFL, NCAA football, NBA, NCAA basketball, WNBA, MLB, NHL, UFC, Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS and the Champions League.
- 🎯 **3 markets:** moneyline (1X2 with the draw in football), spread and totals. Only prices for the same line are compared.
- 🔄 **One format:** every price is normalised to decimal and also given in American odds, with implied probability.
- 🥇 **Best price** per outcome and which books share it, plus the average and worst price.
- 🧾 **Overround** per book and for the best combined prices, and **fair odds** without margin (Pinnacle, or the consensus of 3+ books).
- 💰 **Arbitrage:** sure bets with the stake split for your bankroll, the guaranteed return, a push warning on whole-number lines and a trust check that hides stale or wrong prices.
- 📈 **Value bets:** prices that beat the fair price by your minimum edge, with quarter-Kelly size.

> 💡 **Why it matters:** the same team can be +130 at one book and +105 at another. Shopping across 13 books instead of 1 is the cheapest edge in betting, and this Actor does the matching for you.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

Four modes share one dataset: **Events** (one row per game), **Best lines** (one row per outcome), **Arbitrage** (one row per sure bet) and **Value bets** (one row per price with an edge). The table lists the fields of all four modes; fields that do not apply to a mode are simply absent, and the dataset view shows the Events columns.

| Field | Description |
|---|---|
| 🔑 eventKey | Stable id of the game: league, date and both teams. |
| 🏆 league | League key, for example nfl or epl. |
| 🏟 leagueName | League name. |
| ⚽ sport | Sport family. |
| 🕒 startTime | Kickoff time in ISO 8601 UTC. |
| ❓ startTimeApproximate | True when the kickoff comes only from a source that prints local time. |
| 🏠 homeTeam | Home team or first fighter. |
| ✈️ awayTeam | Away team or second fighter. |
| 🔴 isLive | True for in-play games (only when in-play is enabled). |
| 📚 booksCompared | Number of sportsbooks with at least one price for this game. |
| 🏦 books | Names of the sportsbooks that priced the game. |
| 🔗 sourceUrls | Page of the game at each source. |
| 🧮 marketCount | Number of comparable markets in this row. |
| 🥇 bestMoneyline | Best moneyline (or 1X2) price per outcome and the book that has it. |
| 💰 hasArbitrage | True when a market has a sure bet that passes the trust check. |
| 📈 bestArbitragePercent | Largest sure-bet profit in percent across the markets of the game, 0 when none. |
| 📊 markets | Every market with all book prices, best price, overround, fair odds and the sure-bet check. |
| 🕒 scrapedAt | When the row was collected. |
| ❗ error | Error message, or null when the row is fine. |

The sample below is three real games from a cloud run in Events mode (moneyline only, four books) to keep it short.

```json
[
  {
    "eventKey": "nfl:2026-10-02:cleveland-browns:pittsburgh-steelers",
    "league": "nfl",
    "leagueName": "NFL",
    "sport": "american-football",
    "startTime": "2026-10-02T00:15:00.000Z",
    "startTimeApproximate": false,
    "homeTeam": "Cleveland Browns",
    "awayTeam": "Pittsburgh Steelers",
    "isLive": false,
    "booksCompared": 4,
    "books": [
      "DraftKings",
      "FanDuel",
      "Pinnacle",
      "Bovada"
    ],
    "sourceUrls": {
      "actionnetwork": "https://www.actionnetwork.com/nfl/odds",
      "pinnacle": "https://www.pinnacle.com/en/matchup/1637432965/",
      "bovada": "https://www.bovada.lv/sports/football/nfl/pittsburgh-steelers-cleveland-browns-202610012015"
    },
    "marketCount": 1,
    "bestMoneyline": {
      "home": {
        "book": "pinnacle",
        "bookLabel": "Pinnacle",
        "decimal": 2.27,
        "american": 127,
        "impliedProbability": 0.4405
      },
      "away": {
        "book": "pinnacle",
        "bookLabel": "Pinnacle",
        "decimal": 1.6993,
        "american": -143,
        "impliedProbability": 0.5885
      }
    },
    "hasArbitrage": false,
    "bestArbitragePercent": 0,
    "markets": [
      {
        "market": "moneyline",
        "bookCount": 4,
        "outcomes": [
          {
            "selection": "home",
            "name": "Cleveland Browns",
            "best": {
              "book": "pinnacle",
              "bookLabel": "Pinnacle",
              "decimal": 2.27,
              "american": 127,
              "impliedProbability": 0.4405
            },
            "bestBooks": [
              "pinnacle"
            ],
            "averageDecimal": 2.245,
            "fairProbability": 0.4281,
            "fairDecimal": 2.3358,
            "prices": [
              {
                "book": "pinnacle",
                "bookLabel": "Pinnacle",
                "decimal": 2.27,
                "american": 127,
                "impliedProbability": 0.4405,
                "isBest": true
              },
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 2.25,
                "american": 125,
                "impliedProbability": 0.4444,
                "isBest": false
              },
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 2.24,
                "american": 124,
                "impliedProbability": 0.4464,
                "isBest": false
              },
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 2.22,
                "american": 122,
                "impliedProbability": 0.4505,
                "isBest": false
              }
            ]
          },
          {
            "selection": "away",
            "name": "Pittsburgh Steelers",
            "best": {
              "book": "pinnacle",
              "bookLabel": "Pinnacle",
              "decimal": 1.6993,
              "american": -143,
              "impliedProbability": 0.5885
            },
            "bestBooks": [
              "pinnacle"
            ],
            "averageDecimal": 1.6899,
            "fairProbability": 0.5719,
            "fairDecimal": 1.7486,
            "prices": [
              {
                "book": "pinnacle",
                "bookLabel": "Pinnacle",
                "decimal": 1.6993,
                "american": -143,
                "impliedProbability": 0.5885,
                "isBest": true
              },
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 1.6944,
                "american": -144,
                "impliedProbability": 0.5902,
                "isBest": false
              },
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 1.69,
                "american": -145,
                "impliedProbability": 0.5917,
                "isBest": false
              },
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 1.6757,
                "american": -148,
                "impliedProbability": 0.5968,
                "isBest": false
              }
            ]
          }
        ],
        "combinedOverroundPercent": 2.901,
        "averageOverroundPercent": 3.725,
        "overroundByBook": {
          "draftkings": 4.32,
          "fanduel": 4.061,
          "pinnacle": 2.901,
          "bovada": 3.616
        },
        "fairSource": "pinnacle",
        "arbitrage": {
          "isArbitrage": false,
          "profitPercent": -2.819,
          "confidence": "high"
        }
      }
    ],
    "scrapedAt": "2026-09-29T05:29:06.018Z",
    "error": null
  },
  {
    "eventKey": "nfl:2026-10-04:washington-commanders:indianapolis-colts",
    "league": "nfl",
    "leagueName": "NFL",
    "sport": "american-football",
    "startTime": "2026-10-04T13:30:00.000Z",
    "startTimeApproximate": false,
    "homeTeam": "Washington Commanders",
    "awayTeam": "Indianapolis Colts",
    "isLive": false,
    "booksCompared": 4,
    "books": [
      "DraftKings",
      "FanDuel",
      "Pinnacle",
      "Bovada"
    ],
    "sourceUrls": {
      "actionnetwork": "https://www.actionnetwork.com/nfl/odds",
      "pinnacle": "https://www.pinnacle.com/en/matchup/1637435170/",
      "bovada": "https://www.bovada.lv/sports/football/nfl/indianapolis-colts-washington-commanders-202610040930"
    },
    "marketCount": 1,
    "bestMoneyline": {
      "home": {
        "book": "bovada",
        "bookLabel": "Bovada",
        "decimal": 2.65,
        "american": 165,
        "impliedProbability": 0.3774
      },
      "away": {
        "book": "draftkings",
        "bookLabel": "DraftKings",
        "decimal": 1.5405,
        "american": -185,
        "impliedProbability": 0.6491
      }
    },
    "hasArbitrage": false,
    "bestArbitragePercent": 0,
    "markets": [
      {
        "market": "moneyline",
        "bookCount": 4,
        "outcomes": [
          {
            "selection": "home",
            "name": "Washington Commanders",
            "best": {
              "book": "bovada",
              "bookLabel": "Bovada",
              "decimal": 2.65,
              "american": 165,
              "impliedProbability": 0.3774
            },
            "bestBooks": [
              "bovada"
            ],
            "averageDecimal": 2.6125,
            "fairProbability": 0.3651,
            "fairDecimal": 2.739,
            "prices": [
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 2.65,
                "american": 165,
                "impliedProbability": 0.3774,
                "isBest": true
              },
              {
                "book": "pinnacle",
                "bookLabel": "Pinnacle",
                "decimal": 2.64,
                "american": 164,
                "impliedProbability": 0.3788,
                "isBest": false
              },
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 2.62,
                "american": 162,
                "impliedProbability": 0.3817,
                "isBest": false
              },
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 2.54,
                "american": 154,
                "impliedProbability": 0.3937,
                "isBest": false
              }
            ]
          },
          {
            "selection": "away",
            "name": "Indianapolis Colts",
            "best": {
              "book": "draftkings",
              "bookLabel": "DraftKings",
              "decimal": 1.5405,
              "american": -185,
              "impliedProbability": 0.6491
            },
            "bestBooks": [
              "draftkings"
            ],
            "averageDecimal": 1.5217,
            "fairProbability": 0.6349,
            "fairDecimal": 1.5751,
            "prices": [
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 1.5405,
                "american": -185,
                "impliedProbability": 0.6491,
                "isBest": true
              },
              {
                "book": "pinnacle",
                "bookLabel": "Pinnacle",
                "decimal": 1.5181,
                "american": -193,
                "impliedProbability": 0.6587,
                "isBest": false
              },
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 1.5155,
                "american": -194,
                "impliedProbability": 0.6599,
                "isBest": false
              },
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 1.5128,
                "american": -195,
                "impliedProbability": 0.661,
                "isBest": false
              }
            ]
          }
        ],
        "combinedOverroundPercent": 2.65,
        "averageOverroundPercent": 4.006,
        "overroundByBook": {
          "draftkings": 4.282,
          "fanduel": 4.154,
          "pinnacle": 3.749,
          "bovada": 3.838
        },
        "fairSource": "pinnacle",
        "arbitrage": {
          "isArbitrage": false,
          "profitPercent": -2.581,
          "confidence": "high"
        }
      }
    ],
    "scrapedAt": "2026-09-29T05:29:06.114Z",
    "error": null
  },
  {
    "eventKey": "nfl:2026-10-04:philadelphia-eagles:los-angeles-rams",
    "league": "nfl",
    "leagueName": "NFL",
    "sport": "american-football",
    "startTime": "2026-10-04T17:00:00.000Z",
    "startTimeApproximate": false,
    "homeTeam": "Philadelphia Eagles",
    "awayTeam": "Los Angeles Rams",
    "isLive": false,
    "booksCompared": 3,
    "books": [
      "DraftKings",
      "FanDuel",
      "Bovada"
    ],
    "sourceUrls": {
      "actionnetwork": "https://www.actionnetwork.com/nfl/odds",
      "bovada": "https://www.bovada.lv/sports/football/nfl/los-angeles-rams-philadelphia-eagles-202610041300"
    },
    "marketCount": 1,
    "bestMoneyline": {
      "home": {
        "book": "bovada",
        "bookLabel": "Bovada",
        "decimal": 2.25,
        "american": 125,
        "impliedProbability": 0.4444
      },
      "away": {
        "book": "fanduel",
        "bookLabel": "FanDuel",
        "decimal": 1.7246,
        "american": -138,
        "impliedProbability": 0.5798
      }
    },
    "hasArbitrage": false,
    "bestArbitragePercent": 0,
    "markets": [
      {
        "market": "moneyline",
        "bookCount": 3,
        "outcomes": [
          {
            "selection": "home",
            "name": "Philadelphia Eagles",
            "best": {
              "book": "bovada",
              "bookLabel": "Bovada",
              "decimal": 2.25,
              "american": 125,
              "impliedProbability": 0.4444
            },
            "bestBooks": [
              "bovada"
            ],
            "averageDecimal": 2.2233,
            "fairProbability": 0.4329,
            "fairDecimal": 2.3102,
            "prices": [
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 2.25,
                "american": 125,
                "impliedProbability": 0.4444,
                "isBest": true
              },
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 2.24,
                "american": 124,
                "impliedProbability": 0.4464,
                "isBest": false
              },
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 2.18,
                "american": 118,
                "impliedProbability": 0.4587,
                "isBest": false
              }
            ]
          },
          {
            "selection": "away",
            "name": "Los Angeles Rams",
            "best": {
              "book": "fanduel",
              "bookLabel": "FanDuel",
              "decimal": 1.7246,
              "american": -138,
              "impliedProbability": 0.5798
            },
            "bestBooks": [
              "fanduel"
            ],
            "averageDecimal": 1.6968,
            "fairProbability": 0.5671,
            "fairDecimal": 1.7632,
            "prices": [
              {
                "book": "fanduel",
                "bookLabel": "FanDuel",
                "decimal": 1.7246,
                "american": -138,
                "impliedProbability": 0.5798,
                "isBest": true
              },
              {
                "book": "bovada",
                "bookLabel": "Bovada",
                "decimal": 1.69,
                "american": -145,
                "impliedProbability": 0.5917,
                "isBest": false
              },
              {
                "book": "draftkings",
                "bookLabel": "DraftKings",
                "decimal": 1.6757,
                "american": -148,
                "impliedProbability": 0.5968,
                "isBest": false
              }
            ]
          }
        ],
        "combinedOverroundPercent": 2.429,
        "averageOverroundPercent": 3.93,
        "overroundByBook": {
          "draftkings": 4.32,
          "fanduel": 3.855,
          "bovada": 3.616
        },
        "fairSource": "consensus of 3 books",
        "arbitrage": {
          "isArbitrage": false,
          "profitPercent": -2.371,
          "confidence": "unverified"
        }
      }
    ],
    "scrapedAt": "2026-09-29T05:29:06.153Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

- 🧠 **Matches the same game across books:** aliases such as "Man Utd" and "Manchester United", swapped home and away, doubleheaders.
- 🛡 **Sure bets you can trust:** each one is recomputed from its legs, legs must be at different books, quarter lines are excluded, and prices far from the crowd are hidden or marked.
- 🏃 **HTTP only:** a 5 league run takes about 25 seconds.
- 💳 **Billing is per row delivered.** A run that finds no sure bet ends cleanly and charges nothing.
- ✅ **Fails loudly:** invalid input or a season with no games ends as failed with the reason, not as an empty success.

### 📈 How it compares to alternatives

Other odds Actors on the Store cover two or three books (typically Pinnacle, Bovada and FanDuel). This one reads more than a dozen books in the same run, adds the fair price, the overround and the stake split, and lets you choose the output shape. Honest ceiling: prices are a snapshot from public boards, some refresh every few minutes, so re-check a sure bet at the book before you place it.

### 🚀 How to use

1. Create a free Apify account with $5 credit: https://console.apify.com/sign-up?fpr=vmoqkp
2. Open the Actor, pick the mode, leagues and markets, then set Max Items.
3. Run and download CSV / Excel / JSON / XML from the dataset.

### 💼 Business use cases

#### 🥇 Line shopping

Run Best lines before a game and see which book pays most on each side.

#### 💰 Arbitrage scanning

Schedule Arbitrage mode every few minutes with a small negative minimum profit to also watch near misses.

#### 📈 Value betting

Use Value bets to find prices above Pinnacle's no-vig line.

#### 📊 Odds data feeds

Feed Events rows into a dashboard, a model or a comparison site.

### 🔌 Automating Sports Odds Comparison & Arbitrage Scraper

Connect the dataset to Make, Zapier, Slack, Airbyte, GitHub or Google Drive, or call it from the Apify API and schedule it with Apify Schedules.

### 🌟 Beyond business use cases

Researchers can study market efficiency and margins, and students can build betting-model projects on real prices.

### 🤖 Ask an AI assistant about this scraper

Ask an assistant such as ChatGPT, Claude or Gemini: "How do I use the Apify Sports Odds Comparison & Arbitrage Scraper to find sure bets in the NFL?"

### ❓ Frequently Asked Questions

#### 🔑 Do I need a sportsbook account or an API key?

No. Only publicly visible odds are read.

#### 🏦 Which sportsbooks are covered?

DraftKings, FanDuel, BetMGM, Caesars, BetRivers, bet365, Unibet US, Fanatics, Hard Rock Bet, Bally Bet, theScore Bet, Pinnacle, Bovada and Unibet (Kambi). Add European bookmakers for football to get about 14 more per match.

#### 🧮 Are the sure bets guaranteed?

The math is: the best prices sum to less than 100% implied probability, legs are at different books and the stakes make every leg pay the same. The risk is timing, because a price can move before you bet. Whole-number lines can push (both bets refunded), and the row says so.

#### 🛡 What does the confidence field mean?

It compares each leg with the median price of the same outcome. High is within 4 probability points, medium within 8, low is more than 8 (usually a stale line, hidden by default) and unverified means fewer than 4 books.

#### 🔎 Why did Arbitrage mode return nothing?

Real sure bets are rare. The run ends successfully and charges nothing. Lower Minimum profit % to a negative number such as -1 to list near misses.

#### ⚖️ How is the fair price calculated?

Pinnacle's prices with the margin removed proportionally. Without Pinnacle, the average of the no-margin prices of 3 or more books.

#### 🏈 Why are some leagues empty?

Only games that are on the board are returned, so an out-of-season league gives no games and the run fails with that reason.

#### 🔀 Are spread and total lines from different books compared?

Only when the line is the same. Home -3.5 is compared with away +3.5, and Over 44.5 with Under 44.5.

#### 🔴 Can I get in-play odds?

Yes, with Include in-play games. Sure bets on live games go stale within seconds, so use them with care.

#### 🌍 Why are European bookmakers slower?

The list of bookmakers depends on the visitor country, so this option goes through a residential address and needs one request per match.

#### 💳 How am I charged?

Per row delivered. See the pricing tab for the current price.

#### 🆓 What can I do on the free plan?

Free runs return up to 10 rows, enough to check the fields.

### 🔌 Integrate with any app

Use the Apify API, webhooks, Make, Zapier, n8n or the Apify MCP server to move the data into your own stack.

### 🔗 Recommended Actors

- [Action Network Scraper](https://apify.com/parseforge/action-network-scraper)
- [Pinnacle Odds Scraper](https://apify.com/parseforge/pinnacle-odds-scraper)
- [Bovada Scraper](https://apify.com/parseforge/bovada-scraper)
- [Unibet Kambi Odds Scraper](https://apify.com/parseforge/unibet-kambi-odds-scraper)

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** independent tool, not affiliated with any sportsbook. It collects only publicly available data. Betting involves risk; nothing here is financial advice.

# Actor input Schema

## `leagues` (type: `array`):

Leagues to compare. Each league is read from every source that covers it, so a sport out of season simply returns no games.

## `maxItems` (type: `integer`):

Maximum number of rows to return. Free users: 10 rows per run. Paid users: up to 1,000,000.

## `mode` (type: `string`):

Events: one row per game with every book's price side by side. Best lines: one row per outcome with the best price and where to get it. Arbitrage: one row per sure bet with the stake split. Value bets: prices that beat the fair (no-vig) price.

## `oddsFormat` (type: `string`):

Every price is normalised from decimal odds. Both keeps American and decimal side by side.

## `markets` (type: `array`):

Moneyline (or 1X2 in football), point/goal spread, and over/under totals. Full-game lines only.

## `books` (type: `array`):

Leave empty for every direct book (US books, Pinnacle, Bovada, Unibet). Add European bookmakers to also read about 14 more bookmakers per football match (football leagues only). That option routes through a residential proxy, so it is slower.

## `daysAhead` (type: `integer`):

Only games starting within this many days.

## `minBooks` (type: `integer`):

Skip markets priced by fewer books than this. Use 2 or more for a real comparison.

## `includeLive` (type: `boolean`):

In-play prices move within seconds and are stale by the time a run ends, so sure bets are hidden for live games unless this is on.

## `maxMatchesPerLeague` (type: `integer`):

Each football match on the European list needs its own request, so this caps the extra time per league.

## `bankroll` (type: `number`):

Total amount to split across the legs of a sure bet (arbitrage mode). Stakes are rounded to cents.

## `minProfitPercent` (type: `number`):

Arbitrage mode: only sure bets at or above this profit. Use a negative number such as -1 to also list near misses.

## `minEdgePercent` (type: `number`):

Value bets mode: minimum expected value versus the fair price (Pinnacle without margin, or the consensus of 3+ books).

## `proxyConfiguration` (type: `object`):

Requests go direct first. If a book refuses the address the run switches to Apify datacenter proxy for that book.

## Actor input object example

```json
{
  "leagues": [
    "nfl",
    "ncaaf",
    "mlb",
    "nhl",
    "epl"
  ],
  "maxItems": 10,
  "mode": "events",
  "oddsFormat": "both",
  "markets": [
    "moneyline",
    "spread",
    "total"
  ],
  "daysAhead": 7,
  "minBooks": 2,
  "includeLive": false,
  "maxMatchesPerLeague": 20,
  "bankroll": 100,
  "minProfitPercent": 0,
  "minEdgePercent": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leagues": [
        "nfl",
        "ncaaf",
        "mlb",
        "nhl",
        "epl"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/sports-odds-comparison-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "leagues": [
        "nfl",
        "ncaaf",
        "mlb",
        "nhl",
        "epl",
    ],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/sports-odds-comparison-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leagues": [
    "nfl",
    "ncaaf",
    "mlb",
    "nhl",
    "epl"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parseforge/sports-odds-comparison-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/sports-odds-comparison-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IXmymWE5yWYvOaLSI/builds/6aGgNORjCHjmE2dbw/openapi.json
