Tennis Data logo

Tennis Data

Organization
machina-sports
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. Use when: user asks about tennis scores, match results, tournament draws, ATP/WTA rankings, tennis player info, tennis news, a WTA tournament's entry list, or a WTA player's match history. 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 (college football), cbb-data (college basketball), or fastf1 (F1). For betting odds use polymarket or kalshi. For news use sports-news. Don't use for live point-by-point data — scores update after each set/match.

Overview

Publishermachina-sports
Repositorysports-skills
Skill nametennis-data
Stars
255
Forks
38
Bundled files
5
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 5 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by machina-sports on GitHub. Read the source before you install it.

Installation

Install the Tennis Data AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/machina-sports/sports-skills/tree/main/skills/tennis-data
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/machina-sports/sports-skills.git /tmp/sports-skills
mkdir -p .claude/skills
cp -r /tmp/sports-skills/skills/tennis-data .claude/skills/tennis-data
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tennis Data in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tennis Data on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tennis Data is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Tennis Data (ATP + WTA)

Before writing queries, consult references/api-reference.md for endpoints, ID conventions, and data shapes.

Quick Start

Prefer the CLI — it avoids Python import path issues:

bash
sports-skills tennis get_scoreboard --tour=atp
sports-skills tennis get_rankings --tour=wta
sports-skills tennis get_calendar --tour=atp --year=2026
sports-skills tennis get_wta_entry_list --tournament_id=901 --year=2025
sports-skills tennis get_wta_player_results --player_id=320760 --year=2025 --limit=10

CRITICAL: Before Any Query

CRITICAL: Before calling any data endpoint, verify:

  • The tour parameter is specified (atp or wta) — there is no default.
  • Year is derived from the system prompt's currentDate — never hardcoded.

The tour Parameter

Most ESPN-backed commands require --tour=atp or --tour=wta:

  • ATP: Men's professional tennis tour
  • WTA: Women's professional tennis tour

If the user doesn't specify, ask which tour or show both by calling the command twice.

Commands

CommandDescription
get_scoreboardLive/recent tournament scores for a tour
get_rankingsATP or WTA player rankings
get_calendarFull season tournament calendar
get_player_infoIndividual tennis player profile
get_newsTennis news articles
get_wta_entry_listWTA entry list (singles players and doubles teams) for one tournament edition — WTA API
get_wta_player_resultsA 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.

WTA API Commands Use Native WTA IDs

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.
  • Results are dated by tournament start date (tournament_start_date), not the day each match was played. Never present it as a match date.
  • Matches within one tournament keep the provider's order, which is not guaranteed to be playing order. Don't claim exact within-tournament chronology.
  • winner_code is the provider's raw side code; no win/loss is derived from it. Don't state who won from it.
  • Both commands are WTA-published snapshots (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.

Workflows

Live Tournament Check

  1. get_scoreboard --tour=<atp|wta>
  2. Present current matches by round.
  3. For player info, use get_player_info --player_id=<id>.

Rankings Lookup

  1. get_rankings --tour=<atp|wta> --limit=20
  2. Present rankings with points and trend.

Season Calendar

  1. get_calendar --tour=<atp|wta> --year=<year>
  2. Filter for specific tournament.

WTA Entry List

  1. get_wta_entry_list --tournament_id=<wta_id> --year=<year>
  2. Present each event (format: singles/doubles) with seeds and entry types. It is an entry list, not a draw.

WTA Player Form

  1. get_wta_player_results --player_id=<wta_id> --year=<year> --limit=20
  2. Group by tournament; say these are the most recent count matches, and when has_more is true that earlier matches exist but were not fetched.

Examples

Example 1: Live matches User says: "What ATP matches are happening right now?" Actions:

  1. Call 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:

  1. Call 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:

  1. Derive year from currentDate
  2. Call get_calendar(tour="atp", year=<derived_year>)
  3. Search results for "Roland Garros" (the French Open's official name) Result: French Open dates, location (Paris), and surface (clay)

Commands that DO NOT exist — never call these

  • 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.
  • get_match_stats — does not exist. ESPN publishes no per-match statistics for tennis (aces, double faults, break points): scoreboard statistics 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.

Troubleshooting

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

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Tennis Data AI skill do?

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, tennis news, a WTA tournament's entry list, or a WTA player's match history. 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 (college football), cbb-data (college bas...

Why use Tennis Data on TypingMind?

Because you install it once and use it with any model. Tennis Data is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tennis Data in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/machina-sports/sports-skills/tree/main/skills/tennis-data. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Tennis Data?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tennis Data?

As many as you like. As long as a model supports skills, you can use Tennis Data with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tennis Data AI skill free?

Yes. It is published on GitHub by machina-sports under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇