API Reference
Head-to-Head Stats & Analysis
Use the core routes for H2H wins, match lists, aggregated stats, and filters. Paths accept a numeric ID or a URL-encoded display name.
Endpoint Summary
|
|
|
|
|
|
H2H Summary by Player IDs
/tennis/v2/{atp|wta}/h2h/info/{player1_id}/{player2_id}atp. Use wtafor the women's dataset.Returns how many times each player has beaten the other, split by court surface. Path accepts numeric IDs or URL-encoded display names. Counts official H2H matches only by default; add includeAll=true to include Challenger, ITF and qualifying matches.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id | Yes | string | First player: numeric ID or display name. Example: 68074 or Carlos Alcaraz. |
player2_id | Yes | string | Second player: numeric ID or display name. Example: 47275 or Jannik Sinner. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Default false: only official H2H matches count (tour level: Grand Slams, Masters, ATP/WTA Tour, Tour Finals, Davis Cup / BJK Cup, Olympics). Challenger, Futures/ITF and qualifying-round matches are left out, matching the official ATP/WTA head-to-head. Set includeAll=true to include them. Example: includeAll=true |
Response Properties
| Field | Type | Description |
|---|---|---|
data | array | One object per court surface where these two players have met. |
courtId | integer | Surface ID. Resolve names with GET /tennis/v2/court. |
court | string | Surface label, e.g. Hard, Clay, I.hard, Grass. |
player1wins | string | Wins on this surface for the first path player. |
player2wins | string | Wins on this surface for the second path player. |
H2H Matches by Player IDs
/tennis/v2/{atp|wta}/h2h/matches/{player1_id}/{player2_id}atp. Use wtafor the women's dataset.Returns the full list of past matches between two players. On these rows player1 is the winner. Path accepts numeric IDs or URL-encoded names. Counts official H2H matches only by default; add includeAll=true to include Challenger, ITF and qualifying matches. odd1 / odd2 are Marathonbetโs pre-match prices for player1 / player2; when the stored values were null they are filled from the Marathonbet odds archive by player ID. Doubles sides also carry members: [{id, name}] for the two players (id null when the name is not unique).Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id | Yes | string | First player: numeric ID or display name. Example: 68074 or Carlos Alcaraz. |
player2_id | Yes | string | Second player: numeric ID or display name. Example: 47275 or Jannik Sinner. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Default false: only official H2H matches count (tour level: Grand Slams, Masters, ATP/WTA Tour, Tour Finals, Davis Cup / BJK Cup, Olympics). Challenger, Futures/ITF and qualifying-round matches are left out, matching the official ATP/WTA head-to-head. Set includeAll=true to include them. Example: includeAll=true |
include | No | string | Comma-separated extra objects to add. round returns the human-readable tournament round associated with roundId, for example Quarter-Final, Semi-Final or Final (full lookup: GET /tennis/v2/round). Also tournament, tournament.court, tournament.rank, tournament.country, stat (per-match serve & return statistics).Example: include=round,tournament.court |
filter | No | string | Semicolon-separated filters in Key:value format. Available filters:
filter=GameYear:2024,2025;TourRank:4. Unknown filter names return 400 listing the supported ones. |
surface | No | string | Only hard, clay, grass, or carpet on this core route. Same as filter=GameCourt:<id> with the GET /court IDs: hard 1, clay 2, carpet 4, grass 5 (indoor hard, 3, has no surface value; use filter=GameCourt:3). Other values return 400. Example: surface=clay. |
pageSize | No | integer | Results per page. When omitted, the endpoint's own default applies (100 on most list endpoints; some use 50 or 500), and the response's pageSize shows the value used. Core maximum: 500 (larger values are reduced). Example: pageSize=10. |
pageNo | No | integer | Page number, 1-indexed. Default: 1. Example: pageNo=1. Use hasNextPage in the response to check for more pages. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament.
| Field | Type | Description |
|---|---|---|
data | array | The page of results. An empty array with HTTP 200 means the request was valid and nothing matched that date, filter, or page. |
pageNo | integer | Current page, starting at 1. Also returned as page. |
pageSize | integer | Items requested for this page. Also returned as limit. Core maximum is 500. |
hasNextPage | boolean | true if another page exists. Stop when this is false or data is empty. |
id | integer | Completed-match archive ID (not a live event id). Not permanent: completed matches are renumbered when the results archive is reloaded. A recent result's id usually changes within about a day, and an old id can later belong to a different match. To store or link a match, keep its liveMatchId instead (player1Id-player2Id-tournamentId-roundId, built from this row), which /tennis/v2/matches/{matchId} accepts with the players in either order. |
date | string | Match date/time as ISO-8601. Exception: for lower-level events (TourRank 0 ITF $10K and TourRank 1 Challenger/ITF > $10K) from 2005โ2015, only the tournament start date is available, so every match of that draw carries the tournament start date; order those matches by roundId. |
result | string | Score string from the winner's (player1's) side, e.g. 6-4 6-3. Retirements and walkovers carry ret. / w/o in the score. |
player1Id / player2Id | integer | On completed matches, player1 is always the winner and player2 the loser. |
tournamentId / roundId | integer | Event edition and round. |
odd1 / odd2 | string | null | Marathonbet pre-match match-winner prices: odd1 is player1's price, odd2 player2's. When the stored values were null (the archive lists the pair the other way round, e.g. winner first), they are filled from the Marathonbet odds archive, matched by player ID. null when Marathonbet has no price; other bookmakers and markets: links.odds (/matches/{matchId}/odds). Often null on older matches. |
player1 / player2 | object | id, name, countryAcr. Doubles sides (name A/B) also carry members: [{ id, name }, { id, name }], the two players resolved by exact name; id is null when no player, or more than one, has that name. |
data[].matchId | string | Match ID (same value as id on core match rows). |
data[].match_winner | number | Player ID of the match winner. |
data[].result_type | string | How the match ended: completed, retired, walkover or default. |
data[].best_of | null | Best-of sets (3 or 5) when known, otherwise null. |
data[].player1.id | number | Player 1 ID. |
data[].player1.name | string | Player 1 name. |
data[].player1.countryAcr | string | Player 1 country code. |
data[].player2.id | number | Player 2 ID. |
data[].player2.name | string | Player 2 name. |
data[].player2.countryAcr | string | Player 2 country code. |
data[].tournament | object | Tournament object (id, name, date, level, surface, country, โฆ). |
data[].tournament.id | number | Tournament season ID. |
data[].tournament.name | string | Tournament name. |
data[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, โฆ |
data[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
data[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
data[].tournament.countryAcr | string | Three-letter country code of the tournament. |
data[].tournament.court | null | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
data[].tournament.rank | null | Tournament level: { id, name }. |
data[].tournament.country | null | Country of the tournament: three-letter code, or { name, acronym }. |
data[].oddsAvailable | boolean | true when the odds archive has pre-match prices for this match; links.odds then returns them (both bookmakers). |
data[].links | object | Ready-made URLs for this match's detail routes. |
data[].links.odds | string | URL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true. |
page | number | Current page number (1-based). |
limit | number | Items per page. |
H2H Aggregate Stats by Player IDs
/tennis/v2/{atp|wta}/h2h/stats/{player1_id}/{player2_id}atp. Use wtafor the women's dataset.Returns aggregated serve and return statistics comparing the two players over all their meetings. player1Stats is the first path player. Counts official H2H matches only by default; add includeAll=true to include Challenger, ITF and qualifying matches.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id | Yes | string | First player: numeric ID or display name. Example: 68074 or Carlos Alcaraz. |
player2_id | Yes | string | Second player: numeric ID or display name. Example: 47275 or Jannik Sinner. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Default false: only official H2H matches count (tour level: Grand Slams, Masters, ATP/WTA Tour, Tour Finals, Davis Cup / BJK Cup, Olympics). Challenger, Futures/ITF and qualifying-round matches are left out, matching the official ATP/WTA head-to-head. Set includeAll=true to include them. Example: includeAll=true |
surface | No | string | Only hard, clay, grass, or carpet on this core route. Same as filter=GameCourt:<id> with the GET /court IDs: hard 1, clay 2, carpet 4, grass 5 (indoor hard, 3, has no surface value; use filter=GameCourt:3). Other values return 400. Example: surface=clay. |
Response Properties
| Field | Type | Description |
|---|---|---|
data.matchesCount | integer | Meetings included in this aggregate. |
data.player1Stats | object | Totals for the first path player (wins, aces, surface wins, โฆ). |
data.player2Stats | object | Totals for the second path player, same shape. |
data | object | Response payload: the list or object documented in the rows below. |
data.player1Stats.id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
data.player1Stats.statMatchesPlayed | number | Matches with statistics in this selection. |
data.player1Stats.matchesWon | number | Matches won. Counted over the matches in this selection. |
data.player1Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player1Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player1Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player1Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player1Stats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player1Stats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
data.player1Stats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
data.player1Stats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
data.player1Stats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player1Stats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player1Stats.returnPtsWin | number | Return points won. Counted over the matches in this selection. |
data.player1Stats.returnPtsWinOf | number | Return points played. Counted over the matches in this selection. |
data.player1Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player1Stats.fastestServe | number | Fastest serve in km/h (where tracked). |
data.player1Stats.averageFastestServe | number | Average of the per-match fastest serves in km/h (where tracked). |
data.player1Stats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
data.player1Stats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
data.player1Stats.avgTime | string | Average match duration (H:MM:SS). |
data.player1Stats.firstServePercentage | number | First serves in as % of first-serve attempts. |
data.player1Stats.winningOnFirstServePercentage | number | First-serve points won %. |
data.player1Stats.winningOnSecondServePercentage | number | Second-serve points won %. |
data.player1Stats.returnPtsWinPercentage | number | Return points won %. |
data.player1Stats.breakpointsWonPercentage | number | Break points converted %. |
data.player1Stats.bestOfThreeWon | number | Best-of-three matches won. |
data.player1Stats.bestOfThreeWonPercentage | number | Best-of-three matches won %. |
data.player1Stats.bestOfThreeCount | number | Best-of-three matches played. |
data.player1Stats.bestOfFiveWon | number | Best-of-five matches won. |
data.player1Stats.bestOfFiveWonPercentage | number | Best-of-five matches won %. |
data.player1Stats.bestOfFiveCount | number | Best-of-five matches played. |
data.player1Stats.firstSetWinMatchWin | number | Matches won after winning the first set. |
data.player1Stats.firstSetWinMatchWinPercentage | number | % of matches won after winning the first set. |
data.player1Stats.firstSetWinMatchLose | number | Matches lost after winning the first set. |
data.player1Stats.firstSetWinMatchLosePercentage | number | % of matches lost after winning the first set. |
data.player1Stats.firstSetLoseMatchWin | number | Matches won after losing the first set. |
data.player1Stats.firstSetLoseMatchWinPercentage | number | % of matches won after losing the first set. |
data.player1Stats.firstSetWinCount | number | Matches in which the player won the first set. |
data.player1Stats.firstSetLoseCount | number | Matches in which the player lost the first set. |
data.player1Stats.decidingSetWin | number | Deciding sets won. |
data.player1Stats.decidingSetCount | number | Deciding sets played. |
data.player1Stats.decidingSetWinPercentage | number | Deciding sets won %. |
data.player1Stats.tiebreakWon | number | Tiebreaks won. |
data.player1Stats.tiebreakCount | number | Tiebreaks played. |
data.player1Stats.totalTBWinPercentage | number | Tiebreaks won %. |
data.player1Stats.setsWon | number | Sets won. |
data.player1Stats.gamesWon | number | Games won. |
data.player1Stats.title | number | Titles won. |
data.player1Stats.grandSlam | number | Grand Slam record. |
data.player1Stats.masters | number | Masters record. |
data.player1Stats.mainTour | number | Main-tour record. |
data.player1Stats.tourFinals | number | Tour Finals record. |
data.player1Stats.cups | number | Davis/Fed Cup record. |
data.player1Stats.futures | number | ITF/Futures record. |
data.player1Stats.challengers | number | Challenger record. |
data.player1Stats.hard | number | Wins on hard courts. |
data.player1Stats.clay | number | Wins on clay. |
data.player1Stats.iHard | number | Wins on indoor hard courts. |
data.player1Stats.grass | number | Wins on grass. |
data.player2Stats.id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
data.player2Stats.statMatchesPlayed | number | Matches with statistics in this selection. |
data.player2Stats.matchesWon | number | Matches won. Counted over the matches in this selection. |
data.player2Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player2Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player2Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player2Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player2Stats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player2Stats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
data.player2Stats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
data.player2Stats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
data.player2Stats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player2Stats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player2Stats.returnPtsWin | number | Return points won. Counted over the matches in this selection. |
data.player2Stats.returnPtsWinOf | number | Return points played. Counted over the matches in this selection. |
data.player2Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player2Stats.fastestServe | number | Fastest serve in km/h (where tracked). |
data.player2Stats.averageFastestServe | number | Average of the per-match fastest serves in km/h (where tracked). |
data.player2Stats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
data.player2Stats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
data.player2Stats.avgTime | string | Average match duration (H:MM:SS). |
data.player2Stats.firstServePercentage | number | First serves in as % of first-serve attempts. |
data.player2Stats.winningOnFirstServePercentage | number | First-serve points won %. |
data.player2Stats.winningOnSecondServePercentage | number | Second-serve points won %. |
data.player2Stats.returnPtsWinPercentage | number | Return points won %. |
data.player2Stats.breakpointsWonPercentage | number | Break points converted %. |
data.player2Stats.bestOfThreeWon | number | Best-of-three matches won. |
data.player2Stats.bestOfThreeWonPercentage | number | Best-of-three matches won %. |
data.player2Stats.bestOfThreeCount | number | Best-of-three matches played. |
data.player2Stats.bestOfFiveWon | number | Best-of-five matches won. |
data.player2Stats.bestOfFiveWonPercentage | number | Best-of-five matches won %. |
data.player2Stats.bestOfFiveCount | number | Best-of-five matches played. |
data.player2Stats.firstSetWinMatchWin | number | Matches won after winning the first set. |
data.player2Stats.firstSetWinMatchWinPercentage | number | % of matches won after winning the first set. |
data.player2Stats.firstSetWinMatchLose | number | Matches lost after winning the first set. |
data.player2Stats.firstSetWinMatchLosePercentage | number | % of matches lost after winning the first set. |
data.player2Stats.firstSetLoseMatchWin | number | Matches won after losing the first set. |
data.player2Stats.firstSetLoseMatchWinPercentage | number | % of matches won after losing the first set. |
data.player2Stats.firstSetWinCount | number | Matches in which the player won the first set. |
data.player2Stats.firstSetLoseCount | number | Matches in which the player lost the first set. |
data.player2Stats.decidingSetWin | number | Deciding sets won. |
data.player2Stats.decidingSetCount | number | Deciding sets played. |
data.player2Stats.decidingSetWinPercentage | number | Deciding sets won %. |
data.player2Stats.tiebreakWon | number | Tiebreaks won. |
data.player2Stats.tiebreakCount | number | Tiebreaks played. |
data.player2Stats.totalTBWinPercentage | number | Tiebreaks won %. |
data.player2Stats.setsWon | number | Sets won. |
data.player2Stats.gamesWon | number | Games won. |
data.player2Stats.title | number | Titles won. |
data.player2Stats.grandSlam | number | Grand Slam record. |
data.player2Stats.masters | number | Masters record. |
data.player2Stats.mainTour | number | Main-tour record. |
data.player2Stats.tourFinals | number | Tour Finals record. |
data.player2Stats.cups | number | Davis/Fed Cup record. |
data.player2Stats.futures | number | ITF/Futures record. |
data.player2Stats.challengers | number | Challenger record. |
data.player2Stats.hard | number | Wins on hard courts. |
data.player2Stats.clay | number | Wins on clay. |
data.player2Stats.iHard | number | Wins on indoor hard courts. |
data.player2Stats.grass | number | Wins on grass. |
H2H Filter Options by Player IDs
/tennis/v2/{atp|wta}/h2h/filter/{player1_id}/{player2_id}atp. Use wtafor the women's dataset.Returns available filter options for an H2H comparison (surfaces, years, rounds, etc.). Counts official H2H matches only by default; add includeAll=true to include Challenger, ITF and qualifying matches.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id | Yes | string | First player: numeric ID or display name. Example: 68074 or Carlos Alcaraz. |
player2_id | Yes | string | Second player: numeric ID or display name. Example: 47275 or Jannik Sinner. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Default false: only official H2H matches count (tour level: Grand Slams, Masters, ATP/WTA Tour, Tour Finals, Davis Cup / BJK Cup, Olympics). Challenger, Futures/ITF and qualifying-round matches are left out, matching the official ATP/WTA head-to-head. Set includeAll=true to include them. Example: includeAll=true |
Response Properties
Returns the distinct filter values present in the two players' H2H match history โ used to build filter UI panels.
| Field | Type | Description |
|---|---|---|
rounds | array | Distinct rounds played: each item is roundId, round. |
courts | array | Distinct court surfaces: each item is courtId, court. |
tournaments | array | Distinct tournaments where matches were played: each item is tournamentId, tournament, tournamentDate. |
tournamentRanks | array | Distinct tournament tiers: each item is rankId, rank. |
gameYears | array<number> | Distinct calendar years in which matches occurred, sorted descending. |
data | object | Response payload: the list or object documented in the rows below. |
data.rounds | array | Round filter options. |
data.rounds[] | object | One item of `data.rounds`; its fields are listed below. |
data.rounds[].roundId | number | Round ID. |
data.rounds[].round | string | Round label. |
data.courts | array | Court-surface filter options. |
data.courts[] | object | One item of `data.courts`; its fields are listed below. |
data.courts[].courtId | number | Court-surface ID. |
data.courts[].court | string | Court-surface name. |
data.tournaments | array | Tournaments. |
data.tournaments[] | object | One item of `data.tournaments`; its fields are listed below. |
data.tournaments[].tournamentId | number | Tournament season ID. |
data.tournaments[].tournament | string | Tournament name. |
data.tournaments[].tournamentDate | string | Tournament start date (ISO-8601). |
data.tournamentRanks | array | Tournament levels the player has played: rankId, rank. |
data.tournamentRanks[] | object | One item of `data.tournamentRanks`; its fields are listed below. |
data.tournamentRanks[].rankId | number | Tournament level ID. |
data.tournamentRanks[].rank | string | Tournament level name. |
data.gameYears | array | Seasons in which the player has matches (newest first). |
Player vs All Stats
/tennis/v2/{atp|wta}/h2h/vs-all-stats/{player_id}atp. Use wtafor the women's dataset.Returns this player's aggregated stats versus the combined field of all opponents (not a list of each rival). Path needs a numeric player ID.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id | Yes | string |
Response Properties
| Field | Type | Description |
|---|---|---|
data.matchesCount | string | Matches included in this aggregate. |
data.playerStats | object | This player's totals (wins, serve, return, points). |
data.opponentStats | object | Combined totals for everyone they faced โ not per-opponent rows. |
data | object | Response payload: the list or object documented in the rows below. |
data.playerStats.id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
data.playerStats.statMatchesPlayed | number | Matches with statistics in this selection. |
data.playerStats.matchesWon | number | Matches won. Counted over the matches in this selection. |
data.playerStats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.playerStats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.playerStats.aces | number | Aces served. Counted over the matches in this selection. |
data.playerStats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.playerStats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
data.playerStats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.playerStats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.playerStats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.playerStats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.playerStats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
data.playerStats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
data.playerStats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
data.playerStats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
data.playerStats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
data.playerStats.returnPtsWin | number | Return points won. Counted over the matches in this selection. |
data.playerStats.returnPtsWinOf | number | Return points played. Counted over the matches in this selection. |
data.playerStats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.playerStats.fastestServe | number | Fastest serve in km/h (where tracked). |
data.playerStats.averageFastestServe | number | Average of the per-match fastest serves in km/h (where tracked). |
data.playerStats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
data.playerStats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
data.playerStats.avgTime | string | Average match duration (H:MM:SS). |
data.playerStats.firstServePercentage | number | First serves in as % of first-serve attempts. |
data.playerStats.winningOnFirstServePercentage | number | First-serve points won %. |
data.playerStats.winningOnSecondServePercentage | number | Second-serve points won %. |
data.playerStats.returnPtsWinPercentage | number | Return points won %. |
data.playerStats.breakpointsWonPercentage | number | Break points converted %. |
data.playerStats.bestOfThreeWon | number | Best-of-three matches won. |
data.playerStats.bestOfThreeWonPercentage | number | Best-of-three matches won %. |
data.playerStats.bestOfThreeCount | number | Best-of-three matches played. |
data.playerStats.bestOfFiveWon | number | Best-of-five matches won. |
data.playerStats.bestOfFiveWonPercentage | number | Best-of-five matches won %. |
data.playerStats.bestOfFiveCount | number | Best-of-five matches played. |
data.playerStats.firstSetWinMatchWin | number | Matches won after winning the first set. |
data.playerStats.firstSetWinMatchWinPercentage | number | % of matches won after winning the first set. |
data.playerStats.firstSetWinMatchLose | number | Matches lost after winning the first set. |
data.playerStats.firstSetWinMatchLosePercentage | number | % of matches lost after winning the first set. |
data.playerStats.firstSetLoseMatchWin | number | Matches won after losing the first set. |
data.playerStats.firstSetLoseMatchWinPercentage | number | % of matches won after losing the first set. |
data.playerStats.firstSetWinCount | number | Matches in which the player won the first set. |
data.playerStats.firstSetLoseCount | number | Matches in which the player lost the first set. |
data.playerStats.decidingSetWin | number | Deciding sets won. |
data.playerStats.decidingSetCount | number | Deciding sets played. |
data.playerStats.decidingSetWinPercentage | number | Deciding sets won %. |
data.playerStats.tiebreakWon | number | Tiebreaks won. |
data.playerStats.tiebreakCount | number | Tiebreaks played. |
data.playerStats.totalTBWinPercentage | number | Tiebreaks won %. |
data.playerStats.setsWon | number | Sets won. |
data.playerStats.gamesWon | number | Games won. |
data.playerStats.title | number | Titles won. |
data.playerStats.grandSlam | number | Grand Slam record. |
data.playerStats.masters | number | Masters record. |
data.playerStats.mainTour | number | Main-tour record. |
data.playerStats.tourFinals | number | Tour Finals record. |
data.playerStats.cups | number | Davis/Fed Cup record. |
data.playerStats.futures | number | ITF/Futures record. |
data.playerStats.challengers | number | Challenger record. |
data.playerStats.hard | number | Wins on hard courts. |
data.playerStats.clay | number | Wins on clay. |
data.playerStats.iHard | number | Wins on indoor hard courts. |
data.playerStats.grass | number | Wins on grass. |
data.opponentStats.statMatchesPlayed | number | Matches with statistics in this selection. |
data.opponentStats.matchesWon | number | Matches won. Counted over the matches in this selection. |
data.opponentStats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.opponentStats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.opponentStats.aces | number | Aces served. Counted over the matches in this selection. |
data.opponentStats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.opponentStats.unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
data.opponentStats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.opponentStats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.opponentStats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.opponentStats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.opponentStats.winners | number | Winners (where tracked). Counted over the matches in this selection. |
data.opponentStats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
data.opponentStats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
data.opponentStats.netApproaches | number | Net approaches won (where tracked). Counted over the matches in this selection. |
data.opponentStats.netApproachesOf | number | Net approaches made (where tracked). Counted over the matches in this selection. |
data.opponentStats.returnPtsWin | number | Return points won. Counted over the matches in this selection. |
data.opponentStats.returnPtsWinOf | number | Return points played. Counted over the matches in this selection. |
data.opponentStats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.opponentStats.fastestServe | number | Fastest serve in km/h (where tracked). |
data.opponentStats.averageFastestServe | number | Average of the per-match fastest serves in km/h (where tracked). |
data.opponentStats.averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
data.opponentStats.averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
data.opponentStats.avgTime | string | Average match duration (H:MM:SS). |
data.opponentStats.firstServePercentage | number | First serves in as % of first-serve attempts. |
data.opponentStats.winningOnFirstServePercentage | number | First-serve points won %. |
data.opponentStats.winningOnSecondServePercentage | number | Second-serve points won %. |
data.opponentStats.returnPtsWinPercentage | number | Return points won %. |
data.opponentStats.breakpointsWonPercentage | number | Break points converted %. |
data.opponentStats.bestOfThreeWon | number | Best-of-three matches won. |
data.opponentStats.bestOfThreeWonPercentage | number | Best-of-three matches won %. |
data.opponentStats.bestOfThreeCount | number | Best-of-three matches played. |
data.opponentStats.bestOfFiveWon | number | Best-of-five matches won. |
data.opponentStats.bestOfFiveWonPercentage | number | Best-of-five matches won %. |
data.opponentStats.bestOfFiveCount | number | Best-of-five matches played. |
data.opponentStats.firstSetWinMatchWin | number | Matches won after winning the first set. |
data.opponentStats.firstSetWinMatchWinPercentage | number | % of matches won after winning the first set. |
data.opponentStats.firstSetWinMatchLose | number | Matches lost after winning the first set. |
data.opponentStats.firstSetWinMatchLosePercentage | number | % of matches lost after winning the first set. |
data.opponentStats.firstSetLoseMatchWin | number | Matches won after losing the first set. |
data.opponentStats.firstSetLoseMatchWinPercentage | number | % of matches won after losing the first set. |
data.opponentStats.firstSetWinCount | number | Matches in which the player won the first set. |
data.opponentStats.firstSetLoseCount | number | Matches in which the player lost the first set. |
data.opponentStats.decidingSetWin | number | Deciding sets won. |
data.opponentStats.decidingSetCount | number | Deciding sets played. |
data.opponentStats.decidingSetWinPercentage | number | Deciding sets won %. |
data.opponentStats.tiebreakWon | number | Tiebreaks won. |
data.opponentStats.tiebreakCount | number | Tiebreaks played. |
data.opponentStats.totalTBWinPercentage | number | Tiebreaks won %. |
data.opponentStats.setsWon | number | Sets won. |
data.opponentStats.gamesWon | number | Games won. |
data.opponentStats.title | number | Titles won. |
data.opponentStats.grandSlam | number | Grand Slam record. |
data.opponentStats.masters | number | Masters record. |
data.opponentStats.mainTour | number | Main-tour record. |
data.opponentStats.tourFinals | number | Tour Finals record. |
data.opponentStats.cups | number | Davis/Fed Cup record. |
data.opponentStats.futures | number | ITF/Futures record. |
data.opponentStats.challengers | number | Challenger record. |
data.opponentStats.hard | number | Wins on hard courts. |
data.opponentStats.clay | number | Wins on clay. |
data.opponentStats.iHard | number | Wins on indoor hard courts. |
data.opponentStats.grass | number | Wins on grass. |
H2H Match Stats by Tournament
/tennis/v2/{atp|wta}/h2h/match-stats/{tournament_id}/{player1_id}/{player2_id}atp. Use wtafor the women's dataset.Returns serve/return stats for the completed match between these two players at that tournament season ID. player1Stats is the first path player.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
tournament_id | Yes | integer | Tournament ID must be numeric value >= 1 |
player1_id | Yes | string | First player: numeric ID or display name. Example: 68074 or Carlos Alcaraz. |
player2_id | Yes | string | Second player: numeric ID or display name. Example: 47275 or Jannik Sinner. |
Response Properties
| Field | Type | Description |
|---|---|---|
data.player1Stats | object | Stats for the first path player in that tournament meeting. |
data.player2Stats | object | Stats for the second path player. |
aces / firstServe / winners / โฆ | integer | Per-match counting stats. Null means that metric is not available for the match. |
data | object | Response payload: the list or object documented in the rows below. |
data.player1Stats.player1Id | number | Numeric ID of player 1. |
data.player1Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player1Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player1Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player1Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player1Stats.breakPointFacedGm | number | Break points faced on serve. Counted over the matches in this selection. |
data.player1Stats.breakPointSavedGm | number | Break points saved on serve. Counted over the matches in this selection. |
data.player1Stats.breakPointChanceGm | number | Break-point chances on return. Counted over the matches in this selection. |
data.player1Stats.breakPointWonGm | number | Break points converted on return. Counted over the matches in this selection. |
data.player1Stats.winners | null | Winners (where tracked). Counted over the matches in this selection. |
data.player1Stats.unforcedErrors | null | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player1Stats.netApproaches | null | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player1Stats.netApproachesOf | null | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player1Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player1Stats.fastestServe | null | Fastest serve in km/h (where tracked). |
data.player1Stats.averageFirstServeSpeed | null | Average first-serve speed in km/h (where tracked). |
data.player1Stats.averageSecondServeSpeed | null | Average second-serve speed in km/h (where tracked). |
data.player2Stats.player2Id | number | Numeric ID of player 2. |
data.player2Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player2Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player2Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player2Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player2Stats.breakPointFacedGm | number | Break points faced on serve. Counted over the matches in this selection. |
data.player2Stats.breakPointSavedGm | number | Break points saved on serve. Counted over the matches in this selection. |
data.player2Stats.breakPointChanceGm | number | Break-point chances on return. Counted over the matches in this selection. |
data.player2Stats.breakPointWonGm | number | Break points converted on return. Counted over the matches in this selection. |
data.player2Stats.winners | null | Winners (where tracked). Counted over the matches in this selection. |
data.player2Stats.unforcedErrors | null | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player2Stats.netApproaches | null | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player2Stats.netApproachesOf | null | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player2Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player2Stats.fastestServe | null | Fastest serve in km/h (where tracked). |
data.player2Stats.averageFirstServeSpeed | null | Average first-serve speed in km/h (where tracked). |
data.player2Stats.averageSecondServeSpeed | null | Average second-serve speed in km/h (where tracked). |
Also by match ID: Completed Match Statistics by matchId returns the same statistics for a matchId or liveMatchId.
Point-by-point for an H2H match: every row of the H2H match list has links.pointByPoint, a ready-to-call Get Point By Point request with the players and match day filled in (plus matchKey and links.match, links.stats, links.odds).
Extra H2H endpoints
These are not replacements for the core H2H info, matches, stats, or filters above.
Detect Player Tour
/tennis/v2/h2h/playerType/{player_id_or_name}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Response Properties
| Field | Type | Description |
|---|---|---|
type | string | Dataset: atp (men) or wta (women). |
Upcoming H2H Match
Returns data only while the two players have a match on the schedule (today or upcoming); afterwards the response is {}. The example (Medvedev v Atmane, Almaty quarterfinal on 2026-10-23) stops working once that match is played. For a current pair, take two players from Today's Fixtures (/tennis/v2/{atp|wta}/fixtures) or Upcoming Matches by Tour.
/tennis/v2/h2h/upcoming/{atp|wta}/{player1_id_or_name}/{player2_id_or_name}atp. Use wtafor the women's dataset.Returns the next scheduled meeting between two players, including odds, round, and tournament.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id_or_name | Yes | string | First player: display name ( Carlos Alcaraz) or numeric ID. |
player2_id_or_name | Yes | string | Second player: display name ( Jannik Sinner) or numeric ID. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament.
| Field | Type | Description |
|---|---|---|
id | integer | Fixture id for this meeting. |
date | string | Scheduled start as ISO-8601. |
player1 / player2 | object | First-listed and second-listed players (not winner/loser). |
tournament / round | object | Event name, date, court, and round label. |
odd1 / odd2 | number | Pre-match odds when present. |
matchId | number | Match ID (same value as id on core match rows). |
liveMatchId | string | Key of this match in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update. |
links | object | Ready-made URLs for this match's detail routes. |
links.match | string | URL of the match detail route (/tennis/v2/matches/{matchId}); source=game marks a completed match. |
links.live | string | URL of the match's live route: live score, statistics, timeline and the live eventId ({} until the match is in the live feed). |
roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ3 are qualifying rounds. |
draw | number | Draw position (slot) of the match within its round. |
result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
complete | null | Completion flag on schedule rows; null until the match is completed. |
live | null | Live flag from the schedule feed; null when not live. |
timeGame | null | Legacy start-time field; often null. Use date / startTime instead. |
reserveInt | null | Reserved numeric field (internal); usually null. |
reserveString | null | Reserved text field (internal); usually null. |
seed1 | string | Seed of player 1, or null. |
seed2 | null | Seed of player 2, or null. |
player1Id | number | Numeric ID of player 1. |
player2Id | number | Numeric ID of player 2. |
tournamentId | number | Numeric tournament season ID (one edition of an event). |
yt_url | string | YouTube highlights URL, or empty string. |
yt_id | string | YouTube video ID, or empty string. |
player1.name | string | Player 1 name. |
player1.countryAcr | string | Player 1 country code. |
player2.name | string | Player 2 name. |
player2.countryAcr | string | Player 2 country code. |
round.name | string | Round label, e.g. "1/4", "Final". |
tournament.name | string | Tournament name. |
tournament.date | string | Tournament start date (ISO-8601 UTC). |
tournament.court | object | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
tournament.court.name | string | Court surface name, e.g. Hard, Clay, Grass, I.hard. |
Recent Event Between Players
Returns data only while the two players have a match on the schedule (today or upcoming); afterwards the response is {}. The example (Medvedev v Atmane, Almaty quarterfinal on 2026-10-23) stops working once that match is played. For a current pair, take two players from Today's Fixtures (/tennis/v2/{atp|wta}/fixtures) or Upcoming Matches by Tour.
/tennis/v2/h2h/player-vs-player/recent-event/{atp|wta}/{player1_id_or_name}/{player2_id_or_name}atp. Use wtafor the women's dataset.Returns the most recent or next meeting between two players, with form and prize-money context.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id_or_name | Yes | string | First player: display name ( Carlos Alcaraz) or numeric ID. |
player2_id_or_name | Yes | string | Second player: display name ( Jannik Sinner) or numeric ID. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament.
| Field | Type | Description |
|---|---|---|
id | integer | Fixture id for this meeting. |
date | string | Scheduled start as ISO-8601. |
player1 / player2 | object | First-listed and second-listed players (not winner/loser). |
tournament / round | object | Event name, date, court, and round label. |
odd1 / odd2 | number | Pre-match odds when present. |
roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ3 are qualifying rounds. |
draw | number | Draw position (slot) of the match within its round. |
result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
complete | null | Completion flag on schedule rows; null until the match is completed. |
live | null | Live flag from the schedule feed; null when not live. |
timeGame | null | Legacy start-time field; often null. Use date / startTime instead. |
reserveInt | null | Reserved numeric field (internal); usually null. |
reserveString | null | Reserved text field (internal); usually null. |
seed1 | string | Seed of player 1, or null. |
seed2 | null | Seed of player 2, or null. |
player1Id | number | Numeric ID of player 1. |
player2Id | number | Numeric ID of player 2. |
tournamentId | number | Numeric tournament season ID (one edition of an event). |
yt_url | string | YouTube highlights URL, or empty string. |
yt_id | string | YouTube video ID, or empty string. |
player1.name | string | Player 1 name. |
player1.countryAcr | string | Player 1 country code. |
player1.playerStatus | string | Career status: Active or Retired. |
player2.name | string | Player 2 name. |
player2.countryAcr | string | Player 2 country code. |
player2.playerStatus | string | Career status: Active or Retired. |
round.name | string | Round label, e.g. "1/4", "Final". |
tournament.name | string | Tournament name. |
tournament.date | string | Tournament start date (ISO-8601 UTC). |
tournament.court | object | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
tournament.court.name | string | Court surface name, e.g. Hard, Clay, Grass, I.hard. |
hasUpcoming | boolean | true when the two players have an upcoming match on the current board. |
tnType | string | Dataset of the request: atp or wta. |
careerMoney1 | number | Career prize money of player 1 in USD. |
careerMoney2 | number | Career prize money of player 2 in USD. |
recentFormP1 | array | Player 1's last 10 results, newest first: "w" = won, "l" = lost. |
recentFormP2 | array | Player 2's last 10 results, newest first: "w" = won, "l" = lost. |
Current Event H2H Statistics
Returns data only while the two players have a match on the schedule (today or upcoming); afterwards the response is {}. The example (Medvedev v Atmane, Almaty quarterfinal on 2026-10-23) stops working once that match is played. For a current pair, take two players from Today's Fixtures (/tennis/v2/{atp|wta}/fixtures) or Upcoming Matches by Tour.
/tennis/v2/h2h/current/{atp|wta}/{player1_id_or_name}/{player2_id_or_name}atp. Use wtafor the women's dataset.Returns this playerโs stats at the tournament both players are currently in โ holds, break saves, points, and match counts.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id_or_name | Yes | string | First player: display name ( Carlos Alcaraz) or numeric ID. |
player2_id_or_name | Yes | string | Second player: display name ( Jannik Sinner) or numeric ID. |
Response Properties
| Field | Type | Description |
|---|---|---|
name / tourName / country / court | string | Player and current-event context. |
matchesPlayed | integer | Matches this player has completed at the event. |
winsCountOnWin1 / winsCountOnWin2 | integer | Win counts in the current-event split. |
serviceHold / breakPointsSaved / totalPointsWon | mixed | In-event hold, break-save, and points totals with matching *Of and *Percentage fields. |
averageFirstServeSpeed | number | Average first-serve speed in km/h (where tracked). |
averageSecondServeSpeed | number | Average second-serve speed in km/h (where tracked). |
fastestServe | number | Fastest serve in km/h (where tracked). |
lastMatchTime | string | Duration of the player's last match at this event (H:MM:SS). |
totalTime | string | Total time on court at this event (H:MM:SS). |
totalPointsWonOf | number | Total points played. Counted over the matches in this selection. |
unforcedErrors | number | Unforced errors (where tracked). Counted over the matches in this selection. |
breakPointsSavedOf | number | Break points faced on serve. |
breakPointsSavedPercentage | number | Break points saved %. |
serviceHoldOf | number | Service games played. |
serviceHoldPercentage | number | Service games held %. |
oppHold | number | Service games held by opponents. |
oppHoldOf | number | Service games played by opponents. |
oppHoldPercentage | number | Opponents' service games held %. |
decidingSetWin | number | Deciding sets won. |
decidingSetWinOf | number | Deciding sets played. |
decidingSetWinPercentage | number | Deciding sets won %. |
tiebreakPerMatch | string | Average tiebreaks per match (string). |
tiebreakWon | number | Tiebreaks won. |
tiebreakWonOf | number | Tiebreaks played. |
totalTBWinPercentage | number | Tiebreaks won %. |
avgOpponentRank | number | Average ranking of opponents faced at this event (0 when unknown). |
Paired Player Profiles
/tennis/v2/h2h/profile/{atp|wta}/{player1_id_or_name}/{player2_id_or_name}/{limit}atp. Use wtafor the women's dataset.Profiles for both players in a matchup, plus surface H2H. Add includeAll=true to include Challenger/ITF in the aggregates. Path limit is true or false (not a page size).Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player1_id_or_name | Yes | string | First player: display name ( Carlos Alcaraz) or numeric ID. |
player2_id_or_name | Yes | string | Second player: display name ( Jannik Sinner) or numeric ID. |
limit | Yes | string | Path flag: true limits recent matches, false returns full history. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player.
| Field | Type | Description |
|---|---|---|
player1 / player2 | object | Full profile for each path player. |
player1.contryAcr | string | 3-letter country code. The key is spelled contryAcr (no u) in the live payload. |
player1.playerStat | object | Win/loss by level: maintourWin, slamWin, โฆ |
surfaceData | object | H2H wins by surface. Suffix 1 is player1, suffix 2 is player2 (hard1, clay1, โฆ). |
player1.id | number | Player 1 ID. |
player1.name | string | Player 1 name. |
player1.playerStatus | string | Career status: Active or Retired. |
player1.country | string | Country: a three-letter code string, or an object with name and acronym. |
player1.playerStat.maintourWin | number | Main-tour match wins. |
player1.playerStat.maintourLose | number | Main-tour match losses. |
player1.playerStat.finalsWin | number | Tour Finals match wins. |
player1.playerStat.finalsLose | number | Tour Finals match losses. |
player1.playerStat.masterWin | number | Masters match wins. |
player1.playerStat.masterLose | number | Masters match losses. |
player1.playerStat.slamWin | number | Grand Slam match wins. |
player1.playerStat.slamLose | number | Grand Slam match losses. |
player1.playerStat.cupsWin | number | Davis/Fed Cup match wins. |
player1.playerStat.cupsLose | number | Davis/Fed Cup match losses. |
player1.playerStat.futuresWin | number | ITF/Futures match wins. |
player1.playerStat.futuresLose | number | ITF/Futures match losses. |
player1.playerStat.challengersWin | number | Challenger match wins. |
player1.playerStat.challengersLose | number | Challenger match losses. |
player1.playerStat.totalWins | number | Total career match wins. |
player1.playerStat.totalLose | number | Total career match losses. |
player1.image | string | Player photo path on this API (append to the base URL). |
player1.image_p_name | string | Player photo path keyed by player name (alternative to image). |
player1.birthday | string | Date of birth (ISO-8601), or null when unknown. |
player1.currentRank | number | Current singles ranking position from the latest ranking list (same source as the ranking endpoints), or null. |
player1.plays | string | Handedness and backhand, e.g. "Right-Handed, Two-Handed Backhand". |
player1.recentGames | array | Last 10 results, newest first: "w" = won, "l" = lost. |
player1.bestRank | number | Career-high ranking: position and the date it was first reached. |
player1.ytdWon | number | Matches won this year. |
player1.ytdLost | number | Matches lost this year. |
player1.ytdWLPercentage | number | Year-to-date win %. |
player1.ytdTitles | number | Titles won this year. |
player1.careerWin | number | Career match wins (tour level). |
player1.careerLose | number | Career match losses (tour level). |
player1.careerWLPercentage | number | Career win %. |
player1.careerMoney | number | Career prize money in USD. |
player1.totalTitles | number | Finals reached (titles won + finals lost). |
player1.totalTitlesWon | number | Titles won. |
player1.totalFinalsWon | number | Finals lost (runner-up finishes). |
player2.id | number | Player 2 ID. |
player2.name | string | Player 2 name. |
player2.playerStatus | string | Career status: Active or Retired. |
player2.country | string | Country: a three-letter code string, or an object with name and acronym. |
player2.contryAcr | string | Three-letter country code (legacy spelling of countryAcr on this route). |
player2.playerStat | object | Career win/loss counts by tournament level. |
player2.playerStat.maintourWin | number | Main-tour match wins. |
player2.playerStat.maintourLose | number | Main-tour match losses. |
player2.playerStat.finalsWin | number | Tour Finals match wins. |
player2.playerStat.finalsLose | number | Tour Finals match losses. |
player2.playerStat.masterWin | number | Masters match wins. |
player2.playerStat.masterLose | number | Masters match losses. |
player2.playerStat.slamWin | number | Grand Slam match wins. |
player2.playerStat.slamLose | number | Grand Slam match losses. |
player2.playerStat.cupsWin | number | Davis/Fed Cup match wins. |
player2.playerStat.cupsLose | number | Davis/Fed Cup match losses. |
player2.playerStat.futuresWin | number | ITF/Futures match wins. |
player2.playerStat.futuresLose | number | ITF/Futures match losses. |
player2.playerStat.challengersWin | number | Challenger match wins. |
player2.playerStat.challengersLose | number | Challenger match losses. |
player2.playerStat.totalWins | number | Total career match wins. |
player2.playerStat.totalLose | number | Total career match losses. |
player2.image | string | Player photo path on this API (append to the base URL). |
player2.image_p_name | string | Player photo path keyed by player name (alternative to image). |
player2.birthday | string | Date of birth (ISO-8601), or null when unknown. |
player2.currentRank | number | Current singles ranking position from the latest ranking list (same source as the ranking endpoints), or null. |
player2.plays | string | Handedness and backhand, e.g. "Right-Handed, Two-Handed Backhand". |
player2.recentGames | array | Last 10 results, newest first: "w" = won, "l" = lost. |
player2.bestRank | number | Career-high ranking: position and the date it was first reached. |
player2.ytdWon | number | Matches won this year. |
player2.ytdLost | number | Matches lost this year. |
player2.ytdWLPercentage | number | Year-to-date win %. |
player2.ytdTitles | number | Titles won this year. |
player2.careerWin | number | Career match wins (tour level). |
player2.careerLose | number | Career match losses (tour level). |
player2.careerWLPercentage | number | Career win %. |
player2.careerMoney | number | Career prize money in USD. |
player2.totalTitles | number | Finals reached (titles won + finals lost). |
player2.totalTitlesWon | number | Titles won. |
player2.totalFinalsWon | number | Finals lost (runner-up finishes). |
surfaceData.hard1 | number | Hard-court H2H wins of player 1. |
surfaceData.iHard1 | number | Indoor-hard H2H wins of player 1. |
surfaceData.clay1 | number | Clay H2H wins of player 1. |
surfaceData.grass1 | number | Grass H2H wins of player 1. |
surfaceData.hard2 | number | Hard-court H2H wins of player 2. |
surfaceData.iHard2 | number | Indoor-hard H2H wins of player 2. |
surfaceData.clay2 | number | Clay H2H wins of player 2. |
surfaceData.grass2 | number | Grass H2H wins of player 2. |
surfaceData.total1 | number | Total H2H wins of player 1. |
surfaceData.total2 | number | Total H2H wins of player 2. |
Player Surface Breakdown (H2H View)
/tennis/v2/h2h/surfaceBreakdown/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.Returns this player's win/loss split by surface. Path takes one player, not two.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
court | No | string | Surface name. Prefer this over surface. Example: court=Clay. |
surface | No | string | Filter by surface name. Alias of court. Example: surface=clay or court=Clay. |
year | No | integer | Filter to a specific year. Example: year=2026 |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
level | No | integer | Tournament level id. Example: level=4. |
round | No | string | Round filter. Example: round=Final. |
week | No | integer | Tour week number when supported. Example: week=12. |
Response Properties
| Field | Type | Description |
|---|---|---|
hard1 | number | Hard-court H2H wins of player 1. |
iHard1 | number | Indoor-hard H2H wins of player 1. |
clay1 | number | Clay H2H wins of player 1. |
grass1 | number | Grass H2H wins of player 1. |
hard2 | number | Hard-court H2H wins of player 2. |
iHard2 | number | Indoor-hard H2H wins of player 2. |
clay2 | number | Clay H2H wins of player 2. |
grass2 | number | Grass H2H wins of player 2. |
total1 | number | Total H2H wins of player 1. |
total2 | number | Total H2H wins of player 2. |
Recent H2H Records
/tennis/v2/h2h/recent/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.Returns this player's recent completed matches (one player in the path). year selects that calendar year (with week: from 1 January to the end of that week). An unknown court/surface returns 400. Each row also has matchKey (player1Id-player2Id-tournamentId-roundId, stable across archive reloads) and links (match, stats, odds, pointByPoint) to open that match directly; the list reports hasNextPage. Embedded player records take currentRank and points from the latest ranking, with rankingDate.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
court | No | string | Surface name. Prefer this over surface. Example: court=Clay. |
surface | No | string | Filter by surface name. Alias of court. Example: surface=clay or court=Clay. |
year | No | integer | Filter to a specific year. Example: year=2026 |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
level | No | integer | Tournament level id. Example: level=4. |
round | No | string | Round filter. Example: round=Final. |
week | No | integer | Tour week number when supported. Example: week=12. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament.
| Field | Type | Description |
|---|---|---|
name | string | Display name. |
count | number | Number of items in this response (or matching items, where stated). |
games | array | Match rows. |
games[] | object | One item of `games`; its fields are listed below. |
games[].id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
games[].roundId | number | Numeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ3 are qualifying rounds. |
games[].result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
games[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
games[].seed1 | null | Seed of player 1, or null. |
games[].seed2 | null | Seed of player 2, or null. |
games[].odd1 | string | One stored pre-match price for player 1 (one bookmaker only), often null. Use oddsAvailable / links.odds for the full archived odds. |
games[].odd2 | string | Pre-match/closing odds retained for player 2, or null when not available. |
games[].player1Id | number | Numeric ID of player 1. |
games[].player2Id | number | Numeric ID of player 2. |
games[].tournamentId | number | Numeric tournament season ID (one edition of an event). |
games[].draw | number | Draw position (slot) of the match within its round. |
games[].winner_entry | null | Entry status of the winner (e.g. Q = qualifier, WC = wild card, LL = lucky loser), or null. |
games[].winner_hand | null | Playing hand of the winner (R/L), or null. |
games[].winner_ht | null | Height of the winner in cm, or null. |
games[].winner_ioc | null | Country code of the winner, or null. |
games[].winner_age | null | Age of the winner at the match date, or null. |
games[].loser_entry | null | Entry status of the loser (Q, WC, LL, โฆ), or null. |
games[].loser_hand | null | Playing hand of the loser (R/L), or null. |
games[].loser_ht | null | Height of the loser in cm, or null. |
games[].loser_ioc | null | Country code of the loser, or null. |
games[].loser_age | null | Age of the loser at the match date, or null. |
games[].best_of | null | Best-of sets (3 or 5) when known, otherwise null. |
games[].poll_vote | string | Fan poll vote count for the match (string). |
games[].player1 | object | Player 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there. |
games[].player1.id | number | Player 1 ID. |
games[].player1.name | string | Player 1 name. |
games[].player1.birthday | string | Date of birth (ISO-8601), or null when unknown. |
games[].player1.countryAcr | string | Player 1 country code. |
games[].player1.currentRank | number | Current singles ranking position from the latest ranking list (same source as the ranking endpoints), or null. |
games[].player1.progress | number | Ranking positions gained (+) or lost (โ) in the latest ranking week. |
games[].player1.points | number | Ranking points from the latest ranking list (same value as the ranking endpoints). |
games[].player1.hardPoints | null | Ranking points earned on hard courts, or null. |
games[].player1.hardTournament | null | Number of hard-court tournaments counted, or null. |
games[].player1.clayPoints | null | Ranking points earned on clay, or null. |
games[].player1.clayTournament | null | Number of clay tournaments counted, or null. |
games[].player1.grassPoints | null | Ranking points earned on grass, or null. |
games[].player1.grassTournament | null | Number of grass tournaments counted, or null. |
games[].player1.carpetPoints | null | Ranking points earned on carpet, or null. |
games[].player1.carterTournament | null | Number of carpet tournaments counted (legacy field name), or null. |
games[].player1.prize | number | Prize money as shown by the source, e.g. "$48.9M" (string), or null. |
games[].player1.ch | number | Current Race (year-to-date) points used for the race ranking. |
games[].player1.doublesPosition | null | Current doubles ranking position, or null. |
games[].player1.doublesProgress | null | Doubles ranking positions gained (+) or lost (โ) in the latest week, or null. |
games[].player1.doublesPoints | null | Current doubles ranking points, or null. |
games[].player1.ihardPoints | null | Ranking points earned on indoor hard courts, or null. |
games[].player1.ihardTournament | null | Number of indoor-hard tournaments counted, or null. |
games[].player1.itf | number | ITF player ID. |
games[].player1.height | null | Height in cm, or null when unknown. |
games[].player1.wikidata_id | null | Wikidata ID of the player, or empty string. |
games[].player2 | object | Player 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order. |
games[].player2.id | number | Player 2 ID. |
games[].player2.name | string | Player 2 name. |
games[].player2.birthday | string | Date of birth (ISO-8601), or null when unknown. |
games[].player2.countryAcr | string | Player 2 country code. |
games[].player2.currentRank | number | Current singles ranking position from the latest ranking list (same source as the ranking endpoints), or null. |
games[].player2.progress | number | Ranking positions gained (+) or lost (โ) in the latest ranking week. |
games[].player2.points | number | Ranking points from the latest ranking list (same value as the ranking endpoints). |
games[].player2.hardPoints | null | Ranking points earned on hard courts, or null. |
games[].player2.hardTournament | null | Number of hard-court tournaments counted, or null. |
games[].player2.clayPoints | null | Ranking points earned on clay, or null. |
games[].player2.clayTournament | null | Number of clay tournaments counted, or null. |
games[].player2.grassPoints | null | Ranking points earned on grass, or null. |
games[].player2.grassTournament | null | Number of grass tournaments counted, or null. |
games[].player2.carpetPoints | null | Ranking points earned on carpet, or null. |
games[].player2.carterTournament | null | Number of carpet tournaments counted (legacy field name), or null. |
games[].player2.prize | number | Prize money as shown by the source, e.g. "$48.9M" (string), or null. |
games[].player2.ch | number | Current Race (year-to-date) points used for the race ranking. |
games[].player2.doublesPosition | null | Current doubles ranking position, or null. |
games[].player2.doublesProgress | null | Doubles ranking positions gained (+) or lost (โ) in the latest week, or null. |
games[].player2.doublesPoints | null | Current doubles ranking points, or null. |
games[].player2.ihardPoints | null | Ranking points earned on indoor hard courts, or null. |
games[].player2.ihardTournament | null | Number of indoor-hard tournaments counted, or null. |
games[].player2.itf | number | ITF player ID. |
games[].player2.height | null | Height in cm, or null when unknown. |
games[].player2.wikidata_id | null | Wikidata ID of the player, or empty string. |
games[].tournament | object | Tournament object (id, name, date, level, surface, country, โฆ). |
games[].tournament.id | number | Tournament season ID. |
games[].tournament.name | string | Tournament name. |
games[].tournament.courtId | number | Numeric court-surface ID (see GET /tennis/v2/court): 1 Hard, 2 Clay, 3 Indoor hard, 5 Grass, โฆ |
games[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
games[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
games[].tournament.link | number | ID of the previous edition of the same tournament (used to chain seasons), or null. |
games[].tournament.countryAcr | string | Three-letter country code of the tournament. |
games[].tournament.prize | null | Prize money as shown by the source, e.g. "$48.9M" (string), or null. |
games[].tournament.ratingId | null | Ranking table reference for the event (internal), or null. |
games[].tournament.url | string | Official tournament website, or empty. |
games[].tournament.latitude | number | Venue latitude. |
games[].tournament.longitude | number | Venue longitude. |
games[].tournament.site | string | Official website URL, or null. |
games[].tournament.race | null | Race flag/points reference for the event (internal), or null. |
games[].tournament.entry | null | Entry list reference (internal), or null. |
games[].tournament.singlesPrizeId | null | Internal ID of the singles prize-money table, or null. |
games[].tournament.doublesMoneyId | null | Internal ID of the doubles prize-money table, or null. |
games[].tournament.tier | string | Tournament tier/series label, or null. |
games[].tournament.reserveInt | null | Reserved numeric field (internal); usually null. |
games[].tournament.reserveChar | string | URL-friendly short code of the tournament, e.g. "laver-cup". |
games[].tournament.live | null | Live flag from the schedule feed; null when not live. |
games[].tournament.result | null | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
games[].tournament.draw_size | null | Draw size (number of players), or null. |
games[].h2h | object | Head-to-head summary for the two players. |
games[].h2h.id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
games[].h2h.player1Wins | number | Career head-to-head wins of player 1. |
games[].h2h.player2Wins | number | Career head-to-head wins of player 2. |
games[].h2h.player1AllWins | number | Career head-to-head wins of player 1 against player 2 (all levels). |
games[].h2h.player2AllWins | number | Career head-to-head wins of player 2 against player 1 (all levels). |
games[].h2h.player1Id | number | Numeric ID of player 1. |
games[].h2h.player2Id | number | Numeric ID of player 2. |
games[].stat | object | Per-match statistics for both players (suffix 1 = player 1, 2 = player 2), or null when not recorded. |
games[].stat.id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
games[].stat.round | number | Round ID (see GET /tennis/v2/round). |
games[].stat.firstServe1 | number | First serves landed in โ player 1 (first-listed player). |
games[].stat.firstServeOf1 | number | First-serve attempts (total service points) โ player 1 (first-listed player). |
games[].stat.aces1 | number | Aces served โ player 1 (first-listed player). |
games[].stat.doubleFaults1 | number | Double faults โ player 1 (first-listed player). |
games[].stat.unforcedErrors1 | null | Unforced errors (null when the source does not track them) โ player 1 (first-listed player). |
games[].stat.winningOnFirstServe1 | number | Points won on first serve โ player 1 (first-listed player). |
games[].stat.winningOnFirstServeOf1 | number | Points played on first serve (first serves in) โ player 1 (first-listed player). |
games[].stat.winningOnSecondServe1 | number | Points won on second serve โ player 1 (first-listed player). |
games[].stat.winningOnSecondServeOf1 | number | Points played on second serve โ player 1 (first-listed player). |
games[].stat.winners1 | null | Winners (null when not tracked) โ player 1 (first-listed player). |
games[].stat.breakPointsConverted1 | number | Break points converted (won as returner) โ player 1 (first-listed player). |
games[].stat.breakPointsConvertedOf1 | number | Break-point chances as returner โ player 1 (first-listed player). |
games[].stat.netApproaches1 | null | Net approaches won (null when not tracked) โ player 1 (first-listed player). |
games[].stat.netApproachesOf1 | null | Net approaches made (null when not tracked) โ player 1 (first-listed player). |
games[].stat.totalPointsWon1 | number | Total points won โ player 1 (first-listed player). |
games[].stat.fastestServe1 | null | Fastest serve in km/h (null when not tracked) โ player 1 (first-listed player). |
games[].stat.averageFirstServeSpeed1 | null | Average first-serve speed in km/h (null when not tracked) โ player 1 (first-listed player). |
games[].stat.averageSecondServeSpeed1 | null | Average second-serve speed in km/h (null when not tracked) โ player 1 (first-listed player). |
games[].stat.firstServe2 | number | First serves landed in โ player 2 (second-listed player). |
games[].stat.firstServeOf2 | number | First-serve attempts (total service points) โ player 2 (second-listed player). |
games[].stat.aces2 | number | Aces served โ player 2 (second-listed player). |
games[].stat.doubleFaults2 | number | Double faults โ player 2 (second-listed player). |
games[].stat.unforcedErrors2 | null | Unforced errors (null when the source does not track them) โ player 2 (second-listed player). |
games[].stat.winningOnFirstServe2 | number | Points won on first serve โ player 2 (second-listed player). |
games[].stat.winningOnFirstServeOf2 | number | Points played on first serve (first serves in) โ player 2 (second-listed player). |
games[].stat.winningOnSecondServe2 | number | Points won on second serve โ player 2 (second-listed player). |
games[].stat.winningOnSecondServeOf2 | number | Points played on second serve โ player 2 (second-listed player). |
games[].stat.winners2 | null | Winners (null when not tracked) โ player 2 (second-listed player). |
games[].stat.breakPointsConverted2 | number | Break points converted (won as returner) โ player 2 (second-listed player). |
games[].stat.breakPointsConvertedOf2 | number | Break-point chances as returner โ player 2 (second-listed player). |
games[].stat.netApproaches2 | null | Net approaches won (null when not tracked) โ player 2 (second-listed player). |
games[].stat.netApproachesOf2 | null | Net approaches made (null when not tracked) โ player 2 (second-listed player). |
games[].stat.totalPointsWon2 | number | Total points won โ player 2 (second-listed player). |
games[].stat.fastestServe2 | null | Fastest serve in km/h (null when not tracked) โ player 2 (second-listed player). |
games[].stat.averageFirstServeSpeed2 | null | Average first-serve speed in km/h (null when not tracked) โ player 2 (second-listed player). |
games[].stat.averageSecondServeSpeed2 | null | Average second-serve speed in km/h (null when not tracked) โ player 2 (second-listed player). |
games[].stat.rpw1 | number | Return points won โ player 1 (first-listed player). |
games[].stat.rpwOf1 | number | Return points played โ player 1 (first-listed player). |
games[].stat.rpw2 | number | Return points won โ player 2 (second-listed player). |
games[].stat.rpwOf2 | number | Return points played โ player 2 (second-listed player). |
games[].stat.tournamentId | number | Numeric tournament season ID (one edition of an event). |
games[].stat.player1Id | number | Numeric ID of player 1. |
games[].stat.player2Id | number | Numeric ID of player 2. |
games[].stat.mt | string | Match duration as "0000-00-00 HH:MM:SS" (only the time part is meaningful). |
games[].isWin | boolean | true when the requested player won this match. |
Recent Player Stats
/tennis/v2/h2h/recent-stats/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.Returns this player's recent form stats (one player in the path โ not vs a named opponent). recentStats covers the last 6 months by default; year, court/surface and level select its matches instead (an unknown surface returns 400). careerSurfaceWL is the whole career and yearStats the last 12 months. appliedFilters states the period and filters behind each block.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
court | No | string | Surface name. Prefer this over surface. Example: court=Clay. |
surface | No | string | Filter by surface name. Alias of court. Example: surface=clay or court=Clay. |
year | No | integer | Filter to a specific year. Example: year=2026 |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
level | No | integer | Tournament level id. Example: level=4. |
round | No | string | Round filter. Example: round=Final. |
week | No | integer | Tour week number when supported. Example: week=12. |
Response Properties
| Field | Type | Description |
|---|---|---|
recentStats | object | Recent-form statistics for the player and the opponents faced. |
recentStats.playerStats | object | Aggregated statistics of the requested player. |
recentStats.playerStats.statMatchesPlayed | number | Matches with statistics in this selection. |
recentStats.playerStats.matchesWon | number | Matches won. Counted over the matches in this selection. |
recentStats.playerStats.matchesLost | number | Matches lost. Counted over the matches in this selection. |
recentStats.playerStats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
recentStats.playerStats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
recentStats.playerStats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
recentStats.playerStats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
recentStats.playerStats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
recentStats.playerStats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
recentStats.playerStats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
recentStats.playerStats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
recentStats.opponentStats | object | Aggregated statistics of the opponents the player faced. |
recentStats.opponentStats.statMatchesPlayed | number | Matches with statistics in this selection. |
recentStats.opponentStats.matchesWon | number | Matches won. Counted over the matches in this selection. |
recentStats.opponentStats.matchesLost | number | Matches lost. Counted over the matches in this selection. |
recentStats.opponentStats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
recentStats.opponentStats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
recentStats.opponentStats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
recentStats.opponentStats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
recentStats.opponentStats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
recentStats.opponentStats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
recentStats.opponentStats.breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
recentStats.opponentStats.breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
recentStats.matchWinPer | number | Matches won %. |
recentStats.secondServeWinPer | number | Second-serve points won %. |
recentStats.firstServeWinPer | number | First-serve points won %. |
recentStats.oppSecondServeWinPer | number | Points won returning the opponent's second serve %. |
recentStats.oppFirstServeWinPer | number | Points won returning the opponent's first serve %. |
recentStats.bpSavedPer | number | Break points saved %. |
recentStats.bpConvertedPer | number | Break points converted %. |
careerSurfaceWL | object | Career win/loss by surface: bestSurface and worstSurface. |
careerSurfaceWL.bestSurface | object | Surface with the highest career win %: court (ID), courtName, matchesWon, matchesLost, winPer. |
careerSurfaceWL.bestSurface.court | number | Court-surface ID. |
careerSurfaceWL.bestSurface.courtName | string | Court surface name, e.g. Hard, Clay, Grass, I.hard (indoor hard). |
careerSurfaceWL.bestSurface.matchesWon | number | Matches won. Counted over the matches in this selection. |
careerSurfaceWL.bestSurface.matchesLost | number | Matches lost. Counted over the matches in this selection. |
careerSurfaceWL.bestSurface.winPer | number | Matches won %. |
careerSurfaceWL.worstSurface | object | Surface with the lowest career win %: court (ID), courtName, matchesWon, matchesLost, winPer. |
careerSurfaceWL.worstSurface.court | number | Court-surface ID. |
careerSurfaceWL.worstSurface.courtName | string | Court surface name, e.g. Hard, Clay, Grass, I.hard (indoor hard). |
careerSurfaceWL.worstSurface.matchesWon | number | Matches won. Counted over the matches in this selection. |
careerSurfaceWL.worstSurface.matchesLost | number | Matches lost. Counted over the matches in this selection. |
careerSurfaceWL.worstSurface.winPer | number | Matches won %. |
yearStats | object | Season statistics: average opponent rank, deciding-set win % and the tour level played most. |
yearStats.maxMatchTourLevel | object | Tournament level with the most matches this season: rank (ID), rankName, matchesPlayed, avgOppRankSum. |
yearStats.maxMatchTourLevel.rank | number | Tournament level ID (TourRank). |
yearStats.maxMatchTourLevel.rankName | string | Tournament level name, e.g. "Masters series". |
yearStats.maxMatchTourLevel.matchesWon | number | Matches won. Counted over the matches in this selection. |
yearStats.maxMatchTourLevel.matchesLost | number | Matches lost. Counted over the matches in this selection. |
yearStats.maxMatchTourLevel.matchesPlayed | number | Matches played in this selection. |
yearStats.maxMatchTourLevel.avgOppRankSum | number | Sum of opponents' rankings (divide by matchesPlayed for the average). |
yearStats.matchesWon | number | Matches won. Counted over the matches in this selection. |
yearStats.matchesLost | number | Matches lost. Counted over the matches in this selection. |
yearStats.matchesPlayed | number | Matches played in this selection. |
yearStats.avgOppRankSum | number | Sum of opponents' rankings (divide by matchesPlayed for the average). |
yearStats.avgOppRank | number | Average ranking of opponents faced. |
yearStats.decidingSetWin | number | Deciding sets won. |
yearStats.decidingSetWinOf | number | Deciding sets played. |
yearStats.decidingSetWinPer | number | Deciding sets won %. |
Player H2H Breakdown
/tennis/v2/h2h/breakdown/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.Retrieve a single player's career H2H-style breakdown (titles, surfaces, serve/return). This path takes one player โ two names return "No such player". Use /h2h/stats for two-player stats.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
court | No | string | Surface name. Prefer this over surface. Example: court=Clay. |
surface | No | string | Filter by surface name. Alias of court. Example: surface=clay or court=Clay. |
year | No | integer | Filter to a specific year. Example: year=2026 |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
level | No | integer | Tournament level id. Example: level=4. |
round | No | string | Round filter. Example: round=Final. |
week | No | integer | Tour week number when supported. Example: week=12. |
Response Properties
| Field | Type | Description |
|---|---|---|
name | string | The single player in the path โ this is not a two-player H2H. |
matchesCount | integer | Matches included in this breakdown. |
matchesWon1 / matchesWon2 | integer | Suffix 1 is this playerโs wins; suffix 2 is losses (or the complementary count). |
hard1, clay1, grass1, iHard1 | integer | This playerโs wins on each surface. Matching *2 fields are losses. |
ytdWon / ytdLost | integer | Year-to-date win/loss. |
aces / firstServePercentage / โฆ | number | Career serve, return, tiebreak, and pressure stats for this player. |
slam1 | number | Grand Slam match wins of player 1. |
slam2 | number | Grand Slam match wins of player 2. |
title1 | number | Titles of player 1. |
title2 | number | Titles of player 2. |
master1 | number | Masters match wins of player 1. |
master2 | number | Masters match wins of player 2. |
main1 | number | Main-tour match wins of player 1. |
main2 | number | Main-tour match wins of player 2. |
cup1 | number | Davis/Fed Cup match wins of player 1. |
cup2 | number | Davis/Fed Cup match wins of player 2. |
future1 | number | ITF/Futures match wins of player 1. |
future2 | number | ITF/Futures match wins of player 2. |
challengers1 | number | Challenger match wins of player 1. |
challengers2 | number | Challenger match wins of player 2. |
tourFinals1 | number | Tour Finals match wins of player 1. |
tourFinals2 | number | Tour Finals match wins of player 2. |
avgTime1 | string | Average match duration of player 1 (H:MM:SS). |
avgTime2 | string | Average match duration of player 2 (H:MM:SS). |
gamesWon1 | number | Games won by player 1. |
gamesWon2 | number | Games won by player 2. |
totalPointsWon | number | Total points won. Counted over the matches in this selection. |
totalPointsWonOf | number | Total points played. Counted over the matches in this selection. |
setsWon1 | number | Sets won by player 1. |
setsWon2 | number | Sets won by player 2. |
hard1 | number | Hard-court H2H wins of player 1. |
iHard1 | number | Indoor-hard H2H wins of player 1. |
clay1 | number | Clay H2H wins of player 1. |
grass1 | number | Grass H2H wins of player 1. |
hard2 | number | Hard-court H2H wins of player 2. |
iHard2 | number | Indoor-hard H2H wins of player 2. |
clay2 | number | Clay H2H wins of player 2. |
grass2 | number | Grass H2H wins of player 2. |
total1 | number | Total H2H wins of player 1. |
total2 | number | Total H2H wins of player 2. |
acesTotal | number | Total aces served. Counted over the matches in this selection. |
doubleFaultsCount | number | Double faults per service game (average). |
firstServe | number | First serves landed in. Counted over the matches in this selection. |
firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
winningOnFirstServePercentage | number | First-serve points won %. |
winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
winningOnSecondServePercentage | number | Second-serve points won %. |
returnPtsWin | number | Return points won. Counted over the matches in this selection. |
returnPtsWinOf | number | Return points played. Counted over the matches in this selection. |
returnPtsWinPercentage | number | Return points won %. |
breakPointsConverted | number | Break points converted as returner. Counted over the matches in this selection. |
breakPointsConvertedOf | number | Break-point chances as returner. Counted over the matches in this selection. |
breakpointsWonPercentage | number | Break points converted %. |
bestOfThreeWon | number | Best-of-three matches won. |
bestOfThreeWonPercentage | number | Best-of-three matches won %. |
bestOfThreeCount | number | Best-of-three matches played. |
bestOfFiveWon | number | Best-of-five matches won. |
bestOfFiveWonPercentage | number | Best-of-five matches won %. |
bestOfFiveCount | number | Best-of-five matches played. |
firstSetWinMatchWin | number | Matches won after winning the first set. |
firstSetWinMatchWinPercentage | number | % of matches won after winning the first set. |
firstSetWinMatchLose | number | Matches lost after winning the first set. |
firstSetWinMatchLosePercentage | number | % of matches lost after winning the first set. |
firstSetLoseMatchWin | number | Matches won after losing the first set. |
firstSetLoseMatchWinPercentage | number | % of matches won after losing the first set. |
firstSetWinCount | number | Matches in which the player won the first set. |
firstSetLoseCount | number | Matches in which the player lost the first set. |
decidingSetWin | number | Deciding sets won. |
decidingSetCount | number | Deciding sets played. |
decidingSetWinPercentage | number | Deciding sets won %. |
tiebreakWon | number | Tiebreaks won. |
tiebreakCount | number | Tiebreaks played. |
totalTBWinPercentage | number | Tiebreaks won %. |
avgOppRank | number | Average ranking of opponents faced. |
totalDoubleFaultsCount | number | Total double faults. Counted over the matches in this selection. |
H2H Filter Options (Player-v-Player Mode)
/tennis/v2/h2h/filters/{player1_id_or_name}/{player2_id_or_name}/{atp|wta}/vsatp. Use wtafor the women's dataset.Retrieve all available filter options for head-to-head player comparisons, including court surfaces, tournament rounds, competition levels, tournaments, and seasons. Use these values to build valid filter queries for player-vs-player H2H endpoints.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1_id_or_name | Yes | string | First player: display name ( Carlos Alcaraz) or numeric ID. |
player2_id_or_name | Yes | string | Second player: display name ( Jannik Sinner) or numeric ID. |
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
Response Properties
| Field | Type | Description |
|---|---|---|
courts | array | Court-surface filter options. |
courts[] | object | One item of `courts`; its fields are listed below. |
courts[].id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
courts[].name | string | Display name. |
rounds | array | Round filter options. |
rounds[] | object | One item of `rounds`; its fields are listed below. |
rounds[].id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
rounds[].name | string | Display name. |
level | array | Tournament-level filter options. |
level[] | object | One item of `level`; its fields are listed below. |
level[].id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
level[].name | string | Display name. |
tournaments | array | Tournaments. |
tournaments[] | object | One item of `tournaments`; its fields are listed below. |
tournaments[].name | string | Display name. |
tournaments[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
years | array | Available season years (newest first). |
Last Match Played
/tennis/v2/h2h/last-match-played/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.Returns this player's most recently completed match (one player in the path โ not a two-player H2H).Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Response Properties
| Field | Type | Description |
|---|---|---|
player1 / player2 | string | Display names. player1 is this path player. |
result | string | won or lost from this playerโs side. |
score | string | Set score string. |
round | integer | Round id (not the label). |
tournament | string | Event name. |
matchtime | string | Duration/time string. Can be a zero date such as 0000-00-00 04:28:00 when only duration is known. |
Player Rivalries
/tennis/v2/h2h/rivalries/{atp|wta}/{player_id_or_name}atp. Use wtafor the women's dataset.A player's biggest rivalries. includeAll=true adds Challenger/ITF meetings.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
player_id_or_name | Yes | string | Display name ( Carlos Alcaraz) or numeric ID (68074). Hyphenated slugs such as alcaraz-carlos return {"err":"Player not found"}. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
Response Properties
| Field | Type | Description |
|---|---|---|
player | string | Player display name. |
rivalries | array | Most frequent opponents with the head-to-head record. |
rivalries[] | object | One item of `rivalries`; its fields are listed below. |
rivalries[].opponentName | string | Rival's display name. |
rivalries[].playerWins | number | Wins of the requested player against this rival. |
rivalries[].opponentWins | number | Wins of the rival against the requested player. |
rivalries[].totalMatches | number | Total meetings between the player and this rival. |
Interesting H2H: Notable Rivalries (Tour-Wide)
/tennis/v2/interesting-h2h/{atp|wta}atp. Use wtafor the women's dataset.Retrieves the most interesting potential head-to-head matchups based on the current potential fixtures. Each result includes both players, their career head-to-head record, and the tour where the matchup could occur.Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
top | No | number | Maximum number of top potential matchups to return. Example: top=10 |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player.
| Field | Type | Description |
|---|---|---|
[] | object | One item of the response; its fields are listed below. |
[].player1 | object | Player 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there. |
[].player1.name | string | Player 1 name. |
[].player1.countryAcr | string | Player 1 country code. |
[].player2 | object | Player 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order. |
[].player2.name | string | Player 2 name. |
[].player2.countryAcr | string | Player 2 country code. |
[].player1Wins | number | Career head-to-head wins of player 1. |
[].player2Wins | number | Career head-to-head wins of player 2. |
[].type | string | Dataset: atp (men) or wta (women). |