Install any skill in seconds. Free to start, no credit card required.
Get Started Free →ATP and WTA tennis data via ESPN public endpoints — tournament scores, season calendars, player rankings, player profiles, and news. Zero config, no API keys. Use when: user asks about tennis scores, match results, tournament draws, ATP/WTA rankings, tennis player info, or tennis news. Don't use when: user asks about other sports — use football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), golf-data (golf), cricket-data (cricket), cfb-data (col
.claude/skills/machina-sports-tennis-data/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 363% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 38% | 0% |
Before writing queries, consult references/api-reference.md for endpoints, ID conventions, and data shapes.
Prefer the CLI — it avoids Python import path issues:
bashsports-skills tennis get_scoreboard --tour=atp sports-skills tennis get_rankings --tour=wta sports-skills tennis get_calendar --tour=atp --year=2026
CRITICAL: Before calling any data endpoint, verify:
tour parameter is specified (atp or wta) — there is no default.currentDate — never hardcoded.tour ParameterMost 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 |
See references/api-reference.md for full parameter lists and return shapes.
get_scoreboard --tour=<atp|wta>get_player_info --player_id=<id>.get_rankings --tour=<atp|wta> --limit=20get_calendar --tour=<atp|wta> --year=<year>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 status
Example 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 trend
Example 3: Upcoming Grand Slam date User says: "When is the French Open this year?" Actions:
currentDateget_calendar(tour="atp", year=<derived_year>)Result: French Open dates, location (Paris), and surface (clay)
get_matches~~ — does not exist. Use get_scoreboard for current match scores.get_draw~~ — does not exist. Tournament draw data is not available via this API.get_head_to_head~~ — does not exist. Head-to-head records are not available via this API.get_standings~~ — does not exist. Tennis uses get_rankings, not standings.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: 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
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | 16,191 | 14,986 | -7% | 1 | 1 | 0% | 255 | 1,264 | +396% | 0 | 0 | — |
case-22 | pass→pass | 10,832 | 10,373 | -4% | 1 | 1 | 0% | 803 | 1,850 | +130% | 0 | 0 | — |
case-06 | fail→fail | 7,387 | 16,549 | +124% | 1 | 1 | 0% | 243 | 1,363 | +461% | 0 | 0 | — |
case-01 | fail→fail | 9,444 | 17,514 | +85% | 1 | 1 | 0% | 562 | 1,327 | +136% | 0 | 0 | — |
case-02 | fail→fail | 22,588 | 17,328 | -23% | 1 | 1 | 0% | 1,852 | 1,357 | -27% | 0 | 0 | — |
case-03 | fail→fail | 9,260 | 19,836 | +114% | 1 | 1 | 0% | 778 | 1,550 | +99% | 0 | 0 | — |
case-04 | fail→fail | 10,025 | 16,535 | +65% | 1 | 1 | 0% | 746 | 1,316 | +76% | 0 | 0 | — |
case-05 | fail→fail | 16,658 | 26,085 | +57% | 1 | 1 | 0% | 2,460 | 3,533 | +44% | 0 | 0 | — |
case-07 | fail→fail | 17,643 | 18,848 | +7% | 1 | 1 | 0% | 2,632 | 1,424 | -46% | 0 | 0 | — |
case-08 | fail→fail | 9,802 | 13,934 | +42% | 1 | 1 | 0% | 706 | 1,256 | +78% | 0 | 0 | — |
case-09 | fail→pass | 8,610 | 19,926 | +131% | 1 | 1 | 0% | 452 | 2,095 | +363% | 0 | 0 | — |
case-10 | fail→fail | 13,588 | 18,834 | +39% | 1 | 1 | 0% | 1,563 | 1,643 | +5% | 0 | 0 | — |
case-11 | fail→pass | 13,897 | 10,396 | -25% | 1 | 1 | 0% | 1,560 | 1,913 | +23% | 0 | 0 | — |
case-12 | pass→pass | 10,450 | 8,457 | -19% | 1 | 1 | 0% | 784 | 1,480 | +89% | 0 | 0 | — |
case-13 | fail→pass | 16,684 | 9,249 | -45% | 1 | 1 | 0% | 1,749 | 1,642 | -6% | 0 | 0 | — |
case-14 | fail→pass | 16,757 | 8,955 | -47% | 1 | 1 | 0% | 1,824 | 1,698 | -7% | 0 | 0 | — |
case-15 | fail→pass | 16,236 | 33,023 | +103% | 1 | 1 | 0% | 1,865 | 2,571 | +38% | 0 | 0 | — |
case-17 | fail→pass | 10,968 | 10,133 | -8% | 1 | 1 | 0% | 1,036 | 1,894 | +83% | 0 | 0 | — |
case-18 | fail→fail | 9,342 | 14,593 | +56% | 1 | 1 | 0% | 557 | 1,200 | +115% | 0 | 0 | — |
case-19 | fail→fail | 7,982 | 15,212 | +91% | 1 | 1 | 0% | 434 | 1,189 | +174% | 0 | 0 | — |
case-20 | pass→fail | 9,502 | 18,773 | +98% | 1 | 1 | 0% | 718 | 1,777 | +147% | 0 | 0 | — |
case-21 | fail→pass | 17,142 | 26,254 | +53% | 1 | 1 | 0% | 2,433 | 5,207 | +114% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 9 counted toward the lift figure. The other 13 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 9 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/3/2026 | — |
Other measured skills in the registry, with their headline benchmark lift.