Tennis Results & Odds Scraper - ATP, WTA, Challenger, ITF
Pricing
from $0.95 / 1,000 match returneds
Tennis Results & Odds Scraper - ATP, WTA, Challenger, ITF
Every tennis match TennisExplorer lists for the days you pick: tour, level, tournament, surface, round, both players, set scores with tiebreaks, winner, retirements and average odds. Upcoming matches come with odds too. Filter by tour, level, tournament, player or surface.
Pricing
from $0.95 / 1,000 match returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Tennis Results & Odds Scraper
Pick a day, or a run of days, and get every tennis match TennisExplorer lists for it, one row per match: date and start time, tour, singles or doubles, level, tournament, surface, round, both players with their seeds, the score set by set with tiebreaks, the winner, how it ended, and the average odds. Days that haven't happened yet give the schedule, with odds and the head-to-head count.
It reads TennisExplorer's public pages. There's no key to get and nothing to log in to.
For scale: TennisExplorer lists 170 finished matches for Saturday 12 September 2026, from the US Open women's final down to ITF events in Egypt and Tunisia.
What it doesn't do
- No live scores. A match being played when the run reads its day is left out, and the status message counts them. Run it again once they're over.
- No point-by-point or serve stats. The odds are the match-winner market only.
- Men's ITF matches come without their tournament. TennisExplorer files all of them under one "Futures" heading, so their surface and round stay empty unless you turn on Match details, which fills both in.
- The schedule runs a day or two ahead, not more. On 13 September 2026 TennisExplorer had 183 matches for the next day, about 45 for the day after and none further out.
- Retirements are read from the score. TennisExplorer puts the winner first but doesn't write "retired" in its results. So a finished match whose last set stopped short is marked
retired, and one with no games at allwalkover. A player who pulls out between two sets of a best-of-five match reads as an ordinary win.
Input
Last days. The last few full days of results, ending yesterday. Set it to 1 on a daily schedule and each run brings in yesterday's matches.
Upcoming days. Today's matches plus the schedule after it. 1 is today only, 2 adds tomorrow.
From date, To date. A fixed range instead, written like 2026-09-01, up to 366 days per run. Leave To date empty and the run goes up to today.
Match types. Men's singles, men's doubles, women's singles, women's doubles. Empty means all four.
Levels. ATP and WTA tour events (Grand Slams included), Challenger, ITF, other lower-level events, and exhibitions. Challenger and ITF are known from the tournament's name, the rest from TennisExplorer's tour calendar.
Tournaments, Players. Part of a name as TennisExplorer writes it (US Open, Sinner), or a link to the tournament's or the player's TennisExplorer page. For players either side counts, doubles partners included. Accents and capitals don't matter.
Surfaces. Hard, clay, grass, indoors.
Average odds. On unless you turn it off.
Round. On unless you turn it off. It reads each tournament's page once, and the qualifying page when a match isn't in the main draw. Turning it off makes long ranges finish sooner.
Match details. Off unless you turn it on. It opens each match's own page and adds the players' full names, rankings, birth dates, height and playing hand, plus every bookmaker's price with its opening price. That's one more page per match, so a run with details stops at 2,000 matches.
Player countries. Off unless you turn it on. One page per player, read once per run.
Maximum matches. 1,000 unless you change it, up to 25,000 per run.
{"lastDays": 7,"matchTypes": ["atp-single"],"levels": ["challenger"],"surfaces": ["clay"],"maxMatches": 2000}
Output
One row per match, day by day, in the order TennisExplorer lists them.
| Field | Example | Notes |
|---|---|---|
matchId | 3321141 | TennisExplorer's id for the match |
date | 2026-09-12 | the day TennisExplorer puts the match on, in Prague time |
time | 22:15 | start time in Prague time, empty when TennisExplorer has none |
startTimeUtc | 2026-09-12T20:15:00Z | the same moment in UTC |
status | finished | or scheduled |
outcome | completed | retired, walkover, or empty on a match not played yet |
tour | WTA | ATP for men, WTA for women |
matchType | singles | or doubles |
level | tour | challenger, itf, other-lower, exhibition, or empty when unknown |
tournament | US Open | as TennisExplorer names it |
tournamentCountryCode | US | where the tournament is played |
surface | hard | clay, grass or indoors |
round | final | as TennisExplorer writes it, such as 1. round or Qualification - 2. round |
player1, player2 | Rybakina E., Sabalenka A. | in TennisExplorer's order, winner first on a finished match. A doubles team reads Latinovic S. / Poljicak M. |
player1Seed, player2Seed | 2, 1 | empty when unseeded |
winner | Rybakina E. | |
score | 6-4, 5-7, 6-2 | from player 1's side. A tiebreak shows the loser's points: 7-6(3) |
player1Sets, player2Sets | 2, 1 | TennisExplorer's sets column. On a retirement it counts the unfinished set for the winner |
sets | [{"player1":6,"player2":4,"tiebreak":null}, …] | games per set |
player1Odds, player2Odds | 2.26, 1.64 | the bookmakers' average. For a finished match, their last prices before it started |
player1H2H, player2H2H | 5, 0 | head-to-head wins, on scheduled matches |
player1Url, player2Url, tournamentUrl, url | the TennisExplorer pages |
With Match details on, each row also carries player1FullName, player1Rank, player1BirthDate, player1HeightCm and player1Plays, the same for player 2, bookmakerOdds (each bookmaker's price for both players and its opening price) and detailsRead. On a doubles match the full names cover both partners, and rank, birth date, height and hand stay empty, since one value can't describe two players. With Player countries on: player1Country and player2Country.
The run also leaves RUN_REPORT in its key-value store: what each day listed and returned, what was left out and why, and why the run stopped.
What you pay
Each match in your dataset is one charge. Nothing else costs anything: not a day with no matches, not a day TennisExplorer didn't answer, and not a match your filters left out or one still being played. With Match details on, a match whose own page couldn't be read comes back without the details and isn't charged. If you set a maximum charge for the run, it stops when that's reached, and every row you get has been paid for. The price is on the Pricing tab.
Limits
- 366 days and 25,000 matches per run, 2,000 with Match details on.
- The actor reads one page a second. A day is one page. Round adds one page per tournament, Match details one page per match, Player countries one page per player.
- The date is the one TennisExplorer gives the match, in Prague time. A match that starts at 00:30 in Prague sits on that new day, even when it was still the evening before where it was played.
- When TennisExplorer stops answering for a while, the actor waits two minutes and carries on. If a day still can't be read, the status names it and nothing is charged for it.
Where the data comes from
TennisExplorer, tennisexplorer.com. What you do with the data is up to you, and TennisExplorer's own terms of use apply to its content.
Questions
How do I get yesterday's results every morning? Schedule the actor with Last days set to 1.
How do I get tomorrow's matches with odds? Set Upcoming days to 2 for today's and tomorrow's schedule. Odds keep moving until a match starts, so run it close to when you need them.
Why is the round empty on some matches? Round is off, or it's a men's ITF match, or a UTR event (they come without rounds), or the tournament's pages didn't list that match. Match details fill in the round for any match that has one.