# Agoda Hotels Scraper (`agentx/agoda-hotels-scraper`) Actor

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.

- **URL**: https://apify.com/agentx/agoda-hotels-scraper.md
- **Developed by:** [AgentX](https://apify.com/agentx) (community)
- **Categories:** Travel, E-commerce, AI
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 4.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**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](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.apify.com%2Fv2%2Facts%2Fagentx~agoda-hotels-scraper\&query=%24.data.stats.totalUsers\&label=Apify%20Users\&color=ff9013\&style=for-the-badge)](https://apify.com/agentx/agoda-hotels-scraper)
[![Apify%20Runs](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.apify.com%2Fv2%2Facts%2Fagentx~agoda-hotels-scraper\&query=%24.data.stats.totalRuns\&label=Apify%20Runs\&color=ff9013\&style=for-the-badge)](https://apify.com/agentx/agoda-hotels-scraper)
[![$0.004 / hotel](https://img.shields.io/badge/%240.004%20%2F%20hotel-4285f4?style=for-the-badge)](https://apify.com/agentx/agoda-hotels-scraper/pricing)
[![92 fields per hotel](https://img.shields.io/badge/92%20fields%20per%20hotel-34a853?style=for-the-badge)](https://console.apify.com/actors/agentx~agoda-hotels-scraper/input)
[![API + MCP ready](https://img.shields.io/badge/API%20%2B%20MCP%20ready-fbbc05?style=for-the-badge)](https://apify.com/agentx/agoda-hotels-scraper/api)

- **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`.

| Parameter | Type | Required | Description | Example |
| --- | --- | --- | --- | --- |
| `max_results` | integer | Yes | Hotels to save for the destination. Minimum 1. | `100` |
| `location` | string | Yes | One city, area or landmark. Add country or state for shared names. | `"Seoul"` |
| `check_in` | date (`YYYY-MM-DD` string in JSON) | No | Choose the first night in the date picker. Omitted means 30 days from today. | `"2026-10-05"` |
| `check_out` | date (`YYYY-MM-DD` string in JSON) | No | Choose checkout in the date picker, 1–30 nights after check-in. Omitted means one night after check-in. | `"2026-10-08"` |

```json
{
  "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:

| Typed | Matched |
| --- | --- |
| `Seoul` | Seoul, KR — 5,945 hotels |
| `Paris, France` | Paris, FR — 14,318 hotels |
| `Paris, Texas` | Paris (TX), US — 379 hotels |
| `Cambridge, MA` | Cambridge (MA), US — 83 hotels |
| `San Jose, California` | San Jose (CA), US — 879 hotels |
| `San Jose, Costa Rica` | San Jose, CR — 407 hotels |
| `Springfield, Illinois` | Springfield (IL), US — 58 hotels |
| `San Jose` | San 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:

| Field | Type | Description |
| --- | --- | --- |
| `platform` | string | Source platform the row came from |
| `position` | integer | One-based position in the order the search returned |
| `property_id` | integer | Source identifier for the hotel |
| `name` | string | Hotel name |
| `property_url` | string | Hotel page on the source |
| `property_type` | string | Accommodation type the source assigns, `Hotel`, `NonHotel` or `SingleRoom` in the measured city |
| `star_rating` | number | Star class the source assigns |
| `description` | string | Hotel description the source publishes |
| `address` | string | Street address |
| `postal_code` | string | Postal code |
| `country` | string | Country containing the hotel |
| `country_code` | string | Two-letter country code |
| `city` | string | City the answer itself named |
| `city_id` | integer | Source city id of that city |
| `area` | string | Neighbourhood the source places it in |
| `latitude` | number | Latitude in decimal degrees |
| `longitude` | number | Longitude in decimal degrees |
| `center_distance_m` | number | Metres from the city centre, as the source measures it |

Prices and terms for the requested stay:

| Field | Type | Description |
| --- | --- | --- |
| `nightly_price` | number | Lead offer per night for all requested rooms, before taxes and fees |
| `nightly_inclusive` | number | The same per night, including taxes and fees |
| `nightly_original` | number | Nightly price before the displayed discount |
| `stay_price` | number | Lead offer for the whole stay, before taxes and fees |
| `stay_inclusive` | number | The whole stay, including taxes and fees |
| `stay_original` | number | Whole-stay price before the displayed discount |
| `room_nightly` | number | Per room per night, before taxes and fees |
| `room_inclusive` | number | Per room per night, including taxes and fees |
| `currency` | string | Currency the source quoted the prices in |
| `discount_percent` | number | Total discount on the lead offer |
| `promotion_text` | string | Promotion text the source attaches to the lead offer |
| `rooms_available` | integer | Lead-offer rooms still available |
| `availability` | string | `available` or `sold_out` for the requested stay |
| `soldout_price` | number | The source's average price for a sold-out hotel |
| `cancellation_type` | string | Property-level cancellation summary, `FreeCancellation`, `NonRefundable`, `SpecialConditions` or `Unknown` in the measured city |
| `cancellation_until` | string | Deadline the free cancellation runs to |
| `offer_cancellation` | string | Cancellation type on the displayed lead offer |
| `payment_model` | string | Payment model on the displayed lead offer |
| `pay_later` | boolean | Whether a pay-later option is offered |
| `pay_hotel` | boolean | Whether payment at the hotel is offered |
| `is_sponsored` | boolean | Whether the source placed the result as sponsored |
| `is_popular` | boolean | Whether the source marks the hotel as popular |
| `has_guarantee` | boolean | Whether the hotel is in the source's price guarantee programme |
| `bookings_24h` | integer | Bookings the source counted in the previous 24 hours |

Reviews, facilities and media:

| Field | Type | Description |
| --- | --- | --- |
| `review_score` | number | Combined guest score out of ten |
| `review_count` | integer | How many reviews that score rests on |
| `recommendation_score` | number | Guest recommendation percentage |
| `frequent_score` | number | Frequent-traveller recommendation percentage |
| `review_positive` | string | Positive review summary the source publishes |
| `review_negative` | string | Negative review summary the source publishes |
| `review_tags` | array | Review topics with the source's rating and positive percentage |
| `review_highlights` | array | Review highlights the source selects, with topic and explanation |
| `top_features` | array | Features the source picks out as the hotel's highlights |
| `facilities` | array | Hotel facility names the source lists |
| `nearby_places` | array | Nearby place names, types and distances in kilometres |
| `airport_score` | number | Location subscore for airport access |
| `poi_score` | number | Location subscore for points of interest |
| `transit_score` | number | Location subscore for public transport |
| `image_url` | string | Primary hotel image |
| `gallery_urls` | array | Further hotel images, excluding the primary one |
| `image_count` | integer | How many images the source returned |
| `video_urls` | array | Hotel video URLs the source returned |

Property facts, family suitability and fee lines:

| Field | Type | Description |
| --- | --- | --- |
| `is_luxury` | boolean | Whether the source classifies the hotel as luxury |
| `kids_stay_free` | boolean | Whether the child policy lets children stay free |
| `has_family_room` | boolean | Whether family rooms are marked available |
| `has_multi_bedroom` | boolean | Whether multi-bedroom accommodation is marked available |
| `has_interconnecting` | boolean | Whether interconnecting rooms are marked available |
| `has_cot` | boolean | Whether an infant cot is marked available |
| `has_kids_pool` | boolean | Whether a children's pool is marked available |
| `has_kids_club` | boolean | Whether a children's club is marked available |
| `checkin_from` | string | Earliest check-in time |
| `checkin_until` | string | Latest check-in time, where published |
| `checkout_from` | string | Earliest check-out time, where published |
| `checkout_until` | string | Latest check-out time |
| `opened_year` | integer | Year the property opened |
| `renovated_year` | integer | Year of the most recent renovation |
| `room_count` | integer | Rooms the source reports |
| `floor_count` | integer | Floors the source reports |
| `restaurant_count` | integer | Restaurants the source reports |
| `bar_count` | integer | Bars or lounges the source reports |
| `airport_minutes` | integer | Travel time to the airport in minutes |
| `breakfast_fee` | string | Breakfast fee with the currency the source displays it in |
| `parking_fee` | string | Daily parking fee with its displayed currency |
| `transfer_fee` | string | Airport-transfer fee with its displayed currency |
| `wifi_fee` | string | Daily Wi-Fi fee with its displayed currency |
| `child_policy` | object | Child and infant age ranges plus the source's policy text |

The stay the row was read for:

| Field | Type | Description |
| --- | --- | --- |
| `search_location` | string | The place name the run asked for |
| `search_city_id` | string | The source city id the search ran under, the parent city's for an area or landmark |
| `check_in` | string | Check-in date the prices were read for |
| `check_out` | string | Check-out date the prices were read for |
| `adults` | integer | Adults the prices were read for — always 2 |
| `rooms` | integer | Rooms the prices were read for — always 1 |
| `processor` | string | Actor URL that produced the row |
| `processed_at` | string | UTC 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.

```json
{
  "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

```text
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:

```bash
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

```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

```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.

| Event | FREE | BRONZE | SILVER | GOLD / 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](https://apify.com/agentx/agoda-hotels-scraper/pricing).

### 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](https://developer.agoda.com/demand/docs/getting-started) 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](https://apify.com/agentx/agoda-hotels-scraper/issues) 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.

### Legal and Compliance

**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](https://developer.agoda.com/demand/docs/getting-started); 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.

### Related AgentX Actors

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

Closest to this Actor:

- [Google Maps Store Scraper](https://apify.com/agentx/google-maps-store-scraper) — what is around the hotel, off the map.
- [Weather Forecast API](https://apify.com/agentx/weather-forecast-api) — conditions on the dates you are pricing.
- [All Property Scraper](https://apify.com/agentx/all-property-scraper) — the long-stay market beside the nightly one.

#### Business and Market Intelligence

- **[All Web Search Scraper](https://apify.com/agentx/all-web-search-scraper)** — multi-engine web search across ten independent indexes
- **[Google Keyword Trends](https://apify.com/agentx/google-keyword-trends)** — Google Trends keyword interest, compared five at a time
- **[Google Trends Scraper](https://apify.com/agentx/google-trends-scraper)** — Google Trends trending searches
- **[Google Maps Store Scraper](https://apify.com/agentx/google-maps-store-scraper)** — Google Maps business listings
- **[LinkedIn Company Lookup](https://apify.com/agentx/linkedin-company-lookup)** — LinkedIn company records
- **[LinkedIn Profile Lookup](https://apify.com/agentx/linkedin-profile-lookup)** — LinkedIn profile records
- **[Weather Forecast API](https://apify.com/agentx/weather-forecast-api)** — forecast and historical weather data

#### Jobs and Hiring

- **[All Jobs Scraper](https://apify.com/agentx/all-jobs-scraper)** — multi-platform job listings
- **[Bayt Jobs Scraper](https://apify.com/agentx/bayt-jobs-scraper)** — Bayt job listings
- **[Glassdoor Jobs Scraper](https://apify.com/agentx/glassdoor-jobs-scraper)** — Glassdoor job listings
- **[Indeed Jobs Scraper](https://apify.com/agentx/indeed-jobs-scraper)** — Indeed job listings
- **[JobStreet Company Profile](https://apify.com/agentx/jobstreet-company-profile)** — JobStreet employer records
- **[Jooble Jobs Scraper](https://apify.com/agentx/jooble-jobs-scraper)** — Jooble job listings
- **[LinkedIn Jobs Scraper](https://apify.com/agentx/linkedin-jobs-scraper)** — LinkedIn job listings
- **[Naukri Jobs Scraper](https://apify.com/agentx/naukri-jobs-scraper)** — Naukri job listings
- **[Talent Jobs Scraper](https://apify.com/agentx/talent-jobs-scraper)** — Talent.com job listings
- **[ZipRecruiter Jobs Scraper](https://apify.com/agentx/ziprecruiter-jobs-scraper)** — ZipRecruiter job listings

#### Social Media

- **[All Forums Thread Scraper](https://apify.com/agentx/all-forums-thread-scraper)** — multi-platform forum and Q\&A threads
- **[Instagram Creator Scraper](https://apify.com/agentx/instagram-creator-scraper)** — Instagram creator profiles
- **[Instagram Reels Scraper](https://apify.com/agentx/instagram-reels-scraper)** — Instagram Reels metadata
- **[Instagram Trending Scraper](https://apify.com/agentx/instagram-trending-scraper)** — Instagram trending content
- **[Medium Scraper](https://apify.com/agentx/medium-scraper)** — Medium articles
- **[Medium Profile Scraper](https://apify.com/agentx/medium-profile-scraper)** — Medium author profiles
- **[Reddit Profile Scraper](https://apify.com/agentx/reddit-profile-scraper)** — Reddit user profiles
- **[Reddit Viral Scraper](https://apify.com/agentx/reddit-viral-scraper)** — Reddit viral posts
- **[SubReddit Info Scraper](https://apify.com/agentx/subreddit-info-scraper)** — subreddit metadata
- **[Subreddit Members Scraper](https://apify.com/agentx/subreddit-members-scraper)** — subreddit member lists
- **[Subreddit Posts Scraper](https://apify.com/agentx/subreddit-posts-scraper)** — subreddit post feeds
- **[Telegram Chat Scraper](https://apify.com/agentx/telegram-chat-scraper)** — Telegram chat messages
- **[Telegram Info Scraper](https://apify.com/agentx/telegram-info-scraper)** — Telegram channel metadata
- **[Telegram Member Adder](https://apify.com/agentx/telegram-member-adder)** — Telegram group membership management
- **[Telegram Member Scraper](https://apify.com/agentx/telegram-member-scraper)** — Telegram group members
- **[Telegram Private Group Scraper](https://apify.com/agentx/telegram-private-group-scraper)** — private Telegram group data
- **[TikTok Creator API](https://apify.com/agentx/tiktok-creator-api)** — TikTok creator profiles
- **[TikTok User Lookup](https://apify.com/agentx/tiktok-user-lookup)** — TikTok account records
- **[X Twitter Community API](https://apify.com/agentx/x-twitter-community-api)** — X community data
- **[X Twitter Profile Lookup](https://apify.com/agentx/x-twitter-profile-lookup)** — X profile records
- **[YouTube Creator Email Scraper](https://apify.com/agentx/youtube-creator-email-scraper)** — YouTube creator contact data

#### Video, Transcripts and Downloads

- **[All Video Scraper](https://apify.com/agentx/all-video-scraper)** — multi-platform video metadata
- **[All Short Videos Scraper](https://apify.com/agentx/all-short-videos-scraper)** — short-video keyword search across two independent indexes
- **[All Image Scraper](https://apify.com/agentx/all-image-scraper)** — image search and download across five engines
- **[All Short Drama Downloader](https://apify.com/agentx/all-short-drama-downloader)** — short-drama episodes from fifteen official apps
- **[Video Transcript](https://apify.com/agentx/video-transcript)** — multi-platform transcripts
- **[Video Captions Downloader](https://apify.com/agentx/video-captions-downloader)** — caption files
- **[Video to Social Post](https://apify.com/agentx/video-to-social-post)** — video repurposed into social copy
- **[YouTube Transcript](https://apify.com/agentx/youtube-transcript)** — YouTube transcripts
- **[TikTok Transcript](https://apify.com/agentx/tiktok-transcript)** — TikTok transcripts
- **[X Twitter Transcript](https://apify.com/agentx/x-twitter-transcript)** — X video transcripts
- **[Facebook Transcript](https://apify.com/agentx/facebook-transcript)** — Facebook video transcripts
- **[Bilibili Transcript](https://apify.com/agentx/bilibili-transcript)** — Bilibili transcripts
- **[Dailymotion Transcript](https://apify.com/agentx/dailymotion-transcript)** — Dailymotion transcripts
- **[Rutube Transcript](https://apify.com/agentx/rutube-transcript)** — Rutube transcripts
- **[Loom Transcript](https://apify.com/agentx/loom-transcript)** — Loom transcripts
- **[Wistia Transcript](https://apify.com/agentx/wistia-transcript)** — Wistia transcripts
- **[Instagram Reels Downloader](https://apify.com/agentx/instagram-reels-downloader)** — Reels downloads
- **[Kick Clip Downloader](https://apify.com/agentx/kick-clip-downloader)** — Kick clip downloads
- **[Linkedin Video Downloader](https://apify.com/agentx/linkedin-video-downloader)** — LinkedIn video downloads
- **[Pinterest Video Downloader](https://apify.com/agentx/pinterest-video-downloader)** — Pinterest video downloads
- **[Reddit Video Downloader](https://apify.com/agentx/reddit-video-downloader)** — Reddit video downloads
- **[Snapchat Video Downloader](https://apify.com/agentx/snapchat-video-downloader)** — Snapchat video downloads
- **[TED Talk Downloader](https://apify.com/agentx/ted-talk-downloader)** — TED talk downloads
- **[TikTok Live Downloader](https://apify.com/agentx/tiktok-live-downloader)** — TikTok live downloads
- **[Twitch VOD Downloader](https://apify.com/agentx/twitch-vod-downloader)** — Twitch VOD downloads
- **[Zoom Recording Downloader](https://apify.com/agentx/zoom-recording-downloader)** — Zoom recording downloads

#### E-Commerce and Retail

- **[All Shopping Scraper](https://apify.com/agentx/all-shopping-scraper)** — multi-platform product data
- **[AliExpress Product Scraper](https://apify.com/agentx/aliexpress-product-scraper)** — AliExpress products
- **[Amazon Storefront Scraper](https://apify.com/agentx/amazon-storefront-scraper)** — Amazon Brand Store pages
- **[Bol Product Scraper](https://apify.com/agentx/bol-product-scraper)** — Bol.com products
- **[eBay Seller Leads API](https://apify.com/agentx/ebay-seller-leads-api)** — eBay seller records
- **[Hepsiburada Product Scraper](https://apify.com/agentx/hepsiburada-product-scraper)** — Hepsiburada products
- **[Kakaku Product Scraper](https://apify.com/agentx/kakaku-product-scraper)** — Kakaku.com products
- **[Rakuten Product Scraper](https://apify.com/agentx/rakuten-product-scraper)** — Rakuten products

#### Classifieds and Automotive

- **[All Vehicle Scraper](https://apify.com/agentx/all-vehicle-scraper)** — multi-platform vehicle listings
- **[AutoTrader Vehicle Search](https://apify.com/agentx/autotrader-vehicle-search)** — AutoTrader US listings
- **[AutoTrader UK Vehicle Search](https://apify.com/agentx/autotrader-uk-vehicle-search)** — AutoTrader UK listings

#### Real Estate

- **[All Property Scraper](https://apify.com/agentx/all-property-scraper)** — multi-platform property listings
- **[Homes Property Scraper](https://apify.com/agentx/homes-property-scraper)** — Homes.com listings
- **[MagicBricks Property Scraper](https://apify.com/agentx/magicbricks-property-scraper)** — MagicBricks listings
- **[NoBroker Property Scraper](https://apify.com/agentx/nobroker-property-scraper)** — NoBroker listings
- **[Property24 Property Scraper](https://apify.com/agentx/property24-property-scraper)** — Property24 listings
- **[Realtor Property Scraper](https://apify.com/agentx/realtor-property-scraper)** — Realtor.com listings
- **[Zillow Property Scraper](https://apify.com/agentx/zillow-property-scraper)** — Zillow listings

### Support and Community

Ask about place names, `max_results` depth and the price fields in the [AgentX community on Telegram](https://t.me/Apify_Actor); for a reproducible bug, open an Issue with the run ID and the search address.

AgentX is an Arcyton brand — [arcyton.com](https://arcyton.com).

**Last Updated:** September 5, 2026

# Actor input Schema

## `max_results` (type: `integer`):

How many hotels to save for the location. Minimum 1 and no maximum. The list is read page after page until the budget is met or the source has no more hotels for that stay: one measured city delivered 500 in a single run, and a small one ran out at 77.

## `location` (type: `string`):

Enter one city, area or landmark, such as Seoul, Paris, France or Cambridge, MA. Add a country or state when a name is shared. The run displays the matched destination, country and hotel count before reading hotels. Areas and landmarks retain their own search scope, while the city field can name their parent city.

## `check_in` (type: `string`):

Choose the first night using the date picker. API inputs use YYYY-MM-DD. Leave unset for 30 days from today. Select today or a future date; hotel prices correspond to this stay.

## `check_out` (type: `string`):

Choose checkout using the date picker. API inputs use YYYY-MM-DD. Leave unset for one night after check-in. Checkout must be 1 to 30 nights after check-in.

## Actor input object example

```json
{
  "max_results": 1,
  "location": "Seoul"
}
```

# Actor output Schema

## `results` (type: `string`):

Hotels in source order with identity, detail, review, price, availability, location, facility, policy, media, and request fields.

# 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 = {
    "max_results": 1,
    "location": "Seoul"
};

// Run the Actor and wait for it to finish
const run = await client.actor("agentx/agoda-hotels-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 = {
    "max_results": 1,
    "location": "Seoul",
}

# Run the Actor and wait for it to finish
run = client.actor("agentx/agoda-hotels-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 '{
  "max_results": 1,
  "location": "Seoul"
}' |
apify call agentx/agoda-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,agentx/agoda-hotels-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/LhQdn21aQ4FxgTNz8/builds/5MYtEKmMu3LpPWxWt/openapi.json
