# Sports Betting Odds Scraper (`parsebird/sports-betting-odds-scraper`) Actor

Scrape live sports betting odds for NFL, NBA, MLB, NHL, soccer, UFC, and more: moneyline, spread, and totals from real sportsbooks, no API key needed.

- **URL**: https://apify.com/parsebird/sports-betting-odds-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** News, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 odds scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Sports Betting Odds Scraper

Sports Betting Odds Scraper is an [Apify Actor](https://apify.com) that extracts live sports betting odds — moneyline, spread, and totals — for NFL, NBA, MLB, NHL, college football/basketball, MLS, Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, the Champions League, Europa League, UFC, and PGA Tour, no API key or sportsbook account required.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Pass one or more league keys and get every scheduled or live event back as clean rows — one per bookmaker, per market, per outcome — with both American and decimal prices, live scores, venue, and game status included on every row.
</td>
</tr></table>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/sports-betting-odds-scraper" (call it via ApifyClient) to scrape sports betting odds. Example: const { ApifyClient } = require('apify-client'); const client = new ApifyClient({ token: '<APIFY_TOKEN>' }); const run = await client.actor('parsebird/sports-betting-odds-scraper').call({ leagues: ['nfl', 'nba'], oddsFormat: 'american', maxItems: 0 }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); Inputs: leagues (array, required, default ["nfl"], valid values nfl/ncaaf/nba/wnba/ncaam/ncaaw/mlb/nhl/mls/epl/laliga/seriea/bundesliga/ligue1/ucl/uel/ufc/pga), dates (string, optional, "YYYYMMDD" or "YYYYMMDD-YYYYMMDD" UTC, defaults to today), oddsFormat (string, "american" or "decimal", default "american"), maxItems (integer, default 0 = no cap). Each output row is one outcome from one bookmaker for one market (h2h/spreads/totals) on one event: league, leagueName, eventId, eventName, commenceTime, status, completed, venue, homeTeam, homeTeamAbbr, homeScore, awayTeam, awayTeamAbbr, awayScore, bookmaker, marketKey, outcomeName, price, priceAmerican, priceDecimal, point, oddsFormat, details, fetchedAt. API docs: https://apify.com/parsebird/sports-betting-odds-scraper/api. Get a token at https://console.apify.com/settings/integrations.
```

### What does Sports Betting Odds Scraper do?

This **sports odds API** pulls moneyline (h2h), point spread, and totals (over/under) betting lines for 18 leagues in one run. It's built for anyone who needs structured odds data without scraping individual sportsbook sites or paying for a dedicated odds API:

- 🏈 **18 leagues in one Actor** — NFL, NCAA Football, NBA, WNBA, NCAA Men's/Women's Basketball, MLB, NHL, MLS, Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, UEFA Champions League, UEFA Europa League, UFC, and PGA Tour. Pass multiple league keys to scrape them all in a single run.
- 💰 **Three market types per event** — moneyline, point spread, and totals, each returned in both **American** (`-110`, `+150`) and **decimal** (`1.91`, `2.50`) formats regardless of which one you select.
- 📅 **Flexible date filtering** — leave `dates` empty for today's slate, or pass a single day or a `YYYYMMDD-YYYYMMDD` range to pull odds for a specific window.
- 🏟️ **Live game context on every row** — venue, game status, and live/final scores are included alongside the odds, so you don't need a second data source to know what's happening in the game.
- 🔌 **No API key, no sportsbook login** — the Actor fetches publicly available odds feeds directly; you just run it.
- ⚙️ **Runs on Apify's platform** — schedule recurring runs (e.g. every morning before kickoff), trigger it via the [Apify API](https://docs.apify.com/api/v2) or [webhooks](https://docs.apify.com/platform/integrations/webhooks), and connect it to [Make, Zapier, or n8n](https://apify.com/integrations) to pipe odds straight into a spreadsheet, database, or Slack channel.

### What data can you extract from sports betting odds?

| Field | Description |
|-------|-------------|
| `league` / `leagueName` | League key (e.g. `nfl`) and display name (e.g. "NFL") |
| `eventId` / `eventName` | Unique event ID and matchup name |
| `commenceTime` | Scheduled kickoff/tip-off time (UTC, ISO 8601) |
| `status` / `completed` | Game status (scheduled, in-progress, final) and a completed flag |
| `venue` | Venue name |
| `homeTeam` / `awayTeam` (+ `Abbr`, `Score`) | Team names, abbreviations, and live/final scores |
| `bookmaker` | Sportsbook the line came from |
| `marketKey` | `h2h` (moneyline), `spreads`, or `totals` |
| `outcomeName` | Team name, or `Over`/`Under` for totals |
| `priceAmerican` / `priceDecimal` / `price` | Odds in both formats, plus `price` matching your selected `oddsFormat` |
| `point` | Spread or total line (`null` for moneyline) |
| `details` | Human-readable line summary, e.g. `"TEN -4.5"` |
| `fetchedAt` | Timestamp the row was scraped |

### How to scrape sports betting odds with Sports Betting Odds Scraper

1. Go to the [Actor page](https://apify.com/parsebird/sports-betting-odds-scraper) and click **Try for free**.
2. Under **Leagues**, select one or more leagues (defaults to `nfl`).
3. Optionally set **Dates** to a single day or range — leave empty for today.
4. Optionally choose an **Odds format** and a **Max items** cap.
5. Click **Start** and download the results as JSON, CSV, or Excel once the run finishes — or pull them via the [API](https://apify.com/parsebird/sports-betting-odds-scraper/api).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| leagues | array | **Yes** | `["nfl"]` | League keys. Valid: `nfl`, `ncaaf`, `nba`, `wnba`, `ncaam`, `ncaaw`, `mlb`, `nhl`, `mls`, `epl`, `laliga`, `seriea`, `bundesliga`, `ligue1`, `ucl`, `uel`, `ufc`, `pga`. Pass multiple to scrape several leagues in one run. |
| dates | string | No | today | `YYYYMMDD` for a single day or `YYYYMMDD-YYYYMMDD` for a range, all UTC. Leave empty for today's slate. |
| oddsFormat | string | No | `american` | `american` or `decimal`. Both `priceAmerican` and `priceDecimal` are always included on every row regardless. |
| maxItems | integer | No | `0` | Maximum rows (quotes) to return. `0` = no cap. Each row is one outcome from one bookmaker for one market. |

### Output example

```json
{
  "league": "nfl",
  "leagueName": "NFL",
  "eventId": "401872656",
  "eventName": "New England Patriots at Seattle Seahawks",
  "commenceTime": "2026-09-10T00:20Z",
  "status": "STATUS_SCHEDULED",
  "completed": false,
  "venue": "Lumen Field",
  "homeTeam": "Seattle Seahawks",
  "homeTeamAbbr": "SEA",
  "homeScore": null,
  "awayTeam": "New England Patriots",
  "awayTeamAbbr": "NE",
  "awayScore": null,
  "bookmaker": "Draft Kings",
  "marketKey": "h2h",
  "outcomeName": "Seattle Seahawks",
  "price": -205,
  "priceAmerican": -205,
  "priceDecimal": 1.4878,
  "point": null,
  "oddsFormat": "american",
  "details": "SEA -3.5",
  "fetchedAt": "2026-05-18T12:00:01.234Z"
}
```

Download results as **JSON, CSV, HTML, or Excel**, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2) — see the [API tab](https://apify.com/parsebird/sports-betting-odds-scraper/api) for ready-made code snippets.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/sports-betting-odds-scraper").call(run_input={
    "leagues": ["nfl", "nba"],
    "oddsFormat": "american",
    "maxItems": 0,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["eventName"], item["bookmaker"], item["marketKey"], item["price"])
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/sports-betting-odds-scraper').call({
    leagues: ['nfl', 'nba'],
    oddsFormat: 'american',
    maxItems: 0,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Line shopping** — compare moneyline, spread, and totals across bookmakers for the same event to find the best price.
- **Odds movement tracking** — schedule recurring runs and diff snapshots to see how lines move before kickoff.
- **Sports betting content and models** — feed structured odds into a prediction model, newsletter, or betting content site.
- **Arbitrage and value-bet screening** — combine `priceDecimal` across bookmakers to spot pricing gaps.
- **Live score dashboards** — `homeScore`/`awayScore`/`status` give you live game context alongside the odds in one dataset.

### How it works

1. The Actor resolves each requested league key to its sport/league identifiers and fetches the current (or date-filtered) event schedule.
2. For every event, it fetches the bookmaker odds feed for that specific game — moneyline, spread, and totals, per bookmaker.
3. Each bookmaker/market/outcome combination becomes one output row, with American and decimal prices computed for both.
4. Rows are pushed to the dataset as they're found, up to your `maxItems` cap (if set).

### How much does it cost to scrape sports betting odds?

Sports Betting Odds Scraper uses **Pay-Per-Event (PPE)** pricing — you're charged per odds row returned, not per compute unit, so cost scales directly with the data you get.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| Odds row scraped | $0.0021 – $0.0025 | **$2.10 – $2.50** (varies by plan: Free $2.50, Bronze $2.40, Silver $2.30, Gold $2.10) |

A typical NFL game with one bookmaker and all three markets (moneyline, spread, totals) is about 6 rows — under $0.02. Scraping a full Sunday slate across every bookmaker ESPN surfaces usually costs a few dollars. Every Apify account includes free platform credits to try it before you commit.

### Is it legal to scrape sports betting odds?

Yes — this Actor only reads publicly available odds data, the same information visible on public sports and odds pages, without logging into any account or bypassing paywalls. Scraping publicly accessible data is generally legal, but you're responsible for how you use the data and for complying with the target sites' terms of service. See the [Apify blog on web scraping legality](https://blog.apify.com/is-web-scraping-legal/) for more.

### Other sports scrapers from ParseBird

- [Flashscore Live Football Matches](https://apify.com/parsebird/flashscore-live-football-scraper) — live scores, match events, stats, and lineups for football matches.
- [UFC Scraper](https://apify.com/parsebird/ufc-scraper) — fighter profiles, event fight cards, and division rankings from UFC.com.

### FAQ

**How fresh is the odds data?**
Every run fetches odds live at request time — there's no caching. The `fetchedAt` field on each row records exactly when it was scraped.

**Which bookmaker does the data come from?**
Lines are sourced from the sportsbook partner(s) available for each event and league; the `bookmaker` field tells you which one produced each row. Coverage and the number of bookmakers per event varies by league and event — major US leagues typically have the deepest coverage.

**Why don't some events have odds yet?**
Bookmakers typically don't post lines until a few days before an event. Preseason, early-season, and far-future dates (via the `dates` range) commonly return zero rows for a given event until its line is posted — this is a data availability limit, not an error.

**Why does PGA Tour return few or no rows?**
PGA Tour events are field-based tournaments (dozens of players), not head-to-head matchups, so the `h2h`/`spreads`/`totals` market structure this Actor uses doesn't apply the same way it does to team sports. `pga` is included for completeness but coverage is limited.

**Can I get odds for a specific past or future date?**
Yes — set `dates` to `YYYYMMDD` for one day or `YYYYMMDD-YYYYMMDD` for a range, in UTC.

**Can I schedule recurring runs?**
Yes. Use Apify's [Scheduler](https://docs.apify.com/platform/schedules) to run this Actor daily, hourly, or at any interval, and combine it with [webhooks](https://docs.apify.com/platform/integrations/webhooks) or integrations to push fresh odds wherever you need them.

**Does this work with the Apify API and integrations?**
Yes — every input parameter is available via the [API](https://apify.com/parsebird/sports-betting-odds-scraper/api), and the Actor connects to [Make, Zapier, n8n, Google Sheets, and more](https://apify.com/integrations).

**I found a bug or a league that's not covered — what do I do?**
Open an issue on the Actor's [Issues tab](https://apify.com/parsebird/sports-betting-odds-scraper/issues) with the league and date you ran — reports are addressed quickly.

# Actor input Schema

## `leagues` (type: `array`):

League(s) to scrape. Pass multiple to scrape several leagues in one run.

## `dates` (type: `string`):

Optional. 'YYYYMMDD' for a single day or 'YYYYMMDD-YYYYMMDD' for a date range, all UTC. Leave empty for today's slate.

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

Format for the 'price' field. Both priceAmerican and priceDecimal are always included on each row regardless of this setting.

## `maxItems` (type: `integer`):

Maximum number of odds rows to return. Each row is one outcome from one bookmaker for one market. 0 = no cap.

## Actor input object example

```json
{
  "leagues": [
    "nfl"
  ],
  "oddsFormat": "american",
  "maxItems": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "leagues": [
        "nfl"
    ],
    "oddsFormat": "american",
    "maxItems": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/sports-betting-odds-scraper").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 = {
    "leagues": ["nfl"],
    "oddsFormat": "american",
    "maxItems": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/sports-betting-odds-scraper").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 '{
  "leagues": [
    "nfl"
  ],
  "oddsFormat": "american",
  "maxItems": 0
}' |
apify call parsebird/sports-betting-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/sports-betting-odds-scraper"
        }
    }
}

```

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/CnYiStvWm71WWLcAq/builds/CkGZe3vzWTc9xaPe5/openapi.json
