# Football Odds Tracker (`arched_friend/football-odds-tracker`) Actor

Track football odds and fixtures across the Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, MLS and the European cups. Home, draw and away prices in decimal and American format, with opening lines, line movement and implied probability.

- **URL**: https://apify.com/arched\_friend/football-odds-tracker.md
- **Developed by:** [Peach O](https://apify.com/arched_friend) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 match returneds

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?

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

## Football Odds Tracker: Prices, Lines And Movement

**Match odds and fixtures for the major leagues, in one clean table.**

Get home, draw and away prices for every fixture, in decimal and American format, with the opening price, how far the line has moved since it opened, and the implied probability the bookmaker is pricing. Covers the Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, MLS, the Championship and the European cups.

Built for odds comparison sites, model builders, tipsters and anyone who needs football prices as data rather than as a web page.

### How it works

```mermaid
flowchart LR
    A[Leagues and dates] --> B[Pull each scoreboard]
    B --> C[Flatten fixture and market]
    C --> D[Convert to decimal odds]
    D --> E[Implied probability<br/>and line movement]
    E --> F{Filters<br/>team, odds band, odds only}
    F -->|keep| G[(Your odds table)]
    F -->|drop| H[Skipped]
```

Prices arrive in American format. The Actor converts them to decimal, works out the implied probability of each result, and compares the current price against the opening one so drift is visible without storing history yourself.

### What you get

One row per match. A real row from a Premier League run:

```json
{
  "match": "AFC Bournemouth at Newcastle United",
  "league": "English Premier League",
  "kickoffAt": "2026-09-05T11:30Z",
  "venue": "St. James' Park",
  "statusDetail": "51'",
  "homeTeam": "Newcastle United",
  "homeForm": "WWDLW",
  "awayTeam": "AFC Bournemouth",
  "awayForm": "DLDDW",
  "bookmaker": "DraftKings",
  "homeOddsDecimal": 6,
  "drawOddsDecimal": 3.5,
  "awayOddsDecimal": 1.67,
  "homeWinProbability": 16.7,
  "drawProbability": 28.6,
  "awayWinProbability": 59.9,
  "homeOddsOpen": "+130",
  "homeOddsMovement": 3.7,
  "spreadLine": "+0.5",
  "totalLine": "4.5",
  "overOdds": "-104"
}
```

`homeOddsMovement` is the change in decimal terms since the price opened. Positive means the price drifted out, negative means it shortened. The row above moved from 2.30 out to 6.00 because the home side went a goal down.

### Reading the numbers

The three implied probabilities sum to slightly more than 100 because the bookmaker's margin is baked into the price. Across a sample run the total sat at 105 percent on every match, which is the overround. Subtract it if you are comparing to your own model:

| Match | Home | Draw | Away | Sums to |
| --- | --- | --- | --- | --- |
| Sunderland at Brentford | 1.71 | 3.85 | 4.90 | 104.9% |
| Leeds United at Brighton | 2.05 | 3.55 | 3.60 | 104.8% |
| Crystal Palace at Fulham | 2.15 | 3.30 | 3.55 | 105.0% |

### Leagues

Use the short name, or any ESPN competition code:

`premier-league`, `championship`, `la-liga`, `bundesliga`, `serie-a`, `ligue-1`, `mls`, `champions-league`, `europa-league`, `eredivisie`, `primeira-liga`, `liga-mx`

### Example input

Today's prices across three leagues:

```json
{
  "leagues": ["premier-league", "la-liga", "mls"],
  "useTodayOnly": true,
  "onlyWithOdds": true
}
```

A week of upcoming fixtures, favourites only:

```json
{
  "leagues": ["premier-league"],
  "useTodayOnly": false,
  "fromDate": "2026-09-12",
  "days": 7,
  "includeCompleted": false,
  "maxHomeOdds": "1.6"
}
```

### Run it from the command line

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~football-odds-tracker/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"leagues":["premier-league"],"useTodayOnly":true,"onlyWithOdds":true}'
```

Fetch the results:

```bash
curl "https://api.apify.com/v2/acts/arched_friend~football-odds-tracker/runs/last/dataset/items?token=YOUR_TOKEN"
```

### Tracking movement over time

Schedule the Actor hourly and every run appends the current price with a timestamp, which gives you a price history you can chart. Turn on `onlyNewMatches` instead if you only want to hear about fixtures the first time they are listed.

### Pricing

Pay per match returned. Runs that return nothing cost nothing.

| | Football Odds Tracker | Commercial odds API | Copying by hand |
| --- | --- | --- | --- |
| Cost for 100 matches | $0.40 | $30 and up per month | Around 2 hours |
| Decimal and American odds | Both | Usually one | Both |
| Opening price and movement | Included | Often extra | No |
| Implied probability | Included | Rarely | Worked out by hand |
| Runs on a schedule | Yes | Yes | No |

Free tier included, so you can check the coverage for your league before spending anything.

### Notes and limits

- Odds come from the bookmaker ESPN lists for the competition, which is DraftKings on the leagues checked here. The `bookmaker` column always names the source.
- Fixtures far in the future are often listed before anyone prices them. Set `onlyWithOdds` to skip those.
- Current matchday mode follows each competition's own calendar, which handles matches that kick off either side of midnight UTC better than a single calendar date.
- Scores appear once a match is under way, so a finished fixture carries both the closing prices and the result.

### Related products

- **Brand Mention Monitor** to track how the press is covering a club or a fixture.
- **Google Play Review Tracker** and **App Store Review Tracker** if you run a betting or fantasy app and want to hear what users are saying.

# Actor input Schema

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

Which competitions to check, one per line. Use premier-league, championship, la-liga, bundesliga, serie-a, ligue-1, mls, champions-league, europa-league, eredivisie, primeira-liga or liga-mx. An ESPN code such as ned.1 also works.

## `useTodayOnly` (type: `boolean`):

Follow each competition's own current matchday. Leave this on for a daily odds run. Turn it off to ask for specific dates instead.

## `fromDate` (type: `string`):

First date to check, such as 2026-09-05. Setting this overrides the current matchday option.

## `days` (type: `integer`):

How many days from the start date to include, up to 30.

## `onlyWithOdds` (type: `boolean`):

Drop fixtures that have no price published yet, which is common for matches far in the future.

## `includeCompleted` (type: `boolean`):

Keep matches that have already been played, with their final score and closing prices.

## `team` (type: `string`):

Keep only matches involving a team whose name or abbreviation contains this text, for example arsenal.

## `minHomeOdds` (type: `string`):

Keep only matches where the home decimal price is at least this, for example 2.0. Leave blank for no limit.

## `maxHomeOdds` (type: `string`):

Keep only matches where the home decimal price is at most this, for example 1.5 to find heavy favourites. Leave blank for no limit.

## `onlyNewMatches` (type: `boolean`):

Remember every match id across runs and return only newly listed fixtures. Turn this on for scheduled monitoring.

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

Recommended when checking many leagues and dates in one run.

## Actor input object example

```json
{
  "leagues": [
    "premier-league"
  ],
  "useTodayOnly": true,
  "days": 1,
  "onlyWithOdds": false,
  "includeCompleted": true,
  "onlyNewMatches": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `matches` (type: `string`):

One row per match, with kickoff, team form, home, draw and away prices, opening lines, movement and implied probability.

## `runSummary` (type: `string`):

Fixtures per league, how many carry odds, which bookmaker priced them and how many lines moved.

# 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 = {
    "leagues": [
        "premier-league"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/football-odds-tracker").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 = { "leagues": ["premier-league"] }

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/football-odds-tracker").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 '{
  "leagues": [
    "premier-league"
  ]
}' |
apify call arched_friend/football-odds-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arched_friend/football-odds-tracker"
        }
    }
}

```

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/61uRYBff38W1VbSgl/builds/ColYywET17YDBAj8s/openapi.json
