Datasets

Two datasets. One envelope.

Both APIs answer { data, meta }, both are GET-only, both are open CORS, and a key is optional on both — it raises your rate limit, it does not gate the data. What differs is shape: one goes deep on the football it covers, the other goes wide across football nobody else bothers with.

1.1M
matches in the archive
118.8k
fixtures in the live store
173
countries in the archive
91.3%
archive rows with closing prices

Dataset 1

Live

Live · last write just now

Everything about a fixture — xG shotmaps, lineups, incidents, per-player stats, tables, odds comparison, predictions. Thirteen parts hang off a single match.

118.8k
fixtures
88
competitions
23
resource types

https://admin.thefootballsignal.com/football-api/v1

Live endpoints

Dataset 2

Archive

Live · 2011–2026

Finished matches with half-time and full-time scores and closing 1X2 prices, across the long tail — third tiers, youth, women's and regional football.

1.1M
matches
3,791
competitions
30,835
teams

https://admin.thefootballsignal.com/football-scores/v1

Archive endpoints

The catalogue

What's in here, by data type.

Not a route list — the docs have that. This is the question you actually have first: is the thing I need in here, and which dataset holds it. Shared rows come first, because those are the ones where you have a choice.

Data type Live Archive Notes
Fixtures & results Yes Yes Kickoff, teams, competition, status, final score.
Half-time scores Yes Yes HT as well as FT. The archive carries one on effectively every row.
Closing 1X2 odds Yes Yes Home / draw / away with the book margin. The archive is the deeper history.
Full market book Yes Partial Double Chance, HT/FT, Totals, BTS. Sparse and recent in the archive.
Competition metadata Yes Yes Name, country, scope, gender, age group. Different id schemes — see below.
Team records Yes Yes Every match a club played, home or away, with its inferred country.
Seasons Yes Partial Real season objects on the live API; the archive groups by calendar year only.
League tables Yes Stored standings per season, current season marked.
Match stats & xG Yes Shotmaps with per-shot coordinates and xG, momentum series, average positions.
Lineups & formations Yes Starting XI, bench, formations, per-player positions.
Incidents Yes Goals, cards, substitutions and VAR events with minutes.
Per-player match stats Yes xG, expected assists, touches, duels, ratings.
Bookmaker comparison Yes Per-bookmaker prices for the same markets, plus prediction-market lines.
Model predictions Yes The provider's stored prediction per fixture.
Head-to-head Yes Stored H2H record between two clubs.
In-play fixtures Yes Currently live matches. The archive is finished matches only, by definition.
Broadcasts & editorial Yes Broadcaster listings by territory, preview text.
Fifteen-year price history Yes Closing 1X2 back to 2011 across thousands of competitions — the archive's point.
Long-tail competitions Yes Third tiers, youth, women's and regional football most providers never cover.
Country breadth Partial Yes Competition and match counts for every country the archive touches.

The two datasets do not join.

The live API keys a competition on the upstream provider's integer — league_id=39. The archive keys it on a slug it derives itself — england-england-premier — because its source carries free-text names and no ids at all. There is no crosswalk between them, and we would rather say so than let you find out three days into a build. Query them as two datasets that happen to share an envelope, not as one dataset behind two doors.


Archive shape

A score and a price, on half a million matches.

Scores are integers or null, never an empty string standing in for a missing number. A missing price is null too — the upstream writes 0 for "no price", which left alone reads as infinite value on every unpriced match.

979,305 of 1,073,192 rows carry a complete three-way book.

GET /matches?competition=england-england-premier
[
    {
        "id": 3774557,
        "kickoff": "2026-09-20T17:30:00+00:00",
        "status": "finished",
        "competition": {
            "id": "england-england-premier",
            "name": "England Premier",
            "country": "England"
        },
        "home_team": {
            "id": "fulham",
            "name": "Fulham"
        },
        "away_team": {
            "id": "manchester-utd",
            "name": "Manchester Utd."
        },
        "score": {
            "halftime": {
                "home": 0,
                "away": 0
            },
            "fulltime": {
                "home": 1,
                "away": 1
            }
        },
        "odds": {
            "home": 3.35,
            "draw": 3.75,
            "away": 2,
            "overround": 1.0652
        }
    },
    {
        "id": 3774554,
        "kickoff": "2026-09-20T15:00:00+00:00",
        "status": "finished",
        "competition": {
            "id": "england-england-premier",
            "name": "England Premier",
            "country": "England"
        },
        "home_team": {
            "id": "bournemouth",
            "name": "Bournemouth"
        },
        "away_team": {
            "id": "liverpool",
            "name": "Liverpool"
        },
        "score": {
            "halftime": {
                "home": 0,
                "away": 0
            },
            "fulltime": {
                "home": 0,
                "away": 1
            }
        },
        "odds": {
            "home": 2.95,
            "draw": 3.75,
            "away": 2.2,
            "overround": 1.0602
        }
    }
]

Breadth

173 countries in the archive.

Read live from GET /countries. This is the axis the archive exists for — the live dataset covers 88 competitions properly, and this one reaches football that nobody covers properly at all.

Country Competitions Matches
England 108 85,500
Spain 107 56,612
Germany 62 51,814
Italy 89 40,334
Brazil 139 37,646
Argentina 44 28,528
Australia 106 25,261
France 29 21,908
Sweden 41 21,836
Norway 29 19,640
Turkey 51 19,389
Portugal 23 18,929
Japan 36 18,335
USA 42 18,073
Scotland 42 17,172
Czech Republic 40 16,547
Finland 34 15,626
Poland 23 15,453
Russia 45 15,330
Israel 41 15,005
Austria 29 14,617
Mexico 26 13,659
Denmark 25 12,546
Belgium 24 11,636
Colombia 20 11,110
Romania 26 10,276
Holland 20 9,449
Chile 21 9,272
Algeria 41 9,236
Hungary 17 9,069
Iceland 38 8,439
South Korea 20 8,320
China 28 8,152
Greece 16 7,928
Egypt 77 7,884
Switzerland 12 7,515
Slovakia 12 7,449
Serbia 12 7,020
Uruguay 13 6,699
Peru 20 6,364
Rep. of Ireland 35 6,085
Thailand 33 6,071
Croatia 14 5,951
Bulgaria 15 5,813
Ukraine 11 5,743
South Africa 17 5,714
Vietnam 81 5,673
Paraguay 12 5,670
Wales 17 5,629
India 65 5,585
Northern Ireland 35 5,582
Indonesia 37 5,440
Saudi Arabia 18 5,410
Ecuador 11 5,245
Iran 9 5,218
Estonia 21 5,066
Costa Rica 13 5,033
Belarus 20 5,024
Venezuela 8 5,003
Slovenia 12 4,942
Bolivia 23 4,530
Netherlands 17 4,326
Cyprus 12 4,267
UAE 35 4,252
Guatemala 10 4,225
Morocco 9 3,818
Bosnia & Herzegovina 15 3,546
Lithuania 8 3,544
Kazakhstan 20 3,339
Montenegro 9 2,931
Macedonia 10 2,909
Latvia 8 2,853
Malaysia 27 2,778
Azerbaijan 8 2,775
Qatar 19 2,637
Malta 16 2,620
Tunisia 9 2,615
Georgia 8 2,531
Honduras 7 2,529
Kenya 10 2,472
Hong Kong 16 2,424
Faroe Islands 29 2,263
Singapore 18 2,164
Bahrain 24 2,150
Armenia 14 2,144
Ethiopia 4 1,968
Uganda 8 1,760
Panama 7 1,751
Uzbekistan 8 1,688
Tanzania 6 1,682
Jordan 10 1,678
New Zealand 26 1,638
Nigeria 8 1,617
Rwanda 8 1,581
Cameroon 7 1,563
Zambia 7 1,332
Iraq 4 1,292
Zimbabwe 14 1,255
Nicaragua 5 1,237
Gambia 2 1,232
Jamaica 1 1,203
Myanmar 9 1,202
Burundi 29 1,189
Oman 10 1,155
Ghana 7 1,127
Kuwait 7 1,104
Albania 5 1,098
Luxembourg 3 1,066
El Salvador 3 1,050
Syria 8 788
Senegal 6 767
Canada 5 738
Moldova 4 711
Mauritania 13 707
Kosovo 6 676
Mali 2 600
Cambodia 5 588
Europe 12 563
Malawi 1 549
Philippines 12 545
Ivory Coast 3 522
Lebanon 4 503
San Marino 4 473
Botswana 1 436
Taiwan 6 427
Andorra 4 409
Bangladesh 4 408
Dominican Republic 2 408
Gibraltar 4 392
Kyrgyzstan 2 367
Aruba 3 335
Burkina Faso 2 322
Angola 1 315
Trinidad and Tobago 1 314
Palestine 5 292
Bhutan 4 277
Mongolia 4 259
Niger 1 231
Tajikistan 8 216
Macao 2 214
Turkmenistan 6 149
Togo 1 147
Fiji 2 145
Mozambique 1 131
Czech Rep. 6 113
Seychelles 1 113
St. Kitts & Nevis 1 102
Nepal 3 83
Antigua and Barbuda 1 83
Liberia 3 79
Pakistan 2 75
Haiti 1 74
Sudan 1 54
Barbados 1 50
Sri Lanka 2 25
Laos 2 23
Maldives 2 21
Curacao 1 21
Brazil FPB 3 17
World League Qual. (M) 1 13
Denmark Bambusa Kvindeligaen (W) 1 12
Australia WCC 1 11
Euroleague Bet Builder 1 10
Winner Belgium 1 1 7
Benin 1 5
Hungary OB I 1 4
Brazil Liga Carioca 1 4
Croatia Premijer Liga (M) 1 4
Cuba 1 3
Russia VTB Student League (W) 1 1
ITF Women 1 1
Asia Cup (W) 1 1
ITF Qual. (W) (3rd SET IN STB) 1 1

Click a header to sort. Counts refresh hourly.


Endpoints

Every route, both datasets.

40 routes in total. All GET, all read-only — anything else is refused before routing, so there is no write surface to find.

Football API — Live

Deep and narrow. Everything about a fixture, for the competitions we cover properly.

Meta

GET
/

Service document: version, endpoint index, event parts and totals.

GET
/health

Liveness, object count, and the timestamp of the most recent write.

GET
/resources

Every resource with its group, row count and last fetch.

GET
/stats

Rows written per resource per day.

GET
/docs

This reference as Markdown.

Leagues

GET
/leagues

All competitions with coverage counts.

GET
/leagues/{id}

One competition with its stored detail payload.

GET
/leagues/{id}/seasons

Season list, current season marked.

GET
/leagues/{id}/standings

The league table. Defaults to the current season.

GET
/leagues/{id}/events

Fixtures for the competition.

GET
/leagues/{id}/top

A leaderboard for the competition.

GET
/leagues/{id}/venues

Grounds used in the competition.

GET
/leagues/{id}/best-xi

Season Best XI. Stored per season, so season_id is required.

Events

GET
/events

Fixture list across competitions, chronological.

GET
/events/live

Fixtures currently in play.

GET
/events/{id}

One fixture with every stored part.

GET
/events/{id}/{part}

One part. Part names are listed below.

Collections

GET
/standings

Stored league tables. Rows are summaries; include_table embeds the table itself.

GET
/event-stats

Match statistics and xG payloads, with the fixture attached.

GET
/odds

Consensus odds per fixture.

GET
/predictions

Stored model predictions.

Raw store

GET
/datasets

Resource index with counts.

GET
/datasets/{resource}

Stored payloads for one resource.

GET
/datasets/{resource}/{ref}

One stored payload by its key.

Full reference

Football Scores API — Archive

Wide and shallow. A score and a closing price, for far more football than anyone covers in depth.

Meta

GET
/

Service descriptor and the endpoint list.

GET
/health

Liveness and how fresh the projection is.

GET
/stats

Coverage: matches, competitions, teams, odds fill rate, date range.

GET
/countries

Every country with its competition and match counts.

GET
/docs

This reference as Markdown.

Competitions

GET
/competitions

List competitions, most-covered first.

GET
/competitions/{id}

One competition by slug.

GET
/competitions/{id}/seasons

Calendar years covered, with match counts.

GET
/competitions/{id}/matches

Matches in one competition, newest first.

Teams

GET
/teams

List teams, most-covered first.

GET
/teams/{id}

One team by slug.

GET
/teams/{id}/matches

Every match a team played, newest first.

Matches

GET
/matches

Search matches across the archive.

GET
/matches/{id}

One match.

GET
/matches/{id}/odds

Full odds book for one match. Sparse — recent matches only.

Odds

GET
/odds/1x2

Bulk closing 1X2 prices with the book margin.

Full reference


Next

Try either one, without signing up for anything.

A key is optional on both APIs. It raises your rate limit; it does not unlock data.