Tennis Scraper: Odds History & Player Results avatar

Tennis Scraper: Odds History & Player Results

Pricing

from $0.70 / 1,000 match result or bookmaker odds rows

Go to Apify Store
Tennis Scraper: Odds History & Player Results

Tennis Scraper: Odds History & Player Results

Export tennis player-season results and bookmaker opening and last quoted match-winner odds as flat rows. ATP and WTA singles. $1 per 1,000 rows + $0.001/run, usage included. Paste TennisExplorer players or match links.

Pricing

from $0.70 / 1,000 match result or bookmaker odds rows

Rating

0.0

(0)

Developer

Tagada Data

Tagada Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Export a tennis player's season results and each bookmaker's opening and last quoted match-winner odds as flat rows. Build a player-history dataset, compare bookmakers or prepare a backtest without copying tables by hand.

This actor reads public TennisExplorer pages. It covers singles season results and the Home/Away market. Odds history means the opening and last published quote, where available. It does not export every intermediate price change.

$1 per 1,000 delivered rows + $0.001 per run, with usage included. No login or API key for the source.

Start with a player and season

{
"players": ["djokovic"],
"seasons": ["2024"],
"resultType": "both",
"maxResults": 20
}

The prefilled example uses an archived season so it also works when no tennis is live. A result row contains a match; an odds row contains one bookmaker's prices for both players in that match. With both, a match can therefore produce several billed rows. maxResults is the combined row cap.

For season results without bookmaker detail pages:

{
"players": ["djokovic", "swiatek"],
"seasons": ["2023", "2024"],
"resultType": "results",
"maxResults": 200
}

For a specific match and bookmaker:

{
"matchIds": ["https://www.tennisexplorer.com/match-detail/?id=3337719"],
"resultType": "odds",
"bookmakers": ["bet365"],
"maxResults": 10
}

Inputs

FieldWhat it changes
playersTennisExplorer player slugs or /player/ links. Get the slug from the player's page. Optional when matchIds is supplied.
seasonsYears for each player. Omitted means the current UTC year. The form example selects 2024. URL query parameters do not override this field.
matchIdsNumeric TennisExplorer IDs or /match-detail/?id= links, instead of or alongside players. IDs from other tennis sites do not work.
resultTyperesults, odds or both (default).
bookmakersOptional exact names, case insensitive. Applies to odds rows. Leave empty for all available bookmakers.
maxResultsCombined dataset row cap, default 100 through the API and 20 in the form example. Maximum 5,000.

Limits per run: 20 players, 10 seasons, 50 player-season pages and 200 unique match detail pages. If a limit or the run clock cuts collection short, the status says what stopped and the run summary identifies skipped sources. Split larger archives into more runs. Season tables contain all available results on one page; a page number does not unlock more results.

An odds-only run with a bookmaker filter stops after 10 consecutive matches with no matching bookmaker rows. NO_YIELD_LIMIT names that stop; it does not claim that later matches have no prices.

Run time

The launch test collecting 100 Pinnacle rows took about 3 minutes 35 seconds at the default 512 MiB. It read two season pages and 103 match pages. Requests run one at a time with no fixed delay after a successful response. Reading and parsing each match page dominates this narrow-bookmaker case; a 100-row cap can require many fewer matches when all bookmakers are included. Source response time and the selected history affect duration.

Results-only collection is much shorter in these checks: 250 Djokovic and Swiatek result rows from four season pages took 3.7 seconds. Use results when you need season outcomes without bookmaker detail rows.

Output

All fields are scalar values, ready for CSV, Excel or JSON export. matchId joins result and odds rows. Repeated matches and bookmaker rows are deduplicated within a run. When requested players share a match, the result is delivered once; requestedPlayer identifies the first player source that supplied it.

Row typeFields
resultMatch ID and URL, requested player and season, players and slugs, tournament, round, surface, source date text, score, and the season table's unattributed H/A odds when present.
oddsMatch ID and URL, players, tournament, score, bookmaker, market, both last quoted prices, both opening prices and their published time labels.

An excerpt from the public match used in the example:

{
"type": "odds",
"matchId": "3337719",
"bookmaker": "bet365",
"market": "Home/Away",
"homePlayer": "Djokovic Novak",
"awayPlayer": "Yunchaokete Bu",
"homeOpeningOdds": "1.33",
"awayOpeningOdds": "3.40",
"homeOdds": "1.25",
"awayOdds": "4.00",
"homeOpeningTimeRaw": "30.09. 15:19",
"homeLastChangeTimeRaw": "02.10. 09:39"
}

Prices remain strings in the source's format. Missing opening prices and times remain null; the current price is never invented as the opening price. homeListedOdds and awayListedOdds on a season result are the table's H/A columns, with no bookmaker attribution.

homeDeactivated and awayDeactivated preserve the source's disabled-quote flags. Those historical prices remain in the export and are not represented as available offers.

matchDateRaw and quote times preserve the site's labels. Quote labels omit a year and timezone, so they are not converted into timestamps. A season can include matches played in December of the preceding year. Player names and score order follow the source, and superscript tiebreak points appear in parentheses. Do not infer the winner from row order. Detail-page names can be longer than season-table names.

Pricing

Apify planPer 1,000 delivered rows
Free$1.00
Bronze$0.90
Silver$0.80
Gold$0.70

The result event charges once per delivered result or bookmaker row. An odds row includes both players' prices. The actor-start event charges $0.001 once per run, including invalid, unavailable and zero-result runs. Usage is included; there is no extra detail surcharge. Skipped and unavailable records have no result charge.

At the Free rate, 20 rows cost $0.021 including the start, and 1,000 rows cost $1.001. Set maxResults and the run's charge limit to control spend. Different actors bill different units: compare a bookmaker row with a bookmaker row, rather than a complete nested match record.

Coverage and run status

  • Historical coverage depends on TennisExplorer. Singles may include qualifying, lower-level and exhibition matches that appear on the player's season page. Doubles, live-score polling, ranking history, point-by-point data, other odds markets and full odds movement are outside this version.
  • Last quoted is not guaranteed pre-match closing odds. A published quote can be stale or recorded after a match started. This actor does not label it as an independently verified closing line.
  • Bookmaker availability differs by match and year. No result is padded with a fabricated bookmaker or price.
  • All-invalid input fails BAD_INPUT. Missing players and matches fail NOT_FOUND when nothing is delivered. An unavailable season without a result container fails with SEASON_UNRESOLVED in the status detail. A bookmaker filter matching no delivered rows fails FILTERED_OUT.
  • An unrecognized page, refusal, unresolved request or exhausted clock with nothing delivered fails by name. A successful zero run requires the origin's explicit no-results proof and charges only the start event. Real empty archive cases have not been platform-verified at launch.
  • A partial run can succeed with delivered rows. Check its status and the RUN_SUMMARY record for caps, failures and skipped sources. Repeated runs return fresh snapshots; this version has no persistent only-new mode.

Use the Dataset tab to export rows or retrieve them with the Apify API. Schedule repeated snapshots when you want to compare changes over time. Public odds are source observations, not betting advice or a guarantee of an executable price.

For daily live/finished/scheduled scores and set statistics, use Tennis Live Scores. This actor serves player-season research and bookmaker-price comparisons.

Independent tool, not affiliated with TennisExplorer, its data providers or bookmakers. For support, open an issue with the run ID and input, without credentials.