{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper: Prices & OTA Offers",
    "description": "Scrape Google Hotels by city or hotel: prices from every provider (Booking.com, Expedia, Agoda, official site), ratings, amenities, price calendar and alerts.",
    "version": "1.0",
    "x-build-id": "7JBxbQrOCAIeKpCTg"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cylindrical_lighthouse~google-hotels/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cylindrical_lighthouse-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/cylindrical_lighthouse~google-hotels/runs": {
      "post": {
        "operationId": "runs-sync-cylindrical_lighthouse-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/cylindrical_lighthouse~google-hotels/run-sync": {
      "post": {
        "operationId": "run-sync-cylindrical_lighthouse-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": {
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "Places to search, written as you would type them into Google Hotels. Each entry returns up to 'Max hotels per destination' hotels, in Google's ranking order. Examples: \"Prague\", \"Lisbon, Portugal\", \"hotels near Eiffel Tower\", \"Shinjuku, Tokyo\", \"Miami Beach\". An unknown place fails with a clear message instead of returning unrelated hotels.",
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Specific hotels",
            "type": "array",
            "description": "Hotels to look up directly: a hotel name (with the city, for accuracy), a Google Hotels URL, or a hotel ID from a previous run's 'hotelId' field. Each hotel always includes every provider's offer. Examples: \"Hilton Prague Old Town\", \"https://www.google.com/travel/hotels/entity/ChcI0pn7x-CIitUxGgsvZy8xdGxzMWtkXxAB\", \"ChcI0pn7x-CIitUxGgsvZy8xdGxzMWtkXxAB\". Use this for a competitive set or rate-parity checks.",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "Check-in date, either absolute (YYYY-MM-DD, e.g. \"2026-11-10\") or relative to the day of the run (e.g. \"+14 days\", \"+2 weeks\", \"tomorrow\"). Relative dates suit scheduled runs. Must be today or later and at most 365 days ahead. Leave empty for 14 days from today."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay in nights (1–30). Check-out = check-in + nights. Example: 2.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Number of adult guests (1–12). Prices depend on occupancy. Example: 2.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "Age of each child at check-in, one number per child (0–17), at most 6 children. Leave empty for no children. Example: [5, 8] for two children aged 5 and 8.",
            "default": []
          },
          "maxHotelsPerDestination": {
            "title": "Max hotels per destination",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Stop after this many hotels for each destination (1–500). Google returns about 20 hotels per page, so higher numbers take more requests. Example: 20.",
            "default": 20
          },
          "includeOffers": {
            "title": "Include every provider's price (offers)",
            "type": "boolean",
            "description": "For destination results, also fetch each hotel's page with every booking provider's offer (Booking.com, Expedia, Agoda, the official site and 20–40 others), the address, phone, website and full amenities. Charged as an extra 'hotel-offers' event per hotel. Hotels listed under 'Specific hotels' always include offers. Example: true.",
            "default": false
          },
          "calendarDays": {
            "title": "Price calendar: number of check-in dates",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "0 = off. Otherwise, for every hotel, also check the lowest price for this many consecutive check-in dates starting at the check-in date, with the same number of nights, and add them as 'priceCalendar'. Each date is one 'calendar-price' event per hotel. Example: 30 for the next 30 check-in dates.",
            "default": 0
          },
          "monitorPrices": {
            "title": "Monitor price changes",
            "type": "boolean",
            "description": "Remember each price (per hotel, stay dates, guests, currency and provider) in a named key-value store and report what changed since the previous run in 'priceChanges'. Schedule the Actor (e.g. daily) with the same input to track rates over time. The first run records a baseline and reports no changes. No extra charge. Example: true.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[a-zA-Z0-9-]{1,63}$",
            "type": "string",
            "description": "Name of the key-value store that keeps the last seen prices. Use a different name for each independent watch list. Letters, digits and hyphens only. Example: \"prague-comp-set\".",
            "default": "google-hotels-price-monitor"
          },
          "minChangePercent": {
            "title": "Minimum change to report (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Ignore price moves smaller than this percentage (0–100). 0 reports every change. Example: 2.",
            "default": 0
          },
          "onlyChangedHotels": {
            "title": "Output only hotels whose price changed",
            "type": "boolean",
            "description": "With monitoring on, save only hotels that have at least one price change (or a new or removed provider). All hotels are still checked and charged. Example: false.",
            "default": false
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "AUD",
              "CAD",
              "CHF",
              "JPY",
              "CNY",
              "INR",
              "AED",
              "ALL",
              "DZD",
              "ARS",
              "AMD",
              "AWG",
              "AZN",
              "BSD",
              "BHD",
              "BYN",
              "BMD",
              "BAM",
              "BRL",
              "BGN",
              "XPF",
              "CLP",
              "COP",
              "CRC",
              "HRK",
              "CUP",
              "CZK",
              "DKK",
              "DOP",
              "EGP",
              "GEL",
              "HKD",
              "HUF",
              "ISK",
              "IDR",
              "IRR",
              "ILS",
              "JMD",
              "JOD",
              "KZT",
              "KWD",
              "LBP",
              "MKD",
              "MYR",
              "MXN",
              "MDL",
              "MAD",
              "TWD",
              "NZD",
              "NOK",
              "OMR",
              "PKR",
              "PAB",
              "PEN",
              "PHP",
              "PLN",
              "QAR",
              "RON",
              "RUB",
              "SAR",
              "RSD",
              "SGD",
              "ZAR",
              "KRW",
              "SEK",
              "THB",
              "TRY",
              "UAH",
              "VND"
            ],
            "type": "string",
            "description": "ISO 4217 currency code for all prices. Example: \"EUR\".",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,4})?$",
            "type": "string",
            "description": "Google interface language code (the 'hl' parameter). It affects hotel names, descriptions and amenity labels where Google translates them. Examples: \"en\", \"de\", \"es\", \"ja\", \"en-GB\".",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "pattern": "^[a-zA-Z]{2}$",
            "type": "string",
            "description": "Two-letter country code of the searcher (the 'gl' parameter). Google shows the offers available to users in that country. Examples: \"us\", \"gb\", \"de\", \"jp\".",
            "default": "us"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. The default (Apify datacenter proxy) worked for 100% of requests in our tests. Only change it if you know you need to.",
            "default": {
              "useApifyProxy": true
            }
          },
          "residentialFallback": {
            "title": "Fall back to residential proxy when blocked",
            "type": "boolean",
            "description": "If Google blocks several requests in a row on the datacenter proxy, switch to Apify residential proxy for the rest of the run. No extra charge to you. Only applies when the Apify proxy is used. Example: true.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of parallel requests to Google (1–20). Lower it if you see blocks. Example: 5.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}