{
  "openapi": "3.0.1",
  "info": {
    "title": "Zoover Reviews Scraper — Hotel Guest Reviews & Ratings",
    "description": "Every Zoover.nl guest review of any hotel, campsite or apartment: the 1-10 score, title, full Dutch review text, per-aspect scores, travel party, travel date, reviewer and the owner's reply. Give Zoover accommodation URLs or ids. No browser, no login. Pay per review.",
    "version": "1.0",
    "x-build-id": "h4dEvRyek6zRlFXzz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kestrel~zoover-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kestrel-zoover-reviews-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/kestrel~zoover-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-kestrel-zoover-reviews-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/kestrel~zoover-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-kestrel-zoover-reviews-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": "Zoover accommodation URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Accommodation pages on Zoover, e.g. https://www.zoover.nl/a/91488/esperos-blue-village-spa — only the number after /a/ counts, the slug does not have to be right. Any query string is fine.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "accommodationIds": {
            "title": "Zoover accommodation ids",
            "uniqueItems": true,
            "type": "array",
            "description": "The number in /a/<number>/… (Zoover calls it the heliosId), e.g. 91488 — or the internal accommodation id (uuid) an earlier run put in accommodation_id, e.g. 9c471493-27a9-4dfc-a0e5-60ec206b3b62. A uuid is the fastest path: it is the key the review API takes, so the run skips the page read (and, having no page, gets no accommodation row).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerAccommodation": {
            "title": "Max reviews per accommodation",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "0 = every review the property has (50 per request; Zoover properties rarely hold more than a few dozen, so 0 is normally right and cheap). N = the newest N. The main cost control.",
            "default": 0
          },
          "maxRating": {
            "title": "Only reviews scoring at or below this",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "0 = keep every review. 1-10 = keep only reviews whose overall score is that number or lower — 6 gives a complaints feed on Zoover's 1-10 scale (10 is best). Filtered reviews are never charged.",
            "default": 0
          },
          "minRating": {
            "title": "Only reviews scoring at or above this",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "0 = keep every review. 1-10 = keep only reviews whose overall score is that number or higher — 9 gives the testimonials. Combine with the maximum for a band (e.g. 5 to 7). Filtered reviews are never charged.",
            "default": 0
          },
          "requireText": {
            "title": "Only reviews with a written text",
            "type": "boolean",
            "description": "Drop score-only reviews before billing. Zoover reviews almost always carry text, so this rarely removes much.",
            "default": false
          },
          "sinceDate": {
            "title": "Only reviews published on or after",
            "type": "string",
            "description": "YYYY-MM-DD, or relative so schedules never go stale: \"30 days\", \"6 months\", \"2 years\". Reviews come newest first, so the run stops paging once a whole page predates the date. Empty = no date limit.",
            "default": ""
          },
          "includeAccommodationRow": {
            "title": "Include an accommodation row",
            "type": "boolean",
            "description": "Also emit one free row per property with its ids, name, star rating, the Zoover guest rating and review count, the seven aspect ratings, its place, chain, address and contact details, plus this run's tally of reviews per score and per travel party. Never charged.",
            "default": true
          },
          "sessions": {
            "title": "Parallel sessions",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many Apify Proxy sessions (egress IPs) run in parallel. More is faster; each is paced separately.",
            "default": 2
          },
          "perIp": {
            "title": "Requests per second per session",
            "minimum": 0.1,
            "maximum": 3,
            "type": "number",
            "description": "Pace for each session. Zoover serves 1 request/s per IP steadily (10 of 10 accommodation pages in a paced probe); raising it causes rotations, not speed.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy with the default datacenter group is enough: Zoover's Cloudflare gate reads the TLS fingerprint, not the IP, and this actor's client passes it. Residential works too but costs more. Keep the default.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}