Sports Odds Scraper — No-Vig Fair Odds, Hold & CLV avatar

Sports Odds Scraper — No-Vig Fair Odds, Hold & CLV

Pricing

$3.00 / 1,000 game odds

Go to Apify Store
Sports Odds Scraper — No-Vig Fair Odds, Hold & CLV

Sports Odds Scraper — No-Vig Fair Odds, Hold & CLV

Sports betting odds with the vig removed: for each game, the moneyline, spread and total, plus computed fair (vig-free) win probabilities, the book's hold %, and the opening-vs-current line move as a closing-line-value signal. No API key, no login.

Pricing

$3.00 / 1,000 game odds

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Categories

Share

Sports Odds Scraper — No-Vig Fair Odds, Hold & CLV 📊

foXLabs betting data: fair (vig-free) win probabilities · the book's hold · opening-vs-current line movement

🎉 Turn raw sportsbook lines into the numbers bettors actually use: for every game, the moneyline, spread and total, plus the fair win probability with the vig removed, the book's hold %, and how the line moved from open to now (a closing-line-value signal). No API key, no login. Built for value bettors and sharps, models and quants, and AI agents.

🔍 What is the Sports Odds Scraper — and when should you use it?

Pick a league and get one clean row per game:

  • Raw lines — moneyline (home/away), point spread and total (over/under), as the book posts them.
  • Fair odds (no-vig) — the vig stripped out of the two-way moneyline, so you get the true implied win probability for each side, plus the book's hold.
  • Line movement (CLV) — the opening line next to the current line, for spread, total and moneyline, including the shift in fair probability.

Use it when you need: fair probabilities to compare against your own model; the book's hold to judge a market's efficiency; or opening-to-current movement to measure closing-line value.

Single-book, by design: the source exposes one sportsbook's lines, so this computes fair odds, hold and line movement from that book — it is not a multi-book line-shopping or arbitrage tool.

🤖 Use with AI agents

Already on the Apify MCP server? Ask for it by name: foxlabs/sports-odds-no-vig-clv.

Your agent can pay for its own runs — pay-per-event with agentic payments over x402 (USDC on Base) or Skyfire, with no Apify account of its own. Billing is per delivered game, never for errors or empty results.

Paste into Claude, ChatGPT, Cursor or any MCP assistant:

Use the Apify Actor `foxlabs/sports-odds-no-vig-clv`.
Input: `league` = nfl | college-football | nba | wnba | mens-college-basketball | mlb | nhl;
`status` = all | scheduled | live | final; `dates` = YYYYMMDD or a range; `maxResults` caps games.
Start with: { "league": "nfl", "status": "scheduled", "maxResults": 20 }

Things you can ask your agent:

  • "What are the fair, vig-free win probabilities for tonight's NBA games?"
  • "Which NFL games moved most from their opening line?"
  • "List this week's games with the book's hold on each."

Machine-readable output: every run writes a JSON dataset you can pull from the Apify API or the .json dataset endpoint.

📋 Overview

The Sports Odds Scraper reads a public, keyless sports data source live on every run and returns one clean, camelCase row per game, with the fair-odds and line-movement maths already done. There is nothing to configure: no API key, no login, no odds-API key to buy.

Why teams pick this actor:

  • 🧮 The maths is done — fair no-vig probabilities and the hold, computed for you, not raw American odds you have to convert.
  • 📉 Closing-line value built in — opening vs current line for spread, total and moneyline, plus the fair-probability shift.
  • 🔑 Zero setup — no API key, no login, no paid odds API.
  • ♻️ Fresh every run — reads the source live, so lines reflect the latest the book has posted.
  • 🤝 Agent-ready — MCP + x402, billed per delivered game.

✨ Features

  • 💰 Raw lines — moneyline (home/away), point spread, total (over/under) with over/under prices.
  • 🎯 No-vig fair odds — vig removed from the two-way moneyline → true implied win probability per side.
  • 📐 Book hold % — the overround, i.e. how much edge the book builds into the two-way price.
  • 📈 Line movement (CLV) — opening vs current spread, total and moneyline, plus the home fair-probability shift.
  • 🏈 Seven leagues — NFL, NCAA Football, NBA, WNBA, NCAA Basketball, MLB, NHL.
  • 🗓️ Any slate — current scoreboard, a single date, or a date range; filter by scheduled / live / final.
  • 📦 Clean export — one camelCase row per game, ready for CSV/Excel/JSON.

🎬 Quick Start

curl -X POST "https://api.apify.com/v2/acts/foxlabs~sports-odds-no-vig-clv/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"league": "nfl", "status": "scheduled", "maxResults": 20}'

🚀 Getting Started (3 steps)

  1. Pick a league — nfl, nba, mlb, nhl and more.
  2. Set the slate — status (scheduled/live/final/all), dates for a specific day or range, maxResults to cap games.
  3. Run and export — download the dataset as JSON, CSV or Excel, or pull it from the API.

📥 Input

{
"league": "nfl",
"status": "scheduled",
"dates": "",
"maxResults": 50
}
FieldTypeDescription
leaguestringnfl, college-football, nba, wnba, mens-college-basketball, mlb, nhl.
statusstringall, scheduled (upcoming), live, or final.
datesstringA single day (20261103) or a range (20261101-20261108). Empty = current scoreboard.
maxResultsintegerCap on delivered games (0 = 50).
concurrencyintegerParallel odds lookups (1–10).
proxyConfigurationobjectApify datacenter by default — no setup needed.

📤 Output

Game (one row per game):

{
"type": "game",
"eventId": "401873036",
"league": "nfl", "sport": "football",
"name": "CHI @ SEA",
"home": { "name": "Seattle Seahawks", "abbr": "SEA", "id": "26" },
"away": { "name": "Chicago Bears", "abbr": "CHI", "id": "3" },
"date": "2026-11-03T01:15Z", "status": "pre", "statusLabel": "Scheduled",
"provider": "DraftKings",
"moneyline": { "home": -180, "away": 150, "homeOpen": -218, "awayOpen": 180 },
"spread": { "home": -3, "homeOpen": -4.5, "details": "SEA -3" },
"total": { "current": 46.5, "open": 47.5, "overOdds": -110, "underOdds": -110 },
"fair": { "homeProb": 0.6164, "awayProb": 0.3836, "holdPct": 4.29 },
"fairOpen": { "homeProb": 0.6575, "awayProb": 0.3425, "holdPct": 4.27 },
"lineMove": { "spread": 1.5, "total": -1, "homeProbShift": -0.0411 },
"source": "ESPN", "scrapedAt": "2026-11-02T10:00:00.000Z"
}
FieldTypeDescription
home / awayobjectTeam name, abbreviation and id.
moneylineobjectCurrent and opening American moneyline for each side.
spreadobjectCurrent and opening home point spread.
totalobjectCurrent and opening total, with over/under prices.
fairobjectNo-vig implied win probability per side (0–1) and the book holdPct.
fairOpenobjectThe same fair probabilities computed from the opening moneyline.
lineMoveobjectOpen→current change: spread, total, and homeProbShift (fair-probability move).
statusstringpre (scheduled), in (live), post (final).

💼 Use cases

  • Model comparison
    • Input: { "league": "nba", "status": "scheduled" }
    • Output: fair no-vig probabilities for every upcoming game.
    • Use: compare the market's fair line to your model and flag disagreements.
  • CLV tracking
    • Input: run on a schedule (e.g. hourly) and store each snapshot.
    • Output: opening-vs-current line and the fair-probability shift.
    • Use: measure closing-line value and spot where the line is moving.
  • Market-efficiency screen
    • Input: { "league": "nfl", "status": "all" }
    • Output: the book's hold on each game.
    • Use: find the tightest (most efficient) and widest markets.

🔗 Integration

JavaScript (Apify client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/sports-odds-no-vig-clv').call({ league: 'nfl', status: 'scheduled', maxResults: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python (Apify client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("foxlabs/sports-odds-no-vig-clv").call(run_input={"league": "nfl", "status": "scheduled", "maxResults": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

n8n / Zapier / Make: use the Apify connector, pick this actor, map league and status, then route the dataset into your sheet, database or webhook.

📊 Pricing

Pay per result (PPE). You are billed only for delivered games, never for errors or empty runs.

EventPrice
game (one game: raw lines + fair odds + hold + line movement)$0.003

A 50-game slate costs about $0.15. There is no monthly rental and no minimum.

❓ FAQ

What does "no-vig" mean, and how do you compute it?

The vig (or juice) is the margin a sportsbook builds into its prices, which makes the two sides' implied probabilities add up to more than 100%. To remove it, we convert each side's American moneyline to an implied probability, then divide each by their sum so they total exactly 100%. The result is the fair win probability — what the market implies once the book's cut is taken out. We also report that cut as holdPct.

What is CLV and how does this actor measure it?

Closing-line value (CLV) is the difference between the line you got and the line at close; beating the closing line is the single best long-run predictor of betting skill. ESPN's source carries both the opening and the current line, so each row shows the opening and current spread, total and moneyline, plus homeProbShift — how much the fair home probability moved from open to now. Run the actor near game time and the current line is effectively the closing line.

Does this compare multiple sportsbooks or find arbitrage?

No. The source exposes a single book's lines (currently DraftKings), so this actor is single-book: it computes fair odds, the hold and the open-to-current move from that one book. It does not shop lines across books or detect arbitrage between them. If you need the best price across many books, this is not the right tool — and most multi-book tools require a paid odds-API key, which this actor deliberately avoids.

Which leagues and games are covered?

NFL, NCAA Football, NBA, WNBA, NCAA Basketball (men), MLB and NHL. For each, the actor returns the games on the current scoreboard — or on the date/range you pass — with odds wherever the book has posted them. A game with no posted line still returns its teams, date and status, with the odds fields omitted.

How current are the odds?

Every run reads the source live, so lines reflect what the book has posted at run time. Odds move continuously up to kickoff, so a run is a snapshot; schedule the actor to capture how a line moves and to lock in the closing line.

Can I pull a specific day or a whole week?

Yes. Pass dates as a single day (20261103) or a range (20261101-20261108). Leave it empty for the league's current scoreboard, which is this week for weekly sports and today for daily ones.

How do I read the fair probabilities?

fair.homeProb and fair.awayProb are the vig-free implied win probabilities for the home and away sides; they always sum to 1. For example, a home 0.6164 means the market implies a 61.6% home win once the vig is removed. Compare these to your own estimate: if you think the home side is likelier than the fair line says, that side has value.

What's the difference between fair and fairOpen?

fair is computed from the current moneyline; fairOpen from the opening moneyline. Comparing them (or reading lineMove.homeProbShift) tells you how the market's opinion has shifted since the line opened — the probability-space view of line movement.

Can I get player props or live in-game odds?

This actor focuses on the main markets — moneyline, spread and total — plus their fair odds and movement. Full player-prop trees are not included in this release. Live games (status: live) return the current line as the book has it in-play.

Can I export to CSV, Excel or JSON?

Yes. Download the dataset as JSON, CSV or Excel from the Apify console, or pull it straight from the Apify API or the dataset's .json endpoint for a pipeline or an AI agent.

How is this different from a raw odds scraper?

A raw odds scraper hands you American prices you still have to convert and de-vig yourself. This actor does that maths for you — fair probabilities, the hold, and the open-to-current move in both line and probability terms — so the output is ready to compare against a model or log for CLV.

🐛 Troubleshooting

  • A game has no odds — the book had not posted a line for it at run time; the game still returns teams, date and status.
  • Fewer rows than maxResults — maxResults is a cap, not a target; a slate returns the games the scoreboard currently has.
  • Empty result — check the league slug and, if you set dates, that games fall on that day/range; leave dates empty for the current slate.
  • provider name varies — the source may print the book as "DraftKings" or "Draft Kings"; it is the same book.

⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to ESPN, any sportsbook or any league. All marks belong to their owners and are used for identification only.

This actor reads publicly available, non-personal sports odds that are already published for public viewing. It collects no private or personal data and requires no login. Sports-betting laws vary by jurisdiction; you are responsible for using the output in line with applicable laws and the terms of the sites you rely on, and for betting only where it is legal to do so. When in doubt, consult a lawyer.

🤝 Support & contact

Changelog

0.1 — 2026-11-02

  • Initial release: moneyline, spread and total for NFL, NCAAF, NBA, WNBA, NCAAB, MLB and NHL, with computed no-vig fair probabilities, book hold and opening-vs-current line movement (CLV). Keyless source, single book.