Every tennis result since 1968, one key.
1,779,582 matches, weekly ATP and WTA rankings, and 140,000 player profiles, cleaned and checked against the official record. Query any tournament, round, player or season over REST, or take the whole archive as CSV files.
- 1.78M matches since 1877
- Rankings since 1973 (ATP) and 1984 (WTA)
- Every Slam final verified
{ "id": "atp_1980_540_300", "tournament_name": "Wimbledon", "year": 1980, "surface": "Grass", "round_name": "Final", "best_of": 5, "score": "1-6 7-5 6-3 6-7 8-6", "winner": { "name": "Bjorn Borg", "ioc": "SWE", "seed": "1", "rank": 1 }, "loser": { "name": "John McEnroe", "ioc": "USA", "seed": "2", "rank": 2 }}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 tennis archive you can build on
Historical data is only useful if the IDs hold still, the scores are right, and you can pull exactly the slice you need. That is the part we did the work on.
Results back to 1877
Tour level from the start of the Open Era, plus Challengers, ITF and team events, with the score of every set.
Weekly rankings
Every published ATP list since 1973 and WTA since 1984, with any player's week-by-week history.
Stable player IDs
One ID per person across every match, ranking and stat row, with birth date, hand and country.
Checked against the record
All 466 Grand Slam finals since 1968 and every year-end No.1 match the official results.
Slice it your way
Filter by tournament, round, surface, level, year, date range, player or opponent.
CSV when you want files
Paid plans can take the whole archive as CSV files for a warehouse or notebook.
What historical tennis data is covered?
Men's and women's singles at tour level from the start of the Open Era in 1968 (men's results go back to 1877), Challengers and WTA 125 events, the ITF World Tennis Tour, and Davis Cup and Billie Jean King Cup ties. Weekly singles rankings cover the ATP from 1973 and the WTA from 1984.
| Segment | Matches | Results from | Serve statistics |
|---|---|---|---|
| Men's tour level (Slams, Masters, 500, 250, Finals, team events) | about 238,000 | 1877 | most matches from 1991, near-complete from 2016 |
| Women's tour level | about 85,000 | 1968 | from 2016 |
| Men's Challenger | about 213,000 | 1978 | from 2010 |
| Women's Challenger / WTA 125 | about 69,000 | 1972 | from 2016 |
| ITF World Tennis Tour | about 1.1 million | 1994 (women), 2020 (men) | results only |
| Davis Cup and Billie Jean King Cup | about 32,000 | 1900 | results only |
- Every match row carries the tournament, level, surface, round, best-of format, the full score with tiebreaks, and both players' IDs.
- Most rows also carry seeds, entry status (qualifier, wildcard, lucky loser) and each player's ranking at the time of the match.
- Player profiles: about 140,000, with date of birth 99% complete for everyone who has played a tour-level match since 1990. Hand and height are partial.
- Doubles are live-only; the archive is singles.
How accurate is the historical data?
Before publishing this page we checked the archive against the official record: all 466 Grand Slam finals since 1968 (winner and runner-up) and every year-end No.1 (ATP since 1973, WTA since 1984) match. We also fixed what the check found, such as retirements stored as completed matches and best-of-five Slam rows marked best-of-three.
Dates, honestly: exact match days are verified from 2004 onward and for every match since our live feed started. Older rows carry the tournament's start date and say so with date_is_tournament_start: true, so order matches inside a tournament by round.
Ranking points are returned as null where the tour did not publish them (ATP lists before 1990), rather than as zero.
How do I download a whole season of tennis results?
Page through /tennis/matches with the filters you need. A season of men's Grand Slam matches is five pages of 100. Each response says how many pages there are, so a loop can stop on has_next.
import csv, requests
API = "https://api.citoapi.com/api/v1/tennis/matches"
HEADERS = {"x-api-key": "YOUR_API_KEY"}
rows, page = [], 1
while True:
r = requests.get(API, headers=HEADERS, params={
"tour": "ATP", "year": 1985, "level": "G", "page": page, "page_size": 100,
}).json()
rows += r["items"]
if not r["has_next"]:
break
page += 1
with open("atp_slams_1985.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["tournament", "round", "winner", "loser", "score", "surface"])
for m in rows:
w.writerow([m["tournament_name"], m["round"], m["winner"]["name"], m["loser"]["name"], m["score"], m["surface"]])Can I get the full archive as files instead of API calls?
Yes. On paid plans we deliver the archive (results, rankings and players, 1968 to today) as CSV files you can load into a warehouse or notebook, then keep it current through the API. Ask from your dashboard or at support@citoapi.com.
How is this different from the free tennis datasets on GitHub?
The well-known community datasets are excellent for research, but they are licensed for non-commercial use, update periodically, and stop at the CSV. This archive is kept current every day, includes live matches and Challengers, holds one ID per player across every table, and can be used in a commercial product under your plan.
Comparing the two in detail: Tennis Abstract alternative.
Endpoints you can ship with
Start on results: the archive endpoint, one match by ID, and the box score behind it.
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
Coverage, accuracy, dates and files
Can't find what you're looking for? Contact our customer support team
More tennis data
The rest of the tennis archive and live data on the same key.
- Tennis APILive scores, results, rankings and head-to-head on one key.
- Tennis Abstract alternativeThe Sackmann CSVs, as a maintained API with live data.
- Tennis prediction dataPoint-in-time rankings, surface splits and form for models.
- Tennis head-to-head APIEvery meeting between two players, split by surface and level.
- 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.
Build on fifty-eight seasons
Pull a season on a free key today. When you need the whole archive in your warehouse, paid plans include it as files.