Football Data API: Results, Closing Odds & Fixtures avatar

Football Data API: Results, Closing Odds & Fixtures

Pricing

from $2.00 / 1,000 match extracteds

Go to Apify Store
Football Data API: Results, Closing Odds & Fixtures

Football Data API: Results, Closing Odds & Fixtures

Football and soccer data API for 22 European leagues: results, match stats, closing odds from 9+ bookmakers, implied probabilities, line movement, Elo and form. Premier League, Ligue 1, LaLiga and Serie A, plus upcoming fixtures.

Pricing

from $2.00 / 1,000 match extracteds

Rating

0.0

(0)

Developer

Titouan MARTY

Titouan MARTY

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Football data API for 22 European leagues — football results, match statistics, closing odds from 9+ bookmakers, implied probabilities, bookmaker margin, line movement, Elo ratings and recent form, plus upcoming fixtures.

Built for data analysts, modellers, betting researchers, fantasy players and content teams who need a clean, stable, reproducible football dataset instead of a fragile screen-scraper. Works as a soccer data source for Python, JavaScript, R or any other language, and as a tool for AI agents over MCP.


Why this one is different: it cannot break the way scrapers do

Most football Actors scrape HTML. Football sites redesign, add anti-bot layers, and change their markup — and the Actor starts failing. Across the Apify Store, sports and news scrapers fail between 6% and 33% of the time, depending on the vertical.

This Actor does not parse a single web page. It downloads the machine-readable CSV files that football-data.co.uk publishes for direct download — a source that has been maintained continuously for over two decades. There are no CSS selectors to break, no browser to keep alive, no proxy to buy, and no anti-bot arms race. If the archive is up, this Actor works.

Every record carries its exact source URL, so any row can be traced back to the file it came from.


What you get

One dataset item per match:

GroupFields
IdentitymatchId (stable across runs), league, season, date, kickoff, home, away, status
Resultscore (home / away / H-D-A), halfTime
Statsshots, shots on target, corners, fouls, yellow and red cards — home and away
Oddsopening and closing prices per bookmaker (B365, Pinnacle, Betfair, William Hill, Betway, Interwetten, Max, Avg and more)
Marketbest available price per outcome, consensus implied probability, average bookmaker margin, margin-free fair price, line movement from opening to closing
Analyticspre-match Elo for both teams, home-win expectation, last-5 form and points
Provenanceprovider name and exact source URL

Nothing leaks the future. Elo ratings and form are always the value before kick-off, so a row never encodes the result it describes. That is what makes this dataset safe to backtest on.

A real row, unedited

{
"league": "F1",
"date": "2026-09-13",
"home": "Lille",
"away": "Troyes",
"status": "finished",
"score": { "home": 2, "away": 0, "result": "H" },
"market": {
"bestPrice": { "home": 1.53, "draw": 4.80, "away": 7.00 },
"bookmakerCount": 9,
"closingAvailable": true,
"impliedProbability": { "home": 0.6421, "draw": 0.2061, "away": 0.1518 },
"averageMargin": 0.0528,
"fairPrice": { "home": 1.557, "draw": 4.853, "away": 6.586 },
"lineMovement": { "B365.away": -1.5, "Avg.away": -1.34, "Max.away": -1.4 }
},
"elo": { "home": 1484.4, "away": 1519.4, "homeWinExpectation": 0.5429 },
"form": {
"home": { "last5": "DDLL", "pointsLast5": 2, "matchesPlayed": 4 },
"away": { "last5": "WWLW", "pointsLast5": 9, "matchesPlayed": 4 }
}
}

Nine bookmakers, a 5.3% average margin, and a clear away-side steam move from open to close — the kind of detail that normally takes a weekend of scraping to assemble.


Two sources, one shape

SourceContains
Per-season archivesEvery played match of the season, with full closing odds
Live fixtures feedThe upcoming matches (rolling window), with opening and closing odds

The per-season archives only contain matches that have already been played — so the fixtures feed is what gives you forward-looking rows. Both are normalised into the same record shape and returned together. Turn fixtures off with includeFixtures: false.


Monitor mode: schedule it and get told what moved

With mode: "changes", the Actor keeps a snapshot in a key-value store record and returns only matches that are new, or whose result changed since the previous run.

Run 1 -> 90 matches emitted (everything is new)
Run 2 -> 0 matches emitted (nothing moved — nothing billed)
Run 3 -> 1 match emitted (a fixture just finished)

That is the difference between a one-off export and a monitoring product. Pair it with a schedule to get a daily results-and-odds digest, and use stateKey to keep separate monitors (one per league set, for example).


Usage

Historical dataset for backtesting

{
"leagues": ["big-five-plus-second"],
"seasonsBack": 5,
"onlyFinished": true,
"withAnalytics": true,
"maxItems": 20000
}

Only French football

{ "leagues": ["france"], "seasonsBack": 2 }

Daily monitoring of one team

{
"leagues": ["big-five"],
"mode": "changes",
"teams": ["Marseille"],
"includeFixtures": true
}

Schedule it daily. Each run returns only what changed.

Upcoming fixtures with current prices

{ "leagues": ["all"], "includeFixtures": true, "onlyFinished": false }

Leagues

E0 E1 E2 E3 EC (England) · SC0 SC1 SC2 SC3 (Scotland) · D1 D2 (Germany) · I1 I2 (Italy) · SP1 SP2 (Spain) · F1 F2 (France) · N1 (Netherlands) · B1 (Belgium) · P1 (Portugal) · T1 (Turkey) · G1 (Greece)

Presets: big-five · big-five-plus-second · france · england · all


Use it from an AI agent

Every input field is typed and documented, so this Actor works as a tool out of the box. The common agent calls are:

You wantSet
One team's recent matchesteams: ["Marseille"], seasonsBack: 1
Today's fixtures and pricesincludeFixtures: true, onlyFinished: false, seasonsBack: 1
A backtest setleagues: ["big-five"], seasonsBack: 5, onlyFinished: true
Only what changed since yesterdaymode: "changes" + a daily schedule

Apify's MCP server exposes this Actor to Claude, Cursor, and other MCP clients automatically — no wrapper needed.


Reliability

This Actor was tested against live data before release, not just compiled:

  • 22 league-season files parsed, plus the live fixtures feed
  • opening and closing prices correctly separated across 113 source columns
  • Elo verified to start at 1500/1500 on matchday 1 (no result leakage)
  • monitoring mode verified idempotent: a second run with no new results emits zero rows and bills zero events

The source is a plain CSV over HTTPS, so there is no browser, no proxy, and no anti-bot layer between you and the data.


Pricing

Two pay-per-event events, so you control exactly what you pay for:

EventChargedCovers
match-extractedonce per match returnedthe full record: result, stats, odds, provenance
analytics-attachedonce per match, when withAnalytics is onElo, form, market read, line movement

Set withAnalytics: false to pay for raw data only. maxItems caps the total, and in changes mode you are only ever billed for matches that actually changed — a quiet day costs nothing.


Use cases

  • Backtesting a model on clean historical results with genuine closing odds
  • Closing-line value (CLV) analysis: compare the price you took against the closing consensus
  • Line-movement research: the market.lineMovement field records open-to-close drift per bookmaker
  • Content and editorial: auto-generate tables, form guides and match previews
  • Fantasy and tipping analysis based on Elo, form and margin-free fair prices
  • AI agents: the input schema is typed and every field is documented, so this runs cleanly as a tool over MCP

Notes and limits

  • Odds coverage varies by division. Major leagues carry 9+ bookmakers; lower divisions carry fewer, and non-prime markets may be missing. market.bookmakerCount tells you exactly how many fed each row.
  • The fixtures feed is a rolling window, typically a few days ahead, and only covers divisions with matches in that window. Run it on a schedule so you never miss a fixture appearing.
  • Team names are the provider's, in English where a common English name exists (for example Bayern Munich, not Bayern München). Filter with teams using partial, case-insensitive matching.
  • Analytics are computed per run over the rows in scope. A wider seasonsBack gives Elo ratings time to converge; a single season starts every team at 1500.
  • This Actor provides data and analysis only. It is not betting advice, and it does not predict outcomes.

Data source

Football results, match statistics and bookmaker prices: football-data.co.uk, distributed as freely downloadable CSV files. This Actor is sometimes described as a football-data.co.uk scraper — except that it downloads the published files directly, so there are no selectors to break.

From the same publisher, on the same engine and the same 22 leagues:

Building a wider pipeline? These Apify Actors pair well with a football data API:

If you need a competition or market this Actor does not cover, open an Issue on this page — coverage is driven by demand.

Support

Found a broken row or a missing league? Report it in the Issues tab of this Actor. Public Actors are maintained actively; fixes ship quickly.