npx skills add ...
npx skills add machina-sports/sports-skills --skill tennis-data
ATP and WTA tennis data via ESPN public endpoints — tournament scores, season calendars, player rankings, player profiles, and news. Zero config, no API keys.
npx skills add machina-sports/sports-skills --skill tennis-data
Before writing queries, consult references/api-reference.md for endpoints, ID conventions, and data shapes.
Prefer the CLI — it avoids Python import path issues:
CRITICAL: Before calling any data endpoint, verify:
tour parameter is specified (atp or wta) — there is no default.currentDate — never hardcoded.tour ParameterMost ESPN-backed commands require --tour=atp or --tour=wta:
If the user doesn't specify, ask which tour or show both by calling the command twice.
| Command | Description |
|---|---|
get_scoreboard | Live/recent tournament scores for a tour |
get_rankings | ATP or WTA player rankings |
get_calendar | Full season tournament calendar |
get_player_info | Individual tennis player profile |
get_news | Tennis news articles |
get_wta_entry_list | WTA entry list (singles players and doubles teams) for one tournament edition — WTA API |
get_wta_player_results | A WTA player's most recent match results (bounded window), newest first — WTA API |
See references/api-reference.md for full parameter lists and return shapes.
get_wta_entry_list and get_wta_player_results read the public WTA API (api.wtatennis.com), not ESPN:
tournament_id and player_id are the WTA's own numeric ids, positive decimals with no leading zeros (e.g. tournament 901, player 320760). ESPN ids from get_rankings / get_player_info / get_scoreboard do not work here, and there is no id mapping between the two.get_wta_player_results returns a bounded window of the most recent results (at most limit, optionally within one year), not a career history. There is no total count: has_more only says further matches exist, and history_complete is always false. Never present count as a career or season total.tournament_start_date), not the day each match was played. Never present it as a match date.winner_code is the provider's raw side code; no win/loss is derived from it. Don't state who won from it.source.fetched_at, cached up to 10 minutes). Don't call them complete or live. Under SPORTS_SKILLS_REPLAY=replay/fill, source.fetched_at is null and source.served_at is only local serving time — not data freshness.get_scoreboard --tour=<atp|wta>get_player_info --player_id=<id>.get_rankings --tour=<atp|wta> --limit=20get_calendar --tour=<atp|wta> --year=<year>get_wta_entry_list --tournament_id=<wta_id> --year=<year>format: singles/doubles) with seeds and entry types. It is an entry list, not a draw.get_wta_player_results --player_id=<wta_id> --year=<year> --limit=20count matches, and when has_more is true that earlier matches exist but were not fetched.Example 1: Live matches User says: "What ATP matches are happening right now?" Actions:
get_scoreboard(tour="atp")
Result: Current tournament matches organized by round with scores and statusExample 2: Women's rankings User says: "Show me the WTA rankings" Actions:
get_rankings(tour="wta", limit=20)
Result: Top 20 WTA players with rank, name, points, and trendExample 3: Upcoming Grand Slam date User says: "When is the French Open this year?" Actions:
currentDateget_calendar(tour="atp", year=<derived_year>)get_matchesget_scoreboard for current match scores.get_drawget_head_to_headget_standingsget_rankings, not standings.get_match_statsstatistics lists are empty and the per-match stats endpoint returns "No competitor stats found", even for Grand Slam finals. Only set scores are available.If a command is not listed in the Commands table above, it does not exist.
Error: get_scoreboard returns no matches
Cause: Tennis tournaments run specific weeks; no tournament may be scheduled this week
Solution: Call get_calendar(tour=...) to find when the next event is scheduled
Error: Rankings are empty Cause: Rankings update weekly on Mondays; there may be a brief update window Solution: The command auto-retries previous weeks. If still empty, retry in a few minutes
Error: Player profile fails
Cause: Player ID is incorrect
Solution: Use get_rankings to find player IDs from the current rankings list, or verify via ESPN tennis URLs
Error: get_wta_entry_list / get_wta_player_results rejects the id or returns HTTP 404
Cause: An ESPN id (or a non-numeric value) was passed; these commands take native WTA numeric ids only
Solution: Use the WTA's own tournament/player id. Don't substitute ESPN ids
Error: get_wta_player_results --year=... fails with "outside year ... inconclusive"
Cause: The WTA API returned matches from other years, so it likely ignored the year filter
Solution: Report that the season's results could not be confirmed. Don't retry without year and present those matches as that season
Error: get_wta_entry_list succeeds with count: 0
Cause: The WTA has not published an entry list for that tournament and year, or the id/year pair does not exist
Solution: Read the note field and tell the user no entry list is available — don't report an empty field of players
Error: Scores seem delayed or don't update live
Cause: Scores update after each set/match is completed, not point-by-point
Solution: This is expected behavior. Refresh get_scoreboard periodically for updated set scores