{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Price Tracker: Calendar, Deals & Typical Range",
    "description": "Track a hotel's price on every booking site for each check-in date from Google Hotels: the lowest price, whether Google calls it low, typical or high for the dates, sold-out dates, price changes and alerts. Not affiliated with Google.",
    "version": "0.1",
    "x-build-id": "iCSOz3x87KCc21Tvf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aleksandrbooking~google-hotels-price-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aleksandrbooking-google-hotels-price-tracker",
        "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-price-tracker/runs": {
      "post": {
        "operationId": "runs-sync-aleksandrbooking-google-hotels-price-tracker",
        "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-price-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-aleksandrbooking-google-hotels-price-tracker",
        "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": "Hotels to track by name with the city (\"Hilton Batumi\") or by their Google Hotels link (the address that has /entity/ in it). A name that matches no hotel well enough is listed in FAILED_HOTELS and is not charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "myHotel": {
            "title": "Your hotel",
            "type": "string",
            "description": "Optional. Your hotel by name with the city or by its Google Hotels link. It is tracked with the others, and the run adds a COMPSET record that sets your price against the other hotels of the run on every date: their lowest, median and highest price, your rank and your rate index."
          },
          "searchQueries": {
            "title": "Searches",
            "type": "array",
            "description": "What you would type into Google Hotels: \"hotels in Batumi\", \"boutique hotels in Lisbon\". The first hotels Google lists for each text are tracked; set how many under \"Hotels per search\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxHotelsPerSearch": {
            "title": "Hotels per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many hotels of each search text to track, 1 to 200. Every hotel is read once for every check-in date, so ten hotels for 30 dates is 300 rows.",
            "default": 10
          },
          "checkInDate": {
            "title": "First 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."
          },
          "daysAhead": {
            "title": "Days ahead",
            "minimum": 0,
            "maximum": 330,
            "type": "integer",
            "description": "The first check-in is this many days from today, when no first check-in date is given. A scheduled run with this set always prices the same distance ahead.",
            "default": 1
          },
          "dates": {
            "title": "Check-in dates to track",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How many check-in dates to price, starting with the first one. Each date is a stay of \"Nights\" nights and is one row for every hotel, charged when it has a price. 1 to 120. A calendar of 30 dates for 10 hotels is 300 rows.",
            "default": 30
          },
          "stepDays": {
            "title": "Days between check-ins",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "The gap between the check-in dates: 1 for every day, 7 for the same weekday every week.",
            "default": 1
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many nights each stay lasts. One night gives the rate of the arrival date.",
            "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, and the target price and the typical range are 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"
          },
          "trackChanges": {
            "title": "Remember prices between runs",
            "type": "boolean",
            "description": "On: each hotel and check-in date is remembered in a store of your own account (google-hotels-tracker-memory) and, on the next run of the same kind of stay (same nights, guests, currency and country), every row says what changed: previousPrice, priceChange and priceChangePercent, and a PRICE_CHANGES record lists the moves, biggest drops first. A date that was priced and has no price now is reported as sold out once. Put the run on a schedule and read ALERTS.",
            "default": true
          },
          "targetPrice": {
            "title": "Target price per night",
            "minimum": 0,
            "type": "number",
            "description": "Optional, in the run's currency. A date priced at or below it raises the below_target alert."
          },
          "alertDropPercent": {
            "title": "Alert on a drop of at least (%)",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "A price that fell by at least this percent since the previous run raises the price_drop alert. 0 switches it off. Needs \"Remember prices between runs\".",
            "default": 10
          },
          "alertBelowUsualPercent": {
            "title": "Alert when below the usual price by (%)",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "A date whose label from Google says it is at least this percent below the usual price (\"19% less than usual\") raises the low_for_the_dates alert, in addition to the dates Google calls low. 0 leaves only Google's own call.",
            "default": 15
          },
          "includeOffers": {
            "title": "Every booking site's price in the rows",
            "type": "boolean",
            "description": "On: each row carries the offer of every booking site (price, total, free-cancellation deadline, link). Off: only the lowest price, the cheapest site, the hotel's own price and the other fields, which makes the rows much smaller. The hotel pages are read either way.",
            "default": true
          },
          "customData": {
            "title": "Custom data",
            "type": "object",
            "description": "Any JSON. It is copied onto every row, so rows of different runs can be told apart after merging."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}