
football-data
Football (soccer) data across the world's major leagues — standings, schedules, match stats, xG, transfers, player profiles, head-to-head history, team strength (Elo), and match forecasts. Zero config, no API keys. Covers Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, World Cup, Championship, Serie B, Eredivisie, Primeira Liga, Serie A Brazil, Russian Premier League, Scottish/Belgian/Turkish top flights, European Championship, and more (call getcompetitions for the live list). Use when: user asks about football/soccer standings, fixtures, match stats, xG, lineups, player values, transfers, injury news, league tables, daily fixtures, player profiles, head-to-head records, team strength/Elo ratings, or match odds/forecasts. Don't use when: user asks about American football/NFL (use nfl-data), college football (use cfb-data), NBA (use nba-data), WNBA (use wnba-data), college basketball (use cbb-data), NHL (use nhl-data), MLB (use mlb-data), tennis (use tenn
- Installs
- 2.3K
- Last 24h
- +10
- Trending rank
- #8663
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/machina-sports/sports-skills --skill football-data- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads football-data automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Football 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
get_current_season(competition_id="...")— never hardcoded. - Team ID is resolved via
search_team(query="...")and passed as the numericteam_id. Forget_head_to_head,get_team_strength, andget_match_forecast, always pass IDs — ambiguous names (e.g. two "Paris" clubs) can resolve to the wrong team. - The endpoint actually covers the league in question — see the Coverage & Source Map below. Coverage is uneven across sources; an uncovered call returns an empty payload with a
message, not data. get_event_xgandget_event_players_statistics(with xG) are only called for top-5 leagues (EPL, La Liga, Bundesliga, Serie A, Ligue 1).get_season_leadersandget_missing_playersare only called for Premier League seasons (season_id must start withpremier-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
get_current_season(competition_id="...")to get the active season_id. Do NOT guess or hardcode the year. - Season format: Always
{league-slug}-{year}(e.g.,"premier-league-2025"for the 2025-26 season). The year is the start year of the season, not the end year. - MLS exception: MLS runs spring-fall within a single calendar year. Use
get_current_season(competition_id="mls").
Coverage & Source Map
This skill stitches several free sources together. Coverage is not uniform — each endpoint works only where its underlying source has data. Check this before promising an answer; when an endpoint isn't covered, it returns an empty payload with an explanatory message (never an error) — read that message and fall back.
| Endpoint(s) | Source | Coverage |
|---|---|---|
| standings, schedules, teams, event summary/lineups/stats/timeline | ESPN | All leagues (broadest — the backbone) |
get_event_xg, get_event_players_statistics (xG fields) | Understat | Top 5 only (EPL, La Liga, Bundesliga, Serie A, Ligue 1). Not RFPL — Understat dropped it. No Serie B or Championship either. |
get_season_leaders, get_missing_players | FPL | Premier League only |
get_player_profile, get_season_transfers (market value) | Transfermarkt | Any player with a tm_player_id |
get_head_to_head | football-data.co.uk | 12 European domestic leagues (EPL, Championship, La Liga, Serie A, Serie B, Bundesliga, Ligue 1, Eredivisie, Primeira Liga, Scottish, Belgian, Turkish). Same-division meetings only. |
get_team_strength | ClubElo, falling back to local Elo | European clubs (incl. Russia). Falls back to ratings computed from football-data.co.uk when ClubElo is down. |
get_match_forecast | ClubElo | European clubs (incl. Russia). No fallback — needs ClubElo's fixture feed. |
Rule of thumb: ESPN answers "what happened" everywhere; the enrichment sources ( Understat/FPL/ClubElo/football-data.co.uk ) add depth only in their coverage zone. ESPN is always the fixture/score authority — never let an enrichment source override an ESPN score.
Gotchas (from live testing)
get_team_profilereturns the squad.data.players[]carries the current roster with ESPN athlete ids, shirt numbers and ages — use it instead of collecting names match by match.get_player_season_statstakes the same league slug as everything else (serie-a-brazil, not only ESPN'sbra.1), and its gamelog is the last ~5 matches across competitions, not a season total.- Scored penalties are
penalty_goalin the timeline. Countgoal+penalty_goal+own_goalwhen reconciling with the score. - Stoppage time is
added_time. A 45+2' event hasminute: 45, added_time: 2(0 outside stoppage time). - Pass IDs, not ambiguous names. For H2H/strength/forecast, resolve teams with
search_teamfirst and pass the numericteam_id. Names like "Paris Saint-Germain" can collapse onto the wrong club (Paris FC) during name resolution. - ClubElo off-season gaps: current-date
get_team_strengthcan miss clubs in the summer break (a club's weekly Elo period may not span today). If a well-known club returns unresolved, pass an in-seasondate(e.g.date="2026-03-01"). - ClubElo outages:
get_team_strengthfalls back to locally computed Elo and setssource: "local-elo". Check that field before comparing numbers across calls — the local scale is division-local, so a rating means nothing outside its own division and cross-division comparisons are refused. The fallback honoursdate(it rates the division as of that date, and each entry'sas_ofis the last match counted).get_match_forecasthas no fallback and stays empty. get_match_forecastis short-horizon: ClubElo only forecasts ~a week ahead — empty between matchdays / off-season. That's expected, not a failure.- H2H is same-division only: two clubs that met in a cup or across tiers won't show; it counts league meetings in the resolved division.
- H2H tells "unresolved" apart from "never met": football-data.co.uk uses short exonyms/abbreviations ("FC Koln", "M'gladbach", "Sp Lisbon"). Each club in
teams[]reportsresolved+matched_as; if a club isresolved: false, zero meetings means the lookup failed, not that the clubs never played.
Combining Endpoints (mix-and-match)
Compose sources for richer answers. Run independent calls in parallel.
- Match preview (
X vs Y):search_team×2 →get_head_to_head(recent record) +get_team_strength(team_id, team_id_2)(Elo gap / favorite) +get_match_forecast(if within ~a week: W/D/L + scoreline). For a top-5 fixture add historicalget_event_xgcontext from recent meetings. - Match report (post-game):
get_event_summary+get_event_statistics+get_event_timeline, and for top-5 leaguesget_event_xg+get_event_players_statistics. - Team form + context:
get_team_schedule(recent results) +get_team_strength(current Elo & rank) +get_missing_players(PL only) + per-matchget_event_xg(top-5). - Rivalry / derby deep dive:
get_head_to_head(all-time-ish record + goals) +get_team_strengthcomparison for the current power balance. - Odds sanity-check:
get_match_forecastgives a free model baseline (W/D/L) to compare against thekalshi/polymarketbetting skills.
When a piece of the composition isn't covered (e.g. xG outside the top 5, H2H for MLS), skip it silently and deliver the parts that are covered — don't block the whole answer on one missing source.
Commands
| Command | Description |
|---|---|
get_current_season | Detect current season for a competition |
get_competitions | List available competitions with current season info |
get_competition_seasons | Available seasons for a competition |
get_season_schedule | Full season match schedule |
get_season_standings | League table for a season |
get_season_leaders | Top scorers/leaders (Premier League only) |
get_season_teams | Teams in a season |
search_team | Search for a team by name |
search_player | Search for a player by name |
get_team_profile | Team info + current squad (roster) |
get_daily_schedule | All matches for a date across all leagues |
get_event_summary | Match summary with scores |
get_event_lineups | Match lineups |
get_event_statistics | Match team statistics |
get_event_timeline | Match timeline (goals, cards, subs) |
get_team_schedule | Schedule for a specific team |
get_head_to_head | Historical H2H results + stats (European domestic leagues) |
get_team_strength | Elo rating / two-team comparison (European clubs); local-Elo fallback if ClubElo is down |
get_match_forecast | ClubElo win/draw/loss + scoreline forecast (~week ahead) |
get_event_xg | xG data (top 5 leagues only) |
get_event_players_statistics | Player-level match stats with optional xG |
get_missing_players | Injured/doubtful players (Premier League only) |
get_season_transfers | Transfer history via Transfermarkt |
get_player_season_stats | Player season stats via ESPN |
get_player_profile | 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
get_current_season(competition_id="premier-league")to get the current season_id - Call
get_season_standings(season_id=<season_id from step 1>)Result: Standings table with position, team, played, won, drawn, lost, GD, points
Example 2: Match report User says: "How did Arsenal vs Liverpool go?" Actions:
- Call
get_daily_schedule()orget_team_schedule(team_id="359")to find the event_id - Call
get_event_summary(event_id="...")for the score - Call
get_event_statistics(event_id="...")for possession, shots, etc. - Call
get_event_xg(event_id="...")for xG comparison (EPL — top 5 only) Result: Match report with scores, key stats, and xG
Example 3: Team deep dive User says: "Deep dive on Chelsea's recent form" Actions:
- Call
search_team(query="Chelsea")→ team_id=363, competition=premier-league - Call
get_team_schedule(team_id="363", competition_id="premier-league")→ find recent closed events - For each recent match, call in parallel:
get_event_xg,get_event_statistics,get_event_players_statistics - Call
get_missing_players(season_id=<season_id>)→ filter Chelsea's injured/doubtful players Result: xG trend across matches, key player stats, and injury report
Example 4: Player market value User says: "What's Saka's market value?" Actions:
- Call
get_player_profile(tm_player_id="433177")for Transfermarkt data - Optionally add
fpl_idfor FPL stats Result: Market value, value history, and transfer history
Example 5: Non-PL club User says: "Tell me about Corinthians" Actions:
- Call
search_team(query="Corinthians")→ team_id=874, competition=serie-a-brazil - Call
get_team_schedule(team_id="874", competition_id="serie-a-brazil")for fixtures - Pick a recent match and call
get_event_timeline(event_id="...")for goals, cards, subs Result: Fixtures, timeline events (note: xG, FPL stats, and season leaders NOT available for Brazilian Serie A)
Example 6: Match preview (mix-and-match) User says: "Preview Arsenal vs Man City this weekend" Actions:
- Call
search_team(query="Arsenal")andsearch_team(query="Manchester City")→ team_ids 359, 382 - In parallel:
get_head_to_head(team_id="359", team_id_2="382")(recent record + goals),get_team_strength(team_id="359", team_id_2="382")(Elo gap + favorite),get_match_forecast(team_id="359", team_id_2="382")(W/D/L + likely scoreline, if within ~a week) - Synthesize: form/record + power balance + model odds. Skip any piece that returns empty (e.g. forecast if the match is >1 week out). Result: A preview blending head-to-head history, current strength, and a free model forecast
Commands that DO NOT exist — never call these
— the correct command isget_standingsget_season_standings(requiresseason_id).— not available. Useget_live_scoresget_daily_schedule()for today's matches./get_team_squad— useget_team_rosterget_team_profile:data.players[]is the current roster with ESPN athlete ids (see Gotchas).get_season_leaders+get_player_profileremain the path for career data.— the correct command isget_transfersget_season_transfers(requiresseason_id+tm_player_ids)./get_match_results— useget_matchget_event_summarywith anevent_id.— useget_player_statsget_event_players_statisticsfor match-level stats, orget_player_profilefor career data./get_scores— useget_resultsget_event_summarywith anevent_id.— useget_fixturesget_daily_schedulefor today's matches orget_season_schedulefor a full season.— useget_league_tableget_season_standingswith aseason_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
get_daily_schedule()orget_team_schedule()to discover the correct ID. - 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: ESPN has no roster for that team id in the given league (wrong league_slug, or a national team / youth side)
Solution: Pass the league_slug the club plays in (e.g. serie-a-brazil); for match-day squads use get_event_lineups
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.
FAQ
What does the football-data skill do?
Football (soccer) data across the world's major leagues — standings, schedules, match stats, xG, transfers, player profiles, head-to-head history, team strength (Elo), and match forecasts. Zero config, no API keys. Covers Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, World Cup, Championship, Serie B, Eredivisie, Primeira Liga, Serie A Brazil, Russian Premier League, Scottish/Belgian/Turkish top flights, European Championship, and more (call getcompetitions for the live list). Use when: user asks about football/soccer standings, fixtures, match stats, xG, lineups, player values, transfers, injury news, league tables, daily fixtures, player profiles, head-to-head records, team strength/Elo ratings, or match odds/forecasts. Don't use when: user asks about American football/NFL (use nfl-data), college football (use cfb-data), NBA (use nba-data), WNBA (use wnba-data), college basketball (use cbb-data), NHL (use nhl-data), MLB (use mlb-data), tennis (use tenn
How do I install football-data?
Run npx skills add https://github.com/machina-sports/sports-skills --skill football-data in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/football-data/ (personal) or .claude/skills/football-data/ (project).
Which AI agents can use football-data?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is football-data safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains football-data?
It is published by machina-sports in machina-sports/sports-skills. It has 2,330 recorded installs.
More from machina-sports/sports-skills
betting
machina-sports/sports-skills
Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer probabilities). Use when: user asks about bet sizing, expected value, edge analysis, Kelly criterion, arbitrage, parlays, line movement, odds conversion, or comparing odds across sources. Also use when you have odds from ESPN and a prediction market price and want to evaluate whether a bet has positive expected value. Don't use when: user asks for live odds or market data — use polymarket, kalshi, or the sport-specific skill to fetch odds first, then use this skill to analyze them.
polymarket
machina-sports/sports-skills
Polymarket sports prediction markets — read-only live odds, prices, order books, events, series, and market search. No auth required. Covers NFL, NBA, MLB, football (EPL, UCL, La Liga), tennis, cricket, MMA, esports. Supports moneyline, spreads, totals, and player props. Use when: user asks about sports betting odds, prediction markets, win probabilities, market sentiment, or "who is favored to win" questions and only needs read-only market intelligence. Don't use when: user asks about actual match results, scores, or statistics — use the sport-specific skill. Don't use for historical match data. Don't use for news — use sports-news instead. Don't use for placing, cancelling, or managing orders — use the separate polymarket-trading skill only after explicit user approval.
sports-news
machina-sports/sports-skills
Sports news via RSS/Atom feeds and Google News. Fetch headlines, search by query, filter by date. Covers football news, transfer rumors, match reports, and any sport via Google News. Use when: user asks for recent news, headlines, transfer rumors, or articles about any sport. Good for "what's the latest on [team/player]" questions. Supports any Google News query and curated RSS feeds (BBC Sport, ESPN, The Athletic, Sky Sports). Don't use when: user asks for structured data like standings, scores, statistics, or xG — use the sport-specific skill instead: football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), tennis-data (tennis), golf-data (golf), cricket-data (cricket), cfb-data (college football), cbb-data (college basketball), or fastf1 (F1). Don't use for prediction market odds — use polymarket or kalshi. News results are text articles, not structured data.
kalshi
machina-sports/sports-skills
Kalshi prediction markets — events, series, markets, trades, and candlestick data. Public API, no auth required for reads. US-regulated exchange (CFTC). Covers football (EPL, UCL, La Liga), basketball, baseball, tennis, NFL, hockey event contracts. Use when: user asks about Kalshi-specific markets, event contracts, CFTC-regulated prediction markets, or candlestick/OHLC price history on sports outcomes. Don't use when: user asks about actual match results, scores, or statistics — use the sport-specific skill: football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), tennis-data (tennis), golf-data (golf), cricket-data (cricket), cfb-data (college football), cbb-data (college basketball), or fastf1 (F1). Don't use for general "who will win" questions unless Kalshi is specifically mentioned — try polymarket first (broader sports coverage). Don't use for news — use sports-news instead.
nba-data
machina-sports/sports-skills
NBA data via ESPN public endpoints, the NBA live CDN, and NBA Stats (stats.nba.com) — scores, standings, rosters, schedules, game summaries, play-by-play, injuries, futures, depth charts, leaders, and news, plus an analytics backend: advanced ratings, per-shot court coordinates, career splits, and history to 1946. Zero config, no API keys. Use when: user asks about NBA scores, standings, team rosters, schedules, game stats, box scores, play-by-play, injuries, transactions, betting futures, depth charts, team/player statistics, NBA news, shot charts, advanced ratings/pace, career stats, or historical NBA seasons. Don't use when: user asks about WNBA (use wnba-data), college basketball (use cbb-data), or other sports.
markets
machina-sports/sports-skills
Markets orchestration — connects ESPN live schedules with Kalshi and Polymarket prediction markets. Unified dashboards, odds comparison, entity search, and bet evaluation across platforms. Use when: user wants to see prediction market odds alongside ESPN game schedules, compare odds across platforms, search for a team/player on Kalshi or Polymarket, check for arbitrage between ESPN odds and prediction markets, or evaluate a specific game's market value. Don't use when: user wants raw prediction market data without ESPN context — use polymarket or kalshi directly. For pure odds math (conversion, de-vigging, Kelly) — use betting. For live scores without market data — use the sport-specific skill.
Popular backend & apis skills
find-skills
vercel-labs/skills
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
entra-app-registration
microsoft/azure-skills
Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration. USE FOR: create app registration, register Azure AD app, configure OAuth, set up authentication, add API permissions, generate service principal, MSAL example, console app auth, Entra ID setup, Azure AD authentication. DO NOT USE FOR: Key Vault secrets (use azure-keyvault-expiration-audit), general Azure resource security guidance.
google-agents-cli-adk-code
google/agents-cli
This skill should be used when the user wants to "write agent code", "build an agent with ADK", "add a tool", "create a callback", "define an agent", "use state management" — in a project that needs ADK (Agent Development Kit) API patterns and code examples. It provides a quick reference for agent types, tool definitions, orchestration patterns, callbacks, state management, the graph Workflow API, and reference recipes to study. Do NOT use for scaffolding (use google-agents-cli-scaffold) or deployment (use google-agents-cli-deploy).
embedded-captions
heygen-com/hyperframes
Add captions or subtitles to an existing single-subject talking-head video without editing the footage. Use for plain verbatim captions, cinematic captions embedded behind the subject, VFX captions, “炸/特效/酷炫字幕,” or a named identity from the 35-style catalog. Route by visual identity, not by backend engine. The quiet anchor rail is the default; embed every word only when the user explicitly wants a fully cinematic treatment. The workflow runs locally end to end, including transcription and subject matting; split multi-shot footage before applying it.
entra-agent-id
microsoft/azure-skills
Provision Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configure OAuth 2.0 token exchange (fmipath, OBO, cross-tenant) including the Microsoft Entra SDK for AgentID sidecar. USE FOR: Agent Identity Blueprint, BlueprintPrincipal, agent OAuth, fmipath token exchange, agent OBO, Workload Identity Federation for agents, polyglot agent auth, Microsoft.Identity.Web.AgentIdentities. DO NOT USE FOR: standard Entra app registration (use entra-app-registration), Microsoft Foundry agent authoring (use microsoft-foundry).
neon
neondatabase/agent-skills
Overview of Neon, a complete set of cloud backend primitives around Lakebase Postgres: Auth, Object Storage, Functions, the AI Gateway, and Realtime. Start here to choose Neon for undecided login, files, APIs, and LLM calls, set up the CLI or MCP server, and follow the branch-first workflow. Use when building an app or backend on Neon, or when "Neon" or "Lakebase Postgres" is mentioned. Child skill neon-postgres wins for an existing DATABASEURL, SQL, schema, inspect, or search. Child skill neon-auth wins for login, users, sessions, identity routing, and Managed Better Auth setup. Child skill neon-realtime wins for live queries in reactive apps and agents. Also use for object storage, S3, buckets, serverless functions, function triggers, cron, AI gateway, LLM calls, realtime, logs, Loki, Grafana, observability, postgres, database, backend, Claimable Neon, neon.new, or a no-signup database.