Action Network Arbitrage & +EV Signals avatar

Action Network Arbitrage & +EV Signals

Pricing

from $1.23 / 1,000 item extracteds

Go to Apify Store
Action Network Arbitrage & +EV Signals

Action Network Arbitrage & +EV Signals

Compare Action Network sportsbook odds and export best prices, implied probabilities, arbitrage margins, and candidate positive-EV signals.

Pricing

from $1.23 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Categories

Share

Compare public Action Network sportsbook quotes and export source-attributed best prices, implied probabilities, cross-book arbitrage margins, and candidate positive-EV signals.

This Actor turns the Action Network scoreboard into analysis-ready game-market records. Each record compares the same moneyline, spread, or total across sportsbooks instead of returning one disconnected row per quote.

Important: outputs are analytical candidates, not betting advice or guaranteed executable opportunities. Sportsbook prices can be delayed, suspended, limited, or unavailable by the time a run finishes.

What does this Action Network Actor do?

The Actor requests public Action Network scoreboard data for selected leagues and dates, groups compatible quotes, and calculates:

  • the best displayed American and decimal price for every outcome;
  • raw implied probability for each quote;
  • median same-book no-vig probability for each outcome;
  • theoretical equal-payout arbitrage return from the best prices;
  • candidate expected value at each displayed price;
  • an illustrative stake allocation for equal theoretical payout;
  • source URLs, API URLs, book IDs, timestamps, and game identity.

Moneylines are compared event by event. Spreads are compared only when books offer the same home/away line. Totals are compared only when books offer the same total. That prevents unlike markets from being presented as an arbitrage pair.

Who is it for?

Use this Actor if you are a:

  • odds analyst comparing displayed prices across books;
  • sports data engineer building a normalized monitoring feed;
  • quantitative researcher studying implied probability and overround;
  • content or trading-operations team reviewing line dispersion;
  • developer feeding Action Network data into a database, dashboard, or alerting workflow.

Choose the related raw line-movement Actor when you need one flat row per sportsbook snapshot without cross-book calculations.

Why use this instead of a raw odds export?

A raw odds export leaves the buyer to match events, align spread or total lines, convert American odds, remove vig, and rank prices.

This Actor performs those steps in one run while retaining the underlying source-attributed quotes. You can audit every calculated signal against quotes, bestPrices, apiUrl, and sourceUrl.

The output deliberately says candidate arbitrage and candidate positive EV. It does not claim that a displayed line is still executable or that the consensus estimate is a true probability.

Supported leagues and markets

Supported Action Network league slugs are:

  • mlb
  • nba
  • nfl
  • nhl
  • ncaab
  • ncaaf

Supported market types are:

MarketComparison ruleOutcomes
moneylineSame Action Network gamehome, away, and draw when exposed
spreadSame game and exact home spreadhome, away
totalSame game and exact totalover, under

Coverage depends on the events, books, and prices currently exposed by Action Network. The Actor does not log in and does not access private account data.

Input parameters

FieldTypeDefaultPurpose
leaguesstring array['mlb']League scoreboards to analyze
datesstring arraycurrent UTC dateDates in YYYY-MM-DD or YYYYMMDD
bookIdsstring arraycommon US book IDsAction Network sportsbooks to compare
marketTypesstring arrayall three marketsmoneyline, spread, and/or total
includeAllMarketsbooleantrueKeep all compatible comparisons, not only positive candidates
minArbitragePercentnumber0Arbitrage ROI threshold used in filtered mode
minPositiveEvPercentnumber0Consensus-based EV threshold used in filtered mode
includeLivebooleantrueKeep games marked live or in progress
includeCompletedbooleanfalseKeep completed games when quotes remain exposed
maxItemsinteger50Maximum saved game-market records, from 1 to 1,000

When includeAllMarkets is false, a market is retained if it meets either the arbitrage threshold or the positive-EV threshold.

Getting started

  1. Open the Actor in Apify Console.
  2. Keep mlb for a small first run, or select another in-season league.
  3. Choose the market types you need.
  4. Leave Include all analyzed markets enabled to inspect calculation coverage.
  5. Set a modest maxItems, such as 20.
  6. Start the run.
  7. Open the default dataset and select the Sportsbook signals view.
  8. Expand bestPrices and quotes to audit each calculation.
  9. Schedule the Task only after confirming that the selected league and dates regularly return useful markets.

A practical first input is:

{
"leagues": ["mlb"],
"marketTypes": ["moneyline", "spread", "total"],
"includeAllMarkets": true,
"maxItems": 20
}

Output fields

The default dataset contains one item per compatible game-market-line comparison.

FieldMeaning
signalIdStable hash for league, game, market, and line
league, gameIdSource event identity
awayTeam, homeTeamMatched teams
marketType, lineCompared market and shared line
candidateArbitrageWhether the displayed best prices imply positive theoretical ROI
arbitrageRoiPercent100 × (1 / impliedProbabilitySum − 1)
candidatePositiveEvWhether a best price has positive consensus-based EV
bestPositiveEvPercentHighest calculated EV among best outcome prices
bestPricesBest source-attributed quote and stake percentage per outcome
quotesAll complete quotes used in the comparison
sportsbookCountDistinct contributing book IDs
sourceUrl, apiUrlPublic source references
observedAtCalculation timestamp
methodologyConcise calculation and risk note

Nullable source fields remain null; the Actor does not invent missing timestamps or labels.

Example dataset item

This trimmed example shows the emitted shape. Team names and identifiers are illustrative; actual runs contain current public source values.

{
"signalId": "a73e9f029451be120a4d",
"league": "mlb",
"gameId": 123456,
"awayTeam": "Sample City Hawks",
"homeTeam": "Example City Bears",
"marketType": "moneyline",
"line": null,
"candidateArbitrage": false,
"arbitrageRoiPercent": -1.284,
"impliedProbabilitySum": 1.01301,
"candidatePositiveEv": true,
"bestPositiveEvPercent": 1.72,
"sportsbookCount": 6,
"bestPrices": [
{
"outcome": "home",
"bookId": 15,
"bookName": "DraftKings",
"americanOdds": 125,
"decimalOdds": 2.25,
"fairProbability": 0.4521,
"expectedValuePercent": 1.722,
"stakePercent": 43.88
}
],
"sourceUrl": "https://www.actionnetwork.com/mlb/odds",
"observedAt": "2026-08-19T20:15:00.000Z"
}

The full row contains one bestPrices entry per outcome and every valid underlying quote.

How are arbitrage and positive EV calculated?

American prices are converted to decimal odds and raw implied probabilities.

For arbitrage analysis, the Actor selects the highest decimal price for each compatible outcome. It sums those implied probabilities and calculates equal-payout theoretical ROI:

ROI % = 100 × (1 / sum(best implied probabilities) - 1)

For positive-EV analysis, each complete same-book outcome set is normalized to remove that book's displayed overround. The Actor takes the median no-vig probability by outcome across books, then evaluates each quote:

candidate EV % = 100 × (fair probability × decimal odds - 1)

This is an explainable consensus model, not a predictive model. It does not include account-specific limits, taxes, latency, slippage, settlement differences, promotions, or sportsbook fees.

How much does it cost to compare Action Network sportsbook markets?

The Actor uses pay-per-event pricing:

  • a one-time run started charge of $0.00005;
  • an item charge for each game-market comparison saved to the dataset;
  • no separate charge for nested quotes or calculations within an item.

The BRONZE item price is $0.002052 per saved market comparison. The six canonical volume tiers decrease from FREE through DIAMOND.

At the BRONZE rate:

Saved market recordsExample charge
1about 0.002102 USD including start
20about 0.04109 USD including start
100about 0.20525 USD including start

The final amount follows the active pricing shown in Apify Console. A run that finds fewer compatible markets charges for fewer items. Platform compute charges may be handled according to your Apify plan.

Recurring monitoring workflows

Create an Apify Task with a stable input and schedule it for the cadence your analysis needs.

Useful patterns include:

  1. Broad comparison feed — keep includeAllMarkets: true, export all compatible markets, and compare snapshots in your database.
  2. Candidate-only feed — set includeAllMarkets: false and retain only records meeting either configured threshold.
  3. Moneyline monitor — request only moneyline to produce one compact comparison per qualifying event.
  4. Date-specific research — pass explicit historical or future scoreboard dates when Action Network exposes them.
  5. Webhook pipeline — send the dataset-ready run event to an automation that validates freshness before generating an alert.

Store the signalId, observedAt, best prices, and inserted timestamps if you need change detection between runs.

Integrations and exports

The default dataset works with:

  • Apify schedules and webhooks;
  • CSV, JSON, Excel, XML, and RSS dataset exports;
  • Google Sheets or cloud-storage integrations;
  • Python or JavaScript analytics pipelines;
  • databases and BI dashboards;
  • alerting systems that apply their own freshness and execution checks.

For large recurring jobs, consume dataset items through the API rather than copying expanded nested arrays manually from Console.

Run with the Apify API

Replace YOUR_TOKEN with your Apify API token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~action-network-sportsbook-arbitrage-signals/runs?token=YOUR_TOKEN&waitForFinish=120" \
-H "Content-Type: application/json" \
-d '{"leagues":["mlb"],"marketTypes":["moneyline"],"maxItems":20}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/action-network-sportsbook-arbitrage-signals').call({
leagues: ['mlb'],
marketTypes: ['moneyline', 'spread', 'total'],
includeAllMarkets: true,
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/action-network-sportsbook-arbitrage-signals').call(
run_input={
'leagues': ['mlb'],
'marketTypes': ['moneyline'],
'includeAllMarkets': True,
'maxItems': 20,
}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use with MCP and AI agents

Add the Apify MCP server in Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/action-network-sportsbook-arbitrage-signals"

Claude Desktop

Add this server object to the mcpServers section of Claude Desktop's MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/action-network-sportsbook-arbitrage-signals"
}
}
}

Cursor

Open Settings → Tools & Integrations → MCP, add a remote server, and use the same Apify MCP URL shown above.

VS Code

Add an HTTP MCP server to your workspace MCP configuration using the same URL, then select the Actor tool from the available Apify tools.

Example prompts:

  • “Run the Action Network Actor for today's MLB moneylines and summarize the best displayed price per team.”
  • “Compare spread and total markets, but clearly label candidate calculations and source timestamps.”
  • “Create a scheduled monitoring input that keeps only non-negative arbitrage or consensus EV candidates.”

An AI agent should not turn a candidate flag into a wagering instruction without independent price, eligibility, and risk checks.

Limits and failure behavior

  • The Actor depends on an undocumented public Action Network web endpoint that may change.
  • The source may expose no games or no complete multi-book quotes for a league/date.
  • Book names are best-effort; unknown IDs appear as Book <id>.
  • Prices may be stale, suspended, geo-restricted, account-specific, or unavailable at execution time.
  • Spread and total comparisons require identical lines.
  • A successful no-result run is possible for an off-season league or empty date.
  • If every requested scoreboard call fails or returns an unrecognized shape, the run fails instead of returning a misleading empty success.
  • Transient network, HTTP 429, and server errors receive bounded retries.
  • There is no browser, login, proxy, or residential fallback mode.

Use smaller league/date batches when diagnosing a source change.

Responsible use and legality

Only collect and use data you are authorized to access. Review Action Network's terms, applicable sportsbook terms, database rights, local gambling laws, and your organization's compliance obligations.

Do not use the Actor to bypass login, geographic controls, age restrictions, responsible-gambling controls, account limits, or platform security. The Actor reads public source data and does not place bets.

Calculated probabilities and returns can be wrong because of source errors, stale quotes, differing settlement rules, or model assumptions. Treat the output as research data, not financial advice, betting advice, or a promise of profit.

Troubleshooting

The dataset is empty

Confirm that the league is in season and that the selected date has games with at least two complete quotes from your selected bookIds. Enable includeAllMarkets and include all three market types while diagnosing.

The run fails with an Action Network HTTP error

Retry later with one league and one date. If every request fails after bounded retries, inspect the run log for the status and league/date. The Actor intentionally does not hide a source-wide failure as zero results.

A sportsbook name appears as Book 79

Action Network may expose book IDs that are not in the best-effort label map. The numeric bookId remains the source identity. Do not infer a brand name without validating it against current source metadata.

A candidate arbitrage return looks unusually large

Inspect every best quote's insertedAt, confirm the event and line, open the source, and verify both prices directly. One stale or suspended quote can create a theoretical candidate that is not executable.

Why are similar spread records separate?

A home spread of -1.5 is not the same market as -2.0. Separate records prevent the Actor from combining unlike outcomes.

FAQ

Does the Actor place bets?

No. It only exports public source data and calculations.

Is candidate positive EV a prediction?

No. It is based on median same-book no-vig probabilities across currently displayed quotes. It is an explainable consensus estimate, not a trained forecasting model.

Are odds guaranteed to be live?

No. observedAt records calculation time and quote insertedAt values show source timestamps when available, but the Actor cannot guarantee execution-time availability.

Can I request one sportsbook only?

You can, but signal records require at least two compatible sportsbook rows. Use the raw Action Network line-movement Actor for single-book snapshot extraction.

Can I monitor line movement?

Schedule repeated runs and compare records in your own storage. This Actor does not maintain a cross-run history dataset automatically.

These Actors solve adjacent jobs; they do not silently contribute data to this Actor's calculations.