# Marriott Reviews Scraper (`boncross/marriott-reviews`) Actor

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.

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

## Marriott Reviews Scraper

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

| Field | Description |
|---|---|
| ⭐ Rating | The guest's rating out of 5 |
| Title | The review headline |
| 💬 Text | The full review text |
| 🌍 Language | The language the review was written in, and its locale (en_GB, zh_CN …) |
| 📅 Posted date | When the review appeared |
| Stay | Check-out date and stay month, where the guest gave them |
| Trip type | Solo, couple, family or group, where the guest gave it |
| 🏅 Member level | Marriott Bonvoy level, from non-member to Ambassador, where the guest gave it |
| Guest | Display name and home town |
| Category ratings | Cleanliness, dining, location, service, amenities, value for money |
| Hotel reply | The hotel's response text and when it was posted |
| 👍 Helpful votes | How many readers marked it helpful, and not helpful |
| Photos | Links to any photos the guest attached, and their count |
| 🏨 Hotel | Hotel 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](https://console.apify.com/sign-up).
2. Open [Marriott Reviews Scraper](https://apify.com/boncross/marriott-reviews).
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.

```json
{
  "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.

| Input | What it does |
|---|---|
| `hotels` | Hotel codes or marriott.com hotel addresses |
| `startUrls` | Hotel addresses in bulk, from a file, a Google Sheet or a remote list |
| `maxReviewsPerHotel` | Reviews per hotel (default 100) |
| `maxItems` | Reviews for the whole run (0 = no limit) |
| `sortBy` | `newest`, `oldest`, `highest`, `lowest`, `helpful`, `relevant` |
| `minRating` / `maxRating` | Star range, 1 to 5 (0 = no limit) |
| `reviewLanguages` | Two-letter language codes, such as `en`, `ja`, `zh`, `de` |
| `tripTypes` | `Solo`, `Couple`, `Family`, `Group` |
| `memberLevels` | `Non-Member`, `Member`, `Silver`, `Gold`, `Platinum`, `Titanium`, `Ambassador` |
| `containsText` | Only reviews mentioning a word or phrase |
| `reviewedAfter` / `reviewedBefore` | Posting date range, as YYYY-MM-DD |
| `onlyWithOwnerResponse` | Only reviews the hotel replied to |
| `includeSummary` | Adds one summary row per hotel |
| `onlyNewReviews` + `dedupStoreName` | Skip reviews earlier runs returned |
| `maxConcurrency` | Hotels 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.

```json
{
  "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.

```json
{
  "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.

| Run | Reviews | Time |
|---|---|---|
| One hotel, newest 20 | 20 | 2 to 3 s |
| One hotel, every review | 2,152 | 5 s |
| 15 hotels in Europe, the US, the Middle East and Asia, 300 each | 3,900 | 8 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?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `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](https://apify.com/boncross/marriott-hotel-search) 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.

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

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

- [Marriott Hotel Details Scraper](https://apify.com/boncross/marriott-hotel-details): Everything a Marriott property publishes: address, coordinates, phones, brand, guest…
- [Marriott Hotel Search Scraper](https://apify.com/boncross/marriott-hotel-search): Every Marriott hotel for a destination and dates.
- [Marriott Room Rates Scraper](https://apify.com/boncross/marriott-room-rates): Every room and rate plan Marriott sells for a hotel and your dates.
- [Rakuten Travel Reviews Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-reviews): Rakuten Travel (楽天トラベル) hotel reviews by hotel number, URL or Japanese name: overall…
- [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

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.

# Changelog

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

# Actor input Schema

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

The Marriott hotels to read reviews for: a hotel code such as EDIWH, or a marriott.com hotel page address. Any Marriott brand works (W, Sheraton, Westin, Ritz-Carlton, Courtyard and the rest).

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

marriott.com hotel 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 hotels than you want to paste. Combined with anything in the list above.

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

Stop after this many reviews for each hotel. Set it high to take everything: there is no depth limit, and a hotel with 13,000 reviews returns all of them.

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

A run-wide ceiling on reviews across every hotel. The per-hotel limit applies to each hotel separately, so ten hotels at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Summary rows and rows reporting a hotel that could not be read are not counted here.

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

The order reviews are read in. Newest first is the one to use when you only want recent reviews.

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

Keep only reviews rated at least this many stars out of 5. Zero means no lower limit.

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

Keep only reviews rated at most this many stars out of 5, for example 2 to read only the complaints. Zero means no upper limit.

## `reviewLanguages` (type: `array`):

Keep only reviews written in these languages, as two-letter codes such as en, fr, de, es, ja, zh. Leave empty for every language.

## `tripTypes` (type: `array`):

Keep only reviews from these kinds of trip, as the guest reported it. Leave empty for every kind. Reviews where the guest did not say are left out when this is set.

## `memberLevels` (type: `array`):

Keep only reviews from guests at these loyalty levels, as the guest reported it. Leave empty for every level.

## `containsText` (type: `string`):

Keep only reviews mentioning this word or phrase, for example breakfast or noisy.

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

Keep only reviews posted on or after this date, as YYYY-MM-DD.

## `reviewedBefore` (type: `string`):

Keep only reviews posted on or before this date, as YYYY-MM-DD. A bare date means the end of that day.

## `onlyWithOwnerResponse` (type: `boolean`):

Keep only reviews the hotel has posted a reply to.

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

Adds one row per hotel, before its reviews, with the hotel's average rating, how many reviews it has, how many fall on each star, its average category ratings (cleanliness, dining, location, service, amenities, value) and the mix of trip types and member levels. The row has isSummary set to true and is billed as its own event.

## `onlyNewReviews` (type: `boolean`):

Skip reviews already returned by a previous run. Needs a de-duplication store name.

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

Name of a key-value store that remembers which reviews have already been returned, so a scheduled run gives you only what is new.

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

How many hotels are read side by side. Each hotel's reviews are still read one page at a time. The default suits almost every run.

## Actor input object example

```json
{
  "hotels": [
    "EDIWH",
    "https://www.marriott.com/en-us/hotels/nycmq-new-york-marriott-marquis/overview/"
  ],
  "startUrls": [],
  "maxReviewsPerHotel": 100,
  "maxItems": 0,
  "sortBy": "newest",
  "minRating": 0,
  "maxRating": 0,
  "reviewLanguages": [],
  "tripTypes": [],
  "memberLevels": [],
  "containsText": "",
  "reviewedAfter": "",
  "reviewedBefore": "",
  "onlyWithOwnerResponse": false,
  "includeSummary": false,
  "onlyNewReviews": false,
  "dedupStoreName": "",
  "maxConcurrency": 4
}
```

# Actor output Schema

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

Marriott guest reviews: every row the run returned.

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

Counts for the run: hotels asked for, reviews returned and hotels that failed.

# 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": [
        "EDIWH"
    ]
};

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

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

```

## MCP server setup

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