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

Scrape Expedia guest reviews for any hotel, including hotels given as Hotels.com links. Just add property IDs or hotel links and get the score out of 10, the guest's name, the full written review, trip type and any photos. Sort, filter and search within the text. $0.60 per 1,000 reviews.

- **URL**: https://apify.com/boncross/expedia-reviews.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.42 / 1,000 review-scrapeds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Expedia Reviews Scraper

### What is Expedia Reviews Scraper?

Paste a hotel's link, from Expedia or from Hotels.com, and Expedia Reviews Scraper gets you its Expedia guest reviews: the score out of 10, the full written comment, who wrote it, when, what kind of trip it was, and the hotel's reply. You can take as many as the hotel has, at $0.60 per 1,000 reviews on the Free plan ($0.42 on Business) with proxy usage and platform usage included.

What makes it worth choosing:

- **Expedia does the narrowing, and you pay for what you keep.** Search within the reviews for a word, keep one kind of traveller out of seven, keep only reviews with photos, or bound the score. You're charged per review returned.
- **Complaints first, if that's what you want.** Sort lowest rated first with a maximum rating of 2 and you get just those. On a hotel with 3,141 reviews, that returned all 55 of them after reading 60.
- **The hotel's side of the conversation.** Each review has the management reply, who wrote it and when.
- **The scoreboard with it.** One extra row per hotel gives the overall score, the number of verified reviews and a score per category.
- **Fast enough for a whole portfolio.** 15 hotels at 100 reviews each took 28 seconds, which is about 2,500 reviews a minute.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 28 of 28 live checks on its inputs and filters passed on 7 October 2026
- 12 hotels run the same day: 177 reviews, 12 overviews, none empty
- Charges checked against the 177 reviews
- A hotel with no reviews yet still gets its overview row

### What can you do with the reviews?

- Track sentiment for a property or a competitor set over time
- Find each mention of a topic (breakfast, noise, air conditioning) with the search input
- Pull the lowest-scored reviews first to triage complaints
- Build a review corpus for classification or summarisation
- Watch for new reviews daily and route them to Slack
- Compare how one hotel is reviewed on different country sites

### What review data do you get?

| | |
|---|---|
| ⭐ Score out of 10 | Score in words ("Excellent", "Good") |
| 📝 Full review text | Review title, where the guest gave one |
| 👤 Guest name | 📅 Date the review was written |
| 🧳 Trip type: who with, business or leisure | 🖼 Photos attached, and how many |
| 💬 The hotel's reply | Who replied, and when |
| 🏨 Property ID and hotel name | Market the review was read from |
| 📊 Hotel overview: score, review count, category scores | Guest review summary (optional) |
| 🔗 Link to the hotel page | Review ID and timestamp of the run |

### How to scrape Expedia reviews

No code is involved, and you don't need an Expedia account.

1. [Sign up for Apify](https://console.apify.com/sign-up), which is free, and open [Expedia Reviews Scraper](https://apify.com/boncross/expedia-reviews).
2. Paste hotel page links or property IDs into Hotels. Expedia and Hotels.com links can be mixed.
3. Say how many reviews you want per hotel (100 unless you change it), and pick a sort or filter if you need one.
4. Press Start. A hotel's first 25 reviews arrive in about 3 seconds. Download them as Excel, CSV, JSON, XML or HTML.

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, once per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `hotel-resolved`, per hotel the site answered | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `review-scraped`, per review returned | $0.0006 | $0.00054 | $0.00048 | $0.00042 |
| `hotel-summary`, per overview or summary row: one per hotel with **Include the rating breakdown** on (the default), and one more with **Include the guest review summary** on | $0.002 | $0.0018 | $0.0016 | $0.0014 |

Enterprise plans pay the Business price.

**$0.60 per 1,000 reviews** on the Free plan, $0.42 on Business. There's nothing on top of the table: proxy usage and platform usage are included.

- One hotel, 200 reviews, with its rating breakdown row: $0.001 + $0.0005 + $0.002 + 200 × $0.0006 = **$0.1235** ($0.0869 on Business).
- 50 hotels, 100 reviews each, with their rating breakdown rows: $0.001 + 50 × ($0.0005 + $0.002) + 5,000 × $0.0006 = **$3.126** ($2.196 on Business).

Apify's Free plan includes $5 of credits a month. That's about 78 hotels at 100 reviews each, or roughly 7,800 reviews, before you pay anything.

The fixed fees are small on purpose, and a run of 20 reviews isn't dominated by them. The rating breakdown row is on by default and costs $0.002 per hotel on the Free plan ($0.0014 on Business). If you only want reviews, switch "Include the rating breakdown" off and you won't pay for it. And if the site never answers for a hotel, you pay nothing for it.

### ⬇️ Input

Give it hotels. A property ID, an Expedia link and a Hotels.com link for the same hotel all mean the same thing: `12570`, or `https://www.expedia.com/Santorini-Hotels-Ira-Hotel-Spa.h6116875.Hotel-Information`, or `https://www.hotels.com/ho3388/`. Reviews aren't tied to a stay, and there are no dates to set.

You have two limits. "Maximum reviews per hotel" (default 100) applies to each hotel. "Maximum rows for the whole run" stops the run once that many rows exist in total, overview and summary rows included. 0 means no limit.

#### The newest reviews for two hotels

```json
{
  "hotels": ["12570", "https://www.hotels.com/ho3388/"],
  "maxReviewsPerHotel": 100,
  "sortBy": "NEWEST_TO_OLDEST"
}
```

#### Just the complaints, lowest first, with Expedia's own summary of the hotel

```json
{
  "hotels": ["https://www.hotels.com/ho3388/", "375613"],
  "maxReviewsPerHotel": 50,
  "sortBy": "LOWEST_TO_HIGHEST_RATED",
  "maxRating": 6,
  "includeSummary": true
}
```

#### What business travellers say about breakfast

```json
{
  "hotels": ["12570"],
  "searchTerm": "breakfast",
  "travellerType": "BUSINESS",
  "maxReviewsPerHotel": 200,
  "maxItems": 2000
}
```

#### A daily run that returns only reviews you haven't had

```json
{
  "hotels": ["12570", "375613"],
  "sortBy": "NEWEST_TO_OLDEST",
  "dedupStoreName": "my-hotels-reviews",
  "onlyNew": true,
  "includeOverview": false
}
```

**Filters.** "Minimum score" and "Maximum rating" bound the score out of 10 and work together: set both to read one band, or the maximum alone to pull the complaints. "Traveller type" keeps one kind of trip: business, couples, families, families with young children, groups, solo or with pets. "Reviews with photos only" keeps reviews a guest attached a photo to. "Search within reviews" matches the site's own review search, which is word-based and not a regular expression.

**Sort** is the site's recommended order by default. The others are newest first, highest rated first and lowest rated first.

**The two extra rows.** "Include the rating breakdown" (on by default) adds one row per hotel with its overall score and category scores. "Include the guest review summary" (off by default) adds one row per hotel with the site's themed summary of what guests liked. The site doesn't return that summary on every run, and when it doesn't, no row is added and nothing is charged for it.

**Market** picks which of Expedia's 40 country sites to read. Leave it on Auto and the first pasted link's own site sets it, while a list of bare property IDs uses the US site. Property IDs are the same in each market. What changes is the link in each row and the way the review date is written. The reviews themselves were the same set, in the same order, on the Japanese and French sites measured, each in the language its guest wrote it in.

**Label language** is English by default. The market's own language rewrites the site's wording on a review (the date as written, `postedAtText`). The review text is always as the guest wrote it.

#### For developers

- `maxReviewsPerHotel` is the per-hotel limit and `maxItems` the run-wide one. Reviews arrive ten at a time.
- `travellerType` takes `BUSINESS`, `COUPLES`, `FAMILIES`, `FAMILIES_WITH_YOUNG_CHILDREN`, `GROUPS`, `SOLO` or `WITH_PETS`. `sortBy` takes `RECOMMENDED`, `NEWEST_TO_OLDEST`, `HIGHEST_TO_LOWEST_RATED` or `LOWEST_TO_HIGHEST_RATED`. The other filters are `minRating`, `maxRating`, `withPhotosOnly` and `searchTerm`.
- `includeOverview` and `includeSummary` each bill one `hotel-summary` per hotel when their row is written.
- The rating and only-new filters are applied as reviews are read, and a hotel is read on until `maxReviewsPerHotel` reviews pass them. Once 200 of a hotel's reviews have been read, it stops if fewer than about 1 in 70 has passed. On a hotel with 3,141 reviews, keeping only those rated 2 or lower in the default order stopped after 210 read with 3 kept. Sort to match the filter and you get them all.
- `dedupStoreName` names the store that remembers which reviews you've had, and `onlyNew` returns only reviews no earlier run returned. Pair it with `NEWEST_TO_OLDEST`.
- `startUrls` takes the same links as `hotels`, pasted or loaded from a file, a Google Sheet or a remote list. The two are combined.
- `maxConcurrency` (default 4, up to 8) is how many hotels are fetched at once. `delayMs` (default 0) pauses after each request, per parallel lane, and values above 2000 are treated as 2000.
- If the platform moves or restarts a run part-way, it carries on where it stopped, and reviews already in the dataset aren't delivered or billed again. Restarting a 15-hotel run part-way gave the same 1,190 rows in the same order as an uninterrupted run.

### ⬆️ Output

One row per review. This one is from the Hilton Chicago, read on 7 October 2026:

```json
{
  "id": "6ac42d560503191a1ecd2839",
  "brand": "expedia",
  "market": "us",
  "hotelId": 12570,
  "rating": 10,
  "ratingScale": 10,
  "ratingText": "Excellent",
  "hotelName": "Hilton Chicago",
  "author": "Breonna",
  "title": null,
  "text": "Reserved this for my mother, father and sister and they absolutely loved the hotel.",
  "postedAt": "2026-10-05",
  "postedAtText": "Oct 5, 2026",
  "tripType": "Traveled with family",
  "tripTypes": ["Traveled with family"],
  "photos": [],
  "photoCount": 0,
  "managementResponse": "Thank you for choosing us for your family's visit and for sharing such a kind review. We are delighted that your parents and sister thoroughly enjoyed their time with us, and we truly appreciate the trust you placed in our team. We look forward to welcoming your family back, and hopefully you as well, on a future trip to Chicago.\n\nSincerely,\nHilton Chicago Team",
  "managementResponseBy": "Hilton Chicago",
  "managementResponseAt": "2026-10-06",
  "url": "https://www.expedia.com/en/h12570.Hotel-Information",
  "scrapedAt": "2026-10-07T20:26:41.445Z"
}
```

- `rating` is always out of 10 and `ratingScale` says so. You can average rows without checking which market they came from. `ratingText` is the site's wording for that score.
- `text` is null when a guest left a score and no comment. That's common: 5 of the 10 newest Hilton Chicago reviews in this run were rating-only.
- `tripType` is the line the site shows under a review about the trip, as written. `tripTypes` is the same line split into its parts.
- `postedAt` is the review date as `YYYY-MM-DD`, read in any market's language, with the site's wording in `postedAtText`. It's the date the review was written. The site doesn't publish the date of the stay.
- `brand` is always `expedia`, including for a hotel you gave as a Hotels.com link.
- If the site never answers for a hotel, you get a row with an `error` for it and no charge.

**The overview row.** With "Include the rating breakdown" on, each hotel also gets one row marked `isOverview`. It isn't a review: it has no author, no text and no date. A hotel with no reviews yet returns this row alone.

```json
{
  "id": "12570-overview",
  "brand": "expedia",
  "market": "us",
  "hotelId": 12570,
  "isOverview": true,
  "rating": 8.6,
  "ratingScale": 10,
  "ratingText": "Excellent",
  "reviewCount": 3380,
  "reviewCountText": "3,380 verified reviews",
  "categories": [
    { "name": "Cleanliness", "score": 8.8 },
    { "name": "Amenities", "score": 8.6 },
    { "name": "Service", "score": 8.8 }
  ],
  "url": "https://www.expedia.com/en/h12570.Hotel-Information",
  "scrapedAt": "2026-10-07T20:26:41.441Z"
}
```

**The summary row.** With "Include the guest review summary" on, a hotel may also get one row marked `isSummary`. Each group has a heading and points, and each point has the number of reviews behind it. This one is the Lamaro Hotel Barcelona, shortened to two points:

```json
{
  "id": "3388-summary",
  "brand": "expedia",
  "market": "us",
  "hotelId": 3388,
  "isSummary": true,
  "summaryHeader": "Guest review summary",
  "summaryGroups": [
    { "heading": "What guests liked",
      "points": [
        { "text": "The on-site restaurant offered delicious food, a great view, and friendly service.", "reviewCount": 143 },
        { "text": "The hotel is within walking distance to the beach and offers easy access to the Mediterranean Sea.", "reviewCount": 13 }
      ] }
  ],
  "url": "https://www.expedia.com/en/h3388.Hotel-Information",
  "scrapedAt": "2026-10-07T20:31:49.631Z"
}
```

Filter on `isOverview` and `isSummary` if you want reviews alone.

### How many reviews can you get, and how fast?

As many as the hotel has. There's no cap beyond that and the limits you set. Several pages and hotels are fetched at the same time. Measured on Apify on 2 October 2026, on Tokyo hotels:

| Run | Rows | Run time |
|---|---|---|
| 1 hotel, 25 reviews | 25 | 3 s |
| 4 hotels × 100 reviews, with the overview row | 404 | 11 to 14 s |
| 2 hotels × 300 reviews, with the overview row | 602 | 13 s |
| 15 hotels × 100 reviews, with the overview row | 1,190 | 28 s |

That's about 2,500 reviews a minute, and well over 100,000 fit in the default one-hour run limit. A run that has to switch to a fresh connection part-way takes a few seconds longer.

On the sample, each review row had a score and a guest name. Photos are uncommon, because most guests attach none.

### Limitations

- Reviews are read from Expedia only. A Hotels.com link returns the same property's Expedia reviews.
- Reviews are those shown to an anonymous visitor, each in the language its guest wrote it in. They aren't translated.
- The review summary row isn't always available. When the site doesn't return it, the hotel has no summary row.
- The name of whoever replied for the hotel (`managementResponseBy`) is read in English only. In a market's own language it's empty, while the reply and its date are still returned.
- One market per run. Property IDs match across markets, and you can read a hotel from whichever one you want.
- A review title is rare. Expedia lets a guest add one and most don't: 1 in 20 on the property it was measured against. The field is always present and usually `null`.
- Photos are uncommon, and `photoCount` is usually 0.

### FAQ

#### Can I paste Hotels.com links?

They work, and you can mix them with Expedia links in one list. A hotel has the same property ID on both sites. The reviews are read from Expedia for each hotel, and `brand` on the row says so.

#### How do I get only the reviews posted since my last run?

Give "Memory store" a name, turn on "Only new reviews" and sort newest first. Schedule that daily and each run hands you the reviews that appeared since the one before.

#### How do I pull only the bad reviews without reading thousands?

Set "Maximum rating" and sort lowest rated first. Sorting to match the filter matters: in the default order the same filter on a 3,141-review hotel stopped after 210 reviews read with 3 kept, and lowest-first returned all 55.

#### Why is the text empty on some reviews?

The guest gave a score and wrote nothing. Expedia publishes those, and you get them with `text: null`.

#### Are scores comparable between markets?

All of them are out of 10, and `ratingScale` records that on each row.

#### Which language are the reviews in?

Whatever the reviewer wrote, as published. Nothing is translated. The same set of reviews was returned on the Japanese and French sites measured.

#### Do I need proxies or an account?

Neither one. There's no login, no cookie of yours is used, and proxy usage is part of the price.

#### Is it legal to scrape Expedia and Hotels.com?

The actor reads only pages Expedia and Hotels.com serve to a logged-out visitor, with no account access. Reviews include the name a guest chose to publish, which can be personal data: under GDPR and similar laws you're responsible for how you store and use it, and for the site's own terms. Collecting public reviews is generally lawful in the UK, EU and US.

### Monitoring, your own code and AI agents

For review monitoring, an Apify Schedule plus "Only new reviews" does the work, and a webhook or the Slack integration can deliver each new review as it appears. Google Sheets, Make, Zapier and Airbyte connect the same way.

```bash
curl -X POST "https://api.apify.com/v2/acts/boncross~expedia-reviews/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hotels":["12570"],"maxReviewsPerHotel":100}'
```

Through the Apify MCP server (`mcp.apify.com`) an agent can call `boncross/expedia-reviews` itself, pull a hotel's lowest-rated reviews and summarise what guests complain about.

### More from BonCross

- [Expedia Hotel Details Scraper](https://apify.com/boncross/expedia-hotel-details): The full property record from Expedia and Hotels.com.
- [Expedia Hotel Search Scraper](https://apify.com/boncross/expedia-hotel-search): Every hotel Expedia and Hotels.com list for a destination and your dates.
- [Expedia Room Rates Scraper](https://apify.com/boncross/expedia-room-rates): Every room Expedia and Hotels.com are selling for a hotel and your dates.
- [Google Hotels Reviews Scraper](https://apify.com/boncross/google-hotels-reviews): Google Hotels reviews from every source Google shows, including the hotel's own site.
- [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews): Google Maps reviews for any place using URLs, Place IDs or names.
- [ikyu.com Reviews Scraper (一休)](https://apify.com/boncross/ikyu-reviews): ikyu.com (一休) reviews for hotels and ryokan.

### Your feedback

Missing a review you can see on the hotel's Expedia page, or a date that looks off? Report it on the Issues tab in Apify Console with the hotel's link. We read every report and answer there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/expedia-reviews/changelog.md

# Actor input Schema

## `hotels` (type: `array`):

Property IDs or hotel page links. A link looks like https://www.expedia.com/Santorini-Hotels-Ira-Hotel-Spa.h6116875.Hotel-Information: paste the whole link or just the number after the h.

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

Hotel page links, pasted or bulk-loaded from a file or Google Sheet. Use this instead of the list above when you have many.

## `maxItems` (type: `integer`):

Stop once this many rows have been returned, across every hotel. 0 means no limit.

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

How many reviews to return for each hotel. They arrive ten at a time.

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

The order reviews come back in: the site's own most-relevant order, newest first, or by score. Newest first is the one to use with Only new reviews.

## `searchTerm` (type: `string`):

Return only reviews mentioning this word, for example breakfast. Leave empty for all of them.

## `travellerType` (type: `string`):

Only reviews from this kind of trip, as Expedia's own traveller-type filter.

## `minRating` (type: `number`):

Drop reviews scored below this, out of 10. 0 means no limit.

## `maxRating` (type: `number`):

Drop reviews rated above this, out of 10. 0 means no limit. Use it with the minimum to read one band, or alone to read the complaints.

## `withPhotosOnly` (type: `boolean`):

Keep only reviews the guest attached a photo to. Expedia filters these itself, so a photo-only run is as quick as any other.

## `includeSummary` (type: `boolean`):

Add one extra row per hotel holding the site's own themed summary of its reviews: what guests liked, each point with the number of reviews behind it. Off by default: the site does not return it to every requester, and when it returns nothing the row is simply absent and nothing is charged.

## `includeOverview` (type: `boolean`):

Add one row per hotel with the overall score, the total number of verified reviews, and the score for each category such as cleanliness, amenities and service.

## `market` (type: `string`):

Which country's site to read. The links in every row point at it and the review dates are written its way; the reviews themselves were the same set, in the same order, on the Japanese and French sites measured. Auto follows each pasted link's own site, and a bare property ID uses the US site. Property IDs are the same in every market.

## `language` (type: `string`):

Language of the site's own wording on a review: the date as written and the heading of the hotel's reply. Review text is always as the guest wrote it, and the score wording and trip type stay in English. English is recommended: in the market's own language the name of whoever replied for the hotel cannot be read and comes back empty. The date is read either way.

## `dedupStoreName` (type: `string`):

Name of a storage area to remember the reviews already returned. Leave empty to remember nothing.

## `onlyNew` (type: `boolean`):

Return only reviews that no earlier run returned. Needs a memory store.

## `delayMs` (type: `integer`):

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.

## `maxConcurrency` (type: `integer`):

How many hotels are fetched at once. Higher is faster; the default suits almost every run.

## Actor input object example

```json
{
  "hotels": [
    "12570",
    "https://www.hotels.com/ho3388/"
  ],
  "maxItems": 0,
  "maxReviewsPerHotel": 100,
  "sortBy": "RECOMMENDED",
  "searchTerm": "breakfast",
  "minRating": 0,
  "maxRating": 0,
  "withPhotosOnly": false,
  "includeSummary": false,
  "includeOverview": true,
  "market": "auto",
  "language": "english",
  "onlyNew": false,
  "delayMs": 0,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `dataset` (type: `string`):

Expedia reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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 = {
    "hotels": [
        "12570"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/expedia-reviews").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 = { "hotels": ["12570"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/expedia-reviews").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 '{
  "hotels": [
    "12570"
  ]
}' |
apify call boncross/expedia-reviews --silent --output-dataset

```

## MCP server setup

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

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/nsAvnA6aQsFSfmKa5/builds/K6hWkKm9PHU6MXeNd/openapi.json
