{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper: Prices, Price Calendar & Deals",
    "description": "Google Hotels prices for any city and dates: every hotel and rental with nightly price, rating, class, location and deals, plus a price calendar of the cheapest check-in dates, price-drop tracking between runs and a visual report.",
    "version": "0.1",
    "x-build-id": "7RTGbvOScCWcNH03d"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/registryfeeds~google-hotels-price-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-registryfeeds-google-hotels-price-tracker",
        "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/registryfeeds~google-hotels-price-tracker/runs": {
      "post": {
        "operationId": "runs-sync-registryfeeds-google-hotels-price-tracker",
        "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/registryfeeds~google-hotels-price-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-registryfeeds-google-hotels-price-tracker",
        "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",
        "required": [
          "locations"
        ],
        "properties": {
          "mode": {
            "title": "What to get",
            "enum": [
              "search",
              "hotels",
              "calendar"
            ],
            "type": "string",
            "description": "Hotels and prices: every property for the stay below. Specific hotels: the hotels you list, each with its price at every booking site (Booking.com, Expedia, the hotel itself, ...) and its amenities; schedule it to track them. Price calendar: the typical nightly price for each check-in date over the coming days, to find the cheapest time to go; list hotels below to get a calendar for each of those hotels instead of a whole place.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, neighbourhoods or areas, written as you would on Google, for example \"Lisbon\", \"Shibuya, Tokyo\" or \"Times Square, New York\".",
            "default": [
              "Lisbon"
            ],
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Hotels (specific hotels, or a calendar per hotel)",
            "type": "array",
            "description": "Each hotel as its Google Hotels link (https://www.google.com/travel/hotels/entity/...) or its name and city, for example \"Hotel Tivoli Avenida Liberdade, Lisbon\". Specific hotels mode: up to 100. Price calendar mode: up to 20, each gets its own calendar of the cheapest booking-site price per check-in date (billed per date).",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "Leave empty to use \"Days from today\" below, which is handy for scheduled runs."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "Leave empty to stay the number of nights below."
          },
          "checkInDaysFromToday": {
            "title": "Days from today (when no check-in date)",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "Check in this many days after the run date. A daily schedule then always looks the same distance ahead.",
            "default": 14
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay when no check-out date is given, and for every date in the price calendar.",
            "default": 2
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Guests aged 18 or over.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "One entry per child: their age (0 to 17). Prices depend on the number of guests.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter code such as USD, EUR, GBP or JPY.",
            "default": "USD"
          },
          "maxResultsPerLocation": {
            "title": "Max properties per location",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many hotels and rentals to collect for each location (hotels and prices mode).",
            "default": 50
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "all",
              "hotels",
              "rentals"
            ],
            "type": "string",
            "description": "Google mixes hotels and vacation rentals in its results.",
            "default": "all"
          },
          "minRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "For example 4 keeps properties rated 4.0 and above."
          },
          "minHotelClass": {
            "title": "Minimum hotel class (stars)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "For example 4 keeps 4- and 5-star hotels. Vacation rentals have no class."
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "In the chosen currency, before taxes."
          },
          "includeDetails": {
            "title": "Booking-site prices and amenities",
            "type": "boolean",
            "description": "Also open each property's own Google Hotels page to add its price at every booking site (cheapest site, the hotel's own price, saving), its full amenity list and its address and phone. One extra page per property, so a run takes longer. Always on in specific hotels mode.",
            "default": false
          },
          "maxDetailsPerLocation": {
            "title": "Max properties with details per location",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many properties per location get booking-site prices and amenities, in Google's order.",
            "default": 20
          },
          "requiredAmenities": {
            "title": "Must have these amenities",
            "type": "array",
            "description": "Keep only properties whose own page lists all of these. Switches on booking-site prices and amenities and checks every result of each location (up to Max properties per location), so a run takes longer.",
            "items": {
              "type": "string",
              "enum": [
                "freeWifi",
                "freeBreakfast",
                "breakfast",
                "pool",
                "spa",
                "hotTub",
                "fitnessCenter",
                "freeParking",
                "parking",
                "airConditioning",
                "restaurant",
                "bar",
                "roomService",
                "petFriendly",
                "kidFriendly",
                "accessible",
                "airportShuttle",
                "beachAccess",
                "evCharger",
                "kitchen",
                "wifi"
              ],
              "enumTitles": [
                "Free Wi-Fi",
                "Free breakfast",
                "Breakfast (free or paid)",
                "Pool",
                "Spa",
                "Hot tub",
                "Fitness center",
                "Free parking",
                "Parking (free or paid)",
                "Air conditioning",
                "Restaurant",
                "Bar",
                "Room service",
                "Pet-friendly",
                "Kid-friendly",
                "Wheelchair accessible",
                "Airport shuttle",
                "Beach access",
                "EV charger",
                "Kitchen",
                "Wi-Fi (free or paid)"
              ]
            }
          },
          "calendarDays": {
            "title": "Price calendar: days to check",
            "minimum": 2,
            "maximum": 120,
            "type": "integer",
            "description": "Price calendar mode: how many check-in dates to check, starting from the check-in date (or days from today).",
            "default": 30
          },
          "trackPriceChanges": {
            "title": "Track price changes between runs",
            "type": "boolean",
            "description": "Remembers prices for the same location, dates and guests, so the next run shows how each property moved since the last run. Ideal with a daily schedule.",
            "default": true
          },
          "generateReport": {
            "title": "Visual report",
            "type": "boolean",
            "description": "Saves an HTML report (charts, best value, deals, price calendar) in the key-value store as REPORT.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed for normal runs: the Actor connects directly and only switches to a proxy if Google starts refusing requests.",
            "default": {
              "useApifyProxy": false
            }
          },
          "selfTest": {
            "title": "Self-test (maintenance)",
            "type": "boolean",
            "description": "Used by the daily health check.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}