{
  "openapi": "3.0.1",
  "info": {
    "title": "Expedia Hotel Search Scraper",
    "description": "Scrape every hotel Expedia and Hotels.com list for a destination and your dates. Just add place names and get hotel name, guest rating, nightly price, stay total with taxes, neighbourhood, photos and the booking link. $1.20 per 1,000 properties.",
    "version": "1.0",
    "x-build-id": "HxhbtGLLgn3neSAUB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~expedia-hotel-search/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-expedia-hotel-search",
        "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/boncross~expedia-hotel-search/runs": {
      "post": {
        "operationId": "runs-sync-boncross-expedia-hotel-search",
        "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/boncross~expedia-hotel-search/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-expedia-hotel-search",
        "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": {
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "Place names to search: a city, neighbourhood, airport, station or landmark. For example Chicago, Santorini or Yellowstone National Park.",
            "items": {
              "type": "string"
            }
          },
          "site": {
            "title": "Site",
            "enum": [
              "expedia",
              "hotels"
            ],
            "type": "string",
            "description": "Which site to read. Links you paste already name their own site, so this only applies to bare property IDs. Hotels.com is read on the United States site only.",
            "default": "expedia"
          },
          "maxItems": {
            "title": "Maximum rows for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "Stop once this many rows have been returned, across every destination and date. 0 means no limit.",
            "default": 0
          },
          "maxHotelsPerDestination": {
            "title": "Maximum hotels per destination",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many properties to return for each destination and stay.",
            "default": 50
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "Check-in date as YYYY-MM-DD, for example 2026-11-10."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "Check-out date as YYYY-MM-DD, for example 2026-11-12."
          },
          "checkInDaysAhead": {
            "title": "Or: days ahead to check in",
            "minimum": 0,
            "type": "integer",
            "description": "Used only when no check-in date is given. The stay starts this many days from the day the run starts, which keeps a scheduled run pointed at a moving window.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of the stay when the dates are computed from \"days ahead\" rather than given.",
            "default": 1
          },
          "stays": {
            "title": "Extra stays",
            "type": "array",
            "description": "More date ranges to price, one per line as CHECKIN_CHECKOUT, for example 2026-11-10_2026-11-12. Each one is fetched for every hotel.",
            "items": {
              "type": "string"
            }
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 14,
            "type": "integer",
            "description": "Number of adults in the room.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "One age per child, in years. Leave empty for an adults-only stay.",
            "items": {
              "type": "string"
            }
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many rooms to price, each with the same guests. The nightly rate stays per room and the stay total covers them all, which is how the site quotes a multi-room booking.",
            "default": 1
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "RECOMMENDED",
              "PRICE_LOW_TO_HIGH",
              "PRICE_HIGH_TO_LOW",
              "DISTANCE",
              "REVIEW_RELEVANT",
              "PROPERTY_CLASS",
              "REVIEW",
              "PRICE_RELEVANT"
            ],
            "type": "string",
            "description": "Expedia's orderings: the six on its Sort menu, plus two it accepts without showing them (guest rating only, and price blended with its picks). Price sorts follow the price the market shows first: the nightly rate in Japan, the stay total in the US. The guest-rating-plus-picks and distance orders are checked on every search: when Expedia answers its default order instead, the search is asked again, and one that stays unsorted returns an error row and is not charged.",
            "default": "RECOMMENDED"
          },
          "minRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Drop properties rated below this, out of 10. Expedia's own 7+ / 8+ / 9+ filter is applied first and each row is then checked. 0 means no limit.",
            "default": 0
          },
          "minPricePerNight": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Expedia's own budget filter, in the market's currency, then checked on each row. Rows without a price are left out when a price limit is set. 0 means no limit.",
            "default": 0
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Expedia's own budget filter, in the market's currency, then checked on each row. Rows without a price are left out when a price limit is set. 0 means no limit.",
            "default": 0
          },
          "minStars": {
            "title": "Minimum property class",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Expedia's property class filter: 3 keeps 3, 4 and 5-star properties. 0 keeps everything.",
            "default": 0
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only these kinds of property, by the names on Expedia's Property type filter: Hotel, Hostel, Ryokan, Apartment, Capsule hotel and so on. What is on offer varies by destination.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mealPlans": {
            "title": "Meal plans",
            "type": "array",
            "description": "Keep properties offering any of these, as Expedia's Meal plans filter.",
            "items": {
              "type": "string",
              "enum": [
                "breakfast",
                "half_board",
                "full_board",
                "all_inclusive"
              ],
              "enumTitles": [
                "Breakfast included",
                "Half board",
                "Full board",
                "All inclusive"
              ]
            },
            "default": []
          },
          "freeCancellationOnly": {
            "title": "Only fully refundable properties",
            "type": "boolean",
            "description": "Expedia's \"Fully refundable property\" filter.",
            "default": false
          },
          "payLaterOnly": {
            "title": "Only reserve now, pay later",
            "type": "boolean",
            "description": "Expedia's \"Reserve now, pay later\" filter.",
            "default": false
          },
          "filters": {
            "title": "More Expedia filters",
            "type": "array",
            "description": "Anything else on Expedia's filter panel, by its label (\"Pool\", \"City view\", \"Roll-in shower\", \"Shinjuku\", \"Hilton\") or as field=value (\"amenities=POOL\"). Labels are matched on each search's own panel, which every run saves with its codes in the SEARCH_OPTIONS record; the run log says which options a label matched.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includePhotos": {
            "title": "Include photos",
            "type": "boolean",
            "description": "Add the property's gallery image links to each row.",
            "default": true
          },
          "market": {
            "title": "Market",
            "enum": [
              "auto",
              "ar",
              "au",
              "be",
              "br",
              "ca",
              "cl",
              "co",
              "cr",
              "dk",
              "de",
              "eg",
              "es",
              "fr",
              "in",
              "id",
              "ie",
              "it",
              "my",
              "mx",
              "nl",
              "nz",
              "no",
              "pe",
              "ph",
              "eu",
              "ch",
              "sg",
              "fi",
              "se",
              "ae",
              "uk",
              "us",
              "vn",
              "at",
              "sa",
              "th",
              "tw",
              "jp",
              "hk",
              "kr"
            ],
            "type": "string",
            "description": "Which country's site to read, which is what decides the currency: each one quotes its own money and will not quote another's. Auto follows each pasted link's own site, so an expedia.se link is quoted in SEK, and a place name uses the US site, in USD. Some markets quote a nightly rate that already includes tax and others add it on top, so a nightly price is only comparable within one market: compare on the stay total.",
            "default": "auto"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code, default USD. Only currencies the chosen region offers are accepted: 11 regions offer a choice, the rest quote one currency only. Anything else is ignored and the region's own currency is used, which the rows report. Clear it for the region's own currency.",
            "default": "USD"
          },
          "language": {
            "title": "Label language",
            "enum": [
              "english",
              "site-default"
            ],
            "type": "string",
            "description": "Language of the room names, board and cancellation wording. Prices are unaffected: they always follow the region. English is recommended: with the region's own language the refundable and meal-included flags cannot be determined and come back empty.",
            "default": "english"
          },
          "dedupStoreName": {
            "title": "Memory store",
            "type": "string",
            "description": "Name of a storage area to remember the properties already returned. Leave empty to remember nothing."
          },
          "onlyNew": {
            "title": "Only new properties",
            "type": "boolean",
            "description": "Return only properties that no earlier run returned. Needs a memory store.",
            "default": false
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Pause after each request, per parallel lane. 0 runs at full speed; raise it only to make a large run gentler. Values above 2000 are treated as 2000.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many searches are fetched at once. Higher is faster; the default suits almost every run.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}