Observed since 20 Oct, 18:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Python client for the AcesAPI tennis data API. No dependencies.
Python client for the AcesAPI tennis data API. It has no required dependencies (standard library only) and works on Python 3.9 and newer. Pandas is optional.
pip install acesapi
pip install "acesapi[pandas]" # only if you want DataFrames
Get a free key at https://acesapi.com/signup. Free accounts get 500 credits a month.
export ACESAPI_API_KEY=your_key_here
from acesapi import Client
client = Client() # reads ACESAPI_API_KEY
client = Client(api_key="your_key") # or pass it in
ATP is the default tour. Pass league="wta" for the women's tour.
from acesapi import Client
client = Client()
ranks = client.get_rankings(limit=5)
for row in ranks["rankings"]:
print(row["rank"], row["name"], row["points"])
Look up two player ids with search_players, then compare them.
from acesapi import Client
client = Client()
sinner = client.search_players(name="Sinner", limit=1)["players"][0]
alcaraz = client.search_players(name="Alcaraz", limit=1)["players"][0]
h2h = client.get_head_to_head(sinner["player_id"], alcaraz["player_id"])
print(sinner["name"], "vs", alcaraz["name"])
print("matches:", h2h["summary"]["matches"])
print("wins:", h2h["summary"]["wins"])
get_surface_splits shows how a player does on hard, clay and grass.
from acesapi import Client
client = Client()
sinner = client.search_players(name="Sinner", limit=1)["players"][0]
splits = client.get_surface_splits(sinner["player_id"])
for row in splits["splits"]:
print(row["surface"], row["wins"], "-", row["losses"], row["win_pct"])
Every method returns the data object from the response. After each call, client.last_credits_used and client.last_credits_remaining hold the counters from the X-Credits-Used and X-Credits-Remaining headers. Methods that take estimate_only=True return the price of a call without running or charging it.
from acesapi import to_dataframe
df = to_dataframe(data) # finds the main list in the response
df = to_dataframe(data, key="rows") # or name the list yourself
Nested fields become dotted columns. Install pandas separately or with pip install "acesapi[pandas]".
Every error is an APIError subclass, with the server's message and the HTTP status.
| Exception | Status | Meaning |
|---|---|---|
AuthError | 401 | Missing, invalid or revoked key |
InsufficientCreditsError | 402 | Not enough credits for the call |
NotFoundError | 404 | The id or name does not exist |
RateLimitError | 429 | Too many requests; has .retry_after when the server sends it |
APIError | 400, 5xx | Bad arguments or a server problem |
APIConnectionError | none | No response (network or timeout) |
from acesapi import Client, APIError, InsufficientCreditsError, RateLimitError
client = Client()
try:
data = client.list_tournaments()
except InsufficientCreditsError:
print("Out of credits, top up at https://acesapi.com")
except RateLimitError as exc:
print("Slow down, retry after", exc.retry_after)
except APIError as exc:
print(exc.status_code, exc.message)
The client retries 429 and 5xx responses and connection failures up to 3 times with backoff, and honors Retry-After. Set Client(max_retries=0) to turn that off.
If you see CERTIFICATE_VERIFY_FAILED on a python.org install for macOS, run the "Install Certificates.command" script that came with Python, or pip install certifi (the client uses it when present).
Client(
api_key=None, # defaults to $ACESAPI_API_KEY
base_url="https://mcp.acesapi.com", # point at another host
timeout=60.0, # seconds per request
max_retries=3,
)
client.call("tool_name", {"arg": "value"}) calls any tool by name, which helps when the API adds a tool before this package does.
Method names match the API tool names. Arguments are keyword arguments; required ones can also be passed positionally. Each method's docstring lists its arguments (help(client.list_tournaments)).
| Method | Credits | What it does |
|---|---|---|
list_tournaments | 1 | List tournaments |
get_tournament | 2 | Tournament |
get_matches | 2 | Matches |
get_schedule | 2 | Schedule |
get_match | 2 | Match |
search_players | 1 | Search players |
get_player | 5 | Player |
get_player_matches | 5 | Player matches |
get_head_to_head | 3 | Head to head |
get_surface_splits | 3 | Surface splits |
get_player_stats | 3 | Player stats |
get_rankings | 2 | Rankings |
get_ratings | 2 | Ratings |
Full API reference: https://acesapi.com/docs
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.4 | 19 Oct 2026 | 2 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:b584f4342edeb6f7e1bd652b1f0a37f8062198fa0c55a51a71efe0ce0ad4da45