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

Sports Betting Odds Scraper SD - Sports Betting Odds Scraper is a sports data tool that extracts moneyline, spread, total, team-total and prop odds from ESPN (DraftKings lines with opening prices), Pinnacle and Bovada, with best price, no-vig fair odds, edge and arbitrage.

- **URL**: https://apify.com/neuro-scraper/sports-betting-odds-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

./README.md

# Actor input Schema

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

League keys: nfl, ncaaf, cfl, nba, wnba, ncaab, euroleague, mlb, nhl, mls, epl, championship, laliga, seriea, bundesliga, ligue1, ucl, uel, ufc. Any other ESPN league works as an ESPN path for the ESPN book, e.g. soccer/bra.1 or soccer/ned.1.

## `sports` (type: `array`):

Whole sports from Pinnacle and Bovada, league by league in each site's own menu order (featured leagues first) up to 'Max events per league / sport': football, basketball, baseball, hockey, soccer, tennis, mma, boxing, golf, cricket, esports, darts, handball, volleyball, rugby-union, rugby-league, aussie-rules, table-tennis, snooker. ESPN needs a league, so it is not used here.

## `eventUrls` (type: `array`):

Single games: a Pinnacle event link (https://www.pinnacle.com/en/football/nfl/.../1637432962/) or a Bovada event link (https://www.bovada.lv/sports/football/nfl/philadelphia-eagles-jacksonville-jaguars-202610110930).

## `books` (type: `array`):

espn = ESPN's odds feed (DraftKings lines today, with opening prices, scores and logos); pinnacle = Pinnacle (sharp lines, limits, alternates, props); bovada = Bovada.

## `markets` (type: `array`):

h2h = moneyline (with the draw in soccer), spreads = point spread / run line / puck line / handicap, totals = over/under, team_totals, player_props and specials (game props, futures, outrights - Pinnacle).

## `periods` (type: `array`):

game = full game; first_half = 1st half (1st period in hockey, first 5 innings in baseball, 1st set in tennis); other = quarters and other periods. Periods other than the full game come from Pinnacle (and Bovada where its main coupon lists them).

## `includeAlternateLines` (type: `boolean`):

Adds Pinnacle's alternate spread and total lines (many more rows).

## `statusFilter` (type: `string`):

all, scheduled (pre-match only), live (in-play now) or final (finished games with ESPN closing lines - give a past date range).

## `dateFrom` (type: `string`):

YYYY-MM-DD (UTC). ESPN is read one day per page from this date; Pinnacle and Bovada games are filtered to the window. Empty = ESPN's current slate and every open game.

## `dateTo` (type: `string`):

YYYY-MM-DD (UTC). Empty = same as Date from. At most 62 days.

## `lookAheadHours` (type: `integer`):

Only games starting within this many hours from now (0 = no limit).

## `team` (type: `string`):

Only games whose home or away team contains this text, e.g. Eagles.

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

Format of the price columns (price, bestPrice, openPrice, fair prices). priceAmerican, priceDecimal and priceFractional are always included.

## `outputMode` (type: `string`):

rows = one row per book x market x outcome (spreadsheet friendly); events = one record per game with every book's prices, best price per outcome and arbitrage.

## `onlyArbitrage` (type: `boolean`):

Keep only markets where the best prices across books add up to an arbitrage (sum of 1/decimal below 1).

## `minArbitrageProfit` (type: `number`):

With 'Only arbitrage': the smallest guaranteed return in percent, e.g. 0.5.

## `onlyValueBets` (type: `boolean`):

Keep only prices that beat Pinnacle's no-vig fair price (edge above 'Min value edge %'). Needs Pinnacle in Sportsbooks.

## `minValueEdge` (type: `number`):

Edge = price x Pinnacle fair probability - 1, in percent.

## `monitorMode` (type: `boolean`):

Remembers every price in a named key-value store and outputs only prices that are new or moved since the last run, with previous price, change, first-seen price and direction. Schedule the Actor to track line movement.

## `monitorKey` (type: `string`):

Name of the memory used by monitoring mode; give each scheduled task its own key.

## `sortBy` (type: `string`):

Order of the output within each league or sport.

## `maxEventsPerSport` (type: `integer`):

Most games read per league or sport from each book.

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

Most rows (or games in the events shape) in the dataset; each one is one result.

## `proxyConfiguration` (type: `object`):

All three feeds answered without a proxy in our tests; residential proxy is the default.

## Actor input object example

```json
{
  "leagues": [
    "nfl"
  ],
  "books": [
    "espn",
    "pinnacle",
    "bovada"
  ],
  "markets": [
    "h2h",
    "spreads",
    "totals"
  ],
  "periods": [
    "game"
  ],
  "includeAlternateLines": false,
  "statusFilter": "all",
  "lookAheadHours": 0,
  "oddsFormat": "american",
  "outputMode": "rows",
  "onlyArbitrage": false,
  "minArbitrageProfit": 0,
  "onlyValueBets": false,
  "minValueEdge": 0,
  "monitorMode": false,
  "monitorKey": "default",
  "sortBy": "date",
  "maxEventsPerSport": 50,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/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"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/sports-betting-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/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/zpEfo801gCifh5cDq/builds/A1dPUiOMQzbknzieN/openapi.json
