{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper & Rate Monitor - Prices by Booking Site",
    "description": "Hotel prices from Google Hotels for any dates: price per booking site (Booking.com, Expedia, Agoda, hotel's own site…), lowest price, rating, reviews and stars. Monitor mode returns only price changes since the last run. Competitor rate shopping for hotels.",
    "version": "1.0",
    "x-build-id": "8yJN3VTYNzAaKfSak"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ivora~google-hotels-rate-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ivora-google-hotels-rate-monitor",
        "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/ivora~google-hotels-rate-monitor/runs": {
      "post": {
        "operationId": "runs-sync-ivora-google-hotels-rate-monitor",
        "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/ivora~google-hotels-rate-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-ivora-google-hotels-rate-monitor",
        "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": {
          "hotels": {
            "title": "Hotels",
            "type": "array",
            "description": "Hotel names with the city (e.g. 'Hotel Botanico Lisbon'), Google Hotels URLs (google.com/travel/hotels/entity/…) or entity keys. Names are matched to the first hotel Google lists; the matched name is in every row.",
            "items": {
              "type": "string"
            }
          },
          "destinations": {
            "title": "Destinations (optional)",
            "type": "array",
            "description": "Searches such as 'hotels in Lisbon' or 'hotels near Times Square'. The top hotels Google lists on the first run are saved and tracked on later runs (see 'Hotels per destination').",
            "items": {
              "type": "string"
            }
          },
          "maxHotelsPerDestination": {
            "title": "Hotels per destination",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many hotels from the top of each destination search are tracked (max 20, the first Google results page).",
            "default": 10
          },
          "includeVacationRentals": {
            "title": "Include vacation rentals",
            "type": "boolean",
            "description": "Destination searches also list apartments and holiday homes. Off = hotels only.",
            "default": false
          },
          "refreshDestinationHotels": {
            "title": "Refresh destination hotels",
            "type": "boolean",
            "description": "Google reorders destination results often (even minutes apart). By default the hotels picked on the first run are saved and re-checked on every run, so the monitor compares the same hotels. Turn on to re-pick the current top hotels.",
            "default": false
          },
          "checkInDates": {
            "title": "Check-in dates",
            "type": "array",
            "description": "Fixed stays as YYYY-MM-DD (uses 'Nights') or YYYY-MM-DD/YYYY-MM-DD for check-in/check-out. Leave empty to use rolling dates below.",
            "items": {
              "type": "string"
            }
          },
          "daysAhead": {
            "title": "Rolling: first check-in N days from today",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "Rolling dates move with each run, ideal for daily schedules: 0 = tonight, 7 = one week from the run date. Used when 'Rolling: number of check-in dates' > 0, or when no fixed dates are given (then one date).",
            "default": 7
          },
          "rollingDates": {
            "title": "Rolling: number of check-in dates",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "How many consecutive check-in dates to check, starting 'N days from today'. Example: daysAhead 1 + 14 dates = the next two weeks of arrivals.",
            "default": 0
          },
          "rollingStepDays": {
            "title": "Rolling: days between check-ins",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "1 = every day, 7 = same weekday each week.",
            "default": 1
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay for rolling dates and for fixed dates given without a check-out.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Guests per room.",
            "default": 2
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter code: USD, EUR, GBP, CAD, AUD… Google converts the prices.",
            "default": "USD"
          },
          "country": {
            "title": "Country (Google gl)",
            "type": "string",
            "description": "The market you see prices as (us, gb, de, fr…). It changes which booking sites appear and whether prices include taxes.",
            "default": "us"
          },
          "language": {
            "title": "Language (Google hl)",
            "type": "string",
            "description": "Interface language, e.g. en, de, es.",
            "default": "en"
          },
          "mode": {
            "title": "Output",
            "enum": [
              "changes",
              "allPrices"
            ],
            "type": "string",
            "description": "changes = full price rows the first time a hotel + date is checked, then only change rows (old/new/delta per site). allPrices = a full row per hotel and date on every run, plus change rows.",
            "default": "changes"
          },
          "changeTypes": {
            "title": "Change types",
            "type": "array",
            "description": "Which change rows to output. All changes are counted in the free rows anyway. New / removed booking sites are off by default because small meta-search sites come and go.",
            "items": {
              "type": "string",
              "enum": [
                "priceChange",
                "lowestPriceChange",
                "soldOut",
                "backAvailable",
                "newSite",
                "siteRemoved"
              ],
              "enumTitles": [
                "Price change on a booking site",
                "Lowest price / cheapest site changed",
                "Sold out (no prices any more)",
                "Back available",
                "New booking site listed",
                "Booking site no longer listed"
              ]
            },
            "default": [
              "priceChange",
              "lowestPriceChange",
              "soldOut",
              "backAvailable"
            ]
          },
          "minChangePct": {
            "title": "Minimum change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Ignore price moves smaller than this percentage.",
            "default": 0
          },
          "minChangeAmount": {
            "title": "Minimum change (amount)",
            "minimum": 0,
            "type": "integer",
            "description": "Ignore price moves smaller than this amount in your currency.",
            "default": 0
          },
          "sitesFilter": {
            "title": "Only these booking sites",
            "type": "array",
            "description": "Optional: track only sites whose name contains one of these words, e.g. booking.com, expedia, agoda, official (the hotel's own website). Empty = all sites.",
            "items": {
              "type": "string"
            }
          },
          "includeSponsored": {
            "title": "Include sponsored offers",
            "type": "boolean",
            "description": "Google shows a few paid ('Sponsored') offers above the list. They are labelled isSponsored.",
            "default": true
          },
          "includeLinks": {
            "title": "Include booking links",
            "type": "boolean",
            "description": "Add each site's booking link (deep link with your dates) to the price list.",
            "default": true
          },
          "stateStoreName": {
            "title": "Monitor state store name",
            "type": "string",
            "description": "Named key-value store that remembers the last prices. Use a different name for each independent monitor (a-z, 0-9, -).",
            "default": "google-hotels-rate-monitor-state"
          },
          "maxConcurrency": {
            "title": "Hotels in parallel",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many hotels are checked at the same time.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify datacenter proxy works for Google Hotels in our tests and is the default.",
            "default": {
              "useApifyProxy": true
            }
          },
          "residentialFallback": {
            "title": "Residential proxy fallback",
            "type": "boolean",
            "description": "If Google keeps showing a captcha, switch to Apify residential proxy (slower; off by default).",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}