Agoda Scraper - Hotel Prices, Details and Reviews avatar

Agoda Scraper - Hotel Prices, Details and Reviews

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Agoda Scraper - Hotel Prices, Details and Reviews

Agoda Scraper - Hotel Prices, Details and Reviews

Extract Agoda hotel prices, ratings, addresses and optional guest reviews across regional sites. Search cities or read hotel URLs, and pay per delivered row plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Agoda Scraper

Extract Agoda hotel prices, ratings, addresses and optional guest reviews across regional sites as rows you can export.

  • Search a city by name or Agoda city ID for your travel dates.
  • Read hotel links from a city page or supply specific hotel pages.
  • Add descriptions, amenities, policies and available address details.
  • Get optional guest reviews as separate rows linked to their hotel.
  • Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.

What does Agoda Scraper do?

Agoda Scraper collects accommodation data from Agoda. Use it for travel research, hotel comparisons, mapping or repeated price checks. It covers hotels and other accommodation listed in Agoda's hotel searches, not flights, packages or activities. It does not require an Agoda account.

  • City search: use destination or regionId to find hotels for specified dates and guests.
  • City page: use cityPageUrl to collect hotel names and links, without dated prices.
  • Hotel pages: use detailUrls to read specific properties, including dated prices when available.
  • Details: enrichDetails is on by default and enrichLimit is 1 for search results.
  • Guest reviews: includeReviews is off by default. Each review is a separate row, billed at the same price as a hotel row.

What data can you extract from Agoda?

Fields depend on the input and what Agoda returns. A hotel row represents one property; a review row represents one review. Hotel rows do not contain a nested reviews list.

Hotel rows

FieldDescriptionExample
rowTypeEntity represented by this row.hotel
idRow identifier; use with rowType.5649836
hotelIdAgoda hotel identifier, when available.5649836
nameProperty name.Hotel Crescendo Seoul
urlAgoda hotel page.https://www.agoda.com/alcove-hotel-seoul-managed-by-accorhotels-ambassador/hotel/seoul-kr.html
priceNightly room price; check priceBasis when present.101.25
priceIncludingTaxesNightly room price including taxes, when supplied.111.37
currencyCurrency code for the price.USD
ratingOverall guest rating, on a 0–10 scale.8.1
reviewCountTotal review count shown by Agoda.5614
starRatingProperty star classification, not guest rating.3
areaNeighborhood or area.Gangnam
addressAvailable street, city, postal code and country.{"locality":"Seoul","country":"South Korea"}
geoLatitude and longitude.{"lat":37.511051,"lng":127.046768}
descriptionShort property description.Hotel near local transport.
amenitiesAvailable named facilities, up to 50.["Free Wi-Fi"]
faqAvailable hotel questions and answers.[]
policyCheckInHotel check-in time, distinct from travel dates.15:00
checkinSearch check-in date.2026-12-15
checkoutSearch check-out date.2026-12-17
sponsoredWhether Agoda marked the listing as sponsored.false
scrapedAtCollection timestamp.2026-10-24T12:00:00Z

Other available details include descriptionLong, images, policies, policyCheckOut and canonicalUrl. leadAbsences explains missing contact or address fields. These are optional, not guaranteed for every hotel.

Review rows

FieldDescriptionExample
rowTypeIdentifies a review row.review
idUnique review-row identifier.5649836:review:332:1187182385
reviewIdOriginal review identifier.1187182385
parentIdLinks the review to its hotel row.5649836
parentNameHotel name copied onto the review.Hotel Crescendo Seoul
parentUrlHotel page link.https://www.agoda.com/alcove-hotel-seoul-managed-by-accorhotels-ambassador/hotel/seoul-kr.html
textReview text, when available.Clean room near the station.
ratingThis review's rating, when supplied.9
reviewDateDate the review was written.2026-10-01
responseTextProperty's reply, when supplied.Thank you for your feedback.

Reviews can also include positives, negatives, reviewSourceId, reviewerCountry and parentLocation. Missing values may be omitted rather than set to null.

How to scrape Agoda

  1. Open Agoda Scraper in Apify Console.
  2. Fill one target field, such as destination with Chiang Mai.
  3. Set maxResults to 3 for a small first run. Adjust dates if needed.
  4. Click Start and wait for the run to finish.
  5. Download the dataset or read its rows through the Apify API.

An empty input, including {}, starts an example search for Bangkok capped at one row, with details enabled for one hotel. The status message identifies it as an example run. Normal start and row charges still apply. Filling one target field selects the matching search automatically; there is no mode field to set.

Enter one city in destination, or an Agoda city ID in regionId, such as 9395 for Bangkok. City names can use different languages, but Agoda must recognize the city. Search a city rather than a neighborhood, landmark or hotel name; filter the returned area or geo fields afterward.

City page

Set cityPageUrl to a public Agoda /city/*.html page. This returns hotel names and links, plus available ratings and optional property details. It is not a dated availability search and does not return dated prices.

Hotel pages

Set detailUrls to up to 20 distinct Agoda hotel page links. Each readable property can produce a hotel row and optional review rows. Prices for your dates may be added when available, but a property can still be returned without a price.

When several targets are filled, the order is detailUrls, cityPageUrl, regionId, then destination. Agoda country-site links and links without https:// are accepted; their paths are read on www.agoda.com.

What to fill in

FieldWhat to enterDefault
destinationOne city name, such as Chiang Mai.Empty; form prefill Bangkok
regionIdNumeric Agoda city ID. Overrides destination.Empty
cityPageUrlPublic Agoda city page URL.Empty
detailUrlsList of up to 20 hotel page URLs.Empty
checkinDate in YYYY-MM-DD format.21 days from today
checkoutDate 1–30 nights after check-in.Two nights after check-in
adultsNumber of adults, 1–10.2
childrenNumber of children, 0–10. Set childAges when above zero.0
childAgesAges in years for each child, 0–17, one entry per child.[]
roomsNumber of rooms, 1–10.1
maxResultsMaximum hotel and review rows per input, 1–500.70; form prefill 1
enrichDetailsAdd property details to search results.true
enrichLimitFirst search-result hotels to enrich, 0–20.1
includeReviewsReturn guest reviews as separate billed rows.false
includeSponsoredKeep sponsored hotel listings.false
includeRoomsReturn sellable room variants as separate billed rows (room type, bed configuration, price plan).false
domainAgoda regional site.www.agoda.com
localeSupported language and currency setting.en-us

City search example

{
"destination": "Chiang Mai",
"maxResults": 3
}

City page example

{
"cityPageUrl": "https://www.agoda.com/city/tokyo-jp.html",
"maxResults": 3,
"enrichDetails": false
}

Hotel pages example

{
"detailUrls": ["https://www.agoda.com/asia-hotel-bangkok/hotel/bangkok-th.html"],
"includeReviews": true,
"maxResults": 3
}
  • maxItems and limit are accepted as aliases of maxResults.
  • Unknown fields alone do not fail the run. Close misspellings can be corrected; other unknown fields are ignored with a note.
  • The INPUT_REPORT record in the default key-value store records how the Actor interpreted the input, including corrections, ignored fields and example-run selection.
  • Invalid hotel links or date values can stop the run with a message explaining what to change. Validation messages are not all formatted identically. No dataset rows means no row charges, but the start charge can still apply.
  • Empty dates are calculated anew for each run. Explicit dates are not automatically moved forward when they become old.

On www.agoda.com, examples include en-us for USD, ja-jp for JPY, th-th for THB, ko-kr for KRW and en-gb for GBP. Regional sites such as www.agoda.co.th, www.agoda.co.jp and www.agoda.co.uk override locale. There is no separate currency input.

Output example

This illustrative hotel row shows the format, not a current price quote.

{
"rowType": "hotel",
"id": "5649836",
"hotelId": "5649836",
"name": "Hotel Crescendo Seoul",
"url": "https://www.agoda.com/alcove-hotel-seoul-managed-by-accorhotels-ambassador/hotel/seoul-kr.html",
"price": 101.25,
"priceIncludingTaxes": 111.37,
"priceBasis": "per_room_per_night_excluding_taxes",
"currency": "USD",
"rating": 8.1,
"reviewCount": 5614,
"starRating": 3,
"area": "Gangnam",
"address": {"locality": "Seoul", "country": "South Korea"},
"geo": {"lat": 37.511051, "lng": 127.046768},
"amenities": ["Free Wi-Fi"],
"checkin": "2026-12-15",
"checkout": "2026-12-17",
"sponsored": false,
"scrapedAt": "2026-10-24T12:00:00Z"
}

You can export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY records delivered-row counts, the searched city and warnings. A failed run can also write ERROR_SUMMARY with its reason.

Why use this Agoda scraper?

  • Pay for delivered rows. Failed page attempts do not generate row charges.
  • Use partial answers. If some property details cannot be read, available hotel rows can still be delivered with a warning. Rows already written remain in the dataset; unfinished collection is not guaranteed to be saved after a stop.
  • Keep missing values honest. Missing source fields stay empty or absent rather than being invented.
  • Read several properties. Supply several hotel links in detailUrls; city-name searches accept one city per run.
  • Compare consistent searches. Reuse the same dates, guests and market for price comparisons.
  • Avoid extra setup. You do not need to set up proxies.

How much does it cost to scrape Agoda?

The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of selected memory, with a minimum of one event. At the default 1024 MB, the start charge is $0.005. Platform usage is included in these prices.

Apify planStart at 1024 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.003$3.00
Starter$0.005$0.003$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20

Hotel and review rows have the same price. Property attributes added to a hotel row are not separate rows.

  • maxResults applies to each destination search, city page URL or hotel page URL. It defaults to 70; larger requests are collected in parts of 70, up to the input limit of 500.
  • Hotel and review rows share that limit. A request for three rows can return one hotel and two reviews, not three hotels plus unlimited reviews.
  • Free Apify plan runs are capped at 200 rows, and free users can run this Actor up to 10 times.
  • The whole run stops at the Maximum cost per run you set (maxTotalChargeUsd in the API), even if inputs could return more rows.

Example: five delivered rows on the Free plan at 1024 MB cost 5 × $0.003 + $0.005 = $0.020. A completed search with zero rows has no row charge; its start charge still applies.

Use with AI agents and the API

Apify MCP server (Claude, ChatGPT, Cursor, VS Code)

Add this Actor to an MCP client that supports remote servers:

https://mcp.apify.com?tools=lentic_clockss/agoda-scraper

Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can then read rows with get-dataset-items.

Clients without remote MCP support can run npx @apify/actors-mcp-server --tools lentic_clockss/agoda-scraper with APIFY_TOKEN set.

Example prompt: "Find three Agoda hotels in Chiang Mai using the default dates. Return names, nightly prices, currencies and hotel links."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/agoda-scraper").call(
run_input={"destination": "Chiang Mai", "maxResults": 3}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/agoda-scraper').call({
destination: 'Chiang Mai', maxResults: 3
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~agoda-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Once the run finishes, use its dataset ID with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json. Starting a run is not the same as having completed rows.

Integrations

Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or your webhook. Use Apify Schedules for recurring searches.

FAQ

This unofficial Actor collects publicly available data and is not affiliated with Agoda. Public access does not remove obligations under Agoda's terms or applicable data protection law. You are responsible for your use of the data; processing personal data requires a lawful basis.

Why did my run end as ABORTED?

An ABORTED run was stopped before normal completion. Check its status message and logs for the cause. Do not assume it will restart automatically. Inspect the dataset for rows already written before deciding whether to start another run.

How many results can I get?

Set maxResults from 1 to 500 per input. The charge cap, free-plan limits and available matching data can reduce delivery. Reviews count toward the same limit, and the Actor does not guarantee the requested number of rows.

Why are some fields empty?

Agoda may not publish a field, or the hotel details may not have been read. Only the first enrichLimit search results receive extra details. City-page results have no dated prices, and direct hotel-page prices may be unavailable.

Do I need an Agoda login or partner API?

No Agoda login or partner API account is required. You need an Apify account to run the Actor and an Apify token for API calls.

Why did my run return no hotels?

Check RUN_SUMMARY.emptyReason. LOCATION_UNRESOLVED means the city was not recognized; NO_MATCH means no hotels matched the search. Try a city name or its Agoda city ID. Collection failures are reported as failures rather than successful empty searches.

Can I collect every review of a hotel?

Reviews are optional and limited by the available data and row budget. Set includeReviews to true and leave room for reviews after the hotel row. A hotel's reviewCount is not the number of review rows delivered.

Limitations

  • Hotels and accommodation only: no flights, packages, transportation, activities, deals catalog or eSIM products.
  • Search results depend on dates, guests and availability; properties without bookable prices are excluded from dated city searches.
  • City pages are not a complete inventory or availability guarantee.
  • Prices can change after collection and are not booking guarantees.
  • Phone numbers and email addresses are not guaranteed contact data.
  • The Actor accepts up to 20 hotel links; unavailable pages may produce no hotel row.
  • Images, amenities, review categories, FAQs and review snippets are capped at 50 entries per hotel row.

More travel, hotel and flight scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.