# TennisExplorer: ATP results with closing odds

**Use case:** 

One row per match: the tournament, both players with their pages and seeds, the set-by-set score with tiebreak points, the winner, and the decimal prices where the site prints them. Finished matches are printed winner-first, and every row says so in playerOrder so a model is never fed the answer. Days with no play are returned with the reason and are not charged.

## Input

```json
{
  "searchUrl": "",
  "section": "results",
  "tour": "atp-single",
  "dateFrom": "",
  "dateTo": "",
  "maxDays": 0,
  "maxMatches": 100,
  "monitoringMode": false,
  "resetMonitoringState": false,
  "players": [],
  "tournaments": [],
  "matchTypes": [],
  "keywords": [],
  "keywordMatch": "any",
  "excludeKeywords": [],
  "minOdds": 0,
  "maxOdds": 0,
  "requireOdds": true,
  "onlyCompleted": false,
  "onlyUpcoming": false,
  "useProxy": false
}
```

## Output

```json
{
  "matchId": {
    "label": "Match Id",
    "format": "string"
  },
  "date": {
    "label": "Date",
    "format": "string"
  },
  "tournament": {
    "label": "Tournament",
    "format": "string"
  },
  "player1Name": {
    "label": "Player1 Name",
    "format": "string"
  },
  "player2Name": {
    "label": "Player2 Name",
    "format": "string"
  },
  "scoreText": {
    "label": "Score Text",
    "format": "string"
  },
  "winnerName": {
    "label": "Winner Name",
    "format": "string"
  },
  "player1Odds": {
    "label": "Player1 Odds",
    "format": "string"
  },
  "player2Odds": {
    "label": "Player2 Odds",
    "format": "string"
  },
  "source": {
    "label": "Source",
    "format": "string"
  },
  "status": {
    "label": "Status",
    "format": "string"
  },
  "matchUrl": {
    "label": "Match Url",
    "format": "string"
  },
  "rowId": {
    "label": "Row Id",
    "format": "string"
  },
  "searchedTour": {
    "label": "Searched Tour",
    "format": "string"
  },
  "section": {
    "label": "Section",
    "format": "string"
  },
  "startTimeLocal": {
    "label": "Start Time Local",
    "format": "string"
  },
  "tournamentUrl": {
    "label": "Tournament Url",
    "format": "string"
  },
  "matchType": {
    "label": "Match Type",
    "format": "string"
  },
  "player1Display": {
    "label": "Player1 Display",
    "format": "string"
  },
  "player1Slug": {
    "label": "Player1 Slug",
    "format": "string"
  },
  "player1Url": {
    "label": "Player1 Url",
    "format": "string"
  },
  "player1Seed": {
    "label": "Player1 Seed",
    "format": "string"
  },
  "player2Display": {
    "label": "Player2 Display",
    "format": "string"
  },
  "player2Slug": {
    "label": "Player2 Slug",
    "format": "string"
  },
  "player2Url": {
    "label": "Player2 Url",
    "format": "string"
  },
  "player2Seed": {
    "label": "Player2 Seed",
    "format": "string"
  },
  "isCompleted": {
    "label": "Is Completed",
    "format": "string"
  },
  "playerOrder": {
    "label": "Player Order",
    "format": "string"
  },
  "winner": {
    "label": "Winner",
    "format": "string"
  },
  "player1SetsWon": {
    "label": "Player1 Sets Won",
    "format": "string"
  },
  "player2SetsWon": {
    "label": "Player2 Sets Won",
    "format": "string"
  },
  "sets": {
    "label": "Sets",
    "format": "string"
  },
  "resultRaw": {
    "label": "Result Raw",
    "format": "string"
  },
  "oddsText": {
    "label": "Odds Text",
    "format": "string"
  },
  "headToHead": {
    "label": "Head To Head",
    "format": "string"
  },
  "scrapedAt": {
    "label": "Scraped At",
    "format": "string"
  },
  "searchUrl": {
    "label": "Search Url",
    "format": "string"
  },
  "note": {
    "label": "Note",
    "format": "string"
  },
  "matchesRead": {
    "label": "Matches Read",
    "format": "string"
  }
}
```

## About this Actor

This example demonstrates how to use [TennisExplorer Scraper & New-Result Monitor - Odds & Scores](https://apify.com/neverempty/tennisexplorer-scraper.md) with a specific input configuration. Visit the [Actor detail page](https://apify.com/neverempty/tennisexplorer-scraper.md) to learn more, explore other use cases, and run it yourself.


## 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.
This Task's input is already configured above — use it as-is rather than inventing a new one.

- **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 full API examples (JavaScript, Python, CLI, MCP, OpenAPI), see this Task's Actor page: https://apify.com/neverempty/tennisexplorer-scraper.md

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