Every meeting between two players, split every way.
One call returns the full rivalry: who leads, on which surface, at which level, in best-of-three and best-of-five, in tiebreaks and deciding sets, and the list of every match they played.
- Surface and level splits
- Tiebreaks and deciding sets
- Grids for a whole group
{ "player1": { "name": "Novak Djokovic", "wins": 31 }, "player2": { "name": "Rafael Nadal", "wins": 29 }, "summary": { "total_matches": 60, "finals_matches": 29, "grand_slam_matches": 18 }, "surface_breakdown": { "hard": { "player1_wins": 20, "player2_wins": 7 }, "clay": { "player1_wins": 9, "player2_wins": 20 }, "grass": { "player1_wins": 2, "player2_wins": 2 } }, "deciding_sets": { "player1_deciding_set_wins": 5, "player2_deciding_set_wins": 8 }}Seamless Integration with our MCP Server
Give Claude, Cursor, and ChatGPT the tennis archive. One command writes the MCP config, agents call match, ranking and head-to-head tools with real player IDs instead of guessing, and your key stays on your machine.
MCPInstall the Cito MCP serverA rivalry in one response
Head-to-head is more than a win count. These are the splits fans and models actually use.
Overall and finals
Total wins, the lead, and the record in finals.
By surface
Hard, clay, grass and carpet records side by side.
By level
Grand Slams, Masters 1000, Tour Finals, 500/250 and team events.
By format
Best-of-three and best-of-five records.
Tiebreaks and deciders
Tiebreaks won and deciding sets won by each player.
Head-to-head grids
A matrix of records for a whole group, such as the top 10, in one call.
What does the tennis head-to-head endpoint return?
Both players with their current and career-high ranking, a summary (total matches, finals, Grand Slam meetings), breakdowns by surface, level and best-of format, tiebreak and deciding-set records, and every match they played with the date, tournament, surface, round, winner and score.
| Djokovic vs Nadal | Djokovic | Nadal | Matches |
|---|---|---|---|
| Overall | 31 | 29 | 60 |
| Hard | 20 | 7 | 27 |
| Clay | 9 | 20 | 29 |
| Grass | 2 | 2 | 4 |
| Grand Slams | 7 | 11 | 18 |
| Masters 1000 | 16 | 13 | 29 |
| Best of five | 7 | 12 | 19 |
| Deciding sets | 5 | 8 | 13 |
Can I get head-to-head records for several players at once?
Yes. /tennis/h2h/matrix?player_ids=... returns a grid of records for every pair in the list, which is how a tournament preview or a rivalry table is built in one request instead of dozens.
{
"players": [
{ "id": "atp_207989", "name": "Carlos Alcaraz", "wins": 18 },
{ "id": "atp_206173", "name": "Jannik Sinner", "wins": 18 },
{ "id": "atp_100644", "name": "Alexander Zverev", "wins": 10 }
],
"matrix": {
"atp_207989": { "atp_206173": "11-7", "atp_100644": "7-6" },
"atp_206173": { "atp_207989": "7-11", "atp_100644": "11-4" }
}
}How do I find the player IDs?
Search by name with /tennis/players/search?q=nadal, then pass the id values. IDs are stable across every match, ranking and stat row, so you can store them.
Endpoints you can ship with
Start on head-to-head: the two-player record, the path form, and the matrix.
Live scores
Every match in progress with the set scores, the game score, who is serving, and live match stats. Open one match for its full state.
- GET
/api/v1/tennis/matches/liveMatches in progress: sets, game score, server, and live stats.
- GET
/api/v1/tennis/matches/live/{match_id}One live match: every set, the current game, and both players' stats.
- GET
/api/v1/tennis/matches/{match_id}/statusScheduled, in progress, or finished, with the result once decided.
- GET
/api/v1/tennis/scheduleThe day's order of play across tours.
- GET
/api/v1/tennis/matches/upcomingScheduled matches, soonest first.
Results
Finished matches with the score of every set, the winner and loser, and the serve and return box score behind them.
- GET
/api/v1/tennis/matches/recentFinished matches, newest first, with set scores.
- GET
/api/v1/tennis/matches/completedEvery match completed on a given day.
- GET
/api/v1/tennis/matches/{match_id}One match: tournament, round, surface, score, and box score.
- GET
/api/v1/tennis/matches/{match_id}/statsAces, double faults, first-serve %, points won, break points.
- GET
/api/v1/tennis/matches?player_id=&year=&surface=The archive, filtered by player, opponent, year, surface, level or round.
Players
Player profiles with country, hand and birth date, career serve and return stats, recent form, and every match played.
- GET
/api/v1/tennis/players/search?q={name}Find a player by name and get their id.
- GET
/api/v1/tennis/players/{player_id}Name, country, hand, height, birth date and ranking.
- GET
/api/v1/tennis/players/{player_id}/statsCareer and season serve, return and win-loss stats.
- GET
/api/v1/tennis/players/{player_id}/formRecent results and win rate.
- GET
/api/v1/tennis/players/{player_id}/matchesThe player's match log, newest first.
Head-to-head
The full record between two players, split by surface and level, or a grid of records across a group of players.
- GET
/api/v1/tennis/h2h?player1_id=&player2_id=Wins, losses and every meeting between two players.
- GET
/api/v1/tennis/h2h/{player1_id}/{player2_id}The same record in path form.
- GET
/api/v1/tennis/h2h/matrix?player_ids=A head-to-head grid for several players at once.
Rankings
Weekly ATP and WTA singles rankings with points and movement, back through the decades, and any player's ranking history.
- GET
/api/v1/tennis/rankingsA full weekly ranking table for ATP or WTA.
- GET
/api/v1/tennis/rankings/topThe top N players of the latest list.
- GET
/api/v1/tennis/rankings/moversBiggest risers and fallers between two lists.
- GET
/api/v1/tennis/rankings/history/{player_id}One player's ranking, week by week.
- GET
/api/v1/tennis/rankings/datesEvery ranking date on file.
Tournaments
Tournaments from Grand Slams to ITF events, the season calendar, and the draw of any edition as a bracket.
- GET
/api/v1/tennis/tournamentsTournaments filtered by tour, level, surface and year.
- GET
/api/v1/tennis/tournaments/calendar?year=2026One season's tournament calendar.
- GET
/api/v1/tennis/tournaments/{tournament_id}One tournament: level, surface, location and editions.
- GET
/api/v1/tennis/tournaments/{tournament_id}/drawThe draw of the latest edition.
- GET
/api/v1/tennis/tournaments/{tournament_id}/editions/{year}/drawThe draw of any past edition.
Leaderboards
Season leaders for the stats that decide matches, computed from every match box score.
- GET
/api/v1/tennis/leaderboards/acesMost aces in the season.
- GET
/api/v1/tennis/leaderboards/1st-serve-wonBest first-serve points won %.
- GET
/api/v1/tennis/leaderboards/break-conversionBest break-point conversion.
- GET
/api/v1/tennis/leaderboards/tiebreak-win-pctBest tiebreak record.
- GET
/api/v1/tennis/leaderboards/comeback-winsMost wins after losing the first set.
Coverage
What the dataset holds: tours, levels, ITF and junior coverage, and the years on file.
- GET
/api/v1/tennis/coverageTours, levels, year range, ITF and junior event counts.
- GET
/api/v1/tennis/competitionsEvery competition with its tour and level.
Figures on this page were checked against the live API on 2026-10-24.
FAQs
Records, splits and player IDs
Can't find what you're looking for? Contact our customer support team
More tennis data
Pages that pair with head-to-head.
- Tennis APILive scores, results, rankings and head-to-head on one key.
- Tennis prediction dataPoint-in-time rankings, surface splits and form for models.
- Historical tennis dataEvery result since 1968, weekly rankings and 140k players.
- Tennis stats APIBox scores, career serve and return stats, leaderboards.
- ATP APIATP rankings, results, players and draws.
- WTA APIWTA rankings, results, players and draws.
- Tennis live score APISet, game and server for every match in progress.
- Tennis API docsEvery endpoint, its parameters, and a real response.
Add head-to-head to match previews
Call it on a free key now; the record, the splits and every meeting come back in one response.