Live match state, goals, cards, substitutions and lineups from 2,200+ football leagues, in one uniform response. Built to hold its shape on the night everyone opens your app at once.
Feyenoord
Events


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.
Livescore is an unforgiving category. The product is judged on the worst thirty seconds of the busiest night, not on the average.
A user who hears the goal on the street before it lands in your app does not come back to check whether it was a one-off. Freshness is not a nice-to-have in this category, it is the entire product.
Events carry the real minute, the scorer and the assist
Plenty of feeds are fine on a Tuesday and wobble when eight matches kick off together and your traffic triples. The load you need to survive is the one you cannot schedule around.
6.4B API requests a month, at 99.99% measured uptime
Every provider carries the big five. Your retention comes from the second tier and the league someone follows because they grew up near the ground. That is where budget feeds quietly stop.
2,200+ leagues, one response shape across all of them
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.
One request returns every fixture live right now, across every competition on your plan. This is the call your matchday loop makes.
// every match currently in play /v3/football/livescores/inplay ?include=participants;events;periods &api_token=YOUR_TOKEN
Useful includes
Filter the same endpoint down to the leagues your product covers, so you are not paying for and parsing matches your users will never see.
// 72 = Eredivisie /v3/football/livescores/inplay ?include=participants;events.type &filters=fixtureLeagues:72
Useful includes
When a user opens a match, request that fixture with the heavier includes. Same ids and same response shape, so the detail view reuses your list-view parser.
// one fixture, full detail /v3/football/fixtures/19429278 ?include=events;statistics; lineups.player;participants
Useful includes
Not a capability list. These are the endpoints a livescore build hits on matchday, and the fields they return, named exactly as they appear in the response.
| Endpoint | What it gives you | Fields you will use |
|---|---|---|
| /livescoresEverything in play, right now | The matchday spine. One call returns every live fixture rather than making you loop over a schedule and check each one. | idnamestate_idstarting_atleague_id |
| /fixturesBefore and after the whistle | Schedules, results and the full history of a match. Same ids and same response shape as the live feed, so one renderer covers both. | result_infovenue_idperiods[].minutescores[] |
| 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 renders from. | minuteextra_minuteplayer_namerelated_player_nameresult |
| include=lineupsWho is on the pitch | Starting elevens, bench and formation slots, with player ids you can key your own records against. | player_idplayer_namejersey_numberformation_field |
| include=statisticsThe match in numbers | Bilateral team statistics, one object per team per type, so a stats panel is a loop rather than a special case per competition. | type_idlocationdata.value |
| /standingsWhere it leaves the table | Live and end-of-round tables for every covered competition, so the table on your league page moves when the match does. | positionpointsparticipant_iddetails[] |
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.
# Every fixture that is live right now curl -s "https://api.sportmonks.com/v3/football/livescores?include=participants;events" \ -H "Authorization: YOUR_API_TOKEN"
const res = await fetch( "https://api.sportmonks.com/v3/football/livescores?include=participants;events", { headers: { Authorization: process.env.SPORTMONKS_TOKEN } } ); const { data } = await res.json(); for (const fixture of data) { console.log(fixture.name, fixture.state_id); fixture.events.forEach(e => console.log(e.minute, e.player_name, e.result) ); }
import os, requests r = requests.get( "https://api.sportmonks.com/v3/football/livescores", params={"include": "participants;events"}, headers={"Authorization": os.environ["SPORTMONKS_TOKEN"]}, timeout=10, ) for fixture in r.json()["data"]: print(fixture["name"], fixture["state_id"]) for e in fixture["events"]: print(e["minute"], e["player_name"], e["result"])
$ch = curl_init( "https://api.sportmonks.com/v3/football/livescores?include=participants;events" ); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: " . getenv("SPORTMONKS_TOKEN")], ]); $body = json_decode(curl_exec($ch), true); foreach ($body["data"] as $fixture) { printf("%s (state %d)\n", $fixture["name"], $fixture["state_id"]); }
req, _ := http.NewRequest("GET", "https://api.sportmonks.com/v3/football/livescores?include=participants;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 LivescoreResponse json.NewDecoder(res.Body).Decode(&payload)
{
"data": [
{
"id": 19429278,
"league_id": 72,
"season_id": 25597,
"venue_id": 1795,
"name": "Feyenoord vs PSV",
"starting_at": "2025-10-26 13:30:00",
"result_info": "PSV won after full-time.",
"participants": [
{ "id": 73, "name": "Feyenoord",
"meta": { "location": "home" } },
{ "id": 682, "name": "PSV",
"meta": { "location": "away" } }
],
"events": [
{ "minute": 30, "type_id": 14, "participant_id": 682,
"player_name": "Ismael Saibari",
"related_player_name": "Mauro Júnior",
"result": "0-1" },
{ "minute": 50, "type_id": 14, "participant_id": 73,
"player_name": "Luciano Valente",
"related_player_name": "Givairo Read",
"result": "1-1" },
{ "minute": 51, "type_id": 14, "participant_id": 682,
"player_name": "Ismael Saibari",
"related_player_name": "Guus Til",
"result": "1-2" },
{ "minute": 60, "type_id": 14, "participant_id": 682,
"player_name": "Ismael Saibari", "result": "1-3" },
{ "minute": 62, "type_id": 19, "participant_id": 682,
"player_name": "Sergiño Dest" },
{ "minute": 73, "type_id": 14, "participant_id": 73,
"player_name": "Oussama Targhalline", "result": "2-3" }
// + 10 more events (substitutions through 90+2')
],
"statistics": [
{ "type_id": 45, "location": "home", "data": { "value": 48 } },
{ "type_id": 45, "location": "away", "data": { "value": 52 } },
{ "type_id": 42, "location": "home", "data": { "value": 12 } },
{ "type_id": 42, "location": "away", "data": { "value": 11 } },
{ "type_id": 80, "location": "home", "data": { "value": 422 } },
{ "type_id": 80, "location": "away", "data": { "value": 465 } }
// + 35 more statistic types on this fixture
]
}
]
}
Same shape in the Eredivisie, the Premier League and a second division you have never heard of. 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.
"It's incredibly fast, and you always know what to expect. The API's uniform and clear responses provide assurance that your data fetching engine will handle everything smoothly."
ShiftOneZero builds the official Dinamo Zagreb fan app on real-time match data, and rates Sportmonks support 10 out of 10. Uniform responses matter most when the same renderer has to survive every fixture in every competition you carry.
Josip BožićCEO and Lead Developer, ShiftOneZero
"The data is fast and consistent, which is critical for live features."
Leon KorstersCo-founder, Sportspoule
"The data updates in real-time, which is crucial for our platform, as our game mechanics depend on precise and up-to-date stats."
Nicolò MazzoniStarcks
Start on the free tier, move up when your traffic does. Every plan includes the livescores endpoint, human support and a 14-day trial of the paid features.
Starter
For a first build
EUR29/mo
Billed monthly
Growth
Most livescore builds start here
EUR99/mo
Billed monthly
Pro
Multi-league portals
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. The long version is in the developer docs.
One call to the livescores endpoint. It returns every fixture currently in play, with whichever includes you name on the query string, so you do not have to fetch a schedule first and then check each fixture individually.
Add include=events for goals and cards, include=lineups for the elevens, include=statistics for the team numbers. Every entity is listed in the docs.
Your plan sets an hourly rate limit per entity, starting at 2,000 calls an hour on Starter and rising through the tiers. Most livescore products poll on a fixed interval during matches and back off outside them.
If you are unsure what your matchday pattern will cost you, ask support before you build around a number. The limit per tier is on the plans and pricing page.
Every fixture carries a state, and the periods object carries the running minute, so you read the match state rather than inferring it from a clock.
Events also carry an extra_minute field, which is how added time is expressed rather than folding it into the minute itself.
Sportmonks covers 2,200+ football leagues, and the live feed follows that coverage. What varies is depth inside a fixture: a lower-tier competition may return scores and events without lineups or the full statistic set.
Check the competition on the coverage page before you build a match page around it.
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 scoreline in your app.
When a correction does happen, the fixture and its events update in place under the same ids, so your next poll returns the corrected state without you reconciling anything.
No. Livescores, fixtures, events, lineups and team statistics are core Football API data, available on every plan including the free tier. Nothing on this page needs an add-on.
The extra analytical layers are sold separately and are listed on the plans and pricing page.
Yes. The livescore widgets run on this same feed and drop into a page with an embed, which is often the faster route if the live view is one part of a bigger product rather than the product itself.
You can start with a widget and move to the API later without changing data provider.
A token takes a couple of minutes and needs no card. Call the livescores endpoint, 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?