{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Search Scraper - Prices by Booking Site",
    "description": "Hotel prices from Google Hotels for any destination and dates: nightly and total price on every booking site (Booking.com, Expedia, Hotels.com, Agoda, official site) with links, rating, reviews, star class, amenities, coordinates. Any currency and country. HTTP only.",
    "version": "0.1",
    "x-build-id": "aRjOniiXChieWW3dE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~google-hotels/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-google-hotels",
        "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/scrapewise~google-hotels/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-google-hotels",
        "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/scrapewise~google-hotels/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-google-hotels",
        "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": {
          "locations": {
            "title": "Destinations",
            "type": "array",
            "description": "Cities, neighborhoods or landmarks, one per line, for example New York, Lisbon or Shibuya Tokyo. Each one is searched on Google Hotels as 'hotels in <destination>'; text that already names a kind of lodging ('hostels in Berlin') is sent as written. Each destination returns up to 'Max hotels per destination' rows, with 'searchQuery' and 'position' on every row. A destination with no properties returns one free NO_RESULTS row. Also accepts 'searchQuery', 'searchQueries', 'q' and 'destination'. Leave empty and fill 'Specific hotels' to price only named hotels; with both empty the run prices New York.",
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Specific hotels (names or Google Hotels links)",
            "type": "array",
            "description": "Exact hotels to price, one per line: a hotel name with its city (Pestana Palace Lisboa, The Savoy London) or a Google Hotels link (https://www.google.com/travel/hotels/entity/...). You get one row per hotel; a name that matches nothing returns a free HOTEL_NOT_FOUND row, and the same hotel sent twice is delivered and charged once. Needed for the price calendar. Also accepts 'hotelUrls'.",
            "items": {
              "type": "string"
            }
          },
          "checkInDate": {
            "title": "Check-in date",
            "type": "string",
            "description": "Check-in date as YYYY-MM-DD, for example 2026-11-05. Must be today or later, because Google only prices future stays. Leave empty to use 14 days from the run date; for a scheduled price monitor use a fixed date, otherwise every run is a new search."
          },
          "checkOutDate": {
            "title": "Check-out date",
            "type": "string",
            "description": "Check-out date as YYYY-MM-DD, after check-in, for stays of up to 30 nights. Leave empty for a 1-night stay. 'pricePerNight' is the nightly price and 'totalPrice' covers the whole stay. Every booking-site price is checked against these dates; offers for another stay are dropped (detailsError DATES_NOT_APPLIED)."
          },
          "priceCalendarDays": {
            "title": "Price calendar: number of check-in dates",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "Price calendar for hotels given in 'Specific hotels': prices the same hotel for this many consecutive check-in dates, keeping the number of nights, starting from the check-in above. 30 returns 30 rows per hotel, each with every booking site's price and 'priceCalendarDay' (1, 2, 3...), so you can see the cheapest day to book. Up to 90. Each date is one charged row. Empty, 0 or 1 prices only the dates above. Not used for destinations."
          },
          "priceCalendarStep": {
            "title": "Price calendar: days between check-in dates",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Days between check-in dates in the price calendar. 1 (default) prices every day; 2 every other day; 7 the same weekday every week, which covers 30 weeks with 'Price calendar: number of check-in dates' set to 30. Used only when 'Price calendar: number of check-in dates' is above 1.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of adult guests, 1 to 10. Default 2. Prices change with the number of guests, so compare runs made with the same value. Children and multiple rooms are not supported.",
            "default": 2
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code for every price, for example USD, EUR, GBP, JPY, BRL, AUD or INR. Default USD. Prices are converted by Google; 'currency' appears on every row.",
            "default": "USD"
          },
          "countryCode": {
            "title": "Country (gl)",
            "type": "string",
            "description": "Two-letter country the search is made from (Google's gl), for example us, gb, de, jp or br. It changes which booking sites appear and how taxes are shown, not only the currency. Empty means us. Also accepts 'country' and 'gl'."
          },
          "languageCode": {
            "title": "Language (hl)",
            "type": "string",
            "description": "Language of hotel class labels, amenities and descriptions (Google's hl), for example en, de, es, fr or ja. Hotel names stay as Google shows them. Empty means en. Also accepts 'language' and 'hl'."
          },
          "maxResults": {
            "title": "Max hotels per destination",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum hotels for each destination. Empty means 20, or the value of 'Max hotels in total' when that is set; up to about 1,000, the depth of Google's list. Google shows about 18 hotels per page and the Actor pages until it reaches this number or the end of the list. You pay per hotel delivered, so this sets the cost per destination: 20 hotels cost US$ 0.06 on the Free plan."
          },
          "includeDetails": {
            "title": "Include price per booking site and full details",
            "type": "boolean",
            "description": "On (default): opens each hotel's price page to add 'bookingPrices' (nightly and total price on each booking site Google lists, with links and 'isOfficialSite'), 'lowestPriceSite', the full amenity list, address, phone, check-in/out times and the long description. Same price per hotel. Turn it off when you only need list price, rating, class and coordinates: runs are several times faster (50 hotels in 15 s). Also accepts 'includeBookingPrices' and 'includePrices'.",
            "default": true
          },
          "minPrice": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hotels whose lowest nightly price is at or above this, in the chosen currency, for example 100. Hotels without a price for your dates are dropped when any price filter is set. Filters run on the list Google returns, so the Actor reads more pages to find enough matches; filtered-out hotels are not charged."
          },
          "maxPrice": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hotels whose lowest nightly price is at or below this, in the chosen currency, for example 250. Hotels without a price are dropped when set; filtered-out hotels are not charged."
          },
          "minRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "type": "number",
            "description": "Keep only hotels with a Google guest rating at or above this, from 0 to 5, for example 4.5. Hotels without a rating are dropped when set. The codes 7, 8 and 9 used by other Google Hotels scrapers also work (read as 3.5+, 4.0+, 4.5+). Also accepts 'minGuestRating'."
          },
          "hotelClasses": {
            "title": "Hotel class (stars)",
            "type": "array",
            "description": "Star classes to keep, for example 4 and 5. Empty keeps every class, including unrated properties such as hostels and apartments. Also accepts 'hotelClass' (a list such as [4, 5] keeps those classes; a single number such as 4 keeps 4 stars and up) and 'minStars'.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            }
          },
          "maxItems": {
            "title": "Max hotels in total (optional)",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on hotels delivered across all destinations and hotels in the run, for example 200. Use it to limit spend when you send many destinations. Empty means no cap beyond 'Max hotels per destination'."
          },
          "compareWithPreviousRun": {
            "title": "Compare prices with the previous run",
            "type": "boolean",
            "description": "Price tracking. Keeps the last price of every hotel in the key-value store 'google-hotels-price-history' in your account (one record per search: destination or hotel, dates, guests, currency, country and filters) and adds to each row previousPrice, priceChange, priceChangePct, isNew, isNewLowest, lowestSeenPrice, firstSeenAt and previousSeenAt. On the first run every hotel is new. Use with fixed dates in a scheduled Task. Same price per row. Default off.",
            "default": false
          },
          "onlyChanged": {
            "title": "Deliver only new items and price changes",
            "type": "boolean",
            "description": "Needs 'Compare prices with the previous run'. Hotels whose nightly price did not move since the previous run are checked but not saved and not charged, so a daily monitor costs only the rows that changed or are new. A search where nothing changed returns one free row with errorCode NO_PRICE_CHANGES. Default off.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxy is the default and works for most runs. Blocked requests are retried on new IPs and, after two failures, on a residential IP automatically, at no extra price. Change it only if you have a reason to use another proxy group.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}