# Betting Odds Comparison: Best Price & Arbitrage Finder (`precious_bathmat/betting-odds-comparison`) Actor

Compare betting odds from Pinnacle, DraftKings, Bovada, Unibet and LeoVegas on every game. Get the best price for each outcome and spot arbitrage bets with exact stakes. NFL, NBA, MLB, NHL, college football, Premier League, La Liga and more.

- **URL**: https://apify.com/precious\_bathmat/betting-odds-comparison.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Sports, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 market compareds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Betting Odds Comparison: Best Price & Arbitrage Finder

Compare **betting odds from Pinnacle, DraftKings, Bovada, Unibet and LeoVegas** on every upcoming game in one run. For each moneyline, spread and total you get the **best available price for every outcome**, which bookmaker offers it, and an instant check for **arbitrage bets (sure bets)** with the exact stake to place on each side.

Covers **NFL, college football, NBA, WNBA, MLB, NHL, Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Champions League and MLS**.

### What does this do?

The same bet can pay very different amounts at different bookmakers. Always taking the best price, called line shopping, is the simplest way to win more over time. When prices differ enough, backing every outcome at different bookmakers even locks in a profit whatever the result. That is an arbitrage bet.

This Actor collects the odds from five bookmakers, matches the same game across all of them, compares identical markets, and returns a ranked table.

```mermaid
flowchart LR
    A[Pick leagues] --> B[Odds from Pinnacle,<br/>DraftKings, Bovada,<br/>Unibet, LeoVegas]
    B --> C[Same game matched<br/>across bookmakers]
    C --> D[Best price per outcome<br/>+ arbitrage check]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **Sports bettors** | Line shop in seconds and always bet at the best odds |
| **Arbitrage and sure bet hunters** | Get alerted to guaranteed profit opportunities with exact stakes |
| **Tipsters and betting content sites** | Show readers where the best price is for every pick |
| **Sports data analysts** | Build odds history, compare sharp and soft bookmakers, feed betting models |

### What data do you get?

One row per game, market and line:

| Field | Meaning |
|---|---|
| `event`, `league`, `startTime` | The game and when it starts |
| `market`, `line` | Moneyline, Spread or Total, and the handicap or points line |
| `bestPrices` | Best decimal and American odds for each outcome and the bookmaker offering it |
| `oddsByBookmaker` | Every bookmaker's odds side by side |
| `bookmakersCompared` | How many bookmakers offer this exact market |
| `isArbitrage`, `arbitrageProfitPercent` | Whether betting every outcome at the best prices guarantees a profit, and how much |
| `bestPrices[].arbitrageStake` | How to split a 100 stake across outcomes for an equal payout |
| `bestPriceMarginPercent` | Bookmaker margin left at the best prices. Close to 0 means close to an arbitrage |
| `outcome1BestOdds` … `outcome3Bookmaker` | Flat columns for spreadsheets |

Arbitrage opportunities are listed first, then every other market by start time.

### Example: best prices on a real NFL game

Denver Broncos vs Jacksonville Jaguars, moneyline, from a run in September 2026:

| Bookmaker | Denver Broncos | Jacksonville Jaguars |
|---|---|---|
| Pinnacle | 1.658 | **2.34** |
| DraftKings | **1.741** | 2.14 |
| Bovada | 1.714 | 2.20 |
| Unibet | 1.65 | 2.30 |
| LeoVegas | 1.66 | 2.30 |

Taking the best price on each side leaves a bookmaker margin of just **0.18%**, compared with 3% to 4% at any single bookmaker.

#### Sample output (JSON)

```json
{
  "event": "Atlanta Falcons vs Carolina Panthers",
  "league": "NFL",
  "startTime": "2026-09-20T17:00:00Z",
  "market": "Spread",
  "line": 2.5,
  "bookmakersCompared": 5,
  "isArbitrage": false,
  "arbitrageProfitPercent": null,
  "bestPriceMarginPercent": 1.67,
  "bestPrices": [
    { "outcome": "Atlanta Falcons +2.5", "decimalOdds": 2.01, "americanOdds": "+101", "bookmaker": "Pinnacle" },
    { "outcome": "Carolina Panthers -2.5", "decimalOdds": 1.926, "americanOdds": "-108", "bookmaker": "DraftKings" }
  ],
  "oddsByBookmaker": {
    "Pinnacle": { "Atlanta Falcons +2.5": 2.01, "Carolina Panthers -2.5": 1.885 },
    "DraftKings": { "Atlanta Falcons +2.5": 1.893, "Carolina Panthers -2.5": 1.926 },
    "Bovada": { "Atlanta Falcons +2.5": 1.952, "Carolina Panthers -2.5": 1.87 },
    "Unibet": { "Atlanta Falcons +2.5": 1.91, "Carolina Panthers -2.5": 1.91 },
    "LeoVegas": { "Atlanta Falcons +2.5": 1.91, "Carolina Panthers -2.5": 1.91 }
  }
}
```

### How arbitrage is calculated

An arbitrage exists when the best odds for all outcomes add up, as 1 ÷ odds, to less than 1.

For example, if one bookmaker offers **2.10** on Team A and another offers **2.10** on Team B: 1/2.10 + 1/2.10 = 0.952. That is under 1, so it is an arbitrage worth 1 ÷ 0.952 − 1 = **5% profit**. Split a 100 stake as 50 on each side, and either result pays back 105.

Real arbitrage opportunities are rare and disappear quickly, which is why most rows show best prices instead. Run the Actor on a schedule with **Only show arbitrage opportunities** turned on to catch them.

### How to use it

1. Pick your **leagues**.
2. Keep all **markets** and **bookmakers** selected, or narrow them down.
3. Turn on **Only show arbitrage opportunities** if that is all you want.
4. Click **Start**. Export to Excel, CSV or JSON, or send results to Google Sheets, Slack or a webhook with Apify integrations.

**Tip:** schedule a run every 15 minutes with arbitrage only turned on, and connect a Slack or email integration to get notified when a sure bet appears.

### Popular searches

Ready to run comparisons:

**US sports**

- [NFL odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/nfl-odds-comparison)
- [College football odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/college-football-odds-comparison)
- [MLB odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/mlb-odds-comparison)
- [WNBA odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/wnba-odds-comparison)

**Soccer**

- [Premier League odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/premier-league-odds-comparison)
- [La Liga odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/la-liga-odds-comparison)
- [Serie A odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/serie-a-odds-comparison)
- [Bundesliga odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/bundesliga-odds-comparison)
- [Ligue 1 odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/ligue-1-odds-comparison)
- [MLS odds comparison](https://apify.com/precious_bathmat/betting-odds-comparison/examples/mls-odds-comparison)

**Arbitrage**

- [Sports arbitrage finder (all leagues)](https://apify.com/precious_bathmat/betting-odds-comparison/examples/sports-arbitrage-finder)

#### Run it with the API

```bash
curl -X POST "https://api.apify.com/v2/acts/precious_bathmat~betting-odds-comparison/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "leagues": ["nfl", "mlb", "epl"],
    "markets": ["moneyline", "spread", "total"],
    "onlyArbitrage": false
  }'
```

### Pricing

**$0.005 per market compared.** A market is one game with one bet type and line, for example "Broncos vs Jaguars moneyline".

| Job | Markets | Cost |
|---|---|---|
| One NFL weekend (moneyline, spread and total) | about 60 | about $0.30 |
| Premier League matchday | about 30 | about $0.15 |
| All 13 leagues in one run | about 650 | about $3.25 |
| Arbitrage only scan | only the arbitrage rows | usually cents |

### FAQ

**Which markets are compared?**
Full game moneyline (soccer includes the draw), spread or handicap, and total points or goals. Spreads and totals are only compared when bookmakers offer exactly the same line, including Asian quarter lines such as 2.75.

**Are live games included?**
No. Only games that have not started are compared, because live odds change too fast for a fair comparison.

**How are the same games matched across bookmakers?**
By league, start time and both team names. Different spellings such as "Man City" and "Manchester City", or "BYU" and "Brigham Young", are recognised.

**How fresh are the odds?**
Every run reads live prices from each bookmaker. Odds can move within seconds, so always confirm the price on the bookmaker's site before placing a bet.

**Can I bet at all of these bookmakers?**
It depends on where you live. Bookmakers are licensed in different countries and some limit accounts that bet arbitrage. This Actor compares public odds only and does not place bets.

**Why does a league return no games?**
The league is out of season or no bookmaker has listed its games yet.

Please gamble responsibly and only where it is legal for you.

# Actor input Schema

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

Which leagues to compare. Leagues out of season simply return no games.

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

Moneyline (who wins; soccer includes the draw), spread (handicap) and total (over/under). Spreads and totals are only compared when bookmakers offer the exact same line.

## `bookmakers` (type: `array`):

Bookmakers to compare. Leave all selected to find the best prices.

## `onlyArbitrage` (type: `boolean`):

Return only markets where backing every outcome at the best prices guarantees a profit. Leave off to get best prices for every market.

## `minBookmakers` (type: `integer`):

Only compare a market when at least this many bookmakers offer it.

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

Only include games that start within this many days. Games already in progress are skipped.

## Actor input object example

```json
{
  "leagues": [
    "nfl",
    "mlb",
    "epl"
  ],
  "markets": [
    "moneyline",
    "spread",
    "total"
  ],
  "bookmakers": [
    "pinnacle",
    "draftkings",
    "bovada",
    "unibet",
    "leovegas"
  ],
  "onlyArbitrage": false,
  "minBookmakers": 2,
  "daysAhead": 7
}
```

# Actor output Schema

## `results` (type: `string`):

Arbitrage opportunities first, then every other market by start time.

## `summary` (type: `string`):

Markets compared, arbitrage found, games matched and how many games each bookmaker listed per league.

# 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",
        "mlb",
        "epl"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/betting-odds-comparison").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",
        "mlb",
        "epl",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/betting-odds-comparison").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",
    "mlb",
    "epl"
  ]
}' |
apify call precious_bathmat/betting-odds-comparison --silent --output-dataset

```

## MCP server setup

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

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/YYw2koFgvIgxVlJKL/builds/LiKtYuiPk73NlDojM/openapi.json
