Expected goals, team and player statistics and match history from 2,200+ football leagues, in one uniform response. Comparable across every competition, and every figure traces back to a fixture you can name.
Beşiktaş
Goals
Performance · xG vs result


Case study
"The quality of the data itself stands out."
Once you start utilising it, you realise its excellence isn't just superficial.

Case study
"Data reliability has been constantly improving."
I particularly highlight the support team's agility and efficiency in resolving any issues.


Case study
"Sportmonks has proven to be a great partner."
Finding high-quality football and betting data is challenging. When available, it's often too expensive or hard to integrate.

Case study
"Real-world football, inside FIFA Career Mode."
SoFIFA pulls up-to-date squads, ratings and historical seasons into the game.

Case study
"Seven years. No major problems."
Other services provided the same data at much higher prices that we could not afford.
Case study
"Automated sports media at scale."
ScorePlay powers sports media management with real-time Sportmonks data: every match, every moment.
"Sportmonks feels like a partner rather than just a service."
The support team is fast, helpful, and actually understands what you're trying to achieve.
Case study
"AI football commentary in 12+ languages."
Botbrains scales generative match commentary across markets, powered by Sportmonks data.
Case study
"Middle East's fastest-growing football fan platform."
Built on Sportmonks data to power live experiences for millions of fans.
"Fast and consistent, critical for live features."
Getting started was very smooth. Within a short time we were retrieving data and integrating it into the platform.
Case study
"Logic over gut feeling in sports betting."
Fine Line replaces guesswork with data-driven decisions across 2,200+ leagues.
Case study
"Side project to sustainable football platform."
Footi built and scaled the whole product on Sportmonks data.
"Worldwide coverage at unmatched price."
Depth of coverage on the worldwide package was unmatched at the price point.
Case study
"Sweden's most complete football site."
Fotboll.com is built end-to-end on Sportmonks data across all major leagues.
Recruitment is judged on the one signing that did not work out, not on the average. Data that cannot survive a hard question in the meeting is not doing its job.
A goal tally in one competition is not a goal tally in another, and neither is an xG figure. If the shape changes league to league, you cannot rank a Süper Lig striker against a Championship one without rebuilding the comparison by hand.
One response shape across 2,200+ leagues, the same fields every time
One good season is noise. A recruitment case is built on whether a number holds up across campaigns, so a provider that only returns the current season leaves you guessing at exactly the part that matters.
Fixtures, players, teams and seasons carry the record across past campaigns
An xG value with no provenance dies the moment someone in the room asks where it came from. Data you cannot point back to a fixture and a source is an opinion, not evidence.
Every figure ties to a fixture id, cross-checked against more than one source
No SDK to adopt and no schema to design first. These are real calls against the v3 API, with the include options that decide how deep the metrics go.
One request returns the result, the team statistics and the expected goals for a match, so xG against the actual scoreline is one call rather than a stitching job.
// 19443148 = Beşiktaş 0-1 Galatasaray /v3/football/fixtures/19443148 ?include=xGFixture;statistics &api_token=YOUR_TOKEN
Useful includes
Move from one match to a squad. Request a team with its players and season statistics, so a shortlist is keyed to real ids you can hold your own records against.
// 34 = Galatasaray /v3/football/teams/34 ?include=players;statistics &api_token=YOUR_TOKEN
Useful includes
The same shape back through past campaigns. Request a season with its fixtures and statistics, and a one-season sample becomes a trend you can defend in the meeting.
// 25682 = Süper Lig season /v3/football/seasons/25682 ?include=fixtures;statistics &api_token=YOUR_TOKEN
Useful includes
Not a capability list. These are the endpoints a scouting build hits to turn a match into a comparable metric, and the fields they return, named exactly as they appear in the response.
| Endpoint | What it gives you | Fields you will use |
|---|---|---|
| /fixturesOne match, result and metrics | The spine of a scouting pull. One fixture returns the result and, with includes, the metrics behind it, in the same shape for every competition you cover. | idresult_infoleague_idseason_idstarting_at |
| include=xGFixtureExpected goals vs the result | Expected goals per team on the fixture, so you can read whether a scoreline flattered a side or robbed it, the question a recruitment meeting actually asks. | type_idlocationdata.value |
| include=statisticsThe match in numbers | Bilateral team statistics, one object per team per type, so a comparison panel is a loop rather than a special case per competition. | type_idlocationdata.value |
| include=lineups.detailsPlayer metrics per match | Who played and how they performed, down to the per-player detail rows, with ids you can key your own scouting records against. | player_idplayer_namejersey_numberdetails[] |
| /playersThe player record | Position, date of birth and season statistics for a player, the profile a shortlist is built from rather than a single appearance. | iddisplay_nameposition_iddate_of_birthstatistics[] |
| /teamsThe squad and the club | A club with its squad and season record, so you can move from a single player to the team around them in the same response shape. | idnamecountry_idplayers[] |
| /seasonsHistory across campaigns | The seasons behind a league, so the same metric can be pulled back through past campaigns and a one-season number becomes a trend. | idnameleague_idfixtures[] |
Scroll the table sideways to see every column.
Every field above is in the free trial. Read the full entity reference →
One endpoint, the includes you name, and a response that looks the same in every competition. Here is the call and exactly what comes back.
# One fixture, with xG and team statistics curl -s "https://api.sportmonks.com/v3/football/fixtures/19443148?include=xGFixture;statistics" \ -H "Authorization: YOUR_API_TOKEN"
const res = await fetch( "https://api.sportmonks.com/v3/football/fixtures/19443148?include=xGFixture;statistics", { headers: { Authorization: process.env.SPORTMONKS_TOKEN } } ); const { data } = await res.json(); console.log(data.name, data.result_info); data.xgfixture.forEach(x => console.log(x.location, x.data.value) );
import os, requests r = requests.get( "https://api.sportmonks.com/v3/football/fixtures/19443148", params={"include": "xGFixture;statistics"}, headers={"Authorization": os.environ["SPORTMONKS_TOKEN"]}, timeout=10, ) fixture = r.json()["data"] print(fixture["name"], fixture["result_info"]) for x in fixture["xgfixture"]: print(x["location"], x["data"]["value"])
$ch = curl_init( "https://api.sportmonks.com/v3/football/fixtures/19443148?include=xGFixture;statistics" ); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: " . getenv("SPORTMONKS_TOKEN")], ]); $fixture = json_decode(curl_exec($ch), true)["data"]; printf("%s: %s\n", $fixture["name"], $fixture["result_info"]);
req, _ := http.NewRequest("GET", "https://api.sportmonks.com/v3/football/fixtures/19443148?include=xGFixture;statistics", nil) req.Header.Set("Authorization", os.Getenv("SPORTMONKS_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { return err } defer res.Body.Close() var payload FixtureResponse json.NewDecoder(res.Body).Decode(&payload)
{
"data": {
"id": 19443148,
"league_id": 600,
"season_id": 25682,
"name": "Beşiktaş vs Galatasaray",
"starting_at": "2026-03-07 17:00:00",
"result_info": "Galatasaray won after full-time.",
"participants": [
{ "id": 554, "name": "Beşiktaş",
"meta": { "location": "home" } },
{ "id": 34, "name": "Galatasaray",
"meta": { "location": "away" } }
],
"events": [
{ "minute": 39, "type_id": 14, "participant_id": 34,
"player_name": "Victor Osimhen",
"related_player_name": "Leroy Sané",
"result": "0-1" }
],
"statistics": [
{ "type_id": 45, "location": "home", "data": { "value": 60 } },
{ "type_id": 45, "location": "away", "data": { "value": 40 } },
{ "type_id": 42, "location": "home", "data": { "value": 24 } },
{ "type_id": 42, "location": "away", "data": { "value": 12 } },
{ "type_id": 80, "location": "home", "data": { "value": 510 } },
{ "type_id": 80, "location": "away", "data": { "value": 345 } },
{ "type_id": 34, "location": "home", "data": { "value": 8 } },
{ "type_id": 34, "location": "away", "data": { "value": 4 } }
// + more statistic types on this fixture
],
"xgfixture": [
{ "type_id": 5304, "location": "home", "data": { "value": 1.43 } },
{ "type_id": 5304, "location": "away", "data": { "value": 0.91 } }
]
}
}
Same shape in the Süper Lig, the Premier League and a league you have never scouted. Read the docs or get a token and run it yourself.
Every figure here is measured rather than marketed, and we say which is which.
Measured uptime is our own observed availability, not a contractual guarantee. Ask support for the service terms that apply to your plan.
"Sportmonks feels like a partner rather than just a service. The support team is fast, helpful, and actually understands what you're trying to achieve."
ScoutsLand builds an AI-enhanced scouting platform on Sportmonks data, chosen after evaluating the enterprise incumbents on coverage, cost and developer experience together. Comparable metrics across leagues are what let a shortlist hold up when the recruitment meeting starts asking questions.
Ahmet SayarliogluCo-founder, ScoutsLand
"As an early-stage startup, we needed a provider that could grow with us without locking us into enterprise-level costs from day one."
Egle NeumannCo-founder, ScoutsLand
"The quality of the data itself stands out. Once you start utilising it, you realise its excellence isn't just superficial."
Josip BožićCEO, ShiftOneZero
Start on the free tier, widen your coverage when the shortlist does. Every plan includes fixtures, team and player statistics, human support and a 14-day trial of the paid features.
Starter
For a first shortlist
EUR29/mo
Billed monthly
Growth
Most scouting builds start here
EUR99/mo
Billed monthly
Pro
Multi-league scouting
EUR249/mo
Billed monthly
Enterprise
Full coverage
from EUR499/mo
Billed monthly
Prices exclusive of VAT. League counts are how many competitions you select on that plan, not a limit on what the API covers. See the full plan comparison →
Quick answers before you take a token or book a call. The long version is in the developer docs.
Request the fixture with include=xGFixture, and the response carries an xG value per team alongside the standard statistics, so you can read expected goals against the actual result in one call.
xG is available on the competitions where the metric is provided rather than universally, so check the competition on the coverage page before you build a comparison around it.
Yes. The response shape is the same across 2,200+ leagues, with the same field names and the same include syntax, so a player in one competition is read the same way as a player in another.
What varies is depth per competition, not the shape, so confirm a league carries the metrics you need on the coverage page first.
Fixtures, players, teams and seasons carry history across past campaigns, so pulling the same metric back through earlier seasons is a query rather than a data-collection project.
How many seasons a given competition carries varies, so the per-competition history is listed on the coverage page.
Feeds are cross-checked against more than one source rather than taken from a single upstream, which is what keeps a bad value from becoming a bad number in front of a recruitment committee.
Every figure ties to a fixture, team or player id you can trace, so a value on a shortlist can always be pointed back to the match it came from. The entities are documented in the developer docs.
Advanced metrics such as expected goals are provided on the competitions where the underlying data supports them, not as a blanket claim across every league.
The exact list is published per competition on the coverage page, so you can confirm a league before you commit a workflow to it.
Fixtures, team and player statistics, lineups and history are core Football API data, available on every plan including the free tier. Expected goals is one of the separate analytical layers.
Those advanced layers are sold as add-ons that attach to your plan, and are listed on the plans and pricing page.
Every endpoint returns one uniform JSON response over a plain REST call, with no SDK to adopt, so the data drops into a warehouse, a notebook or an internal dashboard the same way each time.
Because ids are stable across fixtures, players and teams, you can key the data to your own scouting records without reconciling it by hand. The entity reference is in the docs.
Book a call and we will walk your team through the coverage, the metrics and the provenance on your own shortlist. Prefer to look first? Take a free token and run the call yourself.
No contracts, no minimums. Human support seven days a week. Or read the fixtures docs first.
Sportmonks is the most approachable sports data API. Reliable enough to trust in production, priced so you can start today, and built so one person can get it working in an afternoon.
Building something else?