# Agoda Scraper: Hotel and Home Prices, Availability (`automation_craft/agoda-scraper`) Actor

Agoda hotel and home prices for your stay by city, area, landmark, map area, link or id, a whole city per run, no login. Rows: nightly and stay price with taxes, deal, stars, guest score, rooms left, free cancellation. Add room offers, reviews or a country's prices. JSON, CSV, API; pay per property.

- **URL**: https://apify.com/automation_craft/agoda-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Travel, E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.76 / 1,000 properties

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Agoda Scraper: Hotel and Home Prices, Availability

**Agoda scraper and API** for hotels, resorts, apartments, villas, hostels and every other stay on Agoda: search any city, area, landmark, region or property by name, paste Agoda search or property links, give Agoda city ids or property ids, or draw a map circle or box. Every property comes with the price per night and per stay for your dates and guests, with and without taxes, the taxes and fees, the crossed out price and discount, the deal type, rooms left, free cancellation, pay later and pay at the property, breakfast, stars, guest score and review count, scores by source and by traveller type, area and city, map position, distance from the centre, nearby transport and landmarks, and photos. Turn on **Property details** for every room and offer of the stay, **Guest reviews** for the reviews with their own filters, and **Price market** for the prices a visitor in another country sees.

No login, no cookies to give and no browser: the Actor reads Agoda's own site data service through Apify's datacenter proxy (included in the price). It reads a whole city, not only the part one search order shows: on the platform, one Bangkok run met 6,857 properties against the 6,774 Agoda reported and delivered the 5,442 available for the stay (1,415 of the properties met were sold out for the stay or outside the city, skipped free) in 525 seconds, its search marked complete.

#### What you can do with it

- Rate shopping: the prices of a city's hotels and homes for every check-in day of the next weeks (`checkInWindowDays`, up to 60 days, every Nth day with `checkInWindowStepDays`), with a free stay dates row per property that ranks its check-ins by price.
- Track the prices of the properties you compete with on a schedule: relative dates (`checkInDaysFromToday`, `nights`) keep a scheduled run on "14 days from today" every time.
- Compare markets: read the same search as a visitor in Singapore, Japan, Australia or 16 more countries sees it (`priceMarket`).
- Size a market: the number of properties Agoda reports for a search, the price distribution of the rows delivered (`priceStats`), and with `includeFilterCounts` Agoda's own filter counts (areas, types, stars, facilities, chains) with their ids.
- Read the full room and offer list of a list of properties by link or id, with cancellation terms, payment, breakfast and rooms left per offer.
- Collect guest reviews by source, language, traveller type, score band, reviewer country or date window, for sentiment and quality work.

### How to use the Agoda Scraper

1. Open the Actor and type one or more places in **Places or property names**, for example `Bangkok`, `Sukhumvit`, `Shinjuku`, `Ubud` or `Marina Bay Sands`, or paste links into **Agoda links**, ids into **Agoda city ids** or **Agoda property ids**, or a circle or box into **Map areas**.
2. Set the stay: fixed dates (**Check-in date**, **Check-out date**) or **Check-in in N days** and **Nights** (when you give neither: 14 days from the run's day, 2 nights), plus **Adults** (default 2), **Rooms** (default 1), **Children's ages**, **Currency** (default USD) and **Language** (default en-us). A pasted Agoda link keeps its own dates, guests, currency, filters and sort unless you set them here.
3. Add any filters (hotels or homes, property types, stars, guest score, price per night, free cancellation, payment options, breakfast, facilities, room amenities and more) and set **Maximum properties per run** and **Maximum properties per search** (default 1,000; set it above a city's size to read the whole city).
4. Turn on **Property details**, **Guest reviews** or **Price trend (free)** if you need them, and pick a **Price market** for local prices.
5. Click **Start**. Download the rows as JSON, CSV, Excel, XML or HTML, or read them through the Apify API.

### What data you get

One Property row per property and stay (`type: "property"`), one Review row per guest review when Guest reviews is on (`type: "review"`), and free rows: a search row per search and stay (`type: "search"`), a review walk row per property (`type: "reviews"`), a stay dates row per property when the run reads several check-in days (`type: "stayDates"`), place rows with **Place suggestions only** (`type: "place"`), status rows for every miss (`type: "status"`: a place Agoda does not offer exactly, with the candidates, `place_not_found` or `place_ambiguous`; a property link or id Agoda does not know, `not_found`; a property with no offer for your stay, `not_available`; a stay Agoda does not search, `stay_refused`) and one run summary (`type: "summary"`).

| Field | What it holds | Filled |
|---|---|---|
| `id`, `name`, `nameDefault`, `url`, `pageUrl` | Agoda property id, name in the run's language and Agoda's default name, the property link with your stay and the plain link | 100% |
| `propertyType`, `accommodationType`, `accommodationTypeId`, `isHome` | Hotel or home, Agoda's type (Hotel, Apartment/Flat, Resort, Ryokan and so on) and its id | 100% |
| `hostType`, `hostPropertyCount` | `company` or `individual` host of a home, and how many properties the host lists | 20% (homes whose host Agoda names) |
| `stars` | star rating (0 when unrated) | 100% (96.4% rated) |
| `reviewScore`, `reviewCount` | guest score out of 10 and number of reviews | 84.5% |
| `reviewScoresBySource` | the score and count from Agoda, Booking.com, Priceline and other sources Agoda shows | 84.9% |
| `travellerTypeScores` | scores by traveller type (business, couples, solo, families, groups), six grades each | 84.0% |
| `recommendationPercent` | share of guests who recommend it | 28.2% |
| `reviewSnippets`, `reviewTopics` | short review quotes and the topics guests mention | 46.8%, 50.6% |
| `country`, `countryCode`, `city`, `cityId`, `area`, `areaId` | where it is, with Agoda's ids | 100% |
| `latitude`, `longitude` | map position | 100% of hotels and company homes |
| `distanceFromCityCenterKm`, `nearbyTransport`, `nearbyLandmarks` | distance from the centre and nearby places with distances in metres | 98.2%, 99.2%, 85.5% of hotels and company homes |
| `mainPhoto`, `photos` | main photo and photo links with captions | 100% |
| `favoriteFeatures`, `atmospheres`, `uniqueHighlights` | Agoda's feature lines | 94.8%, 86.7%, 23.8% |
| `price.perNight`, `price.perNightWithTaxes`, `price.perRoomPerNight`, `price.perRoomPerNightWithTaxes`, `price.perStay`, `price.perStayWithTaxes`, `price.taxesAndFeesPerStay`, `price.currency` | the price of Agoda's cheapest offer for the stay, without and with taxes and fees | 100% |
| `price.crossedOutPerStayWithTaxes`, `price.discountPercent`, `price.couponDiscountPerStay` | the crossed out price and the discount | a discount on 7.3% of rows |
| `roomsLeft` | rooms left at this price | 100% |
| `dealType`, `deals`, `insiderDeal` | Agoda's deal on the shown offer | 73.2% |
| `cancellationPolicy`, `freeCancellation`, `freeCancellationUntil` | the offer's cancellation terms | 100% (free cancellation on 84.3% of rows), until date 89.7% |
| `payLater`, `payAtHotel`, `noCreditCardNeeded`, `paymentModel` | payment options of the shown offer | 100% (pay later on 82.8%) |
| `breakfastIncluded`, `benefitIds` | breakfast in the shown offer and Agoda's benefit ids | 100% (breakfast on 15.8%) |
| `cheapestRoomSizeSqm`, `cheapestRoomFacilities` | size and facilities of the cheapest room | 88.0%, 50.9% |
| `bookingsToday`, `lastBookedAt` | Agoda's booking activity lines | 21.3%, 30.2% |
| `childrenStayFreeAges`, `familyFeatures` | ages that stay free and family features | 64.9%, 100% |
| `agodaPreferred`, `agodaGuarantee`, `sustainableTravel`, `popular`, `topRatedInCity`, `sponsored`, `awardYear`, `renovationYear` | Agoda's own flags | as shown |
| `offerSupplierId`, `supplierIds` | the supplier of the shown offer and every supplier Agoda priced the property with | new in this build, not in the city runs below |
| `available`, `soldOut` | sold out properties are skipped free unless `includeSoldOut` is on | 100% |
| `stay` | the stay the price is for: dates, nights, adults, rooms, children's ages, currency, language, price market | 100% |
| `position`, `walkOrder` | the row's place in your sort order, and the order the row came in (a later walk of the city carries no position) | 95.8%, 100% |
| `search` | the search that found the row | 100% |

Measured on the 12,000 property rows of two whole city runs on the platform on 2026-11-03 (Bangkok 5,442 and Tokyo 6,558 rows, 2 adults, 2 nights, USD). In those two cities 53.6% of rows are private persons' homes, whose position and distances those runs left out under an earlier setting; the "of hotels and company homes" figures are over the other rows. Every row now carries them as Agoda serves them.

#### Property details (add-on)

`details` on the Property row (two reads per property, charged only when both answered for the row's own property and stay; `detailsStatus` says `read`, `partial` or why not):

- `rooms`: every room of the stay (name, size, beds, occupancy, facilities, amenities, photos) with its `offers` (price, stay total with taxes, free cancellation, cancellation text, payment, pay later, pay at the property, credit card needed, breakfast, benefits, rooms left, discount, supplier id), `roomOffersCount`, `freeCancellationDate`, and `roomsCurrency`: Agoda's room list prices in USD or EUR only (EUR when the run's currency is EUR, else USD).
- `exactRates`: the exact rates per night and per stay with and without taxes of the rooms Agoda's property page lists (a part of the rooms), in the run's currency; left out in a Price market run.
- `name`, `englishName`, `address` (full, street, postal code, area, city, country), `latitude`, `longitude`, `locationHighlight`, `descriptionHtml`, `checkInFrom`, `checkInUntil`, `checkOutFrom`, `checkOutUntil`, `usefulInfo`, `facilities` by group, `childPolicies`, `extraBedPolicies`, `policyNotes`, `otherPolicies`, `importantNotes`, `minimumGuestAge`.
- `reviewScore`, `reviewScoreText`, `reviewCount`, `reviewGrades`, `agodaReviewGrades` (each grade with `cityAverage`, the average of comparable properties in the city), `locationRating`, `thingsYouWillLove`.
- `nearbyEssentials`, `nearbyAttractions`, `placesOfInterest` (with distances and positions), `breakfastCuisines`, `restaurants`, `photos`, `videos`, `bookingsToday`, `soldOutRooms`, and `host` for a home (name, joined, about, response time and rate, average score, reviews, property count).

Every field above was filled on all 56 properties read with details in the final matrix (build 0.1.5), except `exactRates`, `freeCancellationDate` and `childPolicies` (55 of 56), `locationHighlight` and `nearbyAttractions` (54), `reviewGrades` (45), `soldOutRooms` (40), `policyNotes` (39), `videos` (37), `restaurants` (33), `importantNotes` (26), `checkInUntil` and `breakfastCuisines` (24), `checkOutFrom` (13) and `host` (0: no home among them).

#### Guest reviews (add-on)

One row per review: `source` (Agoda, Booking.com, Priceline.com, Japanican.com), `rating`, `ratingText`, `title`, `text`, `positives` and `negatives` (Booking.com reviews), `originalTitle`, `originalText`, `language`, `reviewDate`, `checkInDate`, `checkOutDate`, `stayMonth`, `nights`, `roomType`, `travellerType`, `reviewerName` (first name), `reviewerCountry`, `reviewerCountryCode`, `helpfulVotes`, `response` (the property's reply with its date) and `photos`. Filled on 8,710 Agoda reviews of one hotel: title, text, review date, check-in date, nights, room type, traveller type and reviewer first name 100%, language 99.9%, reviewer country 99.8%, property response 96.5%, photos 2.3%.

The free review walk row per property gives each source's reported count (`reportedBySource`), how many were delivered and skipped, and Agoda's `summary`: the score, the grades, the score and count per traveller type, and the review topics with how many reviews mention each and the positive share.

#### Price trend (free)

With `includePriceTrend`, `priceTrend` on the Property row holds Agoda's date picker trend: a price and Agoda's trend word per check-in day, for up to 60 days ahead, for the row's nights, adults and currency. Agoda keeps one for few properties (2 of 8 in the build's probe); `priceTrendStatus` says whether it was read.

#### Free search and stay dates rows

The search row gives Agoda's count (`totalReported`), the distinct properties met (`propertiesMet`), delivered, repeats, `skipped` by reason (sold out, outside the place, outside a filter), the walks and their orders, `priceStats` (minimum, quartiles, median, mean and maximum per room per night with taxes of the rows delivered), the filters sent, and whether the search is `complete` (`completeBy`: `reported_total` or `list_stopped_growing`) or why not (`stoppedBy`, `incompleteReason`).

The stay dates row (with `checkInWindowDays` above 1) lists, per property, the check-ins it was available on with the price per night and per stay with taxes and a `rank` (1 = cheapest), the sold out ones, the asked check-ins it was not met for (`notMet`), the `cheapest` and the minimum, maximum, mean and median per night.

#### Example row (shortened, values illustrative)

```json
{
  "type": "property",
  "id": "1994765",
  "name": "Park Hyatt Bangkok",
  "url": "https://www.agoda.com/park-hyatt-bangkok/hotel/bangkok-th.html?checkIn=2026-12-10&los=2&adults=2&rooms=1&children=0&currency=USD",
  "propertyType": "Hotel",
  "accommodationType": "Hotel",
  "isHome": false,
  "stars": 5,
  "reviewScore": 9.2,
  "reviewCount": 1764,
  "reviewScoresBySource": [{ "providerId": 332, "provider": "Agoda", "score": 9.1, "reviewCount": 824 }],
  "country": "Thailand",
  "countryCode": "TH",
  "city": "Bangkok",
  "cityId": 9395,
  "area": "Siam",
  "latitude": 13.7436,
  "longitude": 100.5478,
  "distanceFromCityCenterKm": 0.4,
  "price": {
    "currency": "USD",
    "perNight": 312.5,
    "perNightWithTaxes": 367.75,
    "perStay": 625,
    "perStayWithTaxes": 735.5,
    "taxesAndFeesPerStay": 110.5,
    "discountPercent": 0
  },
  "roomsLeft": 3,
  "dealType": "Retail",
  "freeCancellation": true,
  "freeCancellationUntil": "2026-12-08T00:00:00.000+07:00",
  "payLater": true,
  "breakfastIncluded": false,
  "stay": { "checkIn": "2026-12-10", "checkOut": "2026-12-12", "nights": 2, "adults": 2, "rooms": 1, "childrenAges": [], "currency": "USD", "language": "en-us", "priceMarket": "US" },
  "position": 1,
  "walkOrder": "bestMatch"
}
```

### How much does it cost to scrape Agoda?

You pay per row delivered (pay per event). Prices per 1,000 events:

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Property | $1.06 | $0.97 | $0.88 | $0.76 |
| Property details (add-on, only when on) | $1.31 | $1.20 | $1.09 | $0.94 |
| Review (add-on, only when on) | $1.06 | $0.97 | $0.88 | $0.76 |
| Local market page (only with Price market) | $7.35 | $6.72 | $6.09 | $5.25 |
| Local market run (only with Price market, once per run) | $15.00 | $15.00 | $15.00 | $15.00 |

Each run also pays a one time Actor start of $0.007 on every plan. Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$1.06 / 1,000" on the Property row means one property costs about a tenth of a cent, and "$7.35 / 1,000" on the Local market page row means one local market page costs 0.735 cents (under a cent on every plan). A Local market page is one search page or one room list read through a residential exit in the country you chose, charged only when that read delivered a charged property. A run with a Price market also pays one Local market run of $0.015 ("$15.00 / 1,000" on the card) before its first local read; it pays for the first local pages before any property is delivered, and a run without a Price market never pays it.

- 100 properties cost $0.076 to $0.106 plus the $0.007 start fee ($0.083 to $0.113 for the run).
- 1,000 properties cost $0.76 to $1.06 plus the start fee ($0.767 to $1.067).
- A whole Bangkok search (5,442 properties in the run above) costs about $4.14 to $5.78 with the start fee.
- 100 properties with Property details cost $0.17 to $0.237 plus the start fee ($0.177 to $0.244).
- 1 hotel with 500 reviews costs $0.381 to $0.531 (the Property row and 500 Review rows) plus the start fee ($0.388 to $0.538).
- A Singapore market search of 300 properties (about 3 pages of 100) costs $0.228 to $0.318 for the properties plus $0.016 to $0.022 for the 3 Local market pages, plus the Local market run ($0.015) and the start fee ($0.266 to $0.362).
- The same property and stay is charged once per run, even when two of your searches find it; the same review is charged once per run.
- Free: search rows, stay dates rows, review walk rows, place rows, status rows and the summary, the price trend, repeats, sold out properties (unless you ask for them), properties outside your place or filters, reviews outside your review filters, misses (a place not found, a property not found or not available for your stay), details not read in full (delivered without the details charge) and local market reads that delivered nothing. A run with no usable input charges only the start fee.
- Set a maximum cost per run in the Apify Console: the run stops at the first row it cannot pay and delivers no row unpaid.

### Input

| Setting | What it does |
|---|---|
| `search` | Places by name: city, area, landmark, region or property (`Bangkok`, `Sukhumvit`, `Shinjuku`, `Ubud`, `Marina Bay Sands`). A name is matched exactly to a place Agoda's own search box offers; "Name, City" or "Name, country code" picks between places of one name. A name Agoda does not offer exactly gets a free row with the candidates. A property's name reads that property. |
| `startUrls` | Agoda search links (city, area, landmark, region or top area, with their dates, guests, currency, filters and sort) and property links. A setting you give replaces the link's own value of that setting. |
| `cityIds` | Agoda city ids (the number after `city=` in a search link, 9395 for Bangkok). |
| `propertyIds` | Agoda property ids, each read for your stay. |
| `mapAreas` | A circle `{"latitude": 13.74, "longitude": 100.56, "radiusKm": 3}` (0.1 to 50 km) or a box `{"north", "south", "east", "west"}` (at most 1 degree by 1.5 degrees). Every property is checked to lie inside. |
| `placeSuggestionsOnly` | Agoda's place suggestions for each name in `search` (with their ids) as free rows; nothing is searched. |
| `checkIn`, `checkOut` | Fixed dates (at most 30 nights, check-in at most 480 days ahead). |
| `checkInDaysFromToday`, `nights` | Relative dates for scheduled runs (default 14 days ahead, 2 nights). |
| `checkInWindowDays`, `checkInWindowStepDays` | Rate shopping: every search and lookup once per check-in day for up to 60 days, every Nth day, same nights. |
| `adults`, `rooms`, `childrenAges` | Guests (default 2 adults, 1 room, at most one room per adult), one age per child. |
| `currency`, `language` | Any three letter currency code (default USD) and one of 33 Agoda site languages (default en-us). |
| `priceMarket` | Prices as a visitor in one of 19 countries sees them (AU, CN, GB, HK, ID, IN, JP, KR, MY, NZ, PH, SG, TH, TW, VN, AE, DE, FR, CA), read through Apify residential exits in that country. Empty: prices as Agoda shows them to a US visitor. |
| `hotelsOrHomes`, `propertyTypes` | Hotels only or homes only, and 28 Agoda property types. |
| `stars`, `agodaLuxeOnly` | 1 to 5 and `unrated`; Agoda's luxury collection only. |
| `minReviewScore`, `maxReviewScore`, `minReviewCount` | Guest score range (1 to 10, one decimal) and fewest reviews. The ceiling is checked on every row (Agoda's own filter has no upper bound). |
| `minPrice`, `maxPrice` | Price per room per night with taxes and fees in the run's currency, checked exactly on every row. |
| `freeCancellation`, `payLater`, `payAtHotel`, `bookWithoutCreditCard`, `breakfastIncluded`, `kidsStayFree` | Booking terms and benefits. |
| `facilities`, `roomAmenities`, `roomBenefits`, `bedTypes`, `minBedrooms`, `minBathrooms`, `minBeds` | Property facilities, room amenities, rate benefits, bed types, bedrooms, bathrooms, beds (sent as Agoda's filters). |
| `maxDistanceFromCenterKm`, `nameContains` | Distance from the city centre (0 to 10 km) and words in the name, checked on every row. |
| `agodaFilters` | Other Agoda filters by id, `"Key:id,id"`: `HotelAreaId`, `HotelChainId`, `LandmarkIds`, `TripPurpose`, `AffordableCategory`, `AtmosphereIds` (the ids are in a search row's filter counts). |
| `excludePropertyIds` | Property ids a search should not deliver (the ones you already hold), skipped free. |
| `includeSoldOut` | Also deliver sold out properties (no price), charged as Property. |
| `sortBy`, `sortLandmarkId` | 17 Agoda orders: `bestMatch`, `lowestPrice`, `highestPrice`, `topReviewed` and its five traveller type variants, `mostReviewed`, `starsHighToLow`, `starsLowToHigh`, `closestToCenter`, `closestToLandmark` (with a landmark id), `secretDeals`, `insiderDeals`. |
| `maxItems`, `maxItemsPerSearch` | Property rows for the run (empty: no run cap) and per search and stay (default 1,000, up to 100,000). Above a city's size the search is read in further orders until Agoda's list stops growing. |
| `includeDetails`, `maxPropertiesWithDetails` | The Property details add-on, and for how many properties. |
| `includePriceTrend` | The free price trend per property. |
| `includeReviews`, `maxReviewsPerProperty` | The Guest reviews add-on and reviews per property (default 20, up to 10,000). |
| `reviewsSort`, `reviewsSources`, `reviewsLanguages`, `reviewsTravellerType`, `reviewsRatings`, `reviewerCountries`, `reviewsFrom`, `reviewsTo` | Review order (newest, highest score, lowest score, most helpful) and filters: sources, 45 languages, traveller type, score bands, reviewer countries and a date window (`reviewsFrom` needs the newest first order). |
| `includePersonalData` | No effect: all public data is always delivered (kept so saved inputs keep working). |
| `includeFilterCounts` | Agoda's filter counts with their ids on the free search row. |
| `includeRaw` | Agoda's whole search answer for each property as `raw`. |
| `proxyConfiguration` | Apify's datacenter proxy, included (no proxy group or country can be chosen: a run that asks one is refused free; use `priceMarket` for a country's prices); give your own proxy links only if you need them. |

Every setting is used as sent or the run is refused free with the reason (only the start fee is charged): an unknown setting, a number out of range, a select value Agoda does not offer. Filters a row shows (homes or hotels, type, stars, score, review count, price, cancellation, payment, breakfast, distance, name, place) are checked on each row and a row outside them is skipped free; filters a row does not show (facilities, amenities, beds, bedrooms, bathrooms, raw filter ids) are Agoda's own.

#### Example inputs

A city for a stay 30 days ahead, in Thai baht:

```json
{ "search": ["Bangkok"], "checkInDaysFromToday": 30, "nights": 3, "adults": 2, "currency": "THB", "maxItems": 200 }
```

A whole city by its Agoda id (the stay defaults to 14 days ahead, 2 nights):

```json
{ "cityIds": ["9395"], "maxItemsPerSearch": 20000 }
```

Rate shopping: 4 and 5 star properties with a guest score of 8 or more and free cancellation, for every check-in day of the next two weeks:

```json
{ "search": ["Shinjuku"], "checkInDaysFromToday": 14, "nights": 2, "checkInWindowDays": 14, "stars": ["4", "5"], "minReviewScore": "8", "freeCancellation": true, "maxItemsPerSearch": 100 }
```

Up to 500 English Agoda reviews of one hotel:

```json
{ "propertyIds": ["1105091"], "includeReviews": true, "maxReviewsPerProperty": 500, "reviewsSources": ["agoda"], "reviewsLanguages": ["en"] }
```

Singapore market prices with every room and offer:

```json
{ "search": ["Bangkok"], "priceMarket": "SG", "includeDetails": true, "maxItems": 20 }
```

#### Reading a whole city

Agoda re-checks availability on every call, so one walk through a big city's results in one order shows 88 to 95 percent of it. Set `maxItemsPerSearch` above the city's size: the Actor walks the search to its end in your order, then again in further orders (hotel id, best match, stars, guest score), delivering only properties not met, until the distinct properties met reach Agoda's count (allowing 3 percent for its drift) or a fresh order adds under 1 percent. The free search row says which (`completeBy`). On the platform: Bangkok 6,857 met of 6,774 reported in 2 walks (`reported_total`); Tokyo 8,125 met of 8,899 reported in 3 walks, the third adding 1 property (`list_stopped_growing`), 6,558 delivered in 2,004 seconds.

#### Personal data

Every field Agoda shows publicly is delivered on every run, for hotels and for homes of private hosts alike: coordinates, distance from the centre, nearby places, the property's own links and, with Property details, the street, the full address and the host's profile. `includePersonalData` has no effect and stays only so saved inputs keep working; a private host's home carries `personalDataHidden: false`. Reviewer first names and countries and free text (names, highlights, review snippets, descriptions) are delivered as Agoda serves them. You are responsible for using personal data lawfully (the GDPR included).

### What this Actor does not do

- No member, app only or signed in prices, and no booking: the Actor reads what Agoda shows a visitor without a login.
- Prices are what a visitor from the US sees by default; another country's prices need `priceMarket` (19 countries, residential exits, the Local market page event). In a Price market run the exact rates of Property details are left out, since they come from a door that answers as the US.
- The room list of Property details prices in USD or EUR only (`roomsCurrency`); the Property row and the exact rates are in your currency.
- No review score low to high order: Agoda's own ascending score order comes back unsorted. Use `maxReviewScore` or `topReviewed` instead.
- Booking.com reviews come through Agoda short of their reported count: 5,397 of 9,041 (59.7 percent) on one hotel, 151 of 233 on another. They are the Booking.com reviews Agoda shows, never a complete Booking.com set.
- No review filter by time of year or keyword: Agoda ignores both. Agoda serves at most 100 pages of 100 reviews per source for one order, so at most 10,000 Agoda reviews of a property.
- No "only new rows since the last run" memory, no change alerts and no monitor: schedule the Actor and compare the rows in your own sheet, or leave out the ids you hold with `excludePropertyIds`.
- No concurrency, session or pace settings: the pace is fixed to what Agoda allows (Agoda degrades an address after 32 to 41 review calls, so the Actor moves to another one).
- A property found by link or id is that property for your stay: search filters do not filter it, and search settings without a search refuse the run.
- The price trend exists for few properties: Agoda keeps none for most.
- A stay is at most 30 nights and starts at most 480 days ahead.
- Agoda shows a different part of a big city's list on every call; the search row says complete only when its rule is met, and otherwise how many properties were met.
- Work that earns nothing has a limit: a long list of places or ids Agoda does not know, or searches that find no property, stop on that limit, and the rest is counted as not reached in the free summary row (nothing is charged for it).

### FAQ

#### Is it legal to scrape Agoda?

This Actor reads only data Agoda shows to every visitor without a login. Agoda's terms restrict automated access to its platform; whether and how you use the data is your decision and responsibility.

#### Does Agoda have an API?

Agoda's own APIs are for partners: affiliates and travel businesses who sign up and get credentials. This Actor works like an API without one: send a JSON input through the Apify API and read the properties, rooms and reviews as JSON.

#### Can I get every hotel in a city from Agoda?

Yes. Set `maxItemsPerSearch` above the city's size: the Actor walks the search in several orders and delivers each property once, and the free search row compares the properties met with Agoda's own count. One Bangkok run met 6,857 against Agoda's 6,774 and was marked complete.

#### Why are Agoda prices different by country?

Agoda can price the same room and dates differently by the country the visitor browses from (some properties show one price everywhere). By default the rows show what a visitor from the US sees; set `priceMarket` to one of 19 countries to read the prices a visitor there sees (the same Tokyo room and dates read USD 183.68 from the US and 164.38 from Japan in the build's checks).

#### Can I scrape all Agoda reviews of a hotel?

Yes, with the Guest reviews add-on, up to 10,000 reviews per property: one run read all 8,710 Agoda reviews of one hotel in 317 seconds. Filter by source, language, traveller type, score band, reviewer country and a date window; the Booking.com reviews Agoda shows are fewer than Booking.com's own count.

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own run storage (the dataset it writes and its own key-value store, where it keeps a marker for a restarted run), so it runs with Apify's limited permissions: it cannot read or change anything else in your account.

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~agoda-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"search": ["Bangkok"], "checkInDaysFromToday": 30, "nights": 3, "currency": "USD", "maxItems": 200}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft~agoda-scraper").call(run_input={"search": ["Ubud"], "checkInDaysFromToday": 14, "nights": 2, "includeReviews": True, "maxReviewsPerProperty": 20, "maxItems": 50})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

The Actor also runs from Apify's MCP server for AI agents, and from Make, Zapier and n8n through Apify's integrations.

### Changelog

- 0.1 (2026-11-03): first version.

### More data tools by Automation Craft

- [Airbnb Scraper: Airbnb Data, Prices, Calendar](https://apify.com/automation_craft/airbnb-scraper)
- [Idealista Scraper: Spain, Italy, Portugal, France](https://apify.com/automation_craft/idealista-scraper)
- [Immobiliare.it Scraper: Italy Homes and Agencies](https://apify.com/automation_craft/immobiliare-scraper)
- [realestate.com.au Scraper: Buy, Rent, Sold Prices](https://apify.com/automation_craft/realestate-com-au-scraper)
- [Zillow Scraper: Homes for Sale, Rent and Sold](https://apify.com/automation_craft/zillow-scraper)
- [Realtor.com Scraper: Homes for Sale, Rent & Sold](https://apify.com/automation_craft/realtor-com-scraper)
- [Luma Event Scraper: Hosts, Tickets, New Events](https://apify.com/automation_craft/luma-event-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/agoda-scraper/changelog.md

# Actor input Schema

## `search` (type: `array`):

City, area, landmark, region or property names, for example "Bangkok", "Sukhumvit", "Shinjuku", "Ubud" or "Marina Bay Sands". A name must match one Agoda place exactly; "Name, City" or "Name, country code" picks between places of one name. A property's name reads that property. A name Agoda does not offer exactly gets a free row with the candidates.

## `startUrls` (type: `array`):

Agoda search links (www.agoda.com/search?city=..., area, poi, region or toparea, with their dates, guests, currency, filters and sort) and property links (www.agoda.com/<name>/hotel/<city>.html). A setting you give below replaces the link's own value of that setting.

## `cityIds` (type: `array`):

Agoda city ids (the number after city= in an Agoda search link, for example 9395 for Bangkok).

## `propertyIds` (type: `array`):

Agoda property (hotel or home) ids, for example 1105091. Each is read for your stay; an id Agoda does not know gets a free not_found row.

## `mapAreas` (type: `array`):

Circles {"latitude": 13.74, "longitude": 100.56, "radiusKm": 3} (0.1 to 50 km) or boxes {"north": 13.76, "south": 13.72, "east": 100.58, "west": 100.53} (at most 1 degree by 1.5 degrees). Every property is checked to lie inside.

## `placeSuggestionsOnly` (type: `boolean`):

Deliver Agoda's place suggestions for each name in "search" (cities, areas, landmarks, regions and properties with their ids) as free rows, and search nothing. Only the run's start fee is charged.

## `checkIn` (type: `string`):

Check-in date, YYYY-MM-DD. Give it with "checkOut", or use the relative dates below instead.

## `checkOut` (type: `string`):

Check-out date, YYYY-MM-DD, at most 30 nights after check-in.

## `checkInDaysFromToday` (type: `integer`):

Check-in this many days after the run's day (UTC), so a scheduled run always searches ahead. Default 14.

## `nights` (type: `integer`):

Nights of the stay with relative dates. Default 2.

## `checkInWindowDays` (type: `integer`):

Read every check-in day of a window starting at the check-in date, each as its own stay of the same nights (nightly or date by date prices). Each property and stay is its own row; a free stay dates row per property then lists the check-ins it is available and sold out on, the cheapest, and its price range.

## `checkInWindowStepDays` (type: `integer`):

With a check-in window, read every Nth day only (for example 7 for one check-in a week). Default 1.

## `adults` (type: `integer`):

Adults in all rooms. Default 2.

## `rooms` (type: `integer`):

Rooms. Default 1. At most one room per adult.

## `childrenAges` (type: `array`):

One age (0 to 17) per child, for example \[4, 9]. Prices and availability are for this party.

## `currency` (type: `string`):

Three letter currency code for every price, for example USD, EUR, THB, JPY or SGD. Default USD.

## `language` (type: `string`):

Agoda site language for names and texts, for example en-us, en-gb, ja-jp, th-th or zh-cn. Default en-us.

## `priceMarket` (type: `string`):

Agoda prices by the visitor's country. Empty: prices as Agoda shows them to a US visitor. A country reads search pages and room lists through Apify residential exits in that country, billed as Local market page per page that delivered a property.

## `hotelsOrHomes` (type: `string`):

Only hotels, or only homes. Empty: both.

## `propertyTypes` (type: `array`):

Agoda accommodation types, for example hotel, apartment, resort, hostel, villa or ryokan.

## `stars` (type: `array`):

Star ratings to keep (a 4.5 star property counts as 4). "unrated" keeps properties without stars; then no star filter is sent and every row is checked.

## `agodaLuxeOnly` (type: `boolean`):

Only properties of Agoda's luxury collection.

## `minReviewScore` (type: `string`):

Lowest guest score from 1 to 10, one decimal at most, for example 8 or 8.5.

## `maxReviewScore` (type: `string`):

Highest guest score from 1 to 10, one decimal at most, for example 6 or 7.5. Checked on every row (Agoda's own filter has no upper bound): rows above it, and properties without a score, are skipped free.

## `minReviewCount` (type: `integer`):

Lowest number of reviews (checked on every row).

## `minPrice` (type: `number`):

Lowest price per room per night with taxes and fees, in the run's currency. Checked exactly on every row.

## `maxPrice` (type: `number`):

Highest price per room per night with taxes and fees, in the run's currency. Checked exactly on every row.

## `freeCancellation` (type: `boolean`):

Only properties whose shown rate can be cancelled for free.

## `payLater` (type: `boolean`):

Only properties whose shown rate can be paid later.

## `payAtHotel` (type: `boolean`):

Only properties whose shown rate is paid at the property.

## `bookWithoutCreditCard` (type: `boolean`):

Only properties bookable without a credit card.

## `breakfastIncluded` (type: `boolean`):

Only properties whose shown rate includes breakfast.

## `kidsStayFree` (type: `boolean`):

Only properties where children stay free.

## `facilities` (type: `array`):

Property facilities, for example swimming pool, gym, spa, car park or pets allowed (all must be offered; sent as Agoda's filter).

## `roomAmenities` (type: `array`):

Room amenities, for example kitchen, balcony, private pool or washing machine (sent as Agoda's filter).

## `roomBenefits` (type: `array`):

Rate benefits, for example breakfast, dinner, airport transfer or late check out (sent as Agoda's filter).

## `bedTypes` (type: `array`):

Bed types: single or twin, double, queen, king or bunk.

## `minBedrooms` (type: `integer`):

Homes with at least this many bedrooms.

## `minBathrooms` (type: `integer`):

At least this many bathrooms.

## `minBeds` (type: `integer`):

At least this many beds.

## `maxDistanceFromCenterKm` (type: `number`):

Only properties at most this far from the city centre Agoda draws (0 keeps those inside it). Checked on every row.

## `nameContains` (type: `string`):

Only properties whose name contains these words (Agoda's name filter, checked on every row).

## `agodaFilters` (type: `array`):

Agoda filters by id, "Key:id,id": HotelAreaId (an area of the city), HotelChainId (a chain or brand), LandmarkIds, TripPurpose, AffordableCategory or AtmosphereIds. The ids are in a search row's filter counts (turn on "includeFilterCounts").

## `excludePropertyIds` (type: `array`):

Agoda property ids a search should not deliver, for example the ones you already hold. Skipped free; lookups by id or link are not affected.

## `includeSoldOut` (type: `boolean`):

Also deliver properties Agoda shows sold out for the stay (no price), billed as Property. Off: they are skipped free.

## `sortBy` (type: `string`):

Agoda's order of the results. Default best match. Every row says its place in this order; rows a later walk found carry the order it used.

## `sortLandmarkId` (type: `integer`):

The Agoda landmark id "closest to landmark" sorts by (from a place suggestion or a search link's poi=).

## `maxItems` (type: `integer`):

Most properties to deliver in the run, all searches and lookups together. Empty: no run cap.

## `maxItemsPerSearch` (type: `integer`):

Most properties per search and stay. Default 1,000. Above it, a search is read in further orders until Agoda's list stops growing, which reads the whole city (Bangkok about 6,700).

## `includeDetails` (type: `boolean`):

Add every room and offer for the stay (price, stay total with taxes, cancellation terms, payment, breakfast, benefits, rooms left, size, beds, photos), the exact rates per night with and without taxes, the description, facilities, policies, check in and out times, review grades, nearby places and photos. Billed as Property details per property read in full.

## `maxPropertiesWithDetails` (type: `integer`):

Read details for the first N properties of the run only.

## `includePriceTrend` (type: `boolean`):

Add Agoda's date picker price trend of each property: a price and a trend word (Low, Normal, High) per check-in day for up to 60 days ahead, where Agoda keeps one (many properties have none). One extra request per property, free.

## `includeReviews` (type: `boolean`):

Add the guest reviews of each delivered property (Agoda's own, and the Booking.com and Priceline reviews Agoda shows), each billed as Review.

## `maxReviewsPerProperty` (type: `integer`):

Most reviews per property. Default 20.

## `reviewsSort` (type: `string`):

Order of the reviews. Default newest first.

## `reviewsSources` (type: `array`):

Only reviews from these sources. Empty: all.

## `reviewsLanguages` (type: `array`):

Only reviews written in these languages, for example en, ja, ko or zh-tw.

## `reviewsTravellerType` (type: `string`):

Only reviews by this kind of traveller.

## `reviewsRatings` (type: `array`):

Only reviews in these score bands.

## `reviewerCountries` (type: `array`):

Only reviews by reviewers from these countries: a two letter code (JP, SG) or the English name (Japan).

## `reviewsFrom` (type: `string`):

Only reviews written on or after this date (needs the newest first order).

## `reviewsTo` (type: `string`):

Only reviews written on or before this date.

## `includePersonalData` (type: `boolean`):

All public data is always delivered, so this setting has no effect (it is kept so saved inputs keep working).

## `includeFilterCounts` (type: `boolean`):

Add Agoda's own filter counts (areas, types, stars, facilities, chains and their ids) to each search row (free).

## `includeRaw` (type: `boolean`):

Add Agoda's whole search answer for each property as "raw".

## `proxyConfiguration` (type: `object`):

Apify's datacenter proxy is used and included in the price; give your own proxy links only if you need them.

## Actor input object example

```json
{
  "search": [
    "Bangkok"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "search": [
        "Bangkok"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/agoda-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "search": ["Bangkok"],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/agoda-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "search": [
    "Bangkok"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/agoda-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/agoda-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/h8eAelmqJPflfMV3F/builds/iiBmn1SCnbcmAnzy7/openapi.json
