Skills football-data
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/antonelli182/sports-skills-football-data" ~/.claude/skills/clawdbot-skills-football-data-209fe7 && rm -rf "$T"
skills/antonelli182/sports-skills-football-data/SKILL.mdFootball Data
Before writing queries, consult
references/api-reference.md for endpoints, ID conventions, and data shapes.
Setup
Before first use, check if the CLI is available:
which sports-skills || pip install sports-skills
If
pip install fails (package not found or Python version error), install from GitHub:
pip install git+https://github.com/machina-sports/sports-skills.git
The package requires Python 3.10+. If your default Python is older, use a specific version:
python3 --version # check version # If < 3.10, try: python3.12 -m pip install sports-skills # On macOS with Homebrew: /opt/homebrew/bin/python3.12 -m pip install sports-skills
No API keys required.
Quick Start
Prefer the CLI — it avoids Python import path issues:
sports-skills football get_daily_schedule sports-skills football get_season_standings --season_id=premier-league-2025
Python SDK (alternative):
from sports_skills import football standings = football.get_season_standings(season_id="premier-league-2025") schedule = football.get_daily_schedule()
CRITICAL: Before Any Query
CRITICAL: Before calling any data endpoint, verify:
- Season ID is derived from
— never hardcoded.get_current_season(competition_id="...") - Team ID is verified via
if only a name is provided.search_team(query="...")
andget_event_xg
(with xG) are only called for top-5 leagues (EPL, La Liga, Bundesliga, Serie A, Ligue 1).get_event_players_statistics
andget_season_leaders
are only called for Premier League seasons (season_id must start withget_missing_players
).premier-league-
Choosing the Season
Derive the current year from the system prompt's date (e.g.,
currentDate: 2026-02-16 → current year is 2026).
- If the user specifies a season, use it as-is.
- If the user says "current", "latest", or doesn't specify: Call
to get the active season_id. Do NOT guess or hardcode the year.get_current_season(competition_id="...") - Season format: Always
(e.g.,{league-slug}-{year}
for the 2025-26 season). The year is the start year of the season, not the end year."premier-league-2025" - MLS exception: MLS runs spring-fall within a single calendar year. Use
.get_current_season(competition_id="mls")
Commands
| Command | Description |
|---|---|
| Detect current season for a competition |
| List available competitions with current season info |
| Available seasons for a competition |
| Full season match schedule |
| League table for a season |
| Top scorers/leaders (Premier League only) |
| Teams in a season |
| Search for a team by name |
| Search for a player by name |
| Basic team info (no squad/roster) |
| All matches for a date across all leagues |
| Match summary with scores |
| Match lineups |
| Match team statistics |
| Match timeline (goals, cards, subs) |
| Schedule for a specific team |
| UNAVAILABLE — returns empty |
| xG data (top 5 leagues only) |
| Player-level match stats with optional xG |
| Injured/doubtful players (Premier League only) |
| Transfer history via Transfermarkt |
| Player season stats via ESPN |
| Player profile (FPL and/or Transfermarkt) |
See
references/api-reference.md for full parameter lists, return shapes, and data coverage table.
Examples
Example 1: Premier League table User says: "Show me the Premier League table" Actions:
- Call
to get the current season_idget_current_season(competition_id="premier-league") - Call
Result: Standings table with position, team, played, won, drawn, lost, GD, pointsget_season_standings(season_id=<season_id from step 1>)
Example 2: Match report User says: "How did Arsenal vs Liverpool go?" Actions:
- Call
orget_daily_schedule()
to find the event_idget_team_schedule(team_id="359") - Call
for the scoreget_event_summary(event_id="...") - Call
for possession, shots, etc.get_event_statistics(event_id="...") - Call
for xG comparison (EPL — top 5 only) Result: Match report with scores, key stats, and xGget_event_xg(event_id="...")
Example 3: Team deep dive User says: "Deep dive on Chelsea's recent form" Actions:
- Call
→ team_id=363, competition=premier-leaguesearch_team(query="Chelsea") - Call
→ find recent closed eventsget_team_schedule(team_id="363", competition_id="premier-league") - For each recent match, call in parallel:
,get_event_xg
,get_event_statisticsget_event_players_statistics - Call
→ filter Chelsea's injured/doubtful players Result: xG trend across matches, key player stats, and injury reportget_missing_players(season_id=<season_id>)
Example 4: Player market value User says: "What's Saka's market value?" Actions:
- Call
for Transfermarkt dataget_player_profile(tm_player_id="433177") - Optionally add
for FPL stats Result: Market value, value history, and transfer historyfpl_id
Example 5: Non-PL club User says: "Tell me about Corinthians" Actions:
- Call
→ team_id=874, competition=serie-a-brazilsearch_team(query="Corinthians") - Call
for fixturesget_team_schedule(team_id="874", competition_id="serie-a-brazil") - Pick a recent match and call
for goals, cards, subs Result: Fixtures, timeline events (note: xG, FPL stats, and season leaders NOT available for Brazilian Serie A)get_event_timeline(event_id="...")
Commands that DO NOT exist — never call these
— the correct command isget_standings
(requiresget_season_standings
).season_id— not available. Useget_live_scores
for today's matches.get_daily_schedule()/get_team_squad—get_team_roster
does NOT return players. Useget_team_profile
for PL player IDs, thenget_season_leaders
.get_player_profile— the correct command isget_transfers
(requiresget_season_transfers
+season_id
).tm_player_ids/get_match_results— useget_match
with anget_event_summary
.event_id— useget_player_stats
for match-level stats, orget_event_players_statistics
for career data.get_player_profile/get_scores— useget_results
with anget_event_summary
.event_id— useget_fixtures
for today's matches orget_daily_schedule
for a full season.get_season_schedule— useget_league_table
with aget_season_standings
.season_id
If a command is not in the Commands table above, it does not exist. Do not try commands not listed.
Error Handling
When a command fails (wrong event_id, missing data, network error, etc.), do not surface the raw error to the user. Instead:
- Catch it silently — treat the failure as an exploratory miss.
- Try alternatives — if an event_id returns no data, call
orget_daily_schedule()
to discover the correct ID.get_team_schedule() - Only report failure after exhausting alternatives — use a clean message (e.g., "I couldn't find that match — can you confirm the teams or date?").
Troubleshooting
Error:
sports-skills command not found
Cause: Package not installed
Solution: Run pip install sports-skills. If not on PyPI, install from GitHub: pip install git+https://github.com/machina-sports/sports-skills.git
Error:
ModuleNotFoundError: No module named 'sports_skills'
Cause: Package not installed or path issue
Solution: Install the package. Prefer the CLI over Python imports to avoid path issues
Error:
get_season_leaders or get_missing_players returns empty for a non-PL league
Cause: These commands only work for Premier League; they silently return empty for other leagues
Solution: Check the Data Coverage table in references/api-reference.md. For other leagues, use get_event_players_statistics for player data
Error:
get_team_profile returns no players
Cause: This command does not return squad rosters — this is expected behavior
Solution: For PL teams, use get_season_leaders to find player FPL IDs, then get_player_profile(fpl_id="...")
Error: Wrong season_id format Cause: Season ID must follow the
{league-slug}-{year} format
Solution: Use get_current_season(competition_id="...") to discover the correct format. Example: "premier-league-2025", not "2025-2026" or "EPL-2025"
Error: No xG data for a recent match Cause: Understat data may lag 24-48 hours after a match ends Solution: If
get_event_xg returns empty for a recent top-5 match, retry later. Only available for EPL, La Liga, Bundesliga, Serie A, Ligue 1
Error: Team or event ID unknown Cause: ID was guessed instead of looked up Solution: Use
search_team(query="team name") to find team IDs, or get_daily_schedule / get_season_schedule to find event IDs. Never guess IDs.