# Agoda Reviews Scraper (`boncross/agoda-reviews`) Actor

Scrape Agoda hotel reviews, including the Booking.com reviews Agoda shows. Just add hotel URLs, ids or names and get score, title, text, pros and cons, stay dates, room, traveller type, country, hotel reply, category scores, aspect sentiment and topic summaries. $4.00 per 1,000 reviews.

- **URL**: https://apify.com/boncross/agoda-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 $2.80 / 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

## Agoda Reviews Scraper

### What is Agoda Reviews Scraper?

An Agoda hotel page shows two kinds of review: the ones Agoda's own guests wrote, and the Booking.com reviews Agoda displays beside them. Agoda Reviews Scraper gets you both in one dataset, each tagged with its source, and puts the hotel's scores on every row. Paste hotel links, property ids or names and press Start.

Five reasons to use it for review work:

- **Both sources, counted honestly.** A measured run of 300 reviews on two hotels returned 137 from Agoda and 163 from Booking.com. Each row says which, and the hotel's totals per source come with it, with and without text.
- **The site's own subject filters.** Ask for the reviews under a topic ("Pool", "Breakfast", "Check in") or a highlighted phrase ("infinity pool"). On three hotels, 160 of 160 returned reviews contained every word of their phrase.
- **Nine filters, applied before you're charged.** Source, score band, language, traveller type, room type, topic, phrase and review date. A review a filter removes costs nothing.
- **The same answer every time.** One Rome hotel returned the same 149 text reviews on three consecutive runs.
- **Many hotels in one run.** 25 hotels in four cities, 200 newest reviews each, came to 4,806 reviews in 94 seconds.

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

- 47 of 47 live checks on its inputs and filters passed on 7 October 2026
- 12 hotels run the same day, given as 1 link and 11 names: 275 reviews
- Charges checked against the 275 reviews
- A weak name match or a hotel with no reviews gets a row saying so

### Who is it for?

- Hotel and revenue teams watching their own reputation and a competitive set, with a daily feed of new reviews and hotel replies
- Analysts benchmarking cleanliness, facilities, location and value across properties
- Anyone hunting the recurring complaint behind a falling score, by topic or by room type
- Researchers who want to know what travellers from one country or one kind of trip value
- Teams building training and evaluation sets for sentiment and summarisation models

### How to scrape Agoda reviews

1. [Sign up for a free Apify account](https://console.apify.com/sign-up).
2. Open [Agoda Reviews Scraper](https://apify.com/boncross/agoda-reviews) and add your hotels: Agoda links, property ids or hotel names with the city.
3. Choose how many reviews you want per hotel and the order (newest first is the default). Add filters if you only want some of them.
4. Click Start. Twelve newest reviews for one hotel took 5 to 7 seconds in testing.
5. Download the reviews as Excel, CSV, JSON, XML or HTML.

There's no code to write and no Agoda login involved.

### What data is in each review?

| | |
|---|---|
| ⭐ Review score and rating text | Title and full review text |
| 👍 Pros and cons | 🌐 Language and translation |
| 📅 Posted date | Stay dates and room booked |
| Traveller name, country and group | 💬 Hotel reply |
| 📷 Review photos | 🏨 Hotel name, id and source |
| Hotel category scores | Per-aspect sentiment |
| Topic summaries | Review counts per source, with and without text |

You can also add the hotel's own record to each row: address, facilities, house rules for children and extra beds, and the property's FAQ answers such as the year it was built and the breakfast price. Numbers arrive as numbers, with the site's wording kept beside them.

### ⬇️ Input

Put your hotels in "Hotels". An entry can be an Agoda hotel URL, a numeric property id, the slug from a URL, or a hotel name with its city. "Max reviews per hotel" (1 to 20,000, default 100) sets how deep to go.

Got a long list of links? "Start URLs" loads them in bulk from a file, a Google Sheet or a remote list, and is combined with the Hotels list.

There are two limits. "Max reviews per hotel" applies to each hotel separately: ten hotels at 50 each returns 500. "Maximum results for the whole run" caps the run as a whole, and nothing past it is fetched or charged for.

**Newest reviews for three hotels, given as a link, an id and a name**

```json
{
  "hotels": [
    "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html",
    "49575",
    "Hotel Adlon Kempinski Berlin"
  ],
  "maxReviewsPerHotel": 200,
  "sort": "recent"
}
```

**Recent English reviews from couples, with the hotel record attached**

```json
{
  "hotels": ["206039"],
  "maxReviewsPerHotel": 300,
  "sort": "recent",
  "languages": ["en"],
  "travellerTypes": ["couples"],
  "reviewedAfter": "2026-01-01",
  "includeHotelDetails": true
}
```

**Reviews from guests who stayed in the king rooms**

"Room types" takes a room name, part of one, or the `roomTypeId` from [Agoda Room Rates Scraper](https://apify.com/boncross/agoda-room-rates), as on the site's Room type filter. It covers Agoda's own reviews, because Booking.com reviews don't name the room.

```json
{
  "hotels": [
    "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html",
    "https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"
  ],
  "roomTypes": ["King"],
  "maxReviewsPerHotel": 100
}
```

**Reviews about the pool and the bathrooms**

"Review topics" takes the topics shown above a hotel's reviews on the site (Location, Breakfast, Pool, Cleanliness, Check in, Value for money and so on), by name, part of a name, or id. Each hotel has its own list of up to 20. If you name one the hotel doesn't have, you get a row listing the ones it does. Only Agoda's own reviews are tagged with topics, and Booking.com reviews are left out while a topic is set. Each row says which topics it matched in `matchedTopics`.

```json
{
  "hotels": ["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],
  "topics": ["Pool", "Bathroom"],
  "maxReviewsPerHotel": 200
}
```

**Reviews that mention a highlighted phrase**

"Review phrases" takes the phrases Agoda highlights above a hotel's reviews ("infinity pool", "shuttle bus", "friendly staff"), by phrase, part of a phrase, or id. Each hotel has its own short list, up to about 8, drawn from English reviews, and a phrase the hotel doesn't have returns a row listing them. Only Agoda's own English reviews are matched. Each row says which phrases it matched in `matchedPhrases`.

```json
{
  "hotels": ["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],
  "phrases": ["infinity pool"],
  "maxReviewsPerHotel": 200
}
```

**A daily monitor that returns only new reviews**

```json
{
  "hotels": ["206039", "49575", "958"],
  "maxReviewsPerHotel": 100,
  "sort": "recent",
  "dedupStoreName": "agoda-reviews-seen"
}
```

**Aggregate scores only, with no review text**

```json
{
  "hotels": ["206039", "49575"],
  "summaryOnly": true
}
```

The remaining filters, briefly:

| Field | Notes |
|---|---|
| `sort` | `recent` (default), `helpful`, `rating_high` or `rating_low`. |
| `providers` | The review sources: `agoda`, `booking.com`, `others`. All three by default. |
| `minRating`, `maxRating` | A score band out of 10. 0 turns either end off. |
| `travellerTypes` | `business`, `couples`, `solo`, `families_young_children`, `families_teens` or `groups`. |
| `languages` | Codes such as `en`, `fr`, `it`, `pt`, `zh`, `th` or `he`. A code covers the variants Agoda lists separately (`zh` is Simplified, Taiwan and Hong Kong Chinese, `pt` is Portugal and Brazil), and adding the region narrows it (`zh-TW`, `pt-BR`, `en-GB`). |
| `reviewedAfter` | Keep reviews posted after a date. |
| `includeHotelSummary` | On by default. Repeats the hotel's aggregates on each row at no extra charge. |
| `includeHotelDetails` | Adds the hotel's own record. |

With a language filter, reviews arrive as written. Without one, Agoda translates most reviews into English and `originalText` holds the original.

#### For developers

- `maxReviewsPerHotel` is the per-hotel limit and `maxItems` the run-wide one (0 means no limit). Both count reviews returned, after filters.
- `dedupStoreName` names the storage that remembers which reviews you've had. Later runs with the same name push only new ones, and a review already seen isn't charged.
- `maxConcurrency` (Parallel requests, default 4, 1 to 32) sets how many requests run at once. If a run reports errors, try a lower number.
- `delayMs` (Delay between requests, default 0) adds a pause before each request, in milliseconds. Values above 2000 are treated as 2000.
- Each page of reviews is asked again until every source that still has reviews on it is present. That's what keeps the counts stable from run to run.
- Reviews are saved as each hotel finishes. If the platform restarts a run part-way, the reviews already delivered are neither repeated nor charged again.

### ⬆️ Output

One row is one review, with the hotel's aggregates repeated on it, which means a single export is enough for most analysis. This one is an Agoda guest's review of a New York hotel:

```json
{
  "input": "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html",
  "hotelId": 206039,
  "hotelName": "Four Seasons Hotel New York Downtown",
  "url": "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html",
  "hotelRating": 8.7, "hotelRatingScale": 10, "hotelRatingText": "Excellent",
  "hotelReviewCount": 31,
  "hotelGrades": [
    { "name": "Cleanliness", "rating": 9.7, "ratingScale": 10 },
    { "name": "Facilities", "rating": 8.9, "ratingScale": 10 },
    { "name": "Location", "rating": 9.2, "ratingScale": 10 },
    { "name": "Service", "rating": 8.6, "ratingScale": 10 },
    { "name": "Value for money", "rating": 8, "ratingScale": 10 }
  ],
  "hotelReviewCounts": [
    { "providerId": 332, "provider": "Agoda Reviews", "reviewCount": 31, "reviewsWithText": 5 },
    { "providerId": 3038, "provider": "Booking.com Reviews", "reviewCount": 167, "reviewsWithText": 85 }
  ],
  "hotelAspectSentiment": [],
  "hotelTopicSummaries": { "positives": [], "negatives": [] },
  "id": "485412110", "reviewId": 485412110, "provider": "Agoda", "providerId": 332,
  "rating": 10, "ratingScale": 10, "ratingText": "Exceptional",
  "title": "Great value",
  "text": "Beautiful hotel, excellent area. The staff really makes this hotel enjoyable.",
  "positives": null, "negatives": null,
  "originalTitle": null, "originalText": null, "language": "en", "translatedTo": null,
  "postedAt": "2022-03-23T23:30:00+07:00", "checkIn": "2022-03-20", "checkOut": "2022-03-22", "stayMonth": "March 2022",
  "reviewer": { "name": "Douglas", "country": "United States", "countryCode": "US", "group": "Family with young children", "roomType": "Manhattan Room with king bed", "lengthOfStay": 2, "reviewCount": null, "isExpert": false },
  "response": null, "images": [],
  "sort": "recent", "scrapedAt": "2026-10-07T20:35:52.654Z"
}
```

**Which columns a review fills depends on where it came from.** Agoda's own reviews have `text` together with `checkIn`, `checkOut` and `stayMonth`. They're also the only ones that can have guest `images`, a management `response` or the untranslated `originalTitle` and `originalText`. A Booking.com review of the same hotel has `positives` and `negatives` in place of `text` ("Hotel staff, room size, cleanliness and overall quality of facility." and "Seating in lobby was a bit limited." on one from May 2026) and leaves the rest of those empty.

Measured over 300 reviews on two properties: `text` on 137 of 137 Agoda reviews and 0 of 163 Booking.com ones, `positives` on 159 of those 163, `response` on 18 and `images` on 11 of the Agoda reviews. `title`, `rating`, `postedAt`, `language` and `reviewer` are there whatever the source. Filter on `provider` if your pipeline needs one shape.

A few more things you'll see:

- With "Review topics" set, each review has `matchedTopics`, for example `["Pool"]` or `["Pool", "Bathroom"]`. With "Review phrases" set, `matchedPhrases` works the same way.
- With "Summary rows only", each hotel returns one row marked `isSummary: true`. It has the overall score, category grades, per-source counts, aspect sentiment, topic summaries, recent scores, the hotel's review room types and its word cloud.
- A hotel Agoda lists no reviews for, or whose reviews your filters all removed, returns one row with `input`, `hotelId`, `hotelName`, `url`, `reviewsRead` and an `error` saying which of the two it was.
- `hotelAspectSentiment` and `hotelTopicSummaries` are empty where Agoda publishes none for the hotel, as in the record above.

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

| Run | Result |
|---|---|
| Le Méridien Visconti Rome, 12 newest | 12 reviews in 5 to 7 seconds |
| Sheraton Grande Tokyo Bay and The Peninsula Bangkok, newest first, 150 each | 300 reviews, 137 Agoda and 163 Booking.com, 18 with a hotel reply |
| Le Méridien Visconti Rome and Sheraton Grande Tokyo Bay, four languages, 100 each, hotel details on | 125 reviews |
| Le Méridien Visconti Rome, no cap | all 149 text reviews, 56 Agoda and 93 Booking.com, identical three runs in a row |
| Le Méridien Visconti Rome, Hotel Nikko Kanazawa and Sheraton Grande Tokyo Bay, 200 newest each | 548 reviews in 7 to 17 seconds, up to a minute in an hour when Agoda answers slowly |
| Six hotels, 200 newest each | 1,018 reviews in 33 seconds |
| 25 hotels in four cities, 200 newest each | 4,806 reviews in 94 seconds |

Timed runs were measured on Apify on 2 October 2026. At those rates a one-hour run collects well over 100,000 reviews.

Don't expect the number on Agoda's page. Its headline count, for example "From 74 reviews", includes score-only submissions with no text. The review pages serve only reviews with text, and `hotelReviewCounts` reports both numbers per source.

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `hotel-resolved`, per URL, slug or name resolved to a property id | $0.002 | $0.002 | $0.002 | $0.002 |
| `review-scraped`, per review | $0.004 | $0.0036 | $0.0032 | $0.0028 |
| `hotel-summary`, per hotel with `summaryOnly` | $0.002 | $0.0018 | $0.0016 | $0.0014 |

Enterprise plans pay the Business price.

**$4.00 per 1,000 reviews** on the Free plan, $2.80 on Business, with the hotel's aggregates included. Nothing is added on top: proxy usage and platform usage are in that price.

Reviews your filters remove are free, and so are reviews an only-new store has already seen. The aggregates and hotel details cost nothing extra when they arrive with reviews. Pass property ids and you skip the $0.002 resolution fee.

- 20 hotels by id, 200 reviews each: $0.002 + 4,000 × $0.004 = **$16.002** ($11.202 on Business).
- A daily monitor of 50 hotels by id, where about 5 new reviews arrive per hotel per day: 30 × ($0.002 + 250 × $0.004) = **$30.06** for the month ($21.06 on Business).
- Aggregate scores only for 100 hotels by id: $0.002 + 100 × $0.002 = **$0.202** ($0.142 on Business).

Apify's Free plan comes with $5 of credits each month. With this actor that's about 12 runs of 100 reviews for a hotel given by link, roughly 1,200 reviews.

### Limitations

- A hotel name has to match one of Agoda's suggestions closely. When none does, you get an `error` row naming the closest hotel and its id, and no fee. In a run of 26 names on 7 October 2026, 21 reached their hotel, with misspelled, shortened, Japanese, Korean, Chinese and Thai names among them, and 5 were refused: 3 invented names and 2 hotels Agoda doesn't suggest under the name typed. A link, a slug or a property id isn't name-checked at all, which makes it the surer input when you have one.
- A hotel with no reviews, or with none left after your filters, returns one row saying so. The `hotel-resolved` fee for a name or link still applies.
- Agoda doesn't publish helpful-vote counts. There's no vote column, and "most helpful" is Agoda's own order within each source.
- `translatedTo` is set only where Agoda translated the review and sends the original beside it (`originalText`). Many reviews, including most Booking.com ones, are returned as written.
- Agoda sends Brazilian Portuguese reviews with no language code, and `language` is empty on them. The `pt` and `pt-BR` filters still return them.
- Booking.com reviews have Agoda's 0 to 10 score, not Booking.com's original scale. They have no stay dates, photos or management response.
- Review photos are rare, and only Agoda's own reviews can have them: 11 of 137 in a measured sample.
- "Room types" and "Review topics" apply to Agoda's own reviews only. Topics are Agoda's tagging: a review filed under Pool usually names the pool, though not always (53 of 61 did in a measured sample). The count Agoda prints on a topic counts recent mentions and is smaller than the number of reviews the topic returns.
- "Review phrases" matches Agoda's own English reviews only, and only the few phrases Agoda highlights for that hotel (8 at a large Tokyo hotel, 3 at a small one in Rome). The count matched the number Agoda reports for the phrase.
- There's no free-text keyword filter. Agoda stopped applying one and returns the same reviews whatever word is given.
- The `others` source is listed on Agoda but its partner reviews aren't served. Selecting it alone normally returns nothing.
- Score-only submissions are counted in `hotelReviewCounts` but have no review to return.
- Read `reviewsWithText` as approximate. Agoda's own figure flips between two values from one request to the next: 8 and 5 for one hotel within a second on 7 October 2026.

### FAQ

#### Does it include the Booking.com reviews Agoda shows?

It does. They arrive in the same dataset, tagged `provider: "Booking.com"`. To keep only one source, set "Review sources" to `agoda` or `booking.com`.

#### Why is my review count lower than the number on Agoda's page?

Agoda's headline figure counts score-only submissions that have no text. The review pages show only reviews with text. `hotelReviewCounts` gives both numbers for each source, which lets you see the split.

#### How do I get only the reviews about one thing, like breakfast?

Use "Review topics" with the topic's name. If the hotel doesn't have that topic, the run returns a row listing the topics it does have, and you can pick from those. For an exact wording, try "Review phrases", which is limited to the handful Agoda highlights for the hotel.

#### How do I get only new reviews each day?

Give "Only-new store" a name and schedule the run. The actor remembers which reviews it has returned for that name, and later runs push only the new ones. You aren't charged for a review you've already had.

#### Can I get the scores without paying for the text?

Switch on "Summary rows only". Each hotel then returns one row with the overall score, category scores, per-source counts, aspect sentiment and topic summaries, at the `hotel-summary` price of $0.002 per hotel on the Free plan.

#### What happens when a hotel has no reviews?

You get one row for it with an `error` that says Agoda lists no reviews for the hotel, or that none passed your filters. No review is charged. If you gave the hotel as a name or a link, the $0.002 `hotel-resolved` fee still applies.

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

You need neither. Proxy usage is part of the price and there's nothing to configure. No login is involved.

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

The actor reads only what Agoda serves to any logged-out visitor. Reviews contain personal data such as a reviewer's display name and country, which means you need a lawful basis to collect and store them. You're responsible for complying with Agoda's terms and applicable law.

### Schedules, API and AI agents

A reputation feed is a schedule plus an only-new store: Apify runs the actor each morning and the dataset holds yesterday's reviews and nothing else. From there a webhook, Slack or Google Sheets can carry them to whoever answers guests.

To call it from code:

```
POST https://api.apify.com/v2/acts/boncross~agoda-reviews/run-sync-get-dataset-items?token=YOUR_TOKEN
```

The `apify-client` packages for Node.js and Python wrap the same API. An AI agent can run it through the Apify MCP server (`mcp.apify.com`) as `boncross/agoda-reviews`, which is a quick way to ask "what do guests complain about at these three hotels?" and get an answer built on the actual reviews.

### More from BonCross

- [Agoda Search Scraper](https://apify.com/boncross/agoda-search): Agoda search results for any destination and dates.
- [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews): Every Booking.com guest review for any hotel.
- [Expedia Reviews Scraper](https://apify.com/boncross/expedia-reviews): Expedia guest reviews for any hotel, including hotels given as Hotels.com links.
- [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews): Google Maps reviews for any place using URLs, Place IDs or names.
- [Tripadvisor Place Details Scraper](https://apify.com/boncross/tripadvisor-location-details): The full Tripadvisor record for any hotel, restaurant or attraction.
- [Tripadvisor Reviews Scraper](https://apify.com/boncross/tripadvisor-reviews): Every Tripadvisor review for any hotel, restaurant, attraction or tour.

### Your feedback

If a review is missing, lands under the wrong hotel, or a column you need isn't there, open an issue on the Issues tab in Apify Console. We read them all and reply in the thread. Requests for a new filter or column are welcome there too.

# Changelog

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

# Actor input Schema

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

Agoda hotel URLs, the slug from a URL (four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us), numeric property ids, or hotel names with their city.

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

Agoda page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

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

How many reviews to return per hotel. This counts reviews actually returned, so filters do not eat into it.

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

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

## `sort` (type: `string`):

One of Agoda's own orderings. Agoda does not publish helpful-vote counts, so Most helpful is Agoda's own order within each review source.

## `providers` (type: `array`):

Which review sources to return: agoda, booking.com, others. Agoda's feed mixes its own and Booking.com reviews and the selection is applied to the results. The 'others' partner sources are listed on the site but are not served by the feed, so that option normally returns nothing.

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

Drop reviews below this score out of 10. 0 turns it off. Dropped reviews are not charged.

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

Drop reviews above this score out of 10. 0 turns it off.

## `travellerTypes` (type: `array`):

Keep only reviews from these kinds of trip: business, couples, solo, families_young_children, families_teens, groups. A single type is applied by Agoda itself; several are applied after fetching.

## `roomTypes` (type: `array`):

Keep only reviews from guests who stayed in these rooms, as on the site's Room type filter. Give a room name, part of one ("Twin" picks every twin room) or a room id; the id is the same roomTypeId the Agoda Room Rates Scraper returns. Only Agoda's own reviews name the room, so Booking.com reviews are left out while this is set. A name the hotel does not have returns a row listing the hotel's room types.

## `topics` (type: `array`):

Keep only reviews about these topics, as on the site's topic chips above the reviews: Location, Breakfast, Pool, Cleanliness, Check in and so on. Give a topic name or part of one (English), or a topic id. Each hotel has its own list of up to 20 topics; a name the hotel does not have returns a row listing its topics. Only Agoda's own reviews are tagged with topics, so Booking.com reviews are left out while this is set. Each row then says which of your topics it matched in matchedTopics.

## `phrases` (type: `array`):

Keep only reviews that mention one of the hotel's highlighted phrases, as in the phrase list above its reviews: "shuttle bus", "train station", "friendly staff" and so on. Give a phrase or part of one, or a phrase id. Each hotel has its own short list (up to about 8 phrases, taken from English reviews); a phrase the hotel does not have returns a row listing its phrases. Only Agoda's own English reviews are matched, so Booking.com reviews are left out while this is set. Each row then says which of your phrases it matched in matchedPhrases.

## `reviewedAfter` (type: `string`):

Drop reviews older than this date, YYYY-MM-DD.

## `includeHotelSummary` (type: `boolean`):

Repeat the hotel's aggregates on every row: overall score, scores by category, review counts per source, aspect sentiment and Agoda's AI topic summaries. No extra charge.

## `includeHotelDetails` (type: `boolean`):

Also read the hotel's Agoda listing for address, coordinates, stars, description, check-in and check-out times, house rules (children, extra beds, adult age), facilities, highlights, nearby places, images, the property's FAQ answers (year built, breakfast price and more) and a per-source score breakdown. No extra charge.

## `summaryOnly` (type: `boolean`):

One row per hotel with the aggregate scores, sentiment and topics and no individual reviews. Billed as hotel-summary.

## `languages` (type: `array`):

Keep only reviews written in these languages, as codes: en, fr, de, it, es, pt, nl, ja, zh, ko, th, vi, id, ms, ru, pl, cs, tr, he, ar, sv, no, da, fi. A code covers every variant Agoda lists separately (zh is Simplified, Taiwan and Hong Kong; pt is Portugal and Brazil); add the region to narrow it, as in zh-TW, pt-BR or en-GB.

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

Name of a key-value store. Reviews returned in earlier runs are skipped and not charged.

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

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

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

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.

## Actor input object example

```json
{
  "hotels": [
    "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html"
  ],
  "startUrls": [],
  "maxReviewsPerHotel": 100,
  "maxItems": 0,
  "sort": "recent",
  "providers": [
    "agoda",
    "booking.com",
    "others"
  ],
  "minRating": 0,
  "maxRating": 0,
  "travellerTypes": [],
  "roomTypes": [],
  "topics": [],
  "phrases": [],
  "reviewedAfter": "",
  "includeHotelSummary": true,
  "includeHotelDetails": false,
  "summaryOnly": false,
  "languages": [],
  "dedupStoreName": "",
  "maxConcurrency": 4,
  "delayMs": 0
}
```

# Actor output Schema

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

Agoda 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": [
        "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/agoda-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": ["https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/agoda-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": [
    "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html"
  ]
}' |
apify call boncross/agoda-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/agoda-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/kddmpZAMcu47wUIYe/builds/R2Zyxac3oU2P1YR1m/openapi.json
