UEFA APIuefa.com ↗
Access UEFA Champions League, Europa League, and Conference League player stats, match data, and seasonal rankings via 5 structured endpoints.
What is the UEFA API?
The UEFA.com API provides 5 endpoints covering player performance statistics, match results, and competition metadata across the three main UEFA club competitions. Use get_player_rankings to pull aggregated seasonal stats with pagination and per-stat filtering, or get_match_player_stats to retrieve granular per-player numbers for a specific match. Response fields include player details, team assignments, stadium info, scores, and a full library of named statistics queryable through get_stat_definitions.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/23f00bd9-dcc1-4cac-90a0-b4a57ec8b416/get_competitions' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace uefa-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: UEFA Player Performance Stats — bounded, re-runnable."""
from parse_apis.uefa_player_performance_stats_api import (
Uefa, CompetitionId, MatchNotFound
)
uefa = Uefa()
# Top scorers in Champions League this season
for ranking in uefa.playerrankings.list(
competition_id=CompetitionId.UCL,
season_year="2026",
stats="goals,assists",
limit=3,
):
print(ranking.player.international_name, ranking.team.international_name, ranking.statistics[0].value)
# List recent matches and drill into player stats for one
match = uefa.matches.list(
from_date="2025-09-17",
to_date="2025-09-19",
competition_id=CompetitionId.UCL,
limit=1,
).first()
if match:
print(match.id, match.home_team.international_name, "vs", match.away_team.international_name)
for stat in match.player_stats.list(limit=3):
print(stat.player_id, stat.team_id, stat.statistics[0].name)
# Browse available stat definitions
for defn in uefa.statdefinitions.list(limit=3):
print(defn.name, defn.group, defn.aggregation_type)
# Typed error handling for invalid match ID
try:
bad_match = uefa.matches.list(
from_date="2025-09-17",
to_date="2025-09-19",
competition_id=CompetitionId.UCL,
limit=1,
).first()
if bad_match:
for ps in bad_match.player_stats.list(limit=1):
print(ps.player_id)
except MatchNotFound as exc:
print(f"Match not found: {exc.match_id}")
print("exercised: playerrankings.list / matches.list / match.player_stats.list / statdefinitions.list")
Returns a static mapping of supported UEFA competition abbreviations to their numeric IDs and full names. Use these IDs as the competition_id parameter in other endpoints.
No input parameters required.
{
"type": "object",
"fields": {
"UCL": "object with id and name for UEFA Champions League",
"UEL": "object with id and name for UEFA Europa League",
"UECL": "object with id and name for UEFA Europa Conference League"
},
"sample": {
"data": {
"UCL": {
"id": "1",
"name": "UEFA Champions League"
},
"UEL": {
"id": "14",
"name": "UEFA Europa League"
},
"UECL": {
"id": "2019",
"name": "UEFA Europa Conference League"
}
},
"status": "success"
}
}About the UEFA API
Competition and Discovery Endpoints
get_competitions returns a static mapping of the three supported competitions — UEFA Champions League (ID: 1), UEFA Europa League (ID: 14), and UEFA Europa Conference League (ID: 2019) — along with their abbreviations and full names. These IDs are the input accepted by get_player_rankings and get_matches via the competition_id parameter. get_stat_definitions complements this by returning every available statistic name, its description, grouping, aggregation type, and translations — making it the right starting point before constructing any filtered rankings query.
Player Rankings
get_player_rankings returns an array of player objects sorted in descending order by the requested stats. Each object includes player details, a playerId, a teamId, team details, and a statistics array. You can scope results to a competition and season using competition_id and season_year (e.g., '2026' for the 2025/26 season), filter to specific metrics by passing a comma-separated list of stat names via the stats parameter (names sourced from get_stat_definitions), and paginate using limit (max 100) and offset.
Match Data and Per-Match Player Stats
get_matches accepts a required date range (from_date and to_date in YYYY-MM-DD format) and optional competition_id and season_year filters. Each match object in the response contains homeTeam, awayTeam, score, kickOffTime, stadium, and a unique id. That id feeds directly into get_match_player_stats, which returns a data array where each entry holds a playerId, teamId, and a statistics array of name/value pairs representing that player's performance in the match.
The UEFA API is a managed, monitored endpoint for uefa.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when uefa.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official uefa.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Rank Champions League players by goals or assists across an entire season using get_player_rankings with stat filters
- Build a match report tool that pulls per-player stats for any UCL or UEL fixture via get_match_player_stats
- Discover all available performance metrics and their groupings using get_stat_definitions before querying rankings
- Retrieve a week's worth of Europa League matches with stadium and score data via get_matches date range filtering
- Compare a player's seasonal aggregated stats across the Europa and Conference Leagues by switching competition_id
- Paginate through full-season player rankings to build a database of top performers across all three UEFA competitions
- Identify match IDs for a specific date window to feed into per-match player analysis pipelines
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does UEFA have an official developer API?+
What does get_stat_definitions return and why does it matter for get_player_rankings?+
name, description, group, aggregationType, actors, and translations field. The name values are the exact strings you pass to the stats parameter in get_player_rankings. Without checking get_stat_definitions first, you would have to guess valid stat names.How far back does historical season data go?+
season_year parameter, but the range of seasons actually available depends on what the source exposes. There is no documented guarantee of how many past seasons are covered, and very old seasons may not be present. You can fork this API on Parse and revise it to probe or document the full historical range.Can I retrieve team-level statistics rather than player-level stats?+
Does get_matches return future scheduled fixtures or only completed matches?+
kickOffTime and score, but score fields for unplayed matches will reflect their pre-match state. Verify by querying a future date range against a known competition_id.