New · closing odds with results

Closing odds next to the result, in the columns you already use.

Every row is a played ATP, WTA, Challenger or ITF singles match in the layout of Jeff Sackmann's atp_matches files, with the closing prices appended under the names of tennis-data.co.uk: B365W / B365L, MaxW / MaxL, AvgW / AvgL, OpenAvgW / OpenAvgL, ProbW / ProbL. Result, rank, serve statistics, both players' Elo and the market in one row, with no join between files.

Independent tool, not affiliated with tennis-data.co.uk, Jeff Sackmann, Tennis Abstract, Flashscore, the ATP, the WTA, the ITF or any bookmaker.

default run · measured22 Oct 2026

Last 60 days, ATP and WTA 13 s

matches
200
with closing odds
194 of 200
bet365 price
on 154 of them
cost
~$0.49
B365W · MaxW · AvgW · OpenAvgW · ProbW
winner's closing and opening prices, fair probability, BookmakerCount
B365 · Max · Avgclosing prices, both sides
openingaverage at the opening
fair probabilitywithout the margin
Eloboth players, before the match
your countrybookmakers licensed there
Live data

Straight from the tennis database.

The database behind the results and Elo in every row: decades of matches and the Elo leaders of both tours. Matches update every hour.

What you get

The odds columns, then everything else.

Every other column is Jeff Sackmann's: tournament, winner and loser with rank, seed, hand, height and age, the score, round, minutes and serve statistics, plus match_id, tour, winner_elo and loser_elo. A match without odds has the odds columns empty.

Closing odds

  • B365W
  • B365L
  • MaxW
  • MaxL
  • AvgW
  • AvgL

Opening and probability

  • OpenAvgW
  • OpenAvgL
  • ProbW
  • ProbL
  • BookmakerCount
  • OddsCountry

Tournament and match

  • tourney_id
  • tourney_name
  • surface
  • tourney_level
  • tourney_date
  • round
  • score
  • best_of
  • minutes

Winner and loser

  • winner_*
  • loser_*
  • id, seed, entry, name, hand, ht, ioc, age, rank, rank_points

Statistics and Elo

  • w_*
  • l_*
  • match_id
  • tour
  • winner_elo
  • loser_elo

Ways to run it

years

Whole seasons

One season or ten, from 1990. A full ATP season is about 4,300 matches (4,285 in 2025).

dateFrom · dateTo

The last few days

Schedule it weekly with -7 to today and upsert by match_id.

oddsCountry

Your bookmakers

Prices from the bookmakers licensed in the country you pick: about 20 in the UK, plus Germany, Poland, Italy, Spain, France, the US, Australia and others.

tours

Challenger and ITF

ATP and WTA by default; add Challenger or ITF singles.

Use cases

A benchmark for any tennis model.

bettors & modellers

Betting models

Test a model against closing prices, the benchmark for a tennis edge, with Elo already in the row.

analysts

Market research

How closing prices moved from the opening average, favourites' hit rate by tour and surface.

data teams

Replace a stale file

Refresh your results-and-odds table weekly with one scheduled task.

AI agents

Structured results with odds

"Which ATP favourites at the closing price lost last week?" The agent gets JSON or CSV.

How to run

From a season to a results-and-odds CSV.

  1. 01

    Open it on Apify

    Sign in with a free Apify account. No card needed to try.

  2. 02

    Pick seasons or days

    Set years for whole seasons, or dateFrom and dateTo; pick tours and oddsCountry.

  3. 03

    Export as CSV

    The columns come in Jeff Sackmann's order with the odds columns last. JSON, Excel and the API work too.

More inputs to try

  • { "dateFrom": "-60", "dateTo": "today", "tours": ["atp", "wta"] }the default: last 60 days, oldest first
  • { "years": [2025], "tours": ["challenger-men"], "maxItems": 3000 }the first 3,000 Challenger matches of 2025
  • { "dateFrom": "-7", "dateTo": "today", "tours": ["atp", "wta"], "oddsCountry": "DE", "maxItems": 500 }last week's closing odds from German bookmakers
  • { "dateFrom": "yesterday", "dateTo": "yesterday", "tours": ["wta"] }one day of WTA results with odds
{
  "years": [2025],
  "tours": ["atp"],
  "maxItems": 5000
}

The 2025 ATP season, 4,285 matches, with closing odds where bookmakers priced them.

Reliability

Runs that don't break.

The same factory promises as every CrawlPlant Actor. How the factory works

Current

This week's matches are in the dataset within the hour.

Odds where they exist

In the default run, 194 of 200 matches carried closing odds, bet365 on 154 of them. The odds price is charged only on matches that have odds.

Fast

The default run, 200 matches with odds, finished in 13 seconds.

The columns you know

tennis-data.co.uk's odds names on Jeff Sackmann's match layout: code that reads those columns keeps working.

A summary every run

Each run writes a summary with the rows saved and any warnings.

Pricing

Pricing

$1.00per 1,000 matches

Down to $0.70 per 1,000 matches on Apify's Gold plan, plus $1.05 per 1,000 for the closing odds. You pay for odds only on matches that have them. Platform usage is included.

  • The default run, 200 matches, 194 with odds: about $0.49
  • Last week, ATP and WTA, up to 500 matches: up to about $1.25
  • The 2025 ATP season, 4,285 matches: about $4.29, up to $10.71 if every match has odds
  • No subscription. The free plan is enough to try it
Events and prices per 1,000, on Apify's Free and Gold plans
eventFreeGold
match one row in Sackmann's columns, plus Elo$1.00$0.70
closing odds only matches that have odds$1.50$1.05
FAQ

About this Actor.

General questions are on the home page. Need live scores or odds for matches not yet played? See Flashscore Tennis. Something else? piotr@crawlplant.com

Does every match have odds?

No. Matches without odds have the odds columns empty and are not charged the odds price. In the default run (the last 60 days, ATP and WTA), 194 of 200 matches had closing odds.

How far back does it go?

Results from 1990. Odds exist for the matches the bookmakers priced; ask for a season with years and compare BookmakerCount to see how well it is covered.

Which date range do I give for one day?

Set dateFrom and dateTo to the same day. With -7 and today you get the last 8 days.

Is this tennis-data.co.uk's data?

No. It is an independent dataset that reads the public match and odds data flashscore.com shows to every visitor, and uses the same column names for the odds so existing code keeps working.

Can an AI agent use it?

Yes. Add https://mcp.apify.com?tools=crawlplant/tennis-odds-dataset to any MCP client and the agent can pull results with closing odds on its own.