# Tennis Results, Odds & H2H Scraper (ATP, WTA, ITF) (`scrapers_lat/tennisexplorer-results-odds-scraper`) Actor

Scrape tennis match results with bookmaker odds, set scores, winners, player profiles (rank, hand, age, form) and head-to-head records for ATP, WTA, Challenger and ITF. Optional AI betting preview. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/tennisexplorer-results-odds-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.32 / 1,000 match result / records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![Tennis Results, Odds & H2H Scraper (ATP, WTA, ITF)](https://scrapers.lat/banners/tennisexplorer-results-odds-scraper.png)](https://apify.com/scrapers_lat/tennisexplorer-results-odds-scraper)

## Tennis Results, Odds & H2H Scraper (ATP, WTA, ITF)

Scrape tennis match results paired with bookmaker odds, set-by-set scores, winners, player profiles and head-to-head records across ATP, WTA, Challenger and ITF events. Built for betting models, form tracking, tipster analytics and match previews. HTTP based, no login, no cookies. Export to JSON, CSV or Excel.

**Input:** a date (or date range), a player, or two players for head-to-head. **Output:** one clean row per match with odds, plus optional player-profile enrichment and an optional AI betting preview.

Here is one real result from results mode, with the profile and AI add-ons enabled:

```json
{
  "source": "tennisexplorer",
  "date": "2026-08-15",
  "matchTime": "23:35",
  "tournamentName": "Cincinnati WTA",
  "tournamentUrl": "https://www.tennisexplorer.com/cincinnati-wta/2026/wta-women/",
  "tournamentCountry": "us",
  "tour": "wta",
  "category": "main",
  "isDoubles": false,
  "round": null,
  "surface": null,
  "player1": "Navarro E.",
  "player1Slug": "navarro-d5bcf",
  "player2": "Kalinina A.",
  "player2Slug": "kalinina",
  "score": "3-6, 6-4, 6-2",
  "setsWonPlayer1": 2,
  "setsWonPlayer2": 1,
  "winner": "Navarro E.",
  "odds1": 1.54,
  "odds2": 2.48,
  "matchDetailUrl": "https://www.tennisexplorer.com/match-detail/?id=3294647",
  "player1Rank": 28,
  "player1Hand": "right",
  "player1Age": 25,
  "player1Country": "USA",
  "player1YearWins": 21,
  "player1YearLosses": 18,
  "player2Rank": 54,
  "player2Hand": "right",
  "player2Age": 29,
  "player2Country": "Ukraine",
  "player2YearWins": 39,
  "player2YearLosses": 18,
  "aiFavorite": "Navarro E.",
  "aiFormNote": "Navarro came back to win after dropping the first set.",
  "aiValueAngle": "Odds favor Navarro, but the match was competitive, hinting at value on Kalinina.",
  "aiConfidence": "medium",
  "observedAt": "2026-08-17T00:26:15.397Z",
  "error": null
}
```

### What you get

- **Match results with odds** grouped by tournament: players, slugs, set-by-set score, sets won, winner, decimal bookmaker odds for each side, match time and match-detail link.
- **Player profiles** (player mode, or as a results add-on): name, country, current and highest singles rank, hand, height, weight, age, birth date, current-year wins and losses, plus recent matches with surface, round, score and odds.
- **Head-to-head records** (h2h mode): the overall win-loss balance between two players and the full list of past meetings with year, tournament, surface, round, score and winner.
- **AI betting preview** (optional add-on): a short informational read on each match (favorite, form note, value angle, confidence).
- Covers ATP, WTA, Challenger and ITF singles. Empty runs return zero billable rows.

### Modes and inputs

| Input | Applies to | Description |
|-------|-----------|-------------|
| `mode` | all | `results` (default), `player`, or `h2h`. |
| `date` | results | Single day `YYYY-MM-DD`. Defaults to today. |
| `dateFrom` / `dateTo` | results | Optional date range (up to 60 days). |
| `tour` | results | `all`, `atp` (men) or `wta` (women). |
| `tournament` | results | Keep only matches whose tournament name contains this text. |
| `player` | player, h2h | Player slug or name (e.g. `djokovic`). |
| `opponent` | h2h | Second player slug or name (e.g. `nadal`). |
| `includePlayerProfiles` | results | Attach rank, hand, age, country and year W/L per match (paid add-on). |
| `withAiPreview` | results | Add an AI betting/form preview per match (paid AI add-on). |
| `maxResults` | results | Max match rows to return. Free accounts are capped at 10. |

### Output fields (results mode)

| Field | Description |
|-------|-------------|
| `date`, `matchTime` | Match date and start time. |
| `tournamentName`, `tour`, `category` | Event name, ATP/WTA, and main/challenger/itf. |
| `player1`, `player2` (+ `*Slug`, `*Url`) | The two players. |
| `score`, `setsWonPlayer1/2`, `winner` | Set-by-set score, sets won, winner. |
| `odds1`, `odds2` | Decimal bookmaker odds per player (null when unavailable). |
| `matchDetailUrl` | Link to the match detail page. |
| `player1Rank`, `player1Hand`, `player1Age`, `player1Country`, `player1YearWins/Losses` (and player2) | Profile enrichment when `includePlayerProfiles` is on. |
| `aiFavorite`, `aiFormNote`, `aiValueAngle`, `aiConfidence` | AI preview when `withAiPreview` is on. |
| `observedAt`, `error` | Capture timestamp and error (null on success). |

### Use cases

- **Tennis betting models:** train and backtest on results plus closing decimal odds for both players across ATP, WTA, Challenger and ITF.
- **Odds and value tracking:** pull daily match odds to spot favorites, underdogs and value angles.
- **Form and results tracking:** monitor ATP and WTA results by date or date range, filtered by tour or tournament.
- **Player scouting:** grab a player profile with rank, hand, age and current-year win-loss plus recent matches.
- **Head-to-head research:** get the H2H balance and every past meeting between any two players for match previews.
- **Analytics and dashboards:** feed clean, flat rows into notebooks, spreadsheets or BI tools.

### Billing

Pay per event, and you are never charged for a failed or empty run.

- **`result` ($0.008):** one match result with odds (results mode), one player profile (player mode), or one head-to-head record (h2h mode). Primary event.
- **`player_profiles` ($0.008):** charged per match only when both players' profiles are fetched and attached (opt in with `includePlayerProfiles`). This performs genuine extra requests.
- **`ai_preview` ($0.012):** charged per match only when the AI returns a usable preview (opt in with `withAiPreview`). Paid add-ons are disabled for free accounts.

The AI preview is informational only and is not betting advice. Bet responsibly and within your local laws.

### Notes

- This actor scrapes public tennis data and is not affiliated with or endorsed by any tennis governing body, tournament, or the site it reads.

# Actor input Schema

## `mode` (type: `string`):

What to scrape: match results with odds, a player profile, or a head-to-head record.

## `date` (type: `string`):

Single day to fetch in results mode, format YYYY-MM-DD. Defaults to today when empty.

## `dateFrom` (type: `string`):

Start of a date range (YYYY-MM-DD) for results mode. Overrides the single date. Max 60 days.

## `dateTo` (type: `string`):

End of a date range (YYYY-MM-DD) for results mode.

## `tour` (type: `string`):

Limit results to ATP (men) or WTA (women), or all.

## `tournament` (type: `string`):

Only keep matches whose tournament name contains this text (case-insensitive). Optional.

## `player` (type: `string`):

Player slug or name for player mode, or the first player in h2h mode. Example: djokovic

## `opponent` (type: `string`):

Second player slug or name for head-to-head mode. Example: nadal

## `includePlayerProfiles` (type: `boolean`):

Results mode only. Fetch each match player's profile and attach rank, hand, age, country and current-year W/L. Billed per match only when profiles are fetched. Disabled for free accounts.

## `withAiPreview` (type: `boolean`):

Results mode only. Generate an informational AI preview (favorite, form note, value angle, confidence) per match from the odds and players. Not betting advice. Disabled for free accounts.

## `maxResults` (type: `integer`):

Maximum number of match records to return (results mode). Free accounts are capped at 10.

## Actor input object example

```json
{
  "mode": "results",
  "date": "2026-08-15",
  "tour": "all",
  "player": "djokovic",
  "includePlayerProfiles": false,
  "withAiPreview": false,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "date": "2026-08-15",
    "player": "djokovic",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/tennisexplorer-results-odds-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "date": "2026-08-15",
    "player": "djokovic",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/tennisexplorer-results-odds-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "date": "2026-08-15",
  "player": "djokovic",
  "maxResults": 50
}' |
apify call scrapers_lat/tennisexplorer-results-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/tennisexplorer-results-odds-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kHryqWPyvGeDzgfuI/builds/hjPrKTEgtWpxnt6Fi/openapi.json
