Compare
tennis_atp on GitHub returns 404: where Jeff Sackmann's ATP and WTA data is now
The tennis_atp and tennis_wta GitHub repos returned 404 on 2026-10-14. What we can verify, where copies live, and how AcesAPI's ATP and WTA results compare.
Comparison facts checked October 14, 2026. AcesAPI data last refreshed 2026-10-15 02:05 UTC, newest data through 2026-10-15. Changelog
On 2026-10-14, github.com/JeffSackmann/tennis_atp and github.com/JeffSackmann/tennis_wta both returned HTTP 404, on the website and through GitHub's API. His GitHub profile listed one public repository, tennis_MatchChartingProject, last pushed 2026-09-18. His site, tennisabstract.com, answered HTTP 200. We do not know why the two repositories are gone and we do not guess. Links to them in older tutorials and notebooks now lead to a 404 page.
Copies exist. Third-party forks and mirrors on GitHub and Hugging Face still hold the match, ranking and player CSVs, with the original CC BY-NC-SA 4.0 notice: attribution required, non-commercial use only, share-alike. For research, teaching and personal projects those copies are fine, and they are the only place to find Sackmann's serve statistics, which AcesAPI does not carry. Check a copy's last match date before you rely on it. AcesAPI is a different dataset, not a mirror: ATP and WTA singles results since 2007 with every set and tiebreak score, weekly rankings, head to head, surface splits and our Elo, from public ESPN data, over a documented REST API and MCP server with 500 free credits every month.
The options
- JeffSackmann/tennis_atp and tennis_wta (the original repositories)
ATP and WTA match results, rankings and player files as CSV, with serve statistics where available, under CC BY-NC-SA 4.0.
HTTP 404 from github.com and from api.github.com on 2026-10-14, for both repositories. The Internet Archive lists a snapshot of the tennis_atp page from 2026-03-14 and of the tennis_wta page from 2025-11-16. We did not check what those snapshots contain.
- JeffSackmann/tennis_MatchChartingProject
Crowdsourced shot-by-shot data for professional matches, as point-level and aggregate CSVs.
Public. Last pushed 2026-09-18; 446 stars. Its README licenses the data under CC BY-NC-SA 4.0 and says: attribution is required, non-commercial use only. GitHub's licence detector shows none for the repository. It holds a sample of charted matches, not every match.
- Tennis Abstract
Jeff Sackmann's statistics site, which links to his GitHub profile.
HTTP 200 on 2026-10-14. The GitHub profile it links to listed one public repository, the Match Charting Project.
- Kadantte/tennis_atp (fork)
A fork of the ATP repository: atp_matches files from 1968 to 2026, the players file and the ranking files, with the original README and its CC BY-NC-SA notice.
8 stars. Last push 2026-06-08, with a commit message reading "thru 8 jun 2026". A third-party copy, not maintained by Sackmann.
- Aneeshers/tennis-sackmann-archive (mirror)
A self-described archival mirror of the ATP, WTA and Grand Slam point-by-point datasets, data only, with each original README kept. Also published as a Hugging Face dataset.
15 stars; created 2026-06-25. Its README says the ATP and WTA snapshots come from upstream commits made in June 2026 and the point-by-point snapshot from October 2024. ATP and WTA match files run 1968 to 2026. The Hugging Face copy showed 21,352 downloads and a cc-by-nc-sa-4.0 tag on 2026-10-14.
- WTA forks with 2026 results
VictorSquidWei/tennis_wta and mikecristancho/tennis_wta, forks of the WTA repository that include wta_matches_2026.csv.
0 stars each. Last push 2026-05-06 for both. Of the 100 forks named tennis_wta that GitHub search returned, these two were the only ones with a 2026 match file.
- Older forks
GitHub search lists at least 99 forks named tennis_atp and 100 named tennis_wta (the search stops at 100). Most froze on the day they were forked. Of the 99 ATP forks, five had an atp_matches_2026.csv: Kadantte (8 stars, pushed 2026-06-08) and four with no stars, William1515 (pushed 2026-05-25), NicolaiSchmid, srcde and seanalamojr (all 2026-06-08).
sleepomeno/tennis_atp has 22 stars and ends at 2015. tastethewhip/tennis_atp and vishaan2010-dotcom/tennis_atp end at 2024. Look at the newest atp_matches file in a fork before you trust it.
- Kaggle
Datasets that name his data: SeraphicFrost's GrandSlams(1968-2024) -- JeffSackMann.
Last updated 2025-08-07; licence listed as Unknown. Older Kaggle ATP and WTA match sets that list CC BY-NC-SA 4.0, such as GMAdevs' (last updated 2017), do not name a source in Kaggle's listing, so we cannot say they are copies.
Side by side
| AcesAPI | Jeff Sackmann's tennis_atp and tennis_wta files | |
|---|---|---|
| Access | REST API and MCP server, keyed and documented | CSV files in git (original repositories 404; copies on forks and mirrors) |
| Price | 500 free credits a month, then from $19/mo | Free |
| Licence | Keyed API intended for products and models | CC BY-NC-SA 4.0: attribution, non-commercial use only, share-alike |
| Match results | ATP and WTA singles since 2007 (qualifying from 2022), every set and tiebreak score | ATP and WTA files from 1968. Per the original README, up to three files per season: tour-level main draw, tour-level qualifying and challenger main draw, and futures |
| Serve statistics | None: no aces, double faults or break points | Totals per match where available: aces, double faults, service points, break points. Per the README, from 1991 at tour level |
| Rankings | ESPN's weekly top 100 to 150 since 2007, 35 to 49 lists a year | ATP rankings mostly complete from 1985, with points where available, per the README |
| Players | search_players, profile, matches, head to head, record by surface | A players file: id, name, hand, birth date, country, height |
| Surface, head to head, Elo | Surface per tournament; head to head, surface splits and Elo by surface are calls | A surface column; head to head and ratings are yours to compute |
| Ids | ESPN's player and match ids, not Sackmann's player_id; joins between the two go by name | Sackmann's player_id |
| Updates | Every morning | A copy stops on the day it was made |
| Doubles | None | ATP doubles files exist (Kadantte's fork has them from 2000) |
Example call
One tournament-final result, with the winner, the score and every set. This is the shape of a row that tennis_atp kept as winner_name, loser_name, score, surface and round. Here winner_id says who won, and the sets array carries the games and tiebreaks.
curl -X POST https://mcp.acesapi.com/v1/get_matches \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"season": 2025,
"round": "Final",
"limit": 1
}'{"data": {"tour": "ATP", "matches": [{"match_id": "152433", "tournament_id": "971-2025", "tournament": "Bank of China Hong Kong Tennis Open", "season": 2025, "surface": "hard", "indoor": false, "match_date": "2025-01-05", "draw": "main", "round": "Final", "player1_id": "1035", "player1": "Kei Nishikori", "player1_country": "JPN", "player2_id": "3308", "player2": "Alexandre Muller", "player2_country": "FRA", "winner_id": "3308", "status": "final", "outcome": "completed", "score": "2-6 6-1 6-3", "sets1": 1, "sets2": 2, "games1": 10, "games2": 14, "sets": [{"set_no": 1, "games1": 6, "games2": 2, "tiebreak1": null, "tiebreak2": null, "winner": 1}, {"set_no": 2, "games1": 1, "games2": 6, "tiebreak1": null, "tiebreak2": null, "winner": 2}, {"set_no": 3, "games1": 3, "games2": 6, "tiebreak1": null, "tiebreak2": null, "winner": 2}]}], "count": 1, "next_offset": 1}}The match is cut to the fields a CSV row would hold (the full row also has seeds, court, start time and round order). Responses are wrapped in a data object. get_matches costs 2 credits per call.
Pull it into your own code
A season of ATP results in pandas. get_matches returns up to 500 matches a call and next_offset says where the next call starts, so a whole season is a short loop. Use league "wta" for the women's tour. The key comes from your environment.
import os
import requests
import pandas as pd
URL = "https://mcp.acesapi.com/v1/get_matches"
HEADERS = {"x-api-key": os.environ["ACES_API_KEY"]}
def season(year, league="tennis"): # "tennis" is the ATP, "wta" is the WTA
rows, offset = [], 0
while offset is not None:
resp = requests.post(
URL,
headers=HEADERS,
json={"season": year, "league": league, "limit": 500, "offset": offset},
timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]
rows += data["matches"]
offset = data["next_offset"]
return pd.DataFrame(rows)
df = season(2025)
df = df[(df["draw"] == "main") & (df["status"] == "final")].copy()
df["winner"] = df["player1"].where(df["winner_id"] == df["player1_id"], df["player2"])
df["loser"] = df["player2"].where(df["winner_id"] == df["player1_id"], df["player1"])
print(len(df), "main-draw matches")
print(df["surface"].value_counts().to_dict())
print(df[["match_date", "tournament", "surface", "round", "winner", "loser", "score"]].head(5).to_string(index=False))Run on 2026-10-14, this made 8 calls (16 credits) and printed 2,659 main-draw ATP matches for 2025: 1,596 on hard, 766 on clay and 297 on grass. The 8 calls also returned qualifying matches, which the filter drops. A season is the tournament's year, so the Brisbane International's first matches are dated 2024-12-29. At 16 credits a tour-season, the 500 free credits cover about 30. Needs requests and pandas (pip install requests pandas).
Use Jeff Sackmann's tennis_atp and tennis_wta files instead if
- You need serve statistics, minutes played or break points. AcesAPI has none of them.
- You need results before 2007, challenger or futures matches, or rankings before 2007.
- Your work is non-commercial, a fork or mirror covers the years you need, and you pin the copy by commit so the notebook keeps running.
- You need shot-by-shot data on charted matches: the Match Charting Project is still public, for non-commercial use.
- You need doubles.
Questions
Is the tennis_atp repository on GitHub gone?
On 2026-10-14, github.com/JeffSackmann/tennis_atp and tennis_wta both returned HTTP 404, and his profile listed one public repository, tennis_MatchChartingProject. We do not know why and do not guess.
Why does tennis_atp return a 404?
We do not know. We can only say what we saw on 2026-10-14: both repositories returned 404 while tennisabstract.com was up and the Match Charting Project repository was public.
Where can I download the tennis_atp CSV files now?
Third-party copies exist. Kadantte/tennis_atp is a fork with ATP match files from 1968 to 2026, and Aneeshers/tennis-sackmann-archive mirrors the ATP, WTA and Grand Slam point-by-point data, also on Hugging Face. Both carry the original CC BY-NC-SA 4.0 notice. Check each copy's newest match file first.
Can I use a fork of tennis_atp in a commercial product?
The README in the copies licenses the data under CC BY-NC-SA 4.0: attribution is required and use must be non-commercial, and adaptations must be shared alike. Read the licence before you ship. This page is not legal advice.
Is the Match Charting Project still available?
Yes. tennis_MatchChartingProject was public on 2026-10-14, last pushed 2026-09-18. Its README says the data is CC BY-NC-SA 4.0: attribution required, non-commercial use only.
Is there an API for ATP match data download?
AcesAPI serves ATP and WTA singles results since 2007 over REST and MCP, with every set and tiebreak score, surface, rankings, head to head and Elo. get_matches returns 500 matches a call, so a season is about 8 calls.
Does AcesAPI have the same columns as tennis_atp?
No. It has no serve statistics, no doubles, no challenger or futures matches and nothing before 2007. It has set and tiebreak scores, surfaces, rankings and ratings. Player ids are ESPN's, not Sackmann's player_id.
How do I get a season of ATP matches into pandas?
Call get_matches with a season and a limit of 500, follow next_offset until it is null, and build a DataFrame from the matches. The Python snippet on this page does that and ran on 2026-10-14.
Sources
- GitHub API: JeffSackmann/tennis_atp (404 on 2026-10-14)
- GitHub API: JeffSackmann/tennis_wta (404 on 2026-10-14)
- GitHub API: Jeff Sackmann's profile (public_repos: 1)
- Match Charting Project README and licence
- Tennis Abstract
- Internet Archive snapshot of the tennis_atp page, 2026-03-14
- Internet Archive snapshot of the tennis_wta page, 2025-11-16
- Kadantte/tennis_atp (fork, README with the original notice and file description)
- Aneeshers/tennis-sackmann-archive (mirror)
- Hugging Face copy of that mirror
- CC BY-NC-SA 4.0 licence summary
Checked October 14, 2026.
See the data
Try it with 500 free credits every month
No card. REST or MCP.