ATP Tour APIatptour.com ↗
Access ATP Tour player profiles, career stats, rankings breakdowns, and match results via 9 structured endpoints. Filter by surface, year, rank range, and match type.
What is the ATP Tour API?
The ATP Tour API exposes 9 endpoints covering player profiles, serve/return statistics, rankings tables, points breakdowns, and match-by-match activity from atptour.com. get_player_profile returns biographical fields including coach, handedness, backhand style, height, and weight keyed by ATP player ID. Bulk endpoints like list_rankings_breakdown and list_rankings_activity let you pull data for an entire rank range in a single call rather than looping over individual players.
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'
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 Data
get_player_profile returns biographical details for one player per call using the ATP player ID (e.g. s0ag for Jannik Sinner, a0e2 for Carlos Alcaraz). Fields include age, coach, plays (handedness), backhand, height_cm, weight_kg, birth_city, and is_active. get_player_stats filters serve and return statistics by year (a 4-digit string or 'all' for career) and surface. It returns structured service_stats (aces, double faults, first serve percentage) and return_stats (break points converted, return games won percentage).
Rankings
list_rankings returns one row per player in a rank window defined by rank_range (e.g. '0-100'), with fields for rank, week-on-week rank movement, player ID, and points. You can pass a historical date_week (ISO date, Monday) to retrieve a past ranking week. list_rankings_breakdown extends this with each player's full Official Points breakdown — the tournament-by-tournament contributions — for the current week, across up to 100 ranks per call. get_player_rankings targets individual players (up to 5 comma-separated IDs) and supports both 'roll' (52-week ATP Rankings) and 'race' (ATP Race To Turin) via the rank_type parameter. All ranking endpoints accept match_type ('sgl' or 'dbl') to switch between singles and doubles.
Match Activity
get_player_activity returns a player's tournament results for a given year, including nested match-level detail: opponent, score, and round. Summary fields include won, lost, titles, and prize_money. list_rankings_activity scales this to a full rank range in one call, returning the same activity structure for every player in the window. list_rankings_breakdown_with_matches combines points breakdown data with the actual matches played in each contributing tournament, so you can see both the points earned and the results that generated them.
Photo and Bulk Endpoints
list_rankings_photos returns the profile photo URL (photo_url) and has_photo boolean for every player in a rank range, alongside the standard ranking-table fields. The response includes a players_with_photo count and a failed_players array listing any players whose image request did not succeed. Bulk endpoints (list_rankings_breakdown, list_rankings_photos, list_rankings_activity) all cap at a 100-rank window per call and report failures in a dedicated array rather than failing the whole response.
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 live ATP singles rankings table with rank movement arrows using
list_rankingsandrank_changefields. - Compare serve statistics across clay, grass, and hard court for a player using
get_player_statswith thesurfacefilter. - Track year-to-date titles and prize money for top-100 players by combining
list_rankingswithget_player_activity. - Generate a points-to-defend calendar by reading the
breakdownarray fromget_player_rankings. - Display player profile cards with headshots, nationality, and ranking using
list_rankings_photos. - Analyse doubles rankings separately from singles by setting
match_typeto'dbl'across any ranking endpoint. - Reconstruct how a player accumulated their current ranking points by using
list_rankings_breakdown_with_matchesto join tournament points with round-by-round match results.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. 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 retrieve rankings for a specific historical week rather than the current week?+
list_rankings and list_rankings_photos both accept a date_week parameter in ISO format (YYYY-MM-DD, the Monday the ranking was published, e.g. '2025-06-02'). Omitting date_week returns the most recent published ranking week. list_rankings_breakdown and list_rankings_breakdown_with_matches reflect the current week only and do not accept a historical date parameter.What does the `breakdown` array in `get_player_rankings` contain?+
event_class (the player's ranking section for that event) and the points earned. It is returned for the first player in the request; the players array carries summary totals (total_points, ytd_won, ytd_lost, ytd_titles, ytd_prize) for every requested player.Does the API cover ATP Challenger or ITF tournament data?+
What happens when a bulk endpoint cannot retrieve data for some players in the rank range?+
list_rankings_breakdown, list_rankings_photos, list_rankings_activity, list_rankings_breakdown_with_matches) include a failed_players array listing each player whose individual request did not succeed, along with their player_id, rank, and the upstream_status_code. The rest of the response is still returned. list_rankings_breakdown_with_matches adds a separate failed_activity array for players where the activity lookup specifically failed.