# Tennis Odds API & Results: Live Scores, Closing Odds Export (`s_actors/tennis-results-odds`) Actor

Every ATP, WTA, Challenger and ITF match of the last 7 and next 7 days: set scores, tiebreaks, live score, opening and closing odds of several bookmakers, best and average odds, no-vig probability, favourite won, total games and handicap lines, match stats. No login.

- **URL**: https://apify.com/s_actors/tennis-results-odds.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Sports, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 matches

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Tennis Odds API & Results: Live Scores, Closing Odds Export

Export **every tennis match** of the last 7 days and the next 7 days with **set scores, tiebreaks and the live score**, plus the **opening and closing odds of several bookmakers** on every row: best and average odds, **no-vig win probability**, the favourite and **whether the favourite won**. ATP, WTA, Challenger, ITF, Davis Cup and Billie Jean King Cup, singles and doubles. Optional **total games and handicap lines** and **match statistics** (aces, double faults, serve and return points, break points, winners, unforced errors). No account, no API key, no browser.

```json
{ "daysBack": 1, "tours": ["atp", "wta"], "discipline": "singles", "bookmakers": ["1xBet", "Interwetten", "bwin"] }
```

**$0.99 per 1,000 matches, odds included.** Filter by tour, singles or doubles, status, player and tournament; filtered-out matches are free. Schedule it with **Only new or changed matches** for a results feed that brings each match again only when it starts, finishes a set or ends.

#### What you get

Real example, ATP singles of 24 October 2026, odds of 1xBet (opening and closing), win probability of player 1 from the average of 1xBet, Interwetten and bwin:

| tournament | player 1 | player 2 | score | winner | opening | closing | win prob. 1 | favourite won |
|---|---|---|---|---|---|---|---|---|
| Almaty | Basilashvili N. | Tsitsipas S. | 6-4, 6-7(5), 6-3 | Basilashvili N. | 2.83 / 1.45 | 2.78 / 1.46 | 34% | no |
| Lyon | Cobolli F. | Musetti L. | 6-4, 2-6, 5-7 | Musetti L. | 2.40 / 1.57 | 1.74 / 2.12 | 55% | no |
| Lyon | Paul T. | Fritz T. | 3-6, 5-7 | Fritz T. | 2.19 / 1.57 | 2.48 / 1.54 | 38% | yes |
| Brussels | Fils A. | Struff J-L. | 4-6, 7-6(7), 6-7(5) | Struff J-L. | 1.10 / 5.49 | 1.20 / 4.53 | 79% | no |
| Vienna | Marozsan F. | Sorger S. | 3-6, 6-4, 6-4 | Marozsan F. | 1.09 / 6.00 | 1.15 / 5.52 | 81% | yes |

With **Total games and handicap lines** and **Match statistics** on (Almaty, 22 October):

| match | score | duration | aces | double faults | 1st serve % | break points won | winners / unforced errors |
|---|---|---|---|---|---|---|---|
| Medvedev D. v Shimabukuro S. | 6-2, 6-1 | 0:52 | 7 / 1 | 1 / 4 | 79 / 70 | 5 of 10 / 0 of 3 | 20 / 10 v 9 / 21 |

| match | total games line | over | under | games handicap (player 1) | odds 1 | odds 2 |
|---|---|---|---|---|---|---|
| Li A. v Tagger L. (WTA) | 22.0 | 1.86 | 1.86 | -2.5 | 1.90 | 1.90 |
| Wong C. v Hara Friend J. D. (Challenger) | 22.5 | 1.83 | 1.85 | -3.0 | 1.89 | 1.77 |

| Field | Description |
|---|---|
| `matchId`, `matchUrl`, `startTime`, `date` | The match on Flashscore and its start (UTC) |
| `status`, `statusCode`, `currentSet` | scheduled, live, finished, retired, walkover, cancelled, postponed, interrupted, abandoned, awarded; the set being played |
| `tournament`, `tournamentCity`, `tournamentCountry`, `category`, `tour`, `gender`, `discipline` | Tournament and its tour (atp, wta, challenger, itf, teams, exhibition, juniors), men / women / mixed, singles / doubles |
| `surface`, `indoor`, `qualification`, `tournamentUrl` | hard, clay, grass; indoor; qualifying draw |
| `homePlayer`, `awayPlayer`, `homeCountry`, `awayCountry`, `homePlayerIds`, `awayPlayerIds`, `homePlayerUrl`, `awayPlayerUrl` | Both players (doubles: both pairs) with countries and Flashscore ids |
| `score`, `setsHome`, `setsAway`, `winner`, `winnerName`, `resultNote` | "6-4, 6-7(5), 6-3", sets won, the winner (home / away), notes like "withdrawn" |
| `sets`, `set1Home` ... `set5Away` | Games of each set, with tiebreak points in `sets` |
| `liveGameHome`, `liveGameAway`, `serving` | Live matches: points in the current game (0, 15, 30, 40, A) and who serves |
| `odds` | Each bookmaker: `home`, `away` (closing once the match started) and `openingHome`, `openingAway` |
| `oddsBookmaker`, `oddsHome`, `oddsAway`, `openingOddsHome`, `openingOddsAway` | The first bookmaker of your list that priced the match |
| `bestOddsHome`, `bestOddsAway`, `averageOddsHome`, `averageOddsAway` | Best and average price over your bookmakers |
| `probabilityHome`, `probabilityAway` | Win probability from the average odds with the bookmaker margin removed |
| `favorite`, `favoriteWon`, `oddsMoveHomePct` | The favourite of the market, whether it won, how much the price of player 1 moved from opening to closing |
| `totalGamesLine`, `overOdds`, `underOdds`, `gamesHandicapHome`, `handicapHomeOdds`, `handicapAwayOdds`, `linesBookmaker` | With **Total games and handicap lines**: the main line of each market (the one with the most even prices) |
| `acesHome` ... `totalGamesWonAway`, `stats`, `duration`, `setDurations` | With **Match statistics**: aces, double faults, 1st serve %, 1st / 2nd serve and return points won, break points saved and converted, winners, unforced errors, net points, service / return / total points and games won; the full table as text in `stats` |
| `lastUpdate`, `scrapedAt` | Last change of the match on Flashscore, run time |

#### How it works

1. Choose the days: **Days back** (0 = today only, up to 7) and **Days ahead** (fixtures, up to 7)
2. Optionally narrow it: **Tours** (ATP, WTA, Challenger, ITF, team cups...), **Singles or doubles**, **Match status**, **Players** (`Sinner`, `Swiatek`), **Tournaments** (`Paris`, `W35`)
3. Pick the **Bookmakers** (1xBet, Interwetten, bwin, Unibet, William Hill, bet365, Betfred, Betway, Betano and 18 more) and turn on **Total games and handicap lines** or **Match statistics** if you need them
4. Run and download as CSV, Excel, JSON or HTML. Four tabs: **Matches**, **Odds**, **Statistics**, **Live**

A full day of all tours is ~300-500 matches; ATP and WTA singles are ~40-80 a day.

#### Why this Actor

| | |
|---|---|
| 💰 **Odds in the match price** | Opening and closing odds of up to 8 bookmakers, best, average and no-vig probability at **$0.99 per 1,000 matches**, no extra charge for odds, totals or handicaps |
| 📈 **Built for betting models** | Closing line, opening line, the move between them, favourite won, total games and games handicap: ready to backtest a model or check closing line value |
| 🎾 **Every match of every tour** | ATP, WTA, Challenger, ITF, team cups, singles and doubles; 1xBet, Interwetten and bwin price ~9 of 10 ATP and WTA matches and ~8 of 10 of all tours |
| 🔴 **Live and scheduled too** | The live score with the point score of the current game and the server; fixtures of the next 7 days with current odds |
| 📊 **Match statistics on demand** | Aces, double faults, serve and return points, break points, winners and unforced errors when you ask for them, $1.99 per 1,000 matches that have them |
| 🔔 **Results feed** | **Only new or changed matches** returns a match only when it is new, starts, finishes a set or ends |
| ⚡ **Fast** | Two days of all tours (~330 matches) with odds of three bookmakers take ~20 seconds |

#### Collect tennis results and closing odds every day

1. Set **Days back** to 1, pick your tours and bookmakers
2. Save as a task and schedule it every morning
3. Each run gives yesterday's results with closing odds: send them to [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) or your database with an integration. For a live feed, schedule it every 15-60 minutes with **Days back** 0 and **Only new or changed matches**

The memory of output matches is kept in your account (key-value store `tennis-results-odds-state`). Use a different **Monitor name** for each task.

#### Pricing

Pay per match in the results, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Match (one row, odds, totals and handicaps included) | $0.00099 | $0.000891 | $0.000792 |
| Match statistics (only with Match statistics on, only for matches that have them) | $0.00199 | $0.00179 | $0.00159 |

| Task | Cost |
|---|---|
| Yesterday's ATP and WTA singles with closing odds (~80 matches) | ~$0.08 |
| All tours, last 7 days, with odds (~2,400 matches) | ~$2.40 |
| The same with match statistics (~700 matches have them) | ~$3.80 |
| Daily results of ATP and WTA singles for a month (~1,800 matches) | ~$1.81 per month |

Matches left out by your filters or by **Only new or changed matches** are not charged.

#### FAQ

**Where does the data come from?** From Flashscore, the same scores and odds any visitor sees, without logging in. The odds are the prices bookmakers show on Flashscore at the time of the run.

**Are these closing odds?** For matches that started or finished, the current price is the last pre-match price (the closing line); `openingHome` / `openingAway` is the first price the bookmaker offered. For scheduled matches it is the price now: run again closer to the start for a later line.

**Why are some matches without odds?** Not every bookmaker prices every ITF or doubles match. Add more bookmakers: the row takes the first one that has odds, and best / average use all of them. Walkovers and cancelled matches have no odds. bet365 hides its odds of finished matches, so it suits scheduled matches only.

**How far back does it go?** 7 days back and 7 days ahead, the window Flashscore keeps for its daily lists. Schedule a daily run to build your own history.

**How are dates counted?** UTC days. `startTime` is in UTC.

**Do I need a Flashscore account or an API key?** No.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client as your tennis odds API and tennis results API, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Which ATP favourites lost yesterday, and how much did their odds move before the match?"

#### Other sports & data tools

| Tool | What it does |
|---|---|
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the matches and odds to a Google Sheet |

#### Is it legal?

The Actor reads only public data that Flashscore shows to any visitor, without logging in. Scores and odds are facts; respect Flashscore's terms when you republish the data, and the betting rules of your country when you use the odds. The Actor is not affiliated with Flashscore or any bookmaker.

# Actor input Schema

## `daysBack` (type: `integer`):

Past days to include: 0 = today only, 1 = yesterday and today, up to 7. Finished matches come with their closing odds.

## `daysAhead` (type: `integer`):

Coming days to include (fixtures with current odds): 0 = none, up to 7. Days are UTC days.

## `tours` (type: `array`):

Only these tours. Empty = all (ATP, WTA, Challenger, ITF, team cups, exhibitions, juniors). Grand Slams are under ATP and WTA.

## `discipline` (type: `string`):

Singles, doubles (mixed too) or both.

## `statuses` (type: `array`):

Only matches with these statuses. Empty = all. Finished includes retirements, walkovers and awarded matches; cancelled includes postponed, interrupted and abandoned.

## `players` (type: `array`):

Only matches of these players: surname ("Sinner", "Swiatek") or as Flashscore writes it ("Medvedev D."). Whole words, accents ignored.

## `tournaments` (type: `array`):

Only tournaments whose name contains one of these: "Paris", "Vienna", "Australian Open", "W35".

## `maxMatches` (type: `integer`):

The run stops at this many matches (a busy day has ~500 matches of all tours).

## `includeOdds` (type: `boolean`):

Opening and current odds of each bookmaker below (closing odds once the match started), best and average odds, no-vig probability, favourite and whether the favourite won. Included in the match price.

## `bookmakers` (type: `array`):

Odds of these bookmakers, in this order (the first one with odds fills oddsHome / oddsAway). 1xBet, Interwetten and bwin price ~9 of 10 ATP and WTA matches; bet365 hides its odds of finished matches. Up to 8.

## `includeTotalsAndHandicaps` (type: `boolean`):

Main over/under total games line and main games handicap with their odds (first bookmaker that has them). Included in the match price; the run takes longer.

## `includeStats` (type: `boolean`):

Aces, double faults, 1st serve %, serve and return points won, break points, winners, unforced errors, games won and match duration of finished and live matches. Charged per match that has statistics (ATP, WTA, Challenger; most ITF matches have none).

## `onlyChanged` (type: `boolean`):

Output only matches that are new, changed status (started, finished, cancelled) or finished a set since the previous run (same monitor name). Schedule it every 15-60 minutes for a live results feed.

## `monitorName` (type: `string`):

Keeps the memory of output matches apart for different schedules.

## `debugLog` (type: `boolean`):

Log every request retry.

## Actor input object example

```json
{
  "daysBack": 1,
  "daysAhead": 0,
  "tours": [
    "atp",
    "wta"
  ],
  "discipline": "singles",
  "maxMatches": 2000,
  "includeOdds": true,
  "bookmakers": [
    "1xBet",
    "Interwetten",
    "bwin"
  ],
  "includeTotalsAndHandicaps": false,
  "includeStats": false,
  "onlyChanged": false,
  "debugLog": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Every match: start, status, tournament, players, score, winner, odds.

## `odds` (type: `string`):

Opening and closing odds, best and average odds, probability, favourite won.

## `all` (type: `string`):

Every field: sets with tiebreaks, odds of each bookmaker, lines, statistics.

# 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 = {
    "daysBack": 1,
    "tours": [
        "atp",
        "wta"
    ],
    "discipline": "singles",
    "bookmakers": [
        "1xBet",
        "Interwetten",
        "bwin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/tennis-results-odds").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 = {
    "daysBack": 1,
    "tours": [
        "atp",
        "wta",
    ],
    "discipline": "singles",
    "bookmakers": [
        "1xBet",
        "Interwetten",
        "bwin",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/tennis-results-odds").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 '{
  "daysBack": 1,
  "tours": [
    "atp",
    "wta"
  ],
  "discipline": "singles",
  "bookmakers": [
    "1xBet",
    "Interwetten",
    "bwin"
  ]
}' |
apify call s_actors/tennis-results-odds --silent --output-dataset

```

## MCP server setup

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

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/ejhw50mjDcdg9F3Gh/builds/TomXChQgeOP9wcgFj/openapi.json
