PitchAPI Review 2026
A developer-to-developer review of PitchAPI, a free read-only REST API for post-match football data: shot-level detail with xG, lineups, momentum, pass networks and 88 advanced metrics across 42 competitions.
PitchAPI at a Glance
Green = available · amber = unverified or varies by plan · crossed out = not available. Pricing: 💲 ≈ $20/mo up to 💲💲💲💲💲 = $1,000+/mo. From our directory research.
What PitchAPI Is
PitchAPI is a free, read-only REST API for football data. It covers 42 competitions with full history back to 2021, and the emphasis is on the detail behind a result rather than the result itself: every shot with pitch and goal-line coordinates plus xG and xGOT, confirmed and predicted lineups, a minute-by-minute momentum curve, per-player stats, heatmaps, pass networks, and 88 advanced metrics derived from the event feed.
Two things set the terms. First, it is post-match only. Fixtures appear in the schedule endpoints, but the data for a match lands once it has been played. Second, there is one plan and it costs nothing: no card, no trial, no daily request allowance. The developer behind it runs the service as a free resource and says they intend to keep it that way.
The documentation is a single page, with the same reference published as a plain-text file for AI coding tools, and there is an official Python SDK on PyPI.
Coverage and the Data Model
Forty-two competitions, described in the docs as including second tiers, domestic cups and the UEFA club competitions, and every one of them is reachable with any key. The docs do not publish the league list; the leagues endpoint returns it along with the seasons held for each. History runs back to 2021, so a fall-to-spring league carries around five seasons.
Everything hangs off a match ID. You find matches by date or by league and season, then follow the ID into 16 match endpoints: the summary, shots, events, lineups, momentum, team stats per half, player stats, head-to-head, heatmaps and the three advanced-analytics routes. Teams and players have reference endpoints so any ID you meet can be resolved. IDs are opaque and prefixed by type (m_, s_, p_, t_, l_).
The shot data is the centrepiece. Each shot carries two coordinate pairs, where it was struck and where it crossed the goal line, in metres on a 105 x 68 pitch normalised so the attacking goal is always at x = 105. Every shot has an xG and, for on-target attempts, an xGOT. Heatmaps bin actions onto a 16 x 12 grid, served sparse, with a frame parameter that lets the server orient both teams on one pitch for you.
Lineups deserve a note. A lineup can be published up to 48 hours before kickoff as a prediction, and the response carries a confirmed flag and a lineup_type label so you know which one you are holding. Check the flag before you trust the eleven.
The Advanced Analytics
The 88 metrics sit in eleven groups: totals, possession value, pass network, passing, carrying, creation, defending, territory, tempo, goalkeeping and shooting. Team-level and player-level routes serve them, and the pass network has its own endpoint with per-player centrality measures (degree, strength, betweenness, clustering) and a team centralisation score.
The possession-value group is where the modelling lives: expected threat (xT), VAEP split into offensive and defensive, and a possession value figure over a ten-second window. Both models are fitted on closed historical seasons and frozen, so a match is never scored by a model that saw it. Creation covers shot-creating and goal-creating actions, xAG, xG chain and xG buildup. Defending includes PPDA, high turnovers, counter-press regains inside five seconds and ball recovery time. Tempo has passes per sequence, direct speed and a buildup-versus-direct attack split.
The docs are candid about how the numbers are made, which is rare and useful. Carries are synthesised rather than observed, inserted wherever the ball moves more than five metres between two consecutive actions by the same team. The passes count includes crosses, so never add the two. A null is never a zero: it means an empty denominator, and a quiet goalkeeper has zeros where an outfield player has nulls. Read the metric definitions once and the response shapes stop surprising you.
One thing to plan for: event-feed coverage is not universal. A match can exist in the catalogue and still return ANALYTICS_UNAVAILABLE on the advanced routes. It is kept as its own error code so you can tell it from a bad ID.
Developer Experience
Authentication is an X-API-KEY header, with pk_live_ and pk_test_ prefixes. Plain HTTP is refused rather than redirected, so a misconfigured client never leaks a key. Every response is one JSON envelope with either a data key or an error key, never both, and there are six error codes in total.
The official Python SDK (pip install pitchapi, Python 3.9+) wraps the endpoints as typed objects, maps errors to exceptions, and retries on 429 and 5xx while honouring Retry-After. A sync client and an async twin share the same names and arguments. Other languages are described as on the way. Until then the REST surface is small enough to wrap yourself in an afternoon.
Two SDK defaults to know: match listings return played matches only unless you pass status="upcoming" or "all", and a future date comes back empty without that flag.
PitchAPI Pricing and the Free Tier
There is one plan, and it is free. No card, no trial period, no daily allowance, and every endpoint is included, advanced analytics and full history among them. The only guard is a fair-use burst ceiling that returns a 429 with a Retry-After header, and the docs say it sits far above anything a normal client does. There is nothing to upgrade to.
That is unusual for this depth of data, and the fair question is how long it stays that way. The leagues endpoint still carries an is_free flag left over from an earlier paid tier, kept so older clients keep parsing, so the model has changed once already. The developer's stated plan is to keep the service free for everyone with no limits. Take the offer, and keep an eye on the docs.
What It Does Not Cover
- Live data. No live scores, no in-play events, no WebSocket. Match data arrives after the final whistle. For in-play football, look at the real-time sports API options.
- Odds. None. Pair it with a provider from the soccer odds API guide if you are modelling against the market.
- Standings. No league table endpoint. You can build one from league results, but it is not served.
- Season aggregates. Everything is match level. Per-90 numbers, season totals and cross-match player profiles are yours to compute.
- Other sports. Football only.
- An MCP server. Nothing packaged for AI agents, though the llms.txt file gets a coding assistant most of the way.
Who PitchAPI Is For
Anyone doing football analytics who has been priced out of event data. Shot maps with real coordinates, xG and xGOT, pass networks, PPDA and possession-value models are the material of paid data deals and hobbyist scraping. Here they come as clean JSON for nothing. Analysts, students, tactics writers and model builders are the obvious fit.
Betting and prediction work fits too, with a caveat. The history back to 2021 and the frozen possession-value models make a sound base for pre-match modelling, and the predicted lineups 48 hours out are a bonus. Nothing here is live, though, so treat it as a research and pre-match feed rather than an in-play one.
Product teams should weigh the free-forever question against their own risk tolerance. There is no SLA and no paid tier to buy one on. For that, the sports data API directory covers providers with contracts.
Verdict
A free football analytics API with depth that would normally cost money, documented with unusual care about what each number means. The shot coordinates, xG and xGOT, momentum, heatmaps, pass networks and 88 metrics across 42 competitions and five seasons make this the richest free football feed we list.
The trade-offs are clear and stated up front: post-match only, football only, match level only, no odds and no standings. If your work is analysis rather than live display, PitchAPI costs nothing to try and a key takes a minute.
Frequently Asked Questions
Retry-After header.status=upcoming, and lineups can appear as predictions up to 48 hours before kickoff, but shots, events, stats and analytics land after the match has been played.pip install pitchapi, Python 3.9+) with sync and async clients, typed models, and automatic retries that honour Retry-After. Other languages are described as on the way. The REST API is small enough to call directly from any language in the meantime.PitchAPI Alternatives
Similar providers from the directory worth shortlisting alongside PitchAPI.
Want to pull a match?
One free plan, no card and no daily allowance. Grab a key, take a match ID from the date endpoint, and drill into shots, momentum and the advanced analytics. The full reference is one page, and there is an llms.txt for your coding agent.
Are You the Team Behind PitchAPI?
Show developers you're independently listed on SportsAPIs.dev. Copy this badge onto your site. It links straight back to this profile.