{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper: OTA Prices & Calendar",
    "description": "Search a city or name hotels and get every booking site's price from Google Hotels: Booking.com, Expedia, Agoda, the hotel's own site and more, with cancellation terms, rating and address. Any currency, guests and country. Plain HTTP. Not affiliated with Google.",
    "version": "0.1",
    "x-build-id": "Fcuok1eK07GN1rhb1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aleksandrbooking~google-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aleksandrbooking-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/aleksandrbooking~google-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-aleksandrbooking-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/aleksandrbooking~google-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-aleksandrbooking-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": {
          "searchQueries": {
            "title": "Searches",
            "type": "array",
            "description": "What you would type into Google Hotels: \"hotels in Batumi\", \"5 star hotels in Lisbon\", \"hostels near Shinjuku\". Each search returns up to the number of hotels set below. Google lists about twenty hotels per request in a changing order, so the Actor asks a few times and keeps what is new; a big city gives about fifty to sixty hotels per text at most, and a more specific text (\"beach hotels in Batumi\") reaches others.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotels": {
            "title": "Hotels",
            "type": "array",
            "description": "Hotels to price by name, with the city: \"Hilton Batumi\", \"Hotel Adlon Kempinski Berlin\". Or paste a Google Hotels link of a hotel (the address that has /entity/ in it): it is exact and needs no lookup. A name that matches no hotel well enough is listed in FAILED_HOTELS with what Google offered, and is not charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "checkInDate": {
            "title": "Check-in date",
            "type": "string",
            "description": "YYYY-MM-DD. Leave empty to use \"Days ahead\" instead. Google prices stays up to about eleven months ahead."
          },
          "checkOutDate": {
            "title": "Check-out date",
            "type": "string",
            "description": "YYYY-MM-DD. Leave empty to use \"Nights\" after the check-in date."
          },
          "daysAhead": {
            "title": "Days ahead",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "Check-in this many days from today, when no check-in date is given. A scheduled run with this set always prices a stay the same distance away.",
            "default": 14
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many nights, when no check-out date is given.",
            "default": 2
          },
          "scanDays": {
            "title": "Check-in dates to price",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "A price calendar: how many check-in dates to price, starting with the check-in date (or Days ahead). Each date is a stay of \"Nights\" nights and gets its own row for every hotel, charged as one cheaper \"hotel date\" event (see the pricing of the Actor). 1 is a single stay. Up to 120. A calendar of 30 dates for 10 hotels is 300 rows. It needs every hotel page, so \"Price on every booking site\" is on for it whatever it is set to.",
            "default": 1
          },
          "scanStep": {
            "title": "Days between check-ins",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "The gap between the check-in dates of a calendar: 1 for every day, 7 for the same weekday every week.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Adults in the room. Prices are for the whole party, not per person.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children (ages)",
            "type": "array",
            "description": "One entry per child, the age in years: 4, 11. Up to five children.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "ALL",
              "DZD",
              "ARS",
              "AMD",
              "AWG",
              "AUD",
              "AZN",
              "BSD",
              "BHD",
              "BYN",
              "BMD",
              "BAM",
              "BRL",
              "GBP",
              "BGN",
              "CAD",
              "XPF",
              "CLP",
              "CNY",
              "COP",
              "CRC",
              "HRK",
              "CUP",
              "CZK",
              "DKK",
              "DOP",
              "EGP",
              "EUR",
              "GEL",
              "HKD",
              "HUF",
              "ISK",
              "INR",
              "IDR",
              "IRR",
              "ILS",
              "JMD",
              "JPY",
              "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",
              "CHF",
              "THB",
              "TRY",
              "UAH",
              "AED",
              "USD",
              "VND"
            ],
            "type": "string",
            "description": "The currency prices are given in. Google converts for booking sites that charge in another currency.",
            "default": "USD"
          },
          "country": {
            "title": "Country of sale",
            "type": "string",
            "description": "The two-letter country code Google sells the stay in: us, gb, de, ge. It decides which booking sites Google lists and what they charge, which is why the same hotel shows different offers in different countries. It is not the country of the hotel.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "en-GB",
              "de",
              "fr",
              "es",
              "it",
              "pt-BR",
              "pt-PT",
              "nl",
              "pl",
              "cs",
              "tr",
              "ru",
              "uk",
              "ja",
              "ko",
              "zh-CN",
              "zh-TW",
              "ar",
              "he",
              "th",
              "vi",
              "id",
              "sv",
              "da",
              "no",
              "fi",
              "el",
              "ro",
              "hu"
            ],
            "type": "string",
            "description": "The language of the texts Google returns: descriptions, labels, amenities.",
            "default": "en"
          },
          "maxHotelsPerSearch": {
            "title": "Hotels per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many hotels to collect for each search. Twenty is one page from Google; more takes more requests, and a text with fewer hotels than this simply returns them all. Hotels named under \"Hotels\" do not count against it.",
            "default": 20
          },
          "includeOffers": {
            "title": "Price on every booking site",
            "type": "boolean",
            "description": "On: one request per hotel to its Google page, which lists every booking site with its price, free-cancellation deadline and link. Off: only the lowest price each search card shows, which is much faster.",
            "default": true
          },
          "trackChanges": {
            "title": "Track price changes",
            "type": "boolean",
            "description": "Remember each hotel and check-in date in a store of your own account (google-hotels-price-memory) and, on the next run of the same kind of stay (same nights, guests, currency and country), say what changed: previousPrice, priceChange and priceChangePercent on every row, and a PRICE_CHANGES record with the moves, biggest drops first. Put the run on a schedule and read that record. Off by default: nothing is stored unless you turn it on.",
            "default": false
          },
          "offerPasses": {
            "title": "Reads of a hotel with few offers",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "Google leaves booking sites out of some answers, and a small hotel loses one now and then (Booking.com was missing from one answer in ten in a measured case). A hotel with fewer than twelve offers is read again, from another address, and the offers are merged; a read that adds nothing ends it. 1 reads every hotel once; 2 or 3 is slower and more complete for small hotels. Hotels with twelve or more offers are always read once.",
            "default": 2
          },
          "concurrency": {
            "title": "Requests in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many requests run at the same time, across the whole run. The default is gentle on Google and quick enough.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxies are the default and what this Actor is priced on. Apify residential groups are not available here; a run that asks for one is refused in the first seconds, before any hotel is charged. For your own proxies choose Custom proxies and supply them.",
            "default": {
              "useApifyProxy": true
            }
          },
          "dryRun": {
            "title": "Dry run (owner only)",
            "type": "boolean",
            "description": "Produce data without charging events. Honored only for runs started by the Actor owner; ignored for everyone else.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}