{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Prices Scraper",
    "description": "Hotel prices from Google Hotels for any city or hotel, any dates and guests. Optional prices from every booking site and a price-change monitor. Fast, no browser, low cost.",
    "version": "0.1",
    "x-build-id": "gpL0Bcc2JUs7b4t9t"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/silentsuperpower~google-hotels-prices-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-silentsuperpower-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/silentsuperpower~google-hotels-prices-scraper/runs": {
      "post": {
        "operationId": "runs-sync-silentsuperpower-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/silentsuperpower~google-hotels-prices-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-silentsuperpower-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": {
          "searchQueries": {
            "title": "Places to search",
            "type": "array",
            "description": "One per line. A city, area, neighborhood or landmark, written the way you would type it into Google Hotels: <code>Paris</code>, <code>Hotels in Times Square, New York</code>, <code>Lisbon, Portugal</code>. Each place returns its hotels, about 20 per page of results, with the price for your dates and guests.",
            "items": {
              "type": "string"
            }
          },
          "hotelNames": {
            "title": "Hotels by name",
            "type": "array",
            "description": "Optional. One hotel per line, with the city to avoid mix-ups: <code>Fairmont Austin Texas</code>. Each name is looked up first and then priced with the full list of booking sites (Booking.com, Expedia, the hotel's own site and more). A name that matches more than one hotel is skipped with a warning; add the city or use a hotel token.",
            "items": {
              "type": "string"
            }
          },
          "hotelTokens": {
            "title": "Hotel tokens",
            "type": "array",
            "description": "Optional. Google hotel tokens (they start with <code>Ch</code>), one per line. The <code>entityToken</code> field of every result is one, so you can price the same hotels again without a name lookup. This saves one request per hotel.",
            "items": {
              "type": "string"
            }
          },
          "checkInDate": {
            "title": "Check-in date",
            "type": "string",
            "description": "Optional. First night of the stay as <code>YYYY-MM-DD</code>. Leave empty to use \"Check-in in N days\" below, which keeps scheduled runs looking ahead."
          },
          "checkInInDays": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "Used when \"Check-in date\" is empty: the stay starts this many days from the day of the run. Google shows prices up to about 330 days ahead.",
            "default": 14
          },
          "checkOutDate": {
            "title": "Check-out date",
            "type": "string",
            "description": "Optional. Last morning of the stay as <code>YYYY-MM-DD</code>. Leave empty to use \"Nights\" below."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of the stay when \"Check-out date\" is empty. 1 to 30 nights.",
            "default": 1
          },
          "lastCheckInDate": {
            "title": "Last check-in date (date range)",
            "type": "string",
            "description": "Optional. To price many start dates in one run, set the last check-in date as <code>YYYY-MM-DD</code>. The run prices one stay per date from the check-in date to this one, so the same hotels come back once per date. Up to 62 dates. Each date repeats the search, so cost and requests grow with the number of dates."
          },
          "checkInStepDays": {
            "title": "Days between check-ins",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "For a date range: price every N-th check-in date. 7 prices the same weekday each week.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Number of adults. Google shows the price for one room that fits all guests.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "Optional. One age per line, from 0 to 17. Children can change the price and which hotels are shown.",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter code for the prices, for example <code>USD</code>, <code>EUR</code>, <code>GBP</code>. Google converts the price when the hotel does not sell in this currency.",
            "default": "USD"
          },
          "countryCode": {
            "title": "Country of the buyer",
            "type": "string",
            "description": "Two-letter country code, for example <code>us</code>, <code>de</code>, <code>jp</code>. Google shows the prices a visitor from this country sees, and which booking sites it lists. Outside the US this works best with a residential proxy in the same country (see Advanced).",
            "default": "us"
          },
          "languageCode": {
            "title": "Language",
            "type": "string",
            "description": "Language of hotel descriptions and labels, for example <code>en</code>, <code>de</code>, <code>pt-BR</code>.",
            "default": "en"
          },
          "maxHotelsPerSearch": {
            "title": "Max hotels per place",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Stop after this many matching hotels for each place and each date. If you leave it empty, 20 hotels are returned. Google lists about 490 to 550 hotels per place and date, so 500 is the most you can ask for, and a big city may return slightly fewer. A page of results holds about 20 hotels, and 500 hotels take about 25 requests. You are charged per hotel returned, so this also caps the cost."
          },
          "minStars": {
            "title": "Minimum hotel stars",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only hotels with at least this star class. 0 keeps everything. Vacation rentals have no star class and are dropped when this is above 0.",
            "default": 0
          },
          "minGuestRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only places whose Google guest rating is at least this value, on the 5-point scale. For example <code>4.2</code>. 0 keeps everything.",
            "default": 0
          },
          "minPricePerNight": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Drop hotels cheaper than this per night, in your currency."
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Drop hotels more expensive than this per night, in your currency."
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Which kinds of places to keep. Google Hotels lists both hotels and vacation rentals for most cities.",
            "items": {
              "type": "string",
              "enum": [
                "hotel",
                "vacation_rental"
              ],
              "enumTitles": [
                "Hotels",
                "Vacation rentals"
              ]
            },
            "default": [
              "hotel",
              "vacation_rental"
            ]
          },
          "includeProviderPrices": {
            "title": "Add prices from every booking site",
            "type": "boolean",
            "description": "For every hotel returned, also fetch the price on each booking site Google lists (about 10 to 40: Booking.com, Expedia, Hotels.com, the hotel's own site and more), with the cheapest site and the official-site price pulled out. Costs one extra request and one \"provider-prices\" charge per hotel. Hotels named in \"Hotels by name\" or \"Hotel tokens\" always include them.",
            "default": false
          },
          "includeBookingLinks": {
            "title": "Include booking links",
            "type": "boolean",
            "description": "With booking-site prices on, also return the Google link that opens each offer. Links are long, so they are off by default.",
            "default": false
          },
          "onlyPriceChanges": {
            "title": "Price monitor: only new hotels and price changes",
            "type": "boolean",
            "description": "Remember the last price of every hotel and return only hotels that are new or whose price changed since the previous run with the same monitor name. Unchanged hotels are skipped and not charged. Schedule the run daily for a price-drop feed. The first run returns everything, as \"new\".",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the stored price history. Letters, digits and hyphens. Use a different name for each schedule so two schedules never share a history.",
            "default": "google-hotels-price-monitor"
          },
          "monitorBy": {
            "title": "Monitor tracks",
            "enum": [
              "stay",
              "hotel"
            ],
            "type": "string",
            "description": "Stay compares a hotel only with its earlier price for the same check-in date and nights, which is right when your dates are fixed. Hotel compares with the last price seen for that hotel whatever the dates, which suits \"N days from now\" schedules.",
            "default": "stay"
          },
          "monitorSeedOnly": {
            "title": "Monitor: remember prices, return nothing",
            "type": "boolean",
            "description": "Store today's prices as the starting point without returning or charging for any rows. Use it once to set a baseline.",
            "default": false
          },
          "minPriceChangePercent": {
            "title": "Monitor: minimum price change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Ignore price moves smaller than this percentage. For example 5 reports only changes of 5 percent or more. The baseline is only updated when a change is reported.",
            "default": 0
          },
          "requestDelayMs": {
            "title": "Pause between requests (ms)",
            "minimum": 300,
            "maximum": 60000,
            "type": "integer",
            "description": "How long to wait between requests to Google when no proxy is used. With a proxy the pause is a quarter of this.",
            "default": 2000
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Hard limit on requests to Google for the whole run. The run stops and reports it when reached. Useful for tests.",
            "default": 1000000
          },
          "maxResidentialMb": {
            "title": "Max residential proxy data (MB)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Safety cap on residential proxy traffic, which is billed per gigabyte. The run stops when this is reached. Only matters when Google blocks the datacenter proxies and the run climbs to residential.",
            "default": 100
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Leave empty and the run starts with a direct connection, then switches to Apify datacenter proxy and then to residential proxy only if Google blocks it. Pick a proxy here to force it from the start, for example a residential proxy in the country you set above."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}