Agoda Hotels Scraper avatar

Agoda Hotels Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Agoda Hotels Scraper

Agoda Hotels Scraper

Agoda hotels scraper that turns a typed place name and a stay into the hotels Agoda lists for it, up to your count, 92 fields each: nightly, stay and per-room prices before and after taxes, guest score, review summaries, facilities, images, cancellation terms. Sold-out hotels ship as rows.

Pricing

from $3.00 / 1,000 results

Rating

4.0

(1)

Developer

AgentX

AgentX

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Agoda Hotels Scraper is an agoda hotels scraper that turns a place name and a stay into the hotels Agoda lists for it, 92 fields each. Enter one destination, such as Seoul or Paris, France, and select the stay dates. Every row carries the hotel name and page, eight price figures before and after taxes, the guest score with its review count and the source's own written review summaries, availability and cancellation terms, facilities, images, coordinates and the exact stay the prices were read for.

Apify%20Users Apify%20Runs $0.004 / hotel 92 fields per hotel API + MCP ready

  • Max Results sets the hotel budget for your destination. One measured city returned 500 hotels in a single run at max_results 500; a small one ran out at 77, and the run reported that the hotel list was exhausted.
  • You type the place, Agoda picks the city. Cambridge, MA returns Cambridge (MA), US and San Jose, Costa Rica returns San Jose, CR — add the country or state whenever a name is shared.
  • The destination match is shown before hotel results are read. The run prints the matched city with its country and hotel count, and city and city_id ship beside the search_location you typed, so a wrong reading is visible rather than hidden.
  • Sold-out hotels are rows, not gaps. In one measured 500-hotel city, 454 came back available and 43 sold_out; the sold-out rows keep their identity, score, facilities and coordinates, and 39 of the 43 carry soldout_price.

Start with one hotel: $0.02 for the Actor Start plus $0.004 for the result, totaling $0.024.

Why Choose Agoda Hotels Scraper

  • Eight price figures, each labelled for what it is. Per night, per whole stay and per room per night, each before and after taxes and fees, plus the pre-discount nightly and stay prices and discount_percent. Each amount retains the value and currency supplied by Agoda.
  • The stay is part of the request, not a filter. Check-in and check-out are read as the stay itself, so the prices are the ones Agoda quotes for those exact nights rather than a headline rate. Every quote is for two adults in one room, stated on every row.
  • Search rank and property depth arrive together. One row holds the list position and price alongside facilities, written review summaries, review topics, images, location subscores and the property's own opening year, room count and fee lines.
  • An ambiguous place name is answered, not guessed. The matched city, its country and its hotel count are printed before the search runs, so you can check which destination the result represents.
  • Source order and source facts stay identifiable. position records the order Agoda returned; missing source values remain empty.

Quick Start Guide

Configure

The form starts with Max Results 1 and Location Seoul. Enter one city, area or landmark, adding the country or state when a name is shared. Use the Check In and Check Out date pickers to select your stay, or leave both unset for a one-night stay 30 days from today.

Run

Click Start. The run prints the matched destination and saves hotels until Max Results is reached or the destination list is exhausted. Start with one result to check the destination, then raise the count for a deeper search.

Collect

Open the Dataset tab for the table view, or pull the same rows as JSON, CSV, Excel or XML from the API. Each row is one hotel.

Input Parameters

Two parameters are required — Max Results and Location — and the two stay dates have working defaults, so the smallest valid run is one place name and the number 1.

ParameterTypeRequiredDescriptionExample
max_resultsintegerYesHotels to save for the destination. Minimum 1.100
locationstringYesOne city, area or landmark. Add country or state for shared names."Seoul"
check_indate (YYYY-MM-DD string in JSON)NoChoose the first night in the date picker. Omitted means 30 days from today."2026-10-05"
check_outdate (YYYY-MM-DD string in JSON)NoChoose checkout in the date picker, 1–30 nights after check-in. Omitted means one night after check-in."2026-10-08"
{
"max_results": 100,
"location": "Seoul",
"check_in": "2026-10-05",
"check_out": "2026-10-08"
}

The example requests up to 100 hotels in Seoul for the selected stay. Results are read page after page until that budget is met or the destination list is exhausted: one measured city delivered 500 hotels in a single run, and a small one ran out at 77 and stopped there.

Measured place-name behaviour — what each typed value actually matched:

TypedMatched
SeoulSeoul, KR — 5,945 hotels
Paris, FranceParis, FR — 14,318 hotels
Paris, TexasParis (TX), US — 379 hotels
Cambridge, MACambridge (MA), US — 83 hotels
San Jose, CaliforniaSan Jose (CA), US — 879 hotels
San Jose, Costa RicaSan Jose, CR — 407 hotels
Springfield, IllinoisSpringfield (IL), US — 58 hotels
San JoseSan Jose (CA), US — the unqualified name picks one for you

A place Agoda files under a parent city keeps its own search scope. In one measured run Papeete returned 52 hotels and Tahiti 60, with 16 hotels appearing in both lists, and Vatican City returned 60 hotels with city reading Rome.

Output Data Schema

One row is one hotel the city search returned for one stay, carrying 92 fields. Where the source publishes no value, the field stays empty rather than being filled with a guess.

Identity and place:

FieldTypeDescription
platformstringSource platform the row came from
positionintegerOne-based position in the order the search returned
property_idintegerSource identifier for the hotel
namestringHotel name
property_urlstringHotel page on the source
property_typestringAccommodation type the source assigns, Hotel, NonHotel or SingleRoom in the measured city
star_ratingnumberStar class the source assigns
descriptionstringHotel description the source publishes
addressstringStreet address
postal_codestringPostal code
countrystringCountry containing the hotel
country_codestringTwo-letter country code
citystringCity the answer itself named
city_idintegerSource city id of that city
areastringNeighbourhood the source places it in
latitudenumberLatitude in decimal degrees
longitudenumberLongitude in decimal degrees
center_distance_mnumberMetres from the city centre, as the source measures it

Prices and terms for the requested stay:

FieldTypeDescription
nightly_pricenumberLead offer per night for all requested rooms, before taxes and fees
nightly_inclusivenumberThe same per night, including taxes and fees
nightly_originalnumberNightly price before the displayed discount
stay_pricenumberLead offer for the whole stay, before taxes and fees
stay_inclusivenumberThe whole stay, including taxes and fees
stay_originalnumberWhole-stay price before the displayed discount
room_nightlynumberPer room per night, before taxes and fees
room_inclusivenumberPer room per night, including taxes and fees
currencystringCurrency the source quoted the prices in
discount_percentnumberTotal discount on the lead offer
promotion_textstringPromotion text the source attaches to the lead offer
rooms_availableintegerLead-offer rooms still available
availabilitystringavailable or sold_out for the requested stay
soldout_pricenumberThe source's average price for a sold-out hotel
cancellation_typestringProperty-level cancellation summary, FreeCancellation, NonRefundable, SpecialConditions or Unknown in the measured city
cancellation_untilstringDeadline the free cancellation runs to
offer_cancellationstringCancellation type on the displayed lead offer
payment_modelstringPayment model on the displayed lead offer
pay_laterbooleanWhether a pay-later option is offered
pay_hotelbooleanWhether payment at the hotel is offered
is_sponsoredbooleanWhether the source placed the result as sponsored
is_popularbooleanWhether the source marks the hotel as popular
has_guaranteebooleanWhether the hotel is in the source's price guarantee programme
bookings_24hintegerBookings the source counted in the previous 24 hours

Reviews, facilities and media:

FieldTypeDescription
review_scorenumberCombined guest score out of ten
review_countintegerHow many reviews that score rests on
recommendation_scorenumberGuest recommendation percentage
frequent_scorenumberFrequent-traveller recommendation percentage
review_positivestringPositive review summary the source publishes
review_negativestringNegative review summary the source publishes
review_tagsarrayReview topics with the source's rating and positive percentage
review_highlightsarrayReview highlights the source selects, with topic and explanation
top_featuresarrayFeatures the source picks out as the hotel's highlights
facilitiesarrayHotel facility names the source lists
nearby_placesarrayNearby place names, types and distances in kilometres
airport_scorenumberLocation subscore for airport access
poi_scorenumberLocation subscore for points of interest
transit_scorenumberLocation subscore for public transport
image_urlstringPrimary hotel image
gallery_urlsarrayFurther hotel images, excluding the primary one
image_countintegerHow many images the source returned
video_urlsarrayHotel video URLs the source returned

Property facts, family suitability and fee lines:

FieldTypeDescription
is_luxurybooleanWhether the source classifies the hotel as luxury
kids_stay_freebooleanWhether the child policy lets children stay free
has_family_roombooleanWhether family rooms are marked available
has_multi_bedroombooleanWhether multi-bedroom accommodation is marked available
has_interconnectingbooleanWhether interconnecting rooms are marked available
has_cotbooleanWhether an infant cot is marked available
has_kids_poolbooleanWhether a children's pool is marked available
has_kids_clubbooleanWhether a children's club is marked available
checkin_fromstringEarliest check-in time
checkin_untilstringLatest check-in time, where published
checkout_fromstringEarliest check-out time, where published
checkout_untilstringLatest check-out time
opened_yearintegerYear the property opened
renovated_yearintegerYear of the most recent renovation
room_countintegerRooms the source reports
floor_countintegerFloors the source reports
restaurant_countintegerRestaurants the source reports
bar_countintegerBars or lounges the source reports
airport_minutesintegerTravel time to the airport in minutes
breakfast_feestringBreakfast fee with the currency the source displays it in
parking_feestringDaily parking fee with its displayed currency
transfer_feestringAirport-transfer fee with its displayed currency
wifi_feestringDaily Wi-Fi fee with its displayed currency
child_policyobjectChild and infant age ranges plus the source's policy text

The stay the row was read for:

FieldTypeDescription
search_locationstringThe place name the run asked for
search_city_idstringThe source city id the search ran under, the parent city's for an area or landmark
check_instringCheck-in date the prices were read for
check_outstringCheck-out date the prices were read for
adultsintegerAdults the prices were read for — always 2
roomsintegerRooms the prices were read for — always 1
processorstringActor URL that produced the row
processed_atstringUTC timestamp of processing

The example below is abbreviated: arrays are truncated and 53 of the 92 fields are omitted. A real row carries all 92.

{
"platform": "Agoda",
"position": 1,
"property_id": 9119187,
"name": "NINE TREE BY PARNAS SEOUL INSADONG",
"property_url": "https://www.agoda.com/nine-tree-premier-hotel-insadong/hotel/seoul-kr.html",
"property_type": "Hotel",
"star_rating": 4.0,
"city": "Seoul",
"city_id": 14690,
"area": "Insadong",
"latitude": 37.5746551485621,
"longitude": 126.983464434465,
"center_distance_m": 0.0,
"review_score": 8.9,
"review_count": 26640,
"recommendation_score": 92.0,
"nightly_price": 266.05,
"nightly_inclusive": 292.66,
"stay_price": 798.16,
"stay_inclusive": 877.99,
"room_nightly": 266.05,
"currency": "USD",
"discount_percent": 0.0,
"rooms_available": 1,
"availability": "available",
"cancellation_type": "FreeCancellation",
"payment_model": "Merchant",
"is_sponsored": false,
"facilities": [
"Gym/fitness",
"Front desk [24-hour]",
"English"
],
"image_count": 119,
"opened_year": 2019,
"room_count": 301,
"breakfast_fee": "33000 KRW",
"search_location": "Seoul",
"search_city_id": "14690",
"check_in": "2026-10-05",
"check_out": "2026-10-08",
"adults": 2,
"rooms": 1
}

Across one measured 500-hotel city, the eight price fields, currency, discount_percent and rooms_available were present on the 454 rows with a bookable room and empty on the sold-out ones. Export as JSON, CSV, Excel or XML from the Dataset tab or the API.

Integration Examples

Every example below requests up to 100 hotels in Seoul for a three-night stay and calls the Actor as LhQdn21aQ4FxgTNz8. Each example starts a run, waits for it to finish, then reads the Dataset; the run continues independently of the connection that started it.

Actor ID

LhQdn21aQ4FxgTNz8

This is the Actor's API ID, accepted everywhere an Actor identifier is asked for. The agentx/agoda-hotels-scraper name form resolves to the same Actor in the API, the SDKs, Make.com, n8n and MCP.

HTTP

Start the run, poll it until it finishes, then read the Dataset:

curl -s -X POST "https://api.apify.com/v2/acts/LhQdn21aQ4FxgTNz8/runs?token=YOUR_TOKEN" -H "Content-Type: application/json" -d '{"max_results": 100, "location": "Seoul", "check_in": "2026-10-05", "check_out": "2026-10-08"}'
curl -s "https://api.apify.com/v2/actor-runs/RUN_ID?token=YOUR_TOKEN"
curl -s "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN"

The first call returns data.id as RUN_ID and data.defaultDatasetId as DATASET_ID. Poll the second call until data.status reads SUCCEEDED, or register an ACTOR.RUN.SUCCEEDED webhook and skip polling entirely.

For a one-hotel smoke test only, POST /v2/acts/LhQdn21aQ4FxgTNz8/run-sync-get-dataset-items returns rows on a single connection. Use it only for inputs that finish well under 300 seconds: the platform cuts the connection at 300 seconds without aborting the run, a client-side timeout never stops a run that is already billing, and a client or gateway retry starts a second billed run.

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
started = client.actor("LhQdn21aQ4FxgTNz8").start(
run_input={
"max_results": 100,
"location": "Seoul",
"check_in": "2026-10-05",
"check_out": "2026-10-08",
}
)
run = client.run(started["id"]).wait_for_finish()
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
print(hotel["city"], hotel["name"], hotel["nightly_inclusive"], hotel["currency"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const started = await client.actor('LhQdn21aQ4FxgTNz8').start({
max_results: 100,
location: 'Seoul',
check_in: '2026-10-05',
check_out: '2026-10-08',
});
const run = await client.run(started.id).waitForFinish();
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((h) => console.log(h.city, h.name, h.nightly_inclusive, h.currency));

Make.com

Add the Apify module "Run an Actor", paste LhQdn21aQ4FxgTNz8 as the Actor, and set the input body to the JSON shown under Input Parameters. Leave "Wait until finished" enabled so the scenario resumes when the run reaches SUCCEEDED, then follow it with "Get Dataset Items" to map name, nightly_inclusive, currency and review_score into the next module.

n8n

Use the Apify node, choose "Run Actor and get dataset", paste LhQdn21aQ4FxgTNz8 as the Actor, and supply the same JSON body. The node waits for the run to finish and returns one item per hotel, so name, nightly_inclusive and property_url are addressable directly downstream.

MCP

Connect an MCP client to https://mcp.apify.com and call agentx/agoda-hotels-scraper with {"max_results": 100, "location": "Seoul", "check_in": "2026-10-05", "check_out": "2026-10-08"}. The agent receives the same 92-field rows the API returns.

Pricing

A hotel costs $0.004 on the FREE tier and the Actor Start costs $0.02 per run, so the smallest useful run — one hotel — totals $0.024.

EventFREEBRONZESILVERGOLD / PLATINUM / DIAMOND
Result (one hotel)$0.00400$0.00360$0.00320$0.00300
Actor Start (once per run)$0.02$0.02$0.02$0.02

The Actor Start is billed at $0.01 per gigabyte of run memory with a one-event minimum, and this Actor runs at 2 GB, so it is $0.02 per run on every tier.

The Seoul example costs $0.02 + 100 × $0.004 = $0.42 on FREE when it returns all 100 hotels, or $0.32 on GOLD and above. The result portion follows the number of hotels saved.

Each run searches one destination and incurs one Actor Start charge. For another destination, start a separate run. Prices can change; the current values are on the pricing page.

Use Cases

  • Rate monitoring for a property you own. Schedule the city and the dates you care about; property_id is a stable key, so your own row and your neighbours' are the same query every day.
  • Compset pricing. A whole city for one stay — 500 hotels in one measured run — each with nightly_price, nightly_inclusive, stay_price and stay_inclusive — the before-and-after-tax comparison a revenue manager actually makes.
  • Tax and fee load by property. nightly_price against nightly_inclusive shows how much of a headline rate is tax and fees, and breakfast_fee, parking_fee, wifi_fee and transfer_fee show what the property charges on top of the room.
  • Availability tracking. availability and rooms_available across dates say when a city fills up, rather than only what it costs.
  • Discount analysis. nightly_original against nightly_price, with discount_percent and promotion_text, measures the discount actually being run.
  • Family-travel filtering. has_family_room, has_cot, kids_stay_free, has_kids_pool and child_policy select the properties a family search would keep, with review_positive and review_negative as the written context.
  • Geographic price mapping. Coordinates, area, center_distance_m and the airport_score, poi_score and transit_score subscores turn a search into a map.

Alternatives

Agoda's website supports browsing hotel offers and comparing stays directly. It is a practical choice for planning an individual trip.

Agoda's developer documentation describes partner access through a feasibility study, site credentials, integration and certification. The Search API supplies rates and availability; partnership models can also include booking and post-booking services. Businesses building a booking integration can evaluate that partner route.

Hotel data services vary in their unit of billing and the fields returned. Compare the full cost per usable hotel record, stay-specific prices, cancellation terms and property detail when choosing a service.

What this Actor delivers is one row per hotel for one city and one stay: the lead offer the search returns, priced for two adults in one room, in the currency the source quotes, with that offer's own rooms_available, payment_model and cancellation terms beside 92 fields of property detail.

Limits and Troubleshooting

  • I asked for 500 hotels from one place and got 77 → the source ran out of hotels for that place and stay → the run prints hotel list exhausted with the count it saved; a larger city fills the budget, and one measured city returned 500 in a single run.
  • The city is not the one I meant → a shared place name was matched to the wrong one → the run prints each match with its country and hotel count, so re-run with the country or state added, as in Cambridge, MA.
  • The destination produced an unmatched-place message → Agoda returned no searchable match for that text → check the spelling and add its country or state, or use the destination name displayed on Agoda.
  • Some rows have empty price fields → Agoda supplied property information without a bookable quote → check availability; sold-out hotels can carry the source's average in soldout_price.
  • All prices came back in USD → the source quotes in the currency it chooses for the request → currency ships on every priced row, so the unit is always stated rather than assumed.
  • Some property fields are empty on some hotels → each property publishes its own subset of facts → in one measured 500-hotel city renovated_year was present on 236 hotels and wifi_fee on 142; an empty field carries the source's own silence rather than a placeholder.
  • A larger result request takes longer → more hotels and pages are read for the destination → begin with Max Results 1, verify the result, and raise the count for your full search.

For anything reproducible, open an Issue with the run ID and the search address.

Trust and Reliability

Each saved hotel is one Result event, and every run incurs an Actor Start charge. Each hotel record contains 92 fields covering identity, prices, review summaries, facilities, location and stay dates. Hotel facts and prices retain Agoda's published values; the source determines which fields are populated.

Data scope. The hotels are the public ones Agoda shows on a city search to any visitor, and the property facts are the ones each hotel's own public listing publishes.

Privacy. Rows describe hotels and the prices quoted for them. Review summaries are the aggregate text Agoda publishes on the listing.

Platform terms. Use of the Actor is subject to the Apify platform terms and to Agoda's own terms of use. AgentX is not affiliated with Agoda. Listing text and images remain the property of their owners.

Frequently Asked Questions

How do I get agoda hotel prices by city?

Enter the city in Location — Seoul, or Paris, France when the name is shared — select Check In and Check Out in the date pickers, and set Max Results. Each hotel becomes a row with nightly_price, nightly_inclusive, stay_price and stay_inclusive for exactly that stay.

How do I export agoda hotel list to csv?

Run the Actor, then download the Dataset as CSV from the Dataset tab or the API. search_location, name, nightly_price, nightly_inclusive, currency, review_score and area are ordinary columns in that file, and nested fields such as facilities are flattened into columns of their own.

How many hotels does one city return?

As many as Agoda lists for that stay, up to your max_results. The list is read page after page: one measured city delivered 500 hotels in a single run, and a small one ran out at 77 with the run saying so. Set max_results to the depth you want per location; a value larger than the city stops where the source does.

Why did I get a different city than I asked for?

A shared place name was matched to the more prominent city. San Jose alone returns San Jose, California; San Jose, Costa Rica returns the other one. The run prints every match with its country and hotel count before it reads anything, and search_location, city and city_id ship on every row, so add the country or state and run again.

Is the price the final price?

nightly_inclusive and stay_inclusive are the source's prices with taxes and fees included, and nightly_price and stay_price are the same offers before them. Charges the property collects separately — breakfast, parking, Wi-Fi, airport transfer — ship as their own fields and sit inside neither figure.

Which currency are the prices in?

The one the source quotes for the request, recorded in currency on every priced row so the unit travels with the number. Every priced row measured so far came back in USD.

Is there a free agoda hotel data API?

Agoda offers a Search API through its partner integration programme; commercial arrangements are agreed during partnership onboarding. This Actor offers self-service hotel exports on Apify, priced at $0.004 per hotel on FREE plus the Actor Start.

Can I schedule runs to monitor hotel prices over time?

Yes. Use Apify's scheduler with one destination and the stay dates you want to monitor. Each run produces a dated Dataset snapshot: property_id is stable across runs, and check_in, check_out, adults and rooms ship on every row so a series stays comparable.

What does each row's price cover?

The lead offer the search returns for that stay — the rate the city listing leads with — carried as eight figures before and after taxes, alongside rooms_available, payment_model and that offer's own cancellation terms.

What party size are the prices for?

Two adults in one room, on every row and every city. adults and rooms ship with each result, so a price always means the same thing across runs and across cities and rows stay directly comparable.

AgentX publishes 83 Actors; the three closest to this one are listed first, then the full catalog by category.

Closest to this Actor:

Business and Market Intelligence

Jobs and Hiring

Social Media

Video, Transcripts and Downloads

E-Commerce and Retail

Classifieds and Automotive

Real Estate

Support and Community

Ask about place names, max_results depth and the price fields in the AgentX community on Telegram; for a reproducible bug, open an Issue with the run ID and the search address.

AgentX is an Arcyton brand — arcyton.com.

Last Updated: September 5, 2026