playerelo APIplayerelo.football ↗
Access player Elo ratings, EAR scores, match-by-match history, team rankings, and the global leaderboard for professional football via 4 endpoints.
What is the playerelo API?
The playerelo.football API exposes 4 endpoints for retrieving Elo-based performance ratings for professional football players. You can search players by name, pull a full match-by-match Elo history and EAR (Elo Above Replacement) scores via get_player_elo, rank all players on a given team, or page through the global leaderboard sorted by current Elo rating. Each player record includes current rating, peak Elo, position, nationality, and global rank.
curl -X GET 'https://api.parse.bot/scraper/b6d4f6c0-78e3-486f-8030-edfc0e09d181/search_players?query=Haaland&limit=10&offset=0' \ -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 playerelo-football-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: PlayerElo Football API — browse leaderboard, search, and drill into full profiles."""
from parse_apis.playerelo_football_api import PlayerElo, PlayerNotFound
client = PlayerElo()
# Browse the global leaderboard — top 5 players by Elo.
for entry in client.leaderboard_entries.list(limit=5):
print(f"#{entry.rank} {entry.player_name} ({entry.team}) — Elo {entry.elo}, 28d change: {entry.elo_change_28d}")
# Search for a player by name and drill into their full profile.
result = client.player_summaries.search(query="Haaland", limit=1).first()
if result is not None:
player = result.details()
print(f"\n{player.player_name} — {player.current_team}, {player.current_league}")
print(f" Elo: {player.current_elo} (peak: {player.peak_elo} on {player.peak_elo_date})")
print(f" EAR career: {player.ear_career} ({player.ear_label})")
print(f" Games played: {player.games_played}")
# Show the most recent matches from rating history.
for match in player.rating_history[-3:]:
print(f" {match.date}: {match.team} vs {match.opponent} ({match.result}) — Elo {match.elo_change:+.1f}")
# Get top players for a specific team.
for tp in client.team_players.list(team="Arsenal", limit=3):
print(f" #{tp.team_rank} {tp.player_name} ({tp.position}) — Elo {tp.elo}, global #{tp.global_rank}")
# Point lookup by known ID with error handling.
try:
specific = client.players.get(player_id="1100")
print(f"\nDirect lookup: {specific.player_name}, rank #{specific.current_rank}")
except PlayerNotFound as e:
print(f"Player not found: {e.player_id}")
print("\nexercised: leaderboard_entries.list / player_summaries.search / details / team_players.list / players.get")
Search players by name. Returns matching players with their name, ID, team, position, Elo rating, and global rank, ordered by Elo descending. Supports pagination via limit and offset.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return (1-100). |
| queryrequired | string | Player name search query (case-insensitive substring match). |
| offset | integer | Number of results to skip for pagination. |
{
"type": "object",
"fields": {
"count": "integer number of results returned",
"players": "array of player objects with player_id, player_name, team, league, position, elo, rank, nationality"
},
"sample": {
"data": {
"count": 1,
"players": [
{
"elo": 2613.4,
"rank": 5,
"team": "Manchester City",
"league": "Premier League",
"position": "Attacker",
"player_id": "1100",
"nationality": "Norway",
"player_name": "E. Haaland"
}
]
},
"status": "success"
}
}About the playerelo API
Player Search and Profiles
The search_players endpoint accepts a case-insensitive substring query and returns matching players with their player_id, team, league, position, elo, and rank. Results are ordered by Elo descending and support pagination through limit and offset parameters. The player_id values returned here feed directly into get_player_elo.
Full Elo History and EAR Scores
get_player_elo returns the most detailed record in the API. Beyond the current_elo and peak_elo, it surfaces two EAR (Elo Above Replacement) metrics: ear_career for the player's full career and ear_180 for the trailing 180-day window. An ear_label string (Elite, Good, Average, Below) provides a quick categorical read. The response also includes the complete match-by-match rating history, which can span hundreds of entries for established players.
Team Rankings and Global Leaderboard
get_team_rankings accepts an exact team name and returns up to 25 players by default (configurable via limit up to 100), each with a team_rank, global_rank, games_played, and Elo rating. This makes it straightforward to compare squad depth across clubs. get_leaderboard pages through the global rankings and adds an elo_change_28d field showing each player's rating movement over the past 28 days — useful for identifying players trending up or down across all leagues.
The playerelo API is a managed, monitored endpoint for playerelo.football — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when playerelo.football 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 playerelo.football 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?+
- Track a player's Elo trajectory over their career using the match-by-match history from get_player_elo.
- Compare squad strength across clubs by pulling team rankings for multiple teams and averaging their Elo ratings.
- Identify in-form players by sorting the global leaderboard on elo_change_28d to find the largest 28-day gains.
- Build a fantasy football ranking model using current_elo, ear_180, and position data.
- Search for players by name and surface their global rank and league for a player-lookup feature in a sports app.
- Monitor peak vs. current Elo to flag players who may be underperforming relative to their historical ceiling.
- Filter a team's roster by position using get_team_rankings to scout positional depth for a specific club.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.