{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Search Scraper",
    "description": "Scrape Google Hotels prices for a whole city or map area. Just add place names or a bounding box, dates, guests and currency, and get every hotel with nightly and stay price, rating, review count, star class, coordinates and entity id. Track price changes between runs. $2.50 per 1,000 hotels.",
    "version": "1.0",
    "x-build-id": "UB9OSx1kerrrgDrri"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~google-hotels-search/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-google-hotels-search",
        "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/boncross~google-hotels-search/runs": {
      "post": {
        "operationId": "runs-sync-boncross-google-hotels-search",
        "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/boncross~google-hotels-search/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-google-hotels-search",
        "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": "Locations",
            "type": "array",
            "description": "One area per entry: a city (\"Porto\"), a town (\"Aspen, Colorado\") or a district (\"Shibuya, Tokyo\"). Each one is resolved to the area Google Hotels would search for that name.",
            "items": {
              "type": "string"
            }
          },
          "textQueries": {
            "title": "Text queries (Google Maps search)",
            "type": "array",
            "description": "Phrases Google Maps understands, such as \"hostels in Lisbon\" or \"ryokan in Kyoto\". You get Google's ranking for the phrase, 20 per page, with the entity id (so Google Hotels Prices Scraper can price them), Place ID, rating, class, categories, address, phone, website and Maps amenities. No dated price; use Locations for that. Centred on the first Location when you give one.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerTextQuery": {
            "title": "Max results per text query",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Stop after this many lodging results per text query (20 per request). A query also stops after three requests in a row with no new lodging place, and at three times the requests its limit needs, so a phrase that finds no hotels ends quickly.",
            "default": 60
          },
          "maxItems": {
            "title": "Maximum results for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.",
            "default": 0
          },
          "maxHotelsPerArea": {
            "title": "Max hotels per area",
            "minimum": 0,
            "type": "integer",
            "description": "Return at most this many hotels per area, after sorting. 0 = no cap.",
            "default": 0
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "YYYY-MM-DD. Leave empty and the actor uses \"Check-in days ahead\" instead, which suits scheduled runs. The lowercase spelling checkin still works.",
            "default": ""
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "YYYY-MM-DD. Leave empty to use \"Nights\". The lowercase spelling checkout still works.",
            "default": ""
          },
          "checkInDaysAhead": {
            "title": "Check-in days ahead",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Only used when Check-in date is empty: check in this many days from today. The lowercase spelling checkinDaysAhead still works.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Used when Check-out date is empty.",
            "default": 2
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Number of adults (1 to 8). Prices are quoted for this occupancy.",
            "default": 2
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop hotels rated below this (0 to 5). 0 = off. From 3.5 up it is also asked of Google itself, so an area returns more hotels that qualify instead of fewer rows.",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Drop hotels with fewer reviews. 0 = off.",
            "default": 0
          },
          "minPricePerNight": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Drop hotels cheaper than this per night, taxes and fees included, in the selected currency. A hotel with no price for these dates is dropped too. Text-query results carry no price and are not affected. 0 = off.",
            "default": 0
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Drop hotels dearer than this per night, taxes and fees included, in the selected currency. A hotel with no price for these dates is dropped too. Text-query results carry no price and are not affected. 0 = off.",
            "default": 0
          },
          "hotelClasses": {
            "title": "Star classes",
            "type": "array",
            "description": "Keep only these star classes, e.g. [4, 5]: Google's own hotel-class filter. Empty = all. Properties without a class (many guesthouses and rentals) are dropped when this is set.",
            "default": []
          },
          "amenities": {
            "title": "Amenities",
            "type": "array",
            "description": "Google Hotels' own amenity filters; a hotel must have all of those ticked.",
            "items": {
              "type": "string",
              "enum": [
                "freeWifi",
                "freeBreakfast",
                "restaurant",
                "bar",
                "childFriendly",
                "petFriendly",
                "freeParking",
                "parking",
                "evCharger",
                "roomService",
                "fitnessCentre",
                "spa",
                "pool",
                "indoorPool",
                "outdoorPool",
                "airConditioned",
                "wheelchairAccessible",
                "beachAccess",
                "allInclusive",
                "airportShuttle",
                "casino",
                "hotTub",
                "onsen",
                "publicBath",
                "openAirBath",
                "privateBath",
                "sauna"
              ],
              "enumTitles": [
                "Free Wi-Fi",
                "Free breakfast",
                "Restaurant",
                "Bar",
                "Child-friendly",
                "Pet-friendly",
                "Free parking",
                "Parking",
                "EV charger",
                "Room service",
                "Fitness centre",
                "Spa",
                "Pool",
                "Indoor pool",
                "Outdoor pool",
                "Air-conditioned",
                "Wheelchair accessible",
                "Beach access",
                "All-inclusive available",
                "Airport shuttle",
                "Casino",
                "Hot tub",
                "Onsen",
                "Public bath",
                "Open-air bath",
                "Private bath",
                "Sauna"
              ]
            },
            "default": []
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Only hotels offering a free-cancellation rate, priced at that rate.",
            "default": false
          },
          "specialOffersOnly": {
            "title": "Special offers only",
            "type": "boolean",
            "description": "Only hotels Google marks as a deal for these dates (priced below their usual rate).",
            "default": false
          },
          "ecoCertifiedOnly": {
            "title": "Eco-certified only",
            "type": "boolean",
            "description": "Only hotels with an eco-certification listed on Google.",
            "default": false
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Only hotels of these chains or brands, e.g. [\"Hilton\", \"Marriott\"]. Matched against the brands Google lists for each place: an exact name first, otherwise every brand whose name contains it (\"Marriott\" also takes Courtyard by Marriott). A brand with no hotels in a place returns none there. Applies to locations; custom areas take Google's numeric brand ids.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nameInclude": {
            "title": "Name must contain",
            "type": "array",
            "description": "Case-insensitive substrings; keep hotels whose name contains any of them (e.g. [\"Hyatt\", \"Marriott\"]).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nameExclude": {
            "title": "Name must not contain",
            "type": "array",
            "description": "Case-insensitive substrings; drop hotels whose name contains any of them (e.g. [\"hostel\", \"capsule\"]).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyWithPrice": {
            "title": "Only hotels with a price",
            "type": "boolean",
            "description": "Drop properties Google shows without a price for these dates (sold out or not bookable through Google).",
            "default": false
          },
          "propertyTypes": {
            "title": "Property types",
            "enum": [
              "all",
              "hotels",
              "rentals"
            ],
            "type": "string",
            "description": "Google mixes hotels and vacation rentals in one map. Keep both, hotels only, or rentals only (decided from the entity id, so it is free).",
            "default": "all"
          },
          "sortBy": {
            "title": "Sort within area",
            "enum": [
              "price",
              "rating",
              "reviews",
              "name"
            ],
            "type": "string",
            "description": "The order hotels come back in within each area. Price, rating and review count are Google's own sorts, so they change which hotels are found as well as their order: with Price you get the cheapest Google has, not the cheapest of its default selection. Hotels with no price for these dates sort last.",
            "default": "price"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO code, e.g. USD, EUR, GBP, JPY. Prices are returned in this currency.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google interface language code, e.g. en, ja, de. Affects hotel names and the set of properties Google chooses to show.",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Google market code, e.g. us, jp, gb. The local market often lists more domestic properties: the same Tokyo box gave 160 hotels with jp and 102 with us.",
            "default": "us"
          },
          "priceStoreName": {
            "title": "Price memory store",
            "type": "string",
            "description": "Name of a key-value store. When set, the actor remembers each hotel's price for these dates, occupancy and currency, and on the next run adds previousPricePerNight, priceChange and priceChangePct to every result. Pair it with a schedule to watch a city's prices.",
            "default": ""
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed prices",
            "type": "boolean",
            "description": "Needs a price memory store. Skips hotels whose price is the same as last run. You are not charged for the ones skipped.",
            "default": false
          },
          "customAreas": {
            "title": "Custom areas (advanced)",
            "type": "array",
            "description": "Explicit areas instead of, or in addition to, place names. Either a bounding box {\"label\":\"Porto centre\",\"south\":41.122,\"west\":-8.627,\"north\":41.143,\"east\":-8.586} or a point with radius in km {\"label\":\"Kyoto Station\",\"lat\":34.9858,\"lng\":135.7588,\"radiusKm\":2}.",
            "default": []
          },
          "tiles": {
            "title": "Coverage",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How thoroughly to cover each area. 1 is a single pass, which Google caps at roughly 100 to 180 hotels; 3 covers a city; 5 covers a metro area. Higher values make more requests and take longer.",
            "default": 3
          },
          "expandFactor": {
            "title": "Viewport expand factor",
            "minimum": 0.1,
            "maximum": 10,
            "type": "number",
            "description": "Widen or narrow the area Google resolves for a place name. 1 keeps Google's own framing; 1.5 covers the suburbs too; below 1 tightens on the centre.",
            "default": 1.5
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 32,
            "type": "integer",
            "description": "How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.",
            "default": 32
          },
          "restartAttempt": {
            "title": "Restart attempt (internal)",
            "type": "integer",
            "description": "Set by the actor when it restarts itself in a fresh container after being refused. Leave it alone.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}