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.

ℹ️
Fixtures vs results

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.

⚠️
Match dates for older ITF / Challenger events

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

GET/tennis/v2/{atp|wta}/results/{date}
This example uses 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

ParameterRequiredTypeDescription
atp|wtaYesstring
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.
dateYesstring
Calendar day YYYY-MM-DD. Example: 2026-09-15.

Query Parameter

ParameterRequiredTypeDescription
filterNostring
Semicolon-separated filters in Key:value format. Available filters:
  • PlayerGroup:singles | doubles | both
  • PlayerCountry:{ESP,ITA} — filter by 3-letter country acronym
Example:filter=PlayerGroup:singles;PlayerCountry:ESP,ITA
pageSizeNointeger
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.
pageNoNointeger
Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/atp/results/2026-03-15?pageSize=2&filter=PlayerGroup:singles;TourRank:3' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.

FieldTypeDescription
dataarrayThe page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page.
pageNointegerCurrent page, starting at 1. Also returned as page.
pageSizeintegerItems requested for this page. Also returned as limit. Core maximum is 500.
hasNextPagebooleantrue if another page exists. Stop when this is false or data is empty.
id / matchIdinteger|stringCompleted match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes.
datestringMatch 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.
resultstringScore string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser.
result_typestringcompleted | 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 / player2objectWinner / loser with id, name, countryAcr.
tournamentobjectEvent context when included by the transform (id, name, rankId, …).
odd1 / odd2string|numberClosing/pre-match odds when retained.
player1Id / player2Id / tournamentId / roundIdintegerNumeric 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_ofintegerWinning player ID and best-of sets (null when not stored).
data[].player1.idnumberPlayer 1 ID.
data[].player1.namestringPlayer 1 name.
data[].player1.countryAcrstringPlayer 1 country code.
data[].player2.idnumberPlayer 2 ID.
data[].player2.namestringPlayer 2 name.
data[].player2.countryAcrstringPlayer 2 country code.
data[].tournament.idnumberTournament season ID.
data[].tournament.namestringTournament name.
data[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data[].tournament.datestringTournament start date (ISO-8601 UTC).
data[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data[].tournament.ranknullTournament level: { id, name }.
data[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.
data[].oddsAvailablebooleantrue when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers).
data[].linksobjectReady-made URLs for this match's detail routes.
data[].links.oddsstringURL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true.
pagenumberCurrent page number (1-based).
limitnumberItems per page.

Results by Date Range

GET/tennis/v2/{atp|wta}/results/{startDate}/{endDate}
This example uses atp. Use wtafor the women's dataset.Completed matches from startDate through endDate inclusive (YYYY-MM-DD).

Path Parameter

ParameterRequiredTypeDescription
atp|wtaYesstring
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.
startDateYesstring
Range start YYYY-MM-DD.
endDateYesstring
Range end YYYY-MM-DD (inclusive).

Query Parameter

ParameterRequiredTypeDescription
filterNostring
Semicolon-separated filters in Key:value format. Available filters:
  • PlayerGroup:singles | doubles | both
  • PlayerCountry:{ESP,ITA} — filter by 3-letter country acronym
Example:filter=PlayerGroup:singles;PlayerCountry:ESP,ITA
pageSizeNointeger
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.
pageNoNointeger
Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/atp/results/2026-03-14/2026-03-15?pageSize=2&filter=PlayerGroup:singles;TourRank:3' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.

FieldTypeDescription
dataarrayThe page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page.
pageNointegerCurrent page, starting at 1. Also returned as page.
pageSizeintegerItems requested for this page. Also returned as limit. Core maximum is 500.
hasNextPagebooleantrue if another page exists. Stop when this is false or data is empty.
id / matchIdinteger|stringCompleted match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes.
datestringMatch 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.
resultstringScore string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser.
result_typestringcompleted | 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 / player2objectWinner / loser with id, name, countryAcr.
tournamentobjectEvent context when included by the transform (id, name, rankId, …).
odd1 / odd2string|numberClosing/pre-match odds when retained.
player1Id / player2Id / tournamentId / roundIdintegerNumeric 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_ofintegerWinning player ID and best-of sets (null when not stored).
data[].player1.idnumberPlayer 1 ID.
data[].player1.namestringPlayer 1 name.
data[].player1.countryAcrstringPlayer 1 country code.
data[].player2.idnumberPlayer 2 ID.
data[].player2.namestringPlayer 2 name.
data[].player2.countryAcrstringPlayer 2 country code.
data[].tournament.idnumberTournament season ID.
data[].tournament.namestringTournament name.
data[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data[].tournament.datestringTournament start date (ISO-8601 UTC).
data[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data[].tournament.ranknullTournament level: { id, name }.
data[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.
data[].oddsAvailablebooleantrue when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers).
data[].linksobjectReady-made URLs for this match's detail routes.
data[].links.oddsstringURL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true.
pagenumberCurrent page number (1-based).
limitnumberItems per page.

Player Results (alias)

GET/tennis/v2/{atp|wta}/results/player/{player_id}
This example uses 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

ParameterRequiredTypeDescription
atp|wtaYesstring
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_idYesstring
Player: numeric ID or display name. Example: 47275 or Jannik Sinner. IDs come from Rankings (player.id), Fixtures (player1Id) or the core player list. A name shared by several players returns 400 listing their IDs.

Query Parameter

ParameterRequiredTypeDescription
pageSizeNointeger
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.
pageNoNointeger
Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/atp/results/player/68074?pageSize=2' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.

FieldTypeDescription
dataarrayThe page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page.
pageNointegerCurrent page, starting at 1. Also returned as page.
pageSizeintegerItems requested for this page. Also returned as limit. Core maximum is 500.
hasNextPagebooleantrue if another page exists. Stop when this is false or data is empty.
id / matchIdinteger|stringCompleted match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes.
datestringMatch 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.
resultstringScore string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser.
result_typestringcompleted | 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 / player2objectWinner / loser with id, name, countryAcr.
tournamentobjectEvent context when included by the transform (id, name, rankId, …).
odd1 / odd2string|numberClosing/pre-match odds when retained.
player1Id / player2Id / tournamentId / roundIdintegerNumeric 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_ofintegerWinning player ID and best-of sets (null when not stored).
data[].player1.idnumberPlayer 1 ID.
data[].player1.namestringPlayer 1 name.
data[].player1.countryAcrstringPlayer 1 country code.
data[].player2.idnumberPlayer 2 ID.
data[].player2.namestringPlayer 2 name.
data[].player2.countryAcrstringPlayer 2 country code.
data[].tournament.idnumberTournament season ID.
data[].tournament.namestringTournament name.
data[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data[].tournament.datestringTournament start date (ISO-8601 UTC).
data[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data[].tournament.ranknullTournament level: { id, name }.
data[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.
data[].oddsAvailablebooleantrue when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers).
data[].linksobjectReady-made URLs for this match's detail routes.
data[].links.oddsstringURL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true.
pagenumberCurrent page number (1-based).
limitnumberItems per page.

Tournament Results (alias)

GET/tennis/v2/{atp|wta}/results/tournament/{season_id}
This example uses 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

ParameterRequiredTypeDescription
atp|wtaYesstring
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.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/atp/results/tournament/21317' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player · Tournament.

FieldTypeDescription
data.singles / doubles / qualifying / doublesQualifyingarrayCompleted matches grouped by draw. Not paginated — the whole event is returned.
id / matchIdinteger|stringCompleted match ID. Same value; use matchId with /tennis/v2/matches/{matchId}/stats and the other match detail routes.
datestringMatch 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.
resultstringScore string, e.g. 6-3 6-4. player1 is the winner; player2 is the loser.
result_typestringcompleted | 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 / player2objectWinner / loser with id, name, countryAcr.
tournamentobjectEvent context when included by the transform (id, name, rankId, …).
odd1 / odd2string|numberClosing/pre-match odds when retained.
player1Id / player2Id / tournamentId / roundIdintegerNumeric 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_ofintegerWinning player ID and best-of sets (null when not stored).
dataobjectResponse payload: the list or object documented in the rows below.
data.singles[].idstringNumeric ID of this item (see the parent object: match, player, tournament, live event, …).
data.singles[].matchIdstringMatch ID (same value as id on core match rows).
data.singles[].datestringDate/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date.
data.singles[].roundIdnumberNumeric 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[].player1IdnumberNumeric ID of player 1.
data.singles[].player2IdnumberNumeric ID of player 2.
data.singles[].tournamentIdnumberNumeric tournament season ID (one edition of an event).
data.singles[].match_winnernumberPlayer ID of the match winner.
data.singles[].resultstringScore string, e.g. "6-3 6-4"; empty string until the match is played.
data.singles[].result_typestringHow the match ended: completed, retired, walkover or default.
data.singles[].best_ofnullBest-of sets (3 or 5) when known, otherwise null.
data.singles[].odd1nullOne stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds.
data.singles[].odd2nullPre-match/closing odds retained for player 2, or null when not available.
data.singles[].player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
data.singles[].player1.idnumberPlayer 1 ID.
data.singles[].player1.namestringPlayer 1 name.
data.singles[].player1.countryAcrstringPlayer 1 country code.
data.singles[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
data.singles[].player2.idnumberPlayer 2 ID.
data.singles[].player2.namestringPlayer 2 name.
data.singles[].player2.countryAcrstringPlayer 2 country code.
data.singles[].tournamentobjectTournament object (id, name, date, level, surface, country, …).
data.singles[].tournament.idnumberTournament season ID.
data.singles[].tournament.namestringTournament name.
data.singles[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data.singles[].tournament.datestringTournament start date (ISO-8601 UTC).
data.singles[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data.singles[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data.singles[].tournament.ranknullTournament level: { id, name }.
data.singles[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.
data.doubles[].idstringNumeric ID of this item (see the parent object: match, player, tournament, live event, …).
data.doubles[].matchIdstringMatch ID (same value as id on core match rows).
data.doubles[].datestringDate/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date.
data.doubles[].roundIdnumberNumeric 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[].player1IdnumberNumeric ID of player 1.
data.doubles[].player2IdnumberNumeric ID of player 2.
data.doubles[].tournamentIdnumberNumeric tournament season ID (one edition of an event).
data.doubles[].match_winnernumberPlayer ID of the match winner.
data.doubles[].resultstringScore string, e.g. "6-3 6-4"; empty string until the match is played.
data.doubles[].result_typestringHow the match ended: completed, retired, walkover or default.
data.doubles[].best_ofnullBest-of sets (3 or 5) when known, otherwise null.
data.doubles[].odd1stringOne stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds.
data.doubles[].odd2stringPre-match/closing odds retained for player 2, or null when not available.
data.doubles[].player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
data.doubles[].player1.idnumberPlayer 1 ID.
data.doubles[].player1.namestringPlayer 1 name.
data.doubles[].player1.countryAcrstringPlayer 1 country code.
data.doubles[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
data.doubles[].player2.idnumberPlayer 2 ID.
data.doubles[].player2.namestringPlayer 2 name.
data.doubles[].player2.countryAcrstringPlayer 2 country code.
data.doubles[].tournamentobjectTournament object (id, name, date, level, surface, country, …).
data.doubles[].tournament.idnumberTournament season ID.
data.doubles[].tournament.namestringTournament name.
data.doubles[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data.doubles[].tournament.datestringTournament start date (ISO-8601 UTC).
data.doubles[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data.doubles[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data.doubles[].tournament.ranknullTournament level: { id, name }.
data.doubles[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.
data.qualifying[].idstringNumeric ID of this item (see the parent object: match, player, tournament, live event, …).
data.qualifying[].matchIdstringMatch ID (same value as id on core match rows).
data.qualifying[].datestringDate/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date.
data.qualifying[].roundIdnumberNumeric 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[].player1IdnumberNumeric ID of player 1.
data.qualifying[].player2IdnumberNumeric ID of player 2.
data.qualifying[].tournamentIdnumberNumeric tournament season ID (one edition of an event).
data.qualifying[].match_winnernumberPlayer ID of the match winner.
data.qualifying[].resultstringScore string, e.g. "6-3 6-4"; empty string until the match is played.
data.qualifying[].result_typestringHow the match ended: completed, retired, walkover or default.
data.qualifying[].best_ofnullBest-of sets (3 or 5) when known, otherwise null.
data.qualifying[].odd1stringOne stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds.
data.qualifying[].odd2stringPre-match/closing odds retained for player 2, or null when not available.
data.qualifying[].player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
data.qualifying[].player1.idnumberPlayer 1 ID.
data.qualifying[].player1.namestringPlayer 1 name.
data.qualifying[].player1.countryAcrstringPlayer 1 country code.
data.qualifying[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
data.qualifying[].player2.idnumberPlayer 2 ID.
data.qualifying[].player2.namestringPlayer 2 name.
data.qualifying[].player2.countryAcrstringPlayer 2 country code.
data.qualifying[].tournamentobjectTournament object (id, name, date, level, surface, country, …).
data.qualifying[].tournament.idnumberTournament season ID.
data.qualifying[].tournament.namestringTournament name.
data.qualifying[].tournament.courtIdnumberNumeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, …
data.qualifying[].tournament.datestringTournament start date (ISO-8601 UTC).
data.qualifying[].tournament.rankIdnumberTournament 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.countryAcrstringThree-letter country code of the tournament.
data.qualifying[].tournament.courtnullCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
data.qualifying[].tournament.ranknullTournament level: { id, name }.
data.qualifying[].tournament.countrynullCountry of the tournament: three-letter code, or { name, acronym }.

Grand Slam Champions

GET/tennis/v2/calendar/{atp|wta}/grand-slam-champions
This example uses atp. 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

ParameterRequiredTypeDescription
atp|wtaYesstring
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

ParameterRequiredTypeDescription
yearNointeger
Season year. Default is the current year. Example: year=2026.
levelNostring
Tournament level name from /calendar/{tour}/filters. Example: level=Grand Slam. Numeric ids return an empty list.
surfacesNostring
Surface name from filters, e.g. Hard, Clay, I.hard.
surfaceNostring
Filter by surface name. Alias of court. Example: surface=clay or court=Clay.
searchNostring
Tournament name search. Example: search=Open.
sortOrderNostring
Date sort: ASC or DESC.
pageNointeger
Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1
limitNointeger
Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/calendar/atp/grand-slam-champions' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player.

FieldTypeDescription
(root)arrayA JSON array of tournaments (not wrapped in data).
namestringTournament name. Reuse this (URL-encoded) on advanced tournament routes.
datestringStart date as ISO-8601.
prizestringPrize-money label when published.
court / rankobjectSurface and level objects (id + name).
gamesarrayMatches played at that event, with nested player objects and stats when available.
[]objectOne item of the response; its fields are listed below.
[].countryAcrstringThree-letter country code (IOC style), e.g. ESP.
[].court.idnumberCourt-surface ID.
[].court.namestringCourt-surface name, e.g. Hard, Clay, Grass, I.hard.
[].rank.idnumberTournament level ID (TourRank).
[].rank.namestringTournament level name.
[].games[].player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
[].games[].player1.idnumberPlayer 1 ID.
[].games[].player1.namestringPlayer 1 name.
[].games[].player1.countryAcrstringPlayer 1 country code.
[].games[].player1.seedstringTournament seed as a string, or null when unseeded.
[].games[].player1.imagestringPlayer photo path on this API (append to the base URL).
[].games[].player1.image_p_namestringPlayer photo path keyed by player name (alternative to image).
[].games[].player1.statsobjectPer-match statistics of player 1 in this draw match (null when not recorded).
[].games[].player1.stats.firstServenumberFirst serves landed in. Counted over the matches in this selection.
[].games[].player1.stats.firstServeOfnumberFirst-serve attempts (total service points). Counted over the matches in this selection.
[].games[].player1.stats.acesnumberAces served (count).
[].games[].player1.stats.doubleFaultsnumberDouble faults. Counted over the matches in this selection.
[].games[].player1.stats.unforcedErrorsnumberUnforced errors (where tracked). Counted over the matches in this selection.
[].games[].player1.stats.winningOnFirstServenumberPoints won on first serve. Counted over the matches in this selection.
[].games[].player1.stats.winningOnFirstServeOfnumberPoints played on first serve (first serves in). Counted over the matches in this selection.
[].games[].player1.stats.winningOnSecondServenumberPoints won on second serve. Counted over the matches in this selection.
[].games[].player1.stats.winningOnSecondServeOfnumberPoints played on second serve. Counted over the matches in this selection.
[].games[].player1.stats.winnersnumberWinners (where tracked). Counted over the matches in this selection.
[].games[].player1.stats.breakPointsConvertednumberBreak points converted as returner. Counted over the matches in this selection.
[].games[].player1.stats.breakPointsConvertedOfnumberBreak-point chances as returner. Counted over the matches in this selection.
[].games[].player1.stats.netApproachesnumberNet approaches won (where tracked). Counted over the matches in this selection.
[].games[].player1.stats.netApproachesOfnumberNet approaches made (where tracked). Counted over the matches in this selection.
[].games[].player1.stats.totalPointsWonnumberTotal points won. Counted over the matches in this selection.
[].games[].player1.stats.fastestServenumberFastest serve in km/h (where tracked).
[].games[].player1.stats.averageFirstServeSpeednumberAverage first-serve speed in km/h (where tracked).
[].games[].player1.stats.averageSecondServeSpeednumberAverage second-serve speed in km/h (where tracked).
[].games[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
[].games[].player2.idnumberPlayer 2 ID.
[].games[].player2.namestringPlayer 2 name.
[].games[].player2.countryAcrstringPlayer 2 country code.
[].games[].player2.seedstringTournament seed as a string, or null when unseeded.
[].games[].player2.imagestringPlayer photo path on this API (append to the base URL).
[].games[].player2.image_p_namestringPlayer photo path keyed by player name (alternative to image).
[].games[].player2.statsobjectPer-match statistics of player 2 in this draw match (null when not recorded).
[].games[].player2.stats.firstServenumberFirst serves landed in. Counted over the matches in this selection.
[].games[].player2.stats.firstServeOfnumberFirst-serve attempts (total service points). Counted over the matches in this selection.
[].games[].player2.stats.acesnumberAces served (count).
[].games[].player2.stats.doubleFaultsnumberDouble faults. Counted over the matches in this selection.
[].games[].player2.stats.unforcedErrorsnumberUnforced errors (where tracked). Counted over the matches in this selection.
[].games[].player2.stats.winningOnFirstServenumberPoints won on first serve. Counted over the matches in this selection.
[].games[].player2.stats.winningOnFirstServeOfnumberPoints played on first serve (first serves in). Counted over the matches in this selection.
[].games[].player2.stats.winningOnSecondServenumberPoints won on second serve. Counted over the matches in this selection.
[].games[].player2.stats.winningOnSecondServeOfnumberPoints played on second serve. Counted over the matches in this selection.
[].games[].player2.stats.winnersnumberWinners (where tracked). Counted over the matches in this selection.
[].games[].player2.stats.breakPointsConvertednumberBreak points converted as returner. Counted over the matches in this selection.
[].games[].player2.stats.breakPointsConvertedOfnumberBreak-point chances as returner. Counted over the matches in this selection.
[].games[].player2.stats.netApproachesnumberNet approaches won (where tracked). Counted over the matches in this selection.
[].games[].player2.stats.netApproachesOfnumberNet approaches made (where tracked). Counted over the matches in this selection.
[].games[].player2.stats.totalPointsWonnumberTotal points won. Counted over the matches in this selection.
[].games[].player2.stats.fastestServenumberFastest serve in km/h (where tracked).
[].games[].player2.stats.averageFirstServeSpeednumberAverage first-serve speed in km/h (where tracked).
[].games[].player2.stats.averageSecondServeSpeednumberAverage second-serve speed in km/h (where tracked).