Tennis Scraper & Odds API: Live Scores, Results, Stats, ATP WTA avatar

Tennis Scraper & Odds API: Live Scores, Results, Stats, ATP WTA

Pricing

from $3.50 / 1,000 matches

Go to Apify Store
Tennis Scraper & Odds API: Live Scores, Results, Stats, ATP WTA

Tennis Scraper & Odds API: Live Scores, Results, Stats, ATP WTA

Tennis scraper and tennis data API for every ATP, WTA, Challenger and ITF match: tennis live scores, tennis results and fixtures, match stats, point-by-point, ATP and WTA rankings, H2H, player profiles and tennis odds from 42 bookmakers (opening and closing lines). History since 2009.

Pricing

from $3.50 / 1,000 matches

Rating

0.0

(0)

Developer

Min Maxxxer

Min Maxxxer

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

9

Monthly active users

2 days ago

Last modified

Share

Tennis Scraper & Tennis Odds API: Live Scores, Results, ATP, WTA

💰 $5 per 1,000 matches ($3.50 on Business plans) — platform usage, every bookmaker's odds and the statistics included. Press Start — the prefilled input returns today's and tomorrow's matches (live, finished and upcoming) with odds in under a minute.

Sample output: Wimbledon 2024 with fair odds, line movement and best prices

Tennis scraper and tennis data API for every ATP, WTA, Challenger and ITF match: live scores, results and fixtures, current ATP and WTA rankings, set scores with tiebreaks, match statistics (aces, double faults, first serve, break points, serve and return points), point-by-point data and tennis betting odds from up to 42 bookmakers — match winner, total games, games handicap and set score, opening and closing lines, a no-vig market consensus, line movement and the result of every bet. Head-to-head and recent form of both players, player profiles (height, weight, age, playing hand), round, tournament level and match duration. ATP and WTA rankings — singles, doubles and race. Historical tennis odds back to 2009 for backtesting, and only new or changed matches for scheduled runs. One clean row per match, ready for a spreadsheet, a database, a model or an AI agent.

Most tennis scrapers give you scores. Most odds scrapers cover US sports. This Actor joins the two for tennis — including the Challenger and ITF levels, where historical odds are hardest to find.

Why this tennis data

  • ✅ Scores and odds in one row — result, sets, tiebreaks, statistics and the prices of 20–40 bookmakers, no joining of files
  • ✅ Verified closing lines — 4,464 ATP matches of 2025–26 checked against an independent source: 0.8 percentage points apart on average, pre-match prices only — reproducible notebook
  • ✅ Every level — ATP, WTA, Challenger, ITF and team events; singles and doubles; qualifying included
  • ✅ History back to 2009 — complete past editions of any tournament with each bookmaker's opening and closing price; ATP: all pulls a whole season
  • ✅ More than the match winner — total games (every line), games handicap and set score, each graded over/under, covered or not
  • ✅ Head-to-head and form without look-ahead — previous meetings, last 10 results, wins on the surface and rest days, counted only from matches before each one
  • ✅ Live — who is serving and the points of the current game, for a live tennis scoreboard
  • ✅ Only new or changed matches — schedule it every few minutes and pay only for what changed since the last run
  • ✅ One price per match — all bookmakers, the consensus, statistics and point-by-point at no extra cost

What you can scrape

Live tennis scores and today's matches

Run it with no changes: every match of today and tomorrow — live, finished and upcoming — with the current score, the server and the points of the game in progress (live). Schedule it every few minutes for a live tennis scores feed or an alert bot.

Tennis results and fixtures (7 days back, 7 days ahead)

Yesterday's tennis results with closing odds, or the fixtures and schedule of the next 7 days with current prices. Filter by tour (ATP, WTA, Challenger, ITF, team events), singles or doubles, and status (finished, live, scheduled, cancelled).

Historical tennis odds for backtesting (2009 – today)

Tournament history mode returns complete past editions — main draw and qualifying — with the opening and closing odds each bookmaker published at the time: one tournament (ATP: Wimbledon), many (WTA: French Open, Challenger Men: Genova), or a whole tour (ATP: all, WTA: all, Challenger Men: all), for single years or ranges (2015-2025).

Tennis betting markets: total games, games handicap, set score

Switch on Extra markets for the over/under on total games (every line each bookmaker offers), the games handicap and the set score (2:0, 2:1…): each bookmaker's opening and closing price, a no-vig consensus at the main line (the line most bookmakers price closest to even) and, for finished matches, the result — over / under / push, which player covered, the final set score. Available for recent matches and for past editions (Wimbledon 2019 already has total games and handicap lines from 6 bookmakers).

Head-to-head, form and rest days

Switch on Head-to-head and recent form (singles): the players' previous meetings — on all surfaces and on this one, with the last 10 scores — and each player's last 10 results, wins on this surface, the date of the previous match and the rest days. Everything is counted only from matches that started before this one, so rows from past tournaments carry no look-ahead: where the source's lists do not reach back that far, the form is left empty instead of guessed.

Player history: every match of a player

Player history mode takes player names (Jannik Sinner, Iga Swiatek) or Flashscore player URLs and returns every match of each player in the years you choose — ATP/WTA, Challenger, ITF and team events (pick them in Tours) — with odds, markets, head-to-head and form like any other row. Jannik Sinner's 2026 season (47 matches) takes about 15 seconds.

Match statistics and point-by-point data

Optional per match: aces, double faults, first-serve %, first/second serve points won, break points saved and converted, return points won, service and return games won, winners and unforced errors where the tournament reports them — and point-by-point: every game with server, winner, break or hold and the score before each point, break, set and match points marked, every tiebreak point.

ATP and WTA rankings: singles, doubles and race

Rankings mode returns the current lists — ATP and WTA singles, doubles, race (points of this year) and doubles race — with rank, points, country and the player's Flashscore id (the same id as in match rows), top 100 by default or the whole list (about 2,300 players for the ATP). A list costs the same as one match, whatever its length. Recent matches also carry both players' current singles ranking and points (player1Rank, player1RankPoints).

Player profiles: height, weight, age, playing hand

Switch on Player profiles for each singles player's height, weight, birth date, age at the match, playing hand and best singles and doubles ranking (player1Profile, player2Profile; in Rankings mode profile) — the columns Sackmann's files had and Flashscore lacks. They come from TennisExplorer, matched by name: a player without a sure match gets no profile rather than someone else's. In our test (October 2026) all 348 players got one — the ATP and WTA top 100 and everyone in two days of ATP, WTA and Challenger matches — with birth date and playing hand for practically all of them, height and weight for about 4 in 10 (TennisExplorer does not list them for everyone).

Only new or changed matches (scheduled runs)

Turn on Only new or changed matches and schedule the Actor — every 10 minutes during a tournament, or every morning for yesterday's results. Each run then saves only matches that are new or changed since the previous run of the same search: a new status, score or live point, or for upcoming matches a price move of half a percentage point, a new bookmaker or a new start time. Each row says changeType: new or updated; unchanged matches are neither saved nor charged. A match that finished since it was saved live comes once more with its final score, even when you ask for live matches only.

What you get for each match

  • Match: start time (UTC), tour (ATP / WTA / Challenger / ITF / team events), singles or doubles, tournament, round (1/64-finals … Final, qualifying rounds), tournament level (Grand Slam, Tour Finals, ATP Masters 1000, WTA 1000, ATP/WTA Tour, Challenger, ITF M15/W35…), best of 3 or 5, surface, season, qualifying flag, players and their countries, stable Flashscore IDs and link
  • Result: status (finished, retired, walkover, cancelled, live, scheduled), set-by-set score with tiebreak points, sets won, winner, total games, end time; with statistics also the match duration, each set's duration and the umpire
  • Live: for matches in progress, who is serving and the points of the current game (live)
  • Rankings: current ATP / WTA singles ranking and ranking points of both players (player1Rank, player1RankPoints …), recent matches
  • Odds per bookmaker: opening price and latest price for both players, plus the bookmaker margin. Once a match has started the latest price is the closing line
  • Market consensus (median across bookmakers, margin removed):
    • fair opening and closing odds for both players
    • win probability at the open and at the close
    • line movement in percentage points
    • best available odds at the open and at the close
    • median bookmaker margin
  • Extra markets (optional): totalGamesOdds, gamesHandicapOdds, setScoreOdds (every bookmaker and line), totalGamesConsensus, gamesHandicapConsensus, setScoreConsensus (opening and closing main line, fair odds, probability, best prices) and results (graded bets)
  • Head-to-head and form (optional): h2h (meetings, wins each, on this surface, last 10) and form.player1 / form.player2 (last 10 as WLWWL…, wins, surface record, last match, rest days)
  • Player profiles (optional): player1Profile / player2Profile — birthDate, age (at the match), heightCm, weightKg, plays (right / left), highestSinglesRank, highestDoublesRank; players' Flashscore pages in player1Url / player2Url
  • Changes (with Only new or changed matches): changeType — new or updated
  • Statistics (optional) and point-by-point (optional) — see above

Verified data: closing lines checked against an independent source

We paired 4,464 ATP matches of 2025 and 2026 with an independent public file (dissfya's ATP Tennis 2000–2026 daily update on Kaggle, CC0, one price per player): same two surnames within three days, exactly one candidate, otherwise left out. Every step is in a public notebook that runs on the free weekly files — press Copy & Edit to reproduce it or change a rule.

CheckResult
Win probability, this Actor's no-vig consensus vs the independent price (margin removed)0.83 percentage points apart on average, median 0.63; 95% of matches within 2.0 pp; correlation 0.995
Same winner in both sources99.96%
Closing prices are pre-matchOdds are read from the source's pre-match odds service. An in-play price moves 20–30 points after a lost set; here the consensus moved more than 20 points between open and close in 0.02% of matches (median move 2.9 points)
Best available price here ≥ the independent file's price98.9% of matches

12 matches (0.27%) differ by more than 10 points; the notebook lists all of them. In most, 20+ bookmakers here agree from the open to the close and the independent price is the odd one out (one looks swapped, one is exactly 50%); the rest are thin markets with 2–4 bookmakers.

Looking for Jeff Sackmann's tennis_atp / tennis_wta data?

The popular JeffSackmann/tennis_atp and tennis_wta repositories are no longer on GitHub (they return 404 since mid-2026), and many notebooks and projects that loaded them stopped working. This Actor gives you the same kind of match-level tennis data — every ATP, WTA, Challenger and ITF match with tournament, round, surface, players, score and serve statistics, by tournament, by season (ATP: all) or by player (Player history) — plus betting odds, and keeps it current: schedule it daily.

Sackmann columnField here
tourney_name, surfacetournament, surface
tourney_datestartTime (each match's own start, UTC)
winner_name, loser_nameplayer1 / player2 + winner (1 or 2)
winner_ioc, loser_iocplayer1Country, player2Country (country names)
scorescore, plus sets and tiebreaks
round, best_of, minutesround, bestOf, durationMinutes (with statistics)
tourney_leveltournamentLevel (Grand Slam, Masters 1000, Challenger, ITF…)
w_ace, w_dfstats.aces, stats.doubleFaults
w_svpt, w_1stIn, w_1stWon, w_2ndWonstats.servicePointsWon.total, stats.firstServePointsWon.total / .won, stats.secondServePointsWon.won
w_SvGms, w_bpSaved, w_bpFacedstats.serviceGamesWon.total, stats.breakPointsSaved
winner_rank, winner_rank_pointsplayer1Rank, player1RankPoints (current ranking, recent matches)
winner_hand, winner_ht, winner_ageplayer1Profile.plays, .heightCm, .age (with Player profiles)
—opening and closing odds of 20–40 bookmakers, no-vig win probability, line movement

Not included: the ranking on the date of past matches.

📂 Ready-made files: the ATP & WTA matches with odds dataset already has atp_matches_2026.csv / wta_matches_2026.csv (and 2025) in Sackmann's columns — players' hand, height and age included — refreshed every Monday, free.

Python — a Sackmann-style table (winner / loser per row) with the closing probability:

from apify_client import ApifyClient
import pandas as pd
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("sports-odds-lab/tennis-odds-results").call(run_input={
"mode": "tournaments", "tournaments": ["ATP: all"], "years": ["2026"],
"includeQualifying": False, "includeStats": True,
})
def stat(m, key, p, part=None):
v = ((m.get("stats") or {}).get(key) or {}).get(f"player{p}")
return v.get(part) if isinstance(v, dict) and part else v
rows = []
for m in client.dataset(run["defaultDatasetId"]).iterate_items():
if m.get("winner") not in (1, 2):
continue
w, l = (1, 2) if m["winner"] == 1 else (2, 1)
p1 = (m.get("consensus") or {}).get("consensusLastProb1")
sets = m["sets"] if w == 1 else [[b, a] for a, b in m["sets"]] # score from the winner's side
rows.append({
"tourney_name": m["tournament"], "surface": m["surface"], "date": m["startTime"][:10],
"winner_name": m[f"player{w}"], "loser_name": m[f"player{l}"],
"score": " ".join(f"{a}-{b}" for a, b in sets if a is not None and b is not None),
"w_ace": stat(m, "aces", w), "l_ace": stat(m, "aces", l),
"w_df": stat(m, "doubleFaults", w), "l_df": stat(m, "doubleFaults", l),
"w_1stIn": stat(m, "firstServePointsWon", w, "total"), "w_1stWon": stat(m, "firstServePointsWon", w, "won"),
"w_2ndWon": stat(m, "secondServePointsWon", w, "won"),
"winner_close_prob": None if p1 is None else (p1 if w == 1 else 1 - p1),
})
atp = pd.DataFrame(rows)
print(atp.head())

Use cases

  • Tennis betting models and backtesting — train on closing-line probabilities, the most efficient price the market produces
  • Closing Line Value (CLV) — compare the price you bet with the consensus close to see whether you beat the market
  • Line movement and steam — find matches where the market moved sharply between open and close
  • Live tennis scoreboards, apps and alert bots — poll live matches for the score, the server and the current game
  • Tennis analytics and research — serve and return statistics, hold/break rates, pressure points, tiebreak performance, upsets by surface and level
  • Market research — bookmaker margins, best prices, how efficient Challenger and ITF markets are
  • Fantasy and media — daily results digests and tomorrow's schedule with favourites
  • Your own odds history — schedule the Actor daily and keep appending to a dataset; after a few weeks you own a history nobody else sells for these levels

🆓 Free datasets: ATP & WTA matches with odds in Sackmann format — 2025 and 2026 so far, updated every Monday (also on Kaggle) — and ATP and WTA 2025 closing odds and results (Kaggle, starter notebook).

How to use it

  1. Leave the prefilled input for today's and tomorrow's matches, or pick the days (up to 7 back and 7 ahead), tours, singles/doubles and statuses. With Max matches set, the most important matches are kept first (ATP and WTA, then Challenger, team events and ITF).
  2. Click Start. A day of ATP + WTA + Challenger finishes in about a minute; a full day including ITF in a few minutes; a Grand Slam edition (239 matches with qualifying) in about 30 seconds.
  3. Download the results as JSON, CSV or Excel, read them through the Apify API, or connect Google Sheets, Make, Zapier or a webhook.

Tip — build a history automatically: create a Schedule that runs every morning with daysBack: 1, daysAhead: 0, statuses: ["finished"] and onlyChanges: true. Each run adds yesterday's matches with their closing lines — and none twice.

Ready-made examples

One click, preconfigured — open, press Start, adjust if you like:

Input example — live scores only

{
"daysBack": 0,
"daysAhead": 0,
"statuses": ["live"],
"tours": ["ATP", "WTA", "CHALLENGER", "ITF"],
"includeOdds": false
}

Input example — yesterday's results with closing odds

{
"daysBack": 1,
"daysAhead": 0,
"tours": ["ATP", "WTA", "CHALLENGER"],
"formats": ["SINGLES"],
"statuses": ["finished"],
"includeOdds": true,
"includeStats": true,
"onlyWithOdds": true
}

Input example — markets, head-to-head and form

{
"daysBack": 0,
"daysAhead": 1,
"tours": ["ATP", "WTA"],
"statuses": ["scheduled"],
"markets": ["totalGames", "gamesHandicap", "setScore"],
"includeH2H": true
}

Input example — a feed of changes every 10 minutes

{
"daysBack": 0,
"daysAhead": 1,
"tours": ["ATP", "WTA"],
"statuses": ["live", "scheduled", "finished"],
"onlyChanges": true
}

Input example — rankings with player profiles

{
"mode": "rankings",
"rankingLists": ["atp", "wta", "atp-race"],
"maxRankingPlayers": 200,
"includePlayerProfiles": true
}

Input example — player history

{
"mode": "players",
"players": ["Jannik Sinner", "Iga Swiatek"],
"years": ["2024-2026"],
"tours": ["ATP", "WTA", "CHALLENGER", "ITF", "TEAMS"],
"statuses": ["finished"],
"markets": ["totalGames"],
"includeH2H": true
}

Input example — tournament history

{
"mode": "tournaments",
"tournaments": ["ATP: Wimbledon", "WTA: Wimbledon", "ATP: Indian Wells"],
"years": ["2015-2024"],
"includeQualifying": false,
"includeStats": true
}

Output example (shortened)

{
"matchId": "8079sqDc",
"startTime": "2026-09-23T03:05:00Z",
"tour": "WTA",
"format": "SINGLES",
"tournament": "Seoul (South Korea)",
"surface": "hard",
"round": "1/16-finals",
"tournamentLevel": "WTA Tour",
"bestOf": 3,
"player1": "Tararudee L.",
"player2": "Park S.",
"player1Rank": 92,
"player2Rank": 187,
"status": "finished",
"score": "7-6 6-0",
"sets": [[7, 6], [6, 0]],
"tiebreaks": [[7, 4], null],
"winner": 1,
"endTime": "2026-09-23T04:41:12Z",
"live": null,
"consensus": {
"bookmakerCount": 39,
"consensusOpeningProb1": 0.8283,
"consensusLastProb1": 0.8393,
"fairLastOdds1": 1.192,
"fairLastOdds2": 6.221,
"probMovementPts": 1.09,
"bestLastOdds1": 1.14,
"bestLastOdds2": 7.2,
"medianMarginPct": 6.09
},
"odds": [
{"bookmaker": "1xBet", "opening1": 1.15, "opening2": 5.4, "last1": 1.13, "last2": 5.9, "lastMarginPct": 5.44},
{"bookmaker": "7BetUK", "opening1": 1.13, "opening2": 5.0, "last1": 1.13, "last2": 5.0, "lastMarginPct": 8.5}
],
"stats": {
"aces": {"player1": 2, "player2": 0},
"firstServePointsWon": {"player1": {"pct": 78, "won": 25, "total": 32}, "player2": {"pct": 57, "won": 17, "total": 30}}
},
"pointByPoint": [
{"set": 1, "type": "game", "score": "0-1", "server": 2, "winner": 2, "break": false, "points": ["0:15", "15:15", "15:30", "15:40"]},
{"set": 1, "type": "game", "score": "1-1", "server": 1, "winner": 1, "break": false, "points": ["15:0", "30:0", "30:15", "40:15"]},
{"set": 1, "type": "tiebreak", "score": "7-4", "winner": 1, "points": ["1:0", "…", "6:4 SP"], "servers": [1, 2, "…"]}
]
}

With Extra markets and Head-to-head and recent form switched on, a match also carries (shortened):

{
"totalGamesConsensus": {"bookmakers": 19, "closingMainLine": 21.5, "closingProb": 0.4852, "closingFairOver": 2.061, "closingFairUnder": 1.942, "closingBestOver": 1.95},
"gamesHandicapConsensus": {"bookmakers": 17, "closingMainLine": 3.5, "closingProb": 0.5205, "closingFair1": 1.921, "closingFair2": 2.086},
"setScoreConsensus": {"bookmakers": 10, "closingProbs": {"0:2": 0.3985, "1:2": 0.2103, "2:0": 0.2252, "2:1": 0.1659}},
"results": {"totalGames": 23, "totalGamesLine": 21.5, "totalGamesResult": "over", "gamesHandicapLine1": 3.5, "gamesHandicapResult": "player2", "setScore": "1:2"},
"h2h": {"meetings": 2, "player1Wins": 1, "player2Wins": 1, "surfaceMeetings": 0, "last": [{"date": "2026-05-02", "tournament": "La Bisbal D'Emporda", "surface": "clay", "winner": 2, "sets": "0:2"}]},
"form": {"player1": {"matches": 10, "wins": 6, "last": "WLWWLWLWLW", "surfaceMatches": 10, "surfaceWins": 5, "lastMatch": "2026-10-10T03:10:00Z", "restDays": 1.0}},
"durationMinutes": 141, "setDurations": [46, 51, 44], "umpire": "Germani A."
}

A live match looks like this: "status": "live_set_2", "score": "6-4 3-2", "live": {"server": 1, "points1": "30", "points2": "15", "currentSetSince": "2026-09-25T17:18:20Z"}.

Tournament history: odds back to 2009

EditionBookmakers per match (examples)
2009 – 20137–9 (Wimbledon ATP and WTA) · 6–7 (Challenger Genova)
2015 – 20198–10 (Wimbledon, French Open WTA, Challenger Genova)
2023up to 10 (ITF M15 Monastir)
2024 and later17–18 (Wimbledon)

Tournaments are named as on Flashscore: ATP: Wimbledon, WTA: French Open (Roland Garros), ATP: Indian Wells, Challenger Men: Genova, ITF Women: W15 Monastir — or paste the tournament's Flashscore URL. ATP: all expands to every ATP tournament (likewise WTA: all, Challenger Men: all, ITF Women: all…). Years can be single (2024) or ranges (2015-2024). For many tournaments and years, raise the run timeout (the default is 6 hours).

Coverage

Measured on a sample of 250 recent matches (all levels, singles and doubles):

LevelShare of matches with oddsBookmakers per match (avg.)
ATP singles100%~35
WTA singles100%~37
Challenger singles100%~36
ITF singles98%~20
Doubles (all levels)93–100%10–36

Bookmakers include 1xBet, 7BetUK, Betway, bwin, BetMGM, Betclic, Betfred, Betano, bet365, DraftKings, FanDuel, Fanatics, Interwetten, Ladbrokes, Midnite, Neobet, Skybet, Stake, STS, Superbet, Winamax and more (up to 42 listings, depending on the match). Brands that appear under several licences (Betano .br / .ca / .de / .dk, BetMGM .uk / .us…) are counted once in the consensus (brandCount), so they cannot outvote the rest.

Use with AI agents (MCP)

The Actor works as a tool for AI assistants through the Apify MCP server — Claude, ChatGPT, Cursor and other MCP clients can call it directly. Ask for example "get today's ATP and WTA matches with closing odds", "which Challenger favourites lost yesterday?" or "Wimbledon 2015–2025 odds for backtesting" — the agent fills the input (daysBack, tours, statuses, or mode: "tournaments" with tournaments and years) and gets one JSON row per match. Keep maxMatches low for quick, cheap calls.

Pricing

You pay per match saved — platform usage included, nothing else:

Apify planPrice per 1,000 matches
Free$5.00
Starter$4.50
Scale$4.00
Business and higher$3.50

💡 On Apify's free plan the monthly $5 platform credit covers about 1,000 matches — enough to try the data properly before paying anything.

Every match comes with the odds of all bookmakers that priced it, the consensus, and — when switched on — the extra markets, head-to-head and form, player profiles, statistics and point-by-point at no extra cost. Nothing is charged for matches you filter out: turn on Skip matches without odds to pay only for priced matches, and Only new or changed matches to pay only for what changed since the last run. A ranking list costs the same as one match, whatever its length. Set a spending limit on the run if you want a hard cap — the Actor stops as soon as the limit is reached.

FAQ

What is the "closing line"? The last price before the match starts. For finished and live matches the last1 / last2 fields are the closing odds; for scheduled matches they are the current prices. Odds come from the source's pre-match odds service, and the closing consensus stays within a few points of the opening one (notebook).

How is the consensus calculated? For each bookmaker the margin is removed proportionally, then the median is taken across bookmaker brands (each brand once, via its lowest-margin listing). The median keeps one stale or mispriced book from skewing the result.

How far back can I go? In Recent matches mode 7 days back and 7 ahead. In Tournament history mode every edition Flashscore lists — odds go back to 2009 (fewer bookmakers in older editions, see the table above).

Is this an alternative to tennis-data.co.uk or Jeff Sackmann's data? Yes. The tennis-data.co.uk files cover ATP and WTA main draws with a few bookmakers' prices; here you also get Challenger, ITF, doubles and qualifying, the opening and closing price of each of 20–40 bookmakers, a no-vig consensus and line movement — through an API you can schedule. Sackmann's tennis_atp / tennis_wta repositories are offline since mid-2026; see the column mapping above.

How do I get live tennis scores every minute? Schedule the Actor every few minutes with statuses: ["live"], daysBack: 0, daysAhead: 0 and includeOdds: false (faster). Each run returns the matches in progress with the server and the points of the current game.

Can I get all matches of one player? Yes — Player history mode: list the players (names or Flashscore URLs) and the years. Rounds are not filled in this mode (the player feed does not carry them); use Tournament history if you need rounds.

Which markets are there besides the match winner? Total games over/under (every line), games handicap and set score, each with opening and closing prices per bookmaker. The consensus uses the main line — the one most bookmakers price closest to even — at the open and at the close separately, because the line often moves (21.5 games at the open, 22.5 at the close). Bets are graded on the closing main line; tiebreaks count as one game, as bookmakers settle them.

Can head-to-head or form leak results from after the match? No. Only matches that started before the match in the row are counted. The source lists each player's latest matches as of today, so for older matches the form is often empty — that is deliberate.

Which time zone? All timestamps are UTC.

Which ranking is player1Rank? The current ATP or WTA singles ranking at the time of the run (not added to doubles or to past tournament editions). For whole lists — singles, doubles, race — use Rankings mode.

How does "Only new or changed matches" know what changed? It keeps a short record of every match it saved — in a key-value store in your account (tennis-odds-changes), one per search, kept 21 days. A search is defined by its settings (tours, statuses, markets…), not by its days, so daysBack: 1 and daysBack: 0 runs of the same search share it. Give schedules the same History name to share one record, or a new name to start afresh.

How accurate are the player profiles? As accurate as TennisExplorer, where they come from (heights in particular can differ from the ATP/WTA sites by a centimetre or two). A player is matched only when the names agree (order, accents and hyphens aside, a second surname or middle name tolerated within the same country); if two players fit, none is taken. Profiles are kept for 30 days in your account (tennis-player-profiles), so repeated runs do not look them up again.

Is Pinnacle included? No — the source does not list Pinnacle. The consensus of 20–40 books is a solid reference, and the Actor reports the best available price as well.

Where does the data come from? From publicly available match, ranking and odds information shown on Flashscore, and player profiles from TennisExplorer. This Actor is not affiliated with Flashscore, TennisExplorer, the ATP, the WTA, the ITF or any bookmaker.

More from Min Maxxxer

⭐ Did this Actor save you time? A short review on this page helps other bettors and analysts find it — and tells us what to build next.

Changelog

  • 0.9 — fixes: total games no longer picks up total-sets lines (2.5 sets — some bookmakers list them in the same market, two label them as games; this hit about half of doubles matches); a match tie-break counts as one game in total games and games handicap (doubles: 2-6 6-2 [7-10] is 17 games, not 33); Only new or changed matches treats the same filters in another order as the same search, notices a replaced player and an exact half-point price move, completes a finished match whose odds were missing at first, and two overlapping runs no longer overwrite each other's memory; a match refused by the spending limit is not remembered as delivered; one match is never saved twice in a run; the consensus of extra markets uses each brand's lowest-margin licence whatever the order, best prices include every licence, prices and lines a bookmaker no longer quotes are left out, and a set-score market with missing scores is not turned into probabilities; best-of-five is recognised from a third set played after 2:0 and for the Next Gen Finals; a failed page of a tournament or player history is reported instead of ending the list silently; a TennisExplorer bot check is not remembered as 'no profile'.
  • 0.8 — Only new or changed matches for scheduled runs (onlyChanges, changeType; unchanged matches are not charged); Rankings mode (ATP/WTA singles, doubles, race and doubles race, with country); player profiles — height, weight, birth date, age at the match, playing hand, best rankings (includePlayerProfiles); players' Flashscore links (player1Url); new dataset views Rankings and Player profiles; the closing-line check redone on 4,464 matches as a public notebook.
  • 0.7.4 — team events (Davis Cup, Billie Jean King Cup, United Cup, Laver Cup) get the level Team event.
  • 0.7.3 — ranking points next to the ranking (player1RankPoints, player2RankPoints).
  • 0.7.2 — fix: break points saved / converted keep both numbers ({"won": 2, "total": 3}); before, only the first one was kept.
  • 0.7 — Player history mode: every match of the players you list (names or Flashscore URLs) for the years you choose, all tours, with odds, markets, head-to-head and form.
  • 0.6 — total games, games handicap and set score markets (every bookmaker and line, consensus at the main line, graded results); head-to-head and form without look-ahead (meetings, last 10, surface record, rest days); round, tournament level and best of on every match; total games; with statistics also match and set durations and the umpire; new dataset views Games, handicap and set score and Head-to-head.
  • 0.5 — live matches included by default, and the prefilled input is today's and tomorrow's matches (live, finished and upcoming) — a run with no settings is the scoreboard of the day; closing lines checked against an independent source (see Verified data).
  • 0.4.12 — fix: WTA: all, Challenger: all and ITF …: all now include every tournament (the tour menu used before listed only the top few outside the ATP — WTA: all for 2025 returned 10 tournaments instead of 70); ATP: all also reaches past tournaments.
  • 0.4.9 — 3–7× faster (a Grand Slam edition in about 30 seconds): more parallel requests and 2 GB runs by default, at the same price; a response cut off mid-transfer is retried instead of skipping the match (about 1 match in 130 was lost before).
  • 0.4 — Live scores (server and points of the current game), current ATP/WTA rankings, tiebreak points per set, match end time, optional point-by-point (games, breaks, break/set/match points, tiebreak points); new Live scoreboard dataset view.
  • 0.3 — Tournament history mode: complete past editions of any tournament with opening/closing odds back to 2009, ATP: all, year ranges; season and qualification fields; Include qualifying option.
  • 0.2 — faster and cheaper runs (about 2× less CPU per request); the consensus counts each bookmaker brand once (brandCount); Max matches keeps the most important matches first; new tour option Other (exhibitions, juniors).
  • 0.1 — first release (free launch period): ATP, WTA, Challenger, ITF and team events; singles and doubles; opening/closing odds from up to 42 bookmakers; no-vig consensus and line movement; optional match statistics.