ATP Tour APIatptour.com ↗
Access ATP Tour player profiles, career stats, rankings breakdowns, and match results via 10 endpoints. Filter by surface, year, rank range, and match type.
What is the ATP Tour API?
The ATP Tour API exposes 10 endpoints covering player profiles, serve and return statistics, rankings tables, 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. list_rankings lets you page through the official rankings table by rank range and historical week, while bulk endpoints like list_rankings_breakdown and list_rankings_activity aggregate data for entire rank windows in a single call.
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 a single player record per call, identified by the ATP player ID found in the player's profile URL (e.g. s0ag for Jannik Sinner). Fields include age, coach, plays (handedness), backhand, height_cm, weight_kg, birth_city, and is_active. get_player_stats adds serve and return statistics — aces, double faults, first-serve percentage, break points converted, and return games won — filterable by year (a four-digit string or 'all' for career totals) and surface. get_player_activity returns match-by-match tournament results for a given year and match type (sgl or dbl), including totals for won, lost, titles, and prize_money alongside a nested tournaments array.
Rankings Endpoints
list_rankings returns the ATP rankings table for a configurable rank_range (e.g. '0-100') and optional historical date_week (ISO Monday date). Each row includes rank, rank_tied, rank_change (negative when dropped), player identity fields, and points. get_player_rankings goes deeper: it accepts up to five comma-separated player IDs and returns a breakdown array showing each tournament's point contribution, plus ytd_won, ytd_lost, ytd_titles, and ytd_prize. The rank_type parameter switches between the rolling 52-week ATP Rankings ('roll') and the season ATP Race To Turin ('race').
Bulk / Batch Endpoints
Three bulk endpoints reduce round trips when you need data for a range of players. list_rankings_breakdown returns the Official Points breakdown for every player in a rank window in one call, and surfaces a failed_players array so you can identify any missing records. list_rankings_breakdown_with_matches extends that by embedding match-level detail (round, opponent, score) inside each tournament entry. list_rankings_activity returns a full season of match activity for every player in the range and additionally dates each match; it reports both failed_players and failed_results (tournament editions whose result pages could not be fetched).
Tournament Coverage
list_tournaments_by_country lists ATP Tour and ATP Challenger Tour events held in a given country during a season. It accepts a country parameter (name or 3-letter code), a tour filter ('atp', 'ch', or 'all'), and a year. When details_available is true, each tournament row includes surface, indoor/outdoor flag, draw sizes, and prize money. Coverage spans seasons from 2015 onward.
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 rankings leaderboard pulling rank, rank_change, and points via list_rankings.
- Track a player's serve performance across surfaces using get_player_stats with the surface filter.
- Generate season-over-season win-loss trend charts from get_player_activity across multiple years.
- Display a player profile card with coach, handedness, height, and nationality from get_player_profile.
- Identify which tournaments contribute the most points to a player's ranking using the breakdown array from get_player_rankings.
- Map ATP and Challenger tournament locations by country and season using list_tournaments_by_country.
- Batch-fetch match histories for the top 100 players in a single call via list_rankings_activity.
| 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.