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 seasonThe 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
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
periodsfor career views instead of aggregating match data yourself.
Updated 1 day ago
