// Live scores API

Live football scores,
every 15 seconds.

One call returns every match in play right now, with the score, minute, period and latest changes, across 1,100 competitions. The IDs match our fixtures, lineups and stats, so the live view slots straight into the rest of your app.

Get your free API key → See the response
The short version

Call GET /v1/fixtures?live=all to get every match in play. Poll it every 15 seconds on Pro or above, compare each match's updated time with the one you stored, and only fetch events for the matches that changed.

// Example

One request, every live match

RequestGET
curl -s "https://api.soccer-data.co/v1/fixtures?live=all" \
  -H "X-Api-Key: $SOCCER_DATA_KEY"

Poll once, not per match

Three matches in play or three hundred, ?live=all is a single request. Narrow it with &league=39 if you only follow a few competitions.

Or skip polling

On Business and Enterprise, webhooks push goals, cards and the final whistle to your server as they happen.

Response200 OK
{
  "get": "fixtures",
  "parameters": { "live": "all" },
  "results": 2,
  "response": [
    {
      "fixture": {
        "id": 1183422,
        "status": { "short": "2H", "elapsed": 67, "extra": null },
        "updated": "2026-09-25T19:38:04+00:00"
      },
      "league": { "id": 39, "name": "Premier League" },
      "teams": {
        "home": { "id": 50, "name": "Manchester City" },
        "away": { "id": 42, "name": "Arsenal" }
      },
      "goals": { "home": 2, "away": 1 }
    },
    {
      "fixture": {
        "id": 1191307,
        "status": { "short": "1H", "elapsed": 31, "extra": null },
        "updated": "2026-09-25T19:37:51+00:00"
      },
      "league": { "id": 140, "name": "La Liga" },
      "teams": {
        "home": { "id": 541, "name": "Real Madrid" },
        "away": { "id": 536, "name": "Sevilla" }
      },
      "goals": { "home": 0, "away": 0 }
    }
  ]
}
// Fields that matter

What each match tells you

fixture.status.short

Where the match is: 1H, HT, 2H, ET, P for penalties, then FT.

fixture.status.elapsed

The match minute. Added time played so far sits next to it in extra.

fixture.updated

When anything in this match last changed. If it matches what you stored, nothing new has happened.

goals

The running score for each side, updated as goals are confirmed.

league.id

The competition. Pass it back as ?league= to follow only the leagues you care about.

// What people build

Made for things that move

Score widgets

Put a live strip or ticker on a site or app without running your own ingest pipeline.

Goal alerts

Send a push notification, Telegram or Discord message the moment a score changes.

Fantasy & predictions

Update points and leaderboards while the matches are still being played.

Live blogs

Keep commentary pages and match centres in step with what's happening on the pitch.

// Goes well with
// FAQ

Live scores questions

How fresh is the live data?
Pro, Business and Enterprise read live matches on a 15-second refresh. The free tier sees the same data through a 5-minute cache, which is fine while you build but too slow for production alerts.
What's the cheapest way to keep up with every match?
Call ?live=all every 15 seconds, keep the last updated value per match, and only request /v1/fixtures/:id/events when it changes. That's four requests a minute for the whole live board, however busy the weekend is, plus one for each match that actually moved.
Which competitions have live coverage?
Every competition we cover live, from the big five to second and third tiers in most countries. Depth varies: some smaller leagues get the score and minute only, without a full event timeline.
Does a live request cost more than a normal one?
No. A request is a request, and every response tells you how much of your daily limit is left. See pricing for the limits on each plan.

Go live
this afternoon.

Start on the free tier: 100 requests a day, no card. Upgrade when your traffic does.

Get your free API key → See pricing