Documentation
13 tennis data endpoints over REST and MCP. One key, credits per call.
Your first call
Sign up for a free key (500 credits, no card), swap it in for YOUR_API_KEY, and send this. search_players costs 1 credit.
Request
curl -X POST https://mcp.acesapi.com/v1/search_players \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"name": "sinner"
}'Response
{
"tour": "ATP",
"players": [
{
"player_id": "3623",
"name": "Jannik Sinner",
"country": "ITA",
"date_of_birth": "2001-08-16",
"matches": 459,
"last_match": "2026-07-12",
"current_rank": 1,
"plays": "right"
}
],
...First 14 lines. Full response and every field
REST / cURL
POST to /v1/{tool_name} with your params as JSON body. No MCP client needed:
curl -X POST https://mcp.acesapi.com/v1/list_tournaments \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY"With parameters:
curl -X POST https://mcp.acesapi.com/v1/search_players \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"name":"sinner"}'Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"acesapi": {
"url": "https://mcp.acesapi.com/mcp?key=YOUR_API_KEY"
}
}
}Claude Code
One command:
claude mcp add acesapi https://mcp.acesapi.com/mcp?key=YOUR_API_KEY --transport streamable-httpFind the right call
All 13 questions- Which tournaments are on grass this year, and who won them?list_tournaments
- What is Jannik Sinner's player id?search_players
- Show me the Wimbledon 2025 draw with every scoreget_tournament
- Every final played this seasonget_matches
- Who plays in the next three days?get_schedule
- How did the Wimbledon final go, set by set?get_match
Endpoints
13 endpoints by category. Each page has parameters, requests in three formats, a full example response and every response field.
Static reference1 credit/call
Basic lookup2 credits/call
- get_tournament2 creditsA tournament's draw and results, round by round, with every set
- get_matches2 creditsMatch results by day, tournament or season, with set and tiebreak scores
- get_schedule2 creditsUpcoming and in-progress matches for the next days
- get_match2 creditsOne match: sets, tiebreak points, seeds, ratings and what the score says
- get_rankings2 creditsWeekly ranking lists since 2007, or one player's ranking history
- get_ratings2 creditsOur Elo ratings, overall or by surface
Stats + aggregation5 credits/call
Reference
Authentication
Every request requires an API key. Pass it via header or query parameter:
x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY
# or (MCP only)
?key=YOUR_API_KEYVerify your email, then create an API key from the dashboard. Free accounts get 500 credits.
Base URL
https://mcp.acesapi.comREST API: POST /v1/{tool} with JSON body. Works with cURL, Python, any HTTP client.
MCP: POST /mcp via Streamable HTTP. Works with Claude Desktop, Claude Code, Cursor, and any MCP client.
Rate limits
| Credit balance | Rate limit |
|---|---|
| 100 credits or more | 60 req/min |
| Under 100 credits | 10 req/min |
The limit is the same on every plan. It is burst protection, not the spend boundary; credits are that, and they are enforced per request. Running low slows you down so you notice before the balance reaches zero.
Error handling
| Code | Meaning | What to do |
|---|---|---|
| 400 | Invalid parameters | Check required fields and value types |
| 401 | Invalid or missing API key | Check your x-api-key header |
| 402 | Insufficient credits | Top up your wallet or upgrade your plan |
| 429 | Rate limit exceeded | Wait and retry (see limits above) |
| 500 | Server error | Retry with idempotency key. Credits auto-refund on server errors. |
Pass x-idempotency-key or x-request-id headers to make retries duplicate-safe.
Data coverage
WTA Tour (women's professional tennis) (WTA)
AcesAPI also serves the WTA. Pass "league": "wta" to any tool that lists it, or connect to https://mcp.acesapi.com/mcp/wta. What the WTA data covers.
| Data | Status | Coverage | Volume |
|---|---|---|---|
Matches and scores Players, seeds, round, status, every set's games and tiebreak points, retirements and walkovers. Singles only. Main draws from 2007, qualifying from 2022. About 0.6% of records ESPN left mid-match are marked incomplete. | Available | 2007 to current | 124,000+ finished singles matches, both tours |
Tournaments and draws Dates, city, surface, Grand Slam flag, each round's matches and the champion. Surface is from our own reference: placed for 99.6% of ATP and 96% of WTA matches, null for the rest. | Available | 2007 to current | About 60 to 75 ATP and 55 to 110 WTA tournaments a year |
Players Date of birth, country, height, playing hand, career record, titles, head to head and records by surface. | Available | Everyone in a listed match | Profiles and careers |
Rankings Rank, previous rank and points per weekly list, and each player's ranking history. ESPN keeps 35 to 49 lists a year per tour; the other weeks are missing. | Partial | 2007 to current | Top 100 to 150, most weeks |
Ratings Our Elo, overall and per surface, before and after every match. | Available | 2007 to current | Every player, every completed match |
Coverage describes the datasets AcesAPI supports. Freshness and operational health are tracked separately.
Odds snapshot definitions
opening: The first moneyline a sportsbook posted for the match.
closing: The sportsbook's last moneyline before the match.
Odds coverage currently documents none yet: ESPN publishes no tennis lines. No sportsbook lines for tennis. There are no tennis lines yet: ESPN publishes none. The odds endpoint stays off until a licensed source is added.
Response format
REST API
All successful REST responses wrap the result in a data key:
{ "data": { "events": [...], "count": 50 } }Error responses return:
{ "error": "Insufficient credits", "message": "This tool costs 5 credits, you have 2" }MCP Protocol
MCP responses follow the standard MCP tool result format. The data is returned directly (no data wrapper). Both access methods return identical data, just different envelopes.
Conventions
Seasons: 4-digit year (tournaments are grouped by calendar year). Example: 2025.
Fight IDs: a match's id, e.g. 157774 (an ESPN match id; list a tournament's matches with get_tournament). Get them from get_event, get_schedule or get_fighter_fights.
Fighter IDs: Get them from search_fighters, by name or nickname.
Pagination: Endpoints use a limit parameter. No cursor or offset. Narrow your filters to get different slices of data.
Credits: Deducted before the request executes. Automatically refunded on server errors. Monthly credits are used first, then wallet balance.