{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper — Prices by OTA, Calendar & Reviews",
    "description": "Scrape Google Hotels: hotels of any search with price, rating, sentiment by aspect, amenities and photos; the full price ladder across Booking, Expedia, Agoda and the official site with free-cancellation dates; nightly price calendars; review texts. No login. Empty or failed rows are never charged.",
    "version": "0.1",
    "x-build-id": "EX0kcpMihxNhhPgjf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/oswaldocarabano~google-hotels-prices-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-oswaldocarabano-google-hotels-prices-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/oswaldocarabano~google-hotels-prices-scraper/runs": {
      "post": {
        "operationId": "runs-sync-oswaldocarabano-google-hotels-prices-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/oswaldocarabano~google-hotels-prices-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-oswaldocarabano-google-hotels-prices-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": {
          "outputType": {
            "title": "What to extract",
            "enum": [
              "hotel",
              "hotel-prices",
              "price-calendar-day",
              "review"
            ],
            "type": "string",
            "description": "One row type per run. <b>hotel</b>: every hotel of a search with its featured price, rating, reviews breakdown, sentiment by aspect, amenities, photos and nearby places ($2 per 1,000). <b>hotel-prices</b>: the full price ladder of each hotel across booking sites (median 23 offers) with official-site parity and free-cancellation dates. <b>price-calendar-day</b>: the price ladder for each check-in date of a range. <b>review</b>: review texts with score, source and hotel replies.",
            "default": "hotel"
          },
          "locations": {
            "title": "Locations",
            "maxItems": 50,
            "type": "array",
            "description": "Cities, neighbourhoods or areas as you would type them in Google Hotels (\"Lisbon\", \"Shibuya, Tokyo\", \"Valencia, Spain\"). Each location is searched with your dates and filters. Rows are delivered and charged only when the place Google searched (cityResolved) is a name of what you typed, including other languages and abbreviations (\"NYC\", \"Köln\", \"CDMX\"). If Google does not recognise the text or guesses a different city, you get one error row that is not charged. Type a city or neighbourhood, not a landmark.",
            "default": [
              "Lisbon"
            ],
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Hotel links (optional)",
            "maxItems": 500,
            "type": "array",
            "description": "Specific hotels: Google Hotels links containing /travel/hotels/entity/&lt;id&gt; or the id itself. Used together with, or instead of, locations. Nothing else is fetched from these links: only the hotel id is read.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "YYYY-MM-DD. Empty = 14 days from today. Prices change with dates, so every row carries the dates it was priced for.",
            "default": ""
          },
          "checkOut": {
            "title": "Check-out date (optional)",
            "type": "string",
            "description": "YYYY-MM-DD. Empty = check-in plus \"Nights\".",
            "default": ""
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of the stay when no check-out date is given. Also the stay length of each night in the price calendar.",
            "default": 2
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Guests change the price: going from 2 to 4 adults changed the price in 17 of 18 hotels we tested.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "maxItems": 10,
            "type": "array",
            "description": "One age (0–17) per child, for example [6, 10]. Empty = no children.",
            "default": []
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "JPY",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "ARS",
              "CLP",
              "COP",
              "PEN",
              "CHF",
              "SEK",
              "NOK",
              "DKK",
              "PLN",
              "CZK",
              "HUF",
              "RON",
              "TRY",
              "AED",
              "SAR",
              "ILS",
              "ZAR",
              "EGP",
              "THB",
              "SGD",
              "MYR",
              "IDR",
              "PHP",
              "VND",
              "KRW",
              "TWD",
              "HKD",
              "NZD"
            ],
            "type": "string",
            "description": "Prices are returned in this currency (it is set inside the Google Hotels request, not converted by us).",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "pt-BR",
              "nl",
              "pl",
              "ro",
              "cs",
              "sv",
              "da",
              "no",
              "fi",
              "el",
              "tr",
              "ru",
              "uk",
              "ar",
              "he",
              "ja",
              "ko",
              "zh-CN",
              "zh-TW",
              "th",
              "vi",
              "id",
              "ms",
              "hi"
            ],
            "type": "string",
            "description": "Language of descriptions, labels and reviews as Google shows them.",
            "default": "en"
          },
          "country": {
            "title": "Country of the searcher",
            "enum": [
              "us",
              "gb",
              "ca",
              "au",
              "nz",
              "ie",
              "es",
              "mx",
              "ar",
              "co",
              "cl",
              "pe",
              "br",
              "pt",
              "fr",
              "de",
              "it",
              "nl",
              "be",
              "ch",
              "at",
              "se",
              "no",
              "dk",
              "fi",
              "pl",
              "cz",
              "ro",
              "gr",
              "tr",
              "ae",
              "sa",
              "il",
              "za",
              "eg",
              "in",
              "jp",
              "kr",
              "cn",
              "tw",
              "hk",
              "sg",
              "my",
              "th",
              "vn",
              "id",
              "ph"
            ],
            "type": "string",
            "description": "Google Hotels market (booking sites and prices can differ by market).",
            "default": "us"
          },
          "maxHotels": {
            "title": "Max hotels per location",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Unique hotels per location (duplicates across pages are removed and never charged). About 18 hotels per results page; Google gives roughly 160 unique hotels in 10 pages for a big city.",
            "default": 20
          },
          "stars": {
            "title": "Hotel class (stars)",
            "type": "array",
            "description": "Only hotels of these classes. Applied by Google itself (tested: 100% of returned hotels match).",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "minRating": {
            "title": "Minimum guest rating",
            "enum": [
              "any",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Applied by Google itself (tested on 5 cities: every returned hotel meets it).",
            "default": "any"
          },
          "maxPrice": {
            "title": "Max price per night",
            "minimum": 1,
            "type": "integer",
            "description": "In the chosen currency, applied by Google itself. Empty = no limit."
          },
          "amenities": {
            "title": "Required amenities",
            "type": "array",
            "description": "Keep only hotels that have ALL of these. \"Pool\", \"Parking\", \"Wi-Fi\", \"Breakfast\" and \"Kitchen\" accept any variant (free or paid, indoor or outdoor). Filtered after reading the results, so it can take more pages to reach \"Max hotels\".",
            "items": {
              "type": "string",
              "enum": [
                "Pool",
                "Parking",
                "Wi-Fi",
                "Breakfast",
                "Kitchen",
                "Airport shuttle",
                "Air conditioning",
                "Bar",
                "Beach access",
                "Free breakfast",
                "Business center",
                "Fitness center",
                "Hot tub",
                "Kid-friendly",
                "Kitchen in rooms",
                "Kitchen in some rooms",
                "Free parking",
                "Paid parking",
                "Pet-friendly",
                "Indoor pool",
                "Pools",
                "Outdoor pool",
                "Restaurant",
                "Room service",
                "Smoke-free property",
                "Spa",
                "Accessible",
                "Free Wi-Fi",
                "Paid Wi-Fi",
                "Full-service laundry",
                "Sauna",
                "Paid breakfast",
                "Public bath"
              ]
            },
            "default": []
          },
          "sortBy": {
            "title": "Sort hotels by",
            "enum": [
              "relevance",
              "lowest-price",
              "highest-price",
              "highest-rating",
              "most-reviewed"
            ],
            "type": "string",
            "description": "Relevance = Google's order. The other options sort the hotels of each location before delivering them (hotel rows only).",
            "default": "relevance"
          },
          "includeVacationRentals": {
            "title": "Include vacation rentals",
            "type": "boolean",
            "description": "Google mixes vacation rentals into some results (10% of rows in our 20-city sample). Off = hotels only.",
            "default": false
          },
          "calendarDays": {
            "title": "Calendar: number of check-in dates",
            "minimum": 1,
            "maximum": 31,
            "type": "integer",
            "description": "For price-calendar-day: one row per hotel and check-in date, starting at the check-in date. Each date is one Google request, so 30 dates × 20 hotels = 600 rows.",
            "default": 7
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per hotel",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "For review rows. Reviews come 10 per request; reviews without text are skipped and not charged.",
            "default": 30
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Requests in flight at once. 6 is the measured sweet spot at 512 MB; 10 is the maximum. Lower values do not improve success, they only make the run slower.",
            "default": 6
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}