{
  "openapi": "3.0.1",
  "info": {
    "title": "TennisExplorer Scraper & New-Result Monitor - Odds & Scores",
    "description": "Turn monitoring on and every later run returns only the matches it has not returned before, so you are never charged for the same match twice. Every TennisExplorer match as clean JSON: set-by-set scores with tiebreaks, decimal odds for both sides, seeds, singles and doubles, ATP and WTA. Unofficial.",
    "version": "0.1",
    "x-build-id": "S0n0wXHXSeNL9u01S"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~tennisexplorer-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-tennisexplorer-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/neverempty~tennisexplorer-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-tennisexplorer-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/neverempty~tennisexplorer-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-tennisexplorer-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchUrl": {
            "title": "TennisExplorer day URL (optional)",
            "type": "string",
            "description": "Paste a TennisExplorer day page, e.g. https://www.tennisexplorer.com/results/?type=atp-single&year=2026&month=09&day=05 . When set, it wins: the section, tour and day in the URL are used as they are and the fields below are ignored. TennisExplorer answers HTTP 200 and quietly redirects to today when the day does not exist, so the day is checked before it is requested."
          },
          "section": {
            "title": "Results or scheduled matches",
            "enum": [
              "results",
              "matches"
            ],
            "type": "string",
            "description": "results = finished matches with scores and odds. matches = the day's card, which mixes matches not started yet with ones already finished.",
            "default": "results"
          },
          "tour": {
            "title": "Tour",
            "enum": [
              "all",
              "atp-single",
              "atp-double",
              "wta-single",
              "wta-double"
            ],
            "type": "string",
            "description": "Which table to read. On 2026-09-05 all = 224 matches = atp-single 89 + atp-double 39 + wta-single 72 + wta-double 24, so all also includes Challenger and ITF events. TennisExplorer does not reject an unknown value - it silently returns every match of the day - so only these five are accepted.",
            "default": "all"
          },
          "dateFrom": {
            "title": "First day (YYYY-MM-DD)",
            "type": "string",
            "description": "First day to read. Empty = yesterday for results, today for scheduled matches. There is no pagination on TennisExplorer: one day is one page, so a range is read one day at a time, newest first."
          },
          "dateTo": {
            "title": "Last day (YYYY-MM-DD)",
            "type": "string",
            "description": "Last day to read. Empty = same as the first day. Days in the future have no results yet and come back as an empty-day row that is not charged."
          },
          "maxDays": {
            "title": "Maximum days to read",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Hard cap on how many days are requested, counted from the newest. 0 = read the whole range. Monitoring runs with no dates set use 3. Reading a day is free; only returned matches are charged.",
            "default": 0
          },
          "maxMatches": {
            "title": "Maximum matches to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many matches to return. You are charged for the rows you actually receive. A busy day carries roughly 200-350 matches across all tours.",
            "default": 50
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only matches I have not seen",
            "type": "boolean",
            "description": "Off = return the matches of the days you asked for. On = remember every match id already returned and, on later runs, return only the ones that are new, so the same match is never charged twice. The first run returns everything and remembers it. Ids are kept per section and tour.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clear the remembered match ids before this run, so everything counts as new again. Use it after changing what you follow.",
            "default": false
          },
          "players": {
            "title": "Only these players",
            "type": "array",
            "description": "Keep a match only if one of these appears in either side's name or slug (case-insensitive, partial). Example: djokovic, swiatek. Doubles teams are matched on the team name too.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tournaments": {
            "title": "Only these tournaments",
            "type": "array",
            "description": "Keep a match only if the tournament name contains one of these (case-insensitive, partial). Example: US Open, Challenger.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "matchTypes": {
            "title": "Singles or doubles",
            "type": "array",
            "description": "Keep only singles or only doubles. Empty = both. Doubles are teams on TennisExplorer and have a team page rather than a player page.",
            "items": {
              "type": "string",
              "enum": [
                "single",
                "double"
              ],
              "enumTitles": [
                "Singles",
                "Doubles"
              ]
            },
            "default": []
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep a match only if one (Any) or all (All) of these appear in the tournament name, either player's name or the score.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Any = at least one keyword. All = every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop a match if any of these appear in the same fields.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minOdds": {
            "title": "Minimum decimal odds",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Keep a match only if at least one side is quoted at or above this. 0 = no limit. Odds are decimal (1.03 to 7.07 on 2026-09-05, median 1.56) and are present on about 95% of matches; a match with no odds is never dropped by this filter because the value is unknown, not low.",
            "default": 0
          },
          "maxOdds": {
            "title": "Maximum decimal odds",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Keep a match only if at least one side is quoted at or below this. 0 = no limit.",
            "default": 0
          },
          "requireOdds": {
            "title": "Only matches that carry odds",
            "type": "boolean",
            "description": "Drop matches with no odds shown on the page. About 5% of matches have none.",
            "default": false
          },
          "onlyCompleted": {
            "title": "Only finished matches",
            "type": "boolean",
            "description": "Keep only matches that have a score. The scheduled-matches section mixes finished and not-yet-started matches in one table.",
            "default": false
          },
          "onlyUpcoming": {
            "title": "Only matches not started yet",
            "type": "boolean",
            "description": "Keep only matches with no score yet.",
            "default": false
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "Off by default: TennisExplorer answered 200 from a plain Apify datacentre address when this Actor was built (2026-09-06). If the site starts answering 403, 429 or 503, the Actor switches to a proxy session on its own and tries again.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}