{
  "openapi": "3.0.1",
  "info": {
    "title": "OpenTable Scraper - Restaurants, Phones, Reviews & Tables",
    "description": "Scrape OpenTable restaurants by city, keyword, coordinates or URL: name, cuisine, price band, address, coordinates, phone, rating, reviews, bookings today. Add bookable times, profile details (website, hours, menus, chef), diner reviews and website emails. Deep search past the ~1,000 cap.",
    "version": "0.1",
    "x-build-id": "yardaIshBt0CN8PyP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~opentable-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-opentable-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/scrapersdelight~opentable-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-opentable-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/scrapersdelight~opentable-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-opentable-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": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "search",
              "restaurants",
              "reviews"
            ],
            "type": "string",
            "description": "Restaurants by place (search), restaurants you list by URL / id / name (restaurants), or diner reviews, one row per review (reviews).",
            "default": "search"
          },
          "locations": {
            "title": "Places",
            "type": "array",
            "description": "Cities, regions or neighbourhoods as you would type them on OpenTable, e.g. \"Chicago, IL\", \"London\", \"SoHo, New York\", \"Toronto\". Add the country for places outside the US (\"Paris, France\"). Each is searched with every search term below.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Cuisine or keyword",
            "type": "array",
            "description": "Optional. What you would type into OpenTable's search, e.g. \"sushi\", \"steakhouse\", \"brunch\", \"rooftop\". Empty = every restaurant in the place.",
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "title": "Latitude",
            "type": "number",
            "description": "Optional. Search around exact coordinates (with longitude), e.g. 40.7128. Runs in addition to the places above."
          },
          "longitude": {
            "title": "Longitude",
            "type": "number",
            "description": "Optional. Longitude for the coordinates search, e.g. -74.006."
          },
          "startUrls": {
            "title": "OpenTable URLs",
            "type": "array",
            "description": "Optional. Restaurant pages (opentable.com/r/..., opentable.com/<name>, /restaurant/profile/<id>) and search pages (opentable.com/s?...) from any OpenTable country site. A search URL keeps its keyword, coordinates, date and party size.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "restaurantIds": {
            "title": "Restaurant ids",
            "type": "array",
            "description": "Optional. OpenTable restaurant ids (the number in /restaurant/profile/<id>), e.g. \"108541\". Used by the restaurants and reviews modes.",
            "items": {
              "type": "string"
            }
          },
          "restaurantNames": {
            "title": "Restaurant names",
            "type": "array",
            "description": "Optional. One restaurant per line as \"Name, City\", e.g. \"Nobu Fifty Seven, New York\". Resolved with OpenTable's own search; a name OpenTable does not match is reported, never guessed.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Most rows this run delivers (restaurants, or reviews in reviews mode). Each place / URL is searched in order until this is reached.",
            "default": 100
          },
          "maxResultsPerSearch": {
            "title": "Max results per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional cap for each place x term search (0 = no cap; Max results still applies).",
            "default": 0
          },
          "deepSearch": {
            "title": "Deep search (past OpenTable's ~1,000 per search)",
            "type": "boolean",
            "description": "OpenTable serves the ~750-1,000 restaurants nearest the place's centre. Deep search cuts the area into map tiles and searches each, deduplicating by restaurant id (New York: 990 -> 2,311; London: 999 -> 2,796).",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "best",
              "rating",
              "distance",
              "newest"
            ],
            "type": "string",
            "description": "OpenTable's result order.",
            "default": "best"
          },
          "priceBands": {
            "title": "Price",
            "type": "array",
            "description": "Only these OpenTable price bands. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "2",
                "3",
                "4"
              ],
              "enumTitles": [
                "$$ - $30 and under",
                "$$$ - $31 to $50",
                "$$$$ - $50 and over"
              ]
            }
          },
          "awardTags": {
            "title": "Awards",
            "type": "array",
            "description": "Only restaurants with these OpenTable award tags, e.g. \"MICHELIN\".",
            "items": {
              "type": "string"
            }
          },
          "tableCategories": {
            "title": "Seating",
            "type": "array",
            "description": "Only restaurants offering this seating.",
            "items": {
              "type": "string",
              "enum": [
                "standard",
                "bar",
                "counter",
                "highTop",
                "outdoor"
              ],
              "enumTitles": [
                "Standard",
                "Bar",
                "Counter",
                "High top",
                "Outdoor"
              ]
            }
          },
          "occasions": {
            "title": "Occasions",
            "type": "array",
            "description": "OpenTable's occasion prompts, e.g. \"ROMANTIC\", \"BRUNCH\", \"BUSINESS\", \"GROUPS\".",
            "items": {
              "type": "string"
            }
          },
          "onlyJustAdded": {
            "title": "Newly added restaurants only",
            "type": "boolean",
            "description": "Only restaurants OpenTable marks as new on OpenTable.",
            "default": false
          },
          "searchRadiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Optional. OpenTable's search radius around the place. It also sets the area deep search covers. 0 = OpenTable's default.",
            "default": 0
          },
          "onlyBookable": {
            "title": "Only restaurants with tables at the reservation below",
            "type": "boolean",
            "description": "Ask OpenTable for restaurants with tables around the date, time and party size below (OpenTable's own date search).",
            "default": false
          },
          "cuisines": {
            "title": "Main cuisine is one of",
            "type": "array",
            "description": "Keep restaurants whose main cuisine is one of these, e.g. \"Italian\", \"Steakhouse\", \"Japanese\" (OpenTable's cuisine names).",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only restaurants rated at least this (1-5). 0 = off.",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Only restaurants with at least this many reviews. 0 = off.",
            "default": 0
          },
          "withPhoneOnly": {
            "title": "With a phone number only",
            "type": "boolean",
            "description": "Skip restaurants without a phone number.",
            "default": false
          },
          "wheelchairAccessible": {
            "title": "Wheelchair accessible only",
            "type": "boolean",
            "description": "Only restaurants whose OpenTable profile lists wheelchair access (reads each profile, so Restaurant details are included).",
            "default": false
          },
          "includeAvailability": {
            "title": "Bookable times",
            "type": "boolean",
            "description": "Add each restaurant's bookable times around the reservation below (OpenTable's own availability call, 50 restaurants per call). Charged only for restaurants OpenTable answered for.",
            "default": false
          },
          "date": {
            "title": "Date",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Reservation date, YYYY-MM-DD. Empty = tomorrow (or Days ahead)."
          },
          "daysAhead": {
            "title": "Days ahead",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Use instead of a date for scheduled runs: 0 = today, 7 = a week from the run."
          },
          "time": {
            "title": "Time",
            "type": "string",
            "description": "Reservation time, HH:MM (24-hour), e.g. 19:00. OpenTable answers times within ~2.5 hours either side.",
            "default": "19:00"
          },
          "partySize": {
            "title": "Party size",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of diners.",
            "default": 2
          },
          "availabilityDays": {
            "title": "Also the following days",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Bookable times for this many days after the date too (0-6), in availabilityDays.",
            "default": 0
          },
          "includeDetails": {
            "title": "Restaurant details",
            "type": "boolean",
            "description": "Read each restaurant's OpenTable profile: website, opening hours, all cuisines, chef, dress code, parking, payment options, amenities, food / service / ambience / value ratings, noise, review summary, popular dishes, private dining.",
            "default": false
          },
          "includeMenus": {
            "title": "Menus",
            "type": "boolean",
            "description": "Add the OpenTable-hosted menus (sections, dishes, descriptions, prices) from the profile page. Turns on Restaurant details.",
            "default": false
          },
          "includeReviews": {
            "title": "Reviews",
            "type": "boolean",
            "description": "Add diner reviews to each restaurant (text, 5 ratings, noise, dates, diner, VIP, helpful votes, restaurant reply).",
            "default": false
          },
          "maxReviewsPerRestaurant": {
            "title": "Reviews per restaurant",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Most reviews per restaurant (paged 100 at a time). 0 = all (up to 5,000).",
            "default": 20
          },
          "reviewsSort": {
            "title": "Review order",
            "enum": [
              "newestReview",
              "highestRating",
              "lowestRating",
              "recommended",
              "oldestReview"
            ],
            "type": "string",
            "description": "Which reviews come first.",
            "default": "newestReview"
          },
          "reviewsSince": {
            "title": "Reviews of visits since",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional. Only reviews of visits on or after this date (YYYY-MM-DD)."
          },
          "reviewsMinRating": {
            "title": "Reviews rated at least",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only reviews with at least this overall rating (1-5). 0 = all.",
            "default": 0
          },
          "reviewsVipOnly": {
            "title": "VIP diners' reviews only",
            "type": "boolean",
            "description": "Only reviews by diners OpenTable marks as VIP.",
            "default": false
          },
          "reviewsKeyword": {
            "title": "Reviews mentioning",
            "type": "string",
            "description": "Optional. Only reviews that mention this word or phrase (OpenTable's own review search), e.g. \"birthday\", \"gluten\"."
          },
          "includeEmails": {
            "title": "Find emails",
            "type": "boolean",
            "description": "Look for each restaurant's email on its own website (homepage + contact / about pages; own-domain or ordinary mailbox addresses only). Turns on Restaurant details (the website comes from the profile). Charged only when an email is found.",
            "default": false
          },
          "verifyEmailDomain": {
            "title": "Check the email domain takes mail",
            "type": "boolean",
            "description": "Drop addresses whose domain has no mail server (DNS check).",
            "default": true
          },
          "domain": {
            "title": "OpenTable country site",
            "enum": [
              "auto",
              "com",
              "co.uk",
              "ca",
              "ie",
              "de",
              "com.au",
              "com.mx",
              "jp",
              "nl",
              "es",
              "it",
              "ae"
            ],
            "type": "string",
            "description": "Which OpenTable market to search in. Auto picks it from the place (London -> opentable.co.uk, Toronto -> opentable.ca).",
            "default": "auto"
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Restaurants enriched in parallel (details, reviews).",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The actor tries Apify's own connection first and switches to Apify RESIDENTIAL (US) by itself when OpenTable refuses it. Set your own proxy or another Apify group here to try it first."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}