The Sackmann tennis data, as a live API.
If you started with the tennis_atp and tennis_wta CSVs, you know the data. This is the same depth of history, kept current every day, with live matches, weekly rankings and one ID per player, behind a documented API you can ship.
- Updated daily, live during play
- Commercial use on every plan
- Same Open Era depth
{ "ranking_date": "2024-01-01", "tour": "ATP", "items": [ { "rank": 1, "player_id": "atp_104925", "player_name": "Novak Djokovic", "points": 11245, "tournaments_played": 16 }, { "rank": 2, "player_id": "atp_207989", "player_name": "Carlos Alcaraz", "points": 8855, "tournaments_played": 17 } ]}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 serverWhat you keep, and what you gain
The community CSVs made tennis analytics possible. An API makes it something you can run in production.
Familiar IDs
Player IDs follow the same atp_/wta_ numbering many analysts already use, so joins carry over.
Current every day
Results arrive as matches finish, not when the next file is published.
Live matches
Set, game, server and point-by-point for matches in progress, over REST or WebSocket.
Challengers and WTA 125
The level below the tour, with results back to 1978 (men) and 1972 (women).
Commercial use
Use it in a product you sell, under your plan, instead of a non-commercial licence.
No CSV parsing
Filtered JSON over REST, an MCP server for AI agents, and CSV files when you want them.
Tennis Abstract data vs Cito: what is the difference?
Jeff Sackmann's datasets on GitHub (tennis_atp, tennis_wta) and his Tennis Abstract site are the best-known free tennis data. They are research resources: CSV files under a non-commercial licence, updated periodically, with no API. Cito covers the same history as an API, updated daily and live, and licensed for commercial use.
| Sackmann CSVs / Tennis Abstract | Cito tennis API | |
|---|---|---|
| Format | CSV files on GitHub, plus the Tennis Abstract website | REST JSON, WebSocket, MCP server, CSV on request |
| Licence | Creative Commons BY-NC-SA 4.0 (non-commercial) | Commercial use under your plan |
| Freshness | Periodic file updates | Results as matches finish; live scores during play |
| History | Open Era tour level, plus Challengers and Futures | Results since 1877; tour level since 1968; Challengers since 1978 |
| Rankings | Weekly files | Weekly lists since 1973 (ATP) and 1984 (WTA), any date or any player's history |
| Live data | None | Live set, game, server and point-by-point |
| Shot-by-shot charting | Match Charting Project (selected matches) | Not available |
How do I move from the CSVs to the API?
Replace each file read with a filtered request. A season file becomes /tennis/matches?tour=ATP&year=2023, a rankings file becomes /tennis/rankings?tour=ATP&date=..., and a player lookup becomes /tennis/players/search?q=.... Player IDs use the same atp_ and wta_ numbering, so existing joins keep working.
| If you read | Call instead |
|---|---|
| atp_matches_2023.csv | GET /api/v1/tennis/matches?tour=ATP&year=2023&page_size=100 |
| atp_rankings_current.csv | GET /api/v1/tennis/rankings?tour=ATP |
| A ranking file for a past week | GET /api/v1/tennis/rankings?tour=ATP&date=2024-01-01 |
| atp_players.csv | GET /api/v1/tennis/players/search?q=sinner |
| Filtering one player's matches | GET /api/v1/tennis/matches?player_id=atp_206173 |
When should I keep using the free CSVs?
For personal research, a class project or a one-off analysis, the free CSVs are a great fit and cost nothing. Choose an API when the work becomes a product: you need it current every day, live during play, covered beyond the tour level, or used commercially.
Endpoints you can ship with
Start on rankings: any week's list since 1973, or one player's week-by-week history.
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
Licences, IDs, freshness and coverage
Can't find what you're looking for? Contact our customer support team
More tennis data
Pages that pair with a move off the CSVs.
- Tennis APILive scores, results, rankings and head-to-head on one key.
- Historical tennis dataEvery result since 1968, weekly rankings and 140k players.
- 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 API docsEvery endpoint, its parameters, and a real response.
Ship tennis data for Elo models
Keep the history you know, add live data and daily updates, and use it in a product. Start on a free key.