Agoda Room Rates Scraper
Pricing
from $2.10 / 1,000 hotel-priceds
Agoda Room Rates Scraper
Scrape every room type and rate plan Agoda shows for a hotel and stay. Just add hotel URLs, ids or names and dates and get stay total, per-night and pre-tax prices, cancellation deadline and policy, breakfast, pay-later, rooms left and bed setup in your currency. $3.50 per 1,000 priced hotel-stays.
Pricing
from $2.10 / 1,000 hotel-priceds
Rating
0.0
(0)
Developer
BonCross API
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
12 days ago
Last modified
Categories
Security
Limited permissionsShare
What is Agoda Room Rates Scraper?
Most Agoda price data stops at one number per hotel. Agoda Room Rates Scraper returns the whole room grid for a hotel and a stay: each room type, each rate plan under it, and what each plan costs with and without tax. On 7 October 2026 one New York hotel returned 31 rate plans across 12 room types for a two-night stay, from a single link and a pair of dates.
You give it hotel links, Agoda property ids or hotel names, plus your dates and party. Prices arrive in the currency you choose.
Why it's worth picking for rate work:
- Every plan, with its terms. Each rate has the stay total, the nightly price, the cancellation deadline and policy text, breakfast, pay-later, rooms left and the bed setup.
- Tax you can trust. Each rate says whether its price includes tax and gives Agoda's own pre-tax total and taxes-and-fees amount. Across 354 offers in 17 room grids and six countries, the price was all-in on all 354.
- Prices for your party, not someone else's. Agoda mixes in rooms priced for fewer guests than you asked for. Those are dropped by default, and each rate says how many adults it's priced for.
- A clear answer when there's nothing to sell. Sold out, nothing left after your filters, and "could not be read" are three different rows, and none of them is billed as a priced stay.
- Fast enough for a whole compset. 100 hotels at three stays each, 300 hotel-stays, took 10 to 30 seconds.
BonCross Verified means we tested this actor against the live site before release and kept the record:
- 40 of 40 live checks on its inputs and filters passed on 7 October 2026
- 10 hotel-stays run the same day at 5 hotels: 6 priced, 3 with no rates, 1 error row
- A weak name match or a stay with no room grid gets a row saying why
With it you can also:
- Price several stays for the same hotels in one run, for date grids and length-of-stay comparisons
- Keep only refundable plans, breakfast-included plans, or rates inside a nightly price band
- Apply the filters Agoda shows above a hotel's rooms, such as "King bed" or "City view"
- See room size, the room's own guest score, the kids-stay-free age and amenities grouped as on the site
- List the room types Agoda shows as sold out, to tell absent from unavailable
- Track the lowest price between runs and get back only the hotels whose rates moved
- Get one row per rate plan if a flat table suits you better
What data do you get for each rate?
| 🏨 Hotel name, Agoda id and URL | 🛏 Room type and rate plan name |
| 💷 Stay total and per-night price | Total and per-night price excluding tax |
| Crossed-out price and discount percent | Currency, whether taxes are included, the taxes and fees amount, and their breakdown |
| Free cancellation and its deadline | Full cancellation policy text and code |
| Pay later and the date payment is due | 🍳 Breakfast and other benefits |
| Rooms left and urgency message | 👥 Maximum occupancy |
| Bed configuration and number of beds | 🖼 Room images and amenities |
| 📐 Room size in m² | ⭐ Room guest score |
| Party each price is for | Kids-stay-free age |
| Supplier and payment model | Sold-out room types |
| Lowest price for the stay | 📈 Price change since the last run |
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 turned into a property id | $0.002 | $0.002 | $0.002 | $0.002 |
hotel-checked, per hotel and stay Agoda answered, whatever the answer | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
hotel-priced, per hotel and stay that comes back with at least one rate, all rate plans included | $0.003 | $0.0027 | $0.0024 | $0.0021 |
Enterprise plans pay the Business price.
$3.50 per 1,000 priced hotel-stays on the Free plan, $2.60 on Business, and that buys the complete grid: you pay per hotel and stay, not per rate plan. Proxy usage and platform usage are included.
A hotel-stay that's sold out, has no rate left after your filters, or is skipped because its lowest price hasn't moved still gets you an answer, and costs the $0.0005 check fee alone. Pass numeric property ids and you skip the $0.002 resolution fee.
- 50 hotels by URL, one stay each: $0.002 + 50 × $0.002 + 50 × ($0.0005 + $0.003) = $0.28 per run ($0.23 on Business). By id: $0.002 + 50 × $0.0035 = $0.18 ($0.13 on Business).
- A compset of 20 hotels by id, three stays each, priced daily for a month: 30 × ($0.002 + 60 × $0.0035) = $6.36 for the month ($4.74 on Business). With "Only new or changed prices" on, a day when nothing moved costs $0.002 + 60 × $0.0005 = $0.032.
Apify's Free plan gives you $5 of credits a month, which is about 18 runs of 50 hotels by link, or roughly 1,400 priced hotel-stays if you pass ids.
How to scrape Agoda room rates
- Create a free Apify account.
- Open Agoda Room Rates Scraper.
- Paste your hotels: Agoda links, property ids or names with the city.
- Set check-in and check-out, the number of adults and children, and a currency.
- Click Start. One hotel and one stay takes 3 to 4 seconds.
- Download the grid as Excel, CSV, JSON, XML or HTML. Switch on "One row per rate plan" first if you want a flat spreadsheet.
⬇️ Input
"Hotels" takes one entry per hotel: an Agoda hotel URL, a bare numeric property id, the slug from a URL, or a hotel name with its city. If you have more links than you'd paste by hand, "Start URLs" loads them from a file, a Google Sheet or a remote list, and the two are combined.
For dates you have three choices. Fix them with "Check-in date" and "Check-out date". Let them roll with "Check-in days ahead" and "Nights", which suits a schedule. Or list several stays in "Multiple stays" and each hotel is priced for each one.
One hotel, one stay, in US dollars
{"hotels": ["https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html"],"checkIn": "2026-11-18","checkOut": "2026-11-20","adults": 2,"currency": "USD"}
Refundable, breakfast-included plans only, one row per rate plan
{"hotels": ["206039", "le-meridien-visconti-rome/hotel/rome-it"],"checkIn": "2026-11-18","checkOut": "2026-11-20","adults": 2,"childrenAges": [7],"currency": "USD","freeCancellationOnly": true,"breakfastOnly": true,"flattenRooms": true}
Several stays for the same hotels, for a length-of-stay comparison
{"hotels": ["206039", "49575"],"stays": [{ "checkIn": "2026-11-18", "checkOut": "2026-11-19" },{ "checkIn": "2026-11-18", "checkOut": "2026-11-20" },{ "checkIn": "2026-11-18", "checkOut": "2026-11-22" }],"currency": "EUR"}
A daily compset monitor that returns only hotels whose rates moved
{"hotels": ["206039", "https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],"checkInDaysAhead": 30,"nights": 2,"currency": "USD","priceStoreName": "agoda-compset-30d","onlyNewOrChanged": true}
Rooms too small for your party. Agoda lists rooms priced for other party sizes next to yours. A 3-adult search also returns 2-adult rooms, often the cheapest, and those can't seat you. "Hide rooms too small for your party" (on by default) drops them. Rooms priced for a larger party stay, because you can book them and they're sometimes the lowest price: for one adult, the site's cheapest offer is often a 2-adult rate. Each rate says who it's priced for in pricedForAdults, and isExactOccupancy marks the ones priced for exactly your party.
Room filters. "Room filters" applies the filters Agoda shows above a hotel's rooms, such as "Non-smoking", "King bed", "City view" or "Breakfast included", and keeps only rates that match all of them. The filters differ by hotel. Each row lists the ones its hotel offers in roomFilterOptions, and each rate lists those it matches in roomFilters.
Price band, currency and origin. "Minimum per-night price" and "Maximum per-night price" (default 0, which turns them off) keep only rates within a nightly band, in the selected currency. "Booking origin country" (default US) is the two-letter country Agoda treats you as booking from, such as US, GB or JP. It affects some rate availability and whether the headline price shows tax.
Limits. "Maximum hotel-stays for the whole run" caps hotel-stays across every hotel, and "Maximum rows for the whole run" caps rows. The run stops at whichever comes first, and nothing past the caps is fetched or charged for.
For developers
maxItemscounts hotel-stays andmaxRowscounts rows. WithflattenRooms, one hotel-stay is one row per room and rate plan, and the last stay is cut to fitmaxRows, keeping its cheapest rates. It's charged as one hotel-stay.includeRoomTypes(on by default) adds theroomTypescatalogue to each row. Switch it off for a smaller dataset.priceStoreNamenames the storage that remembers the lowest price per hotel and stay. WithonlyNewOrChangedon, a hotel-stay whose lowest price hasn't moved is skipped and costshotel-checkedonly.maxConcurrency(Parallel requests, default 16, 1 to 32) sets how many hotel-stays are fetched at once.delayMs(Delay between requests, default 0) adds a pause before each request, in milliseconds, and values above 2000 are treated as 2000. We'd leave both alone.- Rows are delivered in the order you listed them, hotel by hotel and stay by stay.
- A stay Agoda answers with no room grid at all is held back and asked once more about a minute later, at the end of the run. That adds at most about 60 seconds to a run. If the stay has rates by then, its row is delivered after the others and billed as usual. If not, you get a row with an
errorsaying so, chargedhotel-checkedonly. - Rows are saved as they arrive. If the platform restarts a run part-way, the stays already delivered are neither fetched nor charged again.
- Each run makes one request per hotel and stay, plus one to resolve a URL, slug or name.
⬆️ Output
One row is one hotel for one stay, with the summary fields on top and the rate plans in rates. Switch on "One row per rate plan" to get one row per plan. rooms is the number of rooms you asked to price, not the list: the list is rates, and the room-type catalogue is roomTypes.
This is the New York stay from the first example, run on 7 October 2026, with one of its 31 rates, one of its 12 room types and two of its four sold-out rooms shown:
{"input": "https://www.agoda.com/four-seasons-hotel-new-york-downtown/hotel/new-york-ny-us.html","id": "206039-2026-11-18-2026-11-20","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","checkIn": "2026-11-18", "checkOut": "2026-11-20", "nights": 2, "adults": 2, "childrenAges": [], "rooms": 1,"currency": "USD", "rateCount": 31,"taxesAndSurcharges": "Hotel tax and service fees $ 228.44", "pricesIncludeTax": true,"lowestTotal": 3506.88, "lowestPerNight": 1753.44, "lowestRoom": "Manhattan Room with king bed","lowestTotalExcludingTax": 3050, "lowestPerNightExcludingTax": 1525,"lowestFreeCancellationPerNight": 1948.52,"previousLowestPerNight": null, "previousScrapedAt": null, "priceChange": null, "priceChangePct": null,"rates": [{"roomTypeId": 8697864,"roomTypeName": "Manhattan Room with king bed","roomId": 11135630,"ratePlanId": 0,"roomName": "Manhattan Room with king bed","currency": "USD","priceTotal": 3506.88,"priceTotalExcludingTax": 3050,"pricePerNight": 1753.44,"pricePerNightExcludingTax": 1525,"priceTotalListed": null,"discountPercent": 0,"taxesAndSurchargesList": ["Hotel tax and service fees $ 228.44"],"pricesIncludeTax": true,"taxesAndChargesIncluded": 456.88,"isFreeCancellation": false,"cancellationTitle": "Non-refundable (Low price!)","cancellationTerms": "This special offer includes an extra-low price, but cannot be amended or cancelled. In case of a no-show, the property will not refund the booking. If you're sure of your travel dates, you can take advantage of this special offer!","cancellationCode": "365D100P_100P","freeCancellationUntil": null,"isPayAtHotel": true,"isPayLater": false,"payLaterText": null,"isBreakfastIncluded": false,"roomFilters": ["King bed", "City view", "Balcony/terrace"],"roomFilterIds": ["king-bed", "city-view", "balcony-terrace"],"benefits": [],"roomsLeft": 8,"urgencyMessage": "Limited availability","pricedForAdults": 2,"pricedForChildren": 0,"isExactOccupancy": true,"roomSizeSqm": 39,"roomRating": 9.7,"roomRatingScale": 10,"isKidsStayFree": true,"kidsStayFreeMaxAge": 18,"inclusions": ["Non-refundable (Low price!)", "Pay to hotel"],"maxOccupancy": 2,"bedConfiguration": "1 king bed","numberOfBeds": "1 bed","supplier": "Agoda.com","isBookOnRequest": false,"paymentModel": 2}],"roomTypes": [{"roomTypeId": 8697864,"name": "Manhattan Room with king bed","maxOccupancy": 2,"bedConfiguration": "1 king bed","numberOfBeds": "1 bed","roomSizeSqm": 39,"roomRating": 9.7,"roomRatingScale": 10,"isKidsStayFree": true,"kidsStayFreeMaxAge": 18,"roomFeatures": ["City view", "1 king bed", "Separate shower/bathtub", "Balcony/terrace", "Window that opens", "Blackout curtains", "Alcohol", "Private bathroom", "Closet"],"amenityGroups": [{ "group": "For the kids", "items": ["Baby cot (upon request)"] }],"cheapestTotal": 3506.88,"amenities": ["Adapter", "Air conditioning", "Alarm clock", "…"],"images": ["…"]}],"roomFilterOptions": [{ "id": "non-smoking", "name": "Non-smoking" }, { "id": "pay-at-the-place", "name": "Pay at the hotel" }, { "id": "free-cancellation", "name": "Free cancellation" }, { "id": "king-bed", "name": "King bed" }, { "id": "city-view", "name": "City view" }, { "id": "balcony-terrace", "name": "Balcony/terrace" }],"soldOutRooms": [{ "roomTypeId": 76682607, "roomTypeName": "Metropolis Suite", "beds": "1 king bed", "images": ["…"] }, { "roomTypeId": 76682606, "roomTypeName": "Tribeca Suite", "beds": "1 king bed", "images": ["…"] }, "…"],"scrapedAt": "2026-10-07T20:31:52.330Z"}
Reading the tax fields on that rate: priceTotal 3,506.88 is what the guest pays for two nights, priceTotalExcludingTax 3,050 is Agoda's pre-tax figure, and taxesAndChargesIncluded 456.88 is the difference, two nights of the $228.44 the hotel lists.
Some things that aren't obvious from the record:
- A stay with no rates is still a row. In the same run, a Rome hotel had nothing on sale for those dates and returned a row with
rateCount: 0and null prices. A request that failed returns a row with anerror. You can always tell sold out from failed. - The four price-memory columns (
previousLowestPerNight,previousScrapedAt,priceChange,priceChangePct) are null on a first run by design. They fill from the second run on, once "Price memory store" has a name. lowestFreeCancellationPerNightis null when the hotel offered no refundable rate for that stay, which is common on the cheapest dates. CheckisFreeCancellationon the rates to see why.roomTypeIdis the same room id that Agoda Reviews Scraper accepts in its "Room types" filter. You can join a room's rates to the reviews of guests who stayed in it.
How deep is the grid, and how fast is a run?
The grid is as deep as Agoda's own room list for that stay: 33 rate plans across 19 room types on one measured hotel, and 54 plans on another for 2 adults. You can mix a full URL, a bare property id, a slug and a hotel name in one run, and list as many stays per hotel as you need.
| Run | Time |
|---|---|
| 1 hotel, 1 stay | 1 row in 3 to 4 seconds |
| 6 hotels × 3 stays | 18 hotel-stays in 11.5 seconds |
| 6 hotels × 6 stays | 36 hotel-stays in 10 seconds, or 30 seconds and more in an hour when Agoda itself answers slowly |
| 100 hotels × 3 stays | 300 hotel-stays in 10 to 30 seconds |
Whole runs on Apify, measured on 1 and 2 October 2026. At that rate a one-hour run prices tens of thousands of hotel-stays.
What it can't do
- Prices are Agoda's public rates for a guest who isn't signed in, checked offer for offer against Agoda's own signed-out page. Signed-in members can see member-only rates and, at some hotels, pay-at-the-hotel offers a guest isn't shown.
isPayAtHotelmarks the ones a guest is offered. pricesIncludeTaxis Agoda's own flag on each rate, and null where Agoda doesn't send it. In the runs measured, across six countries and four origin markets, it was true every time:priceTotalandpricePerNightinclude every tax and fee, including any Agoda lists as paid at the property. The pre-tax columns are Agoda's own figures, not calculated.- Sold-out rooms are listed by name only, without prices.
roomRatingis null on rooms Agoda has too few reviews to score.- A typed hotel name is only accepted when Agoda suggests a hotel that clearly is the one you named. If it doesn't, that hotel isn't priced: you get a free
errorrow with the nearest suggestion and its property id. URLs, slugs and ids go straight to their hotel with no name check. - For an id or a name,
urlis an Agoda link by property id, not the hotel page. Pass the hotel URL or slug to get the page link. - "Booking origin country" can change which offers Agoda shows, but the grid also moves between runs minutes apart. Don't count on seeing the effect of a different origin.
FAQ
How is this different from Agoda Search Scraper?
Agoda Search Scraper returns one cheapest offer for each property in a destination. This actor returns each room type and rate plan for the hotels you name, which is what rate parity and revenue work needs. A common pattern is to search a city first, then feed the hotelId values here.
Are the prices per night or for the whole stay?
You get both. priceTotal is the stay total and pricePerNight the nightly figure, with taxes and fees included. priceTotalExcludingTax and pricePerNightExcludingTax are the pre-tax equivalents.
Why is the cheapest rate priced for more adults than I asked for?
Agoda often sells a single traveller a 2-adult rate, and that rate is bookable. Rooms priced for a larger party are kept for that reason. Look at pricedForAdults on the rate, or keep only rows where isExactOccupancy is true.
How do I price a date grid for one hotel?
Put the check-in and check-out pairs in "Multiple stays". Each hotel is priced for each stay, and each hotel and stay is its own row. Three stays for 20 hotels is 60 hotel-stays.
How do I get only the hotels whose rates changed?
Name a "Price memory store" and switch on "Only new or changed prices". The actor remembers the lowest price per hotel and stay and skips the ones that haven't moved. A skipped hotel-stay costs the $0.0005 check fee and nothing more.
A hotel came back with an error about no room grid. Is it sold out?
Not necessarily. Sometimes Agoda answers a stay with no room list at all, and a minute later the same stay has rates. The actor asks such a stay once more at the end of the run. If it's still empty you get the error row, and it's worth running that hotel again later.
Do I need proxies or an Agoda account?
No to both. There's no proxy to set up and no proxy charge, and the rates are the ones Agoda quotes without a login.
Is it legal to scrape Agoda?
The actor reads only what Agoda serves to any logged-out visitor, and room rates are public commercial data, not personal data. You're responsible for complying with Agoda's terms and applicable law in how you use the data.
Run it on a schedule or from your own system
Most compset monitors are an Apify Schedule with rolling dates and a price memory. Each run then leaves you a short dataset of the hotels that moved, and a webhook can push it into your pricing system the moment the run ends. Zapier, Make, Google Sheets and Slack connect through Apify's integrations if you'd sooner not write code.
Other things people do with the grid: rate parity checks against their own site, plan by plan. Watching refundable against non-refundable spreads across a market. Auditing how discounts and rooms-left messages move over a booking window. Building a training set of cancellation policies and rate structures.
From code, this call prices your hotels and returns the rows in one go:
POST https://api.apify.com/v2/acts/boncross~agoda-room-rates/run-sync-get-dataset-items?token=YOUR_TOKEN
Use the apify-client package from NPM or PyPI for longer runs. AI agents reach the actor through the Apify MCP server (mcp.apify.com) as boncross/agoda-room-rates.
More from BonCross
- Agoda Reviews Scraper: Agoda hotel reviews, including the Booking.com reviews Agoda shows.
- Agoda Search Scraper: Agoda search results for any destination and dates.
- Booking.com Hotel Details Scraper: The full Booking.com record for a property.
- Booking.com Hotel Search Scraper: Every hotel Booking.com is selling for a destination and your dates.
- Booking.com Room Rates Scraper: Every room Booking.com is selling for a hotel and your dates.
- Expedia Hotel Details Scraper: The full property record from Expedia and Hotels.com.
Your feedback
Does a rate here disagree with what Agoda's page shows for the same dates and party? That's the report we most want. Open an issue on the Issues tab in Apify Console with the hotel and the stay, and we'll look at it and reply there.