# AI Consensus vs Market: Multi-Model Win Probability Check (`mrdoe/multi-model-consensus-market-check`) Actor

Several independent AI models estimate each match's win probabilities blind, without seeing the odds. Get the consensus, how much the models disagree, and where the consensus differs from the market's no-vig fair probabilities.

- **URL**: https://apify.com/mrdoe/multi-model-consensus-market-check.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

![AI Consensus vs Market: Multi-Model Win Probability Check - Ask several AI models for win probabilities without showing them the odds, then see where they disagree with each other and with the market.](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/multi-model-consensus-market-check--hero.png)

### What does AI Consensus vs Market: Multi-Model Win Probability Check do?

AI Consensus vs Market runs several independent AI models on each match and compares their answers with the betting market. For every game it builds a fact sheet from your data (injuries, standings and notes) without the odds, asks each model for home, draw and away probabilities, and returns the consensus, how far apart the models were, and the difference between the consensus and the market's no-vig fair probabilities. Flags mark matches where the models disagree with each other or with the market.

### Why use AI Consensus vs Market: Multi-Model Win Probability Check?

- Models never see the odds, so estimates are independent of the market.
- Several models, so one model's quirk does not decide the result.
- Disagreement flag shows where the estimate is unreliable.
- Market gap flag shows where the consensus differs from fair odds.
- Uses the datasets you already collect.

### What makes this different

A single AI opinion is easy to over-trust. This Actor asks several models blind to the market, reports how much they disagree, and compares the consensus with no-vig fair odds, so a disagreement is a prompt to look closer rather than a bet signal.

### How it works

![AI Consensus vs Market: Multi-Model Win Probability Check workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/multi-model-consensus-market-check--how-it-works.png)

1. **Your input** — pick the odds dataset and optional injuries and standings datasets.
2. **The Actor collects it** — the Actor builds a fact sheet for each game and asks several models blind to the odds.
3. **Your output** — you get the consensus, the model spread and the gap versus the market.

### What data can you extract?

The dataset has 12 fields per row:

| Field | Type | Description |
|---|---|---|
| `id` | string | Match id. |
| `event` | object | Home, away, sport, league and start time. |
| `market` | object | Market's fair probabilities. |
| `modelsAnswered` | number | Models that answered. |
| `consensus` | object | Average probabilities across models. |
| `modelSpread` | number | Widest gap between models. |
| `modelsDisagree` | boolean | Models differ above the threshold. |
| `edgesVsMarket` | object | Consensus minus market per outcome. |
| `marketDisagrees` | boolean | Consensus differs from the market above the threshold. |
| `estimates` | array | Each model's probabilities and one-line reasoning. |
| `analysisStatus` | string | ok or unavailable. |
| `demo` | boolean | True for the built-in sample. |

### How to use AI Consensus vs Market: Multi-Model Win Probability Check

![AI Consensus vs Market: Multi-Model Win Probability Check input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/multi-model-consensus-market-check--input.png)

1. Open the Actor and go to the **Input** tab.
2. Pick an **Odds dataset** (and optional **Injuries** and **Standings**), or paste **Matches** as JSON, set the thresholds if you want, and press Start. With no input it checks a sample.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `matches` | array | No | `[]` | Matches to check, as JSON, each with home and away and optional sport, league, startTime, id and notes. Leave empty to check the games found in the odds datasets, or leave everything empty to try a built-in sample. |
| `oddsDataset1` | string | No | — | Odds dataset (Pinnacle, FanDuel, DraftKings, MelBet, 22Bet or 1xBet): the market's fair probabilities to compare with, and the list of games. |
| `oddsDataset2` | string | No | — | Another dataset of the same kind. |
| `injuriesDataset` | string | No | — | A dataset from the Sports Injury Report Tracker (or any dataset with team, player, status). |
| `standingsDataset` | string | No | — | A dataset from the League Standings Actor (or any dataset with team, rank, record, points). |
| `modelDisagreement` | number | No | `0.15` | Flag a match when the models differ by at least this probability on any outcome. |
| `marketDisagreement` | number | No | `0.08` | Flag a match when the models' consensus differs from the market's fair probability by at least this much. |
| `maxStartDiffHours` | number | No | `12` | Odds listings count as the same match when start times are within this many hours. |
| `openRouterApiKey` | string | No | — | Optional key for the analysis service. Leave empty to use the built-in service. |
| `maxResults` | integer | No | `5` | Maximum number of matches returned. Default is 5 for a quick test; set 0 to return everything available. |

### Output Data

![AI Consensus vs Market: Multi-Model Win Probability Check dataset table](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/multi-model-consensus-market-check--output.png)

`consensus` averages the models that answered (`modelsAnswered`); `modelSpread` is the widest gap between models on any outcome, flagged in `modelsDisagree`. `edgesVsMarket` is consensus minus the market's fair probability per outcome, flagged in `marketDisagrees` when it passes the threshold. Model names are not shown. `analysisStatus` is `unavailable` when no model answered.

![AI Consensus vs Market: Multi-Model Win Probability Check field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/multi-model-consensus-market-check--fields.png)

A real dataset item:

```json
{
  "id": "demo-1",
  "event": {
    "home": "Arsenal",
    "away": "Chelsea",
    "sport": "Soccer",
    "league": "Premier League",
    "startTime": "2030-01-02T15:00:00Z"
  },
  "market": {
    "bookmakers": 2,
    "fairProbabilities": {
      "home": 0.448,
      "draw": 0.284,
      "away": 0.268
    }
  },
  "modelsAnswered": 4,
  "consensus": {
    "home": 0.495,
    "draw": 0.263,
    "away": 0.243
  },
  "modelSpread": 0.1,
  "modelsDisagree": false,
  "edgesVsMarket": {
    "home": 0.047,
    "draw": -0.021,
    "away": -0.025
  },
  "marketDisagrees": false,
  "estimates": [
    {
      "model": "model-1",
      "probabilities": {
        "home": 0.55,
        "draw": 0.25,
        "away": 0.2
      },
      "reasoning": "Arsenal's top form, home advantage, and Chelsea's fatigue and defensive injury make a home win most likely, though a draw remains plausible."
    },
    {
      "model": "model-2",
      "probabilities": {
        "home": 0.45,
        "draw": 0.25,
        "away": 0.3
      },
      "reasoning": "Arsenal's home advantage and better form, Chelsea's busy schedule and recent dip in form."
    },
    {
      "model": "model-3",
      "probabilities": {
        "home": 0.48,
        "draw": 0.3,
        "away": 0.22
      },
      "reasoning": "Arsenal lead the Premier League with a strong home record and only a doubtful starter, while Chelsea are fatigued from a congested schedule and missing a key defender."
    },
    {
      "model": "model-4",
      "probabilities": {
        "home": 0.5,
        "draw": 0.25,
        "away": 0.25
      },
      "reasoning": "Arsenal's top form, home advantage, and Chelsea's fatigue plus Reece James absence favor a home win, though Chelsea's quality keeps a draw or upset plausible."
    }
  ],
  "analysisStatus": "ok",
  "demo": true
}
```

### Usage Examples

#### Check every game in an odds dataset

```json
{
  "maxResults": 0
}
```

#### Stricter market flag

```json
{
  "marketDisagreement": 0.05,
  "maxResults": 0
}
```

#### Try the sample

```json
{}
```

### Tips for Best Results

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

### Known Limitations

- Models only know the facts you provide; they are not a substitute for a real forecasting model.
- Some models can be busy, so a match may have fewer answers; check `modelsAnswered`.
- Estimates are not betting advice; a gap versus the market is a reason to investigate, not a signal.
- Only win, draw and loss probabilities are estimated.

### Integrations

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

### Export Formats

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

### Frequently Asked Questions

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

No. The Actor only needs the datasets or matches you provide.

#### Am I charged for failed results?

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

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

No. The Actor only needs the datasets or matches you provide.

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

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

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

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

### Support

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

### Legal / Responsible Use

You are responsible for how you use these results. They are automated estimates from the data you provide, not betting advice or a prediction guarantee. This Actor does not place bets. Gambling is age-restricted; if you or someone you know has a problem, seek support such as BeGambleAware or 1-800-GAMBLER.

# Actor input Schema

## `matches` (type: `array`):

Matches to check, as JSON, each with home and away and optional sport, league, startTime, id and notes. Leave empty to check the games found in the odds datasets, or leave everything empty to try a built-in sample.

## `oddsDataset1` (type: `string`):

Odds dataset (Pinnacle, FanDuel, DraftKings, MelBet, 22Bet or 1xBet): the market's fair probabilities to compare with, and the list of games.

## `oddsDataset2` (type: `string`):

Another dataset of the same kind.

## `injuriesDataset` (type: `string`):

A dataset from the Sports Injury Report Tracker (or any dataset with team, player, status).

## `standingsDataset` (type: `string`):

A dataset from the League Standings Actor (or any dataset with team, rank, record, points).

## `modelDisagreement` (type: `number`):

Flag a match when the models differ by at least this probability on any outcome.

## `marketDisagreement` (type: `number`):

Flag a match when the models' consensus differs from the market's fair probability by at least this much.

## `maxStartDiffHours` (type: `number`):

Odds listings count as the same match when start times are within this many hours.

## `openRouterApiKey` (type: `string`):

Optional key for the analysis service. Leave empty to use the built-in service.

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

Maximum number of matches returned. Default is 5 for a quick test; set 0 to return everything available.

## Actor input object example

```json
{
  "matches": [],
  "modelDisagreement": 0.15,
  "marketDisagreement": 0.08,
  "maxStartDiffHours": 12,
  "maxResults": 5
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/multi-model-consensus-market-check").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 = { "maxResults": 5 }

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/multi-model-consensus-market-check").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 '{
  "maxResults": 5
}' |
apify call mrdoe/multi-model-consensus-market-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/multi-model-consensus-market-check"
        }
    }
}
```

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/XXrEheItWogCg0FEn/builds/YIaNWVx0vcCZ92wRD/openapi.json
