Two flat-priced football APIs that are good at opposite things. API-Football is a live feed across roughly 1,200 leagues, updating in-play about every 15 seconds. foot.io is a historical database — we hold 1,177,209 matches back to 1871, every tier reads the 733,863 we can defend a right to redistribute, joined to 6.2 million odds quotes — served over PostgREST and MCP, currently in closed beta.
Written by foot.io. API-Football figures are from their public pricing and documentation, checked 28 Jul 2026.
foot.io figures were measured against our production database, most recently on 10 Aug 2026, and move as we ingest and as clearances land.
If your product puts a score on a screen while the match is being played, buy API-Football and stop reading. Their live cycle is roughly 15 seconds and it is the thing they are built to do. foot.io polls fixtures every five minutes from a single self-hosted machine. That is an honest description of a results database, not of a livescore feed, and no amount of positioning changes it.
If your product is a model, a backtest, a research tool or an agent — something that reads far more history than it does live minutes — then the trade flips. We hold results further back than a modern-era feed does, we do not gate competitions by plan, and we will translate other providers' identifiers into ours for free so you can join our history onto whatever live feed you already pay for. Plenty of people should buy both.
resolve_entity is free and unmetered.| Capability | foot.io | API-Football |
|---|---|---|
| Entry price | $0 free tier · $19/mo Indie · $79/mo Pro · Enterprise on request | $19–$39/mo across paid plans, plus a free tier |
| Plan gating | None between tiers: the cheapest paid key reads exactly the same rows as the most expensive one. Which rows exist to read is set by the licence gate (see Redistribution rights), not by your plan | None. All endpoints on every paid plan; plans differ on request volume |
| Competitions | 926 held with at least one recorded match; 763 serve at least one match to every tier (measured 10 Aug 2026) | ~1,200 leagues and cups — more than us |
| Live latency | ~5 minutes, single self-hosted poller. Not a livescore product | ~15 seconds in-play — far better than us |
| Earliest match | 11 Nov 1871 | Modern era; check their per-league season list |
| Redistribution rights | Enforced by a licence gate since 29 Jul 2026: every tier reads only rows we can defend — 733,863 of 1,177,209 held matches (62.3%), 42.9% of held events, 32.9% of held lineups, measured 10 Aug 2026. Top-five-league depth, transfers, shot-level data, market values and injuries withheld | Commercial terms for app use; resale by arrangement |
| Historical odds | 6,222,372 pre-match quotes over 130,550 matches, 21 competitions, 7 bookmakers, 2000–2026; 49,929 odds matches join to a result every tier can read (measured 10 Aug 2026). Research convenience, not a licensed feed | Live and pre-match odds across the live catalogue, from a commercial arrangement |
| Query model | PostgREST — filter, order and embed related rows in one request | Fixed REST endpoints with documented parameters |
| Agent / MCP access | Deployed MCP server, 31 tools, included at every paid tier | REST only; you write the tool layer |
| Cross-provider ID resolution | resolve_entity maps ids from Transfermarkt, FBref, Wikidata, Sofascore, API-Football and others onto ours. Free, never metered | Their own ids |
| Published coverage | Per-competition, per-season fill rates on a public endpoint — including the gaps | Documented league and season lists |
| Corrections log | Public erratum | Changelog and support channel |
| Maturity | Closed beta, solo developer, no SLA on self-serve tiers | Established commercial service — ahead of us |
Live is a different product and we are not it. Our fixture poller runs on a five-minute cycle on one machine. If it stops, it stops until someone notices. API-Football runs infrastructure for this; we run a cron job.
Current-season depth is partial. Roughly half of played current-season matches carry event data and roughly a third carry lineups — 40,775 and 26,123 of 79,698, measured on 6 August 2026. Depth is much better in the leagues you would expect and much worse everywhere else. Do not take that on trust — the query below returns it per competition and per season, and it needs no key.
Redistribution rights are partial, and since 29 Jul 2026 a licence gate enforces them on every tier, Enterprise included. We hold 1,177,209 matches; every tier reads the 733,863 (62.3%) we can defend a right to re-serve. Of the events we hold, every tier reads 42.9%; of lineups, 32.9% — measured on 10 August 2026, and growing as clearances land. That still leaves a lot withheld. The event and lineup layer of the top five European leagues comes from sources we have no right to re-serve, so we sell none of it; transfers and all shot-level data, xG included, pass the gate for zero rows; player market values and injury records came off the API surface entirely on 28 Jul 2026 and are in no tier at any price. A vendor with signed feed contracts can promise you things we still cannot, and that is a legitimate reason to buy from them instead.
We are one person. No support rota, no uptime guarantee on self-serve tiers, no procurement paperwork. If your business would be damaged by any of that, buy from a company.
Depth of history, not breadth of today. A modern-era feed answers "what happened this season" better than we do. We answer "what happened in the Football League in 1889" at all. If your model needs decades rather than seasons, that is the entire argument.
One price, no gating between tiers. Our cheapest paid key reads exactly the same rows as the most expensive one — the licence gate defines the served set once, for everyone, and plans differ only on request volume. API-Football takes the same approach on endpoints, which we think is the right one — this is a point of agreement between us, not a differentiator.
Identifier translation as a free primitive. Hand resolve_entity a Transfermarkt id, an FBref id, a Wikidata QID, a Sofascore id or a plain name, and it returns our canonical entity plus every other provider identifier we hold for it, with the match method and a confidence score so you can tell an exact id hit from a fuzzy name guess. It returns identifiers and names only, never stats, which is why it is never billed and never counts against a quota. 304,915 of our 305,434 players carry at least one external identifier (measured 6 Aug 2026). This is how you glue our history onto whichever live feed you already pay for.
Agent-native access. The MCP server is a deployed HTTP JSON-RPC endpoint with 31 tools, metered exactly like REST rather than sold as a separate product. Three of those tools — get_data_quality_summary, get_competition_coverage and get_fact_evidence — exist so an agent gets the caveats along with the numbers instead of confidently reporting a gap as a zero.
Every coverage claim above is served from a public, unauthenticated endpoint. Pick any competition and read the fill rates season by season. If a number here disagrees with what that endpoint returns, the endpoint is right and we owe you a correction.
We ran that exact query while writing this page, on 6 August 2026: the 2025-2026 row came back with 403 played and lineups, events and player stats each at 95.8%. One caveat on what it measures: these are fill rates of what we hold. The licence gate then decides how much of that any key reads — for top-five-league events and lineups, including England's Premier League, that is currently none (see the redistribution row above).
Swap the competition id for whichever one your product actually needs — /rest/v1/competitions?select=id,name,slug with the same key gives you the map. If it comes back thin, we would rather you found out now than after paying us — and if it matters to you, tell us and it goes up the ingestion queue.