{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper: Prices, OTA Rates, Ratings & Amenities",
    "description": "Scrape Google Hotels for any destination and dates: nightly and total prices with taxes, the full price ladder per hotel (Booking.com, Expedia, Agoda, official site and more with direct links), ratings, reviews, amenities, address, phone and location. No login, no browser.",
    "version": "0.1",
    "x-build-id": "tK0gPxCb7R7gHRImh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/varnmill~google-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-varnmill-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/varnmill~google-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-varnmill-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/varnmill~google-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-varnmill-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "hotels"
            ],
            "type": "string",
            "description": "'search' returns the hotels Google lists for each query, with the lowest price. 'hotels' opens specific hotels (Google Hotels URLs, hotel IDs or hotel names) and returns every booking site's price for each.",
            "default": "search"
          },
          "queries": {
            "title": "Search queries (search mode)",
            "type": "array",
            "description": "What you would type into Google Hotels, for example 'hotels in Paris', 'Tokyo Shinjuku', 'resorts in Cancun' or 'pet friendly hotels in Austin'. One result list per query and date.",
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Hotels (hotels mode)",
            "type": "array",
            "description": "Google Hotels URLs (anything containing /entity/...), hotel IDs from a previous run (the 'hotelId' field), or plain hotel names with a city such as 'Ritz Paris'. Names are matched to Google's first result; check 'matchedName' in the output.",
            "items": {
              "type": "string"
            }
          },
          "checkInDate": {
            "title": "Check-in date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Check-in date (YYYY-MM-DD). Leave empty to use 'Days from today', which keeps scheduled runs pointing at a future date."
          },
          "checkOutDate": {
            "title": "Check-out date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Check-out date (YYYY-MM-DD). Used only with a single check-in date; otherwise 'Nights' decides the stay length."
          },
          "checkInDates": {
            "title": "More check-in dates (price calendar)",
            "type": "array",
            "description": "Extra check-in dates (YYYY-MM-DD) to price the same queries or hotels across several dates in one run, each for 'Nights' nights. Useful for rate shopping and price calendars.",
            "items": {
              "type": "string"
            }
          },
          "daysFromToday": {
            "title": "Days from today",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "When no check-in date is set, check in this many days after the run date (0 = today).",
            "default": 14
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay in nights when no check-out date is given.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Number of adult guests (prices change with occupancy).",
            "default": 2
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code for all prices, for example USD, EUR, GBP, JPY, AUD.",
            "default": "USD"
          },
          "maxHotelsPerQuery": {
            "title": "Max hotels per query (search mode)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Stop after this many hotels for each query and date. Google shows about 20 per page; the actor pages through as needed.",
            "default": 20
          },
          "includeOtaPrices": {
            "title": "Include price ladder per hotel (search mode)",
            "type": "boolean",
            "description": "Also open each hotel's page and add every booking site's price (Booking.com, Expedia, Agoda, official site...) with direct links, plus address and phone. Charged as an extra 'ota-prices' event per hotel. Always on in hotels mode.",
            "default": false
          },
          "minRating": {
            "title": "Minimum guest rating",
            "enum": [
              "0",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Skip hotels rated below this (Google's 1 to 5 guest rating). Skipped hotels are not charged.",
            "default": "0"
          },
          "minStars": {
            "title": "Minimum hotel class (stars)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Skip hotels below this star class (0 = any). Vacation rentals have no class and are skipped when this is above 0.",
            "default": 0
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Skip hotels whose nightly price before taxes is above this, in the chosen currency (0 = no limit). Hotels without a price for your dates are skipped when this is set.",
            "default": 0
          },
          "excludeVacationRentals": {
            "title": "Exclude vacation rentals",
            "type": "boolean",
            "description": "Google mixes vacation rentals into hotel results; tick to keep hotels only.",
            "default": false
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google interface language code (hl), for example en, fr, de, es, ja. Affects hotel descriptions and labels.",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code (gl) for the market Google prices for, for example us, gb, de, au. Booking sites and prices can differ by market.",
            "default": "us"
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many Google pages to load at the same time. Keep low (2 to 4) to avoid rate limits.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed in most cases: the actor connects directly and switches to the Apify datacenter proxy on its own if Google rate-limits it. Set a proxy here to force one.",
            "default": {
              "useApifyProxy": false
            }
          },
          "autoProxyFallback": {
            "title": "Automatic proxy fallback",
            "type": "boolean",
            "description": "Switch to the Apify datacenter proxy automatically when Google refuses direct requests.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}