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.
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.
https://admin.thefootballsignal.com/football-api/v1
Live endpointsDataset 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.
https://admin.thefootballsignal.com/football-scores/v1
Archive endpointsThe 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.
[
{
"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
Service document: version, endpoint index, event parts and totals.
Liveness, object count, and the timestamp of the most recent write.
Every resource with its group, row count and last fetch.
Rows written per resource per day.
This reference as Markdown.
Leagues
All competitions with coverage counts.
One competition with its stored detail payload.
Season list, current season marked.
The league table. Defaults to the current season.
Fixtures for the competition.
A leaderboard for the competition.
Grounds used in the competition.
Season Best XI. Stored per season, so season_id is required.
Events
Fixture list across competitions, chronological.
Fixtures currently in play.
One fixture with every stored part.
One part. Part names are listed below.
Collections
Stored league tables. Rows are summaries; include_table embeds the table itself.
Match statistics and xG payloads, with the fixture attached.
Consensus odds per fixture.
Stored model predictions.
Raw store
Resource index with counts.
Stored payloads for one resource.
One stored payload by its key.
Football Scores API — Archive
Wide and shallow. A score and a closing price, for far more football than anyone covers in depth.
Meta
Service descriptor and the endpoint list.
Liveness and how fresh the projection is.
Coverage: matches, competitions, teams, odds fill rate, date range.
Every country with its competition and match counts.
This reference as Markdown.
Competitions
List competitions, most-covered first.
One competition by slug.
Calendar years covered, with match counts.
Matches in one competition, newest first.
Teams
List teams, most-covered first.
One team by slug.
Every match a team played, newest first.
Matches
Search matches across the archive.
One match.
Full odds book for one match. Sparse — recent matches only.
Odds
Bulk closing 1X2 prices with the book margin.
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.