Marriott Reviews Scraper avatar

Marriott Reviews Scraper

Pricing

from $0.42 / 1,000 review-scrapeds

Go to Apify Store
Marriott Reviews Scraper

Marriott Reviews Scraper

Scrape guest reviews for any Marriott hotel. Just add hotel codes or links and get the rating, title, full text, date, stay dates, trip type, member level, six category ratings and the hotel's reply. Filter by rating, language, trip type, keyword or date.

Pricing

from $0.42 / 1,000 review-scrapeds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

What is Marriott Reviews Scraper?

Marriott Reviews Scraper reads the guest reviews on a Marriott hotel's page all the way back to the oldest one. A hotel with 2,152 reviews returned all 2,152 in 5 seconds, and the oldest of New York Marriott Marquis's 12,988 reviews, from 2014, is reachable too. Give it a hotel code or a marriott.com link. It works for Marriott, Sheraton, Westin, W, JW Marriott, The Ritz-Carlton, St. Regis, Courtyard, Aloft, Autograph Collection and the rest of the brands.

What you get beyond the star rating and the text:

  • Six category ratings on each review: cleanliness, dining, location, service, amenities and value for money.
  • Who wrote it. Trip type (solo, couple, family, group) and Marriott Bonvoy member level, where the guest gave them, and you can filter on both.
  • The hotel's reply, with the date it was posted, next to the review it answers.
  • A summary row per hotel if you want one: average rating, the count on each star, category averages, and the mix of trip types and member levels.
  • A low price for deep pulls. $0.60 per 1,000 reviews on the Free plan and $0.42 on Business, proxy included.

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

  • 30 of 30 live checks on its inputs and filters passed on 6 October 2026
  • 10 hotels run on 7 October 2026: 100 reviews, 5 hotels with none published
  • Charges checked against the 100 reviews
  • A hotel with no published reviews gets an uncharged row saying so

You can also:

  • Filter by star rating, language, keyword, posting date, or reviews the hotel replied to
  • Sort newest, oldest, highest rating, lowest rating, most helpful, or in Marriott's own order
  • Read each review in the language the guest wrote it, with its locale
  • See when the review was posted and, where the guest gave it, when they checked out
  • Schedule it and get only the reviews that appeared since last time

What do people do with Marriott reviews?

  • Track a hotel's rating month by month and see which category is dragging it down
  • Read the complaints about a competing hotel before repositioning
  • Compare what couples say with what families say about the same property
  • Measure how often a hotel replies to its guests, and how fast
  • Compare the reviews of Marriott's elite members with those of non-members
  • Watch for new one and two star reviews the day they appear
  • Build a multilingual dataset for sentiment work, with six category ratings already attached

What review data do you get?

FieldDescription
⭐ RatingThe guest's rating out of 5
TitleThe review headline
💬 TextThe full review text
🌍 LanguageThe language the review was written in, and its locale (en_GB, zh_CN …)
📅 Posted dateWhen the review appeared
StayCheck-out date and stay month, where the guest gave them
Trip typeSolo, couple, family or group, where the guest gave it
🏅 Member levelMarriott Bonvoy level, from non-member to Ambassador, where the guest gave it
GuestDisplay name and home town
Category ratingsCleanliness, dining, location, service, amenities, value for money
Hotel replyThe hotel's response text and when it was posted
👍 Helpful votesHow many readers marked it helpful, and not helpful
PhotosLinks to any photos the guest attached, and their count
🏨 HotelHotel code, name, page link, average rating and review total
Summary (optional)One row per hotel: average rating, star counts, category averages, trip-type and member-level mix

How to scrape Marriott reviews

  1. Create a free Apify account.
  2. Open Marriott Reviews Scraper.
  3. Add a Marriott hotel code such as EDIWH, or paste the hotel's marriott.com address.
  4. Set how many reviews you want per hotel and any filter you need.
  5. Click Start. Twenty reviews take 2 to 3 seconds.
  6. Download the reviews as Excel, CSV or JSON.

⬇️ Input

The one thing you must give it is a hotel. Use the five-letter code in the hotel's marriott.com address (EDIWH in /hotels/ediwh-w-edinburgh/) or paste the address itself. The rest is optional.

With a long list of hotels, put their addresses in Start URLs, which loads them in bulk from a file, a Google Sheet or a remote list. Both inputs are used together.

You have two limits. "Maximum reviews per hotel" (default 100) applies to each hotel on its own: ten hotels at 50 each returns 500. "Maximum results for the whole run" caps the reviews of the run as a whole, and you aren't charged for anything past it.

{
"hotels": ["EDIWH", "https://www.marriott.com/en-us/hotels/nycmq-new-york-marriott-marquis/overview/"],
"maxReviewsPerHotel": 200,
"maxItems": 0,
"sortBy": "newest",
"minRating": 0,
"maxRating": 2,
"reviewLanguages": ["en"],
"tripTypes": [],
"memberLevels": [],
"containsText": "",
"reviewedAfter": "2026-01-01",
"reviewedBefore": "",
"onlyWithOwnerResponse": false,
"includeSummary": true
}

That example asks two hotels for their one and two star reviews in English since 1 January 2026, newest first, with a summary row for each hotel.

InputWhat it does
hotelsHotel codes or marriott.com hotel addresses
startUrlsHotel addresses in bulk, from a file, a Google Sheet or a remote list
maxReviewsPerHotelReviews per hotel (default 100)
maxItemsReviews for the whole run (0 = no limit)
sortBynewest, oldest, highest, lowest, helpful, relevant
minRating / maxRatingStar range, 1 to 5 (0 = no limit)
reviewLanguagesTwo-letter language codes, such as en, ja, zh, de
tripTypesSolo, Couple, Family, Group
memberLevelsNon-Member, Member, Silver, Gold, Platinum, Titanium, Ambassador
containsTextOnly reviews mentioning a word or phrase
reviewedAfter / reviewedBeforePosting date range, as YYYY-MM-DD
onlyWithOwnerResponseOnly reviews the hotel replied to
includeSummaryAdds one summary row per hotel
onlyNewReviews + dedupStoreNameSkip reviews earlier runs returned
maxConcurrencyHotels read side by side (default 4)

For developers

  • maxReviewsPerHotel is the per-hotel limit and maxItems the run-wide one. Nothing past maxItems is fetched.
  • onlyNewReviews needs a dedupStoreName, the store that remembers which reviews earlier runs returned. With the newest-first order, a run stops at the first review it has already delivered. A day with no new reviews returns nothing.
  • tripTypes and memberLevels keep only reviews where the guest gave one. Reviews from Marriott's post-stay survey don't have either, and those filters skip them.
  • maxConcurrency (default 4, 1 to 8) is how many hotels are read side by side.
  • If the platform moves or restarts a run part-way, it carries on from where it stopped. Reviews already in the dataset aren't delivered or billed a second time.

⬆️ Output

You get one row per review.

{
"id": "EDIWH-376321249",
"reviewId": "376321249",
"url": "https://www.marriott.com/en-us/hotels/ediwh-w-edinburgh/reviews/",
"scrapedAt": "2026-10-06T10:29:50.372Z",
"input": "EDIWH",
"hotelId": "EDIWH",
"hotelName": "W Edinburgh",
"rating": 3,
"ratingScale": 5,
"title": "Not what you would expect",
"text": "Initial greeting was not great and room was very dark with a tiny bathroom . There are other better hotels in Edinburgh",
"language": "en",
"locale": "en_GB",
"postedAt": "2026-01-14T11:38:38.000+00:00",
"checkIn": null,
"checkOut": null,
"stayMonth": null,
"tripType": "Family",
"memberLevel": "Non-Member",
"authorName": "Li",
"authorLocation": "AMSTERDAM",
"authorAgeRange": null,
"isRecommended": null,
"recommendedFor": [],
"subRatings": [
{ "name": "Cleanliness", "rating": 5 },
{ "name": "Location", "rating": 4 },
{ "name": "Service", "rating": 3 },
{ "name": "Value for the Money", "rating": 1 }
],
"helpfulVotes": 0,
"notHelpfulVotes": 0,
"photos": [],
"photoCount": 0,
"hasOwnerResponse": true,
"ownerResponseText": "Dear Li, \n\nThank you for sharing your feedback with us. I am truly sorry that your arrival experience did not feel warm or welcoming…",
"ownerResponseAt": "2026-01-16T12:56:42.000+00:00",
"isSyndicated": false,
"hotelRating": 4.34,
"hotelRatingScale": 5,
"hotelReviewCount": 656
}

id joins the hotel code to the review, which keeps rows distinct across hotels. reviewId is the review's own identifier. url is the hotel's reviews page, because Marriott publishes no per-review link. hotelRating and hotelReviewCount are the hotel's own totals, whatever filters you set.

With Add a rating summary row per hotel on, each hotel also gets one row ahead of its reviews, marked isSummary: true. totalReviews is the hotel's full review count, and matchingReviews is how many match your filters.

{
"isSummary": true,
"id": "EDIWH-summary",
"url": "https://www.marriott.com/en-us/hotels/ediwh-w-edinburgh/reviews/",
"hotelId": "EDIWH",
"hotelName": "W Edinburgh",
"rating": 4.34,
"ratingScale": 5,
"totalReviews": 656,
"matchingReviews": 656,
"ratingDistribution": [
{ "rating": 5, "count": 465 }, { "rating": 4, "count": 68 }, { "rating": 3, "count": 48 },
{ "rating": 2, "count": 29 }, { "rating": 1, "count": 46 }
],
"subRatings": [
{ "name": "Cleanliness", "rating": 4.71 }, { "name": "Dining", "rating": 4.42 }, { "name": "Location", "rating": 4.89 },
{ "name": "Service", "rating": 4.45 }, { "name": "Amenities", "rating": 4.52 }, { "name": "Value for the Money", "rating": 4 }
],
"tripTypeCounts": { "Solo": 52, "Couple": 319, "Family": 110, "Group": 43 },
"memberLevelCounts": { "Member": 278, "Silver": 23, "Gold": 61, "Platinum": 40, "Titanium": 26, "Ambassador": 5, "Non-Member": 84 },
"firstReviewAt": "2023-12-07T09:45:58.000+00:00",
"lastReviewAt": "2026-10-05T07:52:58.000+00:00"
}

A hotel with no published reviews, or a code Marriott doesn't know, returns a row with error saying which it was.

How many reviews can you get, and how fast?

All of them. There's no depth limit, and a long list adds little time because several hotels are read at once.

RunReviewsTime
One hotel, newest 20202 to 3 s
One hotel, every review2,1525 s
15 hotels in Europe, the US, the Middle East and Asia, 300 each3,9008 s

Measured on Apify on 6 October 2026, with the run's own start-up included.

How much does it cost to scrape Marriott reviews?

EventFree planStarterScaleBusiness
actor-start, once per run$0.001$0.001$0.001$0.001
hotel-resolved, once per hotel whose reviews were read$0.0005$0.0005$0.0005$0.0005
review-scraped, per review returned$0.0006$0.00054$0.00048$0.00042
hotel-summary, per summary row (only with Add a rating summary row per hotel)$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. That's the whole price: proxy usage is included and there's nothing to set up. A row reporting a hotel that couldn't be read is never charged.

  • One hotel, newest 20 reviews: $0.001 + $0.0005 + 20 × $0.0006 = $0.0135 ($0.0099 on Business).
  • One hotel, all 2,152 reviews: $0.001 + $0.0005 + 2,152 × $0.0006 = $1.29 ($0.91 on Business).
  • 15 hotels, 3,900 reviews, with a summary row per hotel: $0.001 + 15 × $0.0005 + 3,900 × $0.0006 + 15 × $0.002 = $2.38 ($1.67 on Business).

Apify gives Free plan accounts $5 of credits a month. Here that's about 8,000 reviews, taken 100 per hotel.

Limits worth knowing before you build on it

  • A hotel's reviews come in two shapes. Reviews from Marriott's post-stay survey (most reviews since 2024) have the check-out date but no trip type, member level or home town. Reviews written on the website have those but no stay date. Measured over 3,900 recent reviews of 13 hotels: check-out date on 54%, trip type and member level on 45%, home town on 35%.
  • checkIn, authorAgeRange, isRecommended and recommendedFor are filled only on older reviews (around 2014-2018). Recent reviews leave them empty.
  • A reply is returned when the hotel's reply is published. A few reviews count a reply that isn't shown (20 of 3,900 measured). Those rows have hasOwnerResponse: false, and the replied-to filter leaves them out.
  • Guests rarely attach photos. None of the 3,900 reviews measured had one.
  • Category ratings are on the guest's own scale of 1 to 5. Most reviews rate all six, and some rate fewer.
  • relevant is Marriott's own order, and helpful orders by the share of helpful votes. Neither key is a column.
  • Some hotels publish no reviews at all (some Design Hotels members, for example). You get an error row saying so, and it's never charged.

Fresh reviews on a schedule, or from your own code

For a review monitor, put the run on an Apify Schedule, switch on "Only reviews not seen in earlier runs" and name a de-duplication store. Each run then returns what appeared since the last one, and a webhook or the Slack and Google Sheets integrations can pass new low ratings on the day they're posted.

From code, start a run and wait for the dataset in one call:

POST https://api.apify.com/v2/acts/boncross~marriott-reviews/run-sync-get-dataset-items

The apify-client package exists for JavaScript and Python. An AI agent can reach the actor through the Apify MCP server at mcp.apify.com, call marriott-reviews with a hotel code and a filter, and reason over the reviews it gets.

FAQ

Do I need proxies or a Marriott account?

You don't need an account, and proxy usage is included in the price.

Can I get every review a hotel has, or only the first page?

Every review. Set "Maximum reviews per hotel" high and the run reaches the oldest review the hotel has.

Where do I find a hotel's code?

In its marriott.com address: EDIWH in /hotels/ediwh-w-edinburgh/. Or paste the address itself. Marriott Hotel Search Scraper lists the codes for a whole destination.

Why did my trip-type filter return fewer reviews than I expected?

The trip-type and member-level filters keep only reviews where the guest gave one. Reviews from the post-stay survey, which is most reviews since 2024, don't have either and are skipped.

Why is the check-out date empty on some reviews?

Only survey reviews have a stay date. A review written on the website has trip type, member level and home town in its place.

How do I see only the bad reviews?

Set "Maximum rating" to 2. Add "Posted on or after" for a recent window, or a keyword such as a room type or a facility.

Does it return the hotel's reply?

On each review that has a published reply, with the date it was posted. "Only reviews the hotel replied to" keeps just those.

Why did a hotel return an error row and no reviews?

Either Marriott doesn't know the code, or the hotel publishes no reviews. The row says which, and it isn't charged.

This scraper collects reviews that Marriott publishes publicly on its hotel pages, without signing in. Public data collection is broadly lawful, but what you do with personal data such as guest display names is your responsibility under GDPR and similar rules. Take legal advice if you are unsure.

More from BonCross

Your feedback

Is a review on the hotel's page missing from your run, or a rating that doesn't match? Report it on the Issues tab in Apify Console with the hotel code. We read every report and answer there.