Agoda Hotel Search Scraper
Pricing
Pay per event
Agoda Hotel Search Scraper
Search Agoda hotels by destination or city id with real filters and sorting: stars, price, review score, free cancellation, breakfast, facilities. No login needed.
Search Agoda hotels for a destination or a known city id and get a clean dataset of hotels back — no login, account, app or device needed. Spun off from the Agoda All-in-One API for teams that want a run-and-export dataset instead of a live API: give it a place and dates, get a deduped list of hotels with price, rating and location.
Why use this Actor?
- Rate shopping / market scans — pull every hotel in a city for a stay, with price, star rating and guest review score, ready for your own spreadsheet or BI tool.
- Filtered sourcing — narrow by stars, price range, review score, free cancellation, breakfast, facilities and more before you ever open the site.
- Bulk destination coverage — resolve a free-text place name to Agoda's own city id automatically, so you don't need to look up ids by hand.
Input
| Field | Required | Description |
|---|---|---|
destination | one of destination/cityId | Free-text place name, e.g. "Bangkok". Resolved to a cityId via Agoda's own autocomplete. |
cityId | one of destination/cityId | Agoda city id, used directly (skips the autocomplete call). Known-working example: 9395 (Bangkok). |
checkin | yes | Check-in date, YYYY-MM-DD. |
checkout | no | Check-out date. If given, overrides los (los = checkout - checkin). |
los | no | Length of stay in nights, 1-30 (default 1). Ignored if checkout is given. |
adults | no | Adults per room (default 2). |
rooms | no | Number of rooms (default 1). |
children | no | Children per room (default 0). |
childrenAges | no | Ages of each child. Padded with age 8 / truncated to match children if the count differs. |
currency | no | ISO currency code for prices (default USD). |
locale | no | Response language as an Agoda locale, e.g. th-th, en-us (default). |
sortField / sortOrder / sortLandmarkId | no | Sort the upstream result. See "Sort fields" below — only fields verified to actually reorder results are offered. |
maxResults | no | Stop after this many unique hotels, deduped by propertyId (default 100). |
stars, reviewScoreMin, reviewScoreMax, priceMin, priceMax, name, freeCancellation, breakfastIncluded, paymentOptions, facilitiesAny, facilitiesAll, accommodationTypes, areaIds, landmarkIds, affordableCategory, bedrooms, familyFacilities, hostLevel, characteristics, tripPurpose, curatedCollections, deals, hotelChainIds, productType, bookingDuration | no | Filters. Every one of these was live-verified to actually narrow results on Agoda's own API before being exposed here — see the input schema for value ranges and sample ids. |
Sort fields
sortField accepts: Ranking (default, server "best match"), Price, StarRating,
AllGuestsReviewScore, GroupsReviewScore, FamiliesWithYoungReviewScore,
FamiliesWithTeenReviewScore, SoloTravllersReviewScore, CouplesReviewScore,
BusinessTravellerReviewScore, ReviewCount, ReviewAndPrice, InsiderDeal,
SecretDeal, PackageDeal, DistanceFromLandmark (needs sortLandmarkId to honour
sortOrder). Price and StarRating are strictly monotone both directions.
ReviewAndPrice/InsiderDeal/SecretDeal/PackageDeal ignore sortOrder
server-side (a blended deal/value ranking either way). Left out on purpose because
Agoda's own research found them inert (aliased to the default order) or too weakly
verified to expose: Distance, Personalize, CuratedCollectionRank, NoSorting,
ASD, HotelId, DistanceFromCityCenter.
Output
One dataset row per unique hotel:
{"propertyId": 14654101,"name": "Solaria Nishitetsu Hotel Bangkok","starRating": 4,"accommodationType": "Hotel","city": "Bangkok","area": "Sukhumvit","lat": 13.73682689666748,"lon": 100.56027221679688,"reviewScore": 9.2,"reviewCount": 15912,"currency": "USD","priceNightExclusive": 131.02,"priceNightAllInclusive": null,"available": true}
Pagination and dedupe
This Actor paginates Agoda's hotels/search internally (100 hotels per page, Agoda's
own max) until maxResults unique hotels are collected or the upstream runs dry.
Agoda's own deep pagination is not stable: adjacent pages of a large destination can
repeat or skip hotels (verified: 57 pages of 100 for one city returned 5671 rows but
only 4504 unique propertyIds). This Actor deduplicates by propertyId as a courtesy —
duplicate hotels are silently dropped rather than billed or pushed twice — but very deep
pagination of a huge destination can still undercount the true number of listings; for
full coverage of a huge city, narrow with areaIds/stars/priceMin/priceMax first.
Pricing / Cost estimation
Billed pay-per-event: one hotel event per unique hotel row pushed, plus a flat
apify-actor-start event per run. Rows cut off by maxResults or a run's spending
limit are not billed beyond that limit.
Known limitations
- Deep paging of a very large destination is inherently unstable on Agoda's own API (see "Pagination and dedupe" above); this Actor mitigates it with dedupe but cannot fully fix it upstream.
searchInfototals jitter andpriceMin/priceMaxcan leave Agoda's own reported total stale — this Actor counts only the actual hotel rows it returns.- Only Agoda's
citysearch type is exposed here (destination/cityId in, hotels out). Area/region/radius/bounding-box/landmark search and non-search endpoints (property detail, rooms, reviews, flights) live in the sibling Agoda All-in-One API. - Sort fields and filters not listed above were checked in the sibling project's research and found inert (accepted but ignored) or unverified on Agoda's own API — they are deliberately not exposed here as if they worked.
FAQ, disclaimers, and support
This is an unofficial Actor, not affiliated with or endorsed by Agoda. It reads only data that Agoda's own Android app shows without an account. Use responsibly and in line with Agoda's Terms of Service and applicable law.
Found an issue or need a custom field? Use the Issues tab on this Actor's page.