{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper — Prices & Booking Site Comparison",
    "description": "Google Hotels prices for any city or hotel and dates: nightly and total price, star class, rating, reviews, amenities, coordinates and links, plus optional Booking.com / Expedia / official-site price comparison and date-by-date price tracking. Pay only for hotels with prices.",
    "version": "0.1",
    "x-build-id": "9SbWbhz8VhrnOJGpV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/griffie~google-hotels-prices-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-griffie-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/griffie~google-hotels-prices-scraper/runs": {
      "post": {
        "operationId": "runs-sync-griffie-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/griffie~google-hotels-prices-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-griffie-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": {
          "locations": {
            "title": "Cities or areas",
            "type": "array",
            "description": "One place per line: a city, neighbourhood, airport or landmark, e.g. <code>Lisbon, Portugal</code>, <code>Shibuya, Tokyo</code>, <code>near JFK airport</code>. Each place × stay is one search; results are paginated up to <b>Max hotels per location</b>. Unrecognised places return an <code>invalid</code> status row and are never charged.",
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Hotels to price-check (names or Google Hotels links)",
            "type": "array",
            "description": "Optional. One hotel per line: a name (add the city for precision, e.g. <code>Avenida Palace, Lisbon</code>), a Google Hotels link (<code>google.com/travel/hotels/…/entity/…</code>) or an entity id. Each hotel × stay returns one row with every booking site's price (Booking.com, Expedia, the official site…).",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "YYYY-MM-DD. Defaults to 14 days from today. Past dates are rejected (Google would silently swap in its own dates)."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "YYYY-MM-DD. Defaults to check-in + <b>Nights</b>. Max 30 nights."
          },
          "dateRangeEnd": {
            "title": "Repeat for every check-in date until (date range)",
            "type": "string",
            "description": "Optional. Turns the run into a date sweep: one stay of <b>Nights</b> nights for every check-in date from <b>Check-in date</b> to this date (every <b>Step</b> days). Use it to track a hotel's or a city's prices across a month. Max 90 stays per run."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of each stay when Check-out is empty or a date range is used.",
            "default": 1
          },
          "dateStepDays": {
            "title": "Step between check-in dates (days)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Only used with a date range: 1 = every day, 7 = same weekday every week.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Number of adults. Prices are for the whole party.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "Optional. One age per line (0–17), e.g. <code>4</code> and <code>9</code> for two children.",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter ISO code: USD, EUR, GBP, JPY, AUD, CAD, INR, …",
            "default": "USD"
          },
          "country": {
            "title": "Market (Google country)",
            "type": "string",
            "description": "2-letter country code of the Google market to price from (gl), e.g. <code>us</code>, <code>gb</code>, <code>de</code>. Booking sites and taxes shown can differ by market.",
            "default": "us"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "hotels",
              "vacation_rentals"
            ],
            "type": "string",
            "description": "Hotels or vacation rentals (Google Hotels \"Vacation rentals\" tab).",
            "default": "hotels"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "lowest_price",
              "highest_rating",
              "most_reviewed"
            ],
            "type": "string",
            "description": "Same as the Sort menu on Google Hotels.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "In the selected currency. Leave empty for no minimum."
          },
          "maxPrice": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "In the selected currency. Leave empty for no maximum."
          },
          "hotelClass": {
            "title": "Hotel class (stars)",
            "type": "array",
            "description": "Optional. Only hotels with these star ratings.",
            "items": {
              "type": "string",
              "enum": [
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "2-star",
                "3-star",
                "4-star",
                "5-star"
              ]
            }
          },
          "minRating": {
            "title": "Minimum guest rating",
            "enum": [
              "any",
              "3.5",
              "4.0",
              "4.5"
            ],
            "type": "string",
            "description": "Only hotels rated at least this on Google.",
            "default": "any"
          },
          "amenities": {
            "title": "Required amenities",
            "type": "array",
            "description": "Optional. Only hotels offering all selected amenities.",
            "items": {
              "type": "string",
              "enum": [
                "free_wifi",
                "free_breakfast",
                "free_parking",
                "pool",
                "indoor_pool",
                "outdoor_pool",
                "fitness_center",
                "restaurant",
                "bar",
                "spa",
                "beach_access",
                "kid_friendly",
                "pet_friendly",
                "room_service",
                "air_conditioning",
                "all_inclusive",
                "wheelchair_accessible",
                "ev_charger"
              ],
              "enumTitles": [
                "Free Wi-Fi",
                "Free breakfast",
                "Free parking",
                "Pool",
                "Indoor pool",
                "Outdoor pool",
                "Fitness center",
                "Restaurant",
                "Bar",
                "Spa",
                "Beach access",
                "Kid friendly",
                "Pet friendly",
                "Room service",
                "Air conditioning",
                "All inclusive",
                "Wheelchair accessible",
                "EV charger"
              ]
            }
          },
          "freeCancellation": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Only offers with free cancellation.",
            "default": false
          },
          "maxResultsPerLocation": {
            "title": "Max hotels per location",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Google returns ~18–20 hotels per page; the Actor pages until this many are collected or the results run out.",
            "default": 40
          },
          "includeHotelsWithoutPrice": {
            "title": "Include hotels without a price (free rows)",
            "type": "boolean",
            "description": "Google also lists sold-out / unbookable hotels. They are saved with status <code>no_price</code> and are <b>never charged</b>. Turn off to keep only priced hotels.",
            "default": true
          },
          "excludeVacationRentals": {
            "title": "Hotels only (drop vacation rentals)",
            "type": "boolean",
            "description": "Google mixes some vacation rentals (apartments, condos) into hotel results, especially when amenity filters are used. Turn on to drop them. Skipped rentals are not saved and not charged. Every row also has <code>propertyKind</code> (<code>hotel</code> or <code>vacation_rental</code>).",
            "default": false
          },
          "includeOtaPrices": {
            "title": "Add booking-site price comparison to search results",
            "type": "boolean",
            "description": "For the first <b>Max hotels with price comparison</b> hotels of each search, also fetch every booking site's price (Booking.com, Expedia, Hotels.com, the official site…) with direct booking links. Charged as a separate <code>hotel-prices</code> event only when at least one site has a price.",
            "default": false
          },
          "maxOtaHotelsPerLocation": {
            "title": "Max hotels with price comparison (per location)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Caps the price-comparison lookups per search to control cost.",
            "default": 10
          },
          "dedupeHotels": {
            "title": "Remove duplicate hotels across locations",
            "type": "boolean",
            "description": "When locations overlap (e.g. \"Manhattan\" and \"New York\"), keep each hotel once per stay. Duplicates are never charged.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel searches. Higher is faster but more likely to be rate-limited.",
            "default": 4
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Blocked or failed requests are retried on a fresh IP; failed searches get one more pass at the end of the run.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Default Apify datacenter proxy works for most runs; the Actor switches to RESIDENTIAL automatically if Google starts blocking.",
            "default": {
              "useApifyProxy": true
            }
          },
          "fallbackToResidential": {
            "title": "Fall back to residential proxy when blocked",
            "type": "boolean",
            "description": "Recommended. Only used when the selected proxy keeps getting blocked.",
            "default": true
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Verbose logging.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}