# Agoda Hotel Scraper — Hotels, Rooms & Reviews API (`sian.agency/agoda-hotel-scraper`) Actor

Scrape Agoda hotel listings with star rating, guest score, review count, nightly price and property type. Search by location, coordinates, or URL, plus location autocomplete. Opt-in room rates, availability, price calendar and guest reviews.

- **URL**: https://apify.com/sian.agency/agoda-hotel-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 hotel extracteds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Hotel Scraper — Hotels, Rooms & Reviews API 🏨

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Airbnb Property Scraper](https://img.shields.io/badge/Store-Airbnb%20Property%20Scraper-FF5A5F)](https://apify.com/sian.agency/airbnb-property-scraper?fpr=sian) [![Store-Zillow Property Scraper](https://img.shields.io/badge/Store-Zillow%20Property%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) [![Store-StreetEasy Property Scraper](https://img.shields.io/badge/Store-StreetEasy%20Property%20Scraper-FF4747)](https://apify.com/sian.agency/streeteasy-property-scraper?fpr=sian)

#### 🎉 NEW: Bundle hotels + room rates + guest reviews in a single run — no three-actor pipeline
##### Built for hospitality analysts, travel researchers, OTA revenue teams, and rate-shopping tools that need clean Agoda data fast.

---

### 📋 Overview

**Agoda data without the manual dance.** Pull hotels, room rates, availability, nightly price trends, guest scores, and reviews from anywhere on Agoda — by city, coordinates, or URL — in one structured run.

**Why hospitality teams choose us:**
- ✅ **4 search modes** — free-text location (auto-paginated), lat/lng radius, Agoda URL, and location autocomplete for city-ID lookup
- ⚡ **Direct-API speed** — sub-2-second/hotel, no Cloudflare/captcha brittleness like browser-scrapers
- 🛏️ **Bundled room rates & availability** — opt-in `fetchRooms` pulls every room type with its rate-plan offers (price, free cancellation, breakfast, occupancy) in the same run
- 📆 **Nightly price-trend calendar** — a 60-day price grid per hotel so you can spot the cheapest dates and demand peaks
- 💯 **Guest score + reviews** — 0–10 aggregate score plus opt-in per-review sentiment (title, comment, traveller type, stay dates)
- 💰 **Tiered pay-per-result** — $0.009 FREE → $0.00125 DIAMOND per hotel, only charged for rows you actually get
- 💎 **Hospitality KPIs out of the box** — avg guest score, star rating, price distribution, per-city / per-area / per-type breakdowns in a default HTML report

---

### ✨ Features

- 🧭 **Location, coordinate & URL search** — target a whole city, a radius around a point, or a specific Agoda search URL
- 🔎 **Location autocomplete** — resolve fuzzy place names to Agoda city IDs and hotel counts
- ⭐ **Rich hotel records** — star rating, guest score, review count, property type, address, coordinates, and images
- 🛏️ **Room-level rates** — master rooms with every rate-plan offer: price, cross-out price, discount, cancellation policy, breakfast, instant booking, occupancy
- 📆 **Price calendar** — per-hotel nightly price trend to time the best booking window
- 📝 **Guest reviews enrichment** — score, headline, translated + original comment, traveller type, stay dates, property responses
- 💱 **Stay-spec + currency** — pass check-in / check-out / adults / rooms / currency for date-accurate quotes in any ISO currency
- 📊 **Hospitality KPIs report** — auto-generated HTML with distributions and market breakdowns
- 🔁 **Built-in deduplication** — hotels deduped across overlapping queries automatically

---

### 🎬 Quick Start

Point the actor at a city, pick a search mode, and run. Free-text location works out of the box (it auto-paginates), and enrichment is one checkbox away.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~agoda-hotel-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"searchMode": "bylocation", "location": "Bangkok"}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose a search mode

Pick `bylocation` (free text), `bycoordinates` (lat/lng + radius), `byurl` (an Agoda URL), or `autocomplete` (location lookup).

#### Step 2: Add optional enrichment

Toggle `fetchRooms` for room rates, availability, and the price calendar. Toggle `fetchReviews` for guest reviews.

#### Step 3: Run and export

Start the run and export results as JSON, CSV, or Excel directly from the Apify dataset.

**That's it! In under a minute, you'll have:**

- A clean table of Agoda hotels with star rating, guest score, and price
- Optional room-rate and guest-review rows per hotel
- A hospitality KPI HTML report

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| searchMode | string | No | `bylocation` (default), `bycoordinates`, `byurl`, or `autocomplete` |
| location | string | For bylocation | City / region / landmark name |
| query | string | For autocomplete | Partial location name to look up |
| latitude / longitude | number | For bycoordinates | Center point for a radial search |
| radius | number | No | Radius in km (default 5, range 0.1–50) |
| url | string | For byurl | Full Agoda search / city URL |
| checkIn / checkOut | string | No | Stay dates (YYYY-MM-DD) for date-accurate quotes |
| adults / rooms | integer | No | Occupancy (defaults 2 adults, 1 room) |
| currency | string | No | ISO currency code (default USD) |
| maxResults | integer | No | Cap on hotels per query (default 30, max 300) |
| fetchRooms | boolean | No | Room rates, availability & price calendar (PAID) |
| fetchReviews | boolean | No | Guest reviews (PAID) |

**Example — city search with enrichment:**

```json
{
  "searchMode": "bylocation",
  "location": "Bangkok",
  "checkIn": "2026-08-15",
  "checkOut": "2026-08-17",
  "currency": "USD",
  "fetchRooms": true,
  "fetchReviews": true
}
```

**Radial search around a coordinate:**

```json
{
  "searchMode": "bycoordinates",
  "latitude": 13.7563,
  "longitude": 100.5018,
  "radius": 5
}
```

***

### 📤 Output

Results are saved to the Apify dataset. Hotel rows are the primary output; room and review rows are added when enrichment is enabled.

| Field | Type | Description |
|-------|------|-------------|
| hotelId | integer | Unique Agoda property ID |
| name | string | Hotel name |
| starRating | number | Official star rating (0–5) |
| reviewScore | number | Aggregate guest score (0–10) |
| reviewCount | integer | Number of guest reviews |
| propertyType | string | Agoda property type |
| pricing | object | Nightly price (currency, per-night inclusive/exclusive/strikethrough) |
| priceCalendar | array | Nightly price-trend calendar (rooms enrichment) |
| address | object | City, area, country, cityId |
| location | object | Latitude / longitude |
| media | object | Thumbnail + image array |
| url | string | Agoda hotel page URL |
| offers | array | (room rows) Rate-plan offers: price, cancellation, breakfast, occupancy |
| rating / reviewTitle / comment | mixed | (review rows) Guest score, headline, and body |

**Example hotel row:**

```json
{
  "_type": "hotel",
  "hotelId": 61208465,
  "name": "Palette Hi Hotel Bangkok",
  "starRating": 4.0,
  "reviewScore": 7.8,
  "reviewCount": 1558,
  "propertyType": "NormalProperty",
  "address": { "city": "Bangkok", "area": "Ratchada", "country": "Thailand", "cityId": 9395 },
  "location": { "latitude": 13.739198, "longitude": 100.553263 },
  "url": "https://www.agoda.com/hi-hotel-bangkok/hotel/bangkok-th.html"
}
```

***

### 💼 Use Cases & Examples

#### 1. Hospitality Market Intelligence

**Analysts benchmarking a city's hotel supply, quality, and price bands.**

**Input:** A city via `bylocation`
**Output:** Every hotel with star rating, guest score, and price distribution
**Use:** Size a market, spot quality gaps, and build a comp set in minutes.

#### 2. Travel & OTA Research

**Product and content teams mapping inventory across destinations.**

**Input:** Multiple cities or coordinate clusters
**Output:** Structured hotel catalogs ready for dashboards and feeds
**Use:** Power travel guides, destination pages, and metasearch comparisons.

#### 3. Hotel Rate Benchmarking

**Revenue managers tracking competitor pricing and availability.**

**Input:** A location plus `fetchRooms`
**Output:** Room-level rate plans and a nightly price calendar per hotel
**Use:** Rate-shop rivals, time promotions, and defend RevPAR.

#### 4. Guest-Review Sentiment Analysis

**Reputation and CX teams mining what guests actually say.**

**Input:** A location plus `fetchReviews`
**Output:** Per-review score, headline, comment, traveller type, and stay dates
**Use:** Track sentiment trends and surface recurring complaints.

#### 5. Competitor Comp-Set Monitoring

**Owners and asset managers watching a fixed set of nearby properties.**

**Input:** A tight radius via `bycoordinates`
**Output:** A repeatable snapshot of the local comp set with scores and prices
**Use:** Schedule weekly pulls to monitor positioning over time.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/agoda-hotel-scraper').call({
  searchMode: 'bylocation',
  location: 'Bangkok'
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/agoda-hotel-scraper').call(
    run_input={'searchMode': 'bylocation', 'location': 'Bangkok'}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~agoda-hotel-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"searchMode": "bylocation", "location": "Bangkok"}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle JSON results
4. **Action**: Save to a sheet, alert on rate changes, or feed a dashboard

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **Up to 25 hotels** per run — full feature access, same data quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** hotels per run, plus room-rate and review enrichment
- Faster processing, no delays
- Pay-per-result: only charged for successful rows

💰 **Fair, tiered pricing** — $0.009 FREE → $0.00125 DIAMOND per hotel; room rates and reviews billed only when you enable them.

🔗 [View current pricing](https://apify.com/sian.agency/agoda-hotel-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many hotels can I process?**
A: FREE tier: up to 25 per run. PAID tier: unlimited, with auto-pagination on location search.

**Q: Where do live room rates come from?**
A: Enable `fetchRooms` — the actor pulls every room type with its rate-plan offers and a nightly price calendar per hotel.

**Q: Are guest reviews included?**
A: Enable `fetchReviews` — you get per-review score, headline, comment, traveller type, and stay dates.

**Q: What output formats are available?**
A: JSON, CSV, and Excel — export directly from the Apify dataset.

**Q: Can I search around a specific point?**
A: Yes — use `bycoordinates` with latitude, longitude, and a radius in kilometers.

**Q: Is this legal?**
A: Yes — the actor only extracts publicly available data. See the legal section below.

***

### 🐛 Troubleshooting

**No hotels returned**

- Try a broader `location` term, or use `autocomplete` to confirm the place resolves on Agoda.
- For `bycoordinates`, widen the `radius`.

**No room rates or reviews in the dataset**

- Room rates and reviews are PAID-tier enrichment — enable `fetchRooms` / `fetchReviews` on a paid Apify plan.

**A specific hotel is missing a price**

- Search rows do not always carry a live nightly rate — enable `fetchRooms` to pull the room-level price and the price calendar.

***

### ⚠️ Trademark Disclaimer

Agoda™ is a trademark of Agoda Company Pte. Ltd. This actor is an independent, unofficial tool and is **not** affiliated with, endorsed by, sponsored by, or in any way officially connected to Agoda Company Pte. Ltd. or Booking Holdings Inc. All product names, logos, and brands are the property of their respective owners and are used for identification purposes only. Use this actor in compliance with Agoda's Terms of Service and all applicable laws.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's Issues tab
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `searchMode` (type: `string`):

How to specify the hotels you want.

• **bylocation** — by free-text location (e.g. "Bangkok", "Bali") — paginated
• **bycoordinates** — by lat/lng + radius (km)
• **byurl** — from an Agoda search / city URL
• **autocomplete** — look up locations and their numeric city IDs

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

City, region, or landmark name. Used when Search Mode = bylocation. Example: "Bangkok", "Bali", "Tokyo".

## `query` (type: `string`):

Partial location name to look up. Used when Search Mode = autocomplete. Returns matching cities/areas with their numeric city IDs.

## `latitude` (type: `number`):

Center latitude for radial search.

## `longitude` (type: `number`):

Center longitude for radial search.

## `radius` (type: `number`):

Search radius in kilometers. Default 5 km. Range 0.1–50.

## `url` (type: `string`):

Full Agoda search or city URL (https://www.agoda.com/city/…-…​.html).

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

Optional check-in date (YYYY-MM-DD). When provided with checkOut, price quotes reflect those dates.

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

Optional check-out date (YYYY-MM-DD).

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

Number of adult guests (1–30). Default 2.

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

Number of rooms (1–20). Default 1.

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

ISO currency code for price quotes (e.g. USD, EUR, GBP, THB). Default USD.

## `sortOrder` (type: `string`):

Optional Agoda sort key for search results. Leave blank for Agoda's default relevance ranking.

## `maxResults` (type: `integer`):

Hard cap on hotels returned per query. Auto-paginates (bylocation) until the cap is reached or the search is fully drained. Default 30. FREE tier is always capped at 25 hotels per run.

## `fetchRooms` (type: `boolean`):

When ON, fetches every room type with its rate-plan offers (price, cancellation policy, breakfast, occupancy) plus a nightly price-trend calendar for each hotel. Adds a RoomRateExtracted charge per room row. Disabled on FREE tier.

## `fetchReviews` (type: `boolean`):

When ON, fetches guest reviews per hotel (score, title, comment, traveller type, stay dates). Adds a ReviewExtracted charge per review pushed. Disabled on FREE tier.

## Actor input object example

```json
{
  "searchMode": "bylocation",
  "location": "Bangkok",
  "query": "Ban",
  "latitude": 13.7563,
  "longitude": 100.5018,
  "radius": 5,
  "url": "https://www.agoda.com/city/bangkok-th.html",
  "checkIn": "2026-08-15",
  "checkOut": "2026-08-17",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "sortOrder": "PriceAsc",
  "maxResults": 30,
  "fetchRooms": false,
  "fetchReviews": false
}
```

# Actor output Schema

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

Structured Agoda hotel rows with star rating, guest score, price, and property type, plus (when enabled) room-rate and review rows.

## `htmlReport` (type: `string`):

HTML summary with run stats, hospitality KPIs (avg guest score, star rating, price distribution), per-city + per-type breakdowns, and per-query totals.

# 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 = {
    "location": "Bangkok"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/agoda-hotel-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 = { "location": "Bangkok" }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/agoda-hotel-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 '{
  "location": "Bangkok"
}' |
apify call sian.agency/agoda-hotel-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Agoda Hotel Scraper — Hotels, Rooms & Reviews API",
        "description": "Scrape Agoda hotel listings with star rating, guest score, review count, nightly price and property type. Search by location, coordinates, or URL, plus location autocomplete. Opt-in room rates, availability, price calendar and guest reviews.",
        "version": "1.0",
        "x-build-id": "HhDzPwq2cR0maQNRV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~agoda-hotel-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-agoda-hotel-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~agoda-hotel-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-agoda-hotel-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~agoda-hotel-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-agoda-hotel-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchMode": {
                        "title": "🧭 Search Mode",
                        "enum": [
                            "bylocation",
                            "bycoordinates",
                            "byurl",
                            "autocomplete"
                        ],
                        "type": "string",
                        "description": "How to specify the hotels you want.\n\n• **bylocation** — by free-text location (e.g. \"Bangkok\", \"Bali\") — paginated\n• **bycoordinates** — by lat/lng + radius (km)\n• **byurl** — from an Agoda search / city URL\n• **autocomplete** — look up locations and their numeric city IDs",
                        "default": "bylocation"
                    },
                    "location": {
                        "title": "🌍 Location (free text)",
                        "type": "string",
                        "description": "City, region, or landmark name. Used when Search Mode = bylocation. Example: \"Bangkok\", \"Bali\", \"Tokyo\".",
                        "default": "Bangkok"
                    },
                    "query": {
                        "title": "🔎 Autocomplete Query",
                        "type": "string",
                        "description": "Partial location name to look up. Used when Search Mode = autocomplete. Returns matching cities/areas with their numeric city IDs."
                    },
                    "latitude": {
                        "title": "🌐 Latitude",
                        "minimum": -90,
                        "maximum": 90,
                        "type": "number",
                        "description": "Center latitude for radial search."
                    },
                    "longitude": {
                        "title": "🌐 Longitude",
                        "minimum": -180,
                        "maximum": 180,
                        "type": "number",
                        "description": "Center longitude for radial search."
                    },
                    "radius": {
                        "title": "📏 Radius (km)",
                        "minimum": 0.1,
                        "maximum": 50,
                        "type": "number",
                        "description": "Search radius in kilometers. Default 5 km. Range 0.1–50.",
                        "default": 5
                    },
                    "url": {
                        "title": "🔗 Agoda URL",
                        "type": "string",
                        "description": "Full Agoda search or city URL (https://www.agoda.com/city/…-…​.html)."
                    },
                    "checkIn": {
                        "title": "📅 Check-in date",
                        "type": "string",
                        "description": "Optional check-in date (YYYY-MM-DD). When provided with checkOut, price quotes reflect those dates."
                    },
                    "checkOut": {
                        "title": "📅 Check-out date",
                        "type": "string",
                        "description": "Optional check-out date (YYYY-MM-DD)."
                    },
                    "adults": {
                        "title": "👥 Adults",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Number of adult guests (1–30). Default 2.",
                        "default": 2
                    },
                    "rooms": {
                        "title": "🛏 Rooms",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of rooms (1–20). Default 1.",
                        "default": 1
                    },
                    "currency": {
                        "title": "💱 Currency",
                        "type": "string",
                        "description": "ISO currency code for price quotes (e.g. USD, EUR, GBP, THB). Default USD.",
                        "default": "USD"
                    },
                    "sortOrder": {
                        "title": "↕️ Sort Order",
                        "type": "string",
                        "description": "Optional Agoda sort key for search results. Leave blank for Agoda's default relevance ranking."
                    },
                    "maxResults": {
                        "title": "📊 Max results per query",
                        "minimum": 1,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Hard cap on hotels returned per query. Auto-paginates (bylocation) until the cap is reached or the search is fully drained. Default 30. FREE tier is always capped at 25 hotels per run.",
                        "default": 30
                    },
                    "fetchRooms": {
                        "title": "🛏 Include room rates & availability (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches every room type with its rate-plan offers (price, cancellation policy, breakfast, occupancy) plus a nightly price-trend calendar for each hotel. Adds a RoomRateExtracted charge per room row. Disabled on FREE tier.",
                        "default": false
                    },
                    "fetchReviews": {
                        "title": "📝 Include guest reviews (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches guest reviews per hotel (score, title, comment, traveller type, stay dates). Adds a ReviewExtracted charge per review pushed. Disabled on FREE tier.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
