Free signup + 7 days PRO included Create my account
Data Shop › Tennis › Results & Odds
Tennis · ATP & WTA · 2015 → 2026

567,911 tennis matches, results and odds.

Grand Slams, Masters, ATP/WTA tour events, Challengers and ITF. Result, score, surface, round, pre-match odds from two reference bookmakers, best price and margin-free consensus probability.

567,911Matches
4,855Tournaments
39Columns
12Seasons
tennis_results_odds_2025.csv
01/05Sharygin – Shokryw/ohard2.09 / 1.66P1
03/09Simion – Goina6-2 6-1indoor_hard1.28 / 3.32P1
04/23Hu – Liu6-4 6-2hard1.50 / 2.41P2
05/29Added – Kalender6-4 6-1clay1.17 / 4.45P1
07/09Elsayed – Lacides7-6(1) 6-4hard2.17 / 1.61P2
10/31Cirstea – Fernandez6-4 6-4hard2.38 / 1.58P2
extract · 14 / 39 col.Figures measured on the delivered files — 2026-11-02.
Pricing

Choose your option

One purchase, one download: CSV + Parquet and a README documenting every column.

2021 → 2026

The recent seasons.

€19
  • 377,784 matches, Jan 1, 2021 → Sep 5, 2026

Download link valid 72 h, 5 downloads

Buy — €19
Recommended

Full history

Jan 1, 2015 → Sep 5, 2026 (2026 frozen).

€29
  • 567,911 matches, one file per season + a combined file
  • Joins the Line Movements 2026 dataset on match_id
  • CSV + Parquet

Download link valid 72 h, 5 downloads

Buy — €29
Secure payment StripeInstant download after paymentCSV + Parquet + detailed READMELicence your models, commercial too
What the data shows

Do favourites win as often as the odds say?

Singles matches grouped by the favourite's probability (margin-free consensus), and the real result.

hover a row
70.7%favourite wins across 514,205 singles matches.
4,855different tournaments, from Grand Slams to ITF.
8.3%doubles matches, flagged (is_doubles).

Descriptive chart, for illustration: it is not a strategy.

Use cases

Built for modelers

p1 is always the lower player id, never the winner: no result leakage in the file layout.

Calibrate a model

Margin-free consensus probability versus the real result.

t = pd.read_parquet("tennis_results_odds_2015_2026.parquet")
s = t[t.is_doubles == 0]
s.groupby(pd.cut(s.consensus_prob_p1, 10)).result
  .apply(lambda r: (r == "P1").mean())

By surface

Clay, hard, grass: compare how favourites fare.

s.groupby("surface").result.value_counts(normalize=True)

Best price

The better of the two prices, picked after the fact: it overstates what a bettor would really have got.

s[["best_odds_p1", "a_odds_p1", "b_odds_p1"]].describe()
Transparency

Two bookmakers, labelled a and b. We do not guess.

The source does not document the two bookmakers' identity: we call them a and b rather than invent a name. b is the one with the lower measured margin. These are prices recorded before the match, neither opening nor closing, without timestamps.

Totals and handicaps: bookmaker a quotes games; bookmaker b quoted games until mid-September 2022, then sets (total sets, set handicap) — the b_total_unit and b_handicap_unit columns say which, row by row. They are only present when the bookmaker offered them: the fill rate of every column is shown below.

Corrected on 22 Oct 2026: in the previous edition, over and under prices were swapped and bookmaker b's set markets were described as games. Checked since against final scores, season by season; details in the README.

Corrected on 28 Oct 2026: from March 2022, on ATP/WTA events, bookmaker a's total line no longer matched its prices (a source defect); those totals are now empty (22,982 matches), the rest is checked against the scores.

Bookmaker a odds 97.5 %Filled
Bookmaker b odds 65.5 %Filled
Games total (a) 50.6 %Filled
No surprises

What's in the file — and what isn't

Included

  • Result, score, retirements and walkovers
  • Tournament, level, surface, round, format
  • Pre-match odds from two bookmakers
  • Best price and consensus probability (ProbWin)

Not included

  • Closing line
  • Odds timestamps (→ Line Movements 2026)
  • Names of the two bookmakers
Columns

Every column, with its fill rate

Measured on the delivered file. 100% = no missing values.

Match

Identity, tour, date, tournament, level, surface, round, format

match_id100 %tour100 %match_date100 %tournament_name100 %tournament_level100 %surface100 %round_name100 %best_of100 %

Players

Ids and names (p1 = lower id), doubles

p1_id100 %p2_id100 %p1_name100 %p2_name100 %is_doubles100 %

Result

Winner P1/P2, score, retirement, walkover

result100 %score100 %retirement100 %walkover100 %

Odds

Odds of bookmakers a and b, best price, consensus probability

a_odds_p197.5 %a_odds_p297.5 %b_odds_p165.5 %b_odds_p265.5 %best_odds_p199.9 %best_odds_p299.9 %consensus_prob_p199.2 %consensus_prob_p299.2 %

Totals & handicaps

Total and handicap when offered: a in games, b in games then sets since Sept 2022 (b_total_unit, b_handicap_unit)

a_total_line50.6 %a_total_over50.6 %a_total_under50.6 %b_total_line28.8 %b_total_over28.8 %b_total_under28.8 %b_total_unit28.8 %a_handicap_p154.7 %a_handicap_p1_odds54.7 %a_handicap_p2_odds54.7 %b_handicap_p128.8 %b_handicap_p1_odds28.8 %b_handicap_p2_odds28.8 %b_handicap_unit28.7 %
Preview

The file, exactly as you'll get it

Six real rows, main columns. Download 50 free rows with every column to check it fits your pipeline.

tennis_results_odds_2025.csv — extract Download 50 free rows
match_datetourtournament_namesurfaceround_namep1_namep2_nameresultscorea_odds_p1a_odds_p2best_odds_p1best_odds_p2consensus_prob_p1
2025-01-05atpM15 Kingstonhardq-FirstEvan SharyginElias ShokryP1w/o2.091.662.091.660.4427
2025-03-09wtaW75 Targu Muresindoor_hardq-FirstOana Georgeta SimionPatricia Georgiana GoinaP16-2 6-11.283.321.283.320.7217
2025-04-23wtaW15 WuninghardFirstFeier HuZhirui LiuP26-4 6-21.52.411.52.570.6286
2025-05-29atpM25 BolclaySecondDan AddedAdmir KalenderP16-4 6-11.1684.451.1684.980.8032
2025-07-09atpM15 MonastirhardFirstAmr ElsayedOscar LacidesP27-6(1) 6-42.171.612.172.040.4864
2025-10-31wtaHong Kong Tennis Open - Hong KonghardQFSorana CirsteaLeylah Annie FernandezP26-4 6-42.3751.582.481.5880.3949
Questions

Before you buy

What is the difference between the two offers?

Same columns, one file per season in both: 2021 → 2026, or the full history since 2015. The 2026 season is frozen on Sep 5, 2026.

Which way is the score written?

Always winner-first, not from p1's side. The result column (P1/P2) gives the winner: to read the score from p1's side, reverse each set when result = P2.

What does the tournament_level column mean?

A level code: 0 = ITF entry level (Futures until 2018, M15/W15 since 2019, plus men's M25), 1 = Challengers, WTA 125 and women's ITF W25 to W100, 2 = ATP/WTA 250 and 500 events, 3 = Masters 1000 / WTA 1000, 4 = Grand Slams (qualifying included), 5 = team events (Davis Cup, Billie Jean King Cup), 6 = other (juniors, exhibitions, wildcard play-offs).

Do you have seasons before 2015?

Yes, 2004 to 2014: by season, as a bundle or in the complete 2004 → 2026 edition, on the Results & Odds 2004–2014 page (/data-shop/tennis-results-odds-2004-2014/).

Is there more than one total or handicap line per match?

No: one total line and one handicap line per bookmaker and per match, with no alternative-line ladder.

How are walkovers and retirements handled?

The file gives the official winner, including on a walkover (walkover column) or a retirement (retirement column). Bookmakers usually void bets on a walkover and their rules on retirements vary: filter both columns before computing a return.

How do I get the file?

Right after payment a download link appears on screen and is emailed to you. The archive contains CSV and Parquet files plus a README documenting every column.

Can I use it in a commercial product?

Yes for your models, analyses and tools, commercial ones included. Reselling or redistributing the files themselves is not allowed.

A question before buying?

Email [email protected] — the founder answers, usually the same day.

Also available

Complete your data

567,911 tennis matches, ready to load.

Choose my option
Figures measured on the delivered files — 2026-11-02. Not affiliated with the leagues mentioned.
GAMBLING PROHIBITED FOR MINORS. Gambling carries risks: debt, addiction, social isolation. Help & responsible play · BeGambleAware · GamCare: 0808 802 0133 · NCPG Helpline: 1-800-522-4700