Sports Odds Arbitrage Finder avatar

Sports Odds Arbitrage Finder

Pricing

from $0.85 / 1,000 matches

Go to Apify Store
Sports Odds Arbitrage Finder

Sports Odds Arbitrage Finder

Find pre-match sports arbitrage opportunities, guaranteed-profit stake splits, and freshness signals from Sportsmonks odds data.

Pricing

from $0.85 / 1,000 matches

Rating

0.0

(0)

Developer

Trove Vault

Trove Vault

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Find pre-match football arbitrage and live in-play arbitrage candidates from your Sportsmonks odds feed. The Actor compares bookmaker prices for upcoming and current football markets, returns guaranteed pre-match arbitrage rows when the best odds imply less than 100% probability, and marks live rows as candidates because in-play odds can suspend or move before execution.

The output is built for fast triage: event, league, market, arbitrage percentage, implied probability total, stake split, bookmaker selections, and odds freshness signals when timestamps are available.

Why use this Actor

Sports odds APIs can return a lot of raw prices, but the work is deciding which events are actionable. This Actor turns odds into ranked arbitrage opportunities:

  • Scan upcoming pre-match opportunities and current in-play fixtures with almost no setup.
  • Compare the main full-time result markets across bookmakers.
  • Get exact pre-match arbitrage rows, live in-play candidates, and near-miss watchlist rows in the same dataset.
  • Get calculated stakes per outcome, not just a list of prices.
  • Keep a clean dataset for scheduled monitoring or downstream alerts.

What it produces

Each dataset row represents one event and market. sourceMode is always prematch or live. Pre-match exact rows use opportunityStatus: "arbitrage_found". Live exact rows use opportunityStatus: "live_arbitrage_candidate" because execution risk is materially higher. Near-miss rows use near_miss_watchlist or live_near_miss_watchlist and show negative profit values so they are not confused with profitable arbitrage.

Important fields include:

  • eventName, leagueName, startTime
  • sourceMode
  • market
  • arbitragePercent
  • impliedProbabilityTotal
  • guaranteedProfit
  • totalStake
  • bestOutcomeSummary
  • outcomes
  • freshnessStatus
  • lastOddsUpdate
  • executionRisk, oddsAgeSeconds on live rows when available

Use cases

Betting analysts can monitor upcoming fixtures and quickly find opportunities worth checking in their own bookmaker accounts.

Trading and odds teams can use the output to benchmark market discrepancies across bookmakers covered by their Sportsmonks plan.

Automation builders can schedule the Actor and send high-margin rows into Slack, a database, or another Apify workflow.

Affiliate and content teams can use the dataset as a source for internal research, provided their Sportsmonks plan and downstream use allow it.

How it works

  1. The Actor reads your encrypted sportsmonksApiToken.
  2. It scans pre-match, live, or both depending on mode.
  3. For pre-match, it scans today through tomorrow by default, or your optional date range.
  4. For live, it checks current in-play fixtures and retrieves in-play odds.
  5. It fetches odds per fixture in parallel for lower latency.
  6. It normalizes odds, markets, selections, bookmakers, and update timestamps.
  7. For each event and market, it selects the best decimal odds per outcome.
  8. It returns exact rows first, then the closest near-miss rows.

The Actor currently targets football odds through Sportsmonks API v3, covering pre-match odds and standard in-play odds. It uses the main full-time result market family by default. Available bookmakers, odds, in-play fixtures, and freshness timestamps depend on your Sportsmonks subscription.

Input

{
"sportsmonksApiToken": "YOUR_SPORTSMONKS_API_TOKEN",
"mode": "both",
"includeNearMissWatchlist": true
}

Input fields

FieldDescription
sportsmonksApiTokenRequired. Encrypted Sportsmonks API token with access to odds data.
modeOptional. both scans pre-match and live in-play odds. Use prematch or live to restrict the scan.
dateFrom / dateToOptional UTC event dates in YYYY-MM-DD format. Leave empty to scan today through tomorrow.
includeNearMissWatchlistOptional. Keep true to include close markets to monitor. Set false to return only direct arbitrage/candidate rows.

The Actor uses sensible internal defaults: football, mode: "both", main full-time result markets, all upcoming fixtures in the selected date window, current live fixtures, EUR stake labels, and a 500 total stake for stake-split calculations.

Output example

{
"opportunityStatus": "arbitrage_found",
"sourceMode": "prematch",
"profitSignal": "solid_margin",
"sport": "football",
"leagueName": "Premier League",
"eventId": "123456",
"eventName": "Team A vs Team B",
"startTime": "2026-07-04T18:00:00.000Z",
"market": "1X2",
"arbitragePercent": 3.42,
"impliedProbabilityTotal": 96.69,
"guaranteedProfit": 17.1,
"currency": "EUR",
"totalStake": 500,
"outcomeCount": 3,
"bestOutcomeSummary": "Team A: Bookmaker 1 @ 2.2 stake 219.77 | Draw: Bookmaker 2 @ 3.6 stake 134.31 | Team B: Bookmaker 3 @ 3.3 stake 145.92",
"outcomes": [
{
"selection": "Team A",
"bookmaker": "Bookmaker 1",
"odds": 2.2,
"stake": 219.77,
"payout": 483.49,
"updatedAt": "2026-07-02T09:15:00.000Z"
},
{
"selection": "Draw",
"bookmaker": "Bookmaker 2",
"odds": 3.6,
"stake": 134.31,
"payout": 483.52,
"updatedAt": "2026-07-02T09:14:00.000Z"
},
{
"selection": "Team B",
"bookmaker": "Bookmaker 3",
"odds": 3.3,
"stake": 145.92,
"payout": 481.54,
"updatedAt": "2026-07-02T09:13:00.000Z"
}
],
"freshnessStatus": "fresh",
"lastOddsUpdate": "2026-07-02T09:15:00.000Z",
"oldestOddsUpdate": "2026-07-02T09:13:00.000Z",
"runId": null
}

Near-miss rows use the same shape but are clearly marked:

{
"opportunityStatus": "near_miss_watchlist",
"sourceMode": "prematch",
"profitSignal": "near_miss",
"eventName": "Team A vs Team B",
"market": "Fulltime Result",
"arbitragePercent": -0.27,
"impliedProbabilityTotal": 100.27,
"guaranteedProfit": -1.35,
"bestOutcomeSummary": "Away: Coral @ 11 stake 45.3 | Draw: Ladbrokes @ 5.5 stake 90.6 | Home: Dafabet @ 1.37 stake 363.1"
}

Near-miss rows are a radar signal only. They mean the best available prices are close to arbitrage, not that the stake split is guaranteed profitable.

Live rows use sourceMode: "live" and candidate statuses:

{
"opportunityStatus": "live_arbitrage_candidate",
"sourceMode": "live",
"profitSignal": "thin_margin",
"executionRisk": "high",
"oddsAgeSeconds": 8,
"eventName": "Team A vs Team B",
"market": "Fulltime Result",
"arbitragePercent": 0.41,
"impliedProbabilityTotal": 99.59,
"guaranteedProfit": 2.05,
"bestOutcomeSummary": "Away: Bookmaker 1 @ 4.8 stake 103.76 | Draw: Bookmaker 2 @ 3.9 stake 127.7 | Home: Bookmaker 3 @ 1.86 stake 268.54"
}

Live candidate rows are not guaranteed execution opportunities. They mean the current in-play odds snapshot calculates as profitable before fees, limits, suspension, account rules, and odds movement.

API usage

curl "https://api.apify.com/v2/acts/TROVEVAULT_ACTOR_ID/runs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-d '{
"sportsmonksApiToken": "YOUR_SPORTSMONKS_API_TOKEN",
"mode": "both",
"includeNearMissWatchlist": true
}'

After the run finishes, fetch the default dataset items:

curl "https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true" \
-H "Authorization: Bearer $APIFY_TOKEN"

Limitations

  • The Actor does not place bets.
  • Profit is calculated before bookmaker fees, limits, void rules, delays, account restrictions, currency conversion, and odds movement.
  • Output depends on the sports, bookmakers, markets, and update timestamps available in your Sportsmonks plan.
  • This version is designed for football odds. Multi-sport support needs additional Sportsmonks endpoint adapters.
  • Live rows are in-play arbitrage candidates, not guaranteed executed arbitrage. The Actor filters stopped and suspended in-play odds, but prices can still move before a user acts.
  • Near-miss watchlist rows are not guaranteed-profit arbitrage. They are ranked cases that are close enough to monitor or manually re-check. Set includeNearMissWatchlist to false to hide them.
  • If Sportsmonks returns odds without update timestamps, the Actor can still calculate opportunities but marks freshness as unknown_age.
  • If your Sportsmonks plan does not include odds, the run summary will show the API or data-access failure.

FAQ

Do I need a Sportsmonks account?

Yes. This Actor uses your own Sportsmonks API token. The token is marked as a secret input in Apify.

Does this use MCP connectors?

Not in v1. Apify MCP connectors are a good option when a third-party service exposes an MCP server, but this Actor uses direct Sportsmonks API-token authentication because that is the documented access path.

Why did I get zero rows?

Common reasons:

  • No exact arbitrage, live candidate, or near-miss case was found in the scanned fixtures.
  • Your API plan did not return odds for the requested events.

This Actor is a data analysis tool. You are responsible for complying with Sportsmonks terms, bookmaker terms, local betting laws, and any rules around publishing or acting on odds data.

Changelog

  • 0.1 - Pre-match and live football arbitrage scanner with Sportsmonks token input, fast fixture-level odds fetching, sourceMode labels, exact pre-match rows, live candidate rows, near-miss watchlist rows, stake split calculation, freshness handling, and Apify dataset output.