{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper & Google Hotels API: Prices per Site",
    "description": "Google Hotels as a hotel data API, no login: every hotel Google lists for a place and stay with class, rating, reviews, prices before and with taxes, hotel deals, amenities, photos; OTA prices per booking site with links, rate parity, a price calendar, filters, vacation rentals, 70+ currencies.",
    "version": "0.1",
    "x-build-id": "OYupUFBJseaHXbfDl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~google-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-google-hotels-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/hyperbach~google-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-google-hotels-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/hyperbach~google-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-google-hotels-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": {
          "query": {
            "title": "Place",
            "maxLength": 200,
            "type": "string",
            "description": "A place to search hotels in: a city, a neighbourhood, a landmark (`New York`, `hotels in Barcelona`, `Times Square hotels`). Google resolves the words; every row carries the place it resolved (`place_resolved`). Not searched when `searches` or `hotels` has an item: the list is then the whole run, and the dates and options here are its defaults.",
            "default": ""
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\+\\d{1,3})?$",
            "type": "string",
            "description": "The check-in date, `YYYY-MM-DD`, or `+N` for N days after the day of the run (UTC): `+30`. A date in the past is a free `invalid` row.",
            "default": ""
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\+\\d{1,3})?$",
            "type": "string",
            "description": "The check-out date, `YYYY-MM-DD` or `+N`; empty = the night after check-in. At most 30 nights.",
            "default": ""
          },
          "searches": {
            "title": "Searches (several places, each with its own stay)",
            "maxItems": 200,
            "type": "array",
            "description": "A list of searches, each an object `{\"query\": \"hotels in Paris\", \"checkIn\": \"+30\", \"checkOut\": \"+32\", \"adults\": 2, \"childrenAges\": [8], \"market\": \"FR\", \"language\": \"fr\", \"currency\": \"EUR\", \"sortBy\": \"lowest_price\", \"hotelClass\": [4, 5], \"minRating\": 4, \"maxPrice\": 250, \"amenities\": [\"pool\"], \"freeCancellation\": true, \"propertyType\": \"hotels\"}` (the run's fields are the defaults; the run's `query` is then not searched), a text `hotels in Paris 2026-11-12 2026-11-14`, or a Google Hotels search URL. Up to 200 searches a run; a value that is no search is a free `invalid` row.",
            "default": []
          },
          "hotels": {
            "title": "Hotels (by name, URL or entity id)",
            "maxItems": 200,
            "type": "array",
            "description": "One hotel per line for the stay above: a name with its city (`Arlo NoMad New York`), a Google Hotels URL (`https://www.google.com/travel/hotels/entity/ChkI…/prices`) or a bare entity id (`ChkI5-ea3sPi9Y9PGg0vZy8xMWM1NF81cHF3EAE`). Each one is a `hotel` row with the dated booking-site list and the full record (the `details` event). With a hotel here, the run's `query` is not searched.",
            "items": {
              "type": "string",
              "pattern": "^.{1,300}$"
            },
            "default": []
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Adults in the room (1–10). Google prices one room; every price is for this party.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children (ages)",
            "maxItems": 8,
            "type": "array",
            "description": "One line per child with the child's age (0–17): `8`, `3`. Google prices the stay for the party; the rows carry the ages asked.",
            "items": {
              "type": "string",
              "pattern": "^\\d{1,2}$"
            },
            "default": []
          },
          "maxHotelsPerSearch": {
            "title": "Hotels per search",
            "minimum": 0,
            "maximum": 2000,
            "type": "integer",
            "description": "Stop a place search after this many distinct hotels. 0 = every hotel Google lists for the stay: the relevance list to its end, then the class facets and the price order (about 500–900 distinct for a big city; the summary row says how many Google counts and whether the list was COMPLETE, TRUNCATED or CAPPED).",
            "default": 0
          },
          "detailsFor": {
            "title": "Booking-site list and full record for the first N hotels",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "For the first N hotels of each place search, one more call each: the dated price per booking site (Google's click-out link and the site's own deep link, the official-site flag, free cancellation), the address and phone, the amenity groups, the rating histogram, the review aspects and texts, the nearby places. Charged as the `details` event on those rows. Hotels in `hotels` always get it.",
            "default": 0
          },
          "calendarDays": {
            "title": "Price calendar (days)",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "For each hotel of `hotels` (and the first `detailsFor` hotels of a search), read the stay on each of the next N check-in dates, the stay's length kept: one `calendar_day` row per date with the lowest site price, the official site's price and the dated site list. One call per date.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "relevance",
              "lowest_price",
              "highest_rating",
              "most_reviewed"
            ],
            "type": "string",
            "description": "`relevance` keeps Google's own order (the first screen first); `lowest_price`, `highest_rating` and `most_reviewed` are Google's own sorts (the rows come out in that order).",
            "default": "relevance"
          },
          "hotelClass": {
            "title": "Hotel class (stars)",
            "maxItems": 5,
            "type": "array",
            "description": "Keep these classes only, one per line: `4`, `5`. Applied by Google.",
            "items": {
              "type": "string",
              "pattern": "^[1-5]$"
            },
            "default": []
          },
          "minRating": {
            "title": "Guest rating at least",
            "enum": [
              "",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Google's own rating steps: 3.5+, 4.0+ or 4.5+. Applied by Google.",
            "default": ""
          },
          "maxPrice": {
            "title": "Max price a night",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep hotels up to this nightly price (before taxes, in `currency`). Applied by Google. 0 = no limit.",
            "default": 0
          },
          "minPrice": {
            "title": "Min price a night",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep hotels from this nightly price up (before taxes, in `currency`). Applied on the records read (Google's request takes no minimum). 0 = no limit.",
            "default": 0
          },
          "amenities": {
            "title": "Amenities",
            "maxItems": 4,
            "type": "array",
            "description": "Keep hotels with every one of these amenities, one per line: `free_parking`, `parking`, `indoor_pool`, `outdoor_pool`, `pool`, `fitness_center`, `restaurant`, `free_breakfast`, `spa`, `beach_access`, `kid_friendly`, `airport_shuttle`, `bar`, `pet_friendly`, `room_service`, `hot_tub`, `free_wifi`, `air_conditioning`. Applied by Google (its own amenity filter ids); several amenities = hotels with all of them.",
            "items": {
              "type": "string",
              "pattern": "^(free_parking|parking|indoor_pool|outdoor_pool|pool|fitness_center|restaurant|free_breakfast|spa|beach_access|kid_friendly|airport_shuttle|bar|pet_friendly|room_service|hot_tub|free_wifi|air_conditioning)$"
            },
            "default": []
          },
          "freeCancellation": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep hotels with a free-cancellation rate; the prices shown are the refundable rates. Applied by Google.",
            "default": false
          },
          "specialOffers": {
            "title": "Special offers only",
            "type": "boolean",
            "description": "Keep hotels Google marks with a deal. Applied by Google.",
            "default": false
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "hotels",
              "vacation_rentals",
              "all"
            ],
            "type": "string",
            "description": "`hotels` (the default: Google's hotel records), `vacation_rentals` (the rental records of Google's mixed list: apartments, houses) or `all`. Every row carries `property_type`.",
            "default": "hotels"
          },
          "market": {
            "title": "Market (country)",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "The two-letter country Google serves the view for (`US`, `GB`, `DE`, …): the point of sale and the strings' market.",
            "default": "US"
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-z]{2}(-[A-Za-z]{2,4})?$",
            "type": "string",
            "description": "The language of the texts (`en`, `de`, `fr`, `es`, `pt-BR`, …): class labels, descriptions, amenity group names.",
            "default": "en"
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "The currency of every price (`USD`, `EUR`, `GBP`, `JPY`, …). Each row carries the currency Google answered with (`currency_served`); a list in another currency is a free `failed` row, never a charged one.",
            "default": "USD"
          },
          "onlyChanges": {
            "title": "Only hotels whose price moved (monitoring)",
            "type": "boolean",
            "description": "Remember every hotel row delivered (by its Google id and stay) and, on the next run of the same memory, deliver only the hotels that are new or whose nightly price with taxes (or a site's price, with `detailsFor`) moved: `change_type`, `previous_price`, `price_change`, `sites_gained`, `sites_lost`, `sites_changed` say what. Unchanged hotels are counted, not delivered, not charged.",
            "default": false
          },
          "stateStoreName": {
            "title": "Memory name",
            "pattern": "^[A-Za-z0-9-]{0,63}$",
            "type": "string",
            "description": "With `onlyChanges`: the name of the memory to keep between runs (letters, digits, dashes); empty = a name derived from the searches.",
            "default": ""
          },
          "maxItems": {
            "title": "Max rows (charged)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many charged rows (hotels and calendar days; the free `search` summary rows do not count). 0 = no limit.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}