Football API documentation
Copy-paste examples for the PlayerElo football API — player & coach Elo ratings, match predictions, history and ESB betting tips. Grab a free key on the API overview (500 requests/month, no card), then run any request below.
Basics
- Base URL —
https://data-api.playerelo.football - Auth — every request needs an
Authorization: Bearer YOUR_API_KEYheader. - Format — JSON over HTTPS. List endpoints page with
limit(max 100) andoffset. - Errors —
401(missing/invalid key),404(unknown id),429(rate limit / monthly quota).
/v1/playersList / search players
Players ranked by Elo (highest first). Pass search to resolve a name to an id.
Query params
search— case-insensitive name substring (optional)limit— 1–100, default 20offset— ≥ 0, default 0
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://data-api.playerelo.football/v1/players?search=Pedri&limit=1"Example response
[
{
"player_id": "133609",
"player_name": "Pedri",
"elo": 2646.4,
"position": "Midfielder",
"current_team": "Barcelona",
"current_league": "La Liga",
"ear_label": "Elite"
}
]/v1/players/{id}Get a player
A single player's full rating record — Elo, rank and EAR = Elo Above Replacement, football's version of baseball's WAR (Wins Above Replacement). Every rated match scores a player against the average performance for their position: better adds to EAR, worse subtracts. EAR180 adds up the last 180 days (current form); EAR career adds up every rated match. Our predictions add EAR180 to a player's Elo, about 37 Elo points per EAR point. (Elo Above Replacement) over the career, the last 12 months and the last 180 days.
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://data-api.playerelo.football/v1/players/133609Example response
{
"player_id": "133609",
"player_name": "Pedri",
"player_type": "player",
"elo": 2646.4,
"position": "Midfielder",
"position_group": "MID",
"current_team": "Barcelona",
"current_team_id": 529,
"current_league": "La Liga",
"current_league_id": 140,
"current_rank": 1,
"games_played": 317,
"total_minutes": 25100,
"ear_career": 49.8,
"ear_label": "Elite",
"ear_12m": 12.3,
"ear_label_12m": "Elite",
"ear_180": 5.0,
"ear_label_180": "Elite"
}/v1/players/{id}/historyPlayer rating history
Match-by-match Elo and EAR = Elo Above Replacement, football's version of baseball's WAR (Wins Above Replacement). Every rated match scores a player against the average performance for their position: better adds to EAR, worse subtracts. EAR180 adds up the last 180 days (current form); EAR career adds up every rated match. Our predictions add EAR180 to a player's Elo, about 37 Elo points per EAR point. (Elo Above Replacement over the prior 180 days), oldest first. ear may be null for older rows.
Query params
frm— inclusive start date YYYY-MM-DD (optional)to— inclusive end date YYYY-MM-DD (optional)
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://data-api.playerelo.football/v1/players/133609/historyExample response
[
{ "date": "2019-08-17", "elo": 1512.0, "ear": null },
{ "date": "2026-05-18", "elo": 2646.4, "ear": 5.0 }
]/v1/players/{id}/trend28-day movement
Elo and rank change over the last 28 days. Positive rank_delta_28d means the player climbed.
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://data-api.playerelo.football/v1/players/133609/trendExample response
{
"elo": 2646.4,
"elo_prev_28d": 2641.2,
"elo_delta_28d": 5.2,
"current_rank": 1,
"rank_prev_28d": 1,
"rank_delta_28d": 0
}/v1/coachesList / search coaches
Coaches ranked by Elo. Coach ids are prefixed, e.g. coach_4.
Query params
search— name substring (optional)limit— 1–100, default 20
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://data-api.playerelo.football/v1/coaches?limit=1"Example response
[
{
"player_id": "coach_4",
"player_name": "Pep Guardiola",
"elo": 2512.5,
"current_team": "Manchester City",
"current_league": "Premier League",
"ear_label": "Elite"
}
]/v1/fixturesUpcoming fixtures, provisional predictions
Every fixture of the next two weeks, soonest kickoff first, with provisional home/draw/away probabilities from both squads' Elo (recalculated until kick-off; null while there are none yet). When lineup_prediction_available turns true, about 20 minutes before kick-off, /v1/fixtures/{id}/prediction has the lineup-based prediction. Without date: matches still to come or kicked off in the last 3 hours.
Query params
league— filter by league id (optional)date— UTC kickoff date YYYY-MM-DD, past days included (optional)limit— 1–100, default 20
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://data-api.playerelo.football/v1/fixtures?limit=1"Example response
[
{
"fixture_id": 1234567,
"kickoff_time": "2026-08-15T19:00:00+00:00",
"league_id": 39,
"league_name": "Premier League",
"round": "Regular Season - 1",
"status": "NS",
"home_team_id": 42,
"home_team": "Arsenal",
"away_team_id": 49,
"away_team": "Chelsea",
"provisional": {
"p_home": 0.46,
"p_draw": 0.27,
"p_away": 0.27,
"home_team_elo": 1870.2,
"away_team_elo": 1838.6,
"computed_at": "2026-08-13T14:05:00+00:00"
},
"lineup_prediction_available": false
}
]/v1/predictionsUpcoming match predictions
Fixtures with confirmed lineups, soonest kickoff first, each with home/draw/away probabilities. A match appears once its line-ups are published, typically about 20 minutes before kick-off; for earlier, provisional probabilities use /v1/fixtures.
Query params
league— filter by league id (optional)date— filter by kickoff date YYYY-MM-DD (optional)limit— 1–100, default 20
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://data-api.playerelo.football/v1/predictions?limit=1"Example response
[
{
"fixture_id": 1234567,
"kickoff_time": "2026-08-15T19:00:00+00:00",
"league_name": "Premier League",
"league_id": 39,
"home_team": "Arsenal",
"away_team": "Chelsea",
"home_team_elo": 1875.4,
"away_team_elo": 1840.1,
"p_home": 0.47,
"p_draw": 0.26,
"p_away": 0.27,
"status": "NS"
}
]/v1/fixtures/{id}/predictionSingle fixture prediction
One fixture's probabilities plus a Monte-Carlo scoreline_distribution.
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://data-api.playerelo.football/v1/fixtures/1234567/predictionExample response
{
"fixture_id": 1234567,
"home_team": "Arsenal",
"away_team": "Chelsea",
"home_team_elo": 1875.4,
"away_team_elo": 1840.1,
"p_home": 0.47,
"p_draw": 0.26,
"p_away": 0.27,
"status": "NS",
"scoreline_distribution": { "1-0": 0.11, "1-1": 0.10, "2-1": 0.09 }
}/v1/value-betsESB betting tips
ESB (Established Squads Betting): our model's open bets before kick-off, plus the settled record (won/lost). Open bets appear in the last ~30 minutes before kick-off. On match days, check about every 15 minutes during the busy windows: weekdays 16:30–22:00, weekends 11:30–23:00, plus 23:30–05:30 for matches in the Americas (Central European time: UTC+2 in summer, UTC+1 in winter). In our measurement that catches about 80% of bets before kick-off for ~1,600 requests a month, which needs a paid plan; within the free plan's 500, weekday evenings (19:30–22:00) and weekend afternoons (14:30–22:00) alone catch about half. fair_odds (= 1 / model_prob) is ours, not a bookmaker's price. No profit is promised; model_version is null on rows before 2026-06-21.
Query params
strategy— e.g. hs2_v6 (optional)status— open / won / lost / void (optional); void = removed from the record by the 2026-10-09 audit (placed after kick-off or priced off the wrong match), pl 0, reason in void_reasonsince— return only rows with id greater than this; a bet keeps its id when it settles
Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://data-api.playerelo.football/v1/value-bets?status=open&limit=1"Example response
[
{
"id": 8842,
"fixture_id": 1234567,
"kickoff_time": "2026-08-15T19:00:00+00:00",
"league_name": "Premier League",
"home_team": "Arsenal",
"away_team": "Chelsea",
"bet_on": "home",
"bookmaker": "pinnacle",
"model_prob": 0.47,
"edge": 0.04,
"strategy": "hs2_v6",
"status": "open",
"pl": null,
"resolved_at": null,
"identified_at": "2026-08-15T18:40:00+00:00",
"model_version": "football_v8.3",
"fair_odds": 2.13
}
]This is a curated subset. For the full endpoint list (clubs, leagues, styles, simulations, recruitment analytics) and pricing, see the API overview. There's also a zero-dependency Python client on GitHub.