Action Network Arbitrage & +EV Signals
Pricing
from $1.23 / 1,000 item extracteds
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
Maintained by CommunityActor 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:
mlbnbanflnhlncaabncaaf
Supported market types are:
| Market | Comparison rule | Outcomes |
|---|---|---|
moneyline | Same Action Network game | home, away, and draw when exposed |
spread | Same game and exact home spread | home, away |
total | Same game and exact total | over, 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
| Field | Type | Default | Purpose |
|---|---|---|---|
leagues | string array | ['mlb'] | League scoreboards to analyze |
dates | string array | current UTC date | Dates in YYYY-MM-DD or YYYYMMDD |
bookIds | string array | common US book IDs | Action Network sportsbooks to compare |
marketTypes | string array | all three markets | moneyline, spread, and/or total |
includeAllMarkets | boolean | true | Keep all compatible comparisons, not only positive candidates |
minArbitragePercent | number | 0 | Arbitrage ROI threshold used in filtered mode |
minPositiveEvPercent | number | 0 | Consensus-based EV threshold used in filtered mode |
includeLive | boolean | true | Keep games marked live or in progress |
includeCompleted | boolean | false | Keep completed games when quotes remain exposed |
maxItems | integer | 50 | Maximum 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
- Open the Actor in Apify Console.
- Keep
mlbfor a small first run, or select another in-season league. - Choose the market types you need.
- Leave Include all analyzed markets enabled to inspect calculation coverage.
- Set a modest
maxItems, such as20. - Start the run.
- Open the default dataset and select the Sportsbook signals view.
- Expand
bestPricesandquotesto audit each calculation. - 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.
| Field | Meaning |
|---|---|
signalId | Stable hash for league, game, market, and line |
league, gameId | Source event identity |
awayTeam, homeTeam | Matched teams |
marketType, line | Compared market and shared line |
candidateArbitrage | Whether the displayed best prices imply positive theoretical ROI |
arbitrageRoiPercent | 100 × (1 / impliedProbabilitySum − 1) |
candidatePositiveEv | Whether a best price has positive consensus-based EV |
bestPositiveEvPercent | Highest calculated EV among best outcome prices |
bestPrices | Best source-attributed quote and stake percentage per outcome |
quotes | All complete quotes used in the comparison |
sportsbookCount | Distinct contributing book IDs |
sourceUrl, apiUrl | Public source references |
observedAt | Calculation timestamp |
methodology | Concise 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 records | Example charge |
|---|---|
| 1 | about 0.002102 USD including start |
| 20 | about 0.04109 USD including start |
| 100 | about 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:
- Broad comparison feed — keep
includeAllMarkets: true, export all compatible markets, and compare snapshots in your database. - Candidate-only feed — set
includeAllMarkets: falseand retain only records meeting either configured threshold. - Moneyline monitor — request only
moneylineto produce one compact comparison per qualifying event. - Date-specific research — pass explicit historical or future scoreboard dates when Action Network exposes them.
- 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 osfrom apify_client import ApifyClientclient = 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().itemsprint(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.
Related Automation Lab Actors
- Action Network Sports Odds Line Movement Scraper — raw current sportsbook snapshots by game, date, and book.
- Bovada Sportsbook Odds Scraper — source-specific Bovada odds extraction.
- Covers Sports Odds and Consensus Scraper — Covers odds and betting-consensus data.
- Polymarket Kalshi Arbitrage Monitor — cross-venue prediction-market matching and candidate spread calculations.
These Actors solve adjacent jobs; they do not silently contribute data to this Actor's calculations.