Integration GuidesDocs
Coverage MatrixDocumentationChange LogLog InContact Us
Integration Guides

Historical Data

This page explains how far back the Tennis API reaches, how historical data updates, and how to retrieve past seasons, matches, and player histories.



Data Availability

The season catalog carries a rolling window per competition: at least the current season and the two adjacent editions. Mid-cycle that reads as the current edition plus the two previous ones; once an edition completes, the window rolls forward to include the next:

{
  "generated_at": "2026-07-27T21:51:02+00:00",
  "seasons": [
    {
      "id": "sr:season:111458",
      "name": "ATP Washington, USA Men Singles 2024",
      "start_date": "2024-07-27",
      "end_date": "2024-08-04",
      "year": "2024",
      "competition_id": "sr:competition:2971"
    },
    {
      "id": "sr:season:124685",
      "name": "ATP Washington, USA Men Singles 2025",
      "start_date": "2025-07-19",
      "end_date": "2025-07-27",
      "year": "2025",
      "competition_id": "sr:competition:2971"
    },
    {
      "id": "sr:season:134781",
      "name": "ATP Washington, USA Men Singles 2026",
      "start_date": "2026-07-25",
      "end_date": "2026-08-02",
      "year": "2026",
      "competition_id": "sr:competition:2971"
    }
  ]
}

Competitor-level history reaches much further: rankings, profiles, and per-year statistics extend back well beyond the season window, with player data as far back as 2007.

⚠️

A listed season is not always a played season

The catalog lists a future edition as soon as its calendar exists. Such a season returns a header without matches until its draw is made. Confirm a season has data by reading its schedule, not by its presence in the catalog:

{
  "generated_at": "2026-07-27T21:48:42+00:00",
  "season": {
    "id": "sr:season:144094",
    "name": "Wimbledon Men Singles 2027",
    "start_date": "2027-06-21",
    "end_date": "2027-07-11",
    "year": "2027",
    "competition_id": "sr:competition:2555",
    "sport": {
      "id": "sr:sport:5",
      "name": "Tennis"
    },
    "category": {
      "id": "sr:category:3",
      "name": "ATP"
    },
    "competition": {
      "id": "sr:competition:2555",
      "name": "Wimbledon Men Singles",
      "parent_id": "sr:competition:2553",
      "type": "singles",
      "gender": "men",
      "level": "grand_slam"
    },
    "info": {
      "surface": "grass",
      "number_of_competitors": 0,
      "number_of_scheduled_matches": 0
    }
  },
  "winner_last_season": {
    "competitor": {
      "id": "sr:competitor:225050",
      "name": "Sinner, Jannik",
      "country": "Italy",
      "country_code": "ITA",
      "abbreviation": "SIN"
    }
  }
}

Note winner_last_season: even a calendar stub links you to the previous edition's champion.



Data Updates

  • Completed matches retain their full detail: summaries, statistics, and point-by-point timelines remain available for as long as the season stays in the catalog.
  • Post-match corrections land shortly after a match closes (for most tiers); after that, historical match data is stable and does not need re-polling.
  • Rankings and profiles continue to update with current play; per-year statistics for past years are stable.


Data Accessibility


Past Seasons

Any season in the catalog serves the full season-scoped family: Season Info, Season Summaries, Season Links, Season Competitors, and Season Standings. Pull a past edition exactly as you would the current one.


Past Matches

A completed match keeps its statistics and its full timeline. The statistics block carries the per-player match numbers:

{
  "generated_at": "2026-07-27T21:53:25+00:00",
  "sport_event": {
    "id": "sr:sport_event:72318992",
    "start_time": "2026-07-12T15:05:00+00:00"
  },
  "statistics": {
    "totals": {
      "competitors": [
        {
          "id": "sr:competitor:225050",
          "name": "Sinner, Jannik",
          "abbreviation": "SIN",
          "qualifier": "home",
          "statistics": {
            "aces": 15,
            "backhand_errors": 31,
            "backhand_unforced_errors": 6,
            "backhand_winners": 8,
            "breakpoints_won": 2,
            "double_faults": 2,
            "drop_shot_unforced_errors": 0,
            "drop_shot_winners": 0,
            "first_serve_points_won": 70,
            "first_serve_successful": 87,
            "forehand_errors": 25,
            "forehand_unforced_errors": 17,
            "forehand_winners": 35,
            "games_won": 25,
            "groundstroke_errors": 54,
            "groundstroke_unforced_errors": 22,
            "groundstroke_winners": 37,
            "lob_unforced_errors": 0,
            "lob_winners": 0,
            "max_games_in_a_row": 3,
            "max_points_in_a_row": 8,
            "overhead_stroke_errors": 0,
            "overhead_stroke_unforced_errors": 0,
            "overhead_stroke_winners": 0,
            "points_won": 145,
            "points_won_from_last_10": 6,
            "return_errors": 0,
            "return_winners": 0,
            "second_serve_points_won": 32,
            "second_serve_successful": 47,
            "service_games_won": 22,
            "service_points_lost": 34,
            "service_points_won": 102,
            "tiebreaks_won": 1,
            "total_breakpoints": 5,
            "volley_unforced_errors": 1,
            "volley_winners": 6
          }
        },
        {
          "id": "sr:competitor:57163",
          "name": "Zverev, Alexander",
          "abbreviation": "ZVE",
          "qualifier": "away",
          "statistics": {
            "aces": 17,
            "backhand_errors": 22,
            "backhand_unforced_errors": 15,
            "backhand_winners": 9,
            "breakpoints_won": 0,
            "double_faults": 2,
            "drop_shot_unforced_errors": 0,
            "drop_shot_winners": 0,
            "first_serve_points_won": 76,
            "first_serve_successful": 105,
            "forehand_errors": 20,
            "forehand_unforced_errors": 28,
            "forehand_winners": 18,
            "games_won": 20,
            "groundstroke_errors": 41,
            "groundstroke_unforced_errors": 43,
            "groundstroke_winners": 23,
            "lob_unforced_errors": 0,
            "lob_winners": 0,
            "max_games_in_a_row": 3,
            "max_points_in_a_row": 6,
            "overhead_stroke_errors": 0,
            "overhead_stroke_unforced_errors": 0,
            "overhead_stroke_winners": 0,
            "points_won": 130,
            "points_won_from_last_10": 4,
            "return_errors": 0,
            "return_winners": 0,
            "second_serve_points_won": 20,
            "second_serve_successful": 32,
            "service_games_won": 19,
            "service_points_lost": 43,
            "service_points_won": 96,
            "tiebreaks_won": 1,
            "total_breakpoints": 1,
            "volley_unforced_errors": 0,
            "volley_winners": 4
          }
        }
      ]
    }
  }
}

And the timeline preserves every point:

{
  "generated_at": "2026-07-27T21:53:30+00:00",
  "sport_event": {
    "id": "sr:sport_event:72318992",
    "start_time": "2026-07-12T15:05:00+00:00"
  },
  "timeline": [
    {
      "id": 2409264448,
      "type": "point",
      "time": "2026-07-12T18:55:56+00:00",
      "competitor": "home",
      "home_score": 40,
      "away_score": 30,
      "server": "home",
      "result": "server_won"
    },
    {
      "id": 2409265250,
      "type": "period_score",
      "time": "2026-07-12T18:57:01+00:00",
      "period": "4",
      "home_score": 6,
      "away_score": 4,
      "server": "home",
      "result": "server_won"
    },
    {
      "id": 2409265262,
      "type": "match_ended",
      "time": "2026-07-12T18:57:02+00:00"
    }
  ]
}

Player Histories by Year

Competitor Profile carries a periods array: one entry per year, split by surface, with competitions and matches played and won. This is the per-player historical record and it spans years beyond the season window:

GET https://api.sportradar.com/tennis/{access_level}/v3/{language_code}/competitors/{competitor_id}/profile.{format}
{
  "competitor": {
    "id": "sr:competitor:225050",
    "name": "Sinner, Jannik",
    "country": "Italy",
    "country_code": "ITA",
    "abbreviation": "SIN",
    "gender": "male"
  },
  "periods": [
    {
      "year": 2026,
      "surfaces": [
        {
          "type": "grass",
          "statistics": {
            "competitions_played": 1,
            "competitions_won": 1,
            "matches_played": 7,
            "matches_won": 7
          }
        },
        {
          "type": "red_clay",
          "statistics": {
            "competitions_played": 4,
            "competitions_won": 3,
            "matches_played": 19,
            "matches_won": 18
          }
        },
        {
          "type": "hardcourt_outdoor",
          "statistics": {
            "competitions_played": 4,
            "competitions_won": 2,
            "matches_played": 20,
            "matches_won": 18
          }
        }
      ],
      "statistics": {
        "competitions_played": 9,
        "competitions_won": 6,
        "matches_played": 46,
        "matches_won": 43
      }
    },
    {
      "year": 2015,
      "surfaces": [
        {
          "type": "red_clay",
          "statistics": {
            "competitions_played": 1,
            "competitions_won": 0,
            "matches_played": 2,
            "matches_won": 0
          }
        }
      ],
      "statistics": {
        "competitions_played": 1,
        "competitions_won": 0,
        "matches_played": 2,
        "matches_won": 0
      }
    }
  ]
}

Past Dates

Daily Summaries accepts past dates, so you can rebuild any day of play inside the window date by date.



Historical Retrieval Workflow

Historical Retrieval WorkflowConfirm the edition has data, backfill, then deep-fetch what you need
Pick editionCompetition Seasonsconfirm matches existfuture editions are calendar stubs
BackfillSeason Summarieswalk pages, store results
Deep detailSport Event Timelinefull point-by-point kept for closed matches
Career viewsCompetitor Profileperiods: per-year, per-surface
Archive before the rolling window advances past an edition.


Best Practices

  • Archive what you need before a season ages out of the rolling window; the window advances as new editions are created.
  • Backfill season by season with Season Summaries pages, then deep-fetch timelines only for the matches your product needs.
  • Use profile periods for career views instead of aggregating match data yourself.

Did this page help you?