# Expedia Reviews Scraper (`fetch_cat/expedia-reviews-scraper`) Actor

Export public Expedia hotel reviews, ratings, authors, dates, traveler details, photos, and management responses with reliable pagination.

- **URL**: https://apify.com/fetch\_cat/expedia-reviews-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 1,000 review saveds

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

## Expedia Reviews Scraper

Export public Expedia hotel reviews for reputation monitoring, guest-experience analysis, competitor research, and review archives. Supply Expedia property IDs or hotel URLs and receive one structured review per dataset row.

### Input example

```json
{
  "propertyIds": ["905202"],
  "maxReviewsPerHotel": 20,
  "sortBy": "NEWEST_TO_OLDEST",
  "includeRatingsOnly": true
}
```

### Output example

```json
{
  "hotelId": "905202",
  "propertyUrl": "https://www.expedia.com/h905202.Hotel-Information",
  "reviewId": "example-review-id",
  "rating": 10,
  "ratingLabel": "Exceptional",
  "superlative": "Wonderful stay",
  "title": "Wonderful stay",
  "text": "Friendly staff and a convenient location.",
  "locale": "en_US",
  "author": "Expedia guest",
  "submissionDate": "Jul 30, 2026",
  "stayDate": "July 2026",
  "stayDetails": "Stayed 2 nights",
  "travelerType": "Couple",
  "travelers": ["Couple"],
  "brandType": "EXPEDIA",
  "verifiedStay": true,
  "themes": [],
  "photos": [],
  "managementResponses": [],
  "propertyReviewSource": {},
  "reviewRegion": {},
  "sourceUrl": "https://www.expedia.com/h905202.Hotel-Information",
  "scrapedAt": "2026-08-04T12:00:00.000Z",
  "pageIndex": 0,
  "position": 1
}
```

Optional fields are omitted when Expedia does not provide them, especially for ratings-only reviews.

### Who is it for?

- **Hotel reputation teams** tracking recurring guest feedback.
- **Travel analysts** comparing ratings and themes across properties.
- **Guest-experience teams** exporting management responses and stay context.
- **Data teams** feeding public review archives, dashboards, and alerts.

### Input settings

| Field | Type | Description |
|---|---|---|
| `propertyIds` | string\[] | Numeric Expedia hotel property IDs. |
| `startUrls` | URL\[] | Expedia hotel URLs containing `.h<property ID>`. |
| `maxReviewsPerHotel` | integer | Maximum unique reviews per property. |
| `pageSize` | integer | Reviews requested per page (1–50). |
| `sortBy` | string | Relevance, newest, highest rating, or lowest rating. |
| `includeRatingsOnly` | boolean | Include reviews with a rating but no written text. |
| `travelerType` | string | Optional Expedia traveler filter. |
| `search` | string | Optional public review-text search. |
| `locale` | string | Locale for Expedia-provided labels and dates. |
| `maxRuntimeSecs` | integer | Shared runtime budget with cleanup reserve. |

### Output fields

| Field | Description |
|---|---|
| `hotelId`, `propertyUrl` | Property identity and source page. |
| `reviewId` | Stable review identifier. |
| `rating`, `ratingLabel` | Numeric rating and Expedia label. |
| `superlative`, `title`, `text`, `locale` | Public review content. |
| `author`, `submissionDate` | Public author attribution and submitted date. |
| `stayDate`, `stayDetails`, `travelerType`, `travelers` | Public trip context when available. |
| `brandType`, `verifiedStay` | Source brand and verification marker when available. |
| `themes`, `photos` | Public themes and attached media metadata. |
| `managementResponses` | Public property-management replies. |
| `propertyReviewSource`, `reviewRegion` | Public source and region metadata. |
| `sourceUrl`, `scrapedAt`, `pageIndex`, `position` | Provenance and pagination metadata. |

### Input recipes

**Two hotels, newest reviews**

```json
{"propertyIds":["905202","10966026"],"maxReviewsPerHotel":50,"sortBy":"NEWEST_TO_OLDEST"}
```

**URL input with written reviews only**

```json
{"startUrls":[{"url":"https://www.expedia.com/Prague-Hotels-Golden-Well-Hotel.h905202.Hotel-Information"}],"maxReviewsPerHotel":20,"includeRatingsOnly":false}
```

### Pricing

This Actor uses pay-per-event pricing with a small run-start event and a per-review event. You are charged only after input validation, and review charges correspond to rows progressively saved to the dataset. See the live [Apify Pricing tab](https://apify.com/fetch_cat/expedia-reviews-scraper/pricing) for current rates and plan discounts.

### Tips and limits

- Start with 20 reviews to verify the property and output shape.
- Use numeric property IDs for the most stable input.
- Ratings-only reviews can omit title and text.
- Public reviews can be edited or removed upstream.
- Large exports stop within the configured runtime budget and preserve completed pages.
- A `SUMMARY` key-value-store record reports saved rows and any property-level failures.

### API usage

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~expedia-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"propertyIds":["905202"],"maxReviewsPerHotel":20}'
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/expedia-reviews-scraper').call({
  propertyIds: ['905202'], maxReviewsPerHotel: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python**

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/expedia-reviews-scraper').call(
    run_input={'propertyIds': ['905202'], 'maxReviewsPerHotel': 20}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
```

### MCP and AI agents

Add Apify MCP to Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com/?tools=fetch_cat/expedia-reviews-scraper"
```

Equivalent MCP configuration:

```json
{"mcpServers":{"apify":{"type":"http","url":"https://mcp.apify.com/?tools=fetch_cat/expedia-reviews-scraper"}}}
```

Example prompts:

- “Export the 20 newest reviews for Expedia property 905202.”
- “Compare the latest 50 public reviews for properties 905202 and 10966026.”

Review the dataset before using guest content in automated decisions.

### FAQ

#### Can I scrape several hotels in one run?

Yes. Add multiple IDs or URLs. A failure for one property does not discard already saved reviews from other properties.

#### Why is review text missing?

Expedia permits ratings-only reviews. Set `includeRatingsOnly` to `false` when you need written reviews only.

#### Does this require an Expedia login or cookies?

No. It exports review records available on public Expedia property surfaces.

#### Is it legal to scrape Expedia reviews?

You are responsible for your use case, applicable laws, Expedia terms, and personal-data obligations. Collect only what you need and avoid republishing personal content without a lawful basis.

### Related Actors

- [Booking Reviews Scraper](https://apify.com/fetch_cat/booking-reviews-scraper)
- [Tripadvisor Reviews Scraper](https://apify.com/fetch_cat/tripadvisor-reviews-scraper)
- [Google Maps Reviews Scraper](https://apify.com/fetch_cat/google-maps-reviews-scraper)

### Support

Open an issue from the Actor's Apify Console page with the property ID, sanitized input, run ID, and expected behavior. Do not include account credentials or private guest data.

# Actor input Schema

## `propertyIds` (type: `array`):

Numeric Expedia property IDs.

## `startUrls` (type: `array`):

Expedia Hotel-Information or Hotel-Reviews URLs containing .h<property ID>.

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

Maximum unique reviews saved for each property.

## `pageSize` (type: `integer`):

Pagination page size. Lower values make checkpoints more frequent.

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

Order Expedia uses for returned reviews.

## `includeRatingsOnly` (type: `boolean`):

Include reviews that contain a rating but no written text.

## `travelerType` (type: `string`):

Optional Expedia traveler-type filter value.

## `search` (type: `string`):

Only return reviews matching this public text search.

## `locale` (type: `string`):

Expedia locale code used for localized labels and dates.

## `maxRuntimeSecs` (type: `integer`):

Optional shared request budget; when omitted, the Actor uses 270 seconds and reserves time to save output and its summary.

## Actor input object example

```json
{
  "propertyIds": [
    "905202"
  ],
  "maxReviewsPerHotel": 20,
  "pageSize": 20,
  "sortBy": "NEWEST_TO_OLDEST",
  "includeRatingsOnly": true,
  "locale": "en_US"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "propertyIds": [
        "905202"
    ],
    "maxReviewsPerHotel": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/expedia-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 = {
    "propertyIds": ["905202"],
    "maxReviewsPerHotel": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "propertyIds": [
    "905202"
  ],
  "maxReviewsPerHotel": 20
}' |
apify call fetch_cat/expedia-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/expedia-reviews-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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