{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper With Review Insights",
    "description": "Google Hotels Scraper: Collect hotel prices, ratings, reviews, amenities, locations, availability, and property details. Analyze guest feedback, review trends, pricing, and hotel performance to uncover travel market insights and support competitor and hospitality research.",
    "version": "0.2",
    "x-build-id": "pGsoQenNDhA6IarLd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/api-empire~google-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-api-empire-google-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/api-empire~google-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-api-empire-google-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/api-empire~google-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-api-empire-google-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": {
          "searchTargets": {
            "title": "🔍 Hotel Search Targets",
            "type": "array",
            "description": "Cities, areas, or keywords to search — e.g. 'Prague hotels', 'Paris center'. Add multiple for bulk scraping. (Same as base actor's `searchQuery` field, renamed.)",
            "items": {
              "type": "string"
            }
          },
          "maxHotels": {
            "title": "📊 Max Hotels To Scrape",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "How many hotels to scrape per search query, 1-5000. (Same as base actor's `maxResults` field, renamed.)"
          },
          "checkIn": {
            "title": "📅 Check-in Date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Arrival date (YYYY-MM-DD). Affects prices. (Same as base actor's `checkInDate` field, renamed.)"
          },
          "checkOut": {
            "title": "📅 Check-out Date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Departure date (YYYY-MM-DD), must be after check-in. (Same as base actor's `checkOutDate` field, renamed.)"
          },
          "guestAdults": {
            "title": "👥 Adult Guests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of adults, 1-10. Affects room options and pricing. (Same as base actor's `numberOfAdults` field, renamed.)"
          },
          "guestChildren": {
            "title": "👶 Child Guests",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Number of children, 0-10. (Same as base actor's `numberOfChildren` field, renamed.)"
          },
          "currency": {
            "title": "💱 Currency Code",
            "minLength": 3,
            "maxLength": 3,
            "type": "string",
            "description": "3-letter currency code: EUR, USD, GBP, etc. (Same as base actor's `currencyCode` field, renamed.)"
          },
          "sortOrder": {
            "title": "↕️ Sort results by",
            "enum": [
              "relevance",
              "price_low_high",
              "price_high_low",
              "rating_high_low",
              "stars_high_low"
            ],
            "type": "string",
            "description": "Order the scraped hotels in the dataset. 'Relevance' keeps Google's own search-result ranking (and streams results to the dataset as they are scraped); the other options re-sort the final list by the extracted price/rating/stars. Hotels missing that value are always placed last, never faked.",
            "default": "relevance"
          },
          "includeReviewInsights": {
            "title": "🧠 Fetch Review & Sentiment Insights",
            "type": "boolean",
            "description": "When ON, each hotel is fetched from its Google Hotels /reviews sub-page and `reviewExcerpts` (real verbatim guest quotes with the theme and topic Google grouped them under) are added. Turn OFF to skip the excerpts for a slightly lighter run — the aggregate `reviewInsights` (aspect sentiment, rating histogram, location score, partner ratings) are published on the hotel's own entity payload and are returned either way.",
            "default": true
          },
          "maxReviewExcerpts": {
            "title": "💬 Max Review Excerpts Per Hotel",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Cap on how many real guest review excerpts to keep per hotel (0-20). Google publishes about a dozen review-highlight themes per hotel; excerpts are taken round-robin across themes so you get variety rather than several quotes about the same thing. Only applies when review excerpts are enabled.",
            "default": 6
          },
          "aiEnhancement": {
            "title": "🤖 Enable AI Sentiment Summarization",
            "type": "boolean",
            "description": "OFF by default. When ON, sends each hotel's real review excerpts to an AI model to produce a per-excerpt sentiment/topic tag and an overall guest-sentiment summary. Never fabricates — hotels with no review excerpts get null AI fields.",
            "default": false
          },
          "aiModel": {
            "title": "🤖 AI Model / Provider",
            "enum": [
              "claude-haiku-4-5",
              "claude-sonnet-5",
              "claude-opus-4-8",
              "claude-fable-5",
              "gpt-4o-mini",
              "gpt-4o",
              "gpt-4.1-mini",
              "gpt-4.1",
              "o3-mini",
              "o1",
              "gemini-2.0-flash-lite",
              "gemini-2.0-flash",
              "gemini-1.5-pro",
              "gemini-2.5-flash",
              "gemini-2.5-pro",
              "grok-2-latest",
              "grok-3-mini",
              "grok-3",
              "grok-beta",
              "deepseek-chat",
              "deepseek-reasoner",
              "sonar",
              "sonar-pro",
              "sonar-reasoning",
              "mistral-small-latest",
              "mistral-large-latest"
            ],
            "type": "string",
            "description": "Provider auto-detected from the name: claude-*=Anthropic, gpt-*/o1/o3=OpenAI, gemini-*=Google, grok-*=xAI, deepseek-*=DeepSeek, sonar*=Perplexity, mistral-*=Mistral. Cheaper mini/flash/haiku models are recommended.",
            "default": "claude-haiku-4-5"
          },
          "aiApiKey": {
            "title": "🔑 AI API Key",
            "type": "string",
            "description": "API key for the selected AI provider. Falls back to the matching env var (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / XAI_API_KEY / DEEPSEEK_API_KEY / PERPLEXITY_API_KEY / MISTRAL_API_KEY) if left blank. Only used when AI summarization is enabled."
          },
          "proxySettings": {
            "title": "🔒 Proxy Configuration",
            "type": "object",
            "description": "Proxy configuration for all requests, including the new /reviews fetch. (Same as base actor's `proxyConfiguration` field, renamed.)"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}