DocsMatch archive filters

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
GET /tennis/matches?tournament_id=atp_1980_540&round=F200 OK
$ curl "https://api.citoapi.com/api/v1/tennis/matches?tournament_id=atp_1980_540&round=F" \ -H "x-api-key: $CITO_API_KEY"
{  "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 server
Claude
Cursor
OpenAI
Python
Cito API
Next.js
Discord
Slack
GitHub

A 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.

Totals across all segments: 1,779,582 matches from 9 July 1877 to today, in 58,797 tournament editions.
SegmentMatchesResults fromServe statistics
Men's tour level (Slams, Masters, 500, 250, Finals, team events)about 238,0001877most matches from 1991, near-complete from 2016
Women's tour levelabout 85,0001968from 2016
Men's Challengerabout 213,0001978from 2010
Women's Challenger / WTA 125about 69,0001972from 2016
ITF World Tennis Tourabout 1.1 million1994 (women), 2020 (men)results only
Davis Cup and Billie Jean King Cupabout 32,0001900results 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.

Python: every 1985 ATP Grand Slam match to CSV
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.

Results

Finished matches with the score of every set, the winner and loser, and the serve and return box score behind them.

View docs
  • GET/api/v1/tennis/matches/recent

    Finished matches, newest first, with set scores.

  • GET/api/v1/tennis/matches/completed

    Every 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}/stats

    Aces, 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.

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

See plans

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.