{
  "openapi": "3.0.1",
  "info": {
    "title": "Hotel Rate Parity Monitor: Who Undercuts Your Site",
    "description": "Check a hotel's rate parity on Google Hotels, date by date: which booking sites charge less than the hotel's own site, by how much, and the dates on which the hotel's own site is not listed. Scorecards per hotel and per site. Not affiliated with Google.",
    "version": "0.1",
    "x-build-id": "FK49gkwidgbPVpRQQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aleksandrbooking~google-hotels-rate-parity-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aleksandrbooking-google-hotels-rate-parity-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/aleksandrbooking~google-hotels-rate-parity-monitor/runs": {
      "post": {
        "operationId": "runs-sync-aleksandrbooking-google-hotels-rate-parity-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/aleksandrbooking~google-hotels-rate-parity-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-aleksandrbooking-google-hotels-rate-parity-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": "Hotels to check 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"
            }
          },
          "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 checked; 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 check, 1 to 200. Every hotel is read once for every check-in date, so twenty hotels for 14 dates is 280 rows.",
            "default": 20
          },
          "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 checks the same distance ahead.",
            "default": 1
          },
          "dates": {
            "title": "Check-in dates to check",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How many check-in dates to check, 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. 14 dates for 10 hotels is 140 rows.",
            "default": 14
          },
          "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. Google converts for booking sites that charge in another currency.",
            "default": "USD"
          },
          "country": {
            "title": "Country of sale",
            "type": "string",
            "description": "The country Google sells the stay in (a two-letter code: us, gb, de, ge). It decides which booking sites Google lists and at what price, so parity is a statement about guests of this country. Check the countries your guests come from in separate runs.",
            "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"
          },
          "minGapPercent": {
            "title": "Smallest gap that counts (%)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "A booking site is a breach when it charges at least this percent less than the hotel's own site for the same stay. 1 is the smallest; 2 is the default, which leaves out the rounding of prices that are the same in effect.",
            "default": 2
          },
          "alertGapPercent": {
            "title": "Alert on a gap of at least (%)",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "A date on which a site is at least this percent below the hotel's own raises the undercut alert. 0 raises it for every breach.",
            "default": 10
          },
          "alertNoOfficialOffer": {
            "title": "Alert when the hotel's own site is not listed",
            "type": "boolean",
            "description": "On: a date on which Google lists booking sites for the hotel but not the hotel's own site raises the no_official_offer alert. The hotel is then not bookable direct from Google for that date, whatever its prices.",
            "default": true
          },
          "customData": {
            "title": "Custom data",
            "type": "object",
            "description": "Any JSON. It is copied onto every row, so rows of different runs or clients 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}