# 22Bet Odds Scraper (`mrdoe/22bet-odds-scraper`) Actor

Extracts pre-match and live betting odds from 22Bet: teams, league, kickoff time, live score, and decimal odds for 1X2, double chance, over/under, handicap, draw-no-bet and both-teams-to-score markets.

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

## Pricing

from $11.00 / 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?

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

![22Bet Odds Scraper - 22Bet odds for every match as clean rows: teams, start time and decimal prices for the main markets.](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/22bet-odds-scraper--hero.png)

### What does 22Bet Odds Scraper do?

22Bet Odds Scraper collects betting odds from 22Bet and returns one clean row per match: the two teams, competition, start time, live status and decimal prices for the main markets (1X2, double chance, totals, both teams to score, draw no bet and handicaps). Choose sports, leagues or single matches, switch between pre-match and live, and export the result as JSON, CSV or Excel or call it from the API. Use it for odds comparison, line movement tracking, value-bet and arbitrage screening and model back-testing.

### Why use 22Bet Odds Scraper?

- Odds ready to use: named markets, no decoding.
- Pre-match and live in one Actor.
- Whole sports or leagues in one run.
- Clean, deduplicated rows with ISO times.
- Plugs into the odds comparison and value-bet Actors.

### What makes this different

22Bet is a major bookmaker across Africa and Asia with very deep football markets. This Actor returns its prices as flat rows with the main markets already named, so comparing 22Bet against other bookmakers, or against your own model, needs no extra parsing.

### How it works

![22Bet Odds Scraper workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/22bet-odds-scraper--how-it-works.png)

1. **Your input** — choose the sports, leagues or matches.
2. **The Actor collects it** — the Actor reads the current 22Bet board.
3. **Your output** — you get one row per match with the odds attached.

### What data can you extract?

The dataset has 25 fields per row:

| Field | Type | Description |
|---|---|---|
| `matchId` | integer | Bookmaker event ID. |
| `url` | string | Match page URL. |
| `bookmaker` | string | Always 22Bet. |
| `sport` | string | Sport. |
| `sportId` | integer | Sport ID. |
| `country` | string | Country of the competition. |
| `league` | string | Competition. |
| `leagueId` | integer | Competition ID. |
| `home` | string | Home team or player. |
| `away` | string | Away team or player. |
| `homeLogo` | string | Home crest image. |
| `awayLogo` | string | Away crest image. |
| `kickoff` | string | Start time (ISO 8601). |
| `startTimestamp` | integer | Start time (Unix). |
| `status` | string | Match status: scheduled or live. |
| `isLive` | boolean | True while the match is in play. |
| `score` | string | Current score for live matches. |
| `period` | string | Period, for example match or first half. |
| `venue` | string | Venue. |
| `tournamentStage` | string | Tournament stage. |
| `odds` | object | Ready-to-use main markets with decimal prices. |
| `outcomes` | array | Every individual selection with its price. |
| `marketsOnFeed` | integer | Markets on feed. |
| `totalMarketsAvailable` | integer | Markets the match offers. |
| `scrapedAt` | string | ISO timestamp of collection. |

### How to use 22Bet Odds Scraper

![22Bet Odds Scraper input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/22bet-odds-scraper--input.png)

1. Open the Actor and go to the **Input** tab.
2. Choose a **Feed** and one or more **Sports**, set **Max matches** (0 for everything) and press Start. Optionally target a 22Bet league page URL.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `mode` | string | No | `"line"` | Which odds to collect: pre-match (line), in-play (live), or both. |
| `sports` | array | No | `["Football"]` | Sports to collect, by name ("Football", "Tennis", "Basketball", "Ice Hockey", "Cricket", "Esports", ...) or numeric 22Bet sport ID. Use \["all"] for every sport. |
| `leagueUrls` | array | No | `[]` | Optional. Paste 22Bet league page URLs to target specific competitions, e.g. https://22bet.com/line/football/105759-england-championship . When set, these are collected in addition to the sports above. |
| `matchUrls` | array | No | `[]` | Optional. Paste individual 22Bet 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://22bet.com/line/football/105759-england-championship/748230818-west-ham-united-wolverhampton-wanderers |
| `maxMatches` | integer | No | `5` | Maximum number of matches to collect in one run. Default is 5 for a quick test; set 0 to return everything available. |
| `includeOutcomes` | boolean | No | `true` | 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` | boolean | No | `false` | 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` | boolean | No | `false` | Reuse match records collected in an earlier run. Disabled by default so every run returns live odds. |
| `proxyConfiguration` | object | No | `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"NG"}` | 22Bet is geo-restricted and blocks datacenter traffic. Use Apify Residential proxy and choose a country where 22Bet operates (for example Nigeria, Kenya, DR Congo, Cameroon). It is NOT available in the UK, the US, or much of the EU. |

### Output Data

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

`odds` holds the main markets as decimal prices, `status` and `isLive` show whether the match is in play, and the full selection list is kept alongside for less common markets.

![22Bet Odds Scraper field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/22bet-odds-scraper--fields.png)

A real dataset item:

```json
{
  "matchId": 748230818,
  "url": "https://22bet.ng/line/football/105759-england-championship/748230818-west-ham-united-wolverhampton-wanderers",
  "bookmaker": "22Bet",
  "sport": "Football",
  "sportId": 1,
  "country": "England",
  "league": "Championship",
  "leagueId": 105759,
  "home": "West Ham United",
  "away": "Wolverhampton Wanderers",
  "homeLogo": "https://22bet.ng/sfiles/logo_teams/1980.png",
  "awayLogo": "https://22bet.ng/sfiles/logo_teams/b991346416c107a8c1ee4f90f6f1fc02.png",
  "kickoff": "2026-09-01T18:45:00.000Z",
  "startTimestamp": 1788288300,
  "status": "scheduled",
  "isLive": false,
  "score": null,
  "period": null,
  "venue": "Olympic Stadium (London)",
  "tournamentStage": "Round 4",
  "odds": {
    "1x2": {
      "home": 2.07,
      "draw": 3.6,
      "away": 3.26
    },
    "doubleChance": {
      "homeOrDraw": 1.31,
      "homeOrAway": 1.26,
      "drawOrAway": 1.72
    },
    "btts": {
      "yes": 1.49,
      "no": 2.441
    },
    "totalGoals": {
      "line": 2.5,
      "over": 1.59,
      "under": 2.31
    },
    "totalGoalsAlt": {
      "line": 2.75,
      "over": 1.726,
      "under": 2.073
    },
    "drawNoBet": {
      "home": 1.49,
      "away": 2.31
    },
    "asianHandicap": {
      "line": 0.75,
      "home": 2.28,
      "away": 1.53
    },
    "handicap": {
      "line": 1.5,
      "home": 1.81,
      "away": 1.96
    },
    "handicapAlt": {
      "line": 1.5,
      "home": 2.36,
      "away": 1.55
    }
  },
  "outcomes": [
    {
      "market": "Match Result (1X2)",
      "marketId": 1,
      "type": 1,
      "selection": "home",
      "line": null,
      "odds": 2.07
    },
    {
      "market": "Match Result (1X2)",
      "marketId": 1,
      "type": 2,
      "selection": "draw",
      "line": null,
      "odds": 3.6
    },
    {
      "market": "Match Result (1X2)",
      "marketId": 1,
      "type": 3,
      "selection": "away",
      "line": null,
      "odds": 3.26
    },
    {
      "market": "Double Chance",
      "marketId": 8,
      "type": 4,
      "selection": "homeOrDraw",
      "line": null,
      "odds": 1.31
    }
  ],
  "marketsOnFeed": 20,
  "totalMarketsAvailable": 1187,
  "scrapedAt": "2026-09-01T17:21:43.201Z"
}
```

### Usage Examples

#### 22Bet Football Odds

```json
{
  "sports": [
    "Football"
  ],
  "maxMatches": 0
}
```

#### 22Bet Tennis Odds

```json
{
  "sports": [
    "Tennis"
  ],
  "maxMatches": 0
}
```

#### 22Bet Basketball Odds

```json
{
  "sports": [
    "Basketball"
  ],
  "maxMatches": 0
}
```

### Tips for Best Results

- Default is 5 results for a fast test. Set the max to 0 to return everything available.

### Known Limitations

- 22Bet availability depends on your region; the Actor uses the proxy configured in the input.
- Odds move constantly; a row is a snapshot at collection time.
- Live markets can be briefly suspended, leaving some prices missing.
- Only public odds are collected: no accounts, no bets.

### Integrations

Run it from the Apify API, on a schedule, or from a webhook. Send results straight to Google Sheets, Make, Zapier, Slack or your own database with Apify's built-in integrations.

### Export Formats

Download the dataset as JSON, CSV, Excel, XML, HTML table or RSS from the **Output** tab or the API.

### Frequently Asked Questions

#### Does it need an account or API key?

No. The Actor reads public data and needs no account or key.

#### Am I charged for failed results?

No. You are only charged for results that are written to the dataset.

#### Do I need an account or login?

No. The Actor reads public data and needs no account or key.

#### Am I charged for failed runs or empty results?

You are only charged for results that are actually written to the dataset.

#### Can I run it on a schedule?

Yes. Create a Task with your input and add a schedule in Apify Console. With monitor mode on, each scheduled run returns only what changed since the previous one.

### Support

Questions or a missing field? Open an issue from the **Issues** tab on this Actor's page and it will be looked at.

### Legal / Responsible Use

You are responsible for how you use this data, including compliance with 22Bet's terms and the gambling laws that apply to you. This Actor collects publicly displayed odds for analysis; it does not place bets or access any account. Gambling is age-restricted; if you or someone you know has a problem, seek support such as BeGambleAware or 1-800-GAMBLER.

# 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 22Bet sport ID. Use \["all"] for every sport.

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

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

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

Optional. Paste individual 22Bet 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://22bet.com/line/football/105759-england-championship/748230818-west-ham-united-wolverhampton-wanderers

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

Maximum number of matches to collect in one run. Default is 5 for a quick test; set 0 to return everything available.

## `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`):

22Bet is geo-restricted and blocks datacenter traffic. Use Apify Residential proxy and choose a country where 22Bet operates (for example Nigeria, Kenya, 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": 5,
  "includeOutcomes": true,
  "deepMarkets": false,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NG"
  }
}
```

# Actor output Schema

## `results` (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": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NG"
    }
};

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

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

```

## MCP server setup

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