{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper — Prices by Date, All Booking Sites",
    "description": "Google Hotels prices for any city or hotel and your dates, guests and currency. Every booking site's offer with total, taxes and free cancellation, plus stars, rating, amenities, address and map point. Price-watch mode returns only changed prices.",
    "version": "0.1",
    "x-build-id": "i15IPe6kVkAlUxKoJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dottti~google-hotels-prices/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dottti-google-hotels-prices",
        "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/dottti~google-hotels-prices/runs": {
      "post": {
        "operationId": "runs-sync-dottti-google-hotels-prices",
        "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/dottti~google-hotels-prices/run-sync": {
      "post": {
        "operationId": "run-sync-dottti-google-hotels-prices",
        "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": {
          "searches": {
            "title": "Cities or areas",
            "type": "array",
            "description": "Places to search, the same as typing into Google Hotels. Examples: Dubai, Riyadh, Makkah, Downtown Dubai, London, hotels near Kingdom Centre Riyadh. Each entry becomes its own search with its own status row.",
            "default": [
              "Dubai"
            ],
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Hotel URLs (optional)",
            "type": "array",
            "description": "Google Hotels pages of single hotels, for example https://www.google.com/travel/hotels/entity/ChYIxZWB1JjIlsoFGgovbS8wMnI5aDBqEAE . A bare hotel id (starts with Ch) also works. Use this to track a fixed list of hotels.",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Format YYYY-MM-DD. Leave empty to use 'Check-in in N days' below, which is best for daily schedules."
          },
          "checkOut": {
            "title": "Check-out date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Format YYYY-MM-DD. Leave empty to use the number of nights below."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "Used when Check-in date is empty. 14 means two weeks from the day the run starts. A daily schedule then always tracks the same distance ahead.",
            "default": 14
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay, used when Check-out date is empty.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Adults in one room.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "One age per child, 0 to 17. Example: [5, 9] for two children. Prices change with children because sites price per guest.",
            "default": []
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter code. Examples: USD, SAR, AED, QAR, KWD, BHD, OMR, EUR, GBP.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google interface language, for example en or ar. It changes hotel names and descriptions where Google has a translation. Amenity names are in English.",
            "default": "en"
          },
          "country": {
            "title": "Country (Google region)",
            "type": "string",
            "description": "2-letter Google region code, for example us, sa, ae, gb. Booking sites can show different prices by country. The proxy location also affects this.",
            "default": "us"
          },
          "maxHotelsPerSearch": {
            "title": "Max hotels per search",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Google shows about 18 new hotels per page. Large cities have several hundred.",
            "default": 20
          },
          "includeOffers": {
            "title": "Include prices from every booking site",
            "type": "boolean",
            "description": "On: each hotel row lists every booking site Google shows (the hotel's own site, Booking.com, Agoda, Expedia and others) with nightly price, stay total with taxes and fees, and free cancellation. Also adds address and phone. Off: faster, only the lowest price per hotel.",
            "default": true
          },
          "offerRows": {
            "title": "Also output one row per booking-site offer",
            "type": "boolean",
            "description": "Adds a separate row per hotel and booking site, easy to load into a spreadsheet. These rows are charged as 'offer' events. Offers stay inside the hotel row either way.",
            "default": false
          },
          "includeBookingLinks": {
            "title": "Include booking links",
            "type": "boolean",
            "description": "Google redirect links to each booking site. They are long. Turn off to keep files small.",
            "default": true
          },
          "minHotelClass": {
            "title": "Minimum star class",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "0 = any. 4 keeps 4- and 5-star hotels.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "0 = any. Google ratings run from 1 to 5.",
            "default": 0
          },
          "maxNightlyPrice": {
            "title": "Maximum nightly price",
            "minimum": 0,
            "type": "number",
            "description": "0 = any. In the currency above, taxes and fees included.",
            "default": 0
          },
          "includeUnpriced": {
            "title": "Include hotels with no price for these dates",
            "type": "boolean",
            "description": "Sold-out or unpriced hotels are skipped by default. On: they are output free of charge with priceStatus set.",
            "default": false
          },
          "onlyChanged": {
            "title": "Price watch: only output changed prices",
            "type": "boolean",
            "description": "Compares each hotel and stay with the previous run of the same watch list. Only new hotels and changed prices are output and charged. Each row carries priceWatch with the old and new values.",
            "default": false
          },
          "watchListName": {
            "title": "Watch list name",
            "type": "string",
            "description": "Name for the saved price state, for example dubai-weekend. Runs with the same name compare against each other. Empty: a name is made from your searches, hotels, guests and currency. Setting a name also adds priceWatch to every row."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave empty for the automatic ladder: no proxy first, then Apify datacenter, then Apify residential only if Google keeps refusing. Pick a residential country to see prices for that market."
          },
          "autoProxyFallback": {
            "title": "Automatic proxy fallback",
            "type": "boolean",
            "description": "Move to the next proxy tier when Google keeps refusing.",
            "default": true
          },
          "allowResidentialFallback": {
            "title": "Allow residential proxy as last step",
            "type": "boolean",
            "description": "Residential proxy is the most reliable tier.",
            "default": true
          },
          "concurrency": {
            "title": "Parallel hotel lookups",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Hotel price lookups in flight at once. Requests still start at least the delay below apart.",
            "default": 4
          },
          "requestDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 100,
            "maximum": 30000,
            "type": "integer",
            "description": "Minimum gap between request starts.",
            "default": 400
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Attempts per request before a search or hotel is marked failed. Each retry waits longer and may switch session or proxy tier.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}