{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper & Price Tracker",
    "description": "Google Hotels scraper and hotel price tracker: Google Hotels prices for any destination and dates — lowest price per night and for the stay with taxes, every booking site's rate with direct links (rate parity), class, rating, reviews, amenities, location. One flat row per hotel, no personal data.",
    "version": "0.1",
    "x-build-id": "0Ueafj1qzVgfxhPlS"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~google-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-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/myth84~google-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-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/myth84~google-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-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",
            "maxItems": 50,
            "type": "array",
            "description": "One search per line, typed as on Google Hotels: a destination with the word hotels, e.g. <code>hotels in Paris</code>, <code>hotels near Times Square</code>. Each is its own search with the same stay and currency, and <b>maxResults applies to each</b>. A hotel name gives no list: use hotelUrls. Up to 50. Optional: with no search, no URL and no hotel at all, the Actor searches hotels in Lisbon.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Google Hotels search URLs",
            "maxItems": 50,
            "type": "array",
            "description": "Google Hotels search URLs copied from your browser (<code>https://www.google.com/travel/search?q=…&ts=…</code>), one search each, read locally and never opened: the search text (q), the dates, travellers and currency (ts) and the language and market (hl, gl) win over the form, which fills in the rest. Filters of the page are ignored and listed in the log. Default empty: search by text.",
            "items": {
              "type": "string",
              "pattern": "^https?:\\/\\/(?:www\\.)?google\\.[a-z]{2,3}(?:\\.[a-z]{2})?\\/travel\\/search\\?"
            },
            "default": []
          },
          "hotelUrls": {
            "title": "Hotels (URLs or ids)",
            "maxItems": 500,
            "type": "array",
            "description": "Precise hotels, one per line: a Google Hotels hotel URL containing /entity/, e.g. <code>https://www.google.com/travel/hotels/entity/ChkIhLCQwvjO2IYWGg0vZy8xMXE0bTZieDkyEAE</code>, or the bare entity id (<code>ChkI…</code>). Each one comes with the rate of every booking site for the stay of the form. Up to 500. Default empty: no precise hotel.",
            "items": {
              "type": "string",
              "pattern": "^(https?:\\/\\/(www\\.)?google\\.[a-z.]+\\/travel\\/.*entity\\/C[A-Za-z0-9_-]{15,}.*|C[A-Za-z0-9_-]{15,})$"
            },
            "default": []
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-in date, YYYY-MM-DD, e.g. <code>2026-12-01</code>, given with checkOut. Leave both empty for a stay relative to today (checkInDaysFromNow and nights), better for schedules: fixed dates expire."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-out date, YYYY-MM-DD, after checkIn and at most 30 nights later, e.g. <code>2026-12-04</code>. Required when checkIn is set."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Without fixed dates: check-in this many days after today (UTC), e.g. <code>7</code> for next week. Default 30: a month ahead, a typical booking window, and the stay moves with each scheduled run so it never expires.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Without fixed dates: length of the stay in nights, 1 to 30. Default 3: a typical city break.",
            "default": 3
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Number of adults, 1 to 6 (Google Hotels prices up to 6); prices depend on it. Default 2: the most searched occupancy.",
            "default": 2
          },
          "childAges": {
            "title": "Children's ages",
            "maxItems": 6,
            "type": "array",
            "description": "Age of each child, 0 to 17, as a JSON list, e.g. <code>[8]</code> for one child of 8 or <code>[3, 12]</code> for two; prices depend on it. Up to 6 children. Default empty: no child.",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 17
            },
            "default": []
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "ISO 4217 code of every price, e.g. <code>USD</code>, <code>EUR</code> or <code>JPY</code>; pick one or type any code Google Hotels lists (USD and EUR validated). The currency does not depend on the proxy country. Default USD: the currency of our validation runs.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,4})?$",
            "type": "string",
            "description": "Google language code (hl) of the class labels, deal notes and rental amenities, e.g. <code>en</code>, <code>fr</code>, <code>de</code>; hotel names keep their own language and hotel amenities stay in English. Type the searches in that language. Default en: English, validated with fr and de.",
            "default": "en"
          },
          "country": {
            "title": "Market",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Google country code (gl) of the market, e.g. <code>us</code>, <code>fr</code>, <code>de</code>: the country whose Google Hotels you read (offers and booking sites may differ by market). Default us: United States, validated with fr and de.",
            "default": "us"
          },
          "maxResults": {
            "title": "Maximum hotels per search",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Maximum number of hotels saved and charged for each search (each search text and each search URL), 1 to 300; Google returns 20 per request. With price monitoring it is the number compared. Default 60: three pages of results, enough to compare a city. The form prefills 20 for a quick first run (our daily check).",
            "default": 60
          },
          "includeVacationRentals": {
            "title": "Include vacation rentals",
            "type": "boolean",
            "description": "Also keep the vacation rentals Google Hotels mixes into the results (about one result in ten: apartments, houses), as entire places with their capacity. Default off: hotels, hostels and guest houses only.",
            "default": false
          },
          "includeOffers": {
            "title": "Include every booking site's rate",
            "type": "boolean",
            "description": "Add the rates of every booking site to each hotel row (offers, cheapestOfferSite, officialSitePriceTotal…): one more request per hotel, so runs are slower, at no extra charge. Always on for hotelUrls. Default off: the lowest price only.",
            "default": false
          },
          "maxOffersPerHotel": {
            "title": "Booking sites per hotel",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Keep only the N cheapest booking sites in the offers column of each row, e.g. <code>5</code>; offerCount and the parity columns still count all of them. 0 keeps them all. Default 0: every booking site (usually 15 to 25).",
            "default": 0
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep only the hotels that a booking site shown by Google sells with free cancellation; cancellationPolicy then gives the deadline, e.g. <code>free_cancellation_until:2026-11-18</code>. Applied by the Actor on the booking-site rates: turns includeOffers on (one more request per hotel), and the hotels left out are never charged. Default off: every hotel.",
            "default": false
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Compare the total price of each hotel (taxes and fees included) with the one recorded by your previous run of the same search, and fill changeType, previousPrice and priceDelta. maxResults is then the number of hotels compared. Default off: a plain search.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Key-value store of your account that keeps the previous prices, one record per search, e.g. <code>google-hotels-paris-daily</code>. Letters, digits and dashes, up to 63 characters. Default google-hotels-price-monitor: one store for all your monitoring runs.",
            "default": "google-hotels-price-monitor"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With monitorPrices: save and charge only the new hotels and the price changes (price drop alerts); a run without any change succeeds with an empty dataset. Default off: every compared hotel is saved with its changeType.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies of the requests. Default: Apify datacenter proxies (automatic group), the configuration validated for Google Hotels, included in the price: keep it. Your own proxy URLs are accepted.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Safety cap on requests for the whole run, retries included: one per page of 20 hotels, plus one per hotel with includeOffers or hotelUrls. Default 500: enough for 5 searches of 60 hotels with every booking site.",
            "default": 500
          },
          "concurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Requests in flight at the same time for the booking-site rates and hotelUrls, 1 to 5 (the pages of one search run one after the other). Default 3: the pace of our validation runs.",
            "default": 3
          },
          "delayMs": {
            "title": "Delay between requests",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause after each request of a search or of a parallel slot, in milliseconds (retries have their own growing pause); 0 disables it. Default 300: a light pace.",
            "default": 300
          },
          "debugStoreResponses": {
            "title": "Store raw responses",
            "type": "boolean",
            "description": "Debugging only: save every raw response (refused attempts included) in the run's key-value store. Default off: it uses storage.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}