# Betano Odds Scraper: Full Match Odds & Price-Move Monitor (`getascraper/betano-odds-scraper`) Actor

Extract real decimal odds from 11 Betano country books (Germany, Brazil, Portugal, Argentina, and more): full market boards with real priced selections per fixture, not just team names. Price-move monitor included. Under $8 per 1,000 fixtures with full odds, no subscription.

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

## Pricing

from $1.87 / 1,000 fixtures

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

## ⚽ Betano Odds Scraper: Full Match Odds & Price-Move Monitor

<table width="100%"><tr><td style="padding:24px 28px;background:#EAF5EE;border:1px solid #C8E3D2;border-top:4px solid #1F6E43;border-radius:12px"><span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Betano's full odds board, not just the fixture list</span><br><span style="font-size:15px;color:#57534E;line-height:1.6">Get real decimal prices across match result, over/under, both teams to score, and more for every upcoming fixture, not just team names and a market count.</span></td></tr></table>

<table width="100%"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C8E3D2;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1F6E43">📋 Full market boards</span><br><span style="font-size:12px;color:#57534E">Match result, over/under, both teams to score, correct score, and more, per fixture.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C8E3D2;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1F6E43">💰 Real decimal prices</span><br><span style="font-size:12px;color:#57534E">Every selection comes with its actual current price, not a placeholder.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C8E3D2;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1F6E43">🔔 Odds-move alerts</span><br><span style="font-size:12px;color:#57534E">Monitor mode fires when a tracked fixture's price actually changes.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C8E3D2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1F6E43">🌍 11 books, one Actor</span><br><span style="font-size:12px;color:#57534E">Germany, Romania, Brazil, Portugal, Czechia, Bulgaria, Peru, Canada, Argentina, Nigeria, and Ghana, same clean output shape.</span></td></tr></table>

Betano Odds Scraper reads upcoming fixtures from [Betano](https://www.betano.com) and returns each one with its full market board: real decimal prices for match result, over/under, both teams to score, half-time result, correct score, and more. Run it once for a snapshot, or on a schedule to track odds movement over time.

### 🎯 What this Actor does

Odds comparison and affiliate sites use it as a clean data feed for Betano's board. Sports trading researchers use it to pull real prices into a model without checking the site by hand. Betting analytics builders use it as a structured source for match result, totals, and prop markets in one call.

**Every fixture comes with a deep market board already filled in: real selections and real decimal prices, not just a team list and a market count.** A typical fixture returns dozens of populated markets (match result, over/under at many lines, handicaps, both teams to score, half-time result, correct score, player and goal props, and more). Coverage depends on what Betano itself has priced for that fixture at the time; this Actor never claims a market it doesn't return.

**Country coverage spans 11 Betano books today, and growing.** This Actor is honest about scope and never fabricates a price it hasn't verified.

### 🚀 How to use it

<table width="100%"><tr><td style="padding:16px 14px;width:33%;background:#EAF5EE;border:1px solid #C8E3D2;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1F6E43;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Pick a country book and a sport</span><br><span style="font-size:12px;color:#57534E">The defaults already work if you just want to try it.</span></td><td style="padding:16px 14px;width:33%;background:#EAF5EE;border:1px solid #C8E3D2;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1F6E43;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Run it once, or schedule it</span><br><span style="font-size:12px;color:#57534E">Turn on monitor mode to watch for real odds moves over time.</span></td><td style="padding:16px 14px;width:33%;background:#EAF5EE;border:1px solid #C8E3D2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1F6E43;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Get every fixture, fully priced</span><br><span style="font-size:12px;color:#57534E">Full market board and real prices already attached to each row.</span></td></tr></table>

### 🧩 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Country book | enum | No | Which Betano country site to read upcoming fixtures from. |
| Sport | enum | No | Only return fixtures for this sport. |
| Include odds | boolean | No | Fetch each fixture's own market board and real prices. Turn off for fixture metadata only, faster and cheaper. |
| Proxy configuration | object | No | Betano requires a residential proxy matching the selected country. |
| Max events | integer | No | Maximum number of fixtures to return in this run. |
| Incremental monitor mode | boolean | No | Only return fixtures that are new or changed since your last run with the same monitor state name. |
| Monitor state name | string | No | Name for this run's incremental state. Use different names to track separate configurations independently. |

### 📤 Output

```json
{
  "eventId": "88312154",
  "teams": "Athletic Bilbao vs Atletico Madrid",
  "leagueId": 5,
  "leagueName": "LaLiga",
  "startTime": "2026-09-05T14:15:00.000Z",
  "country": "DE",
  "sport": "football",
  "totalMarketsAvailable": 108,
  "markets": [
    {
      "marketId": "2835494163",
      "name": "Endergebnis",
      "type": "MRES",
      "handicap": 0,
      "selections": [
        { "id": "9910840128", "name": "1", "fullName": "Athletic Bilbao", "price": 3.05, "handicap": 0 },
        { "id": "9910840129", "name": "X", "fullName": "Unentschieden", "price": 3.3, "handicap": 0 },
        { "id": "9910840130", "name": "2", "fullName": "Atletico Madrid", "price": 2.4, "handicap": 0 }
      ]
    }
  ],
  "sourceUrl": "https://www.betano.de/quoten/athletic-bilbao-atletico-madrid/88312154/",
  "scrapedAt": "2026-09-05T09:15:16.653Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `eventId` | string | Betano's own event identifier. |
| `teams` | string | The two teams or participants. |
| `leagueId` / `leagueName` | number / string | Betano's internal league identifier and its display name. |
| `startTime` | string | Scheduled kickoff time. |
| `country` | string | Which Betano country book the fixture came from. |
| `sport` | string | The sport this fixture belongs to. |
| `totalMarketsAvailable` | number | How many betting markets Betano lists in total for this fixture. |
| `markets` | array | Each returned market's name, type, and real-priced selections. |
| `sourceUrl` | string | Link to the original event page. |
| `changeType` | string | `NEW`, `UPDATED`, or `CURRENT`, present only in incremental monitor mode. |

### 💰 Pricing

This Actor uses pay per event pricing. Empty runs cost nothing, and there are no subscriptions.

### ⭐ Enjoying Betano Odds Scraper?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#EAF5EE;border:1px solid #C8E3D2;border-left:5px solid #1F6E43;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you from checking odds by hand, that's worth a rating.</span><br><span style="font-size:14px;color:#57534E">Your feedback tells us which countries and markets to add next.</span></td></tr><tr><td style="padding:0;background:#1F6E43;border:1px solid #C8E3D2;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/betano-odds-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Does this return actual betting odds and prices?

Yes. Every fixture comes back with its default market board already filled in, real selections and real decimal prices, not just a team list.

#### Does it cover every market Betano offers for a fixture?

Not always all of them. It returns a deep market board covering match result, over/under, handicaps, both teams to score, half-time result, correct score, and player and goal props, typically dozens of markets per fixture. A few of the rarest props can still be missing if Betano itself hasn't priced them yet for that fixture (for example, before lineups are confirmed).

#### Which countries does this cover?

Germany, Romania, Brazil, Portugal, Czechia, Bulgaria, Peru, Canada, Argentina, Nigeria, and Ghana today. More country books are added as each one is verified to work reliably, not claimed in advance.

#### Do I need my own proxy?

No, the default proxy setting handles this. Betano requires a residential proxy matching the country you select, and the default is already configured for that.

#### Can I run this on a schedule and only get fixtures whose odds changed?

Yes. Turn on incremental monitor mode and set up an Apify schedule. Each run only returns a fixture when it's new or when its market prices have actually moved.

### 🔗 Other actors

- [SofaScore Scraper: Live scores, stats and fixtures](https://apify.com/getascraper/sofascore-live-events-scraper) ↗ - Track live scores, stats, and fixtures across sports.
- [Capitol Trades Scraper: Congress Stock Trades & Monitor Mode](https://apify.com/getascraper/capitol-trades-scraper) ↗ - Track US Congress member stock trades with recurring monitoring.
- [CareerBliss Reviews Scraper: Ratings, Salary & Monitor](https://apify.com/getascraper/careerbliss-reviews-scraper) ↗ - Scrape employee reviews and salary data with a change monitor.
- [VAS Sheffield Jobs Scraper: Charity Vacancies & Monitor](https://apify.com/getascraper/vas-sheffield-jobs-scraper) ↗ - Scrape Sheffield charity job vacancies with a change monitor.

# Actor input Schema

## `country` (type: `string`):

Which Betano country site to read upcoming fixtures from. Coverage starts with the largest verified markets and grows over time.

## `sport` (type: `string`):

Only return fixtures for this sport.

## `includeOdds` (type: `boolean`):

Fetch each fixture's own page for its real decimal odds (match result, over/under, both teams to score, and more). Turn off to return fixture metadata only, faster and cheaper.

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

Betano requires a residential proxy matching the selected country's geo to clear its access checks. Datacenter proxies will not work.

## `maxEvents` (type: `integer`):

Maximum number of fixtures to return in this run.

## `onlyNewOrChanged` (type: `boolean`):

Only return fixtures that are new or have changed since your last run with the same monitor state name. Pair with an Apify schedule to track upcoming fixtures over time.

## `stateName` (type: `string`):

Name for this run's incremental state, used only when incremental monitor mode is on. Use different names to track separate configurations independently.

## Actor input object example

```json
{
  "country": "DE",
  "sport": "football",
  "includeOdds": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxEvents": 10,
  "onlyNewOrChanged": false,
  "stateName": "default"
}
```

# Actor output Schema

## `events` (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 = {
    "country": "DE",
    "sport": "football",
    "includeOdds": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "maxEvents": 10,
    "onlyNewOrChanged": false,
    "stateName": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/betano-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 = {
    "country": "DE",
    "sport": "football",
    "includeOdds": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "maxEvents": 10,
    "onlyNewOrChanged": False,
    "stateName": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/betano-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 '{
  "country": "DE",
  "sport": "football",
  "includeOdds": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxEvents": 10,
  "onlyNewOrChanged": false,
  "stateName": "default"
}' |
apify call getascraper/betano-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/betano-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/0gc9TdSni9i1v8bbY/builds/3akJ3cdMyaY5UFm5S/openapi.json
