Fantasy Football API

Every player, every point, correctly scored.

Complete player records, appearances, minutes and match events from 2,200+ football leagues, in one uniform response. Built so a single missing stat never breaks a gameweek's scoring.

No contracts, no minimums First call in minutes 99.99% measured uptime
GET /v3/football/fixtures/19425124?include=lineups.details;events 200 OK
Serie A · 14 Feb 2026FT
Inter crestInter
3 - 2
JuventusJuventus crest

Goals and assists

17'Andrea Cambiaso own goal1-0
26'Andrea Cambiaso assist Weston McKennie1-1
76'Pio Esposito assist Federico Dimarco2-1
83'Manuel Locatelli assist Weston McKennie2-2
90'Piotr Zieliński assist Yann Bisseck3-2
Player detail · lineups.detailsRating · Min
#3Bremer7.0590'
#2Emil Holm6.2844'
One real Serie A fixture. Every minute, name, rating and minute 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 fantasy product

Three ways a fantasy scoreboard loses trust

Fantasy is settled to the point. One wrong appearance or a late rating and the whole gameweek's table is wrong, in public, in front of your most engaged users.

One missing appearance rewrites the table

Fantasy scoring is only as good as its worst record. A single player whose minutes, goal or assist never landed means every manager who owned him is scored wrong, and they will notice before you do.

Per-player minutes, ratings and events in lineups.details

Transfers move the ground under your mapping

A player changes club, or a feed reissues his id, and every squad, watchlist and points history keyed to the old id quietly breaks. In fantasy that mapping is the whole game.

Stable player ids across seasons and transfers

Ratings and minutes that settle late

Provisional stats that keep changing for an hour after full time mean you either settle early and correct in public, or make managers wait. What you need is a feed that corrects itself under the same ids.

Corrections update in place under the same fixture and player ids

From token to a scored gameweek

Three requests, and your fantasy game has data

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 much comes back.

01

Load the player pool

Pull a squad for a season and you have every player, with the ids you key your own records against. This is the call your game setup makes.

GET200
// 2930 = Inter, season 25533
/v3/football/squads/seasons/25533/teams/2930
  ?include=player
  &api_token=YOUR_TOKEN

Useful includes

playerplayer.positionteam
02

Score the gameweek

Request the fixture with lineups.details and events, and you have per-player minutes, ratings, goals and assists in one response. This is where a gameweek is settled.

GET200
// one fixture, per-player detail
/v3/football/fixtures/19425124
  ?include=lineups.details;events
  &api_token=YOUR_TOKEN

Useful includes

lineups.detailseventsparticipants
03

Rank the season

Pull the season topscorers to drive leaderboards, price players and set captaincy hints. Same ids and same response shape, so it reuses your player parser.

GET200
// season 25533 = Serie A
/v3/football/topscorers/seasons/25533
  ?include=player
  &api_token=YOUR_TOKEN

Useful includes

playerparticipanttype
The data behind a fantasy product

What you will actually be calling

Not a capability list. These are the endpoints a fantasy build hits to set up a game and score it, and the fields they return, named exactly as they appear in the response.

EndpointWhat it gives youFields you will use
/playersThe player universe Every player with a stable id you key your squads, watchlists and points history against, so a transfer does not orphan your records. iddisplay_nameposition_idnationality_iddate_of_birth
/squadsWho is in the squad this season Squad membership per team and season, so your player pool for a game reflects who is actually registered rather than a stale list. player_idteam_idjersey_numberseason_id
include=lineups.detailsPer-player match detail The scoring engine. Per-player minutes, ratings and match stats for a fixture, keyed to the player id, so a gameweek is a loop over one response. player_idplayer_namejersey_numberdetails[].type_iddetails[].data.value
include=eventsGoals, assists, cards Every incident with its real minute and the players involved, plus the running score after it. This is the goals-and-assists side of scoring. minuteplayer_namerelated_player_nametype_idresult
/topscorersSeason leaders Ranked goal and assist leaders per season, so leaderboards, player pricing and captaincy hints come from data rather than a manual list. player_idtotaltype_idparticipant_id
/fixturesThe gameweek schedule Schedules and results with the same ids and response shape, so the fixture list that drives your gameweeks reuses one parser. idresult_infostarting_atseason_id

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 a scored gameweek in one session

One call to a fixture with lineups.details and events, and you have the per-player detail a gameweek is scored from. Here is the call and exactly what comes back.

# One fixture, per-player detail and events
curl -s "https://api.sportmonks.com/v3/football/fixtures/19425124?include=lineups.details;events" \
  -H "Authorization: YOUR_API_TOKEN"
const res = await fetch(
  "https://api.sportmonks.com/v3/football/fixtures/19425124?include=lineups.details;events",
  { headers: { Authorization: process.env.SPORTMONKS_TOKEN } }
);
const { data } = await res.json();

for (const player of data.lineups) {
  console.log(player.jersey_number, player.player_name);
  player.details.forEach(d =>
    console.log(d.type_id, d.data.value)
  );
}
import os, requests

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

for player in r.json()["data"]["lineups"]:
    print(player["jersey_number"], player["player_name"])
    for d in player["details"]:
        print(d["type_id"], d["data"]["value"])
$ch = curl_init(
  "https://api.sportmonks.com/v3/football/fixtures/19425124?include=lineups.details;events"
);
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: " . getenv("SPORTMONKS_TOKEN")],
]);

$body = json_decode(curl_exec($ch), true);
foreach ($body["data"]["lineups"] as $player) {
    printf("%s %s\n", $player["jersey_number"], $player["player_name"]);
}
req, _ := http.NewRequest("GET",
  "https://api.sportmonks.com/v3/football/fixtures/19425124?include=lineups.details;events", 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 · Inter 3-2 Juventus 200 OK
{
  "data": {
    "id": 19425124,
    "league_id": 384,
    "season_id": 25533,
    "name": "Inter vs Juventus",
    "starting_at": "2026-02-14 19:45:00",
    "result_info": "Inter won after full-time.",
    "participants": [
      { "id": 2930, "name": "Inter",
        "meta": { "location": "home" } },
      { "id": 625,  "name": "Juventus",
        "meta": { "location": "away" } }
    ],
    "events": [
      { "minute": 26, "type_id": 14, "participant_id": 625,
        "player_name": "Andrea Cambiaso",
        "related_player_name": "Weston McKennie",
        "result": "1-1" },
      { "minute": 76, "type_id": 14, "participant_id": 2930,
        "player_name": "Pio Esposito",
        "related_player_name": "Federico Dimarco",
        "result": "2-1" },
      { "minute": 90, "type_id": 14, "participant_id": 2930,
        "player_name": "Piotr Zieliński",
        "related_player_name": "Yann Bisseck",
        "result": "3-2" }
      // + 2 more goals (17' OG 1-0, 83' Locatelli 2-2)
    ],
    "lineups": [
      { "player_name": "Bremer", "jersey_number": 3,
        "team_id": 2930,
        "details": [
          { "type": { "code": "RATING" },          "data": { "value": 7.05 } },
          { "type": { "code": "MINUTES_PLAYED" }, "data": { "value": 90 } }
        ] },
      { "player_name": "Emil Holm", "jersey_number": 2,
        "team_id": 625,
        "details": [
          { "type": { "code": "RATING" },          "data": { "value": 6.28 } },
          { "type": { "code": "MINUTES_PLAYED" }, "data": { "value": 44 } }
        ] }
      // each lineups[] entry also carries player_id, position_id, formation_field
    ]
  }
}

Same per-player shape in Serie A, the Premier League and a second division you have never heard of. 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 gameweek settles 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 leagues your managers pick players from, not just the big five.
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 fantasy on this data

What a fantasy build feels like in production

Fantasy football · FantaMaster
★★★★★
"Finding high-quality football and betting data is challenging. When available, it is often either too expensive or difficult to integrate. This is where Sportmonks has proven to be a great partner."

FantaMaster runs a fantasy football platform, where a game is only as trustworthy as the player records behind it. Complete, correctly attributed data at an approachable price is the difference between a game managers trust and one they abandon.

Pasquale Puzio Pasquale PuzioCo-founder, FantaMaster

"Sportmonks gives us a clean, stable framework we can build on without worrying about inconsistent naming or missing relationships."

KB

Khachin BorjiginFounder, SoFIFA

"Getting started with the Sportmonks API was actually very smooth. Within a short time, we were able to retrieve data and integrate it into our platform."

Leon Korsters

Leon KorstersCo-founder, Sportspoule

Read the full case studies →

Pricing

Published prices, no contracts, no minimums

Start on the free tier, move up when your player base does. Every plan includes the players, squads and fixtures endpoints, human support and a 14-day trial of the paid features.

Starter

For a first build

EUR29/mo

Billed monthly

  • 5 leagues of your choice
  • 2,000 API calls per hour
  • Players, squads, fixtures, lineups
  • Human support, seven days a week
Start free

Growth

Most fantasy 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 fantasy audience
Start free

Pro

Multi-league fantasy games

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 →

Fantasy Football API, FAQ

Fantasy scoring questions, answered

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

How do I get per-player stats to score a gameweek?

Request a fixture with include=lineups.details;events. That returns per-player minutes, ratings and match detail alongside the goals and assists, all keyed to the player id, so a gameweek is a loop over one response.

The same call works for any covered fixture, so one scoring routine covers every league you run. Every entity is listed in the docs.

Do player ids stay stable when a player transfers?

Yes. A player keeps one stable id across clubs and seasons, so the squads, watchlists and points history you key against that id survive a transfer window without a remap.

That stability is what lets you carry a manager's history forward year on year. The player entity is documented in the players endpoint.

How do I load a full squad for a season?

Call the squads endpoint for a team and season and you get every registered player with the ids to build your player pool from, rather than maintaining a list by hand.

Add include=player to pull the profile in the same response. The exact path is on the squads endpoint page.

How far back does player history go?

Sportmonks carries ten years of sports data at scale across 2,200+ football leagues, in the same response shape as the current season, so history and live data share one parser.

That history is what preseason pricing, form and rankings are built from. Check a competition on the coverage page before you build a game around it.

How quickly do player stats settle after a match?

Feeds are cross-checked against more than one source, and when a stat is corrected the fixture and its player detail update in place under the same ids, so your next poll returns the settled state without you reconciling anything.

We publish measured uptime rather than a settle-time figure we have not verified end to end. Ask support for the current picture on your plan, or see the plans and pricing page.

Do I need an add-on for player stats?

No. Players, squads, fixtures, lineups, events and topscorers are core Football API data, available on every plan including the free tier. Everything this page describes runs without an add-on.

The deeper analytical layers are sold separately and are listed on the plans and pricing page.

How do I rank players across a season?

The topscorers endpoint returns ranked goal and assist leaders per season, which is what drives leaderboards, player pricing and captaincy hints from data rather than a manual list.

Add include=player to attach the profile to each entry. The endpoint is documented in the topscorers reference.

Ready when you are

Score a real gameweek, then decide.

A token takes a couple of minutes and needs no card. Pull a fixture with lineups.details, score it, and judge the data 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?