{
  "openapi": "3.0.1",
  "info": {
    "title": "HRS Hotel & Reviews Scraper",
    "description": "Scrape HRS.com hotels with every guest review — liked and disliked comments split apart, per-category scores, traveller segment, and the hotel's own published reply. Plus full profile: address, geo, stars, chain, contact email, amenities, images, sustainability. URL, ID, or all 181k hotels.",
    "version": "0.0",
    "x-build-id": "ziIFqvvwQCjQOab9N"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~hrs-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-hrs-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/memo23~hrs-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-hrs-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/memo23~hrs-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-hrs-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": {
          "startUrls": {
            "title": "HRS hotel URLs",
            "type": "array",
            "description": "Full HRS hotel page URLs in any language — https://www.hrs.com/en/hotel/391864, https://www.hrs.de/de/hotel/391864, and so on. All are normalized to the English page so results are consistent.",
            "items": {
              "type": "string"
            }
          },
          "hotelIds": {
            "title": "Hotel IDs",
            "type": "array",
            "description": "HRS hotel ids on their own, one per line — e.g. 10369. Handy when driving the actor from a spreadsheet or from a previous run's output.",
            "items": {
              "type": "string"
            }
          },
          "scrapeAll": {
            "title": "Scrape all hotels (sitemap)",
            "type": "boolean",
            "description": "Ignore the lists above and work through every hotel in HRS's public sitemap — about 181,000 properties. Always bounded by 'Maximum hotels to scrape', so set that first.",
            "default": false
          },
          "minStars": {
            "title": "Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only hotels with at least this many HRS stars. 0 = no minimum.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum guest rating (0-10)",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Keep only hotels whose overall guest rating is at or above this value. HRS rates on a 1-10 scale. 0 = no minimum.",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hotels with at least this many guest ratings. Useful for skipping the many small properties HRS lists that have never been rated. 0 = no minimum.",
            "default": 0
          },
          "onlyWithReviews": {
            "title": "Only hotels with written reviews",
            "type": "boolean",
            "description": "Keep only hotels that have at least one review with actual comment text. Most HRS properties have ratings but no written review, so switch this on if you are after review content specifically.",
            "default": false
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Keep only hotels in these countries. Accepts an ISO code or a name — DE, DEU, or Germany all work.",
            "items": {
              "type": "string"
            }
          },
          "chains": {
            "title": "Hotel chains",
            "type": "array",
            "description": "Keep only hotels belonging to these chains, e.g. Radisson, Accor, Motel One. Matched against both the chain and its parent group, so 'Radisson' also catches 'Radisson Hotel Group'.",
            "items": {
              "type": "string"
            }
          },
          "amenities": {
            "title": "Amenities (must have ALL)",
            "type": "array",
            "description": "Keep only hotels that have every amenity keyword listed, e.g. parking, sauna, wlan, pets, conference, wheelchair. Matched against the hotel's amenity codes and room amenities, case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "greenStayOnly": {
            "title": "Green Stay hotels only",
            "type": "boolean",
            "description": "Keep only hotels enrolled in HRS Green Stay, the sustainability programme that reports per-night carbon, water, and waste figures.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum hotels to scrape",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the number of hotels collected. Each hotel is one dataset item and includes all of its reviews, so this is also your billing cap.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many hotel pages to fetch at once. HRS responds in about a third of a second and does not rate-limit aggressively, so the default is comfortable; lower it if you see failures.",
            "default": 10
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional proxy. Leave unset to connect directly, which is the tested and fastest path."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}