# Marriott Hotel Search Scraper (`boncross/marriott-hotel-search`) Actor

Scrape every Marriott hotel for a destination and dates. Add a city and get each Ritz-Carlton, St. Regis, W, Westin, Sheraton, Courtyard, Moxy and Aloft with nightly and stay prices, taxes, mandatory fees, points cost, rating, coordinates and distance. $1.20 per 1,000 hotels.

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

## Pricing

from $0.84 / 1,000 hotel-listeds

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 Hotel Search Scraper

### What is Marriott Hotel Search Scraper?

Give Marriott Hotel Search Scraper a city and your dates, and it prices the whole market in one run. You get each Marriott property within the radius you set, from Ritz-Carlton and St. Regis to Courtyard and Moxy, with what a room costs for that stay. Ten cities came back as 732 hotels in about 10 seconds.

Four reasons to pick it for market work:

- The price is taken apart for you. Each hotel has the nightly rate with tax and fees in, the rate before tax, the tax, the mandatory fees and the stay total as separate numbers.
- Cash or Bonvoy points. Switch "Rates" to points and the same search prices the stay as an award.
- Marriott does the filtering. Brand, amenity, hotel type, service level, transportation and a nightly price range are applied by Marriott's own search, and a hotel that's filtered out costs you nothing.
- It's cheap to run wide. $1.20 per 1,000 hotels on the Free plan, $0.84 on Business, up to 1,000 hotels per destination.

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

- 44 of 44 live checks on its inputs and filters passed on 6 October 2026
- 6 destinations run on 7 October 2026 in 6 countries: 63 hotels, none empty
- Charges matched the rows

What else you can do:

- Sort by distance, price, guest rating, number of reviews, name, brand, city or points
- Search by place name ("Edinburgh, Scotland") or by a coordinate pair
- Keep sold-out hotels in the list when you're mapping a market, or drop them when you're booking
- Get the brand and amenity breakdown of each market alongside the rows
- Watch a stay the same distance ahead on every scheduled run

It asks for **no access to your Apify account**, and there's no proxy to set up and no proxy charge.

### Who uses it, and for what?

- Revenue teams tracking what a market costs night by night, or comparing one hotel with its neighbours on the same dates
- Event and travel planners ranking a city by price, rating or distance from a venue
- Analysts watching one brand's pricing across several cities at once
- Anyone checking which hotels sell out on a peak date
- Points collectors comparing the cash price of a stay with its Bonvoy price
- Builders of travel search, price comparison and revenue-management models

### What data do you get for each hotel?

| | |
|---|---|
| 🏨 Hotel name and MARSHA code (`hotelId`) | Name in the hotel's default language |
| Brand code and brand name | 🔗 Hotel page URL |
| 📍 Latitude and longitude | Distance from your destination, in miles or km |
| ⭐ Guest rating out of 5 | Review count |
| 📅 Check-in, check-out and nights | Adults and rooms |
| 💷 Nightly price, tax and fees in | Nightly price before tax |
| Nightly price with mandatory fees | Tax per night and mandatory fees per night |
| 💰 Stay total | 💱 Currency, and whether the nightly price includes tax |
| 🎁 Bonvoy points per night (points searches) | Rate category, rate status and rate source |
| Members-only flag | Available and bookable flags |
| Resort, adults-only and all-inclusive flags | Recently renovated and new-property flags |
| Opening date | Hotel's own currency |
| Marketing caption, plus resort or destination fee notes | 🖼 One image URL |
| Your destination input | 🕒 Timestamp of the run |

### How to scrape Marriott hotel prices

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [Marriott Hotel Search Scraper](https://apify.com/boncross/marriott-hotel-search).
2. Put one or more places in **Destinations**: "Edinburgh, Scotland", "Times Square, New York", or "55.9533,-3.1883".
3. Set **Check-in** and **Check-out**. If you leave them empty, the run prices one night starting 30 days from today.
4. Choose cash or points, a **Search radius**, and how many hotels you want per destination.
5. Click **Start**. You get one row per hotel, priced for that stay.
6. Download the hotels as Excel, CSV or JSON.

### ⬇️ Input

A destination is all it needs. Type places the way you'd type them into marriott.com, or give a `lat,lng` pair to search around a point.

Two limits control the size of a run. "Max hotels per destination" (1 to 1,000, default 40) applies to each place separately. "Maximum results for the whole run" is a ceiling across all of them, and 0 means no limit.

| Field | Type | Default | What it does |
|---|---|---|---|
| `destinations` | array | `[]` | Where to search. Prose, or `lat,lng`. |
| `maxResultsPerDestination` | integer | `40` | Hotels per destination, 1 to 1,000. The actor follows Marriott's pages of 40 for you. |
| `maxItems` | integer | `0` | A run-wide ceiling across every destination. Zero means no limit. |
| `checkIn` / `checkOut` | string | empty | `YYYY-MM-DD`. Leave empty to use the rolling window below. Stays of 1 to 30 nights. |
| `checkInDaysAhead` | integer | `30` | Used only when check-in is empty, so a scheduled run keeps asking about a stay the same distance away. |
| `nights` | integer | `1` | Used only when check-out is empty. |
| `adults` | integer | `2` | Guests in the party, 1 to 8. |
| `rooms` | integer | `1` | Rooms to price, 1 to 9. |
| `rateMode` | enum | `cash` | `cash` or `points`. Points prices the stay as a Bonvoy award, and the cash columns are then empty. |
| `radiusMiles` | integer | `25` | How far from the destination to look, 1 to 100 miles. Marriott's own site uses 50. |
| `sortBy` | enum | `distance` | `distance`, `price-low`, `price-high`, `rating` (highest guest rating first), `reviews` (most reviewed first), `name` (A to Z), `brand` (brand name A to Z), `city` (city A to Z) or `points` (fewest points first; use with **Rates** set to points). |
| `brands` | array | `[]` | Keep only these brand codes (`WH`, `WI`, `SH`…). |
| `amenities` | array | `[]` | Keep only hotels with every amenity listed, by the name Marriott shows (`Pool`, `Pets welcome`, `Free breakfast`, `EV Charging`…) or its code (`pool`, `pet-friendly`). |
| `hotelTypes` | array | `[]` | Keep only hotels of these types, by name (`Resort`, `Apartment`, `Extended stay`, `New hotel`, `Timeshare`) or code (`resort`, `apartment`, `extended-stay`, `new`, `timeshare`). |
| `serviceTypes` | array | `[]` | Keep only hotels at these service levels: `Luxury`, `Full service` or `Select Service` (codes `luxury`, `full-service`, `select-service`). |
| `transportation` | array | `[]` | Keep only hotels offering these: `Airport shuttle`, `Parking`, `Free Parking`, `Car rental desk` (codes `airport-shuttle`, `parking`, `free-parking`, `car-rental-desk`). |
| `minPriceUsd` | integer | `0` | Keep only hotels whose nightly price is at least this, in US dollars, as marriott.com's own price filter works. Prices in the rows stay in the hotel's currency. |
| `maxPriceUsd` | integer | `0` | The same, as a maximum. Zero means no limit. |
| `minRating` | number | `0` | Drop hotels rated below this, out of 5. Decimals such as 4.5 work. |
| `onlyAvailable` | boolean | `false` | Drop anything sold out for the stay. |
| `includeUnavailable` | boolean | `true` | Return sold-out properties too, which is what you want when mapping a market rather than booking. |
| `distanceUnit` | enum | `mi` | `mi` or `km`. |
| `delayMs` | integer | `0` | Optional pause before each request, in milliseconds. 0 runs as fast as the parallel limit allows. |
| `maxConcurrency` | integer | `8` | How many destinations are searched at once, 1 to 32. |

#### Search a city for a date range, cheapest first

```json
{
  "destinations": ["Edinburgh, Scotland"],
  "checkIn": "2026-10-15",
  "checkOut": "2026-10-17",
  "adults": 2,
  "radiusMiles": 25,
  "sortBy": "price-low",
  "maxResultsPerDestination": 40
}
```

#### Best-rated hotels between $150 and $300 a night

```json
{
  "destinations": ["London, United Kingdom"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "minPriceUsd": 150,
  "maxPriceUsd": 300,
  "sortBy": "rating"
}
```

The range is in US dollars, as on marriott.com, while each row keeps the hotel's own currency. This London search returned 13 hotels priced from GBP 116 to GBP 216 a night (5 October 2026). In a US-dollar market the bounds hold on `pricePerNight` exactly: New York, $250 to $350, returned 25 hotels from $254.47 to $341.55.

#### Price a market in Bonvoy points

```json
{
  "destinations": ["Times Square, New York"],
  "checkIn": "2026-12-31",
  "checkOut": "2027-01-01",
  "rateMode": "points",
  "maxResultsPerDestination": 40
}
```

#### Watch several cities on a schedule, 30 days out

```json
{
  "destinations": ["Edinburgh, Scotland", "Glasgow, Scotland", "55.9533,-3.1883"],
  "checkInDaysAhead": 30,
  "nights": 2,
  "onlyAvailable": true,
  "maxItems": 200
}
```

#### For developers

- `maxResultsPerDestination` is the per-destination limit and `maxItems` the run-wide one.
- The filters (`brands`, `amenities`, `hotelTypes`, `serviceTypes`, `transportation`, `minPriceUsd`, `maxPriceUsd`, `minRating`, `onlyAvailable`) run before charging. A dropped hotel isn't billed.
- Several values in one of `amenities`, `hotelTypes`, `serviceTypes` or `transportation` must all apply to a hotel for it to be kept.
- `maxConcurrency` (default 8, 1 to 32) is how many destinations are searched at once. Rows still arrive in the order you listed the destinations.
- `delayMs` (default 0, up to 10,000) adds a pause before each request. We'd leave it at 0.
- Each destination writes a `FACETS-…` record to the run's key-value store (see Output).
- If the platform restarts a run, it carries on where it stopped without repeating or re-billing rows.

### ⬆️ Output

You get one row per hotel:

```json
{
  "id": "NYCSW",
  "hotelId": "NYCSW",
  "url": "https://www.marriott.com/en-us/hotels/nycsw-the-westin-new-york-at-times-square/overview/",
  "scrapedAt": "2026-09-26T17:16:41.433Z",
  "input": "Times Square, New York",
  "name": "The Westin New York at Times Square",
  "brandCode": "WI",
  "brandName": "Westin Hotels & Resorts",
  "lat": 40.757475,
  "lng": -73.989401,
  "distance": 0.2,
  "distanceUnit": "mi",
  "distanceText": "0.2 mi",
  "rating": 3.8,
  "ratingScale": 5,
  "reviewCount": 5133,
  "checkIn": "2026-12-31",
  "checkOut": "2027-01-01",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "pricePerNight": 1043.14,
  "pricePerNightExcludingTax": 866,
  "pricePerNightIncludingFees": 906,
  "priceTotal": 1043.14,
  "taxesPerNight": 137.14,
  "mandatoryFeesPerNight": 40,
  "currency": "USD",
  "pointsPerNight": null,
  "isMembersOnly": false,
  "rateCategory": "StandardRates",
  "rateStatus": "AvailableForSale",
  "pricesIncludeTax": true,
  "isAvailable": true,
  "hotelCurrency": "USD",
  "isBookable": true,
  "openingDate": "2002-10-16",
  "marketingCaption": "Our hotel, close to Times Square, is steps from Madison Square Garden, Broadway and Hudson Yards.",
  "descriptions": [
    { "type": "DESTINATION_FEE_DESCRIPTION", "text": "Daily $20 food and beverage credit |…" },
    { "type": "HOTEL_MARKETING_CAPTION", "text": "Our hotel, close to Times Square, is steps from…" }
  ],
  "imageUrl": "https://cache.marriott.com/content/dam/marriott-renditions/NYCSW/nycsw-exterior-9397-hor-wide.jpg"
}
```

If a destination's request fails, or Marriott doesn't recognise the place, you get a single row whose `error` says which. You're never charged for that row.

#### How to read the prices

Marriott quotes a stay per room per night. The actor does the arithmetic and labels each figure for what it is:

- `pricePerNight`: one night, tax and mandatory fees included. This is the headline number. In the rare case Marriott returns only the rate before tax, that rate is shown here and `pricesIncludeTax` is `false`.
- `pricesIncludeTax`: whether `pricePerNight` includes tax. `true` for the usual all-in figure, `false` for a rate before tax, empty when the hotel returned no cash price.
- `pricePerNightExcludingTax`: one night, before tax and fees.
- `pricePerNightIncludingFees`: one night with mandatory fees, before tax.
- `taxesPerNight` and `mandatoryFeesPerNight`: the two components, per night.
- `priceTotal`: `pricePerNight × nights × rooms`, the whole booking with tax. **Derived here**, not quoted by Marriott. Empty when no tax-included nightly figure was returned.

For the Westin above that reads 866 + 137.14 tax + 40 fees = 1,043.14 a night. For W Edinburgh over two nights, 520.50 + 26.02 = 546.52 a night and 1,093.04 for the stay.

Beside the prices, `nameInDefaultLanguage` is the hotel's name in its own default language and `rateSource` is where Marriott says the rate comes from. The flags `isResort`, `isAdultsOnly`, `isAllInclusive`, `isRecentlyRenovated` and `isNewProperty` are Marriott's, and each is empty where it says nothing.

#### The market breakdown

Each destination also writes a `FACETS-…` record to the run's key-value store. It lists the brands, amenities, property types and price bands present near that place, each with a count. It's a quick way to size a market before you decide what to pull.

#### One row per hotel, not per rate plan

You get the lowest available rate for each hotel here. For the full grid (each room type crossed with each rate plan, with cancellation deadlines and points options), run [Marriott Room Rates Scraper](https://apify.com/boncross/marriott-room-rates) on the hotels this one finds.

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

Up to 1,000 hotels per destination, within a radius of up to 100 miles. The actor follows Marriott's pages of 40, and each page takes under a second.

| Run | Rows | Run time |
|---|---:|---:|
| Edinburgh, 8 hotels | 8 | 1.7 s |
| London, Tokyo, New York and Paris, up to 120 each | 259 | 10.4 to 11.7 s |
| London, New York, Chicago and Dubai, up to 100 each | 331 | 7.6 to 8.1 s |
| Twelve world cities, up to 80 each | 462 | 13.8 s |
| Ten cities, up to 100 hotels each | 732 | about 10 s |

Whole runs on Apify, measured on 1 and 2 October 2026. Several destinations are searched at once (8 by default), and the rows still arrive in the order you listed them.

Edinburgh within 60 miles returned 22 hotels, and London within 50 miles filled a 60-hotel request across two pages.

Marriott answers about 80 result pages a minute per run. Very large runs settle at roughly 3,000 hotels a minute, which is about 180,000 hotels inside the default one-hour run limit.

### How much does it cost to search Marriott hotels?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, once per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `hotel-listed`, per hotel returned | $0.0012 | $0.00108 | $0.00096 | $0.00084 |

Enterprise plans pay the Business price.

**$1.20 per 1,000 hotels** on the Free plan, $0.84 on Business. Platform usage and proxy are included, and there's nothing else to pay.

- One destination of 40 hotels: $0.002 + 40 × $0.0012 = **$0.05** ($0.0356 on Business).
- Ten such cities in one run: $0.002 + 400 × $0.0012 = **$0.482** ($0.338 on Business).

On Apify's Free plan, the $5 of monthly credits buys about 100 of those 40-hotel searches, roughly 4,000 hotels.

What you don't pay for: a hotel removed by one of your filters, and a row reporting a destination that couldn't be reached. A sold-out hotel that's returned is a row like any other and is charged as one. Switch on "Only hotels with rooms for these dates" if you don't want them.

### Limitations

- One rate per hotel, the lowest available. Use Marriott Room Rates Scraper for the full grid.
- Radius caps at 100 miles and each destination at 1,000 hotels.
- Points come back when **Rates** is set to points, and only where Marriott offers an award for the stay (7 of 8 Times Square hotels on a measured run). A points run has no cash price, and a cash run no points. Run twice for both.
- The price range is in US dollars whatever the hotel's currency, because that's how Marriott's own filter works. A hotel priced in another currency is matched on its dollar equivalent.
- `priceTotal` is derived by multiplying out (per night × nights × rooms), because Marriott quotes per room per night.
- Amenities, hotel type, service type and transportation are filtered by Marriott. The rows don't list a hotel's amenities, type or transport, and you can't re-check the filtered rows against a column. Marriott's own groupings apply: `Luxury` includes some JW Marriott and Marriott Hotels properties.
- Sorting by `city` orders by the hotel's city, which isn't a column on the row. Sorting by `brand` orders by brand name, not by `brandCode`.
- The all-inclusive flag is one Marriott rarely sets. It was empty on all 66 hotels of the 7 October 2026 sample.
- `imageUrl` opens in any browser. A script or spreadsheet that fetches it may be refused unless it identifies itself the way a browser does.

### FAQ

#### Do I need proxies or a Marriott account?

You need neither. There's no proxy to set up and no proxy charge, and the search results are the ones Marriott shows without a sign-in.

#### Can I search around a point instead of a city?

Pass `"lat,lng"` as the destination, such as `"55.9533,-3.1883"`, and set the radius.

#### Why is a hotel listed with no price?

It's sold out or not bookable for those dates. `isAvailable` says so. "Only hotels with rooms for these dates" drops them, and so does turning off "Ask for unavailable hotels too".

#### I set a dollar price range. Why are my rows in pounds?

The range works the way marriott.com's own price filter does, in US dollars. The rows keep each hotel's own currency, and a hotel priced in pounds or yen is matched on its dollar equivalent.

#### Which brands does it cover?

All Marriott Bonvoy brands. Each run also records which ones are present near each destination, with counts, in the `FACETS-…` record.

#### How do I get every room and rate for one of these hotels?

Take its `hotelId` and run [Marriott Room Rates Scraper](https://apify.com/boncross/marriott-room-rates).

#### Why did my destination return nothing?

Marriott didn't recognise the place. You get one uncharged row for that destination, with `error` saying so. Try the spelling marriott.com suggests, add the country, or use coordinates.

#### Can I filter on two amenities at once?

List both. A hotel is kept only if it has all of them, and the same rule holds inside the hotel type, service type and transportation filters. A resort that must also be an apartment can easily return nothing.

#### Is it legal to scrape Marriott?

This actor reads search results Marriott publishes to anyone, with no login and no paywall, and collects no personal data. As with any scraping, what you do with the data is your responsibility. See Apify's [ethical scraping](https://blog.apify.com/is-web-scraping-legal/) guidance.

### From a schedule, your code or an AI agent

To watch a market over time, leave the dates empty, set "Check-in days ahead" and put the run on an Apify Schedule. Each run then prices a stay the same distance out. A webhook can fire when it finishes, and the rows can go on to Google Sheets, Slack, Make, Zapier, Airbyte or n8n.

From code, `POST https://api.apify.com/v2/acts/boncross~marriott-hotel-search/run-sync-get-dataset-items` with the input JSON as the body returns the hotels in a single call for short runs. Longer ones use the standard run endpoints of the [Apify API](https://docs.apify.com/api/v2), and there are clients for [JavaScript](https://docs.apify.com/api/client/js/) and [Python](https://docs.apify.com/api/client/python/).

An agent can call it at `mcp.apify.com` as `boncross/marriott-hotel-search`.

### 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 Reviews Scraper](https://apify.com/boncross/marriott-reviews): Guest reviews for any Marriott hotel.
- [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 Room Rates Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-room-rates): Every plan and room Rakuten Travel (楽天トラベル) prices for a hotel and your dates.
- [Rakuten Travel Search Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-search): Rakuten Travel (楽天トラベル) hotel search results for any area and your dates.
- [Tripadvisor Hotels Scraper](https://apify.com/boncross/tripadvisor-hotels-scraper): Every hotel Tripadvisor lists for a city, with nightly prices for your dates and guests.

### Your feedback

Is there a property this misses, or a number on the row you need and can't find? Raise it on the Issues tab in Apify Console. BonCross reads each issue, and requests shape what gets added next.

# Changelog

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

# Actor input Schema

## `destinations` (type: `array`):

Where to search. Prose the way you would type it into marriott.com ("Times Square, New York", "Edinburgh, Scotland", "Bali, Indonesia") or a coordinate pair, "55.9533,-3.1883".

## `maxResultsPerDestination` (type: `integer`):

Stop after this many hotels per destination. Marriott pages 40 at a time and this actor follows the pages for you.

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

A run-wide ceiling across every destination. Ten cities at 40 each returns 400; set this to cap the total. Zero means no run-wide limit.

## `checkIn` (type: `string`):

YYYY-MM-DD. Leave empty to use the rolling window below.

## `checkOut` (type: `string`):

YYYY-MM-DD. Leave empty and the stay runs for the number of nights below.

## `checkInDaysAhead` (type: `integer`):

Used only when check-in is empty, so a scheduled run keeps asking about a stay the same distance away rather than one that drifts into the past.

## `nights` (type: `integer`):

Used only when check-out is empty.

## `adults` (type: `integer`):

How many guests in the party.

## `rooms` (type: `integer`):

How many rooms to price.

## `rateMode` (type: `string`):

Cash prices the stay in money. Points prices it as a Marriott Bonvoy award, in points per night, where the hotel offers one: the cash columns are then empty. Run twice to have both.

## `radiusMiles` (type: `integer`):

How far from the destination to look. Marriott's own site uses 50.

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

Which hotels come back first.

## `brands` (type: `array`):

Optional. Keep only these Marriott brand codes (for example AK for Autograph Collection, MC for Marriott). The search itself is narrowed, so a short brand list reads fewer pages. Every run also writes the brands present near each destination to the run's key-value store, under a FACETS- record, with a count for each.

## `amenities` (type: `array`):

Optional. Keep only hotels that have every amenity listed, by the name Marriott shows (Pool, Pets welcome, Free breakfast, EV Charging, Fitness center, Elite Member Lounge, Kitchen, Room service…) or its code (pool, pet-friendly, breakfast). The FACETS- record lists the amenities near each destination, with codes and counts.

## `hotelTypes` (type: `array`):

Optional. Keep only hotels of these types, by the name Marriott shows (Resort, Apartment, Extended stay, New hotel, Timeshare) or its code (resort, apartment, extended-stay, new, timeshare). The FACETS- record lists the types near each destination, with codes and counts.

## `serviceTypes` (type: `array`):

Optional. Keep only hotels of these service levels: Luxury, Full service or Select Service (codes luxury, full-service, select-service).

## `transportation` (type: `array`):

Optional. Keep only hotels offering these, by name (Airport shuttle, Parking, Free Parking, Car rental desk) or code (airport-shuttle, parking, free-parking, car-rental-desk).

## `minPriceUsd` (type: `integer`):

Keep only hotels whose nightly rate is at least this, in US dollars, the way marriott.com's own price filter works. Prices in the rows stay in the hotel's currency. Zero means no minimum.

## `maxPriceUsd` (type: `integer`):

Keep only hotels whose nightly rate is at most this, in US dollars, the way marriott.com's own price filter works. Prices in the rows stay in the hotel's currency. Zero means no maximum.

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

Keep only hotels rated at least this, out of 5. Zero keeps everything. Accepts a decimal, so 4.5 is a valid floor.

## `onlyAvailable` (type: `boolean`):

Drop properties that came back sold out or unavailable for the stay.

## `includeUnavailable` (type: `boolean`):

Marriott can return sold-out properties alongside bookable ones, which is what you want when mapping a market rather than booking a room.

## `distanceUnit` (type: `string`):

Unit for the distance from the searched place.

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

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

## Actor input object example

```json
{
  "destinations": [
    "Edinburgh, Scotland"
  ],
  "maxResultsPerDestination": 40,
  "maxItems": 0,
  "checkIn": "",
  "checkOut": "",
  "checkInDaysAhead": 30,
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "rateMode": "cash",
  "radiusMiles": 25,
  "sortBy": "distance",
  "brands": [],
  "amenities": [],
  "hotelTypes": [],
  "serviceTypes": [],
  "transportation": [],
  "minPriceUsd": 0,
  "maxPriceUsd": 0,
  "minRating": 0,
  "onlyAvailable": false,
  "includeUnavailable": true,
  "distanceUnit": "mi",
  "delayMs": 0,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

Marriott search results: every row the run returned.

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

Counts for the run: destinations resolved, hotels found and returned, requests and errors.

# 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 = {
    "destinations": [
        "Edinburgh, Scotland"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/marriott-hotel-search").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 = { "destinations": ["Edinburgh, Scotland"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/marriott-hotel-search").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 '{
  "destinations": [
    "Edinburgh, Scotland"
  ]
}' |
apify call boncross/marriott-hotel-search --silent --output-dataset

```

## MCP server setup

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

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/74Ghkam58q64wXd64/builds/F73As3VvUfOLUWUjW/openapi.json
