# Hotels.com Reviews Scraper 🏨 Ratings, Text & Sentiment (`factden/hotels-com-reviews-scraper`) Actor

Scrape Hotels.com hotel reviews at scale - guest ratings, full review text, sub-ratings, stay dates, traveler type, language & owner responses, plus LLM-ready markdown. Also accepts Expedia, Travelocity, Orbitz, Wotif, CheapTickets & ebookers URLs. Filter by date/rating; export JSON/CSV.

- **URL**: https://apify.com/factden/hotels-com-reviews-scraper.md
- **Developed by:** [Factden](https://apify.com/factden) (community)
- **Categories:** Travel, Business, AI
- **Stats:** 8 total users, 6 monthly users, 100.0% runs succeeded, 7 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.002 / review

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Hotels.com Reviews Scraper

**Hotels.com Reviews Scraper** extracts every public **guest review** from [Hotels.com](https://www.hotels.com)
at scale — **ratings out of 10**, full **review text**, category **sub-ratings**, **stay dates**, **traveler
type**, **language**, and **hotel owner/management responses** — plus a per-review **LLM-ready markdown** block.
Export clean **CSV, JSON, Excel**, or pull it via **API**. No login, no Hotels.com API key, **pay per review with
no start fee**. Use it for **guest-feedback and sentiment analysis**, **hotel reputation monitoring**, competitor
benchmarking, or to build a **hotel-review dataset** for RAG / LLM pipelines.

> ⭐ **Found this useful?** Please **rate & bookmark** the actor — it helps other travelers and hotel teams find it.

> **One scraper, all seven Expedia Group hotel brands** — **Hotels.com, Expedia, Travelocity, Orbitz, Wotif,
> CheapTickets & ebookers.** They share one backend, so any brand's hotel URL returns the **same fields, same
> schema**. A single actor replaces seven separate review scrapers — something no single-site Hotels.com scraper
> can do.

Runs on the Apify platform: **scheduling**, a **REST API**, **webhooks & integrations**, **proxy rotation**, and
**run monitoring** out of the box — plus **incremental / since-date** runs so you only pull what's new.

![Hotels.com hotel reviews - one row per review](https://raw.githubusercontent.com/factden/apify-actor-assets/main/hotels-com-reviews-scraper/02-reviews-overview.png)

### What data can I extract from Hotels.com reviews?

Per review — one clean row, with the hotel context merged onto every row so each stands alone:

| Field | Description |
|---|---|
| `overallRating`, `ratingLabel` | Guest score on the **/10 scale** + label ("Exceptional", "Good", "Fair"…). |
| `reviewText`, `verified` | Full written review + verified-stay flag. |
| `subRatings` | Per-review category scores — cleanliness, service, room comfort, hotel condition, amenities, value. |
| `submittedAt`, `checkInDate`, `checkOutDate` | Submission date + stay dates. |
| `travelCompanions`, `travelerCategories` | Who they travelled as (Family, Couple, Business…). |
| `language`, `isMachineTranslated` | Original language + machine-translation flag. |
| `reviewPhotos`, `helpfulVotes`, `ownerResponse` | Guest photo URLs, helpful votes, hotel owner reply `{text, date, responder}`. |
| `brandType` | The brand the review was originally posted on (shown as **Review source**). |
| `markdownContent` | Self-contained **LLM-ready** markdown block for RAG / vector-DB ingestion. |

Alongside the reviews you get a **per-hotel aggregate**: average rating, recency-weighted rating, total review
count, the full 1–5 **rating distribution**, category sub-scores, traveler-type & language counts, and coordinates.

### Why use it? Hotels.com Reviews Scraper vs the alternatives

| | **This actor** | Official Hotels.com API | Manual copy-paste / DIY script |
|---|---|---|---|
| Hotels.com guest reviews | ✅ All, paginated | ❌ No public reviews API | ⚠️ A few, then blocked |
| Sub-ratings + /10 score + owner responses | ✅ | ❌ | ⚠️ Manual |
| LLM-ready markdown per review | ✅ | ❌ | ❌ |
| 6 sibling brands (Expedia, Travelocity…) | ✅ One input | ❌ | ❌ |
| Export CSV / JSON / Excel / API | ✅ | — | ⚠️ |
| Cost | **Pay per review, no start fee** | — | Engineering time + proxies |

- **Reputation monitoring & sentiment analysis** — track guest feedback for your own or competitor hotels; every
  review carries structured sub-ratings and a sentiment-ready text block.
- **Competitor benchmarking** — pull rating distributions, category sub-scores and review volume per property.
- **Market research & reviewer demographics** — analyze traveler types, languages, and what guests praise or
  complain about across a whole market.
- **AI / RAG pipelines & review datasets** — the `markdownContent` block is ready for vector-DB ingestion, so you
  can build a clean hotel-review dataset for an LLM with no post-processing.

### How to scrape Hotels.com reviews

1. Open a hotel on Hotels.com and copy its URL — it contains a `/ho<number>/` segment, e.g.
   `https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/`.
2. Paste one or more such URLs, bare Hotels.com property IDs, or any Expedia Group brand URL into **Hotel URLs**.
3. (Optional) Set **Max reviews per hotel**, a **date range**, a **rating range**, a **sort order**, or **Review
   sources**.
4. Click **Start**, then **export to CSV, JSON, Excel**, or pull the results from the **API**.

![Input tab - hotel URLs plus filters & limits](https://raw.githubusercontent.com/factden/apify-actor-assets/main/hotels-com-reviews-scraper/01-input-form.png)

#### Input

| Field | Description |
|---|---|
| **Hotel URLs or property IDs** (`hotelUrls`) | Hotels.com `/ho<id>/` URLs, **bare Hotels.com IDs** (`242128`), or URLs from any of the 6 sibling brands. One per line. |
| **Max reviews per hotel** (`maxReviewsPerHotel`) | Cap per hotel (default 200). |
| **Sort reviews by** (`sortBy`) | `newest` (default), `oldest`, `highestRating`, `lowestRating`. |
| **From / To date** (`fromDate` / `toDate`) | Keep only reviews in a `YYYY-MM-DD` range — ideal for incremental monitoring. |
| **Min / Max rating** (`minRating` / `maxRating`) | Keep only reviews within a 1–5 rating range. |
| **Review sources** (`reviewSources`) | Which Expedia Group brands' reviews to return. Empty = all (cross-brand union). |
| **Proxy** (`proxyConfiguration`) | Datacenter is enough; residential for very large runs. |

### Output — export Hotels.com reviews to CSV, JSON & Excel

The actor writes **two datasets**: **Reviews** (default) — one row per guest review — and **Hotels** — one row
per hotel with the aggregate. The reviews dataset also exposes an **AI ingest** view (the LLM-ready
`markdownContent` column). Download any of them as **JSON, CSV, Excel or XML**, or fetch from the API.

The **Hotels** dataset gives you one aggregate row per property — average & recency-weighted rating, total review
count, rating distribution, category sub-scores, and coordinates:

![Hotels dataset - one aggregate row per hotel with average rating, rating distribution and category sub-scores](https://raw.githubusercontent.com/factden/apify-actor-assets/main/hotels-com-reviews-scraper/04-hotel-overview.png)

A **real review row** from a run on the Bellagio (Las Vegas), pasted as a Hotels.com URL:

```json
{
  "hotelId": 140596,
  "hotelName": "Bellagio",
  "hotelUrl": "https://www.hotels.com/ho119566/bellagio/",
  "source": "hotels",
  "reviewId": "6a5163ef5acf8d54499c0073",
  "submittedAt": "2026-07-10T21:29:04Z",
  "overallRating": 10,
  "ratingLabel": "Exceptional",
  "reviewText": "Great as usual!",
  "subRatings": ["Cleanliness: 10", "Service: 10", "Hotel condition: 8", "Amenities: 10"],
  "verified": true,
  "reviewerName": "Alexey",
  "checkInDate": "2026-07-05T00:00:00Z",
  "checkOutDate": "2026-07-10T00:00:00Z",
  "travelCompanions": ["Family"],
  "travelerCategories": ["Families"],
  "language": "en",
  "isMachineTranslated": false,
  "helpfulVotes": 0,
  "reviewPhotos": [],
  "ownerResponse": null,
  "brandType": "Hotels.com",
  "markdownContent": "# Bellagio review (Hotels.com)\n\n**Rating:** 10/10 ★★★★★\n**Travelling as:** Family\n**Sub-ratings:** Cleanliness: 10; Service: 10; Hotel condition: 8; Amenities: 10\n\n## Review\nGreat as usual!"
}
```

Ratings are on the **/10 scale** to match Hotels.com's public display (the source stores /5; we present ×2).

The **AI ingest (LLM-ready)** view surfaces the self-contained `markdownContent` column for every review — load it
straight into a vector database or LLM with no reshaping:

![Reviews AI ingest view - LLM-ready markdown column for each Hotels.com review](https://raw.githubusercontent.com/factden/apify-actor-assets/main/hotels-com-reviews-scraper/03-reviews-ai-ingest.png)

### How much does it cost to scrape Hotels.com reviews?

**Pay-per-event** with **no start fee** — you pay only for the reviews you actually get, and **nothing** if a run
returns zero reviews:

| Plan | Price per 1,000 reviews |
|---|---|
| Free | **$2.50** |
| Bronze | **$2.30** |
| Silver | **$2.15** |
| Gold+ | **$2.00** |

**Examples:** 500 reviews ≈ **$1.25** · 5,000 reviews ≈ **$12.50** (Free) / **$10.00** (Gold). Lower **Max reviews
per hotel** to cap spend; your first runs are covered by **Apify's free tier**. There is **no per-run start fee**.

### Works with all 7 Expedia Group brands

One engine, one output schema, seven sites — paste a **Hotels.com, Expedia, Travelocity, Orbitz, Wotif,
CheapTickets** or **ebookers** hotel URL and it just works. Hotels.com `/ho<id>/` links and bare IDs are resolved
automatically; the other brands carry the id in a `.h<id>.` path. Use **Review sources** to keep only certain
brands' reviews, or leave it empty for the cross-brand union.

### Other FactDen scrapers

Building a review-intelligence pipeline? Pair this with:

- **[Expedia Reviews Scraper](https://apify.com/factden/expedia-hotel-reviews-scraper)** — the same engine, Expedia-branded.
- **[Trip.com & Ctrip Reviews Scraper](https://apify.com/factden/ctrip-trip-reviews-scraper)** — hotel reviews across Trip.com / Ctrip.
- **[G2 Reviews Scraper](https://apify.com/factden/g2-reviews-scraper)** — B2B software reviews & battlecards.
- **[Indeed Jobs Scraper](https://apify.com/factden/indeed-jobs-scraper)** — job listings & company data.
- **[Google Hotels Scraper](https://apify.com/factden/google-hotels-scraper)** — live hotel prices, OTA rate ladder & reviews from Google Hotels.
- **[MakeMyTrip & Goibibo Reviews Scraper](https://apify.com/factden/makemytrip-scraper)** — MakeMyTrip + Goibibo hotel reviews & details (India's largest OTAs).
- **[TripAdvisor Hotel Reviews API](https://apify.com/factden/tripadvisor-hotel-reviews-api)** — all TripAdvisor reviews for hotels, restaurants & attractions, plus official subratings & AI summary.

### FAQ

#### How do I scrape Hotels.com reviews?

Copy a hotel's Hotels.com URL (it contains a `/ho<number>/` segment) or its numeric ID, paste it into **Hotel
URLs**, and click **Start**. The actor pulls every public guest review newest-first and returns one structured row
per review — rating, text, sub-ratings, stay dates and owner responses — which you export as CSV, JSON or Excel.
Set **Max reviews per hotel** and a **From date** to control volume and cost.

#### Does Hotels.com have a reviews API?

Hotels.com does not offer a public reviews API for guest reviews — the review data is only on the website. This
actor is the practical alternative: it collects the same public reviews and hotel-rating aggregates and delivers
them as structured JSON/CSV, so you get API-style access to Hotels.com review data without an official endpoint.

#### Is it legal to scrape Hotels.com reviews?

This actor collects only **publicly available** review content. You are responsible for complying with Hotels.com's
Terms of Service and applicable laws (including data-protection rules) when you use the data. It does not collect
private or personal account data. See Apify's guide on
[whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

#### What data fields does each review include?

Each review row includes the overall rating (out of 10), a rating label, the full review text, per-category
sub-ratings (cleanliness, service, room comfort, condition, amenities, value), stay dates, traveler type, language,
guest photos, helpful votes, any owner/management response, the originating brand, and a self-contained LLM-ready
`markdownContent` block. A separate hotel row adds the aggregate ratings, review count and rating distribution.

#### Can I use the Hotels.com Reviews Scraper with the Apify API?

Yes. Every run is fully API-accessible — start runs, pass input, and fetch the dataset programmatically. For a
one-shot call, POST to the actor's `run-sync-get-dataset-items` endpoint with your `hotelUrls` and
`maxReviewsPerHotel` and the reviews come back in the response. Append `?view=aiIngest` for the LLM-ready markdown
columns.

#### Can I use this actor through an MCP Server?

Yes. The actor works with the Apify MCP Server, so AI agents (Claude, and any MCP-compatible client) can discover
and run it as a tool and receive the structured review data directly. The input schema carries descriptions and
sane defaults so an agent can run it without hand-holding — useful for building hotel-review agents and RAG
pipelines.

#### Can I build a hotel-review dataset for sentiment analysis or a RAG pipeline?

Yes — this is a common use. Each of the 27 review fields is structured, and every row also ships a self-contained
`markdownContent` block, so you can export thousands of reviews as JSON or CSV and load them straight into a
vector database, a sentiment-analysis model, or an LLM/RAG pipeline with no post-processing. The per-hotel
aggregate (average rating, rating distribution, category sub-scores) gives you ready-made labels for training or
reputation dashboards. Use the **AI ingest** dataset view to pull just the LLM-ready columns.

#### Can I integrate it with Make, Zapier, n8n or Google Sheets?

Yes. Results push straight into **Google Sheets, Make, Zapier, n8n**, a **webhook**, or your own app via the Apify
API. **Schedule** the actor hourly or daily and combine it with a **From date** for continuous, incremental review
monitoring that only pays for new reviews.

#### How is this different from a TripAdvisor or Booking.com scraper?

This actor is purpose-built for the **Expedia Group** ecosystem — Hotels.com plus six sibling brands that share one
backend — so a single run covers reviews other single-site scrapers miss. It returns Hotels.com's granular
per-category sub-ratings, the /10 rating scale, owner responses, and an LLM-ready markdown block, billed per review
with no start fee.

### Changelog

- **2026-07-12** — Initial release. Hotels.com guest reviews + hotel aggregates across all 7 Expedia Group brands;
  `/ho<id>/` and bare-ID resolution; per-review pay-per-event pricing; LLM-ready `markdownContent` view.

***

⭐ **Find this useful?** **Bookmark** the actor and leave a **review** on its Apify Store page — it helps others
find it and tells us which features to build next. Found a bug or need a field we don't return? Open the **Issues**
tab on this actor's Apify page.

# Actor input Schema

## `hotelUrls` (type: `array`):

Paste one hotel per line — a Hotels.com hotel page URL (any regional domain) or a bare Hotels.com property ID. Hotels.com `/ho<id>/` links and bare numeric IDs are resolved to the review feed automatically. Also accepts Expedia, Travelocity, Orbitz, Wotif, CheapTickets & ebookers URLs, which carry the id in the `.h<id>.` path. Examples: `https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/`, an Expedia URL like `https://www.expedia.com/Las-Vegas-Hotels-The-Venetian-Resort-Las-Vegas.h1443.Hotel-Information`, or a bare id like `242128`.

## `maxReviewsPerHotel` (type: `integer`):

How many reviews to pull per hotel (fetched newest-first). Lower this to control cost and run time.

## `sortBy` (type: `string`):

Output order of the returned reviews. Reviews are fetched newest-first from the source; `Highest rating` / `Lowest rating` reorder the retrieved set (not a global top-N across the whole hotel).

## `fromDate` (type: `string`):

Keep only reviews submitted on or after this day. Leave empty for no lower bound.

## `toDate` (type: `string`):

Keep only reviews submitted on or before this day. Leave empty for no upper bound.

## `minRating` (type: `integer`):

Keep only reviews with an overall rating at or above this value (1–5).

## `maxRating` (type: `integer`):

Keep only reviews with an overall rating at or below this value (1–5).

## `reviewSources` (type: `array`):

Which Expedia Group brands' reviews to return per hotel. **Leave empty for all brands** (the cross-brand union, e.g. Hotels.com + Expedia reviews for the same property). Pick one for a single-brand filter, or several for a subset.

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter proxies are sufficient for Hotels.com at typical volumes; switch to residential IPs for very large runs.

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/",
    "https://www.expedia.com/Las-Vegas-Hotels-The-Venetian-Resort-Las-Vegas.h1443.Hotel-Information",
    "242128"
  ],
  "maxReviewsPerHotel": 200,
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 5,
  "reviewSources": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

One row per guest review (hotel context merged onto each row) with ratings, full review text, category sub-ratings, stay dates, traveler type, language, owner responses and an LLM-ready markdownContent block.

## `hotels` (type: `string`):

One row per hotel with aggregate average rating, recency-weighted rating, total review count, category sub-ratings, coordinates and how many reviews were extracted.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hotelUrls": [
        "https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/",
        "https://www.expedia.com/Las-Vegas-Hotels-The-Venetian-Resort-Las-Vegas.h1443.Hotel-Information",
        "242128"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factden/hotels-com-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "hotelUrls": [
        "https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/",
        "https://www.expedia.com/Las-Vegas-Hotels-The-Venetian-Resort-Las-Vegas.h1443.Hotel-Information",
        "242128",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("factden/hotels-com-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hotelUrls": [
    "https://www.hotels.com/ho119566/bellagio-las-vegas-united-states-of-america/",
    "https://www.expedia.com/Las-Vegas-Hotels-The-Venetian-Resort-Las-Vegas.h1443.Hotel-Information",
    "242128"
  ]
}' |
apify call factden/hotels-com-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=factden/hotels-com-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WP87exjnOkMaR4LeD/builds/u6acSLxeePXDoxOd2/openapi.json
