Live now!
Football API for media

Match content that writes most of itself.

Fixtures, events, lineups, statistics and pre-calculated Match Facts from 2,200+ football leagues, in one uniform response. Template a match report once, and it stays correct across every fixture and every competition you cover.

✓ No contracts, no minimums ✓ First call in minutes ✓ 99.99% measured uptime
GET /v3/football/fixtures/19427734?include=events;statistics 200 OK
Premier League · 19 Apr 2026FT
Manchester City crestMan City
2 - 1
ArsenalArsenal crest

Events

16'Rayan Cherki assist Matheus Nunes1-0
18'Kai Havertz1-1
65'Erling Haaland2-1
59%Ball possession41%

Match fact · generated

Manchester City won the possession battle 59% to 41% and out-shot Arsenal 15 to 9 on the way to a 2-1 win, Haaland settling it on 65 minutes.

One real Premier League fixture. Every minute, name and number on this card comes from the call above. The match fact line is generated from those same numbers.

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 media builds

Three ways match content quietly falls over

A media site is judged on the pages nobody sees you make. The report that reads well is the one that was correct without an editor touching it.

The template breaks on the odd fixture

A match report template that works for the derby will trip over the fixture with an own goal, a red card in stoppage time or a name with an accent. At volume, the edge case is not rare, it is Saturday.

One uniform response shape across every fixture and competition

The long tail is where you thin out

Every provider carries the big five. A media site earns its traffic on the second tier and the league a reader follows because they grew up near the ground. That is exactly where budget feeds stop returning enough to build a page from.

2,200+ leagues, the long tail included, one response shape

Manual editorial will not scale

Writing the context by hand does not cover a full matchday, let alone a full weekend across every competition. The moment coverage depends on someone being awake, the coverage has a ceiling.

Match Facts arrive pre-calculated, structured and window-aware

From token to published match content

Template once, and it stays correct everywhere

No SDK to adopt and no schema to design first. The same fixtures endpoint carries the story, the context layer and the widgets, so a template you write once holds its shape across every competition.

01

Pull the fixture and its story

One request returns a fixture with its goals, cards, lineups and team numbers. This is the call a match report or match page renders from.

GET200
// one fixture, full match story
/v3/football/fixtures/19427734
  ?include=events;statistics;
  lineups;participants

Useful includes

eventsstatisticslineupsparticipants
02

Add the context layer

Match Facts arrive on the same fixtures call as an add-on: pre-calculated trends, storylines and an optional written sentence per fact, so the report explains the match, not just records it.

GET200
// same fixture, context layer (add-on)
/v3/football/fixtures/19427734
  ?include=events;statistics;
  trends;AIOverviews

Useful includes

trendsAIOverviewspredictions
03

Or drop in a widget

When the match view is one part of a bigger site rather than the whole product, embed a widget instead of building a front end. It runs on the same data, so you can move to the raw API later without switching provider.

EMBED200
// match centre widget, one embed
<div id="sm-widget"
  data-widget="match-centre"
  data-fixture="19427734">

Widgets available

match-centrelivescorestandings
The data behind a media build

What you will actually be calling

Not a capability list. These are the endpoints a media build hits to publish a match, and the fields they return, named exactly as they appear in the response.

EndpointWhat it gives youFields you will use
/fixturesThe match spine One fixture with its result and metadata. This is the object a match report, preview or recap is built around, the same shape in every competition you cover. idnameresult_infostarting_atleague_id
include=eventsGoals, cards, substitutions Every incident with its real minute and the players involved, plus the running score after it. This is what a timeline and an auto-written recap render from. minuteextra_minuteplayer_namerelated_player_nameresult
include=statisticsThe match in numbers Bilateral team statistics, one object per team per type, so a comparison table is a loop rather than a special case per competition. type_idlocationdata.value
include=lineupsWho played Starting elevens, bench and formation slots, with player ids you can key your own records and player pages against. player_idplayer_namejersey_numberformation_field
include=trendsMatch Facts, add-on Pre-calculated trends, streaks, head-to-head records and player storylines, window-aware so you choose which fixtures count. This is the context layer you would otherwise build and maintain yourself. all_matchesleague_matchesallFixtures
include=AIOverviewsMatch Facts, add-on A ready-to-display written match summary generated from the underlying Match Facts, so a preview or recap arrives as a sentence, not just as numbers to assemble. fixtures endpoint

Scroll the table sideways to see every column.

The core fixture data is in the free trial. Match Facts and AI Overviews are add-ons. Read the full entity reference →

Developer experience

From token to published match in one session

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 its events and statistics
curl -s "https://api.sportmonks.com/v3/football/fixtures/19427734?include=events;statistics" \
  -H "Authorization: YOUR_API_TOKEN"
const res = await fetch(
  "https://api.sportmonks.com/v3/football/fixtures/19427734?include=events;statistics",
  { headers: { Authorization: process.env.SPORTMONKS_TOKEN } }
);
const { data } = await res.json();

console.log(data.name, data.result_info);
data.events.forEach(e =>
  console.log(e.minute, e.player_name, e.result)
);
import os, requests

r = requests.get(
    "https://api.sportmonks.com/v3/football/fixtures/19427734",
    params={"include": "events;statistics"},
    headers={"Authorization": os.environ["SPORTMONKS_TOKEN"]},
    timeout=10,
)

fixture = r.json()["data"]
print(fixture["name"], fixture["result_info"])
for e in fixture["events"]:
    print(e["minute"], e["player_name"], e["result"])
$ch = curl_init(
  "https://api.sportmonks.com/v3/football/fixtures/19427734?include=events;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/19427734?include=events;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 · Manchester City 2-1 Arsenal 200 OK
{
  "data": {
    "id": 19427734,
    "league_id": 8,
    "season_id": 25583,
    "name": "Manchester City vs Arsenal",
    "starting_at": "2026-04-19 15:30:00",
    "result_info": "Manchester City won after full-time.",
    "participants": [
      { "id": 9,  "name": "Manchester City",
        "meta": { "location": "home" } },
      { "id": 19, "name": "Arsenal",
        "meta": { "location": "away" } }
    ],
    "events": [
      { "minute": 16, "type_id": 14, "participant_id": 9,
        "player_name": "Rayan Cherki",
        "related_player_name": "Matheus Nunes",
        "result": "1-0" },
      { "minute": 18, "type_id": 14, "participant_id": 19,
        "player_name": "Kai Havertz",
        "result": "1-1" },
      { "minute": 65, "type_id": 14, "participant_id": 9,
        "player_name": "Erling Haaland",
        "result": "2-1" }
      // full-time: Manchester City 2-1 Arsenal
    ],
    "statistics": [
      { "type_id": 45, "location": "home", "data": { "value": 59 } },
      { "type_id": 45, "location": "away", "data": { "value": 41 } },
      { "type_id": 42, "location": "home", "data": { "value": 15 } },
      { "type_id": 42, "location": "away", "data": { "value": 9 } },
      { "type_id": 80, "location": "home", "data": { "value": 498 } },
      { "type_id": 80, "location": "away", "data": { "value": 348 } },
      { "type_id": 34, "location": "home", "data": { "value": 8 } },
      { "type_id": 34, "location": "away", "data": { "value": 5 } }
      // possession 45, shots total 42, passes 80, corners 34
    ]
  }
}

Same shape in the Premier League, a continental final and a second division you have never heard of, so one match template covers all of them. 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.

6.4B
API requests per month
Proven at peak-event volume, so a full matchday of pages behaves like a quiet Monday.
99.99%
Measured uptime
Our own observed availability. Ask support for the service terms that apply to your plan.
2,200+
Football leagues
Including the second tiers and regional competitions a media site earns its long-tail traffic on.
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.

Media platforms built on this feed

What automated match content looks like in production

Sports media platform · ScorePlay
★★★★★
"Automated sports media at scale."

ScorePlay powers sports media management on real-time Sportmonks data, replacing player and schedule data that was previously entered by hand for every club. "We chose Sportmonks because of the accuracy of their API, its ease of use, and their outstanding customer service." Accuracy is the point: automated content is only worth shipping when it is correct without an editor checking it.

Xavier Green Xavier GreenScorePlay

"Side project to sustainable football platform."

Fo

FootiFootball media platform

"Sweden's most complete football site."

Fb

FotbollSwedish football media

Read the full case studies →

Pricing

Published prices, no contracts, no minimums

Start on the free tier, move up when your traffic does. Every plan includes the fixtures endpoint, human support and a 14-day trial of the paid features. Match Facts and AI Overviews are add-ons.

Starter

For a first build

EUR29/mo

Billed monthly

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

Growth

Most media builds start here

EUR99/mo

Billed monthly

  • ✓30 leagues of your choice
  • ✓2,500 API calls per hour
  • ✓Everything in Starter
  • ✓Room for a real editorial audience
Start free

Pro

Multi-league publishers

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 →

API for Sports Media, FAQ

What media teams ask before they build

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

How do I get one match with its full story?

One call to the fixtures endpoint returns a single match with whichever includes you name, so you assemble a match page from one response rather than stitching several calls together.

Add include=events for goals and cards, include=lineups for the elevens and include=statistics for the team numbers. Every entity is listed in the docs.

What are Match Facts, and do I need an add-on?

Match Facts are pre-calculated insights, trends, streaks, head-to-head records and player storylines, that explain a match rather than just record it. They arrive on the same fixtures endpoint you already call.

Match Facts is a paid add-on, listed on the plans and pricing page. The core fixture, event and statistic data is available on every plan including the free tier.

Can I get a written match summary automatically?

Yes. AI Overviews build a ready-to-display match summary from the underlying Match Facts, so a preview or recap arrives as a written sentence rather than as numbers your editors assemble by hand.

Add include=AIOverviews to your fixtures call once the add-on is on your plan. The field definitions live in the docs.

Will one match template work across every competition?

That is the point of a uniform response. The same field names and the same include syntax come back whether the fixture is a Premier League match or a second-division one, so a template written once keeps working.

What varies is depth inside a fixture, not its shape: a lower-tier competition may return fewer statistic types. Check a competition on the coverage page before you build a page around it.

How far back does the historical data go?

Sportmonks has served sports data for 10 years, and historical fixtures, events and statistics sit on the same endpoints and the same response shape as the live ones, so a retrospective piece reuses your match template.

Depth varies by competition and season, and the coverage page shows what history is available where.

Can I use widgets instead of building a front end?

Yes. The football widgets run on this same data and drop into a page with an embed, which is often the faster route when the match view is one part of a bigger site.

You can start with a widget and move to the raw API later without changing data provider.

Can I publish and redistribute the data on my site?

A media product displays data to the public, so redistribution is a licensing question rather than a technical one. What you may display, cache and syndicate depends on your plan and use case.

See what each plan includes on the plans and pricing page, and ask support for the redistribution terms that apply to your product, in writing, before you build a public page on the feed.

Ready when you are

Pull a real match, then decide.

A token takes a couple of minutes and needs no card. Call a fixture with its events and statistics, look at what comes back, and judge the feed on the response rather than on this page.

No contracts, no minimums. Human support seven days a week, including during your trial.

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?