Agoda Scraper - Hotel Prices, Details and Reviews
Pricing
from $2.20 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
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
destinationorregionIdto find hotels for specified dates and guests. - City page: use
cityPageUrlto collect hotel names and links, without dated prices. - Hotel pages: use
detailUrlsto read specific properties, including dated prices when available. - Details:
enrichDetailsis on by default andenrichLimitis1for search results. - Guest reviews:
includeReviewsis 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
| Field | Description | Example |
|---|---|---|
rowType | Entity represented by this row. | hotel |
id | Row identifier; use with rowType. | 5649836 |
hotelId | Agoda hotel identifier, when available. | 5649836 |
name | Property name. | Hotel Crescendo Seoul |
url | Agoda hotel page. | https://www.agoda.com/alcove-hotel-seoul-managed-by-accorhotels-ambassador/hotel/seoul-kr.html |
price | Nightly room price; check priceBasis when present. | 101.25 |
priceIncludingTaxes | Nightly room price including taxes, when supplied. | 111.37 |
currency | Currency code for the price. | USD |
rating | Overall guest rating, on a 0–10 scale. | 8.1 |
reviewCount | Total review count shown by Agoda. | 5614 |
starRating | Property star classification, not guest rating. | 3 |
area | Neighborhood or area. | Gangnam |
address | Available street, city, postal code and country. | {"locality":"Seoul","country":"South Korea"} |
geo | Latitude and longitude. | {"lat":37.511051,"lng":127.046768} |
description | Short property description. | Hotel near local transport. |
amenities | Available named facilities, up to 50. | ["Free Wi-Fi"] |
faq | Available hotel questions and answers. | [] |
policyCheckIn | Hotel check-in time, distinct from travel dates. | 15:00 |
checkin | Search check-in date. | 2026-12-15 |
checkout | Search check-out date. | 2026-12-17 |
sponsored | Whether Agoda marked the listing as sponsored. | false |
scrapedAt | Collection 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
| Field | Description | Example |
|---|---|---|
rowType | Identifies a review row. | review |
id | Unique review-row identifier. | 5649836:review:332:1187182385 |
reviewId | Original review identifier. | 1187182385 |
parentId | Links the review to its hotel row. | 5649836 |
parentName | Hotel name copied onto the review. | Hotel Crescendo Seoul |
parentUrl | Hotel page link. | https://www.agoda.com/alcove-hotel-seoul-managed-by-accorhotels-ambassador/hotel/seoul-kr.html |
text | Review text, when available. | Clean room near the station. |
rating | This review's rating, when supplied. | 9 |
reviewDate | Date the review was written. | 2026-10-01 |
responseText | Property'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
- Open Agoda Scraper in Apify Console.
- Fill one target field, such as
destinationwithChiang Mai. - Set
maxResultsto3for a small first run. Adjust dates if needed. - Click Start and wait for the run to finish.
- 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.
City search
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
| Field | What to enter | Default |
|---|---|---|
destination | One city name, such as Chiang Mai. | Empty; form prefill Bangkok |
regionId | Numeric Agoda city ID. Overrides destination. | Empty |
cityPageUrl | Public Agoda city page URL. | Empty |
detailUrls | List of up to 20 hotel page URLs. | Empty |
checkin | Date in YYYY-MM-DD format. | 21 days from today |
checkout | Date 1–30 nights after check-in. | Two nights after check-in |
adults | Number of adults, 1–10. | 2 |
children | Number of children, 0–10. Set childAges when above zero. | 0 |
childAges | Ages in years for each child, 0–17, one entry per child. | [] |
rooms | Number of rooms, 1–10. | 1 |
maxResults | Maximum hotel and review rows per input, 1–500. | 70; form prefill 1 |
enrichDetails | Add property details to search results. | true |
enrichLimit | First search-result hotels to enrich, 0–20. | 1 |
includeReviews | Return guest reviews as separate billed rows. | false |
includeSponsored | Keep sponsored hotel listings. | false |
includeRooms | Return sellable room variants as separate billed rows (room type, bed configuration, price plan). | false |
domain | Agoda regional site. | www.agoda.com |
locale | Supported 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}
maxItemsandlimitare accepted as aliases ofmaxResults.- Unknown fields alone do not fail the run. Close misspellings can be corrected; other unknown fields are ignored with a note.
- The
INPUT_REPORTrecord 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 plan | Start at 1024 MB | Price per row | Price 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.
maxResultsapplies to each destination search, city page URL or hotel page URL. It defaults to70; larger requests are collected in parts of 70, up to the input limit of500.- 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 (
maxTotalChargeUsdin 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 ApifyClientclient = 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
Is it legal to scrape Agoda?
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.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Trip.com Scraper — Hotels Flights Trains Cars
- Traveloka Scraper
- Expedia Scraper
- Skyscanner Scraper
- Despegar Scraper
- TripAdvisor Scraper — Hotels, Restaurants & More
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
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.