# Melbet Odds Scraper (`mrdoe/melbet-odds-scraper`) Actor

Scrape MelBet betting odds, sports odds, live and pre-match odds for football, tennis, basketball and more. Extract 1X2, over/under, BTTS, double chance, draw no bet, Asian handicaps and 1,000+ betting markets. Export clean data for odds comparison, analysis and tracking.

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

## Pricing

from $2.40 / 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

![Melbet Odds Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/melbet-odds-scraper--hero.png)

### What does MelBet Odds Scraper do?

MelBet Odds Scraper collects betting odds from MelBet and returns them as clean, ready-to-use data — one row per match. Pick a sport (or paste a league or match URL), press **Start**, and download a dataset with the two teams, league, kick-off time, live score, and **decimal odds already decoded into named markets**: match result (1X2), double chance, over/under, both teams to score, draw no bet, and Asian/European handicaps. For an individual match URL it pulls **every market on the page** — often 1,000+ selections including corners, cards, goalscorers, both halves and players' stats.

Use it for odds comparison, line-movement tracking, value and arbitrage screening, model back-testing, and trading dashboards.

### Why use MelBet Odds Scraper?

- **Odds you can use immediately** – `odds["1x2"].home`, `odds.totalGoals.over`, `odds.btts.yes`. No decoding MelBet's numeric market codes yourself.
- **Pre-match and live** – switch between the pre-match line and the in-play feed, or take both. Live rows carry the current score.
- **Whole leagues in one run** – point it at a competition and it walks every fixture.
- **Every market for a single match** – paste a match URL to get the full board: 1X2, totals, handicaps, correct score, corners, cards, goalscorers, first/second half, players' stats.
- **Nothing lost** – alongside the named `odds`, every row keeps the complete raw outcome list, so exotic markets are still in the data.
- **Clean, normalised output** – odds as numbers, ISO kick-off times, deduplicated by match.

### What makes this different?

Most MelBet data floating around is the raw feed — arrays of numeric type/coefficient codes you have to decode against a dictionary. This Actor does that decoding: the common markets come out as named fields with `home` / `draw` / `away` / `over` / `under` / `yes` / `no` selections and the main line already picked. It also handles the geo-redirect and bot protection, and — uniquely — expands a single match URL into every sub-market the site offers.

### What data can you extract?

![Melbet Odds Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/melbet-odds-scraper--output.png)

![Melbet Odds Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/melbet-odds-scraper--fields.png)

| Field                                    | Description                                                            |
| ---------------------------------------- | ---------------------------------------------------------------------- |
| `matchId`                                | MelBet event ID                                                        |
| `url`                                    | Match page URL                                                         |
| `bookmaker`                              | Always `MelBet`                                                        |
| `sport` / `country` / `league`           | Competition                                                            |
| `leagueId`                               | MelBet league ID                                                       |
| `home` / `away`                          | Team (or player) names                                                 |
| `homeLogo` / `awayLogo`                  | Crest image URLs (feed rows)                                           |
| `kickoff` / `startTimestamp`             | Start time (ISO 8601 and Unix)                                         |
| `status` / `isLive`                      | `scheduled` or `live`                                                  |
| `score`                                  | Current score for live matches                                         |
| `venue` / `tournamentStage`              | Where published                                                        |
| `odds`                                   | Decoded main markets — see below                                       |
| `outcomes` / `markets`                   | Every selection, grouped by market                                     |
| `totalMarketsAvailable` / `totalMarkets` | How many markets the match page offers                                 |
| `marketCategories`                       | MelBet's own market groupings with counts (Popular, Total, Goals, ...) |
| `subGames`                               | Sub-market boards for the match (corners, cards, halves, players)      |
| `subGameMarkets`                         | Their fully decoded odds — only when **Deep markets** is on            |
| `scrapedAt`                              | ISO timestamp of collection                                            |

**The `odds` object:**

```json
{
    "1x2": { "home": 5.63, "draw": 4.925, "away": 1.575 },
    "doubleChance": { "homeOrDraw": 2.56, "homeOrAway": 1.215, "drawOrAway": 1.179 },
    "btts": { "yes": 1.54, "no": 2.349 },
    "totalGoals": { "line": 3, "over": 1.7, "under": 2.05 },
    "totalGoalsAlt": { "line": 3.25, "over": 2.035, "under": 1.909 },
    "drawNoBet": { "home": 4.15, "away": 1.183 },
    "asianHandicap": { "line": 0.75, "home": 2.248, "away": 1.053 },
    "handicap": { "line": 1, "home": 1.87, "away": 1.9 }
}
```

### How to use MelBet Odds Scraper

![How Melbet Odds Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/melbet-odds-scraper--how-it-works.png)

1. Open the Actor.
2. Choose a **Feed** (pre-match / live / both) and one or more **Sports**. That is enough to run.
3. Optional — for specific competitions, paste **League URLs** from MelBet (e.g. `.../en/line/football/105759-england-championship`).
4. Optional — for one match with every market, paste **Match URLs** (e.g. `.../105759-england-championship/748230818-west-ham-united-wolverhampton-wanderers`). Turn on **Deep markets** to also pull corners, cards, goalscorers and players' stats.
5. Set **Max matches** and press **Start**.
6. Download the dataset as JSON, CSV, Excel, or XML, or use the API.

### Input Parameters

| Parameter            | Type    | Required | Default         | Description                                                                                                                                                      |
| -------------------- | ------- | -------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mode`               | String  | No       | `line`          | `line` (pre-match), `live` (in-play), or `both`.                                                                                                                 |
| `sports`             | Array   | No       | `["Football"]`  | Sport names or MelBet sport IDs. `["all"]` for every sport.                                                                                                      |
| `leagueUrls`         | Array   | No       | –               | MelBet league page URLs to target specific competitions.                                                                                                         |
| `matchUrls`          | Array   | No       | –               | MelBet match page URLs — returns every market for each match.                                                                                                    |
| `maxMatches`         | Integer | No       | 5               | Maximum matches per run. Raise it for a full export (the input form prefills 50).                                                                                |
| `includeOutcomes`    | Boolean | No       | `true`          | Keep the flat `outcomes` list next to the `odds` object.                                                                                                         |
| `deepMarkets`        | Boolean | No       | `false`         | For match URLs, also fetch the corners / cards / goalscorers / players' stats sub-boards.                                                                        |
| `useCache`           | Boolean | No       | `false`         | Reuse match records from an earlier run.                                                                                                                         |
| `proxyConfiguration` | Object  | No       | Residential, NG | MelBet is geo-restricted. Use Residential proxy in a country where it operates (Senegal, Nigeria, DR Congo, Cameroon...). **Not the UK, US, or most of the EU.** |

### Output Data

```json
{
    "matchId": 748230818,
    "url": "https://melbet.com/en/line/football/105759-england-championship/748230818-west-ham-united-wolverhampton-wanderers",
    "bookmaker": "MelBet",
    "sport": "Football",
    "country": "England",
    "league": "Championship",
    "home": "West Ham United",
    "away": "Wolverhampton Wanderers",
    "kickoff": "2026-09-01T18:45:00.000Z",
    "status": "scheduled",
    "venue": "London Stadium (London)",
    "totalMarkets": 1185,
    "marketCategories": [
        { "name": "Popular", "count": 298 },
        { "name": "Goals", "count": 221 }
    ],
    "odds": {
        "1x2": { "home": 2.07, "draw": 3.58, "away": 3.28 },
        "totalGoals": { "line": 2.5, "over": 1.61, "under": 2.27 },
        "btts": { "yes": 1.5, "no": 2.415 }
    },
    "markets": [
        {
            "group": "Match Result (1X2)",
            "groupId": 1,
            "outcomes": [
                { "type": 1, "selection": "home", "line": null, "odds": 2.07 },
                { "type": 2, "selection": "draw", "line": null, "odds": 3.58 },
                { "type": 3, "selection": "away", "line": null, "odds": 3.28 }
            ]
        }
    ],
    "subGames": [
        { "id": 748230819, "name": "1st half", "marketCount": 253 },
        { "id": 748230824, "name": "Corners", "marketCount": 147 }
    ],
    "scrapedAt": "2026-09-01T17:20:00.000Z"
}
```

### Usage Examples

**Today's football lines**

- `mode`: `line`, `sports`: `["Football"]`, `maxMatches`: 200

**Live in-play odds for several sports**

- `mode`: `live`, `sports`: `["Football", "Tennis", "Basketball"]`

**A whole competition**

- `leagueUrls`: a MelBet "line/football/\<id>-\<league>" URL

**One match, every market**

- `matchUrls`: a MelBet match URL, `deepMarkets`: true

### Tips for Best Results

- Keep the proxy on a MelBet country. If a run returns nothing, try a different country (Senegal and Nigeria are reliable).
- For line-movement tracking, schedule the Actor every few minutes and diff the `odds` between runs.
- `deepMarkets` multiplies the request count — use it with a short `matchUrls` list, not with a whole sport.
- Odds are decimal; convert to fractional or American downstream if you need to.

### Known Limitations

- MelBet is geo-restricted and behind Cloudflare — a residential proxy in an eligible country is required. It is not accessible from the UK, the US, or much of the EU.
- The main match feed returns roughly the top 40 fixtures per sport or league; use league URLs to go wider.
- Automatic league discovery and the "all sports" catalogue depend on the regional mirror the proxy country routes to; when a mirror does not expose them, use explicit **League URLs** or the sport list instead.
- Odds move constantly; a row is a snapshot at collection time.
- Exotic markets keep their numeric MelBet group ID (`"Market 8427"`) rather than a name, but every outcome and its odds are still included.
- Live markets can be suspended around goals and other events, in which case some odds are briefly missing.

### Integrations

Connect results to Google Sheets, Make, Zapier, Slack, or your own systems via the Apify API and webhooks. Schedule runs to keep an odds history.

### Export Formats

JSON, CSV, Excel, and XML from the Dataset tab or the Apify API.

### Frequently Asked Questions

**Which markets are decoded into the `odds` object?**
Match result (1X2), double chance, both teams to score, total goals (main and alternative line), draw no bet, Asian handicap, and European handicap. Everything else is in `markets` / `outcomes` with its numeric codes.

**Can I get corners, cards and goalscorer odds?**
Yes — paste the match URL and turn on **Deep markets**. Those boards come back in `subGameMarkets`.

**Does it work for live betting?**
Yes. Set `mode` to `live` (or `both`). Live rows include the current `score`.

**Why did my run return zero matches?**
The proxy IP is probably in a country where MelBet is blocked. Switch the proxy country.

**How fresh is the data?**
Every run reads the live feed. Schedule it for an odds history.

**How are duplicates handled?**
Matches are deduplicated by MelBet event ID within a run.

### Support

Found a problem or need an extra market decoded? Open an issue on the Actor's **Issues** tab in the Apify Console.

### Legal / Responsible Use

You are responsible for how you use this Actor and the data it collects, including compliance with MelBet's Terms of Use and the gambling and data-protection laws that apply to you. This Actor collects publicly displayed betting odds for analysis; it does not place bets or access any account. Gambling is age-restricted and regulated, and MelBet is not licensed in every country — check your local rules before using odds data commercially. If you or someone you know has a gambling problem, seek support from a service such as BeGambleAware.

### Preview

![Melbet Odds Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/melbet-odds-scraper--input.png)

# Actor input Schema

## `mode` (type: `string`):

Which odds to collect: pre-match (line), in-play (live), or both.

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

Sports to collect, by name ("Football", "Tennis", "Basketball", "Ice Hockey", "Cricket", "Esports", ...) or numeric MelBet sport ID. Use \["all"] for every sport.

## `leagueUrls` (type: `array`):

Optional. Paste MelBet league page URLs to target specific competitions, e.g. https://melbet.com/en/line/football/105759-england-championship . When set, these are collected in addition to the sports above.

## `matchUrls` (type: `array`):

Optional. Paste individual MelBet match page URLs to collect EVERY market for that match — 1X2, totals, handicaps, corners, cards, both halves, correct score, and the rest (often 1,000+ selections). Example: https://melbet.com/en/line/football/105759-england-championship/748230818-west-ham-wolves

## `maxMatches` (type: `integer`):

Maximum number of matches to collect in one run. Raise this for a full export.

## `includeOutcomes` (type: `boolean`):

Add an `outcomes` array with every individual selection (market, line, odds) on top of the ready-to-use `odds` object. Turn off for smaller rows.

## `deepMarkets` (type: `boolean`):

For each match URL, also fetch the separate sub-game markets — corners, cards, goalscorers, players' stats, each half in full. Adds many extra requests per match, so only use it with a small list of match URLs.

## `useCache` (type: `boolean`):

Reuse match records collected in an earlier run. Disabled by default so every run returns live odds.

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

MelBet is geo-restricted and blocks datacenter traffic. Use Apify Residential proxy and choose a country where MelBet operates (for example Senegal, Nigeria, DR Congo, Cameroon). It is NOT available in the UK, the US, or much of the EU.

## Actor input object example

```json
{
  "mode": "line",
  "sports": [
    "Football"
  ],
  "leagueUrls": [],
  "matchUrls": [],
  "maxMatches": 50,
  "includeOutcomes": true,
  "deepMarkets": false,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SN"
  }
}
```

# Actor output Schema

## `matches` (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 = {
    "sports": [
        "Football"
    ],
    "maxMatches": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/melbet-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 = {
    "sports": ["Football"],
    "maxMatches": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "SN",
    },
}

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

```

## MCP server setup

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