Marriott Room Rates Scraper avatar

Marriott Room Rates Scraper

Pricing

from $2.45 / 1,000 hotel-priceds

Go to Apify Store
Marriott Room Rates Scraper

Marriott Room Rates Scraper

Scrape every room and rate plan Marriott sells for a hotel and your dates. Just add hotel codes or marriott.com URLs and get stay total, nightly rate, mandatory fees, cancellation deadline, bed setup and rooms left, or Bonvoy points. $4.00 per 1,000 priced hotel-stays.

Pricing

from $2.45 / 1,000 hotel-priceds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Categories

Share

What is Marriott Room Rates Scraper?

A Marriott hotel sells far more rates than the first screen of its booking page suggests. Across six hotels measured on 15 September 2026, one stay held between 49 and 161 room and rate plan combinations, 120 on average. Marriott Room Rates Scraper returns all of them, priced, for any hotel in the Bonvoy portfolio, from Courtyard and Moxy to The Ritz-Carlton and St. Regis. You give it hotel codes or marriott.com links and your dates.

What you get here that a cheapest-rate scraper can't give you:

  • The whole grid, billed by the stay. A hotel-stay costs $0.004 on the Free plan whether it returns 49 rows or 161.
  • Cash or Bonvoy points. Switch the rate type to points and you get award nights, with points-plus-cash and upgrade options priced too.
  • Totals you can compare. Each cash row has the nightly rate, the stay total with everything in, and how much of that total is tax and fees added on top.
  • Speed at volume. 180 hotel-stays across 60 New York hotels finished in about 24 seconds.
  • A sold-out hotel tells you so for $0.0005, and a stay that can't be priced at all costs nothing.

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

  • 25 of 25 live checks on its inputs and filters passed on 8 October 2026
  • 4 hotels run on 7 October 2026 on 2 stays each: 244 rates, none empty
  • Charges matched the rows: 8 stays checked, 8 priced
  • A stay that cannot be priced gets an uncharged row saying why

Also in each run:

  • See the free-cancellation deadline, and whether a rate is prepaid and non-refundable
  • Tell member, prepaid, package and standard rates apart by category and plan code
  • Read room size, maximum occupancy and bed setup where the hotel publishes them
  • Check rooms left and a near-sellout flag before a group booking
  • Price several hotels over several date ranges at once
  • Keep the lowest rate between runs and report how far it moved

Revenue managers use it to watch a competitive set and check parity against their other channels. Travel tools feed on the nightly rates and cancellation terms, and points collectors compare the cash price with the Bonvoy cost of the same night.

What data is on each rate row?

🏨 Hotel MARSHA code and rate page link📅 Check-in, check-out and nights
🛏 Room name, display name and bed setupRoom type code and room type name
📐 Room size in m² and ft²👥 Maximum occupancy
Adults, rooms and child agesRate plan name and description
Rate plan code and rate plan typeRate category (member, prepay, packages, standard)
Market code and source of rate💷 Nightly rate
💰 Stay totalSubtotal before mandatory fees
Mandatory feesWhether the room rate includes tax
Taxes and fees added on top💱 Currency
⭐ Bonvoy points for award nightsPoints saved and free nights
Points-plus-cash and upgrade pricing🚫 Free-cancellation deadline
Refundable or prepaid flagRooms left and rooms requested
Near-sellout flagMembers-only flag
📉 Lowest rate for the stay and change since the last runRate plans offered for the stay
🕒 Timestamp of the run

You get prices in the hotel's own currency, and each row names it.

How much does it cost to scrape Marriott room rates?

EventFree planStarterScaleBusiness
actor-start, per run$0.002$0.002$0.002$0.002
hotel-checked, per hotel and stay Marriott answered, whatever the answer$0.0005$0.0005$0.0005$0.0005
hotel-priced, per hotel and stay that came back with rates, every rate plan included$0.0035$0.00315$0.0028$0.00245

Enterprise plans pay the Business price.

That's $4.00 per 1,000 priced hotel-stays on the Free plan and $2.95 on Business, however many rate plans each stay returns. It's the whole price. There's no proxy to set up, and proxy and platform usage are included.

  • One hotel, one stay: $0.002 + $0.0005 + $0.0035 = $0.006 ($0.00495 on Business).
  • Two hundred hotel-stays in one run: $0.002 + 200 × $0.004 = $0.802 ($0.592 on Business). That's 0.4 cents a hotel-stay on the Free plan.

The $5 of credits that Apify's Free plan includes each month covers about 1,200 priced hotel-stays with this actor before you pay anything.

You pay the full $0.004 ($0.00295 on Business) only when a hotel-stay returns rates. The other outcomes:

  • Sold out for your dates. You get one row that says so, and pay the $0.0005 check fee alone.
  • Nothing moved. With "Only new or changed" on, a hotel-stay whose lowest rate is the same as last time returns no row and costs the $0.0005 check fee.
  • Couldn't be priced at all. You get an error row and pay nothing for that stay.

How to scrape Marriott room rates

You don't need to write code. It's a form in, a spreadsheet out.

  1. Create a free Apify account and open Marriott Room Rates Scraper.
  2. Add your hotels as MARSHA codes such as NYCMQ, or paste marriott.com links.
  3. Set check-in and check-out, guests and rooms. Leave the dates empty and it prices two nights starting 30 days from today.
  4. Click Start. A single hotel-stay takes a few seconds.
  5. Download the rates as Excel, CSV, JSON, XML or HTML.

⬇️ Input

Start with the hotels. A MARSHA code is the five-letter code Marriott gives each property (NYCMQ is the New York Marriott Marquis), and any marriott.com link that includes propertyCode works in its place. Got a long list of links? Load it under Start URLs from a file, a Google Sheet or a remote list. The two inputs are combined.

Dates can be fixed, or you can set "Days ahead" (default 30) and "Nights" (default 2) and let a scheduled run keep the stay the same distance out. "Extra stays" prices several date ranges in one run and replaces the single stay. Guests default to 2 adults in 1 room, and "Child ages" adds children.

"Rate types" decides which rates you get: all (the default, every public cash rate), standard, prepay, packages, member, regular, or points for award nights. Rooms the hotel lists with no availability are left out.

You have three limits, and each defaults to 0, which means no limit. "Maximum rate plans per hotel-stay" trims each grid (up to 500). "Maximum hotel-stays for the whole run" counts priced stays, and "Maximum rows for the whole run" counts rows. The run stops at whichever of those two it reaches first, and you're not charged for anything past a cap.

One hotel, one stay

{
"hotels": ["NYCMQ"],
"checkIn": "2026-11-10",
"checkOut": "2026-11-12",
"adults": 2,
"rooms": 1
}

Several hotels across two date ranges

{
"hotels": ["NYCMQ", "EDIWH", "DPSSM"],
"stays": [
{ "checkIn": "2026-11-10", "checkOut": "2026-11-12" },
{ "checkIn": "2026-12-05", "checkOut": "2026-12-07" }
],
"adults": 2
}

Award nights in points

{
"hotels": ["NYCMQ"],
"checkIn": "2026-11-10",
"checkOut": "2026-11-12",
"rateModes": ["points"]
}

A daily watch that reports only when the lowest rate moves

{
"hotels": ["LONAK"],
"checkInDaysAhead": 30,
"nights": 2,
"priceStoreName": "marriott-prices",
"onlyNewOrChanged": true
}

For developers

  • maxRatePlansPerHotel caps the rate plans kept for each hotel-stay. maxItems caps the priced hotel-stays in the run and maxRows caps the rows.
  • When maxRows falls partway through a stay, that stay is cut to fit, keeping its cheapest rates, and billed as one stay. Sold-out and unchanged stays don't count towards maxItems.
  • stays overrides checkIn, checkOut, checkInDaysAhead and nights. A stay must be 1 to 30 nights.
  • includeRoomDetails (on by default) adds each room type's size, maximum occupancy and Marriott's name for it.
  • priceStoreName names the store that remembers each hotel-stay's lowest rate. onlyNewOrChanged then returns rows only where it moved. The first run has nothing to compare with.
  • maxConcurrency (default 16, 1 to 32) is how many hotel-stays are priced at once. delayMs (default 0, up to 10,000) adds a pause before each request. We'd leave both alone.
  • Rows arrive in the order of your hotels and stays, even though stays are priced side by side.
  • If the platform restarts a run, it carries on where it stopped without repeating or re-billing a stay.
  • Identical rate plans that Marriott lists twice for the same room are returned once.
  • includeRawData adds the untouched record to each row under raw.

⬆️ Output

You get one row per room and rate plan combination. The Overview view in the Output tab shows hotel, dates, room, rate plan, prices, cancellation deadline and rooms left as a table.

{
"id": "NYCMQ-REGB-DBDB-2026-11-10-2026-11-12",
"hotelId": "NYCMQ",
"url": "https://www.marriott.com/reservation/rateListMenu.mi?propertyCode=NYCMQ&fromDate=11/10/2026&toDate=11/12/2026&numberOfRooms=1&numAdultsPerRoom=2&flexibleDateSearch=false",
"input": "NYCMQ",
"checkIn": "2026-11-10",
"checkOut": "2026-11-12",
"nights": 2,
"adults": 2,
"rooms": 1,
"childrenAges": [],
"roomName": "Deluxe",
"roomDisplayName": "Deluxe",
"roomDescription": "Guest room, 2 Double",
"roomTypeCode": "dbdb",
"roomTypeName": "Deluxe",
"bedConfiguration": "Guest room, 2 Double",
"roomSizeSqm": 35,
"roomSizeSqft": 392,
"roomSizeText": "392sqft/35sqm",
"maxOccupancy": 4,
"ratePlanName": "Flexible Rate",
"ratePlanCode": "REGB",
"ratePlanType": "24.RPT",
"marketCode": "12REGB",
"rateCategory": "StandardRates",
"sourceOfRate": "MARSHA",
"isMembersOnly": false,
"currency": "USD",
"pricePerNight": 694,
"priceTotal": 1703.01,
"priceTotalExcludingFees": 1388,
"mandatoryFees": 90,
"pricesIncludeTax": false,
"taxesAndChargesExcluded": 315.01,
"points": null,
"pointsSaved": null,
"freeNights": null,
"freeCancellationUntil": "2026-11-07T00:00:00Z",
"isRefundable": true,
"isDepositRequired": false,
"roomsLeft": null,
"roomsRequested": null,
"isNearSellout": false,
"lowestPerNight": 510,
"lowestTotal": 1280.72,
"ratePlanCount": 102,
"previousLowestPerNight": null,
"priceChange": null,
"priceChangePct": null,
"scrapedAt": "2026-10-07T19:28:47.501Z"
}

Reading the prices. pricePerNight is the average nightly room rate, and priceTotalExcludingFees is that rate for the whole stay. priceTotal is the stay total with taxes and charges in. On the row above, 2 × 694 = 1,388 before taxes and fees and 1,703.01 all in.

pricesIncludeTax tells you whether the room rate (pricePerNight, priceTotalExcludingFees) already has tax inside it. It's false where Marriott adds a tax on top, as in the United States, Singapore and Japan, or with a city tax in Paris and Berlin. It's true where nothing is added, as in the United Kingdom, where VAT is inside the rate. priceTotal always includes everything.

taxesAndChargesExcluded is what priceTotal adds to the room rate for the whole stay, taxes and mandatory fees together: priceTotal = rooms × priceTotalExcludingFees + taxesAndChargesExcluded. With more than one room, priceTotal covers all the rooms while priceTotalExcludingFees and mandatoryFees are per room. If you're comparing hotels, compare priceTotal. Don't multiply out the nightly rate.

ratePlanCount is how many rate plans the hotel offered for the stay, before any cap.

Other columns on each row:

FieldWhat it is
parentRoomTypeThe hotel's four-letter room type when roomTypeCode holds a product code instead; null on most hotels.
roomAttributes · roomAttributesByCategoryThe room's listed attributes (such as bedding and accessibility features), as one list and grouped by Marriott's category. Empty for most rooms, which list none.
isAccessibletrue when one of the room's attributes describes an accessible room (mobility, hearing, roll-in shower); null otherwise, never false.
ratePlanDescriptionMarriott's description of the rate plan and its terms; null where it gives none.
rateCategoryValueA second label for the rate category, beside rateCategory; null on every row measured.
isRestrictedRateWhether Marriott marks the rate as restricted to guests who qualify for it; null where it says nothing.
cashAndPointsCashOn a Cash + Points rate, the cash part paid beside points; null otherwise.
upgradePoints · upgradeCashOn a points-plus-cash upgrade rate, the points and the cash it costs; null otherwise.
isRepresentativeRoomMarriott's flag for the room it shows as representative of the hotel; null where it says nothing.
previousScrapedAtWith Price memory store set, when the previous lowest price (previousLowestPerNight) was seen; null on a first run.

A hotel that's sold out for your dates returns one row with isSoldOut: true and no room or price. A hotel code that can't be read, or a stay that couldn't be priced, returns a row with error filled in.

How big is a grid, and how fast is a run?

One hotel-stay returned 49 to 161 rows across the six hotels measured, which is why the rate-plan and row caps exist.

RunRowsRun time
Six hotels in four cities, three stays each, full grid9746.0 to 7.8 s
Six hotels in four cities, three stays each, full grid (2 October)1,4596.7 to 7.0 s
Six hotels, six stays each, full grid2,0158.3 s
60 New York hotels × 3 stays, 10 rate plans kept per stay1,739about 24 s

These are whole runs on Apify, measured on 1 and 2 October 2026. The last one is 180 hotel-stays, a pace of roughly 450 a minute, and many thousands fit inside the default one-hour run limit.

Marriott prices one hotel at a time, which means a run grows with hotels multiplied by stays. Up to 16 hotel-stays are priced side by side.

FAQ

Do I need proxies or a Marriott account?

Neither. There's no proxy to set up and no proxy charge, and the rates are the ones Marriott shows without a sign-in.

What is a MARSHA code, and where do I find one?

It's the five-letter code Marriott gives each hotel, such as NYCMQ for the New York Marriott Marquis or EDIWH for W Edinburgh. You'll see it as propertyCode in marriott.com reservation links, and you can paste those links in place of the code. Marriott Hotel Search Scraper returns the code for every hotel in a destination.

How do I get cash rates and points for the same stay?

Run it twice. A run returns cash rates or award nights depending on the rate types you choose. With points, rows come back with the points cost, points saved and free nights, including points-plus-cash upgrades.

What does a sold-out hotel return, and what does it cost?

One row with isSoldOut: true and no rates, for the $0.0005 check fee. You still learn that the hotel has nothing for those dates, which a rate monitor needs to know.

Why is the stay total higher than nights times the nightly rate?

Because Marriott adds tax and fees on top of the room rate in many countries. priceTotal has them in, pricePerNight doesn't unless pricesIncludeTax is true, and taxesAndChargesExcluded is the difference for the stay.

How do I watch a hotel and hear only when the rate moves?

Schedule the run, give "Price memory store" a name and switch on "Only new or changed". Use "Days ahead" so the stay stays the same distance out. From the second run on you get a row only when the lowest rate has moved, with the previous rate and the change beside it.

Can I use a corporate or promotional code?

Not with this actor. You get the public rates any visitor sees. Corporate codes, negotiated rates and promotional codes aren't supported.

Why are room size and occupancy empty for some hotels?

They're filled only where the hotel publishes them. On 5 October 2026 every row at W Edinburgh and New York Marriott Marquis had an occupancy, 77 of 89 at London Marriott Grosvenor Square, and none at Yokohama Bay Sheraton, which gives a room type name only. Where a hotel gives a size range ("25sqm/269sqft-32sqm/344sqft") or no size, roomSizeSqm and roomSizeSqft are empty and roomSizeText keeps the hotel's wording.

What are the limits?

  • Rows identify the hotel by MARSHA code. The hotel's name isn't on a rate row.
  • Taxes aren't itemised by kind. You can see whether tax is added on top of the room rate and how much is added in total on each cash row. A tax already inside the rate (such as UK VAT) isn't broken out, and the split between sales tax and city tax isn't published.
  • Fill rates vary by hotel. On a 456-row sample the cancellation deadline was on 76% of rows, rooms left on 43% and a rate plan description on 67%.
  • Room attribute lists are present for some rooms only, roughly one row in twelve.
  • A stay must be between 1 and 30 nights.
  • The first run of a price watch has no previous rate, and priceChange is empty on it.
  • Rates are read live when the run happens. Marriott can change one before you book.

Scraping publicly available data is generally lawful. These are the rates any visitor can see without signing in, and no personal data is collected. You remain responsible for complying with Marriott's terms and the law that applies to you.

Schedule it, or call it from code

A daily rate watch is an Apify Schedule plus the price memory inputs above. A webhook can fire when a run finishes, and Apify's integrations pass the rows to Google Sheets, Slack, Zapier, Make or Airbyte.

From your own code, one call starts a run and returns the rows:

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

There's an apify-client package on npm for Node.js and on PyPI for Python. For AI agents, the actor is callable at mcp.apify.com as boncross/marriott-room-rates, which lets an agent price a hotel's rate grid as a tool call.

More from BonCross

Your feedback

Seen a rate that doesn't match Marriott's page, or a hotel code that won't price? Tell us on the Issues tab in Apify Console, with the hotel code and dates if you can. We read every issue and reply there.