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

Scrape public Agoda hotel listings, prices, ratings, amenities, and property URLs by destination.

- **URL**: https://apify.com/fetch\_cat/agoda-hotels-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 hotel 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/platform/actors/running/actors-in-store#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

Scrape public Agoda hotel search result pages and export hotel/property listings with prices, ratings, review counts, locations, amenities, and Agoda property URLs. Use it for travel market research, price monitoring, destination analysis, and hotel lead collection.

### Input recipes

```json
{
  "searchUrls": [{ "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1" }],
  "maxItems": 20,
  "currency": "USD",
  "language": "en-US"
}
```

Or build a search from an Agoda city ID:

```json
{
  "destination": "Bangkok",
  "cityId": "9395",
  "adults": 2,
  "rooms": 1,
  "maxItems": 20
}
```

### Output

Each dataset item represents one Agoda hotel/property listing and includes fields such as `name`, `price`, `currency`, `reviewScore`, `reviewCount`, `location`, `amenities`, `url`, and source search metadata.

### Pricing and cost expectations

This Actor uses pay-per-event pricing on Apify: a small run-start event plus one hotel-result event per saved listing. Local development runs may show charge warnings because local runs do not use platform pay-per-event billing.

### Notes

Agoda pages can vary by country, date, currency, and availability. If a search returns no results, try a less restrictive public Agoda search URL or enable Apify Proxy for repeated/larger runs.

### Example inputs

#### Bangkok hotels from a public Agoda search URL

Use a copied Agoda search URL when you already have the destination and guest filters selected in the browser.

```json
{
  "searchUrls": [{ "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1" }],
  "maxItems": 50,
  "currency": "USD"
}
```

#### City ID search with dates

Use Agoda city IDs for repeatable destination tracking.

```json
{
  "destination": "Bangkok",
  "cityId": "9395",
  "checkIn": "2026-08-15",
  "checkOut": "2026-08-17",
  "adults": 2,
  "rooms": 1,
  "maxItems": 30
}
```

### API usage

You can run the Actor from the Apify API or Apify client libraries with the same JSON input shown above. After the run finishes, read the default dataset to get one item per scraped Agoda hotel/property listing.

#### Node.js ApifyClient example

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/agoda-hotels-scraper').call({
  searchUrls: [{ url: 'https://www.agoda.com/search?city=9395&adults=2&rooms=1' }],
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python ApifyClient example

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/agoda-hotels-scraper').call(run_input={
    'searchUrls': [{'url': 'https://www.agoda.com/search?city=9395&adults=2&rooms=1'}],
    'maxItems': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

#### cURL example

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~agoda-hotels-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"searchUrls":[{"url":"https://www.agoda.com/search?city=9395&adults=2&rooms=1"}],"maxItems":20}'
```

### Who is it for

- Travel analysts comparing hotel supply and pricing across Agoda destinations.
- Revenue managers monitoring public hotel listings for a market or competitor set.
- Data teams enriching destination dashboards with Agoda property names, prices, ratings, and locations.
- Agencies and researchers collecting public accommodation inventory for reporting.

### MCP

This Actor can be used from Apify integrations that expose Actors as tools, including MCP-compatible workflows. Provide the same JSON input you would use in the Apify Console, run the Actor, and consume the default dataset as structured hotel listing records.

Add the Apify MCP server to Claude Desktop or Claude Code with your Apify token:

```bash
claude mcp add apify -- npx -y @apify/actors-mcp-server --actors fetch_cat/agoda-hotels-scraper
```

Example MCP server configuration:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server", "--actors", "fetch_cat/agoda-hotels-scraper"],
      "env": {
        "APIFY_TOKEN": "YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

Example prompts:

- "Run Agoda Hotels Scraper for Bangkok city ID 9395 and return 10 hotels with prices."
- "Scrape this Agoda search URL and summarize hotel names, ratings, and nightly prices."
- "Compare the locations and review scores from the Agoda dataset produced by the latest run."

### Legality

This Actor is designed for publicly available Agoda search result pages. Use it responsibly, respect applicable laws and Agoda terms, and avoid collecting personal data. If your use case has compliance requirements, consult your legal team before running large-scale extraction.

### FAQ

#### Why did my local run log a charge warning?

Local Apify runs do not use platform pay-per-event billing, so charge calls can be ignored locally. Cloud runs on the Apify platform use the Actor pricing configuration.

#### Why did I get fewer hotels than `maxItems`?

Agoda may return fewer public listings for a destination, date, room mix, or currency. Try broadening dates and guest filters, or use a public Agoda search URL that visibly contains more results.

#### Should I use a proxy?

For occasional small searches, direct access may work. For repeated searches or larger runs, enable Apify Proxy in the input to reduce blocking risk.

### Support

Open an Apify Actor issue with your run ID, input, and what result you expected if a public Agoda search URL does not produce listings.

### Best practices

Start with a small `maxItems` value to confirm the destination and filters return the listings you expect. For recurring monitoring, keep input dates, currency, and language consistent across runs so price and rating comparisons remain comparable.

### Related actors

- Agoda Reviews Scraper
- Booking.com Hotels Scraper
- Booking Reviews Scraper

# Actor input Schema

## `searchUrls` (type: `array`):

One or more public Agoda search result URLs. If omitted, the actor builds a search URL from the city ID and travel dates.

## `destination` (type: `string`):

Optional destination text to include when building an Agoda search URL from cityId.

## `cityId` (type: `string`):

Agoda city ID used when searchUrls is empty. Default 9395 is Bangkok.

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

Optional check-in date in YYYY-MM-DD format.

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

Optional check-out date in YYYY-MM-DD format.

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

Number of adult guests.

## `children` (type: `integer`):

Number of child guests.

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

Number of rooms.

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

Preferred currency code, such as USD, EUR, GBP, SGD, or THB.

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

Browser locale and Accept-Language header used for Agoda pages.

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

Maximum number of hotel/property listings to save.

## `requestDelayMs` (type: `integer`):

Optional delay between Agoda search pages to reduce rate-limit risk.

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

Optional Apify proxy configuration. Agoda may require proxies for repeated or larger runs.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1"
    }
  ],
  "destination": "Bangkok",
  "cityId": "9395",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "language": "en-US",
  "maxItems": 20,
  "requestDelayMs": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `runSummary` (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 = {
    "searchUrls": [
        {
            "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1"
        }
    ],
    "destination": "Bangkok"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/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 = {
    "searchUrls": [{ "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1" }],
    "destination": "Bangkok",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    {
      "url": "https://www.agoda.com/search?city=9395&adults=2&rooms=1"
    }
  ],
  "destination": "Bangkok"
}' |
apify call fetch_cat/agoda-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fetch_cat/agoda-hotels-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EKBYF1U9hdZ1OW5jx/builds/8jNa2beKzLWoqWrg7/openapi.json
