{
  "openapi": "3.0.1",
  "info": {
    "title": "Expedia & Hotels.com Scraper — Hotel Reviews & Prices",
    "description": "Scrape Expedia and Hotels.com hotel reviews, hotel details (stars, address, scores, amenities, policies) and search results with nightly and total prices. Monitor new reviews.",
    "version": "0.1",
    "x-build-id": "B0EFemH0Fe3yaoAaU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tortuga~expedia-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tortuga-expedia-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/tortuga~expedia-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tortuga-expedia-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/tortuga~expedia-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tortuga-expedia-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": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "reviews",
              "hotels",
              "search"
            ],
            "type": "string",
            "description": "reviews: one item per guest review (rating, text, liked/disliked topics, date, stay month and nights, reviewer first name, hotel response). hotels: one details item per hotel (stars, address, coordinates, guest score and sub-scores, review count, amenities, policies, check-in/out). search: one item per hotel in a destination's search results for your dates (price per night, total price, struck-through price, refundability, score).",
            "default": "reviews"
          },
          "startUrls": {
            "title": "Expedia / Hotels.com URLs",
            "type": "array",
            "description": "Hotel pages of either site (https://www.expedia.com/Las-Vegas-Hotels-Bellagio.h140596.Hotel-Information, https://www.hotels.com/ho118295/bellagio-las-vegas-united-states-of-america/, other Expedia country domains work too) or search pages with a destination (https://www.expedia.com/Hotel-Search?destination=Lisbon&startDate=2026-12-01&endDate=2026-12-03). The URL's site decides whose reviews you get: Expedia and Hotels.com show different reviews of the same hotel.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "hotelIds": {
            "title": "Property ids",
            "type": "array",
            "description": "Expedia Group property ids (the number after .h in Expedia URLs, also the expediaPropertyId in Hotels.com links), e.g. 140596. Hotels.com 'ho' numbers are a different id.",
            "items": {
              "type": "string"
            }
          },
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "City, area or landmark names to search, e.g. \"Las Vegas\" or \"Lisbon, Portugal\". Looked up with the site's own destination search. In reviews and hotels mode the top hotels of each destination are processed.",
            "items": {
              "type": "string"
            }
          },
          "site": {
            "title": "Site for ids and destinations",
            "enum": [
              "expedia",
              "hotels",
              "both"
            ],
            "type": "string",
            "description": "Which site to read for property ids and destinations (URLs always use their own site). 'both' reads Expedia and Hotels.com: two separate review sets, or one details/search item per site.",
            "default": "expedia"
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many items in total (reviews, hotels or search results across all inputs).",
            "default": 100
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per hotel",
            "minimum": 1,
            "type": "integer",
            "description": "Reviews mode: cap per hotel and site. Popular hotels have tens of thousands of reviews.",
            "default": 100
          },
          "maxHotelsPerSearch": {
            "title": "Max hotels per destination",
            "minimum": 1,
            "type": "integer",
            "description": "Reviews and hotels mode: how many top hotels (the site's recommended order) of each destination or search page are processed.",
            "default": 10
          },
          "sortReviewsBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "mostRelevant",
              "highestRating",
              "lowestRating"
            ],
            "type": "string",
            "description": "Order of the reviews. 'Only reviews newer than' and monitoring always use newest first.",
            "default": "newest"
          },
          "reviewsNewerThan": {
            "title": "Only reviews newer than",
            "type": "string",
            "description": "Only reviews newer than: a date (YYYY-MM-DD) or a period such as '7 days' or '24 hours'. Reviews are read newest first and paging stops at the first page that is entirely older."
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed items",
            "type": "boolean",
            "description": "Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. Reviews: each run checks the newest 'Max reviews per hotel' reviews and saves only reviews not seen before. Hotels: compared on guest score and stars. Search: price per night, total, struck-through price, availability and refundability.",
            "default": false
          },
          "monitoringKey": {
            "title": "Monitoring key",
            "type": "string",
            "description": "Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input."
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "Search mode: check-in date (YYYY-MM-DD). Without it the dates of the search URL are used, else 7 days from today."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 28,
            "type": "integer",
            "description": "Search mode: length of stay when the check-in date is set here (or the search URL has no check-out date).",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 14,
            "type": "integer",
            "description": "Search mode: adults per room.",
            "default": 2
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Search mode: number of rooms.",
            "default": 1
          },
          "sortSearchBy": {
            "title": "Sort search results by",
            "enum": [
              "recommended",
              "priceLowToHigh",
              "priceHighToLow",
              "guestRating",
              "distance",
              "starRating"
            ],
            "type": "string",
            "description": "Search mode: order of the hotels.",
            "default": "recommended"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Residential proxy is required: Expedia's bot protection rejects almost all datacenter traffic. Each request uses a new residential IP; rejected attempts are retried and cost only a few KB. Measured proxy traffic: about 0.6 MB per 1,000 reviews (about $0.005 of residential traffic).",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}