{
  "openapi": "3.0.1",
  "info": {
    "title": "HolidayCheck Reviews Scraper - German Hotel Ratings & Trends",
    "description": "Scrape German hotel reviews from HolidayCheck: guest reviews & ratings, verified-stay flags, hotel review sentiment by aspect, monthly trends, anomaly alerts and hotel reputation analytics for DACH hotels.",
    "version": "0.4",
    "x-build-id": "gRieJtxE53b39jygx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kamerozkan~holidaycheck-review-intelligence/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kamerozkan-holidaycheck-review-intelligence",
        "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/kamerozkan~holidaycheck-review-intelligence/runs": {
      "post": {
        "operationId": "runs-sync-kamerozkan-holidaycheck-review-intelligence",
        "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/kamerozkan~holidaycheck-review-intelligence/run-sync": {
      "post": {
        "operationId": "run-sync-kamerozkan-holidaycheck-review-intelligence",
        "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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "HolidayCheck hotel or review URLs",
            "type": "array",
            "description": "Direct HolidayCheck hotel, review, offer, media, or contribution URLs. Multiple hotels are supported. Billing is per delivered review row; with cross-run deduplication enabled, already-seen reviews are not re-emitted and not re-billed.",
            "default": [
              {
                "url": "https://www.holidaycheck.de/hr/bewertungen-pickalbatros-dana-beach-resort-hurghada/1aa4c4ad-f9ea-3367-a163-8a3a6884d450"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "collectionMode": {
            "title": "Collection mode",
            "enum": [
              "all",
              "limit",
              "since"
            ],
            "type": "string",
            "description": "All ignores the row limit and walks every available page. Limit returns at most the configured count. Since stops at the date boundary.",
            "default": "limit"
          },
          "maxReviewsPerHotel": {
            "title": "Maximum reviews per hotel",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Used only in Limit mode. A limited run leaves a resumable checkpoint.",
            "default": 100
          },
          "cutoffDate": {
            "title": "Only reviews on or after",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Required in Since mode. Use YYYY-MM-DD and Newest sorting."
          },
          "sort": {
            "title": "Review sorting",
            "enum": [
              "entrydate",
              "ranking",
              "positive",
              "negative"
            ],
            "type": "string",
            "description": "Since mode requires Newest sorting.",
            "default": "entrydate"
          },
          "resumeFromCheckpoint": {
            "title": "Resume incomplete collections",
            "type": "boolean",
            "description": "Continue an interrupted or limited collection at its next saved page.",
            "default": true
          },
          "deduplicateAcrossRuns": {
            "title": "Skip review IDs seen in earlier runs",
            "type": "boolean",
            "description": "Uses the named state store to emit only newly observed review IDs.",
            "default": false
          },
          "resetState": {
            "title": "Reset saved state for these hotels",
            "type": "boolean",
            "description": "Clears checkpoints, seen IDs, daily anomaly history, and persistent monthly trend aggregates for the input hotels before collecting. Content-addressed AI cache records are retained.",
            "default": false
          },
          "stateStoreName": {
            "title": "Persistent state store name",
            "type": "string",
            "description": "Named key-value store used for checkpoints, seen review IDs, anomaly baselines, and AI cache.",
            "default": "holidaycheck-review-intelligence-state"
          },
          "includeAspectScores": {
            "title": "Include native aspect scores",
            "type": "boolean",
            "description": "Create eight deterministic scores from HolidayCheck rating and topic fields.",
            "default": true
          },
          "includeAiAspectScores": {
            "title": "Analyze full review text with AI",
            "type": "boolean",
            "description": "Score the same eight aspects from full text with exact-substring evidence and combine them with native signals. Requires an OpenAI API key and may incur charges.",
            "default": false
          },
          "aiAspectModel": {
            "title": "AI aspect model",
            "type": "string",
            "description": "OpenAI model used for evidence-validated full-text aspect analysis.",
            "default": "gpt-5.6-luna"
          },
          "aiAspectBatchSize": {
            "title": "Reviews per aspect request",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "Maximum number of review texts included in one AI aspect request.",
            "default": 10
          },
          "aiAspectMaxConcurrency": {
            "title": "Aspect-request concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum number of AI aspect requests processed at the same time.",
            "default": 2
          },
          "ignoreAiAspectErrors": {
            "title": "Continue when AI aspect analysis fails",
            "type": "boolean",
            "description": "Keep rows with unavailable AI scores and an error field instead of failing the run.",
            "default": true
          },
          "includeTrendIntelligence": {
            "title": "Build monthly aspect trends",
            "type": "boolean",
            "description": "Persist and store monthly averages, positive share, month-over-month delta, three-month rolling average, and direction in ASPECT_TRENDS.",
            "default": true
          },
          "includeAnomalySignals": {
            "title": "Include observable anomaly signals",
            "type": "boolean",
            "description": "Adds writing-pattern metrics, exact/near duplicates, rating runs, reviewer history, and historical burst z-scores. These fields are not fake-review verdicts.",
            "default": true
          },
          "includeReviewerDetails": {
            "title": "Include reviewer profile details",
            "type": "boolean",
            "description": "Include displayed name, age group, profile ID, and public-profile flag. Disabled by default for data minimization.",
            "default": false
          },
          "includeOwnerResponses": {
            "title": "Include hotel owner responses",
            "type": "boolean",
            "description": "Keep publicly displayed hotel owner responses in the normalized review row.",
            "default": true
          },
          "includeRawContributions": {
            "title": "Include raw contribution blocks",
            "type": "boolean",
            "description": "Keep source contribution blocks for audit or custom downstream processing. Disabled by default to reduce output size.",
            "default": false
          },
          "includeCompetitorSet": {
            "title": "Build an automatic competitor set",
            "type": "boolean",
            "description": "Rank nearby and location-based alternatives with transparent similarity and source reasons.",
            "default": true
          },
          "competitorLimit": {
            "title": "Competitors per hotel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of selected comparable competitors returned for each target hotel.",
            "default": 5
          },
          "competitorStarTolerance": {
            "title": "Star-class tolerance",
            "minimum": 0,
            "maximum": 2,
            "type": "integer",
            "description": "Maximum absolute difference in star class allowed between target and competitor.",
            "default": 1
          },
          "includePriceIntelligence": {
            "title": "Add comparable live price bands",
            "type": "boolean",
            "description": "Fetch a best available offer for the target and every competitor using the exact same dates, occupancy, currency, offer type, and optional board filters.",
            "default": false
          },
          "priceSearch": {
            "title": "Comparable price search",
            "type": "object",
            "description": "Required when price intelligence is enabled.",
            "properties": {
              "checkIn": {
                "title": "Check-in or package departure",
                "type": "string",
                "description": "Arrival date for hotel-only searches or departure date for package searches, formatted as YYYY-MM-DD.",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "checkOut": {
                "title": "Check-out or package return",
                "type": "string",
                "description": "Departure date for hotel-only searches or return date for package searches, formatted as YYYY-MM-DD.",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "adults": {
                "title": "Adults",
                "type": "integer",
                "description": "Number of adult guests used for every offer in the comparable price search.",
                "default": 2,
                "minimum": 1,
                "maximum": 12
              },
              "childrenAges": {
                "title": "Children's ages",
                "type": "array",
                "description": "One age from 0 to 17 for each child.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                },
                "default": []
              },
              "rooms": {
                "title": "Rooms",
                "type": "integer",
                "description": "Number of rooms used for every offer in the comparable price search.",
                "default": 1,
                "minimum": 1,
                "maximum": 6
              },
              "currency": {
                "title": "Currency",
                "type": "string",
                "description": "Three-letter currency code requested for target and competitor offers.",
                "default": "EUR",
                "pattern": "^[A-Za-z]{3}$"
              },
              "offerType": {
                "title": "Offer type",
                "type": "string",
                "description": "Compare hotel-only offers or package offers; all targets and competitors use the same type.",
                "editor": "select",
                "default": "hotelonly",
                "enum": [
                  "hotelonly",
                  "package"
                ],
                "enumTitles": [
                  "Hotel only",
                  "Package"
                ]
              },
              "departureAirports": {
                "title": "Departure airport codes",
                "type": "array",
                "description": "Optional IATA codes for package searches. Empty means any supported airport.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                },
                "default": []
              },
              "boardTypes": {
                "title": "HolidayCheck board filter codes",
                "type": "array",
                "description": "Optional HolidayCheck codes such as GT06-AI. Empty means any board.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                },
                "default": []
              }
            }
          },
          "priceBandTolerancePercent": {
            "title": "Same-price-band tolerance",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "A competitor within plus or minus this percentage of the target nightly price is in the same band.",
            "default": 15
          },
          "includeManagementReport": {
            "title": "Create a management report",
            "type": "boolean",
            "description": "Creates JSON and email-ready HTML portfolio reports plus explainable action alerts.",
            "default": true
          },
          "reportLanguage": {
            "title": "Management report language",
            "enum": [
              "en",
              "de"
            ],
            "type": "string",
            "description": "Language used for the generated HTML, JSON labels, text digest, and action alerts.",
            "default": "en"
          },
          "alertAspectDeclineThreshold": {
            "title": "Aspect decline alert threshold",
            "minimum": 0.01,
            "maximum": 2,
            "type": "number",
            "description": "Create an alert when a monthly aspect score falls by at least this amount on the -1 to 1 scale.",
            "default": 0.15
          },
          "alertMinimumReviewCount": {
            "title": "Minimum reviews for a trend alert",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Suppress aspect decline alerts based on smaller monthly samples.",
            "default": 3
          },
          "notificationWebhookUrl": {
            "title": "Notification webhook URL",
            "type": "string",
            "description": "Optional HTTPS endpoint for a signed JSON digest. Connect it to your own email, Slack, Teams, Make, or Zapier workflow."
          },
          "notificationWebhookSecret": {
            "title": "Webhook signing secret",
            "type": "string",
            "description": "Optional HMAC-SHA256 secret. When set, the request includes X-HolidayCheck-Signature."
          },
          "notificationMode": {
            "title": "When to send a notification",
            "enum": [
              "alerts",
              "always",
              "failures"
            ],
            "type": "string",
            "description": "Choose whether the signed webhook is sent for alerts, every completed report, or failed health states.",
            "default": "alerts"
          },
          "ignoreNotificationErrors": {
            "title": "Continue when notification delivery fails",
            "type": "boolean",
            "description": "Keep the Actor run successful and expose the delivery failure in health output instead of throwing.",
            "default": true
          },
          "translateToEnglish": {
            "title": "Translate review text to English",
            "type": "boolean",
            "description": "Translate title, full review, and owner response while preserving originals. Requires an OpenAI API key and may incur charges.",
            "default": false
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "Encrypted secret used for AI aspects and/or translation. OPENAI_API_KEY may be used instead."
          },
          "translationModel": {
            "title": "Translation model",
            "type": "string",
            "description": "OpenAI model used to translate review content into English.",
            "default": "gpt-5.6-luna"
          },
          "translationBatchSize": {
            "title": "Reviews per translation request",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "Maximum number of reviews included in one translation request.",
            "default": 10
          },
          "translationMaxConcurrency": {
            "title": "Translation concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum number of translation requests processed at the same time.",
            "default": 2
          },
          "ignoreTranslationErrors": {
            "title": "Continue when translation fails",
            "type": "boolean",
            "description": "Keep original review rows and expose the translation error instead of failing the run.",
            "default": true
          },
          "aiMaxRequests": {
            "title": "Maximum AI requests per run",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Shared safety budget across AI aspect and translation requests.",
            "default": 1000
          },
          "aiMaxInputTokens": {
            "title": "Maximum AI input tokens per run",
            "minimum": 1000,
            "maximum": 100000000,
            "type": "integer",
            "description": "Shared preflight input-token safety budget across AI features.",
            "default": 5000000
          },
          "useAiCache": {
            "title": "Reuse AI results from the state store",
            "type": "boolean",
            "description": "Caches by feature version, model, and source-content hash.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Maximum hotel concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of target hotels collected at the same time.",
            "default": 3
          },
          "maxRequestRetries": {
            "title": "Request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum retry count for a failed HolidayCheck HTTP request.",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Maximum time to wait for one HolidayCheck HTTP request before retrying or failing it.",
            "default": 30
          },
          "ignoreUrlErrors": {
            "title": "Continue when a hotel fails",
            "type": "boolean",
            "description": "Isolate a failed hotel URL, record its error, and continue processing the remaining hotels.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is recommended for larger recurring collections.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}