# Forebet Football Predictions Scraper (`solidcode/forebet-scraper`) Actor

\[💰 $0.1 / 1K] Extract Forebet football predictions for any date — 1X2 probabilities, correct score, over/under 2.5, both teams to score, half-time, HT/FT, double chance, Asian handicap, corners, cards and goalscorers, plus value bets and results.

- **URL**: https://apify.com/solidcode/forebet-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Forebet Football Predictions Scraper

Pull Forebet's football predictions at scale — win probabilities, predicted correct scores, goal and card markets, likely goalscorers, bookmaker odds, team form, final scores and whether each tip actually won. Built for bettors, tipster sites, fantasy managers and sports-data teams who need a clean, model-ready predictions table for any date instead of copying rows off a web page one league at a time.

### Why This Scraper?

- **Ten prediction markets merged onto one row** — match result 1X2, over/under 2.5 goals, both teams to score, half-time result, half-time/full-time, double chance, Asian handicap, corners, cards and Forebet's three likeliest goalscorers, all joined to a single match record instead of ten separate exports.
- **Backtest the model, don't just read it** — every finished match carries three goal-market accuracy flags (did the tip win, did the exact predicted scoreline land, did the goal-average call fall on the right side of 2.5) plus a named `accuracyMarket` telling you exactly which tip they scored, and six more flags scoring the corner and card calls separately. Unresolved fixtures stay empty rather than being silently counted as misses.
- **Roughly 29 days of history and 15 days ahead** — pick a single day, a quick range (today, tomorrow, this weekend, next 3 or next 7 days), or your own `startDate`–`endDate`. Past dates come back with the final score and half-time score attached.
- **Value bets and top tips as first-class options** — Forebet's Kelly-criterion value list ships with a `valuePercent` edge on every row, alongside the top-tips board and the matches currently being played.
- **Bookmaker odds, price movement and in-play lines** — 1/X/2 odds with up/down movement per outcome, live prices where shown, the highlighted best coefficient, and separate odds for over/under 2.5 and both teams to score.
- **Over 300 fixtures on a busy Saturday** — the corners, cards and goalscorer markets publish Forebet's complete daily fixture list across every competition it covers worldwide, not just the headline games.
- **Free context on every match** — last-six form strings such as `WWDLWW` and league position for both teams, Forebet's plain-English trend sentence, stadium name, kick-off weather in °C, and the match-preview article link.
- **Filters that cut your bill, not your run** — Forebet serves an entire day at once, so the country, competition and minimum-confidence (0–100%) filters reduce the rows you pay for rather than making the run longer.
- **Up to 89 fields per match, cleanly typed** — real booleans, consistent camelCase, ISO-8601 kick-off timestamps and integer probabilities, ready to load straight into a spreadsheet or model.

### Use Cases

**Model Building & Backtesting**
- Pull four weeks of finished matches with tips, final scores and accuracy flags to measure the real hit rate
- Compare predicted correct scores against actual scorelines, league by league
- Test whether high-confidence tips (60%+) beat the full sample
- Assemble a training set of probabilities, odds and outcomes for your own model

**Value & Odds Analysis**
- Track the Kelly-criterion value list daily and log the edge percentage on every pick
- Compare Forebet's implied probabilities against 1/X/2 bookmaker odds to spot mispricing
- Watch odds movement per outcome in the hours before kick-off
- Screen over/under 2.5 and both-teams-to-score prices against the model's own numbers

**Tipster Content & Media**
- Auto-generate match previews with probabilities, predicted score, form and weather
- Publish a daily tips table for a single country or competition
- Build weekend roundups with venue, league positions and trend notes
- Feed a Telegram or Discord channel with the day's highest-confidence picks

**Fantasy Football & Player Props**
- Pull the three most likely goalscorers with probabilities for every fixture
- Rank captain picks by combining goalscorer probability with predicted goal average
- Avoid defenders in matches with high predicted card totals
- Use predicted corner totals for corner-based fantasy and prop formats

**Apps & Data Integration**
- Power a predictions widget or tipping app with a scheduled daily refresh
- Enrich an existing fixture database with probabilities, odds and form
- Feed dashboards that compare prediction accuracy across leagues
- Trigger alerts when a fixture crosses a confidence threshold

### Getting Started

#### Today's Predictions

The simplest run — today's matches with the three most popular markets:

```json
{
    "matchScope": "byDate",
    "predictionMarkets": ["match1x2", "underOver25", "bothTeamsToScore"],
    "dateRange": "today",
    "maxResults": 100
}
````

#### One Competition, High Confidence Only

```json
{
    "matchScope": "byDate",
    "predictionMarkets": ["match1x2", "bothTeamsToScore", "corners"],
    "dateRange": "weekend",
    "leagues": ["Premier League", "La Liga"],
    "minProbability": 55,
    "maxResults": 200
}
```

#### Forebet's Value Bets

Date settings and market choice are ignored for the curated lists — this is all you need:

```json
{
    "matchScope": "valueBets"
}
```

#### Full Backtest — Every Market, A Week Of History

```json
{
    "matchScope": "byDate",
    "predictionMarkets": [
        "match1x2", "underOver25", "bothTeamsToScore", "halfTime",
        "halfTimeFullTime", "doubleChance", "asianHandicap",
        "corners", "cards", "goalscorers"
    ],
    "startDate": "2026-07-01",
    "endDate": "2026-07-07",
    "countries": ["Brazil", "Argentina"],
    "maxResults": 0
}
```

### Input Reference

#### What to Collect

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `matchScope` | string | `"byDate"` | Which set of matches to collect. The three curated lists are ready-made Forebet pages, so they ignore both the date settings and the market choice. |
| `predictionMarkets` | array | `["match1x2", "underOver25", "bothTeamsToScore"]` | Markets to merge onto each match row. More markets make each row wider, not the result list longer. The order matters — see the tip below. |

**`matchScope` options**

| Value | Option shown in the UI |
|-------|------------------------|
| `byDate` | Matches on chosen dates (recommended) |
| `valueBets` | Value bets — Forebet's Kelly-criterion picks |
| `topTips` | Top tips — Forebet's highest-confidence picks |
| `liveNow` | Live now — matches currently being played |

**`predictionMarkets` options**

| Value | Option shown in the UI |
|-------|------------------------|
| `match1x2` | Match result 1X2 — home / draw / away probabilities |
| `underOver25` | Over / under 2.5 goals |
| `bothTeamsToScore` | Both teams to score |
| `halfTime` | Half-time result |
| `halfTimeFullTime` | Half-time / full-time combination |
| `doubleChance` | Double chance (1X, 12, 2X) |
| `asianHandicap` | Asian handicap |
| `corners` | Corners — predicted total and over / under 9.5 |
| `cards` | Cards — predicted total and over / under |
| `goalscorers` | Likely goalscorers — top 3 players with probabilities |

#### Dates

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dateRange` | string | `"today"` | Quick pick for the days you want: Today, Tomorrow, Today and tomorrow, This weekend (Saturday and Sunday), Yesterday (finished, with results), Next 3 days, Next 7 days. |
| `startDate` | string | empty | First day to collect, written as `YYYY-MM-DD`. Fill this in to override the quick pick. |
| `endDate` | string | empty | Last day to collect, written as `YYYY-MM-DD`. Leave empty and only the start date is collected. |

Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures. Dates outside that window are skipped and reported in the run log. Very large requests are bounded by a ten-minute collection budget — if it is reached, the run finishes with everything gathered up to that point and says so in the run log.

#### Filters (optional)

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `countries` | array | `[]` | Keep only matches from these countries, for example England, Spain, Brazil. Not case sensitive, partial names work. Empty keeps every country. |
| `leagues` | array | `[]` | Keep only these competitions, for example Premier League, Serie A, Champions League, MLS. Not case sensitive, partial names work. |
| `minProbability` | integer | empty | Keep only matches where the most likely outcome for the **first** market in `predictionMarkets` is at least this confident — enter `60` for 60%. The run log names the market in use. Matches with no probability figure at all are kept. |

#### Results

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | The most matches to return in total, counted after filters. Matches are ordered by kick-off time, so you get the earliest first; fixtures without a confirmed kick-off time come last within their day. Set to `0` for no limit. |

### Output

One flat row per match. Markets you selected but which Forebet has no figures for on a given match come back as empty values, so a match is never silently dropped.

```json
{
    "matchId": 2417360,
    "matchName": "Racing Club vs Gimnasia La Plata",
    "homeTeam": "Racing Club",
    "awayTeam": "Gimnasia La Plata",
    "kickoffDate": "2026-07-25",
    "kickoffTime": "21:30",
    "kickoffDateTime": "2026-07-25T21:30:00",
    "country": "Argentina",
    "league": "Liga Profesional",
    "leagueShortTag": "Ar1",
    "leagueLogoUrl": "https://www.forebet.com/images/fc/13.png",
    "venue": "Estadio Presidente Juan Domingo Perón",
    "matchUrl": "https://www.forebet.com/en/football/matches/racing-club-gimnasia-la-plata-2417360",
    "matchScope": "byDate",
    "probabilityHome": 52,
    "probabilityDraw": 27,
    "probabilityAway": 21,
    "prediction": "1",
    "predictedScore": "2 - 1",
    "predictedGoalsAverage": 2.61,
    "oddsHome": 1.8,
    "oddsDraw": 3.2,
    "oddsAway": 5.25,
    "bestOdd": 1.8,
    "oddsMovementHome": "down",
    "oddsMovementDraw": null,
    "oddsMovementAway": "up",
    "liveOddsHome": 1.72,
    "liveOddsDraw": 3.4,
    "liveOddsAway": 5.5,
    "underOver25Prediction": "Over",
    "probabilityUnder25": 44,
    "probabilityOver25": 56,
    "oddsUnder25": 1.95,
    "oddsOver25": 1.85,
    "bttsPrediction": "Yes",
    "probabilityBttsYes": 58,
    "probabilityBttsNo": 42,
    "oddsBttsYes": 1.72,
    "oddsBttsNo": 2.05,
    "halfTimePrediction": "X",
    "probabilityHalfTimeHome": 35,
    "probabilityHalfTimeDraw": 43,
    "probabilityHalfTimeAway": 22,
    "halfTimeFullTimePrediction": "X/1",
    "probabilityHalfTimeFullTime": 21,
    "doubleChancePrediction": "1X",
    "probabilityDoubleChance": 79,
    "asianHandicapPrediction": "Home 0",
    "probabilityAsianHandicap": 61,
    "cornersPrediction": "Under",
    "probabilityCornersUnder95": 54,
    "probabilityCornersOver95": 46,
    "predictedCornersAverage": 9.04,
    "predictedCornersScore": "5 - 4",
    "actualCorners": "6 - 3",
    "cornersPredictionCorrect": false,
    "cornersScoreHit": false,
    "cornersAverageCorrect": true,
    "cardsPrediction": "Over",
    "probabilityCardsUnder": 31,
    "probabilityCardsOver": 69,
    "predictedCardsAverage": 6.06,
    "predictedCardsScore": "3 - 3",
    "actualCards": "4 - 2",
    "cardsPredictionCorrect": true,
    "cardsScoreHit": false,
    "cardsAverageCorrect": true,
    "topGoalscorers": [
        { "name": "Adrián Martínez", "probability": 34 },
        { "name": "Maximiliano Salas", "probability": 22 },
        { "name": "Gabriel Rojas", "probability": 13 }
    ],
    "matchStatus": "finished",
    "isFinished": true,
    "liveMinute": null,
    "finalScore": "2 - 1",
    "halfTimeScore": "0 - 0",
    "homeGoals": 2,
    "awayGoals": 1,
    "accuracyMarket": "match1x2",
    "predictionCorrect": true,
    "correctScoreHit": true,
    "goalsAverageCorrect": true,
    "homeTeamForm": "WWDLWW",
    "awayTeamForm": "LDLWDL",
    "homeTeamPosition": "3rd",
    "awayTeamPosition": "10th",
    "trendNote": "Racing Club are undefeated in 8 of their last 9 Liga Profesional matches.",
    "weatherTemperatureC": 14,
    "weatherCondition": "Partly cloudy",
    "previewUrl": "https://www.forebet.com/en/football-match-previews/28912-gimnasia-la-plata-eye-another-win-at-racing-club",
    "scrapedAt": "2026-07-25T09:14:02.184Z"
}
```

#### Match Identity

| Field | Type | Description |
|-------|------|-------------|
| `matchId` | integer | Forebet's numeric match id — a stable key for joins and deduplication |
| `matchName` | string | `"Home vs Away"` |
| `homeTeam` | string | Home team name |
| `awayTeam` | string | Away team name |
| `kickoffDate` | string | Kick-off date, `YYYY-MM-DD` |
| `kickoffTime` | string | Kick-off time, `HH:MM`, as published by Forebet in Central European Time. `00:00` means Forebet has not confirmed a time for the fixture yet. Empty on dates already played |
| `kickoffDateTime` | string | Combined ISO-8601 kick-off timestamp, in Forebet's own Central European Time |
| `country` | string | Country. Empty for continental competitions such as the Champions League |
| `league` | string | Competition name, e.g. `Liga Profesional` |
| `leagueShortTag` | string | Forebet's short competition code, e.g. `Ar1` |
| `leagueLogoUrl` | string | Country flag or competition badge image |
| `venue` | string | Stadium name |
| `matchUrl` | string | Link to the match page on Forebet |
| `matchScope` | string | Which list the row came from: `byDate`, `valueBets`, `topTips` or `liveNow` |
| `scrapedAt` | string | ISO-8601 timestamp of collection |

#### Match Result (1X2) & Odds

| Field | Type | Description |
|-------|------|-------------|
| `probabilityHome` | integer | Home win probability, % |
| `probabilityDraw` | integer | Draw probability, % |
| `probabilityAway` | integer | Away win probability, % |
| `prediction` | string | The tip: `1`, `X` or `2` |
| `predictedScore` | string | Predicted correct score, e.g. `2 - 1` |
| `predictedGoalsAverage` | number | Predicted average total goals, e.g. `2.61` |
| `oddsHome` | number | Bookmaker odds on the home win |
| `oddsDraw` | number | Bookmaker odds on the draw |
| `oddsAway` | number | Bookmaker odds on the away win |
| `bestOdd` | number | The highlighted coefficient for the predicted outcome |
| `oddsMovementHome` | string | `up`, `down`, or empty when the price is steady |
| `oddsMovementDraw` | string | Price movement on the draw |
| `oddsMovementAway` | string | Price movement on the away win |
| `liveOddsHome` | number | In-play home price, where shown |
| `liveOddsDraw` | number | In-play draw price, where shown |
| `liveOddsAway` | number | In-play away price, where shown |

#### Goals & Both Teams To Score

| Field | Type | Description |
|-------|------|-------------|
| `underOver25Prediction` | string | `Under` or `Over` 2.5 goals |
| `probabilityUnder25` | integer | Under 2.5 goals probability, % |
| `probabilityOver25` | integer | Over 2.5 goals probability, % |
| `oddsUnder25` | number | Odds on under 2.5 goals |
| `oddsOver25` | number | Odds on over 2.5 goals |
| `bttsPrediction` | string | Both teams to score: `Yes` or `No` |
| `probabilityBttsYes` | integer | Both-teams-to-score probability, % |
| `probabilityBttsNo` | integer | Probability that one side fails to score, % |
| `oddsBttsYes` | number | Odds on both teams scoring |
| `oddsBttsNo` | number | Odds on both teams not scoring |

#### Half-Time, Double Chance & Handicap

| Field | Type | Description |
|-------|------|-------------|
| `halfTimePrediction` | string | Half-time result tip: `1`, `X` or `2` |
| `probabilityHalfTimeHome` | integer | Home leading at half-time, % |
| `probabilityHalfTimeDraw` | integer | Level at half-time, % |
| `probabilityHalfTimeAway` | integer | Away leading at half-time, % |
| `halfTimeFullTimePrediction` | string | Half-time/full-time combination, e.g. `X/1` |
| `probabilityHalfTimeFullTime` | integer | Probability of that combination, % |
| `doubleChancePrediction` | string | `1X`, `12` or `2X` |
| `probabilityDoubleChance` | integer | Probability of the double chance, % |
| `asianHandicapPrediction` | string | Side and line, e.g. `Home 0` |
| `probabilityAsianHandicap` | integer | Probability of the handicap pick, % |

#### Corners, Cards & Goalscorers

| Field | Type | Description |
|-------|------|-------------|
| `cornersPrediction` | string | `Under` or `Over` 9.5 corners |
| `probabilityCornersUnder95` | integer | Under 9.5 corners probability, % |
| `probabilityCornersOver95` | integer | Over 9.5 corners probability, % |
| `predictedCornersAverage` | number | Predicted total corners, e.g. `9.04` |
| `predictedCornersScore` | string | Predicted home–away corner split, e.g. `5 - 4` |
| `actualCorners` | string | Corners actually taken, once the match is played |
| `cornersPredictionCorrect` | boolean | Whether the over/under 9.5 corners call won. Empty until the match is resolved |
| `cornersScoreHit` | boolean | Whether the exact predicted corner split landed |
| `cornersAverageCorrect` | boolean | Whether the predicted corner total fell on the right side of 9.5 |
| `cardsPrediction` | string | `Under` or `Over` on the card line |
| `probabilityCardsUnder` | integer | Under-the-line probability, % |
| `probabilityCardsOver` | integer | Over-the-line probability, % |
| `predictedCardsAverage` | number | Predicted total cards, e.g. `6.06` |
| `predictedCardsScore` | string | Predicted home–away card split |
| `actualCards` | string | Cards actually shown, once the match is played |
| `cardsPredictionCorrect` | boolean | Whether the card over/under call won. Empty until the match is resolved |
| `cardsScoreHit` | boolean | Whether the exact predicted card split landed |
| `cardsAverageCorrect` | boolean | Whether the predicted card total fell on the right side of the line |
| `topGoalscorers` | array | Up to three players, each with `name` and `probability` (%) |

#### Result & Accuracy

| Field | Type | Description |
|-------|------|-------------|
| `matchStatus` | string | `scheduled`, `live`, `finished`, `postponed`, `cancelled` or `awarded` |
| `isFinished` | boolean | Whether the match has been played |
| `liveMinute` | string | Current minute for matches in play |
| `finalScore` | string | Full-time score, e.g. `2 - 1` |
| `halfTimeScore` | string | Half-time score, e.g. `0 - 0` |
| `homeGoals` | integer | Home goals at full time |
| `awayGoals` | integer | Away goals at full time |
| `accuracyMarket` | string | Which market's tip the three flags below score, e.g. `match1x2` or `underOver25`. It is the first goal market you picked. Corner and card calls are scored in their own fields instead |
| `predictionCorrect` | boolean | Whether the `accuracyMarket` tip won. Empty until the match is resolved |
| `correctScoreHit` | boolean | Whether the exact predicted goal scoreline landed |
| `goalsAverageCorrect` | boolean | Whether the goal-average call fell on the right side of 2.5 |

#### Team Context & Extras

| Field | Type | Description |
|-------|------|-------------|
| `homeTeamForm` | string | Home team's last six results, e.g. `WWDLWW` |
| `awayTeamForm` | string | Away team's last six results |
| `homeTeamPosition` | string | Home team's league position, e.g. `3rd` |
| `awayTeamPosition` | string | Away team's league position |
| `trendNote` | string | Forebet's plain-English trend sentence for the fixture |
| `weatherTemperatureC` | integer | Forecast temperature at kick-off, always in °C. Empty when Forebet does not publish enough of the day's forecast to read the unit reliably |
| `weatherCondition` | string | Forecast condition, e.g. `Partly cloudy` |
| `previewUrl` | string | Link to Forebet's match-preview article, where one exists |
| `valuePercent` | integer | Kelly-criterion value edge, %. Present on value-bet rows |

### Tips for Best Results

- **Add Corners or Cards when you want the whole day.** Corners, cards and likely goalscorers publish Forebet's full daily fixture list — over 300 matches on a busy Saturday — while the other seven markets publish Forebet's top ~44 fixtures per day. Pick `corners` alongside `match1x2` and you get every match, with the 1X2 columns filled in for Forebet's featured selection.
- **Use a past date to backtest before you trust a tip.** `dateRange: "yesterday"` or any past `startDate` returns final scores, half-time scores and the three accuracy flags together — the quickest way to measure the real hit rate for the leagues you follow.
- **Put the market you care about first.** The order of `predictionMarkets` is honoured exactly as you set it: the first entry is the market the `minProbability` floor is measured against and the one the accuracy flags score, so lead with `match1x2` for a 1X2 confidence filter or with `corners` for a corners one. The `accuracyMarket` field on every row confirms which market was used.
- **Filter by country or competition rather than downloading everything.** A full day arrives in one go, so `countries` and `leagues` cut the rows you are billed for. Keep `maxResults` set as a safety net — a busy Saturday can carry well over 300 fixtures.
- **Continental competitions carry no country.** Champions League, Europa League and Copa Libertadores fixtures have an empty `country`, so a country filter excludes them. Use `leagues` for those instead.
- **Form, league position and trend notes come from upcoming 1X2 pages.** Include `match1x2` with a future date if you want `homeTeamForm`, `homeTeamPosition` and `trendNote` populated — Forebet does not print them on its value-bet list.
- **Kick-off times are Forebet's own, in Central European Time.** A `00:00` kick-off means Forebet has not confirmed a time for that fixture yet rather than a midnight start, so treat those as date-only when you sort or schedule around them.
- **`liveNow` gives you the minute, not the live score.** Use it to see which fixtures are in play and what was predicted for them, then re-run for the same date afterwards to pick up final scores and accuracy flags.

### Pricing

**From $0.10 per 1,000 results** — one flat rate that covers all ten prediction markets, the full date window, bookmaker odds, value bets and accuracy flags. Bronze, Silver and Gold subscribers pay progressively less; the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.012 | $0.0115 | $0.0105 | $0.010 |
| 1,000 | $0.12 | $0.115 | $0.105 | $0.10 |
| 10,000 | $1.20 | $1.15 | $1.05 | $1.00 |
| 100,000 | $12.00 | $11.50 | $10.50 | $10.00 |

A "result" is one match row in the output dataset. Adding more prediction markets makes each row wider, never adds rows, so a ten-market run costs exactly the same as a one-market run. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available football prediction and fixture data for research, analysis, and content purposes. Predictions are statistical estimates, not guarantees — nothing here is betting advice, and you are responsible for gambling responsibly and legally in your jurisdiction. Users must comply with applicable laws and Forebet's Terms of Service, and with the advertising and age restrictions that apply to betting-related content wherever it is published.

# Actor input Schema

## `matchScope` (type: `string`):

Choose the set of matches to collect. 'Matches on chosen dates' is the normal option and uses the date settings below. The other three are Forebet's own curated lists — Forebet publishes each of them as a single ready-made page, so for those three both the date settings AND the prediction-market choice are ignored, and you always get Forebet's match-result (1X2) columns for whatever it is featuring right now.

## `predictionMarkets` (type: `array`):

Markets to merge onto each match row. Each market you pick is one page load per date; picking more markets makes each row wider, not the result list longer. The ORDER matters: the first market you pick is the one the 'Minimum confidence' filter is measured against, and the one the accuracy flags describe (the row also tells you which, in 'accuracyMarket'). Coverage differs by market: Corners, Cards and Likely goalscorers publish Forebet's full daily fixture list (300+ on a busy Saturday), while 1X2, Under/Over 2.5, Both teams to score, Half-time, HT/FT, Double chance and Asian handicap publish only Forebet's top ~44 fixtures per day. If you pick only markets from that second group you will get up to ~44 matches per date. Add Corners or Cards for full daily coverage — matches outside Forebet's top ~44 will simply have the other markets' fields empty. Very large requests (many dates x many markets) are bounded by a ten-minute collection budget: if it is reached the run finishes early with everything collected up to that point and says so in the run log. Ignored when 'Which matches' is set to one of Forebet's curated lists.

## `dateRange` (type: `string`):

A quick pick for the days you want. 'Yesterday' and past dates come back with the final score and a flag showing whether Forebet's prediction was right, which is what you want for testing a strategy. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log. Ignored unless 'Which matches' is set to 'Matches on chosen dates'.

## `startDate` (type: `string`):

First day to collect, written as YYYY-MM-DD, for example 2026-08-01. Fill this in to override the quick pick above. Leave empty to use the quick pick. Kick-off times are published in Forebet's own Central European timezone, and 00:00 means Forebet has not confirmed a kick-off time for that fixture yet. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log.

## `endDate` (type: `string`):

Last day to collect, written as YYYY-MM-DD. Leave empty and only the start date is collected. Every day in the range is fetched, so a long range means a long run — a week is a comfortable maximum. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log. Ranges longer than 120 days are shortened to 120 days from the start date, and collection stops after a ten-minute budget: if that is reached the run finishes early with everything collected up to that point and says so in the run log.

## `countries` (type: `array`):

Keep only matches from these countries, for example England, Spain, Brazil, Germany. Not case sensitive and partial names work. Leave empty to keep every country. Note that continental competitions such as the Champions League or Copa Libertadores have no country on Forebet, so setting a country filter excludes them. Forebet serves a whole day in one go, so this filter cuts down the results you are charged for rather than making the run slower.

## `leagues` (type: `array`):

Keep only matches from these competitions, for example Premier League, La Liga, Serie A, Champions League, MLS. Not case sensitive and partial names work. Leave empty to keep every competition.

## `minProbability` (type: `integer`):

Only keep matches where Forebet's most likely outcome for the FIRST market in 'Prediction markets' is at least this confident — enter 60 for 60%. Reorder that list to measure the confidence against a different market; the run log names the one in use. If a match has no figure for that market, the best confidence available for it is used instead, and matches with no probability figure at all (a likely-goalscorers-only run publishes none) are kept rather than dropped. Leave empty to keep every match.

## `maxResults` (type: `integer`):

The most matches to return in total, counted after any filters. Matches are ordered by kick-off time, so you get the earliest ones first; fixtures Forebet has not yet given a kick-off time to (shown as 00:00, or with no time at all) come last within their day. A busy Saturday can carry well over 300 fixtures across all competitions worldwide, so this is your safety net. Leave empty for the default of 100, or set 0 for no limit.

## Actor input object example

```json
{
  "matchScope": "byDate",
  "predictionMarkets": [
    "match1x2",
    "underOver25",
    "bothTeamsToScore"
  ],
  "dateRange": "today",
  "countries": [],
  "leagues": [],
  "maxResults": 100
}
```

# Actor output Schema

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

Every match collected in this run, with kick-off, competition, the headline 1X2 prediction and the result.

## `matchResult` (type: `string`):

Home, draw and away win probabilities, the predicted outcome, predicted correct score, average goals and bookmaker odds.

## `goalMarkets` (type: `string`):

Over / under 2.5 goals and both-teams-to-score probabilities and predictions, with predicted average goals.

## `halfTimeMarkets` (type: `string`):

Half-time result, half-time/full-time combination, double chance and Asian handicap predictions.

## `cornersAndCards` (type: `string`):

Predicted corner and card totals with over / under probabilities, whether those corner and card calls proved right once the match was played, plus the three players most likely to score.

## `results` (type: `string`):

Finished matches with final and half-time scores, and flags showing whether Forebet's tip won, whether the exact predicted scoreline landed, and whether the predicted goal average fell on the right side of 2.5. These three describe the goal markets only — 'accuracyMarket' names which one — while the corner and card verdicts have their own columns. Each flag is left empty until the match is resolved.

# 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 = {
    "matchScope": "byDate",
    "predictionMarkets": [
        "match1x2",
        "underOver25",
        "bothTeamsToScore"
    ],
    "dateRange": "today",
    "countries": [],
    "leagues": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/forebet-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 = {
    "matchScope": "byDate",
    "predictionMarkets": [
        "match1x2",
        "underOver25",
        "bothTeamsToScore",
    ],
    "dateRange": "today",
    "countries": [],
    "leagues": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/forebet-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "matchScope": "byDate",
  "predictionMarkets": [
    "match1x2",
    "underOver25",
    "bothTeamsToScore"
  ],
  "dateRange": "today",
  "countries": [],
  "leagues": [],
  "maxResults": 100
}' |
apify call solidcode/forebet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/forebet-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Forebet Football Predictions Scraper",
        "description": "[💰 $0.1 / 1K] Extract Forebet football predictions for any date — 1X2 probabilities, correct score, over/under 2.5, both teams to score, half-time, HT/FT, double chance, Asian handicap, corners, cards and goalscorers, plus value bets and results.",
        "version": "1.0",
        "x-build-id": "nxp7pyWlunLeP3YGd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~forebet-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-forebet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~forebet-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-forebet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~forebet-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-forebet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "matchScope": {
                        "title": "Which matches",
                        "enum": [
                            "byDate",
                            "valueBets",
                            "topTips",
                            "liveNow"
                        ],
                        "type": "string",
                        "description": "Choose the set of matches to collect. 'Matches on chosen dates' is the normal option and uses the date settings below. The other three are Forebet's own curated lists — Forebet publishes each of them as a single ready-made page, so for those three both the date settings AND the prediction-market choice are ignored, and you always get Forebet's match-result (1X2) columns for whatever it is featuring right now."
                    },
                    "predictionMarkets": {
                        "title": "Prediction markets",
                        "type": "array",
                        "description": "Markets to merge onto each match row. Each market you pick is one page load per date; picking more markets makes each row wider, not the result list longer. The ORDER matters: the first market you pick is the one the 'Minimum confidence' filter is measured against, and the one the accuracy flags describe (the row also tells you which, in 'accuracyMarket'). Coverage differs by market: Corners, Cards and Likely goalscorers publish Forebet's full daily fixture list (300+ on a busy Saturday), while 1X2, Under/Over 2.5, Both teams to score, Half-time, HT/FT, Double chance and Asian handicap publish only Forebet's top ~44 fixtures per day. If you pick only markets from that second group you will get up to ~44 matches per date. Add Corners or Cards for full daily coverage — matches outside Forebet's top ~44 will simply have the other markets' fields empty. Very large requests (many dates x many markets) are bounded by a ten-minute collection budget: if it is reached the run finishes early with everything collected up to that point and says so in the run log. Ignored when 'Which matches' is set to one of Forebet's curated lists.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "match1x2",
                                "underOver25",
                                "bothTeamsToScore",
                                "halfTime",
                                "halfTimeFullTime",
                                "doubleChance",
                                "asianHandicap",
                                "corners",
                                "cards",
                                "goalscorers"
                            ],
                            "enumTitles": [
                                "Match result 1X2 — home / draw / away probabilities",
                                "Over / under 2.5 goals",
                                "Both teams to score",
                                "Half-time result",
                                "Half-time / full-time combination",
                                "Double chance (1X, 12, 2X)",
                                "Asian handicap",
                                "Corners — predicted total and over / under 9.5",
                                "Cards — predicted total and over / under",
                                "Likely goalscorers — top 3 players with probabilities"
                            ]
                        }
                    },
                    "dateRange": {
                        "title": "Dates",
                        "enum": [
                            "today",
                            "tomorrow",
                            "todayAndTomorrow",
                            "weekend",
                            "yesterday",
                            "next3Days",
                            "next7Days"
                        ],
                        "type": "string",
                        "description": "A quick pick for the days you want. 'Yesterday' and past dates come back with the final score and a flag showing whether Forebet's prediction was right, which is what you want for testing a strategy. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log. Ignored unless 'Which matches' is set to 'Matches on chosen dates'."
                    },
                    "startDate": {
                        "title": "Start date",
                        "type": "string",
                        "description": "First day to collect, written as YYYY-MM-DD, for example 2026-08-01. Fill this in to override the quick pick above. Leave empty to use the quick pick. Kick-off times are published in Forebet's own Central European timezone, and 00:00 means Forebet has not confirmed a kick-off time for that fixture yet. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log."
                    },
                    "endDate": {
                        "title": "End date",
                        "type": "string",
                        "description": "Last day to collect, written as YYYY-MM-DD. Leave empty and only the start date is collected. Every day in the range is fetched, so a long range means a long run — a week is a comfortable maximum. Forebet publishes roughly 29 days of history and 15 days of upcoming fixtures — dates outside that window are skipped and reported in the run log. Ranges longer than 120 days are shortened to 120 days from the start date, and collection stops after a ten-minute budget: if that is reached the run finishes early with everything collected up to that point and says so in the run log."
                    },
                    "countries": {
                        "title": "Countries",
                        "type": "array",
                        "description": "Keep only matches from these countries, for example England, Spain, Brazil, Germany. Not case sensitive and partial names work. Leave empty to keep every country. Note that continental competitions such as the Champions League or Copa Libertadores have no country on Forebet, so setting a country filter excludes them. Forebet serves a whole day in one go, so this filter cuts down the results you are charged for rather than making the run slower.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "leagues": {
                        "title": "Leagues and competitions",
                        "type": "array",
                        "description": "Keep only matches from these competitions, for example Premier League, La Liga, Serie A, Champions League, MLS. Not case sensitive and partial names work. Leave empty to keep every competition.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minProbability": {
                        "title": "Minimum confidence (%)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only keep matches where Forebet's most likely outcome for the FIRST market in 'Prediction markets' is at least this confident — enter 60 for 60%. Reorder that list to measure the confidence against a different market; the run log names the one in use. If a match has no figure for that market, the best confidence available for it is used instead, and matches with no probability figure at all (a likely-goalscorers-only run publishes none) are kept rather than dropped. Leave empty to keep every match."
                    },
                    "maxResults": {
                        "title": "Maximum matches",
                        "minimum": 0,
                        "type": "integer",
                        "description": "The most matches to return in total, counted after any filters. Matches are ordered by kick-off time, so you get the earliest ones first; fixtures Forebet has not yet given a kick-off time to (shown as 00:00, or with no time at all) come last within their day. A busy Saturday can carry well over 300 fixtures across all competitions worldwide, so this is your safety net. Leave empty for the default of 100, or set 0 for no limit."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
