API Reference
Results & Historical Data
Completed matches by date or date range, plus aliases for player and tournament history. Existing /player/past-matches and /tournament/results routes stay unchanged — the aliases below return the same payloads. Historical Grand Slam champion calendar rows are also documented here.
Use Fixtures for the schedule (result empty). Use this page for finished scores. On results rows, player1 is the winner and player2 is the loser. matchId bridges to /tennis/v2/matches/{matchId}/stats and related detail routes.
Walkovers are included: result is w/o, result_type is walkover, and player1 (also match_winner) is the player who advanced, so results and draws agree. Byes are not matches and are not listed.
For lower-level events (TourRank0 ITF $10K and 1 Challenger/ITF > $10K) from 2005–2015, only the tournament start date is available, so every match of that draw carries the tournament start date in date (also in player past matches and draws). Order those matches by roundId. Main-tour, Masters and Grand Slam matches, and all matches from 2016 onward, have per-match dates.
Results by Date
/tennis/v2/{atp|wta}/results/{date}atp. Use wtafor the women's dataset.All completed matches for one calendar day (YYYY-MM-DD). New discovery route — does not replace fixtures.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
date | Yes | string | Calendar day YYYY-MM-DD. Example: 2026-09-15. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
filter | No | string | Semicolon-separated filters in Key:value format. Available filters:
filter=PlayerGroup:singles;PlayerCountry:ESP,ITA |
pageSize | No | integer | Results per page. When omitted, the endpoint's own default applies (100 on most list endpoints; some use 50 or 500), and the response's pageSize shows the value used. Core maximum: 500 (larger values are reduced). Example: pageSize=10. |
pageNo | No | integer | Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.
| Field | Type | Description |
|---|---|---|
data | array | The page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page. |
pageNo | integer | Current page, starting at 1. Also returned as page. |
pageSize | integer | Items requested for this page. Also returned as limit. Core maximum is 500. |
hasNextPage | boolean | true if another page exists. Stop when this is false or data is empty. |
id / matchId | integer|string | Completed match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes. |
date | string | Match date/time ISO-8601 UTC. Exception: for lower-level events (TourRank 0 ITF $10K and TourRank 1 Challenger/ITF > $10K) from 2005–2015, only the tournament start date is available, so every match of that draw carries the tournament start date; order those matches by roundId. |
result | string | Score string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser. |
result_type | string | completed | retired | walkover | default. Walkovers are included: result is "w/o", player1 is the player who advanced (also match_winner) and there are no statistics. |
player1 / player2 | object | Winner / loser with id, name, countryAcr. |
tournament | object | Event context when included by the transform (id, name, rankId, …). |
odd1 / odd2 | string|number | Closing/pre-match odds when retained. |
player1Id / player2Id / tournamentId / roundId | integer | Numeric IDs of player 1 (winner), player 2 (loser), the tournament season and the round (the same values as in player1, player2 and tournament). |
match_winner / best_of | integer | Winning player ID and best-of sets (null when not stored). |
data[].player1.id | number | Player 1 ID. |
data[].player1.name | string | Player 1 name. |
data[].player1.countryAcr | string | Player 1 country code. |
data[].player2.id | number | Player 2 ID. |
data[].player2.name | string | Player 2 name. |
data[].player2.countryAcr | string | Player 2 country code. |
data[].tournament.id | number | Tournament season ID. |
data[].tournament.name | string | Tournament name. |
data[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data[].tournament.rank | null | Tournament level: { id, name }. |
data[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data[].oddsAvailable | boolean | true when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers). |
data[].links | object | Ready-made URLs for this match's detail routes. |
data[].links.odds | string | URL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true. |
page | number | Current page number (1-based). |
limit | number | Items per page. |
Results by Date Range
/tennis/v2/{atp|wta}/results/{startDate}/{endDate}atp. Use wtafor the women's dataset.Completed matches from startDate through endDate inclusive (YYYY-MM-DD).Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
startDate | Yes | string | Range start YYYY-MM-DD. |
endDate | Yes | string | Range end YYYY-MM-DD (inclusive). |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
filter | No | string | Semicolon-separated filters in Key:value format. Available filters:
filter=PlayerGroup:singles;PlayerCountry:ESP,ITA |
pageSize | No | integer | Results per page. When omitted, the endpoint's own default applies (100 on most list endpoints; some use 50 or 500), and the response's pageSize shows the value used. Core maximum: 500 (larger values are reduced). Example: pageSize=10. |
pageNo | No | integer | Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.
| Field | Type | Description |
|---|---|---|
data | array | The page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page. |
pageNo | integer | Current page, starting at 1. Also returned as page. |
pageSize | integer | Items requested for this page. Also returned as limit. Core maximum is 500. |
hasNextPage | boolean | true if another page exists. Stop when this is false or data is empty. |
id / matchId | integer|string | Completed match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes. |
date | string | Match date/time ISO-8601 UTC. Exception: for lower-level events (TourRank 0 ITF $10K and TourRank 1 Challenger/ITF > $10K) from 2005–2015, only the tournament start date is available, so every match of that draw carries the tournament start date; order those matches by roundId. |
result | string | Score string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser. |
result_type | string | completed | retired | walkover | default. Walkovers are included: result is "w/o", player1 is the player who advanced (also match_winner) and there are no statistics. |
player1 / player2 | object | Winner / loser with id, name, countryAcr. |
tournament | object | Event context when included by the transform (id, name, rankId, …). |
odd1 / odd2 | string|number | Closing/pre-match odds when retained. |
player1Id / player2Id / tournamentId / roundId | integer | Numeric IDs of player 1 (winner), player 2 (loser), the tournament season and the round (the same values as in player1, player2 and tournament). |
match_winner / best_of | integer | Winning player ID and best-of sets (null when not stored). |
data[].player1.id | number | Player 1 ID. |
data[].player1.name | string | Player 1 name. |
data[].player1.countryAcr | string | Player 1 country code. |
data[].player2.id | number | Player 2 ID. |
data[].player2.name | string | Player 2 name. |
data[].player2.countryAcr | string | Player 2 country code. |
data[].tournament.id | number | Tournament season ID. |
data[].tournament.name | string | Tournament name. |
data[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data[].tournament.rank | null | Tournament level: { id, name }. |
data[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data[].oddsAvailable | boolean | true when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers). |
data[].links | object | Ready-made URLs for this match's detail routes. |
data[].links.odds | string | URL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true. |
page | number | Current page number (1-based). |
limit | number | Items per page. |
Player Results (alias)
/tennis/v2/{atp|wta}/results/player/{player_id}atp. Use wtafor the women's dataset.Alias of GET /player/past-matches/{player_id}. Same response body as the existing past-matches route.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id | Yes | string |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
pageSize | No | integer | Results per page. When omitted, the endpoint's own default applies (100 on most list endpoints; some use 50 or 500), and the response's pageSize shows the value used. Core maximum: 500 (larger values are reduced). Example: pageSize=10. |
pageNo | No | integer | Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.
| Field | Type | Description |
|---|---|---|
data | array | The page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page. |
pageNo | integer | Current page, starting at 1. Also returned as page. |
pageSize | integer | Items requested for this page. Also returned as limit. Core maximum is 500. |
hasNextPage | boolean | true if another page exists. Stop when this is false or data is empty. |
id / matchId | integer|string | Completed match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes. |
date | string | Match date/time ISO-8601 UTC. Exception: for lower-level events (TourRank 0 ITF $10K and TourRank 1 Challenger/ITF > $10K) from 2005–2015, only the tournament start date is available, so every match of that draw carries the tournament start date; order those matches by roundId. |
result | string | Score string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser. |
result_type | string | completed | retired | walkover | default. Walkovers are included: result is "w/o", player1 is the player who advanced (also match_winner) and there are no statistics. |
player1 / player2 | object | Winner / loser with id, name, countryAcr. |
tournament | object | Event context when included by the transform (id, name, rankId, …). |
odd1 / odd2 | string|number | Closing/pre-match odds when retained. |
player1Id / player2Id / tournamentId / roundId | integer | Numeric IDs of player 1 (winner), player 2 (loser), the tournament season and the round (the same values as in player1, player2 and tournament). |
match_winner / best_of | integer | Winning player ID and best-of sets (null when not stored). |
data[].player1.id | number | Player 1 ID. |
data[].player1.name | string | Player 1 name. |
data[].player1.countryAcr | string | Player 1 country code. |
data[].player2.id | number | Player 2 ID. |
data[].player2.name | string | Player 2 name. |
data[].player2.countryAcr | string | Player 2 country code. |
data[].tournament.id | number | Tournament season ID. |
data[].tournament.name | string | Tournament name. |
data[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data[].tournament.rank | null | Tournament level: { id, name }. |
data[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data[].oddsAvailable | boolean | true when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers). |
data[].links | object | Ready-made URLs for this match's detail routes. |
data[].links.odds | string | URL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true. |
page | number | Current page number (1-based). |
limit | number | Items per page. |
Tournament Results (alias)
/tennis/v2/{atp|wta}/results/tournament/{season_id}atp. Use wtafor the women's dataset.Alias of GET /tournament/results/{season_id}. Same response body as the existing tournament results route.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.
| Field | Type | Description |
|---|---|---|
data.singles / doubles / qualifying / doublesQualifying | array | Completed matches grouped by draw. Not paginated — the whole event is returned. |
id / matchId | integer|string | Completed match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes. |
date | string | Match date/time ISO-8601 UTC. Exception: for lower-level events (TourRank 0 ITF $10K and TourRank 1 Challenger/ITF > $10K) from 2005–2015, only the tournament start date is available, so every match of that draw carries the tournament start date; order those matches by roundId. |
result | string | Score string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser. |
result_type | string | completed | retired | walkover | default. Walkovers are included: result is "w/o", player1 is the player who advanced (also match_winner) and there are no statistics. |
player1 / player2 | object | Winner / loser with id, name, countryAcr. |
tournament | object | Event context when included by the transform (id, name, rankId, …). |
odd1 / odd2 | string|number | Closing/pre-match odds when retained. |
player1Id / player2Id / tournamentId / roundId | integer | Numeric IDs of player 1 (winner), player 2 (loser), the tournament season and the round (the same values as in player1, player2 and tournament). |
match_winner / best_of | integer | Winning player ID and best-of sets (null when not stored). |
data | object | Response payload: the list or object documented in the rows below. |
data.singles[].id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, …). |
data.singles[].matchId | string | Match ID (same value as id on core match rows). |
data.singles[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
data.singles[].roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0–3 are qualifying rounds. |
data.singles[].player1Id | number | Numeric ID of player 1. |
data.singles[].player2Id | number | Numeric ID of player 2. |
data.singles[].tournamentId | number | Numeric tournament season ID (one edition of an event). |
data.singles[].match_winner | number | Player ID of the match winner. |
data.singles[].result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
data.singles[].result_type | string | How the match ended: completed, retired, walkover or default. |
data.singles[].best_of | null | Best-of sets (3 or 5) when known, otherwise null. |
data.singles[].odd1 | null | One stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds. |
data.singles[].odd2 | null | Pre-match/closing odds retained for player 2, or null when not available. |
data.singles[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
data.singles[].player1.id | number | Player 1 ID. |
data.singles[].player1.name | string | Player 1 name. |
data.singles[].player1.countryAcr | string | Player 1 country code. |
data.singles[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
data.singles[].player2.id | number | Player 2 ID. |
data.singles[].player2.name | string | Player 2 name. |
data.singles[].player2.countryAcr | string | Player 2 country code. |
data.singles[].tournament | object | Tournament object (id, name, date, level, surface, country, …). |
data.singles[].tournament.id | number | Tournament season ID. |
data.singles[].tournament.name | string | Tournament name. |
data.singles[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data.singles[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data.singles[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data.singles[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data.singles[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data.singles[].tournament.rank | null | Tournament level: { id, name }. |
data.singles[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data.doubles[].id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, …). |
data.doubles[].matchId | string | Match ID (same value as id on core match rows). |
data.doubles[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
data.doubles[].roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0–3 are qualifying rounds. |
data.doubles[].player1Id | number | Numeric ID of player 1. |
data.doubles[].player2Id | number | Numeric ID of player 2. |
data.doubles[].tournamentId | number | Numeric tournament season ID (one edition of an event). |
data.doubles[].match_winner | number | Player ID of the match winner. |
data.doubles[].result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
data.doubles[].result_type | string | How the match ended: completed, retired, walkover or default. |
data.doubles[].best_of | null | Best-of sets (3 or 5) when known, otherwise null. |
data.doubles[].odd1 | string | One stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds. |
data.doubles[].odd2 | string | Pre-match/closing odds retained for player 2, or null when not available. |
data.doubles[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
data.doubles[].player1.id | number | Player 1 ID. |
data.doubles[].player1.name | string | Player 1 name. |
data.doubles[].player1.countryAcr | string | Player 1 country code. |
data.doubles[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
data.doubles[].player2.id | number | Player 2 ID. |
data.doubles[].player2.name | string | Player 2 name. |
data.doubles[].player2.countryAcr | string | Player 2 country code. |
data.doubles[].tournament | object | Tournament object (id, name, date, level, surface, country, …). |
data.doubles[].tournament.id | number | Tournament season ID. |
data.doubles[].tournament.name | string | Tournament name. |
data.doubles[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data.doubles[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data.doubles[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data.doubles[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data.doubles[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data.doubles[].tournament.rank | null | Tournament level: { id, name }. |
data.doubles[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data.qualifying[].id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, …). |
data.qualifying[].matchId | string | Match ID (same value as id on core match rows). |
data.qualifying[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
data.qualifying[].roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0–3 are qualifying rounds. |
data.qualifying[].player1Id | number | Numeric ID of player 1. |
data.qualifying[].player2Id | number | Numeric ID of player 2. |
data.qualifying[].tournamentId | number | Numeric tournament season ID (one edition of an event). |
data.qualifying[].match_winner | number | Player ID of the match winner. |
data.qualifying[].result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
data.qualifying[].result_type | string | How the match ended: completed, retired, walkover or default. |
data.qualifying[].best_of | null | Best-of sets (3 or 5) when known, otherwise null. |
data.qualifying[].odd1 | string | One stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds. |
data.qualifying[].odd2 | string | Pre-match/closing odds retained for player 2, or null when not available. |
data.qualifying[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
data.qualifying[].player1.id | number | Player 1 ID. |
data.qualifying[].player1.name | string | Player 1 name. |
data.qualifying[].player1.countryAcr | string | Player 1 country code. |
data.qualifying[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
data.qualifying[].player2.id | number | Player 2 ID. |
data.qualifying[].player2.name | string | Player 2 name. |
data.qualifying[].player2.countryAcr | string | Player 2 country code. |
data.qualifying[].tournament | object | Tournament object (id, name, date, level, surface, country, …). |
data.qualifying[].tournament.id | number | Tournament season ID. |
data.qualifying[].tournament.name | string | Tournament name. |
data.qualifying[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, … |
data.qualifying[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data.qualifying[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, … |
data.qualifying[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data.qualifying[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data.qualifying[].tournament.rank | null | Tournament level: { id, name }. |
data.qualifying[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
Grand Slam Champions
/tennis/v2/calendar/{atp|wta}/grand-slam-championsatp. Use wtafor the women's dataset.Returns Grand Slam calendar rows. level is forced to Grand Slam on this route — other level values are ignored. year defaults to the current year.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
year | No | integer | Season year. Default is the current year. Example: year=2026. |
level | No | string | Tournament level name from /calendar/{tour}/filters. Example: level=Grand Slam. Numeric ids return an empty list. |
surfaces | No | string | Surface name from filters, e.g. Hard, Clay, I.hard. |
surface | No | string | Filter by surface name. Alias of court. Example: surface=clay or court=Clay. |
search | No | string | Tournament name search. Example: search=Open. |
sortOrder | No | string | Date sort: ASC or DESC. |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player.
| Field | Type | Description |
|---|---|---|
(root) | array | A JSON array of tournaments (not wrapped in data). |
name | string | Tournament name. Reuse this (URL-encoded) on advanced tournament routes. |
date | string | Start date as ISO-8601. |
prize | string | Prize-money label when published. |
court / rank | object | Surface and level objects (id + name). |
games | array | Matches played at that event, with nested player objects and stats when available. |
[] | object | One item of the response; its fields are listed below. |
[].countryAcr | string | Three-letter country code (IOC style), e.g. ESP. |
[].court.id | number | Court-surface ID. |
[].court.name | string | Court-surface name, e.g. Hard, Clay, Grass, I.hard. |
[].rank.id | number | Tournament level ID (TourRank). |
[].rank.name | string | Tournament level name. |
[].games[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
[].games[].player1.id | number | Player 1 ID. |
[].games[].player1.name | string | Player 1 name. |
[].games[].player1.countryAcr | string | Player 1 country code. |
[].games[].player1.seed | string | Tournament seed as a string, or null when unseeded. |
[].games[].player1.image | string | Player photo path on this API (append to the base URL). |
[].games[].player1.image_p_name | string | Player photo path keyed by player name (alternative to image). |
[].games[].player1.stats | object | Per-match statistics of player 1 in this draw match (null when not recorded). |
[].games[].player1.stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
[].games[].player1.stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
[].games[].player1.stats.aces | number | Aces served (count). |
[].games[].player1.stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
[].games[].player1.stats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
[].games[].player1.stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
[].games[].player1.stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
[].games[].player1.stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
[].games[].player1.stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
[].games[].player1.stats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
[].games[].player1.stats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
[].games[].player1.stats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
[].games[].player1.stats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
[].games[].player1.stats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
[].games[].player1.stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
[].games[].player1.stats.fastestServe | number | Fastest serve in km/h (where tracked). |
[].games[].player1.stats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
[].games[].player1.stats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
[].games[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
[].games[].player2.id | number | Player 2 ID. |
[].games[].player2.name | string | Player 2 name. |
[].games[].player2.countryAcr | string | Player 2 country code. |
[].games[].player2.seed | string | Tournament seed as a string, or null when unseeded. |
[].games[].player2.image | string | Player photo path on this API (append to the base URL). |
[].games[].player2.image_p_name | string | Player photo path keyed by player name (alternative to image). |
[].games[].player2.stats | object | Per-match statistics of player 2 in this draw match (null when not recorded). |
[].games[].player2.stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
[].games[].player2.stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
[].games[].player2.stats.aces | number | Aces served (count). |
[].games[].player2.stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
[].games[].player2.stats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
[].games[].player2.stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
[].games[].player2.stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
[].games[].player2.stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
[].games[].player2.stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
[].games[].player2.stats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
[].games[].player2.stats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
[].games[].player2.stats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
[].games[].player2.stats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
[].games[].player2.stats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
[].games[].player2.stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
[].games[].player2.stats.fastestServe | number | Fastest serve in km/h (where tracked). |
[].games[].player2.stats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
[].games[].player2.stats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |