Live now!
Football data for clubs

The metrics a recruitment meeting can actually use.

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.

✓ One shape across 2,200+ leagues ✓ Free token, no card ✓ 99.99% measured uptime
GET /v3/football/fixtures/19443148?include=xGFixture;statistics 200 OK
Süper Lig · 7 Mar 2026FT
Beşiktaş crestBeşiktaş
0 - 1
GalatasarayGalatasaray crest

Goals

39'Victor Osimhen assist Leroy Sané0-1

Performance · xG vs result

1.43Expected goals0.91
60%Ball possession40%
24Shots total12
One real Süper Lig fixture. Beşiktaş won the xG and lost the match. Every number on this card comes from the call above.

Trusted by 30,000+ sports builders

Case study
Case study
Case study
Case study
Case study Case study ScoutsLand Case study Case study Case study Sportspoule Case study Case study Case study Last5Games Case study Case study
2,200+
football leagues
99.99%
uptime
6.4B
API requests per month
10 years
of sports data, at scale
What actually breaks a scouting call

Three ways scouting data loses the room

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.

Metrics that will not compare across leagues

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

History too shallow to see a trend

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

Numbers a scout cannot trace

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

From token to a comparable metric

Three requests, and the shortlist has numbers behind it

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.

01

Pull a fixture with its metrics

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.

GET200
// 19443148 = Beşiktaş 0-1 Galatasaray
/v3/football/fixtures/19443148
  ?include=xGFixture;statistics
  &api_token=YOUR_TOKEN

Useful includes

xGFixturestatisticslineups.detailsevents
02

Widen to a club and its players

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.

GET200
// 34 = Galatasaray
/v3/football/teams/34
  ?include=players;statistics
  &api_token=YOUR_TOKEN

Useful includes

playersstatisticsseasonsvenue
03

Compare the metric across seasons

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.

GET200
// 25682 = Süper Lig season
/v3/football/seasons/25682
  ?include=fixtures;statistics
  &api_token=YOUR_TOKEN

Useful includes

fixturesstatisticsstandings
The data behind a scouting workflow

What you will actually be calling

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.

EndpointWhat it gives youFields 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 →

Developer experience

From token to xG against the result

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)
Sample response · Beşiktaş 0-1 Galatasaray 200 OK
{
  "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.

Proof for the vendor review

The numbers a technical evaluator will ask you for

Every figure here is measured rather than marketed, and we say which is which.

2,200+
Football leagues
The comparison set. One response shape across all of them, so a metric means the same thing wherever you pull it.
6.4B
API requests per month
Proven at scale, so a full-squad, multi-season pull behaves the same as a single fixture.
99.99%
Measured uptime
Our own observed availability. Ask support for the service terms that apply to your plan.
10 years
In production
A decade of serving sports data at scale, and a vendor still here to support what you build.

Measured uptime is our own observed availability, not a contractual guarantee. Ask support for the service terms that apply to your plan.

Builders shipping scouting products on this data

What a scouting workflow feels like in production

Scouting platform · ScoutsLand
★★★★★
"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 Sayarlioglu 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 Neumann

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 Bozic

Josip BožićCEO, ShiftOneZero

Read the full case studies →

Pricing

Published prices, no contracts, no minimums

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

  • ✓5 leagues of your choice
  • ✓2,000 API calls per hour
  • ✓Fixtures, statistics, players, teams
  • ✓Human support, seven days a week
Start free

Growth

Most scouting builds start here

EUR99/mo

Billed monthly

  • ✓30 leagues of your choice
  • ✓2,500 API calls per hour
  • ✓Everything in Starter
  • ✓Room for a full scouting workflow
Start free

Pro

Multi-league scouting

EUR249/mo

Billed monthly

  • ✓120 leagues of your choice
  • ✓3,000 API calls per hour
  • ✓Everything in Growth
  • ✓Add-ons attach to the same plan
Start free

Enterprise

Full coverage

from EUR499/mo

Billed monthly

  • ✓All 2,200+ leagues
  • ✓5,000 API calls per hour, custom limits
  • ✓Everything in Pro
  • ✓A named personal contact
Talk to our team

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 →

Football Clubs API, FAQ

What scouting teams ask before they integrate

Quick answers before you take a token or book a call. The long version is in the developer docs.

How do I get expected goals for a fixture?

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.

Can I compare a player across different leagues?

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.

How far back does the historical data go?

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.

Where does the data come from, and can I trust a number in a meeting?

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.

Which competitions have xG and advanced metrics?

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.

Do I need an add-on for xG?

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.

Can I export the data into our own tools?

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.

Ready when you are

Bring the metrics to the meeting, then decide.

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?