API Reference

Upcoming Matches (With Predictions & Odds Data)

Use this section when you need upcoming matches enriched with basic bookmaker odds and prediction-related data. Only the SportsAPI365 model win probabilities (modelPrediction) require ULTRA or MEGA. If you only need scheduled matches and factual match/H2H data, use Upcoming Matches.

โ„น๏ธ
Available on all plans โ€” two plan rules
  • All plans: every endpoint and field on this page except the two rules below, including full-market odds, preMatchOdds, bookmaker-implied predictionSummary and Match Odds (All Markets).
  • ULTRA / MEGA: the SportsAPI365 model win probabilities โ€” modelPrediction on upcoming rows and H2H Model Prediction. On FREE / PRO, modelPrediction stays visible as a plan_restricted object ("Upgrade Plan to see this", HTTP 200).
  • MEGA only: the written analysis โ€” Match Prediction & Analysis Paragraph (also by matchId) and H2H Prediction Analysis.
โ„น๏ธ
From an upcoming match to its live data: follow the links

Upcoming rows carry links.match and links.live (/tennis/v2/matches/{matchId}/live?type=atp|wta), which returns the current status, score and statistics plus the live eventId used by the live endpoints and Socket.IO. liveMatchId on upcoming rows equals matchId on live rows. You do not need to match records by player names, tournament and date.

โ„น๏ธ
Bookmaker vs model prediction

predictionSummary is the bookmaker-implied view (legacy key kept for compatibility). SportsAPI365 model win probabilities are exposed separately as modelPrediction when available. Do not mix the two.

All Upcoming Matches

โ„น๏ธ
Odds by plan

Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).

GET/tennis/v2/upcoming/matches
Returns all upcoming scheduled matches across both men's and women's tennis

Query Parameter

ParameterRequiredTypeDescription
dateNostring
Lower bound, not a single day: returns upcoming matches that start after this date/time (plus matches with no time set yet). Default: now. YYYY-MM-DD or an ISO-8601 date-time; an invalid date returns 400. For one day's schedule use Fixtures by Date. Example: date=2026-09-15.
groupNostring
singles or doubles only on upcoming lists.
sortByNostring
Set sortBy=h2h to order by head-to-head interest.
rankNostring
Tournament level name from /upcoming/filters. Example: ATP 250.
playerRankNostring
Filter by player ranking band when the list supports it. Example: playerRank=1-50.
autoPostNoboolean
Optional flag. Default false. Example: autoPost=true.
tournamentNostring
Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo
includeAllNoboolean
Include Challenger/ITF and full history where supported. Example: includeAll=true
includeNostring
Additive only. Comma-separated: preMatchOdds, predictionSummary, all. Default already includes matchId and h2hSummary. Example: include=preMatchOdds,predictionSummary.
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/upcoming/matches?page=1&limit=2&include=all' \
	--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 ยท Plan-restricted field.

FieldTypeDescription
totalintegerTotal matches matching the filter.
matchesarrayPage of upcoming matches.
page / pageNo / pageSize / limit / hasNextPage / totalPagesmixedPagination (advanced family uses page + limit; pageNo/pageSize are also returned).
matches[].id / matchIdintegerMatch ID for this upcoming row. Use with GET /tennis/v2/matches/{matchId} and /prediction, /odds, /stats, /live.
matches[].liveMatchIdstringThis match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update.
matches[].links.match / links.livestringReady-to-call paths: the match detail route, and the live route that returns the live score, statistics, timeline and live eventId once the match is in the live feed ({} before).
matches[].tournamentobjectid, name, date, rankId, country, court.
matches[].datestringScheduled start ISO-8601 UTC.
matches[].player1 / player2objectid, name, odd, countryAcr, seed, image. player1 is first-listed, not predicted winner.
matches[].oddsobjectFull bookmaker markets when present (k1, k2, total, ktm, ktb, โ€ฆ) โ€” see odds glossary. All plans; preMatchOdds repeats the match-winner prices.
matches[].h2hstringCareer H2H as player1Wins-player2Wins string, e.g. 4-1.
matches[].h2hSummaryobjectAdditive factual H2H: matchCount, player1Wins, player2Wins (always present on upcoming lists).
matches[].preMatchOddsobjectAdditive. Only when include=preMatchOdds (or include=all): player1, player2 (match-winner odds) and updatedAt, which is always null because the odds source has no update time.
matches[].predictionSummaryobjectAdditive when include=predictionSummary|all. Bookmaker-implied view (source=oddsImplied): predictedWinnerId, bookmakerOdds, player1ImpliedProbability, player2ImpliedProbability, normalized.
matches[].modelPredictionobjectAlways present. ULTRA/MEGA: SportsAPI365 model view (available, source, predictedWinnerId, player1WinProbability, player2WinProbability). FREE/PRO: plan_restricted stub with message "Upgrade Plan to see this" (field kept visible; not null). Separate from predictionSummary.
matches[].linksobjectReady-made URLs for this match's detail routes.
matches[].tournament.idnumberTournament season ID.
matches[].tournament.namestringTournament name.
matches[].tournament.datestringTournament start date (ISO-8601 UTC).
matches[].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, โ€ฆ
matches[].tournament.countrystringCountry of the tournament: three-letter code, or { name, acronym }.
matches[].tournament.courtobjectCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
matches[].tournament.court.namestringCourt surface name, e.g. Hard, Clay, Grass, I.hard.
matches[].courtstringCourt surface of the match as a name, e.g. "Hard".
matches[].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.
matches[].ranknumberTournament level ID of the match (TourRank).
matches[].typestringDataset: atp or wta.
matches[].odds.id_b_onumberArchive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ).
matches[].odds.totalnumberGames-total line that ktb (over) and ktm (under) refer to, or null.
matches[].odds.k1numberMatch-winner odds for player 1 (decimal).
matches[].odds.k2numberMatch-winner odds for player 2 (decimal).
matches[].odds.ktbnumberOver odds for the games-total line in total, or null.
matches[].odds.ktmnumberUnder odds for the games-total line in total, or null.
matches[].player1.namestringPlayer 1 name.
matches[].player1.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
matches[].player1.countryAcrstringPlayer 1 country code.
matches[].player1.seednullTournament seed as a string, or null when unseeded.
matches[].player1.imagestringPlayer photo path on this API (append to the base URL).
matches[].player1.image_p_namestringPlayer photo path keyed by player name (alternative to image).
matches[].player1.idnumberPlayer 1 ID.
matches[].player2.idnumberPlayer 2 ID.
matches[].player2.namestringPlayer 2 name.
matches[].player2.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
matches[].player2.countryAcrstringPlayer 2 country code.
matches[].player2.seednullTournament seed as a string, or null when unseeded.
matches[].player2.imagestringPlayer photo path on this API (append to the base URL).
matches[].player2.image_p_namestringPlayer photo path keyed by player name (alternative to image).
matches[].h2hSummary.matchCountnumberCareer meetings between the two players.
matches[].h2hSummary.player1WinsnumberCareer head-to-head wins of player 1.
matches[].h2hSummary.player2WinsnumberCareer head-to-head wins of player 2.
matches[].preMatchOdds.player1numberMatch-winner odds for player 1 (decimal).
matches[].preMatchOdds.player2numberMatch-winner odds for player 2 (decimal).
matches[].preMatchOdds.updatedAtnullAlways null: the pre-match odds source does not record when prices were updated. Kept for a stable shape.
matches[].predictionSummary.availablebooleantrue when both headline odds exist and a favourite can be derived.
matches[].predictionSummary.sourcestringAlways "oddsImplied": derived from bookmaker odds.
matches[].predictionSummary.predictedWinnerIdnumberPlayer ID of the predicted winner.
matches[].predictionSummary.bookmakerOddsobjectHeadline bookmaker odds used for the implied probabilities: player1, player2.
matches[].predictionSummary.bookmakerOdds.player1numberBookmaker match-winner odds for player 1.
matches[].predictionSummary.bookmakerOdds.player2numberBookmaker match-winner odds for player 2.
matches[].predictionSummary.player1ImpliedProbabilitynumberImplied win probability for player 1 in percent (normalised).
matches[].predictionSummary.player2ImpliedProbabilitynumberImplied win probability for player 2 in percent (normalised).
matches[].predictionSummary.normalizedbooleantrue when the implied probabilities were normalised to sum to 100 (bookmaker margin removed).
matches[].modelPrediction.availablebooleantrue when model probabilities are present; false when not yet available or plan-restricted.
matches[].modelPrediction.sourcestringAlways "sportsapi365" (proprietary model).
matches[].modelPrediction.predictedWinnerIdnumberPlayer ID of the predicted winner.
matches[].modelPrediction.player1WinProbabilitynumberModel win probability for player 1 in percent; null when not available.
matches[].modelPrediction.player2WinProbabilitynumberModel win probability for player 2 in percent; null when not available.

Upcoming Matches by Tour

โ„น๏ธ
Odds by plan

Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).

GET/tennis/v2/upcoming/matches/{atp|wta}
This example uses atp. Use wtafor the women's dataset.Returns all upcoming scheduled matches by tour type.

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
dateNostring
Lower bound, not a single day: returns upcoming matches that start after this date/time (plus matches with no time set yet). Default: now. YYYY-MM-DD or an ISO-8601 date-time; an invalid date returns 400. For one day's schedule use Fixtures by Date. Example: date=2026-09-15.
groupNostring
singles or doubles only on upcoming lists.
sortByNostring
Set sortBy=h2h to order by head-to-head interest.
rankNostring
Tournament level name from /upcoming/filters. Example: ATP 250.
playerRankNostring
Filter by player ranking band when the list supports it. Example: playerRank=1-50.
autoPostNoboolean
Optional flag. Default false. Example: autoPost=true.
tournamentNostring
Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo
includeAllNoboolean
Include Challenger/ITF and full history where supported. Example: includeAll=true
includeNostring
Additive only. Comma-separated: preMatchOdds, predictionSummary, all. Default already includes matchId and h2hSummary. Example: include=preMatchOdds,predictionSummary.
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/upcoming/matches/atp?include=all' \
	--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 ยท Plan-restricted field.

FieldTypeDescription
totalintegerTotal matches matching the filter.
matchesarrayPage of upcoming matches.
page / pageNo / pageSize / limit / hasNextPage / totalPagesmixedPagination (advanced family uses page + limit; pageNo/pageSize are also returned).
matches[].id / matchIdintegerMatch ID for this upcoming row. Use with GET /tennis/v2/matches/{matchId} and /prediction, /odds, /stats, /live.
matches[].liveMatchIdstringThis match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update.
matches[].links.match / links.livestringReady-to-call paths: the match detail route, and the live route that returns the live score, statistics, timeline and live eventId once the match is in the live feed ({} before).
matches[].tournamentobjectid, name, date, rankId, country, court.
matches[].datestringScheduled start ISO-8601 UTC.
matches[].player1 / player2objectid, name, odd, countryAcr, seed, image. player1 is first-listed, not predicted winner.
matches[].oddsobjectFull bookmaker markets when present (k1, k2, total, ktm, ktb, โ€ฆ) โ€” see odds glossary. All plans; preMatchOdds repeats the match-winner prices.
matches[].h2hstringCareer H2H as player1Wins-player2Wins string, e.g. 4-1.
matches[].h2hSummaryobjectAdditive factual H2H: matchCount, player1Wins, player2Wins (always present on upcoming lists).
matches[].preMatchOddsobjectAdditive. Only when include=preMatchOdds (or include=all): player1, player2 (match-winner odds) and updatedAt, which is always null because the odds source has no update time.
matches[].predictionSummaryobjectAdditive when include=predictionSummary|all. Bookmaker-implied view (source=oddsImplied): predictedWinnerId, bookmakerOdds, player1ImpliedProbability, player2ImpliedProbability, normalized.
matches[].modelPredictionobjectAlways present. ULTRA/MEGA: SportsAPI365 model view (available, source, predictedWinnerId, player1WinProbability, player2WinProbability). FREE/PRO: plan_restricted stub with message "Upgrade Plan to see this" (field kept visible; not null). Separate from predictionSummary.
matches[].linksobjectReady-made URLs for this match's detail routes.
matches[].tournament.idnumberTournament season ID.
matches[].tournament.namestringTournament name.
matches[].tournament.datestringTournament start date (ISO-8601 UTC).
matches[].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, โ€ฆ
matches[].tournament.countrystringCountry of the tournament: three-letter code, or { name, acronym }.
matches[].tournament.courtobjectCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
matches[].tournament.court.namestringCourt surface name, e.g. Hard, Clay, Grass, I.hard.
matches[].courtstringCourt surface of the match as a name, e.g. "Hard".
matches[].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.
matches[].ranknumberTournament level ID of the match (TourRank).
matches[].typestringDataset: atp or wta.
matches[].odds.id_b_onumberArchive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ).
matches[].odds.totalnumberGames-total line that ktb (over) and ktm (under) refer to, or null.
matches[].odds.k1numberMatch-winner odds for player 1 (decimal).
matches[].odds.k2numberMatch-winner odds for player 2 (decimal).
matches[].odds.ktbnumberOver odds for the games-total line in total, or null.
matches[].odds.ktmnumberUnder odds for the games-total line in total, or null.
matches[].player1.namestringPlayer 1 name.
matches[].player1.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
matches[].player1.countryAcrstringPlayer 1 country code.
matches[].player1.seednullTournament seed as a string, or null when unseeded.
matches[].player1.imagestringPlayer photo path on this API (append to the base URL).
matches[].player1.image_p_namestringPlayer photo path keyed by player name (alternative to image).
matches[].player1.idnumberPlayer 1 ID.
matches[].player2.idnumberPlayer 2 ID.
matches[].player2.namestringPlayer 2 name.
matches[].player2.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
matches[].player2.countryAcrstringPlayer 2 country code.
matches[].player2.seednullTournament seed as a string, or null when unseeded.
matches[].player2.imagestringPlayer photo path on this API (append to the base URL).
matches[].player2.image_p_namestringPlayer photo path keyed by player name (alternative to image).
matches[].h2hSummary.matchCountnumberCareer meetings between the two players.
matches[].h2hSummary.player1WinsnumberCareer head-to-head wins of player 1.
matches[].h2hSummary.player2WinsnumberCareer head-to-head wins of player 2.
matches[].preMatchOdds.player1numberMatch-winner odds for player 1 (decimal).
matches[].preMatchOdds.player2numberMatch-winner odds for player 2 (decimal).
matches[].preMatchOdds.updatedAtnullAlways null: the pre-match odds source does not record when prices were updated. Kept for a stable shape.
matches[].predictionSummary.availablebooleantrue when both headline odds exist and a favourite can be derived.
matches[].predictionSummary.sourcestringAlways "oddsImplied": derived from bookmaker odds.
matches[].predictionSummary.predictedWinnerIdnumberPlayer ID of the predicted winner.
matches[].predictionSummary.bookmakerOddsobjectHeadline bookmaker odds used for the implied probabilities: player1, player2.
matches[].predictionSummary.bookmakerOdds.player1numberBookmaker match-winner odds for player 1.
matches[].predictionSummary.bookmakerOdds.player2numberBookmaker match-winner odds for player 2.
matches[].predictionSummary.player1ImpliedProbabilitynumberImplied win probability for player 1 in percent (normalised).
matches[].predictionSummary.player2ImpliedProbabilitynumberImplied win probability for player 2 in percent (normalised).
matches[].predictionSummary.normalizedbooleantrue when the implied probabilities were normalised to sum to 100 (bookmaker margin removed).
matches[].modelPrediction.availablebooleantrue when model probabilities are present; false when not yet available or plan-restricted.
matches[].modelPrediction.sourcestringAlways "sportsapi365" (proprietary model).
matches[].modelPrediction.predictedWinnerIdnumberPlayer ID of the predicted winner.
matches[].modelPrediction.player1WinProbabilitynumberModel win probability for player 1 in percent; null when not available.
matches[].modelPrediction.player2WinProbabilitynumberModel win probability for player 2 in percent; null when not available.

Match by matchId (detail aliases)

โ„น๏ธ
Bridge from discovery โ†’ detail

Take matchId from upcoming, fixtures or results rows. The response's links are ready-to-call paths for this match: each one is a documented endpoint below (or, for point-by-point, the live PBP route).

Upcoming โ†’ live in one call: every upcoming row has links.live (/tennis/v2/matches/{matchId}/live). It returns the live score, statistics, timeline and the live eventId for the live odds routes and Socket.IO. liveMatchId on the same row equals matchId on live rows, so live data can also be matched without a call.

Live โ†’ final result: once the match is completed it moves to results with a new matchId. /tennis/v2/matches/{liveMatchId}?type=atp|wta finds the same match at every stage (schedule, then completed), so keep liveMatchId to follow a fixture to its result.

GET/tennis/v2/matches/{matchId}
Resolves an upcoming (today) or completed match id and returns player and tournament context, its liveMatchId and links to its detail routes. links.prediction is present only for upcoming matches; links.live returns the live state; links.pointByPoint goes to the live service's Get Point By Point route for these players on the match day (present when the match has a date; GET /matches/{matchId}/point-by-point returns the same data, under result, or {} when there is none). A bye has isBye: true and bye: true on its empty side. A slot still waiting for its players (the feed's 'Unknown Player' placeholder, with no bye result) has awaitingParticipants: true and tbd: true on that player. Neither returns links or a liveMatchId. An upcoming matchId stays the same while the match is on the schedule (it changes only if a slot's players change, e.g. a qualifier is filled in). The completed match in results has its own matchId: to follow a match from the schedule to its final result, pass its liveMatchId as the matchId (player1Id-player2Id-tournamentId-roundId, players in either order). Unknown query parameters return 400. Pass type and source (as given in links from other rows) so the right match is selected.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From upcoming matchId / fixtures matchId / results matchId, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity: the same number can be a men's and a women's match.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/1300?type=atp' \
	--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
matchIdintegerResolved match ID from the upcoming schedule or completed results.
sourcestringtoday = still on the upcoming schedule; game = completed archive.
typestringatp or wta.
player1 / player2objectid and name.
liveMatchIdstringThis match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId" (matchId on live rows and event-update). Absent for a bye.
linksobjectReady-to-call paths: prediction (upcoming matches only, MEGA), odds, stats, live and pointByPoint (live Get Point By Point, by player names and match day; absent without a date) โ€” all plans. Empty ({}) for a bye, which has no opponent.
datestringDate/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date.
resultstringScore string, e.g. "6-3 6-4"; empty string until the match is played.
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.
tournamentIdnumberNumeric tournament season ID (one edition of an event).
player1.idnumberPlayer 1 ID.
player1.namestringPlayer 1 name.
player2.idnumberPlayer 2 ID.
player2.namestringPlayer 2 name.
links.predictionstringURL of the match prediction route (MEGA).
links.oddsstringURL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true.
links.statsstringURL of the completed-match statistics route (all plans).
links.livestringURL of the match's live route: live score, statistics, timeline and the live eventId ({} until the match is in the live feed).
links.pointByPointstringURL of the live Get Point By Point route for these players on the match day; absent when the match has no date.

Live Match by matchId

GET/tennis/v2/matches/{matchId}/live
Live status, score, current-game points, server, statistics and timeline for an upcoming or in-play match, plus its live eventId for the live odds routes and Socket.IO โ€” all plans. Use the matchId from upcoming or fixtures rows (or call links.live). Before the match is in the live feed, or for a bye, the response is {}.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming or fixtures rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/1300/live?type=atp' \
	--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 ยท LiveEvent.

FieldTypeDescription
matchIdintegerThe matchId you called with (upcoming or fixtures).
liveMatchIdstring"player1Id-player2Id-tournamentId-roundId": the live service's matchId for this match.
eventIdstringLive event id. Use it with the live odds, statistics and timeline routes and with Socket.IO join-event.
statusstringLive status from the feed, e.g. Not Started, InPlay, Ended.
scorestring|nullSet scores so far, comma-separated ("6-4,2-2"). null before the first game.
pointsstring|nullPoints in the current game ("30-15"). null when the feed has no point score.
indicatorstring|nullWho is serving: "1,0" = player 1, "0,1" = player 2.
startTimestampinteger|nullScheduled start, Unix seconds.
player1 / player2objectid and name (core player IDs, usable on every player route).
tournamentobjectid (core tournament ID) and name.
statsobject|nullLive summary stats: each key is [player1, player2] as strings (aces, double_faults, win_1st_serve %, break_point_conversions %).
timelinearray|nullGame-by-game log, oldest first: id and text.
typestringDataset: atp (men) or wta (women).
player1.idnumberPlayer 1 ID.
player1.namestringPlayer 1 name.
player2.idnumberPlayer 2 ID.
player2.namestringPlayer 2 name.
tournament.idnumberTournament season ID.
tournament.namestringTournament name.
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.
stats.acesarrayAces: [participant1, participant2] as strings.
stats.double_faultsarrayDouble faults: [participant1, participant2] as strings.
stats.win_1st_servearrayFirst-serve points won %: [participant1, participant2] as strings.
stats.break_point_conversionsarrayBreak-point conversion %: [participant1, participant2] as strings.
timeline[].idstringUnique timeline event ID.
timeline[].textstringHuman-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30".

Match Prediction by matchId

โš ๏ธ
MEGA plan only

MEGA required. FREE, PRO and ULTRA receive HTTP 403 with error: "plan_restricted".

โ„น๏ธ
Scheduled matches only

Only for upcoming (today) matches: a completed matchId returns 400. Same response as Match Prediction & Analysis Paragraph.

GET/tennis/v2/matches/{matchId}/prediction
The Match Prediction & Analysis Paragraph for this match, found by matchId instead of player names.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/1235/prediction' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
paragraphstringMatch Prediction & Analysis Paragraph as an HTML list (<ul><li>โ€ฆ</li></ul>). Render as HTML or strip the tags.

Match Odds by matchId

โš ๏ธ
Map prices by player ID, not by position

k1 is the price of the player in id1_o, k2 of the player in id2_o. That order can differ from the match row: completed matches list the winner as player1. Example, match 64511042: the match row has player1 Thiago Seyboth Wild (36858), player2 Francisco Comesana (61971); the Marathonbet row has id1_o 61971 with k1 2.08 and id2_o 36858 with k21.65, so Seyboth Wild's price is 1.65 and Comesana's 2.08.

prices = { [Number(o.id1_o)]: o.k1, [Number(o.id2_o)]: o.k2 }
player1Price = prices[match.player1.id]

Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides.

GET/tennis/v2/matches/{matchId}/odds
Full pre-match odds rows (all markets) for this match, upcoming or completed. Same fields as Match Odds (All Markets). k1 is the price of the player in id1_o and k2 of the player in id2_o, which can be the reverse of the match row's player order (completed matches list the winner first): map prices by player ID, not by position.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/1242306/odds?type=atp' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
odds[].id_b_ostringBookmaker ID as a numeric string: "1" = Marathonbet, "2" = Pinnacle.
odds[].id1_o / id2_ostringPlayer 1 / player 2 IDs for this odds row (numeric strings).
odds[].id_t_ostringTournament season ID (numeric string).
odds[].id_r_ointegerRound ID.
odds[].k1 / k2numberMatch-winner (moneyline) odds: k1 is the price of the player in id1_o, k2 of the player in id2_o. This order can differ from the match row (completed matches list the winner as player1), so map prices by ID, never by position: { [id1_o]: k1, [id2_o]: k2 }. Compare IDs as numbers (id1_o/id2_o are numeric strings). Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides.
odds[].totalnumber | nullGames-total line that ktb/ktm refer to (e.g. 21.5); null when the market is not offered.
odds[].ktb / ktmnumber | nullOver (ktb) and under (ktm) odds for that total line; null when not offered.
odds[].f1 / f2number | nullGames handicap for player 1 / player 2; null when not offered.
odds[].kf1 / kf2number | nullOdds for the corresponding handicap; null when not offered.
odds[].k20 / k21 / k12 / k02number | nullCorrect set score 2โ€“0, 2โ€“1, 1โ€“2, 0โ€“2 odds; null when not offered.
odds[].k30 / k31 / k32 / k23 / k13 / k03number | nullCorrect set score 3โ€“0 โ€ฆ 0โ€“3 odds (best of five); null when not offered.
oddsarrayOdds object documented in the rows below.
odds[]objectOne item of `odds`; its fields are listed below.
odds[].bookmakerstringBookmaker name.

Match Statistics by matchId

GET/tennis/v2/matches/{matchId}/stats
Completed-match statistics for both players (all plans) โ€” the same data as H2H Match Stats by Tournament. Not live statistics: those are on Live Scores, Stats & Odds. An upcoming match has no statistics yet and returns {}.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/1242306/stats?type=atp' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
dataobjectResponse payload: the list or object documented in the rows below.
data.player1StatsobjectAggregated statistics of player 1 in the selected meetings.
data.player1Stats.player1IdnumberNumeric ID of player 1.
data.player1Stats.acesnumberAces served. Counted over the matches in this selection.
data.player1Stats.doubleFaultsnumberDouble faults. Counted over the matches in this selection.
data.player1Stats.firstServenumberFirst serves landed in. Counted over the matches in this selection.
data.player1Stats.firstServeOfnumberFirst-serve attempts (total service points). Counted over the matches in this selection.
data.player1Stats.winningOnFirstServenumberPoints won on first serve. Counted over the matches in this selection.
data.player1Stats.winningOnFirstServeOfnumberPoints played on first serve (first serves in). Counted over the matches in this selection.
data.player1Stats.winningOnSecondServenumberPoints won on second serve. Counted over the matches in this selection.
data.player1Stats.winningOnSecondServeOfnumberPoints played on second serve. Counted over the matches in this selection.
data.player1Stats.breakPointFacedGmnumberBreak points faced on serve. Counted over the matches in this selection.
data.player1Stats.breakPointSavedGmnumberBreak points saved on serve. Counted over the matches in this selection.
data.player1Stats.breakPointChanceGmnumberBreak-point chances on return. Counted over the matches in this selection.
data.player1Stats.breakPointWonGmnumberBreak points converted on return. Counted over the matches in this selection.
data.player1Stats.winnersnullWinners (where tracked). Counted over the matches in this selection.
data.player1Stats.unforcedErrorsnullUnforced errors (where tracked). Counted over the matches in this selection.
data.player1Stats.netApproachesnullNet approaches won (where tracked). Counted over the matches in this selection.
data.player1Stats.netApproachesOfnullNet approaches made (where tracked). Counted over the matches in this selection.
data.player1Stats.totalPointsWonnumberTotal points won. Counted over the matches in this selection.
data.player1Stats.fastestServenullFastest serve in km/h (where tracked).
data.player1Stats.averageFirstServeSpeednullAverage first-serve speed in km/h (where tracked).
data.player1Stats.averageSecondServeSpeednullAverage second-serve speed in km/h (where tracked).
data.player2StatsobjectAggregated statistics of player 2 in the selected meetings.
data.player2Stats.player2IdnumberNumeric ID of player 2.
data.player2Stats.acesnumberAces served. Counted over the matches in this selection.
data.player2Stats.doubleFaultsnumberDouble faults. Counted over the matches in this selection.
data.player2Stats.firstServenumberFirst serves landed in. Counted over the matches in this selection.
data.player2Stats.firstServeOfnumberFirst-serve attempts (total service points). Counted over the matches in this selection.
data.player2Stats.winningOnFirstServenumberPoints won on first serve. Counted over the matches in this selection.
data.player2Stats.winningOnFirstServeOfnumberPoints played on first serve (first serves in). Counted over the matches in this selection.
data.player2Stats.winningOnSecondServenumberPoints won on second serve. Counted over the matches in this selection.
data.player2Stats.winningOnSecondServeOfnumberPoints played on second serve. Counted over the matches in this selection.
data.player2Stats.breakPointFacedGmnumberBreak points faced on serve. Counted over the matches in this selection.
data.player2Stats.breakPointSavedGmnumberBreak points saved on serve. Counted over the matches in this selection.
data.player2Stats.breakPointChanceGmnumberBreak-point chances on return. Counted over the matches in this selection.
data.player2Stats.breakPointWonGmnumberBreak points converted on return. Counted over the matches in this selection.
data.player2Stats.winnersnullWinners (where tracked). Counted over the matches in this selection.
data.player2Stats.unforcedErrorsnullUnforced errors (where tracked). Counted over the matches in this selection.
data.player2Stats.netApproachesnullNet approaches won (where tracked). Counted over the matches in this selection.
data.player2Stats.netApproachesOfnullNet approaches made (where tracked). Counted over the matches in this selection.
data.player2Stats.totalPointsWonnumberTotal points won. Counted over the matches in this selection.
data.player2Stats.fastestServenullFastest serve in km/h (where tracked).
data.player2Stats.averageFirstServeSpeednullAverage first-serve speed in km/h (where tracked).
data.player2Stats.averageSecondServeSpeednullAverage second-serve speed in km/h (where tracked).

Point-by-Point by matchId

GET/tennis/v2/matches/{matchId}/point-by-point
Point-by-point (every game with its server and the score after each point) for an upcoming, in-play or completed match, found by matchId โ€” all plans. The data is the same as links.pointByPoint (Get Point By Point by player names and match day), returned under result. {} when the match has no point-by-point data.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity: the same number can be a men's and a women's match.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/131779990/point-by-point?type=atp&source=game' \
	--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 ยท Point-by-point set and game.

FieldTypeDescription
matchIdintegerThe requested matchId.
availablebooleantrue when point-by-point data was found.
sourcestringlive (the live service, recent matches) or archive (older matches).
player1 / player2objectsource live: player names in the order of the point-by-point data (server 1 is player1). This can be the reverse of player1/player2 on the match row, so join by name.
result.sets[].games[]arraysource live: one row per game: gameNumber, server (1 or 2), tiebreak, finalScore (games after this game) and fifteens_content (the score after each point; BP marks a break point).
result.scorestringSet scores, e.g. 3-6 5-7.
matchInfo / dataobject / arrayOnly when source is archive (in place of player1, player2 and result): the archived match keys and its point rows.
typestringDataset: atp (men) or wta (women).
player1.namestringPlayer 1 name.
player2.namestringPlayer 2 name.
resultobjectResponse payload object documented in the rows below.
result.setsarraySets with their games (point-by-point).
result.sets[]objectOne item of `result.sets`; its fields are listed below.
result.sets[].games[].servernumberWho served the game: 1 = player 1, 2 = player 2, 0 = unknown.
result.sets[].games[].tiebreakbooleantrue when this game is a tiebreak.
result.sets[].games[].finalScorestringGames score in the set after this game, e.g. "3-2".
result.sets[].games[].gameNumbernumberGame number within the set (1-based).
result.sets[].games[].fifteens_contentstringPoint-by-point score of the game, comma-separated, as "player1:player2" after each point (e.g. "15:0, 30:0, 40:15"). "BP" marks a break point; in tiebreaks the serving side is marked with * ("*1:0" = player 1 served).
result.sets[].setScorestringFinal score of the set, e.g. "6-3" or "7-6"; empty while the set is in progress.
result.sets[].setNumbernumberSet number (1-based).

Match Odds (All Markets)

โš ๏ธ
Odds field names are legacy abbreviations

Keys such as k1, ktb, and f1 are not renamed (existing clients depend on them). Meanings are listed in the response properties below. total is the game line for over/under; ktb = over, ktm = under.

GET/tennis/v2/upcoming/matchodds/{atp|wta}
This example uses atp. Use wtafor the women's dataset.Returns bookmaker odds for one upcoming matchup (moneyline, game totals, handicaps, set scores when offered).

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
player1IdYesstring
First player: numeric ID or display name. Example player1Id=40434 or player1Id=Jannik Sinner
player2IdNostring
Second player: numeric ID or display name. Example player2Id=68074 or player2Id=Carlos Alcaraz
tournamentIdYesinteger
Filter by tournament id. Example: tournamentId=21331
roundIdYesinteger
Filter by round ID. Example: roundId=9
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/upcoming/matchodds/atp?tournamentId=21352&roundId=12&player1Id=22807&player2Id=29372' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
oddsarrayOne object per bookmaker row (typically Marathonbet then Pinnacle).
odds[].id_b_ostringBookmaker ID as a numeric string: "1" = Marathonbet, "2" = Pinnacle.
odds[].id1_o / id2_ostringPlayer 1 / player 2 IDs for this odds row (numeric strings).
odds[].id_t_ostringTournament season ID (numeric string).
odds[].id_r_ointegerRound ID.
odds[].k1 / k2numberMatch-winner (moneyline) odds: k1 is the price of the player in id1_o, k2 of the player in id2_o. This order can differ from the match row (completed matches list the winner as player1), so map prices by ID, never by position: { [id1_o]: k1, [id2_o]: k2 }. Compare IDs as numbers (id1_o/id2_o are numeric strings). Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides.
odds[].totalnumber | nullGames-total line that ktb/ktm refer to (e.g. 21.5); null when the market is not offered.
odds[].ktb / ktmnumber | nullOver (ktb) and under (ktm) odds for that total line; null when not offered.
odds[].f1 / f2number | nullGames handicap for player 1 / player 2; null when not offered.
odds[].kf1 / kf2number | nullOdds for the corresponding handicap; null when not offered.
odds[].k20 / k21 / k12 / k02number | nullCorrect set score 2โ€“0, 2โ€“1, 1โ€“2, 0โ€“2 odds; null when not offered.
odds[].k30 / k31 / k32 / k23 / k13 / k03number | nullCorrect set score 3โ€“0 โ€ฆ 0โ€“3 odds (best of five); null when not offered.
odds[].bookmakerstringBookmaker name.

Top Matches Today

โ„น๏ธ
Odds by plan

Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).

GET/tennis/v2/upcoming/top-tennis-matches-today/{atp|wta}
This example uses atp. Use wtafor the women's dataset.Returns todayโ€™s most significant singles matches (those with a prior H2H). modelPrediction (win probabilities) is ULTRA / MEGA; every other field is on all plans

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/upcoming/top-tennis-matches-today/atp' \
	--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 ยท Plan-restricted field.

FieldTypeDescription
[]objectOne item of the response; its fields are listed below.
[].idnumberNumeric ID of this item (see the parent object: match, player, tournament, live event, โ€ฆ).
[].matchIdnumberMatch ID (same value as id on core match rows).
[].liveMatchIdstringKey of this match in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update.
[].linksobjectReady-made URLs for this match's detail routes.
[].links.matchstringURL of the match detail route (/tennis/v2/matches/{matchId}); source=game marks a completed match.
[].links.livestringURL of the match's live route: live score, statistics, timeline and the live eventId ({} until the match is in the live feed).
[].tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
[].tournament.idnumberTournament season ID.
[].tournament.namestringTournament name.
[].tournament.datestringTournament start date (ISO-8601 UTC).
[].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, โ€ฆ
[].tournament.countrystringCountry of the tournament: three-letter code, or { name, acronym }.
[].tournament.courtobjectCourt surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }.
[].tournament.court.namestringCourt surface name, e.g. Hard, Clay, Grass, I.hard.
[].courtstringCourt surface name, e.g. "Hard".
[].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.
[].ranknumberTournament level ID (TourRank).
[].datestringDate/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date.
[].typestringDataset: atp (men) or wta (women).
[].oddsobjectOdds object documented in the rows below.
[].odds.id_b_onumberArchive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ).
[].odds.totalnumberGames-total line that ktb (over) and ktm (under) refer to, or null.
[].odds.k1numberMatch-winner odds for player 1 (decimal).
[].odds.k2numberMatch-winner odds for player 2 (decimal).
[].odds.ktbnumberOver odds for the games-total line in total, or null.
[].odds.ktmnumberUnder odds for the games-total line in total, or null.
[].player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
[].player1.namestringPlayer 1 name.
[].player1.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
[].player1.countryAcrstringPlayer 1 country code.
[].player1.seedstringTournament seed as a string, or null when unseeded.
[].player1.imagestringPlayer photo path on this API (append to the base URL).
[].player1.image_p_namestringPlayer photo path keyed by player name (alternative to image).
[].player1.idnumberPlayer 1 ID.
[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
[].player2.idnumberPlayer 2 ID.
[].player2.namestringPlayer 2 name.
[].player2.oddstringPre-match match-winner odds for this player (decimal), as a string; null when not available.
[].player2.countryAcrstringPlayer 2 country code.
[].player2.seednullTournament seed as a string, or null when unseeded.
[].player2.imagestringPlayer photo path on this API (append to the base URL).
[].player2.image_p_namestringPlayer photo path keyed by player name (alternative to image).
[].h2hstringCareer head-to-head as "player1Wins-player2Wins", e.g. "4-1".
[].h2hSummaryobjectFactual career head-to-head: matchCount, player1Wins, player2Wins.
[].h2hSummary.matchCountnumberCareer meetings between the two players.
[].h2hSummary.player1WinsnumberCareer head-to-head wins of player 1.
[].h2hSummary.player2WinsnumberCareer head-to-head wins of player 2.
[].modelPredictionobjectSportsAPI365 model win probabilities (ULTRA / MEGA). On FREE / PRO this field is a plan_restricted object (available: false, error, message, requiredPlan: "ULTRA", upgradeUrl).
[].modelPrediction.availablebooleantrue when model probabilities are present; false when not yet available or plan-restricted.
[].modelPrediction.sourcestringAlways "sportsapi365" (proprietary model).
[].modelPrediction.predictedWinnerIdnumberPlayer ID of the predicted winner.
[].modelPrediction.player1WinProbabilitynumberModel win probability for player 1 in percent; null when not available.
[].modelPrediction.player2WinProbabilitynumberModel win probability for player 2 in percent; null when not available.

Match Prediction & Analysis Paragraph

โ„น๏ธ
Scheduled matches only

This endpoint only returns data for matches currently scheduled (today or upcoming). If the example players have already played, use two players from Upcoming Matches.

โš ๏ธ
MEGA plan only

The Match Prediction & Analysis Paragraph endpoint is available exclusively to MEGA plan subscribers and is not included with PRO or ULTRA plans. Restricted calls return HTTP 403 with error: plan_restricted.

GET/tennis/v2/upcoming/match-prediction/{atp|wta}/{player1}/{player2}
This example uses atp. Use wtafor the women's dataset.Returns the Match Prediction & Analysis Paragraph for this matchup: the H2H Stats Prediction Insights narrative as an HTML list (<ul><li>โ€ฆ</li></ul>, one insight per item) โ€” render it as HTML or strip the tags for plain text. MEGA only. Optional onlyImp=true keeps the high-signal insights.

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.
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz

Query Parameter

ParameterRequiredTypeDescription
includeAllNoboolean
Include Challenger/ITF and full history where supported. Example: includeAll=true
onlyImpNoboolean
When true, returns only the high-signal prediction bullets. Example: onlyImp=true.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/upcoming/match-prediction/atp/Alexander%20Zverev/Cameron%20Norrie' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
paragraphstring (HTML)H2H Stats Prediction Insights narrative as an HTML list: <ul> with one <li> per insight (H2H record, career-best year, recent form, surface, pressure points, opponent quality). Render as HTML, or strip the tags for plain text.

H2H Prediction Analysis by Player Names

โš ๏ธ
MEGA plan only

This written matchup analysis is part of the Match Prediction & Analysis Paragraph, available exclusively to MEGA plan subscribers. It is not included with FREE, PRO or ULTRA plans. FREE, PRO and ULTRA receive HTTP 403 with error: "plan_restricted".

GET/tennis/v2/aggregate/head-to-head/prediction/raw
Returns the written prediction analysis for an upcoming match between two players: second serve and return patterns, performance under pressure, surface strength, deciding sets and event insights, as plain text in titled sections separated by blank lines. Pass both player names; the order does not matter. date_only (YYYY-MM-DD) is optional and selects the match date. When no analysis exists for the matchup, result is null.

Query Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz
date_onlyNostring
Target date in YYYY-MM-DD format. Example: 2026-01-01.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/aggregate/head-to-head/prediction/raw?player1=Carlos%20Alcaraz&player2=Alex%20Michelsen&date_only=2026-09-30' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
successbooleanfalse when a required parameter is missing (player1 and player2 are both required).
resultobject | nullPrediction analysis for the matchup, or null when none is available for these players / date.
result.player1stringFirst player as stored for the match (may be either of the names you sent).
result.player2stringSecond player as stored for the match.
result.datestring (ISO-8601 UTC)Scheduled start of the match the analysis is for.
result.predictionstringPlain-text analysis in titled sections (e.g. Second Serve & Return Patterns, Under Pressure & Performance Record, Surface Strength & Player Level, Match Opportunities & Deciding Sets, Event Insights), separated by blank lines.
result.lastUpdatedAtstring (Unix seconds)When the analysis was last generated.

H2H Model Prediction (Win Probabilities) by Player Names

โ„น๏ธ
ULTRA+

SportsAPI365 model win probabilities require the ULTRA or MEGA plan. FREE / PRO receive HTTP 403 (plan_restricted).

โ„น๏ธ
Scheduled matches only

This endpoint only returns data for matches currently scheduled (today or upcoming). If the example players have already played, use two players from Upcoming Matches.

GET/tennis/v2/aggregate/head-to-head/model/prediction
Returns the SportsAPI365 model prediction for an upcoming match between two players: the predicted winner (name and player ID) and each player's win probability in percent. Pass both players by full display name (e.g. player1=Alexander Zverev), not numeric IDs: IDs are not matched and return result null. date_only (YYYY-MM-DD) is optional and selects the match date. player1 / player2 in the response follow the scheduled match order, which may differ from the order you sent, so read the probabilities by name or by predictedWinnerId. When no prediction exists for the matchup, result.prediction (or result) is null.

Query Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz
date_onlyNostring
Target date in YYYY-MM-DD format. Example: 2026-01-01.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/aggregate/head-to-head/model/prediction?player1=Mitchell%20Krueger&player2=Stefan%20Kozlov&date_only=2026-10-01' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
successbooleanfalse when a required parameter is missing (player1 and player2 are both required).
resultobject | nullnull when the matchup is not found.
result.predictionobject | nullModel prediction for the matchup, or null when none is available yet for these players / date.
result.prediction.sourcestringAlways sportsapi365 (proprietary model, not bookmaker-implied).
result.prediction.player1 / player2stringPlayers in scheduled match order (may differ from the order you sent).
result.prediction.availablebooleantrue when probabilities are present.
result.prediction.predictedWinnerstringName of the player the model favours.
result.prediction.predictedWinnerIdintegerPlayer ID of the favoured player (same IDs as the rest of the API).
result.prediction.player1WinProbability / player2WinProbabilitynumberWin probability in percent for result.prediction.player1 / player2; the two add up to 100.

Upcoming Filters by Tour

GET/tennis/v2/upcoming/filters/{atp|wta}
This example uses atp. Use wtafor the women's dataset.Returns available filter values (tournaments, rounds, surfaces) for upcoming matches

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/upcoming/filters/atp' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
[]objectOne item of the response; its fields are listed below.
[].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, โ€ฆ
[].namestringDisplay name.

All Upcoming Filters

GET/tennis/v2/upcoming/filters
Returns available all filter values (tournaments, rounds, surfaces) for upcoming matches
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/upcoming/filters' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
[]objectOne item of the response; its fields are listed below.
[].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, โ€ฆ
[].namestringDisplay name.