# BetExplorer Odds Scraper (`parseforge/betexplorer-odds-scraper`) Actor

Scrape BetExplorer matches with opening and closing odds, bookmaker counts, scores and decades of season archives. Export to CSV, Excel, JSON or XML.

- **URL**: https://apify.com/parseforge/betexplorer-odds-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Sports, News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.62 / 1,000 results

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📉 BetExplorer Odds Scraper

> 🚀 **Export decades of settled betting odds in seconds.** Paste any BetExplorer league or season URL and get every match as a flat 33-field row: teams, kickoff, score, period scores, the average opening price and the average closing price of each outcome, the best price any bookmaker offered, and the full odds book. Premier League odds run back to 1999/2000 and the season picker holds 116 seasons.

BetExplorer is the odds-comparison arm of the Flashscore group. Its league pages are server rendered, and the odds you see in a results table are the average closing price across every bookmaker it tracked for that match. This Actor reads that table, then opens each match's own odds book and each bookmaker's price-movement log, so a row carries both ends of the market: where the price opened and where it closed. No browser, no API key, no login.

Coverage is the point. A Premier League season page returns all 380 matches in one request, the Championship all 552, and the season picker on every league page reaches back 116 seasons for England, 35 for the NBA and 31 for the Moldovan top flight. Odds thin out before roughly 1999/2000, results keep going. Seven sports are supported: football, hockey, basketball, tennis, baseball, handball and volleyball.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Quantitative bettors and model builders | Backtest a strategy against real closing prices instead of a bookmaker's current screen |
| Sports data analysts | Measure line movement from open to close as a market-efficiency signal |
| Trading and risk teams | Compare a book's own closing price against the market average and the best price available |
| Researchers and students | Build multi-decade odds datasets for football economics and forecasting papers |

### 📋 What the BetExplorer Odds Scraper does

> 💡 **Why it matters:** Most odds datasets give you one number per outcome, usually whatever the price is right now. A model trained on that cannot tell a favourite that drifted from a favourite that was steamed. This Actor ships the opening price beside the closing price for every outcome, with the number of bookmakers behind each average, so drift is a column and not a guess.

- 🔗 **Any BetExplorer URL:** a league page such as `https://www.betexplorer.com/football/england/premier-league/`, a dated season such as `.../premier-league-2012-2013/results/`, a fixtures page, or a single match URL. Paste as many as you like.
- 🗄️ **Season archive in one run:** set **Extra seasons to crawl** and the Actor reads that league's own season picker and sweeps the earlier seasons behind it, without you building a single URL by hand.
- 📈 **Opening and closing prices:** the average opening price and the average closing price of every outcome, taken from each bookmaker's own movement log rather than from a single snapshot.
- ⭐ **Best price and depth:** the highest closing price any tracked bookmaker offered on each outcome, plus the bookmaker count behind the averages. BetExplorer shows the books licensed where the request comes from, so a residential proxy country widens the odds book: 12 bookmakers from Malta against 2 from the United States on the same match.
- 📚 **The full odds book:** every bookmaker by name with its own opening price, closing price and the timestamp the price was last written.
- ⚽ **Match context:** exact kickoff in ISO 8601 with time zone, venue, round, status, final score, period or half scores, and the result of the match.
- 🏒 **Seven sports, two market shapes:** 1X2 where a draw exists (football, hockey, handball) and Home/Away where it does not (basketball, tennis, baseball, volleyball). The Actor picks the right one from the league page itself.
- 🔁 **Clean data:** one row per match, deduplicated on BetExplorer's own event id, the same 33 columns on every row, and `N/A` instead of blank cells when a value does not apply.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | Home team crest, or the player photo in tennis |
| 🔗 `matchUrl` | string | The match page on BetExplorer |
| 🆔 `matchId` | string | BetExplorer's own event id, stable across pages |
| 🏆 `sport` | string | Football, Hockey, Basketball, Tennis, Baseball, Handball, Volleyball |
| 🌍 `country` | string | Country or region the competition belongs to |
| 🏟 `league` | string | Competition name without the season |
| 📅 `season` | string | Season label, for example `2023/2024` |
| 🔢 `round` | string | Round number, or the stage name in a knockout |
| 🏠 `homeTeam` | string | Home team or first player |
| 🛫 `awayTeam` | string | Away team or second player |
| ⏱ `kickoffIso` | string | Kickoff in ISO 8601 with time zone |
| 📌 `status` | string | Finished, Scheduled, Live, Postponed or Cancelled |
| 🥇 `result` | string | Home, Draw, Away, or `N/A` when unplayed |
| 🔠 `score` | string | Final score as `2:1` |
| 🔵 `homeScore` | integer | Goals, points or sets for the home side |
| 🔴 `awayScore` | integer | Goals, points or sets for the away side |
| ⏳ `partialScore` | string | Period, set or half scores |
| 📈 `openingOddsHome` | number | Average opening price on the home win |
| 📈 `openingOddsDraw` | number | Average opening price on the draw, `N/A` in Home/Away markets |
| 📈 `openingOddsAway` | number | Average opening price on the away win |
| 📉 `closingOddsHome` | number | Average closing price on the home win |
| 📉 `closingOddsDraw` | number | Average closing price on the draw, `N/A` in Home/Away markets |
| 📉 `closingOddsAway` | number | Average closing price on the away win |
| ⭐ `highestClosingHome` | number | Best closing price any tracked bookmaker offered on the home win |
| ⭐ `highestClosingDraw` | number | Best closing price on the draw |
| ⭐ `highestClosingAway` | number | Best closing price on the away win |
| 🏦 `bookmakerCount` | integer | Bookmakers behind the averages for this match |
| 🎯 `oddsMarket` | string | `1X2` or `Home/Away` |
| 📍 `venue` | string | Stadium or arena, `Not Disclosed` when BetExplorer has none |
| 🖼 `awayTeamImageUrl` | string | Away team crest or player photo |
| 📚 `bookmakers` | array | Every bookmaker with its own opening price, closing price and timestamp |
| 🕒 `scrapedAt` | string | ISO timestamp of the run |
| ❌ `error` | string | Populated only on a row the Actor could not collect |

For a scheduled match the closing columns carry the latest price on the board rather than a settled close. The `status` column tells you which you are looking at.

Three real records from a verification run on `https://www.betexplorer.com/football/england/premier-league-2023-2024/results/` (the `bookmakers` array is shown trimmed to three books; a real row carries all of them, and how many that is depends on the country you request from):

```json
[
  {
    "imageUrl": "https://www.betexplorer.com/res/images/team-logo/fwtiqyQt-vcNAdtF9.png",
    "matchUrl": "https://www.betexplorer.com/football/england/premier-league-2023-2024/arsenal-everton/jXP8f29S/",
    "matchId": "jXP8f29S",
    "sport": "Football",
    "country": "England",
    "league": "Premier League",
    "season": "2023/2024",
    "round": "38",
    "homeTeam": "Arsenal",
    "awayTeam": "Everton",
    "kickoffIso": "2024-05-19T17:00:00+02:00",
    "status": "Finished",
    "result": "Home",
    "score": "2:1",
    "homeScore": 2,
    "awayScore": 1,
    "partialScore": "1:1, 1:0",
    "openingOddsHome": 1.16,
    "openingOddsDraw": 7.32,
    "openingOddsAway": 14.78,
    "closingOddsHome": 1.21,
    "closingOddsDraw": 7.35,
    "closingOddsAway": 12.59,
    "highestClosingHome": 1.24,
    "highestClosingDraw": 8.22,
    "highestClosingAway": 15,
    "bookmakerCount": 12,
    "oddsMarket": "1X2",
    "venue": "Emirates Stadium",
    "awayTeamImageUrl": "https://www.betexplorer.com/res/images/team-logo/Cp7kPg6n-bRmKmISE.png",
    "bookmakers": [
      { "bookmaker": "1xBet", "closingHome": 1.24, "closingDraw": 7.7, "closingAway": 10.6, "openingHome": 1.15, "openingDraw": 10, "openingAway": 20, "closedAt": "2024-05-19T15:49" },
      { "bookmaker": "888sport", "closingHome": 1.18, "closingDraw": 7, "closingAway": 15, "openingHome": 1.17, "openingDraw": 7.5, "openingAway": 15, "closedAt": "2024-05-19T14:33" },
      { "bookmaker": "bet365", "closingHome": 1.22, "closingDraw": 7.5, "closingAway": 10, "openingHome": 1.2, "openingDraw": 6.5, "openingAway": 13, "closedAt": "2024-05-19T14:41" }
    ],
    "scrapedAt": "2026-09-09T19:44:41.872Z",
    "error": null
  },
  {
    "imageUrl": "https://www.betexplorer.com/res/images/team-logo/riC9AeRc-r9Mudk7j.png",
    "matchUrl": "https://www.betexplorer.com/football/england/premier-league-2023-2024/brentford-newcastle-utd/htCzjMHq/",
    "matchId": "htCzjMHq",
    "sport": "Football",
    "country": "England",
    "league": "Premier League",
    "season": "2023/2024",
    "round": "38",
    "homeTeam": "Brentford",
    "awayTeam": "Newcastle",
    "kickoffIso": "2024-05-19T17:00:00+02:00",
    "status": "Finished",
    "result": "Away",
    "score": "2:4",
    "homeScore": 2,
    "awayScore": 4,
    "partialScore": "0:3, 2:1",
    "openingOddsHome": 2.87,
    "openingOddsDraw": 3.61,
    "openingOddsAway": 2.1,
    "closingOddsHome": 2.96,
    "closingOddsDraw": 3.99,
    "closingOddsAway": 2.19,
    "highestClosingHome": 3.2,
    "highestClosingDraw": 4.1,
    "highestClosingAway": 2.25,
    "bookmakerCount": 12,
    "oddsMarket": "1X2",
    "venue": "Brentford Community Stadium",
    "awayTeamImageUrl": "https://www.betexplorer.com/res/images/team-logo/KWip625n-2Vnc5VQf.png",
    "bookmakers": [
      { "bookmaker": "1xBet", "closingHome": 3.11, "closingDraw": 4.03, "closingAway": 2.17, "openingHome": 3.03, "openingDraw": 3.95, "openingAway": 2.32, "closedAt": "2024-05-19T15:54" },
      { "bookmaker": "888sport", "closingHome": 2.88, "closingDraw": 4, "closingAway": 2.2, "openingHome": 2.88, "openingDraw": 3.75, "openingAway": 2.25, "closedAt": "2024-05-19T15:33" },
      { "bookmaker": "bet365", "closingHome": 2.9, "closingDraw": 3.9, "closingAway": 2.15, "openingHome": 3.25, "openingDraw": 3.6, "openingAway": 2.1, "closedAt": "2024-05-19T15:21" }
    ],
    "scrapedAt": "2026-09-09T19:44:41.872Z",
    "error": null
  },
  {
    "imageUrl": "https://www.betexplorer.com/res/images/team-logo/MmmU7K6n-b92lfEJC.png",
    "matchUrl": "https://www.betexplorer.com/football/england/premier-league-2023-2024/brighton-manchester-united/z51uktXk/",
    "matchId": "z51uktXk",
    "sport": "Football",
    "country": "England",
    "league": "Premier League",
    "season": "2023/2024",
    "round": "38",
    "homeTeam": "Brighton",
    "awayTeam": "Manchester Utd",
    "kickoffIso": "2024-05-19T17:00:00+02:00",
    "status": "Finished",
    "result": "Away",
    "score": "0:2",
    "homeScore": 0,
    "awayScore": 2,
    "partialScore": "0:0, 0:2",
    "openingOddsHome": 2.02,
    "openingOddsDraw": 3.78,
    "openingOddsAway": 2.93,
    "closingOddsHome": 2.62,
    "closingOddsDraw": 4,
    "closingOddsAway": 2.41,
    "highestClosingHome": 2.76,
    "highestClosingDraw": 4.2,
    "highestClosingAway": 2.5,
    "bookmakerCount": 12,
    "oddsMarket": "1X2",
    "venue": "Amex Stadium",
    "awayTeamImageUrl": "https://www.betexplorer.com/res/images/team-logo/Wh0Sh09K-h2pPXz3k.png",
    "bookmakers": [
      { "bookmaker": "1xBet", "closingHome": 2.76, "closingDraw": 4.1, "closingAway": 2.36, "openingHome": 2.11, "openingDraw": 4.23, "openingAway": 3.28, "closedAt": "2024-05-19T15:55" },
      { "bookmaker": "888sport", "closingHome": 2.5, "closingDraw": 3.8, "closingAway": 2.5, "openingHome": 2.05, "openingDraw": 4, "openingAway": 3.2, "closedAt": "2024-05-19T15:33" },
      { "bookmaker": "bet365", "closingHome": 2.6, "closingDraw": 4, "closingAway": 2.38, "openingHome": 2.2, "openingDraw": 4, "openingAway": 2.8, "closedAt": "2024-05-19T15:43" }
    ],
    "scrapedAt": "2026-09-09T19:44:41.872Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **Both ends of the market** | Opening and closing prices on the same row. Line movement becomes a column you can regress on instead of a number you have to reconstruct. |
| **Real depth, not a screenshot** | Each average is computed from the bookmakers BetExplorer actually tracked, and `bookmakerCount` tells you how many stood behind it. |
| **The archive, swept for you** | Extra seasons come from the league's own season picker, so one URL plus a number reaches 1999/2000 without hand-built links. |
| **33 columns, one shape** | Every row has the same keys in the same order, so CSV imports, joins and Excel filters behave across sports. |
| **No blanks, no nulls** | A value the market does not carry is `N/A`, a value BetExplorer withholds is `Not Disclosed`, never an empty cell. |
| **Honest ceilings** | The Actor states where odds coverage starts and which competitions BetExplorer truncates, instead of letting you discover it after the run. |
| **Fast and cheap** | HTTP only, 1 GB of memory, no browser to warm up and no proxy needed. |

### 📈 How it compares to alternatives

| Feature | This Actor | Typical BetExplorer and odds scrapers | By hand |
|---|---|---|---|
| Fields per match | 33 | 8 to 15 | Whatever you copy |
| Opening price per outcome | Yes, averaged across the book | No | One bookmaker at a time, on hover |
| Closing price per outcome | Yes, averaged across the book | Usually the table average only | Yes |
| Best available closing price | Yes | Rarely | Manual scan |
| Bookmaker count behind the average | Yes | No | Count them yourself |
| Full odds book per match | Yes, with per-bookmaker timestamps | Sometimes | Behind a click each |
| Multi-season archive sweep | Yes, from the site's own season picker | Build every URL yourself | Season by season |
| Sports covered | 7 | Usually football only | Any, slowly |
| Period and half scores | Yes | Rarely | Behind a click |
| Memory and speed | 1 GB, HTTP only | Often a browser at 4 GB | Hours |

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [BetExplorer Odds Scraper](https://apify.com/parseforge/betexplorer-odds-scraper?fpr=vmoqkp).
3. Paste one or more BetExplorer URLs, set Max Items, choose how many extra seasons to sweep, and click **Start**.
4. Download the dataset as CSV, Excel, JSON or XML from the **Storage** tab, or read it through the API.

A first run:

```json
{
  "startUrls": [{ "url": "https://www.betexplorer.com/football/england/premier-league-2023-2024/results/" }],
  "maxItems": 10,
  "seasonsBack": 0,
  "matchStatus": "played",
  "includeOpeningOdds": true
}
```

To sweep an archive, point at the newest season and raise **Extra seasons to crawl**: `https://www.betexplorer.com/football/spain/laliga/results/` with `seasonsBack: 20` walks LaLiga back two decades from the site's own picker.

Free-plan runs return up to 10 matches as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 matches per run.

### 💼 Business use cases

**📊 Closing-line-value backtests.** A betting syndicate pulls ten seasons of a league, joins its own historical picks on `matchId`, and scores every bet against `closingOddsHome`, `closingOddsDraw` and `closingOddsAway` to measure whether its model really beats the close.

**📉 Steam and drift detection.** An analyst computes `closingOddsHome / openingOddsHome` across a season, ranks the matches where the price collapsed, and checks how often the market was right.

**🏦 Book benchmarking.** A trading desk expands the `bookmakers` array, compares one book's closing price against the market average and `highestClosingHome`, and finds the fixtures where it was consistently the worst price on the board.

**🔬 Market efficiency research.** A quantitative research team builds a twenty-season panel of opening and closing prices across seven sports and tests whether favourite-longshot bias shrank as the number of tracked bookmakers grew.

### 🔌 Automating BetExplorer Odds Scraper

- **Make and Zapier:** run the Actor after each matchday and append the settled rows to Google Sheets or Airtable.
- **Slack:** post a message when a match closes more than 20 percent away from where it opened.
- **Airbyte:** sync the dataset into BigQuery, Snowflake or Postgres and keep a rolling odds warehouse.
- **GitHub Actions:** refresh a league's season file every night and commit the CSV.
- **Google Drive:** save each season sweep as an Excel file in a shared folder.

Every integration starts from the [Apify API](https://docs.apify.com/api/v2) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### 🌟 Beyond business use cases

- **Research:** study how closing prices in the same league moved across two decades of rule changes and bookmaker consolidation.
- **Personal:** keep a private record of how the market priced your team every week of the season.
- **Non-profit:** a responsible-gambling charity measures how far recreational prices sit from the best available price.
- **Experimentation:** feed opening and closing prices into a simple model and see whether the drift alone predicts anything.

### 🤖 Ask an AI assistant about this scraper

Give an AI agent live access to BetExplorer odds through the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/betexplorer-odds-scraper"
```

Then ask in plain language, for example "Pull the 2023/2024 Premier League season and list the ten matches where the home price moved furthest between opening and closing".

### ❓ Frequently Asked Questions

#### 🔗 Which BetExplorer URLs can I paste?

League pages, dated season pages, `/results/` and `/fixtures/` pages, and single match URLs. A plain league URL collects both results and fixtures; add `/results/` or `/fixtures/` to pick one.

#### 📅 How far back do the odds go?

Premier League odds are complete back to 1999/2000. The 1995/1996 season has results and no odds. Results themselves reach much further, and the English season picker holds 116 seasons. Smaller leagues start later, so check the season you need before planning a large sweep.

#### 🗄️ How does the season sweep work?

Set **Extra seasons to crawl** to N and the Actor reads the season picker on each league page you passed, then queues the N seasons immediately before it. It expands only the URLs you supplied, so the sweep cannot run away from you.

#### 📈 Where do the opening odds come from?

From each bookmaker's own price-movement log on BetExplorer, the same data the site shows when you hover an odds cell. The first entry in that log is the opening price. A price that never moved has no log, and its opening price equals its closing price.

#### ⚡ Can I make the run faster?

Turn **Include opening odds** off. Reading the movement logs costs about one request per bookmaker per outcome, roughly 30 requests for a football match. Without them the Actor needs two requests per match, and the opening columns come back as `N/A`.

#### 🏦 What is `bookmakerCount` for?

It is the sample size behind every average on the row. A match with 20 bookmakers gives a far more reliable closing price than one with 2, and a scheduled match whose market has not opened yet returns 0.

#### 📉 Are the closing odds an average or a single bookmaker?

An average across every bookmaker BetExplorer tracked for that match. `highestClosingHome`, `highestClosingDraw` and `highestClosingAway` give the best price on the board, and the `bookmakers` array gives every individual price.

#### 🏀 Which sports work?

Football, hockey, basketball, tennis, baseball, handball and volleyball. Football, hockey and handball use the 1X2 market; the rest use Home/Away, and the draw columns come back as `N/A`.

#### 📦 How many matches can I collect from one URL?

A football league season returns in full: 380 for a Premier League season, 552 for a Championship season. NBA and NHL regular seasons are the exception, and BetExplorer serves a window of roughly 50 to 260 games per stage rather than the full schedule. Play-offs, pre-season and All-Star stages come back complete.

#### 🛡️ Do I need a proxy?

Not to get the data. BetExplorer serves every page to plain HTTP clients and the proxy input ships switched off. A proxy changes something else: how deep the odds book is.

#### 🌍 Why does my `bookmakerCount` look low?

BetExplorer shows the bookmakers licensed where the request comes from, and Apify's default egress is the United States. On one Premier League match the same request returned 12 bookmakers from Malta, 9 from the United Kingdom, 4 from Germany and 2 from the United States. Switch the proxy on and pick a residential country to widen the book; the Actor also prints a hint when it notices a thin book and no proxy. Match coverage, scores and season depth are the same either way.

#### ⚠️ What do `N/A` and `Not Disclosed` mean?

`N/A` marks a field that does not apply, such as the draw price in a Home/Away market or a score for a match that has not been played. `Not Disclosed` marks a value BetExplorer itself does not carry, such as the venue of an older fixture.

#### 🔁 Can the same match appear twice?

No. Rows are deduplicated on BetExplorer's own event id, so a match that shows up on both a stage page and a season page is billed once.

#### ⏰ Can I run this on a schedule?

Yes. Schedule the Actor in the Apify Console to run after each matchday and it will collect the newly settled matches with their closing prices.

#### 📄 What output formats are supported?

CSV, JSON, Excel and XML, plus the Apify API and every integration on the Actor page.

#### ❌ What happens when a page fails?

The Actor retries three times, then writes a row carrying only an `error` message so you can see exactly which URL failed. Error rows are never billed.

### 🔌 Integrate with any app

The dataset is available through the Apify API the moment the run finishes. Use the `run-sync-get-dataset-items` endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🔗 Recommended Actors

- [Flashscore Match Results Scraper](https://apify.com/parseforge/flashscore-scraper?fpr=vmoqkp)
- [Football-Data.co.uk Scraper](https://apify.com/parseforge/football-data-couk-scraper?fpr=vmoqkp)
- [Pinnacle Sportsbook Odds Scraper](https://apify.com/parseforge/pinnacle-odds-scraper?fpr=vmoqkp)
- [SportyTrader Scraper](https://apify.com/parseforge/sportytrader-scraper?fpr=vmoqkp)
- [Action Network Scraper](https://apify.com/parseforge/action-network-scraper?fpr=vmoqkp)

***

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by BetExplorer or the Flashscore group. It collects only publicly available data. You are responsible for using the data in compliance with BetExplorer's terms of use and applicable laws, including the gambling regulations in your jurisdiction.

# Actor input Schema

## `startUrls` (type: `array`):

League, season or match pages on betexplorer.com. A plain league URL such as https://www.betexplorer.com/football/england/premier-league/ collects both results and fixtures; add /results/ or /fixtures/ to pick one. A dated season URL such as .../premier-league-2012-2013/results/ returns that whole season. Works for football, hockey, basketball, tennis, baseball, handball and volleyball.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `seasonsBack` (type: `integer`):

How many earlier seasons to add after each league URL, read from that league's own season picker. 0 scrapes only the season you passed. Odds coverage thins out before roughly 1999/2000, results go back further.

## `matchStatus` (type: `string`):

Which matches to keep. Played matches carry settled closing odds, scheduled matches carry the prices bookmakers are showing right now.

## `includeOpeningOdds` (type: `boolean`):

Read every bookmaker's own price history so the row carries the opening price beside the closing one. This is the drift signal most odds datasets are missing. It costs extra requests per match, so turn it off when you only need closing prices and want a faster sweep.

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

Apify proxy settings. Measured on one Premier League match: Malta returned 12 bookmakers, United Kingdom 9, Germany 4 and the United States 2. Leave it off for the widest availability of matches and the lowest cost, or pick a residential country to widen the odds book.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.betexplorer.com/football/england/premier-league-2023-2024/results/"
    }
  ],
  "maxItems": 10,
  "matchStatus": "played",
  "includeOpeningOdds": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all 33 fields

# 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 = {
    "startUrls": [
        {
            "url": "https://www.betexplorer.com/football/england/premier-league-2023-2024/results/"
        }
    ],
    "maxItems": 10,
    "seasonsBack": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/betexplorer-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 = {
    "startUrls": [{ "url": "https://www.betexplorer.com/football/england/premier-league-2023-2024/results/" }],
    "maxItems": 10,
    "seasonsBack": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/betexplorer-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 '{
  "startUrls": [
    {
      "url": "https://www.betexplorer.com/football/england/premier-league-2023-2024/results/"
    }
  ],
  "maxItems": 10,
  "seasonsBack": 0
}' |
apify call parseforge/betexplorer-odds-scraper --silent --output-dataset

```

## MCP server setup

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