StatsHub APIstatshub.com ↗
Retrieve football xG, xGA, possession, and shot data from StatsHub. Covers fixtures, league standings, and team/player stats across 120+ leagues worldwide.
What is the StatsHub API?
The StatsHub API exposes 5 endpoints covering football match fixtures, expected goals (xG/xGA), league standings, and team statistics across 120+ leagues. The get_fixtures_by_date endpoint returns match IDs, scores, and tournament metadata for any calendar date, feeding the event_id values needed to pull shot-level xG breakdowns per match. Player-level shot stats, season-level possession figures, and multi-category team aggregates are also accessible.
curl -X GET 'https://api.parse.bot/scraper/e1f0e079-0946-4b6c-9e3c-9227eddaa64a/get_fixtures_by_date?date=2026-08-24' \ -H 'X-API-Key: $PARSE_API_KEY'
Get all football fixtures/matches for a specific date. Returns match IDs, teams, scores, tournament info, and status. Each fixture includes event_id, home_team.id, and away_team.id needed to query match-level xG stats via get_match_stats. Covers 120+ leagues worldwide.
| Param | Type | Description |
|---|---|---|
| date | string | Date in YYYY-MM-DD format. If omitted, defaults to today's date (UTC). |
{
"type": "object",
"fields": {
"date": "string in YYYY-MM-DD format",
"fixtures": "array of fixture objects with event_id, home_team, away_team, scores, tournament, status",
"total_fixtures": "integer count of fixtures returned"
},
"sample": {
"data": {
"date": "2025-05-25",
"fixtures": [
{
"slug": "bournemouth-vs-leicester-city-mebxgg",
"round": 38,
"status": "finished",
"country": "England",
"event_id": 12436536,
"away_team": {
"id": 31,
"name": "Leicester City",
"short_name": "Leicester"
},
"home_team": {
"id": 60,
"name": "Bournemouth",
"short_name": "Bournemouth"
},
"away_score": 0,
"has_lineup": false,
"home_score": 2,
"tournament": {
"id": 1,
"name": "Premier League",
"unique_id": 17,
"unique_name": "Premier League"
},
"internal_id": 8676,
"winner_code": 100,
"start_timestamp": 1748185200
}
],
"total_fixtures": 131
},
"status": "success"
}
}About the StatsHub API
Fixtures and Match-Level xG
get_fixtures_by_date accepts a date parameter in YYYY-MM-DD format (defaults to today UTC) and returns an array of fixture objects. Each object includes event_id, home_team.id, away_team.id, final or live scores, tournament, and status. These IDs are the required inputs for get_match_stats, which returns home_xg, away_xg, home_xga, away_xga, and per-player arrays (home_players, away_players) each containing name, expected_goals, goals, shots, and shots_on_target. Only matches that have shotmap data available return meaningful xG figures.
League Standings
get_league_standings takes a tournament_id (e.g. 1 for Premier League, 406 for Peru Liga 1) and an optional season_id. When season_id is omitted it defaults to the latest available season. The response includes a standings array where each team object carries position, points, xg_for, xg_against, possession, wins, draws, losses, plus shot and big-chance counts.
Team Statistics
Two endpoints cover team-level aggregates. get_team_statistics returns a single-call response organized into overview, attack, defence, possession, duels, cards, corners, and other objects keyed by team_id. The attack object includes expected_goals and big_chances; defence includes clean_sheets, tackles, and interceptions. Filters for period, half, home_away, season_id, and competition_id are all optional. get_team_stats covers the same stat categories and additionally returns players (per-player summaries with xG, assists, avg_rating) and fixtures (recent match results with scores and timestamps), at the cost of more internal calls per request.
The StatsHub API is a managed, monitored endpoint for statshub.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when statshub.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 statshub.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?+
- Build a live match dashboard showing home and away xG updating as fixtures progress throughout a matchday.
- Compare league-wide xG-for vs xG-against from standings data to identify over- and under-performing teams in a given season.
- Track player-level shot conversion rates using
expected_goals,goals, andshots_on_targetfromget_match_stats. - Generate weekly reports on team defensive performance using
tackles,interceptions, andclean_sheetsfromget_team_statistics. - Populate a fantasy football tool with player xG and assist data drawn from
get_team_statsplayer summaries. - Filter team stats by
home_awayto analyze home versus away splits in possession and duels across a full season. - Feed league standings xG data into a model to project end-of-season points totals beyond what actual results show.
| 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.
Does StatsHub have an official developer API?+
What does `get_match_stats` return, and when does it not return xG data?+
get_match_stats returns home_xg, away_xg, home_xga, away_xga, and per-player shot stat arrays for both teams. xG figures are aggregated from shot-level data, so only matches that have shotmap coverage will return meaningful values. Matches without shotmap data — typically lower-division or certain non-European fixtures — will not produce populated xG fields.What is the difference between `get_team_stats` and `get_team_statistics`?+
get_team_statistics returns aggregated season-level stats in a single response with no player or fixture data. get_team_stats covers the same stat categories and adds a players array (per-player xG, assists, avg_rating) and a fixtures array of recent results, but uses more internal calls per request, which can affect response time.Are live in-progress match statistics available through this API?+
get_fixtures_by_date returns match status and scores, and get_match_stats reflects data available for a given match at request time, but there is no dedicated live-update or polling endpoint. You can fork the API on Parse and revise it to add a live-match polling endpoint if that data becomes available on StatsHub.Does the API cover historical seasons beyond the current one?+
get_league_standings and both team stat endpoints accept an optional season_id parameter. Omitting it defaults to the latest season, but supplying a known season_id retrieves data for older seasons. The API does not expose an endpoint to list all available season IDs for a given tournament. You can fork the API on Parse and add a season-discovery endpoint to enumerate available seasons by tournament.