# Arbitrage & Value Bets Finder: Surebets & +EV, 30+ Bookmakers (`sports-odds-lab/arbitrage-value-bets-finder`) Actor

Find sports betting arbitrage (surebets) and value bets (+EV) across 30+ bookmakers: football, tennis, NBA, NFL, NHL, MLB and 18 more sports. Stake split for every arbitrage, fair odds and edge for every value bet, stale prices filtered out.

- **URL**: https://apify.com/sports-odds-lab/arbitrage-value-bets-finder.md
- **Developed by:** [Min Maxxxer](https://apify.com/sports-odds-lab) (community)
- **Categories:** Sports, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 value bet founds

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

## Arbitrage & Value Bets Finder: Surebets & +EV, 30+ Bookmakers

> 🎯 **Sports betting arbitrage (surebets) and value bets in one scan** — football, tennis, NBA, NFL, NHL, MLB and 18 more sports, about 30 bookmakers per match. Press **Start**: the prefilled input scans the next 300 matches in about a minute.

**Arbitrage finder and value bet finder for sports betting.** The Actor checks every upcoming match of the sports you choose at about 30 bookmakers — bet365, Betfred, Ladbrokes, Sky Bet, Betway, bwin, Betano, Superbet, STS, Fortuna, Interwetten, 1xBet, DraftKings, FanDuel, BetMGM, Fanatics, Sports Interaction, Bet9ja, BetKing and more — and returns one row per opportunity:

- **Arbitrage (surebet)** — the best prices of every outcome of one bet, at different bookmakers, add up to less than 100 %. The row tells you **what to bet where and how much**: staking as shown returns the same amount whatever happens.
- **Value bet (+EV)** — a bookmaker's price above the **fair price of the rest of the market** (the margin-free consensus of all the other bookmakers), with the edge, the fair odds and a Kelly stake.

Markets: **match winner / 1X2 / moneyline**, **Asian handicap / spread** and **totals / over-under** on every line, **both teams to score**. Pre-match, the next hours or days.

### Why this finder

- ✅ **About 30 bookmakers in one scan** — UK, European, US, Canadian, Latin American and African books, so the price gaps between markets show up
- ✅ **24 sports** — football (soccer), tennis (ATP, WTA, Challenger, ITF), basketball, ice hockey, American football, baseball, volleyball, handball, table tennis, esports, darts, snooker, cricket, MMA and more
- ✅ **Stakes calculated** — every arbitrage comes with the stake per leg and the guaranteed return for the total you choose; every value bet with fair odds, edge and Kelly %
- ✅ **False signals filtered out** — inactive and placeholder prices, broken quotes, mislabelled lines (see *How it works*): most "arbitrages" other tools show are a bookmaker's error you could never get paid on
- ✅ **Only your bookmakers** — list the ones you have accounts with; the fair price still comes from the whole market
- ✅ **Made for schedules** — with *Only new opportunities* a run every 15 minutes returns (and charges) only what is new
- ✅ **Pay for what is found** — a small fee per match scanned and a fee per opportunity

### What you get

**Arbitrage row** (real output, 13 October 2026 — shortened):

```json
{
  "type": "arbitrage",
  "sport": "hockey",
  "competition": "Europe: Champions League",
  "match": "Pardubice - Vaxjo",
  "startTime": "2026-10-13T16:00:00Z",
  "market": "1X2",
  "bookmakersInMarket": 18,
  "profitPct": 3.22,
  "totalStake": 100,
  "guaranteedReturn": 103.21,
  "legs": [
    {"selection": "Pardubice", "bookmaker": "Betano.de", "odds": 2.82, "stake": 36.6, "returns": 103.21},
    {"selection": "Draw", "bookmaker": "bwin", "odds": 4.6, "stake": 22.44, "returns": 103.22},
    {"selection": "Vaxjo", "bookmaker": "Betking", "odds": 2.52, "stake": 40.96, "returns": 103.22}
  ],
  "bets": "Betano.de: Pardubice @ 2.82 → 36.6 | bwin: Draw @ 4.6 → 22.44 | Betking: Vaxjo @ 2.52 → 40.96",
  "oddsUrl": "https://www.flashscore.com/match/67qcKreM/#/odds-comparison"
}
```

**Value bet row** (real output, shortened):

```json
{
  "type": "value",
  "sport": "soccer",
  "match": "England W - Greece W",
  "market": "Total",
  "line": 3.5,
  "selection": "Under 3.5",
  "bookmaker": "Betfred",
  "odds": 3.25,
  "fairOdds": 3.029,
  "fairProb": 0.3301,
  "edgePct": 7.3,
  "kellyPct": 3.24,
  "consensusBookmakers": 18,
  "bookmakersWithValue": 3,
  "alsoAt": [{"bookmaker": "Midnite", "odds": 3.25, "edgePct": 7.3}, {"bookmaker": "bet365", "odds": 3.25, "edgePct": 7.3}]
}
```

Every row also has `country`, `homeTeam`, `awayTeam`, `startsInMinutes`, `matchId`, `marketKey`, `lineType` (games / sets in tennis), `foundAt` and a link to the match's odds comparison page. Rows come **best first**: arbitrages by profit, value bets by edge. The dataset has three table views: *All opportunities*, *Arbitrage* and *Value bets*.

In our test scan of the next 24 hours (500 matches of football, tennis, basketball and ice hockey, 13 October 2026) the Actor found **11 arbitrages of 0.5–3.2 %** and about 200 value bets of 4 % or more.

### How to use it

1. **List your bookmakers** in *Only my bookmakers* (bet365, Betfred, Skybet, DraftKings, FanDuel…) — an arbitrage is only worth something if you can bet every leg. Leave it empty to see the whole market.
2. Choose the sports and how many hours ahead. Press **Start**.
3. **Act fast and check the price on the bookmaker's site before you bet.** Prices move all day; an arbitrage typically lasts minutes.
4. For alerts, create a [Schedule](https://docs.apify.com/platform/schedules) (e.g. every 15 minutes) with **Only new opportunities** on and connect a webhook, Slack, Telegram (via Make or Zapier) or Google Sheets.

### Ready-made examples

One click, preconfigured — open, press **Start**, adjust if you like:

- [Football arbitrage today: surebets across 30+ bookmakers](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/football-arbitrage-surebets-today)
- [Tennis value bets: ATP, WTA, Challenger and ITF](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/tennis-value-bets)
- [NBA and NHL arbitrage and value bets, American odds](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/nba-nhl-arbitrage-value-bets)
- [Surebets at UK bookmakers: bet365, Sky Bet, Betfred](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/uk-bookmakers-surebets)
- [Value bets at US sportsbooks: DraftKings, FanDuel, BetMGM](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/us-sportsbooks-value-bets)
- [Over/under goals value bets in football](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/over-under-goals-value-bets)
- [Esports, table tennis and volleyball arbitrage and value](https://apify.com/sports-odds-lab/arbitrage-value-bets-finder/examples/esports-table-tennis-arbitrage)

#### Input example — arbitrage only, UK bookmakers

```json
{
  "find": ["arbitrage"],
  "sports": ["soccer", "tennis", "basketball", "hockey"],
  "hoursAhead": 24,
  "bookmakers": ["bet365", "Betfred", "Ladbrokes", "Skybet", "Betway", "Midnite", "7BetUK"],
  "minProfitPct": 0.5,
  "stake": 200
}
```

#### Input example — value bets on NBA and NHL, American odds, every 15 minutes

```json
{
  "find": ["value"],
  "sports": ["basketball", "hockey"],
  "competitions": ["USA: NBA", "USA: NHL"],
  "hoursAhead": 48,
  "minEdgePct": 3,
  "oddsFormat": "american",
  "onlyNew": true
}
```

### How it works

For each match the Actor reads every bookmaker's pre-match prices from Flashscore's odds comparison, groups the quotes into bets with complementary outcomes (1X2; over/under 2.5; one handicap line; both teams to score…) and runs four checks before any maths — each one removes a kind of false signal we have seen in real data:

1. **Inactive listings** — when a bookmaker has pulled a price, its old quote is ignored (placeholders once looked like an 18 % "arbitrage").
2. **One quote per brand** — a bookmaker listed under several licences (Betano .de / .ca / .dk, BetMGM .uk / .us) counts once, so it cannot outvote the market or "arbitrage" itself.
3. **Broken prices** — a quote more than 8 points of probability away from all the other bookmakers is dropped.
4. **Mislabelled lines** — a bookmaker whose whole ladder of handicap or total lines sits off the market, or whose line is priced like another kind of line (set handicaps labelled as game handicaps in tennis), is left out of that market.

**Arbitrage:** the best price of each outcome, from at least two different bookmakers, with 1/price summing to less than 1. Profit = 1 / Σ(1/price) − 1; each leg's stake is proportional to 1/price. Only markets priced by at least *Min bookmakers* brands (default 5) are checked.

**Value bet:** fair probability = the median margin-free probability of the **other** bookmakers (the bookmaker in question is left out, so it is never compared with itself). Edge = price × fair probability − 1. Kelly % = edge / (price − 1); most bettors stake a quarter of it.

**Reading value bets:** the fair price is the market's consensus, not a prediction. A lone bookmaker far above a tight market (`bookmakersWithValue: 1`) is the classic value bet. When several bookmakers sit above the rest together (UK books on unders, for example), the edge may reflect how those bookmakers price that market rather than a mistake.

### Before you bet: what to know

- **Prices change.** The data is as fresh as the scan; check each price on the bookmaker's site.
- **Bookmakers void palpable errors** — that is why "arbitrages" above *Max profit* (default 5 %) are hidden.
- **Settlement rules differ** — e.g. a tennis retirement, or whether overtime counts. The Actor only compares quotes of the same market and period, but read the rules of each bookmaker for the legs you bet.
- **Bookmakers limit accounts** that bet arbitrage or value regularly.
- This is a data tool, not betting advice. Betting may be restricted where you live — follow the law, bet responsibly.

### Pricing

Pay per event — Apify platform usage included:

| Event | Price |
|---|---|
| Run start | $0.00005 |
| Match scanned (all its bookmakers and markets checked) | $0.0005 ($0.50 per 1,000 matches) |
| Arbitrage found | $0.04 |
| Value bet found | $0.004 |

A scan of 500 matches with 10 arbitrages and 150 value bets costs about $1.25. With **Only new opportunities**, repeats are not charged. Set a spending limit on the run for a hard cap — the Actor stops scanning when it is reached.

### FAQ

**Which bookmakers are covered?** About 30 per match: 1xBet, 7BetUK, bet365, Bet9ja, Betano (.de, .dk, Ontario), Betclic, Betfred, BetKing, BetMGM (UK, US), Betway, bwin, DraftKings, eFortuna, Expekt, Fanatics, FanDuel, Interwetten, Ladbrokes, Midnite, Neobet, Oddset, Roobet, Sky Bet, Sports Interaction, STS, Superbet, Winamax and more, depending on the match. Pinnacle and betting exchanges are not included.

**Why did a run find nothing?** Arbitrages are rare and short-lived; most appear in lower leagues, women's and youth competitions, tennis Challengers and table tennis, where bookmakers update slower. Scan more hours or sports, lower *Min arbitrage profit*, or schedule runs through the day.

**Is the fair price "true probability"?** It is the market's consensus without margins — a good reference, especially in busy markets, but not a guarantee. See *Reading value bets* above.

**Live (in-play) odds?** No — pre-match only.

**Where does the data come from?** From the public odds comparison on Flashscore. This Actor is not affiliated with Flashscore or any bookmaker.

### More from Min Maxxxer

- ⚽ [Soccer & Football Betting Odds](https://apify.com/sports-odds-lab/football-odds-results) — opening and closing odds of 40+ bookmakers, seasons back to 2005
- 🎾 [Tennis Scraper: Betting Odds, Results & Live Scores](https://apify.com/sports-odds-lab/tennis-odds-results) — ATP, WTA, Challenger and ITF with odds back to 2009
- 🏀 [NBA, NFL, MLB & NHL Odds](https://apify.com/sports-odds-lab/nba-nfl-mlb-nhl-odds) — moneyline, spread and total history back to 2009
- ⏱️ [Flashscore Scraper: 24 Sports](https://apify.com/sports-odds-lab/flashscore-scraper) — live scores, results and odds of every sport
- 📊 [Polymarket & Kalshi Scraper](https://apify.com/sports-odds-lab/polymarket-kalshi-odds) — prediction market odds and history

⭐ **Found a good one?** A short review on this page helps other bettors find the Actor.

### Changelog

- **0.1** — first release: arbitrage and value bets across 24 sports and about 30 bookmakers; match winner / 1X2, handicap and total lines, both teams to score; stake split and Kelly; four filters against false signals; only-new mode for schedules.

# Actor input Schema

## `find` (type: `array`):

Arbitrage: the best prices of every outcome of one bet, at different bookmakers, add up to less than 100 % — staking as shown returns the same amount whatever happens. Value bets: a bookmaker's price above the fair (margin-free) price of the rest of the market.

## `sports` (type: `array`):

Sports to scan. Each sport adds its matches of the next hours; football and tennis have the most.

## `hoursAhead` (type: `integer`):

Matches starting within this many hours (up to 168 = 7 days). Prices closest to kick-off are the most accurate.

## `maxMatches` (type: `integer`):

The matches that start first are scanned first (0 = all). About 600 matches take a minute or two.

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

Match winner = 1X2 where draws are possible (plus the 2-way winner with overtime in ice hockey). Handicap and total: every line, each kind of line kept apart (games vs sets in tennis). Both teams to score: football.

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

Optional. Names or parts of names, e.g. bet365, Betfred, Skybet, Betway, DraftKings, FanDuel, Betano. Leave empty for all (about 30 per match).

## `excludeBookmakers` (type: `array`):

Optional. Bookmakers never to bet with (they still count in the fair price).

## `minProfitPct` (type: `number`):

Guaranteed return above the total stake, in %.

## `maxProfitPct` (type: `number`):

Bigger "arbitrages" are almost always a bookmaker's error that it will void (palpable error). Raise it to see them anyway.

## `stake` (type: `number`):

Split across the legs of every arbitrage, in your currency.

## `minEdgePct` (type: `number`):

Price × fair probability − 1, in %. 4 % keeps the clearer cases; 2 % finds many more.

## `maxEdgePct` (type: `number`):

Edges above this are usually stale or wrong prices.

## `maxOdds` (type: `number`):

Leave out long shots (decimal odds above this).

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

A bet is checked only when at least this many bookmaker brands price it — a thin market has no reliable fair price.

## `countries` (type: `array`):

Optional. Country of the competition as on Flashscore, e.g. England, Spain, USA, World, Europe.

## `competitions` (type: `array`):

Optional. 'Country: Competition' as on Flashscore, e.g. 'England: Premier League', 'USA: NBA', or just 'NBA'.

## `includeWomen` (type: `boolean`):

Women's leagues and tournaments (WTA, women's football, basketball…).

## `includeYouth` (type: `boolean`):

Thinly priced; off by default.

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

Odds in the output: decimal (2.10) or American (+110).

## `onlyNew` (type: `boolean`):

Leave out (and don't pay for) opportunities that earlier runs of the same search already delivered in the last 24 hours, unless the profit or edge grew by a point since. Remembered in your account (key-value store 'arbitrage-finder-seen').

## `historyName` (type: `string`):

Optional. Each search keeps its own history automatically; give several schedules the same name to share one.

## `concurrency` (type: `integer`):

Parallel requests to the source.

## Actor input object example

```json
{
  "find": [
    "arbitrage",
    "value"
  ],
  "sports": [
    "soccer",
    "tennis",
    "basketball",
    "hockey",
    "americanFootball",
    "baseball",
    "volleyball",
    "handball"
  ],
  "hoursAhead": 24,
  "maxMatches": 300,
  "markets": [
    "matchWinner",
    "handicap",
    "total",
    "btts"
  ],
  "minProfitPct": 0.5,
  "maxProfitPct": 5,
  "stake": 100,
  "minEdgePct": 4,
  "maxEdgePct": 15,
  "maxOdds": 6,
  "minBookmakers": 5,
  "includeWomen": true,
  "includeYouth": false,
  "oddsFormat": "decimal",
  "onlyNew": false,
  "concurrency": 128
}
```

# Actor output Schema

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

One row per arbitrage or value bet, best first.

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

Full rows: every leg with its stake, fair odds, Kelly stake, other bookmakers with value.

# 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 = {
    "find": [
        "arbitrage",
        "value"
    ],
    "sports": [
        "soccer",
        "tennis",
        "basketball",
        "hockey",
        "americanFootball",
        "baseball",
        "volleyball",
        "handball"
    ],
    "hoursAhead": 24,
    "maxMatches": 300
};

// Run the Actor and wait for it to finish
const run = await client.actor("sports-odds-lab/arbitrage-value-bets-finder").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 = {
    "find": [
        "arbitrage",
        "value",
    ],
    "sports": [
        "soccer",
        "tennis",
        "basketball",
        "hockey",
        "americanFootball",
        "baseball",
        "volleyball",
        "handball",
    ],
    "hoursAhead": 24,
    "maxMatches": 300,
}

# Run the Actor and wait for it to finish
run = client.actor("sports-odds-lab/arbitrage-value-bets-finder").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 '{
  "find": [
    "arbitrage",
    "value"
  ],
  "sports": [
    "soccer",
    "tennis",
    "basketball",
    "hockey",
    "americanFootball",
    "baseball",
    "volleyball",
    "handball"
  ],
  "hoursAhead": 24,
  "maxMatches": 300
}' |
apify call sports-odds-lab/arbitrage-value-bets-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sports-odds-lab/arbitrage-value-bets-finder"
        }
    }
}
```

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/PfbgrmAEHVVnPGm4R/builds/Ba8M6CA0t3ZZZhvkN/openapi.json
