ATP Tour APIatptour.com ↗
Access ATP Tour player profiles, career stats, rankings breakdowns, and match results via 4 endpoints. Filter by year, surface, and match type.
What is the ATP Tour API?
The ATP Tour API exposes 4 endpoints covering player biographical data, serve and return statistics, live rankings breakdowns, and per-tournament match activity. get_player_profile returns biographical fields like handedness, backhand style, height, weight, and coach alongside current ranking and career win-loss record. All endpoints are keyed by ATP player ID, which appears in the player's profile URL on atptour.com.
curl -X GET 'https://api.parse.bot/scraper/1935c3a3-665d-4c07-a20e-34cb2f37c676/get_player_profile?player_id=s0ag' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace atptour-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ATP Tour API — bounded, re-runnable; every call capped."""
from parse_apis.atptour_com_api import AtpTour, Surface, MatchType, PlayerNotFound
client = AtpTour()
# Fetch Sinner's full profile by his ATP player ID.
try:
sinner = client.players.get(player_id="s0ag")
print(sinner.first_name, sinner.last_name, "| Rank:", sinner.singles_rank)
except PlayerNotFound as e:
print(f"Player not found: {e.player_id}")
# Career stats across all surfaces.
stats = sinner.stats(year="all", surface=Surface.ALL)
print("Career aces:", stats.service_stats.aces, "| Service games won:", stats.service_stats.service_games_won_pct)
# Current rankings breakdown — which tournaments contribute points.
rankings = sinner.rankings(match_type=MatchType.SINGLES)
print(f"Rank #{rankings.rank} with {rankings.total_points} points")
for event in rankings.breakdown[:3]:
print(f" {event.event_name}: {event.points} pts ({event.round})")
# Match activity for the current year.
activity = sinner.activity(year="2026", match_type=MatchType.SINGLES)
print(f"2026 record: {activity.won}-{activity.lost}, {activity.titles} titles")
for tourn in activity.tournaments[:2]:
print(f" {tourn.event_name} ({tourn.surface}) — {tourn.highest_round}")
for match in tourn.matches[:2]:
print(f" {match.round_short} vs {match.opponent_name} [{match.score}] {'W' if match.result == 'W' else 'L'}")
print("exercised: players.get / stats / rankings / activity")
Retrieve a player's biographical details, current ranking, career win-loss record, titles, and prize money. Returns one player per call keyed by their ATP player ID.
| Param | Type | Description |
|---|---|---|
| player_idrequired | string | ATP player ID (e.g. 's0ag' for Jannik Sinner, 'a0e2' for Carlos Alcaraz). Found in the player's profile URL on atptour.com. |
{
"type": "object",
"fields": {
"age": "integer",
"coach": "string or null",
"plays": "string — handedness description",
"backhand": "string — backhand style",
"height_cm": "integer",
"is_active": "boolean",
"last_name": "string",
"player_id": "string — uppercase ATP player ID",
"weight_kg": "integer",
"birth_city": "string",
"birth_date": "string — ISO datetime",
"first_name": "string",
"turned_pro": "integer — year turned professional",
"nationality": "string — country name",
"profile_url": "string — relative URL to player profile",
"doubles_rank": "integer or null",
"singles_rank": "integer or null",
"singles_ytd_won": "integer",
"ytd_prize_money": "string — formatted with currency symbol",
"nationality_code": "string — 3-letter country code",
"singles_ytd_lost": "integer",
"doubles_high_rank": "integer",
"singles_high_rank": "integer",
"career_prize_money": "string — formatted with currency symbol",
"singles_career_won": "integer",
"singles_ytd_titles": "integer",
"singles_career_lost": "integer",
"singles_career_titles": "integer",
"doubles_high_rank_date": "string — ISO datetime",
"singles_high_rank_date": "string — ISO datetime"
},
"sample": {
"data": {
"age": 24,
"coach": "Simone Vagnozzi, Darren Cahill",
"plays": "Right-Handed",
"backhand": "Two-Handed",
"height_cm": 191,
"is_active": true,
"last_name": "Sinner",
"player_id": "S0AG",
"weight_kg": 77,
"birth_city": "San Candido, Italy",
"birth_date": "2001-08-16T00:00:00",
"first_name": "Jannik",
"turned_pro": 2018,
"nationality": "Italy",
"profile_url": "/en/players/jannik-sinner/s0ag/overview",
"doubles_rank": null,
"singles_rank": 1,
"singles_ytd_won": 44,
"ytd_prize_money": "$6,853,344",
"nationality_code": "ITA",
"singles_ytd_lost": 3,
"doubles_high_rank": 124,
"singles_high_rank": 1,
"career_prize_money": "$64,837,801",
"singles_career_won": 365,
"singles_ytd_titles": 6,
"singles_career_lost": 89,
"singles_career_titles": 30,
"doubles_high_rank_date": "2021-09-27T00:00:00",
"singles_high_rank_date": "2024-06-10T00:00:00"
},
"status": "success"
}
}About the ATP Tour API
Player Profiles and Career Data
get_player_profile returns biographical and career fields for a single player identified by their ATP player ID (e.g. s0ag for Jannik Sinner, a0e2 for Carlos Alcaraz). Response fields include age, plays (handedness), backhand style, height_cm, weight_kg, birth_city, coach, and is_active status. One call maps to one player — there is no bulk or search endpoint in this API.
Statistics by Year and Surface
get_player_stats accepts optional year (e.g. '2025' or 'all' for career totals) and surface parameters alongside the required player_id. The response separates service_stats (aces, double faults, first-serve percentage, and related win rates) from return_stats (break points converted percentage, return games won percentage, and related metrics). The category field distinguishes 'Career' from 'Year' results so you know which aggregation window is active.
Rankings Breakdown and Match Activity
get_player_rankings returns a player's current rank, total_points, year-to-date won/lost record (ytd_won, ytd_lost), ytd_titles, ytd_prize in USD, and a breakdown array listing each tournament's point contribution to the current ranking total. get_player_activity accepts optional year and match_type ('sgl' for singles, 'dbl' for doubles) and returns a tournaments array with nested match-level detail including opponent, score, and round, plus aggregate won, lost, titles, and prize_money for the selected year.
The ATP Tour API is a managed, monitored endpoint for atptour.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when atptour.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official atptour.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a head-to-head comparison tool using serve stats from
get_player_statsfiltered by surface for two players - Track ranking trajectory by pulling
total_pointsandbreakdownfromget_player_rankingsacross multiple players - Generate tournament result timelines using
get_player_activitywith a specific year parameter - Power a fantasy tennis app with YTD win/loss records, titles, and prize money fields
- Create surface-specific performance dashboards comparing first-serve percentage and break points converted on clay vs. hard court
- Monitor which tournaments are contributing most points to a player's current ATP ranking using the
breakdownarray - Display player cards in a tennis app using biographical fields like
height_cm,weight_kg,plays, andcoach
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ATP Tour have an official developer API?+
How do I filter `get_player_stats` for career stats on a specific surface?+
year='all' to get career aggregates and set surface to your target surface (e.g. 'clay' or 'hard'). The response category field will read 'Career' and the surface field will confirm the filter applied. If you omit surface, the stats reflect all surfaces for that year or career window.Does `get_player_activity` return doubles match results?+
match_type='dbl' to retrieve doubles activity. The response match_type field will reflect 'dbl' and the tournaments array will contain doubles-specific match entries. Singles activity uses match_type='sgl'.Does the API cover ATP rankings history over time, not just the current ranking?+
get_player_rankings returns the current ranking, total points, and the tournament-by-tournament breakdown contributing to that snapshot — it does not return a time series of weekly ranking positions. You can fork this API on Parse and revise it to add a historical rankings endpoint.Does the API include player head-to-head records or match statistics at the individual match level?+
get_player_activity provides per-match results including opponent, score, and round, but does not break down in-match statistics such as aces or break points per match. Career and year-level serve/return stats are available through get_player_stats. You can fork this API on Parse and revise it to add a head-to-head or match-level stats endpoint.