{
  "openapi": "3.0.1",
  "info": {
    "title": "Tennis Results & Betting Odds Scraper (ATP, WTA, ITF)",
    "description": "Historical and daily tennis match results with closing betting odds from TennisExplorer: ATP, WTA, Challenger and ITF. Set scores, tiebreaks, surface, round, seeds and optional per-bookmaker odds. By date range or player.",
    "version": "0.1",
    "x-build-id": "P0HBc7oWzi40sbZL6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cprussin~tennis-matches-odds/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cprussin-tennis-matches-odds",
        "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/cprussin~tennis-matches-odds/runs": {
      "post": {
        "operationId": "runs-sync-cprussin-tennis-matches-odds",
        "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/cprussin~tennis-matches-odds/run-sync": {
      "post": {
        "operationId": "run-sync-cprussin-tennis-matches-odds",
        "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": {
          "startDate": {
            "title": "Start date",
            "type": "string",
            "description": "First day to scrape: YYYY-MM-DD, \"yesterday\", or relative like \"7 days\" (ago). Empty = same as the end date (one day). In player mode, empty = 1 January of the end date's year."
          },
          "endDate": {
            "title": "End date",
            "type": "string",
            "description": "Last day to scrape (inclusive): YYYY-MM-DD, \"today\", \"yesterday\" or relative like \"1 day\". Empty = yesterday (UTC). Days are TennisExplorer's (Central European time)."
          },
          "tours": {
            "title": "Tours",
            "type": "array",
            "description": "Which singles tours to include. ATP and WTA = main tours (WTA includes WTA 125). CHALLENGER = ATP Challenger. ITF_MEN / ITF_WOMEN = ITF World Tennis Tour. OTHER_MEN / OTHER_WOMEN = UTR events, Asian Games, team events and exhibitions.",
            "items": {
              "type": "string",
              "enum": [
                "ATP",
                "WTA",
                "CHALLENGER",
                "ITF_MEN",
                "ITF_WOMEN",
                "OTHER_MEN",
                "OTHER_WOMEN"
              ],
              "enumTitles": [
                "ATP",
                "WTA",
                "ATP Challenger",
                "ITF men",
                "ITF women",
                "Other men (UTR, exhibitions...)",
                "Other women (UTR, exhibitions...)"
              ]
            },
            "default": [
              "ATP",
              "WTA"
            ]
          },
          "playerSlugs": {
            "title": "Players (optional)",
            "type": "array",
            "description": "Player mode: instead of daily results, return the singles match history of these players in the date range. Use the TennisExplorer slug or URL, e.g. \"hurkacz\" or https://www.tennisexplorer.com/player/hurkacz/. The tours filter still applies.",
            "items": {
              "type": "string"
            }
          },
          "maxMatches": {
            "title": "Max matches",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many matches. Each match is billed as one event.",
            "default": 500
          },
          "includeRoundAndSurface": {
            "title": "Add round and surface",
            "type": "boolean",
            "description": "Look up round (1R, QF, SF, F...) and surface from each tournament page (one extra request per tournament, cached). Player mode has them anyway. ITF men's matches listed as \"Futures\" have no tournament page.",
            "default": true
          },
          "includeBookmakerOdds": {
            "title": "Add per-bookmaker odds",
            "type": "boolean",
            "description": "Open each match's detail page and add home/away odds from every listed bookmaker (closing and opening), plus player rankings and full names. One extra request per match (slower), billed as an extra event per match that has bookmaker odds.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new matches (monitoring)",
            "type": "boolean",
            "description": "Skip matches returned by an earlier run with the same tours and players. Schedule daily with startDate \"3 days\" to also catch late-added results; each match is returned (and billed) once. State is kept in the key-value store \"tennis-matches-odds-state\" in your account.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}