Skip to content

Guides

How do I get a tennis player's season stats in Python?

A player's season record counted from scores: wins, sets, tiebreaks, and results by round and opponent ranking. Jannik Sinner was 44-3 in 2026.

Code verified October 12, 2026. One call to get_player_stats, 3 credits.

The call

player_id comes from search_players. Leave season out for every season. Everything is counted from scores, so there are no serve statistics. Pass league: "wta" for a WTA player.

import requests
import pandas as pd

API_KEY = "YOUR_API_KEY"

resp = requests.post(
    "https://mcp.acesapi.com/v1/get_player_stats",
    headers={"x-api-key": API_KEY},
    json={
        "player_id": "3623",
        "season": 2026,
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]

s = data["by_season"][0]
print(data["name"], s["season"], f'{s["wins"]}-{s["losses"]}', "sets", f'{s["sets_won"]}-{s["sets_lost"]}', "tiebreaks", f'{s["tiebreaks_won"]}-{s["tiebreaks_lost"]}')
print(pd.DataFrame(data["by_opponent_rank"])[["opponent_rank", "wins", "losses", "win_pct"]].to_string(index=False))
print(pd.DataFrame(data["by_round"])[["round", "wins", "losses", "win_pct"]].to_string(index=False))

Replace YOUR_API_KEY with a key from your dashboard. Python needs requests and pandas (pip install requests pandas). JavaScript runs on Node 18 or newer, or in the browser.

What comes back

The data object of the response, trimmed to the first rows. Every field is real output from the run above.

{
  "tour": "ATP",
  "player_id": "3623",
  "name": "Jannik Sinner",
  "season": 2026,
  "by_season": [
    {
      "season": 2026,
      "wins": 44,
      "losses": 3,
      "win_pct": 0.936,
      "sets_won": 104,
      "sets_lost": 15,
      "games_won": 712,
      "games_lost": 439,
      "games_won_pct": 0.619,
      "tiebreaks_won": 14,
      "tiebreaks_lost": 5,
      "deciding_sets": 7,
      "deciding_sets_won": 4,
      "sets_won_6_0": 2,
      "sets_lost_0_6": 0,
      "wins_by_retirement": 1,
      "retired_or_lost_to_ret": 0
    }
  ],
  "by_round": [
    {
      "draw": "main",
      "round": "Round 1",
      "round_order": 11,
      "wins": 4,
      "losses": 0,
      "win_pct": 1,
      "sets_won": 9,
      "sets_lost": 2,
      "games_won": 70,
      "games_lost": 37,
      "games_won_pct": 0.654,
      "tiebreaks_won": 0,
      "tiebreaks_lost": 1,
      "deciding_sets": 1,
      "deciding_sets_won": 1,
      "sets_won_6_0": 0,
      "sets_lost_0_6": 0,
      "wins_by_retirement": 1,
      "retired_or_lost_to_ret": 0
    },
    {
      "draw": "main",
      "round": "Round 2",
      "round_order": 12,
      "wins": 8,
      "losses": 1,
      "win_pct": 0.889,
      "sets_won": 20,
      "sets_lost": 4,
      "games_won": 136,
      "games_lost": 85,
      "games_won_pct": 0.615,
      "tiebreaks_won": 2,
      "tiebreaks_lost": 1,
      "deciding_sets": 2,
      "deciding_sets_won": 1,
      "sets_won_6_0": 1,
      "sets_lost_0_6": 0,
      "wins_by_retirement": 0,
      "retired_or_lost_to_ret": 0
    },
    "...5 more"
  ],
  "by_opponent_rank": [
    {
      "opponent_rank": "top 10",
      "wins": 11,
      "losses": 1,
      "win_pct": 0.917,
      "sets_won": 27,
      "sets_lost": 5,
      "games_won": 189,
      "games_lost": 132,
      "games_won_pct": 0.589,
      "tiebreaks_won": 5,
      "tiebreaks_lost": 1,
      "deciding_sets": 2,
      "deciding_sets_won": 1,
      "sets_won_6_0": 0,
      "sets_lost_0_6": 0,
      "wins_by_retirement": 0,
      "retired_or_lost_to_ret": 0
    },
    {
      "opponent_rank": "11-50",
      "wins": 18,
      "losses": 1,
      "win_pct": 0.947,
      "sets_won": 40,
      "sets_lost": 5,
      "games_won": 274,
      "games_lost": 164,
      "games_won_pct": 0.626,
      "tiebreaks_won": 7,
      "tiebreaks_lost": 3,
      "deciding_sets": 3,
      "deciding_sets_won": 2,
      "sets_won_6_0": 1,
      "sets_lost_0_6": 0,
      "wins_by_retirement": 0,
      "retired_or_lost_to_ret": 0
    },
    "...2 more"
  ],
  "note": "Counted from scores (completed and retired matches; walkovers excluded). Opponent rank is the opponent's latest ESPN-listed rank on or before the match; ESPN keeps the top 100 to 150 for most weeks since 2007."
}

What to do next

More guides

Start with 500 free credits every month

No card. REST or MCP.