Agoda Scraper | Hotel Prices and Guest Ratings
Pricing
from $4.08 / 1,000 hotels
Agoda Scraper | Hotel Prices and Guest Ratings
Agoda scraper for hotel prices: enter a city, area, landmark or hotel name and get every hotel with its live nightly and total price, taxes, discount, free cancellation, star rating, guest score, coordinates, facilities and photos. No login needed. Sort, cap, schedule and export to JSON or CSV.
Pricing
from $4.08 / 1,000 hotels
Rating
0.0
(0)
Developer
SilentFlow
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Agoda Scraper
Turn an Agoda destination into a price table: every hotel listed for your dates, with its nightly and total price, taxes, discount, cancellation terms, guest score and location. 50 hotels of Bangkok in 3 seconds, no Agoda account needed.
How it works

- You type a destination. A city, an area, a landmark, a hotel name or an Agoda search address, one per line, in the same field. Add the dates, the party and the currency, or leave the defaults.
- The search is read page by page. The hotels come back in the order you pick (recommended, price, guest rating, stars, distance), with the live price Agoda quotes for those dates, until your cap is met.
- One row comes back per hotel. 47 fields: the price per night before and after taxes, the total for the stay, the crossed-out price and the discount, free cancellation and its deadline, the guest score with its six-part breakdown, stars, area, coordinates, distance from the center, pictures. Ready for a spreadsheet, a database or an AI pipeline.
โจ Why teams choose this over other Agoda scrapers
Paging through 45 hotels at a time to rate-shop a city? Collecting hotel links by hand before a scraper agrees to give you prices? Getting prices back as text with a currency sign and a strike-through, then cleaning them for every report?
- ๐ A destination is enough. Type
Bangkok,Sukhumvit,Eiffel TowerorMarina Bay Sandsand press Start. Two of the three most used Agoda hotel scrapers on the Store ask for hotel links or ids first; this one finds the hotels for you, or reads one hotel by its name. - ๐ถ Prices you can compare. Every row carries
pricePerNightbefore taxes,pricePerNightWithTaxes,totalPricefor the whole stay and all rooms,originalPricePerNightbefore the discount anddiscountPercent, as numbers, in the currency you choose among 20. - ๐งพ The conditions on the row.
hasFreeCancellationwith its deadlinefreeCancellationUntil,canPayLater,canPayAtHotel,availableRooms. A price without its conditions is not a price; here they sit in the same row. - โญ The guest score, broken down.
reviewScoreout of 10 andreviewsCount, plusreviewScoresfor cleanliness, facilities, location, room comfort, staff and value for money, and the share of guests who recommend the hotel. - ๐บ๏ธ A location that joins. Latitude and longitude, area, city, country code, distance from the city center and from the nearest station. Put the hotels on a map, or filter a radius, without geocoding.
- ๐ฝ Six orders that decide what you get. Recommended by Agoda, price low to high, price high to low, guest rating, star rating, distance from the center. The order picks which hotels fill your cap: the 50 cheapest, the 50 best rated, the 50 closest.
- ๐ The property page when you want it. One switch adds the full street address, the description, the complete list of available facilities (137 for a large Bangkok hotel) and the check-in and check-out times. Off by default, so the fast listing stays fast.
- ๐งน A clean dataset, every time. One row is one real hotel, once per run even when two destinations overlap. An unknown destination produces no row and a clear message on the run. Unknown values are
null, never an empty string. Dates are ISO, prices are numbers.
๐ฏ What you can do with Agoda data
| Team | What they build |
|---|---|
| Hotel revenue management | A morning rate shop of the 30 hotels around their property for the next 4 weekends, with taxes and cancellation terms, pushed to a sheet |
| Travel market research | A price-band study of a destination: average nightly rate by star rating and by area, share of free cancellation, guest score distribution |
| Online travel agencies and metasearch | A hotel inventory of a city with coordinates, stars, scores and pictures, refreshed on a schedule |
| Destination marketing | A monthly report of what a night costs in their city versus three rival destinations, in one currency |
| Deal newsletters and comparison sites | The best rated hotels under a price, per city, with the discount and the pictures, every Thursday |
| Data and AI | A dataset of hotels with prices, scores and locations over time, for forecasting or a recommendation model |
| Corporate travel | A shortlist of hotels near an office or a venue (landmark search) with pay-later options for a team offsite |
๐ฅ Input parameters
Essentials
| Field | Type | Description |
|---|---|---|
destinations | array | Where to look, one per line: a city (Bangkok, Paris), an area (Sukhumvit), a landmark (Eiffel Tower), a hotel name (Marina Bay Sands) or an Agoda search address (https://www.agoda.com/search?city=9395). |
checkIn | string | First night of the stay, YYYY-MM-DD. Empty means two weeks from today. |
checkOut | string | Departure date. Empty means one night. Up to 30 nights. |
maxItems | integer, default 50 | Maximum rows per destination. A hotel name gives one row whatever the cap. |
๐๏ธ Stay
| Field | Type | Description |
|---|---|---|
adults | integer, default 2 | Adult guests, up to 20. |
rooms | integer, default 1 | Rooms, up to 10. pricePerNight stays the rate of one room; totalPrice covers all rooms and nights. |
currency | string, default USD | Currency of every price: USD, EUR, GBP, THB, JPY, SGD, AUD, CAD, INR, KRW, CNY, HKD, MYR, IDR, PHP, VND, TWD, AED, CHF or BRL. |
sortBy | string, default recommended | recommended, price_low_to_high, price_high_to_low, review_score, star_rating or distance_from_center. The two price orders keep only hotels with a room left. |
๐ Output
| Field | Type | Description |
|---|---|---|
includeDetails | boolean, default false | On: every row also gets the full address, the description, the complete facility list and the check-in and check-out times from the hotel's page, about one extra second per hotel. |
โ๏ธ Advanced
| Field | Type | Description |
|---|---|---|
debugMode | boolean, default false | Adds detailed lines to the run log. |
๐ Output data
One row per hotel. A listing row of the default run:
{"id": 10629,"url": "https://www.agoda.com/amari-don-muang-airport-bangkok-hotel/hotel/bangkok-th.html","name": "Amari Don Muang Airport Bangkok Hotel","propertyType": "Hotel","starRating": 4,"highlights": ["Dedicated Skybridge to Airport", "Buffet Breakfast with Cook-to-Order"],"facilities": ["Swimming pool", "Free Wi-Fi in all rooms!", "Gym/fitness", "Close to public transportation"],"description": null,"address": null,"postalCode": null,"checkInTime": null,"checkOutTime": null,"pricePerNight": 72.03,"pricePerNightWithTaxes": 84.78,"totalPrice": 84.78,"originalPricePerNight": 90.04,"discountPercent": 20,"currency": "USD","isAvailable": true,"availableRooms": 62,"hasFreeCancellation": true,"freeCancellationUntil": "2026-10-02T17:00:00Z","canPayLater": true,"canPayAtHotel": false,"reviewScore": 8.4,"reviewsCount": 38511,"reviewScores": {"cleanliness": 8.4,"facilities": 8.3,"location": 9.3,"roomComfort": 8.1,"staffPerformance": 8.5,"valueForMoney": 8.1},"recommendedPercent": 85,"area": "Don Mueang International Airport","city": "Bangkok","country": "Thailand","countryCode": "TH","latitude": 13.9209880828857,"longitude": 100.600479125977,"distanceFromCenterKm": 19,"nearestStation": "Don Muang Railway Station","nearestStationKm": 0.2,"checkIn": "2026-10-04","checkOut": "2026-10-05","nights": 1,"adults": 2,"rooms": 1,"imageUrl": "https://pix8.agoda.net/hotelImages/10629/-1/71c039c179abc26a3ef12cca5e97e6ab.jpg?va=1&ca=11&ce=1","images": ["https://pix8.agoda.net/hotelImages/10629/-1/71c039c179abc26a3ef12cca5e97e6ab.jpg?va=1&ca=11&ce=1", "..."],"destination": "Bangkok","destinationType": "city","scrapedAt": "2026-09-20T15:15:14Z"}
The same hotel with includeDetails on fills the five property page fields:
{"id": 10629,"name": "Amari Don Muang Airport Bangkok Hotel","description": "Experience a seamless blend of convenience and Thai hospitality at Amari Don Muang Airport Bangkok Hotel, the perfect sanctuary for those arriving in Bangkok. ...","address": "333 Moo 10, Chert Wudthakas Road, Srikan, Don Mueang International Airport, Bangkok, Thailand, 10210","postalCode": "10210","checkInTime": "15:00","checkOutTime": "12:00","facilities": ["Swimming pool", "Free Wi-Fi in all rooms!", "Gym/fitness", "Airport transfer", "Restaurants", "Bar", "Car park", "Elevator", "..."]}
A hotel with no room left for the dates keeps its row with isAvailable: false and null in every price field, so the market count stays right and you can still read its score and location.
๐๏ธ Data fields
47 fields per hotel, grouped as they appear in the row. reviewScores holds 6 more.
| Group | Fields |
|---|---|
| Identity (3) | id (Agoda property id, stable), url (permanent property page), name |
| Content (9) | propertyType (Hotel, Resort, Apartment, Hostel...), starRating, highlights (what Agoda calls out for the hotel), facilities (the ones Agoda shows in the search; the full list with includeDetails), description, address, postalCode, checkInTime, checkOutTime (the last five with includeDetails) |
| Prices and conditions (12) | pricePerNight (one room, one night, before taxes), pricePerNightWithTaxes, totalPrice (all rooms, all nights, taxes in), originalPricePerNight (crossed-out rate), discountPercent, currency, isAvailable, availableRooms, hasFreeCancellation, freeCancellationUntil (RFC 3339 UTC), canPayLater, canPayAtHotel |
| Guest rating (4) | reviewScore (out of 10), reviewsCount, reviewScores (cleanliness, facilities, location, roomComfort, staffPerformance, valueForMoney), recommendedPercent |
| Place (9) | area, city, country, countryCode (ISO 3166-1), latitude, longitude, distanceFromCenterKm, nearestStation, nearestStationKm |
| Stay (5) | checkIn, checkOut, nights, adults, rooms: the conditions the price was quoted for |
| Media (2) | imageUrl (first picture), images (up to 12 pictures) |
| Meta (3) | destination (your input line), destinationType (city, area, landmark or hotel), scrapedAt (RFC 3339 UTC) |
url and id are permanent. Picture links stay valid for weeks. Prices are what Agoda quoted at scrapedAt for the stay described on the row; they move with dates, party and demand.
๐ Examples
Get the 50 recommended hotels of a city for two weeks from now
{"destinations": ["Bangkok"]}
Find the 100 cheapest rooms in Paris for a given weekend
{"destinations": ["Paris"],"checkIn": "2026-11-20","checkOut": "2026-11-22","sortBy": "price_low_to_high","currency": "EUR","maxItems": 100}
Rate-shop a neighborhood with full details for a family of four
{"destinations": ["Sukhumvit"],"checkIn": "2026-12-26","checkOut": "2026-12-30","adults": 4,"rooms": 2,"currency": "THB","sortBy": "review_score","includeDetails": true,"maxItems": 40}
Compare hotels around a landmark and one named hotel in the same run
{"destinations": ["Eiffel Tower", "Marina Bay Sands"],"checkIn": "2027-02-14","checkOut": "2027-02-16","sortBy": "distance_from_center","maxItems": 30}
Build a hotel inventory of five cities in one currency
{"destinations": ["Tokyo", "Osaka", "Kyoto", "Fukuoka", "Sapporo"],"currency": "JPY","sortBy": "star_rating","maxItems": 300}
Read a search address you composed on Agoda
{"destinations": ["https://www.agoda.com/search?city=9395"],"checkIn": "2026-10-15","maxItems": 20}
๐ค Copy to your AI assistant
Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:
You have access to the Agoda Scraper on Apify: silentflow/agoda-scraperInput schema:- destinations (array of strings): cities, areas, landmarks, hotel names or Agoda search addresses (https://www.agoda.com/search?city=9395). Prefill: ["Bangkok"]- checkIn (string, YYYY-MM-DD, optional): first night; empty = 14 days from today- checkOut (string, YYYY-MM-DD, optional): departure; empty = one night; up to 30 nights- maxItems (integer, default 50): max rows per destination; a hotel name gives 1 row- adults (integer, default 2, max 20)- rooms (integer, default 1, max 10)- currency (string, default "USD"): USD, EUR, GBP, THB, JPY, SGD, AUD, CAD, INR, KRW, CNY, HKD, MYR, IDR, PHP, VND, TWD, AED, CHF, BRL- sortBy (string, default "recommended"): recommended | price_low_to_high | price_high_to_low | review_score | star_rating | distance_from_center. The price orders return only hotels with a room left.- includeDetails (boolean, default false): adds description, address, postalCode, checkInTime, checkOutTime and the full facilities list- debugMode (boolean, default false)Output per hotel (47 fields):- id (integer), url (string), name (string)- propertyType (string|null), starRating (number|null), highlights (string[]), facilities (string[]), description (string|null), address (string|null), postalCode (string|null), checkInTime (string|null), checkOutTime (string|null)- pricePerNight (number|null), pricePerNightWithTaxes (number|null), totalPrice (number|null), originalPricePerNight (number|null), discountPercent (integer|null), currency (string), isAvailable (boolean), availableRooms (integer|null), hasFreeCancellation (boolean), freeCancellationUntil (RFC 3339|null), canPayLater (boolean), canPayAtHotel (boolean)- reviewScore (number|null, out of 10), reviewsCount (integer|null), reviewScores (object|null: cleanliness, facilities, location, roomComfort, staffPerformance, valueForMoney), recommendedPercent (integer|null)- area, city, country, countryCode (string|null), latitude, longitude (number|null), distanceFromCenterKm (number|null), nearestStation (string|null), nearestStationKm (number|null)- checkIn, checkOut (YYYY-MM-DD), nights, adults, rooms (integer)- imageUrl (string|null), images (string[])- destination (string), destinationType (city|area|landmark|hotel), scrapedAt (RFC 3339)No login. Use apify-client for Python or JavaScript.
๐ป Integrations
Rate-shop a competitive set every morning (Python)
from apify_client import ApifyClientfrom datetime import date, timedeltaclient = ApifyClient("YOUR_APIFY_TOKEN")friday = date.today() + timedelta((4 - date.today().weekday()) % 7 + 7)run = client.actor("silentflow/agoda-scraper").call(run_input={"destinations": ["Sukhumvit"],"checkIn": friday.isoformat(),"checkOut": (friday + timedelta(days=2)).isoformat(),"sortBy": "review_score","currency": "THB","maxItems": 40,})rows = client.dataset(run["defaultDatasetId"]).list_items().itemspriced = [r for r in rows if r["isAvailable"]]priced.sort(key=lambda r: r["pricePerNight"])for r in priced[:10]:flag = "free cancel" if r["hasFreeCancellation"] else "non refundable"print(f'{r["name"][:40]:40} {r["starRating"]}* {r["reviewScore"]} {r["pricePerNight"]:>8.0f} THB {flag}')
Put a city's hotels on a map with their scores (JavaScript)
import { ApifyClient } from 'apify-client';import fs from 'node:fs';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('silentflow/agoda-scraper').call({destinations: ['Lisbon'],sortBy: 'distance_from_center',currency: 'EUR',maxItems: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const geojson = {type: 'FeatureCollection',features: items.filter((h) => h.latitude && h.longitude).map((h) => ({type: 'Feature',geometry: { type: 'Point', coordinates: [h.longitude, h.latitude] },properties: { name: h.name, stars: h.starRating, score: h.reviewScore, price: h.pricePerNight, url: h.url },})),};fs.writeFileSync('lisbon-hotels.geojson', JSON.stringify(geojson));console.log(`${geojson.features.length} hotels written`);
Track a price curve over dates (Python, CSV)
import csvfrom apify_client import ApifyClientfrom datetime import date, timedeltaclient = ApifyClient("YOUR_APIFY_TOKEN")with open("okura-prices.csv", "a", newline="") as f:writer = csv.writer(f)for lead in (7, 14, 30, 60):check_in = date.today() + timedelta(days=lead)run = client.actor("silentflow/agoda-scraper").call(run_input={"destinations": ["The Okura Prestige Bangkok"],"checkIn": check_in.isoformat(),})for h in client.dataset(run["defaultDatasetId"]).list_items().items:writer.writerow([date.today(), check_in, h["name"], h["pricePerNight"], h["totalPrice"], h["currency"], h["hasFreeCancellation"]])
๐ Performance
Measured on 20 September 2026:
| Run | Rows | Time |
|---|---|---|
| Bangkok, default input | 50 hotels | 3 seconds |
| Sukhumvit, 3 nights, guest rating order, property pages read | 12 hotels with address, description and 137 facilities each | 12 seconds |
| Eiffel Tower + Marina Bay Sands + Tokyo by address, 2 rooms, price order | 17 hotels | 2 seconds |
Agoda lists about 45 hotels per page and answers a page in about a second, so 500 hotels of a city take about a minute without details. With includeDetails, count about one more second per hotel. A hotel name is one request. There is no fixed limit on rows per run.
๐พ Data export
The dataset is available from the run page in JSON, CSV, Excel, XML, HTML table and RSS, and through the API:
https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN
Two views are ready on the run page: Hotels (name, stars, guest rating, reviews, price per night, currency, area, link) and Prices and conditions (nightly rate, rate with taxes, total, crossed-out price, discount, free cancellation, pay later). Every field of the row is in every export whatever the view.
๐ก Tips for best results
- Set the dates you care about. Prices, availability and cancellation deadlines are quoted for the stay on the row. Empty dates mean two weeks ahead, one night, which is a good default for a market snapshot but not for a specific weekend.
- Pick the order before the cap.
maxItems: 50withprice_low_to_highgives the 50 cheapest; withreview_scorethe 50 best rated. For a full market, raise the cap: a large city has 1,000 to 5,000 hotels. - Use an area or a landmark for a neighborhood.
SukhumvitorEiffel Towerreturns the hotels of that spot;Bangkokreturns the whole city in Agoda's order. - Read one hotel by its name.
Marina Bay Sandsgives one row with the live price for your dates: cheap to schedule daily for a price curve. - Leave
includeDetailsoff for monitoring. Prices, scores and locations are on the listing row already; turn the property page on when you need the address, the description or the full facility list.
โ FAQ
What does the scraper extract?
The hotels Agoda lists for a destination and a stay: identity, stars, highlights and facilities, nightly and total price with taxes, discount, availability, cancellation and payment conditions, guest score with its breakdown, area, coordinates, distances, pictures. 47 fields per hotel, plus address, description, full facilities and check-in times with includeDetails.
Which destinations work?
Cities (Bangkok), areas (Sukhumvit), landmarks (Eiffel Tower), hotel names (Marina Bay Sands) and Agoda search addresses with a city, area or landmark id. The name is resolved the way Agoda's own search box resolves it: an exact match wins, then the first city, area, landmark or hotel offered. Unknown places produce no row and a message on the run.
Are the prices live?
Yes. Every run reads Agoda at that moment for the dates, party and currency you set, and writes them on the row (checkIn, checkOut, adults, rooms, currency, scrapedAt). There is no cache.
Why do some rows have no price?
Agoda lists hotels with no room left for the dates. They keep their row with isAvailable: false and null in the price fields, so the market count is right. The two price orders skip them, so every row of a price-sorted run has a price.
What is the difference between the price fields?
pricePerNight is one room for one night before taxes and fees, pricePerNightWithTaxes the same with them, totalPrice the whole stay for all rooms with taxes, originalPricePerNight the crossed-out rate before Agoda's discount, discountPercent the difference in percent.
Do I need an Agoda account? No. The scraper reads the public search results. No login, no key.
How many hotels can I get per run?
There is no fixed limit. maxItems caps each destination; a city with 4,000 hotels needs about 90 pages, which takes a couple of minutes. Several destinations run one after the other in the same run, and a hotel that appears in two of them is delivered once.
Can I get reviews? Not the review texts. Each row carries the guest score, the number of reviews, the score per aspect and the share of guests who recommend the hotel.
Which currencies are supported? Twenty: USD, EUR, GBP, THB, JPY, SGD, AUD, CAD, INR, KRW, CNY, HKD, MYR, IDR, PHP, VND, TWD, AED, CHF and BRL. Agoda converts at its own rate.
Can I schedule it? Yes. Leave the dates empty for a rolling two-weeks-ahead snapshot, or compute them in your own code as in the Integrations section. A run of 50 hotels takes seconds.
Are the links permanent?
url is the hotel's permanent page on Agoda and id its stable property id. Picture links stay valid for weeks; download them if you archive.
Is this legal? The scraper reads publicly listed hotels and prices, the same pages any visitor sees. See the Legal section and check the terms that apply to your use.
โ๏ธ Legal
This Actor extracts publicly available data from agoda.com. It does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with Agoda's terms of service and applicable data protection laws (GDPR, CCPA and PIPL where relevant). The output describes hotels and prices, not individuals; the description and address fields are the property's own public information. The data returned is informational; verify accuracy for regulated use cases.
๐ Related scrapers
More travel and marketplace scrapers by the same author: silentflow on Apify.
๐ฌ Support
Need something this scraper doesn't do yet? We ship features fast.
- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations and high-volume plans
- Pricing questions? Check the Monetization tab on the actor page
Response time: usually under 24 hours.
Check out our other scrapers: silentflow on Apify