Agoda Scraper | Hotel Prices and Guest Ratings avatar

Agoda Scraper | Hotel Prices and Guest Ratings

Pricing

from $4.08 / 1,000 hotels

Go to Apify Store
Agoda Scraper | Hotel Prices and Guest Ratings

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

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

How it works

  1. 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.
  2. 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.
  3. 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 Tower or Marina Bay Sands and 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 pricePerNight before taxes, pricePerNightWithTaxes, totalPrice for the whole stay and all rooms, originalPricePerNight before the discount and discountPercent, as numbers, in the currency you choose among 20.
  • ๐Ÿงพ The conditions on the row. hasFreeCancellation with its deadline freeCancellationUntil, canPayLater, canPayAtHotel, availableRooms. A price without its conditions is not a price; here they sit in the same row.
  • โญ The guest score, broken down. reviewScore out of 10 and reviewsCount, plus reviewScores for 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

TeamWhat they build
Hotel revenue managementA 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 researchA 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 metasearchA hotel inventory of a city with coordinates, stars, scores and pictures, refreshed on a schedule
Destination marketingA monthly report of what a night costs in their city versus three rival destinations, in one currency
Deal newsletters and comparison sitesThe best rated hotels under a price, per city, with the discount and the pictures, every Thursday
Data and AIA dataset of hotels with prices, scores and locations over time, for forecasting or a recommendation model
Corporate travelA shortlist of hotels near an office or a venue (landmark search) with pay-later options for a team offsite

๐Ÿ“ฅ Input parameters

Essentials

FieldTypeDescription
destinationsarrayWhere 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).
checkInstringFirst night of the stay, YYYY-MM-DD. Empty means two weeks from today.
checkOutstringDeparture date. Empty means one night. Up to 30 nights.
maxItemsinteger, default 50Maximum rows per destination. A hotel name gives one row whatever the cap.

๐Ÿ›๏ธ Stay

FieldTypeDescription
adultsinteger, default 2Adult guests, up to 20.
roomsinteger, default 1Rooms, up to 10. pricePerNight stays the rate of one room; totalPrice covers all rooms and nights.
currencystring, default USDCurrency of every price: USD, EUR, GBP, THB, JPY, SGD, AUD, CAD, INR, KRW, CNY, HKD, MYR, IDR, PHP, VND, TWD, AED, CHF or BRL.
sortBystring, default recommendedrecommended, 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

FieldTypeDescription
includeDetailsboolean, default falseOn: 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

FieldTypeDescription
debugModeboolean, default falseAdds 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.

GroupFields
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

{
"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-scraper
Input 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 ApifyClient
from datetime import date, timedelta
client = 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().items
priced = [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 csv
from apify_client import ApifyClient
from datetime import date, timedelta
client = 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:

RunRowsTime
Bangkok, default input50 hotels3 seconds
Sukhumvit, 3 nights, guest rating order, property pages read12 hotels with address, description and 137 facilities each12 seconds
Eiffel Tower + Marina Bay Sands + Tokyo by address, 2 rooms, price order17 hotels2 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

  1. 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.
  2. Pick the order before the cap. maxItems: 50 with price_low_to_high gives the 50 cheapest; with review_score the 50 best rated. For a full market, raise the cap: a large city has 1,000 to 5,000 hotels.
  3. Use an area or a landmark for a neighborhood. Sukhumvit or Eiffel Tower returns the hotels of that spot; Bangkok returns the whole city in Agoda's order.
  4. Read one hotel by its name. Marina Bay Sands gives one row with the live price for your dates: cheap to schedule daily for a price curve.
  5. Leave includeDetails off 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.

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.

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