# Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse) (`abotapi/sportsbook-odds-scraper`) Actor

Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it the brands and feeds you want and get one row per event with its 1X2 prices, over/under lines, teams, league and start time.

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

## Pricing

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

## Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse)

Collect **live and prematch betting odds** from four bookmakers that run the same platform. Give it the brands and feeds you want, and get one row per event with its **1X2 prices**, **over/under lines**, teams, league, start time and - for in-play events - the current score.

### Why This Scraper?

- **Four bookmakers, one run.** 1xBet, Melbet, Linebet and Paripulse are covered together, so you can compare their prices on the same events.
- **Prematch and live.** Choose either feed, or both.
- **Real decimal odds.** The 1X2 home/draw/away prices and every over/under line, plus the full flattened market list so nothing is hidden.
- **Fast and cheap.** It reads the bookmakers' own public odds feed over plain HTTP - no browser, no page rendering, 256 MB is ample. One request returns dozens of events with all of their markets.
- **Fail-loud.** If a bookmaker refuses to serve, the run says so instead of reporting an empty success.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live feed.

| `Field` | `Example` |
| --- | --- |
| `recordType` | "event" |
| `bookmaker` | "linebet" |
| `feed` | "prematch" |
| `eventId` | "750683351" |
| `sport` | "Football" |
| `league` | "Spain. La Liga" |
| `home` | "Sample United" |
| `away` | "Example City" |
| `startTime` | "2026-01-01T20:00:00.000Z" |
| `scoreHome` | 1 |
| `scoreAway` | 0 |
| `oddsHome` | 2.28 |
| `oddsDraw` | 3.34 |
| `oddsAway` | 3.17 |
| `totals` | \[{"line": 1.5, "over": 1.26, "under": 3.6}] |
| `markets` | \[{"group": 1, "type": 1, "line": null, "odds": 2.28}, ...] |

### How to Use

All four bookmakers, prematch:

```json
{
  "feeds": ["prematch"],
  "maxEvents": 100
}
```

To fetch specific games, set `mode` to `url` and paste the complete match links in `eventUrls`:

```json
{
  "mode": "url",
  "eventUrls": [
    "https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"
  ]
}
```

In the Apify input form, choose **Specific match URLs** in **Collection mode** first; the **URL mode: one specific match** section is directly above **Output & limits**. You do not need to set `bookmakers` or `feeds` for URL mode - the bookmaker and event id are read from each pasted link.

Two bookmakers, both feeds, football only:

```json
{
  "bookmakers": ["1xbet", "linebet"],
  "feeds": ["prematch", "live"],
  "sports": ["Football"]
}
```

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `bulk` | `bulk` reads the selected bookmaker feeds; `url` fetches only the match URLs in `eventUrls`. |
| `bookmakers` | array of strings | all four | Which brands to collect: 1xbet, melbet, linebet, paripulse. |
| `feeds` | array of strings | \["prematch"] | prematch = upcoming events; live = in-play (includes the current score). |
| `eventUrls` | array of strings | \[] | Used when `mode` is `url`; paste complete match links from the supported bookmakers. |
| `sports` | array of strings | \[] | Keep only events whose sport name matches. Empty = all sports. |
| `eventsPerRequest` | integer | 40 | Events asked for per feed request. The source caps this at 40. |
| `maxEvents` | integer | 0 | Stop after this many events. 0 = no limit. |
| `proxy` | object | Apify Residential | Residential proxy, pre-selected. |

#### URL mode

Select `mode: "url"`, then paste one or more match page URLs into `eventUrls` to fetch exactly those events instead of a bulk feed run:

```json
{
  "mode": "url",
  "eventUrls": [
    "https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"
  ]
}
```

Each row comes back in the same shape as bulk mode (same fields, same dataset view), with `url` set to the URL you pasted.

- **Mode is explicit.** In `url` mode, `bookmakers`, `feeds`, `eventsPerRequest` and `maxEvents` (the bulk-run settings above) are ignored; `sports` still applies as a filter. For backward compatibility, API requests that omit `mode` but provide non-empty `eventUrls` still use URL mode.
- **Full URLs only, no bare ids.** The bookmaker is resolved from the URL's own host (1xbet.com / melbet.com / linebet.com / paripulse.com), so a bare numeric event id has no way to say which of the four brands it belongs to. Paste the full match link instead.
- **Live and prematch are both tried per event.** A given event id only answers on one of the two backend endpoints, and nothing about the id or URL reliably says which ahead of time, so the actor tries the prematch endpoint first, then the live one, and reports whichever answered in the `feed` field. This means a URL-mode fetch can cost up to 2 requests per event.
- **A bad or stale entry is skipped, not fatal.** A URL whose host isn't one of the four brands, or an event id that has expired/is not found on either endpoint, is logged as a warning and skipped - the run still succeeds with whatever it did resolve, matching this actor's normal "one bad item never fails the whole run" behavior.
- **Live scores** are only present once the match has actually kicked off (the response then carries a score block); before that, `scoreHome`/`scoreAway` are `null`, same as a prematch bulk-mode row.

### Output Example

```json
{
  "recordType": "event",
  "bookmaker": "linebet",
  "feed": "prematch",
  "eventId": "750683351",
  "sport": "Football",
  "home": "Sample United",
  "away": "Example City",
  "oddsHome": 2.28,
  "oddsDraw": 3.34,
  "oddsAway": 3.17
}
```

### Plan Requirement

Use a residential proxy for this actor. It does not require an account and does not place bets.

- **Residential proxy is required.** These bookmakers refuse datacenter connections, and each brand is fetched from a country where it operates (1xBet and Paripulse are geo-blocked in some markets).
- **Coverage is the bookmaker's own 1X2 feed**, which is the set of main events each brand promotes for 1X2 and over/under betting. It is not every market that exists deep inside a league page.
- **Live odds move.** A live row is a snapshot of the moment it was collected.
- **Block pages are retried.** A bookmaker occasionally answers with a maintenance/block page instead of odds; the actor rotates exits and retries, and only fails if every attempt is refused.
- **Odds are informational.** This actor does not place bets and needs no account.

# Actor input Schema

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

Choose Bulk feed for a broad odds run, or Match URLs to fetch specific games.

## `bookmakers` (type: `array`):

Which brands to collect. Leave empty for all four.

## `feeds` (type: `array`):

prematch = upcoming events; live = in-play events (includes the current score).

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

Full match page URLs from 1xbet.com, melbet.com, linebet.com or paripulse.com, e.g. https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague. Bare event ids are not supported (the id alone doesn't say which bookmaker it belongs to).

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

Keep only events from these sports, matched on the sport name (e.g. Football, Tennis, Basketball). Leave empty for every sport in the feed.

## `eventsPerRequest` (type: `integer`):

How many events each feed request asks for. The source caps this at 40; higher values are refused.

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

Stop after this many events. 0 = no limit.

## `proxy` (type: `object`):

Residential proxy is required and pre-selected: these brands refuse datacenter connections, and each brand is fetched from a country where it operates.

## Actor input object example

```json
{
  "mode": "bulk",
  "bookmakers": [
    "linebet"
  ],
  "feeds": [
    "prematch"
  ],
  "eventUrls": [
    "https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"
  ],
  "sports": [],
  "eventsPerRequest": 40,
  "maxEvents": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "bulk",
    "bookmakers": [
        "linebet"
    ],
    "feeds": [
        "prematch"
    ],
    "eventUrls": [
        "https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"
    ],
    "eventsPerRequest": 40,
    "maxEvents": 0,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/sportsbook-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 = {
    "mode": "bulk",
    "bookmakers": ["linebet"],
    "feeds": ["prematch"],
    "eventUrls": ["https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"],
    "eventsPerRequest": 40,
    "maxEvents": 0,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/sportsbook-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 '{
  "mode": "bulk",
  "bookmakers": [
    "linebet"
  ],
  "feeds": [
    "prematch"
  ],
  "eventUrls": [
    "https://linebet.com/en/line/football/118593-uefa-europa-league/748751421-ararat-armenia-ac-sparta-prague"
  ],
  "eventsPerRequest": 40,
  "maxEvents": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call abotapi/sportsbook-odds-scraper --silent --output-dataset

```

## MCP server setup

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