# Agoda Hotel API (`johnvc/agoda-hotel-api`) Actor

Agoda hotel data as clean, structured JSON. Search a destination and dates to get properties with live per-room rates, the pre-discount price, cancellation policies, and availability, or pull hotel reviews and full property detail from a hotel URL. Pay per result, MCP-ready for Claude and AI agents.

- **URL**: https://apify.com/johnvc/agoda-hotel-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Travel, AI
- **Stats:** 4 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.43 / 1,000 property returneds

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 API | Hotel Rates, Availability and Guest Reviews

Agoda hotel data as clean, structured JSON, including the part most hotel APIs will not give you: live per-room rates for a specific stay, with the pre-discount price next to the price you would actually pay.

This is an independent Agoda API. [Agoda](https://www.agoda.com) publishes its own developer API only to approved partners, so if you need programmatic hotel rates today, this Actor is the practical route. There is no partner application and no key to request, and you pay for the rows you get back. It is not affiliated with, endorsed by, or connected to Agoda.

Give it a destination and dates. You get every property with a full table of bookable offers, each carrying its room type, nightly rate, original rate, tax inclusion, and cancellation policy. The cheapest nightly rate is lifted to the top of each record, so a rate monitor can diff one number instead of walking a tree.

### What this actor returns

**In search mode, per property:**

- **Room rates:** one entry per bookable offer, with room type, bed configuration, occupancy, nightly price, pre-discount price, currency, whether taxes and fees are included, nights, and the cancellation policy
- **Lowest nightly rate:** the cheapest offer across all rooms, lifted to the top level for sorting and alerting
- **Availability:** whether the property has rooms for the requested stay
- **Scores:** overall guest score, review count, and the breakdown by cleanliness, comfort, location, facilities, staff, and value
- **Location:** address, city, country, coordinates, location rating, what is nearby, walkable places, metro access
- **Detail:** description, highlights, popular facilities, full amenities, images, fine print, FAQ

**In reviews mode, per review:** what the guest liked and what they disliked as separate fields, their score, nights stayed, language, any owner reply, and attached photos.

Every property and review row also carries a one-line plain-language `summary`.

#### The fields you will actually sort and filter on

| Field | Type | What it is |
|---|---|---|
| `result_type` | string | `property`, `review`, or `error`. Filter on this first. |
| `propertyName` | string | Hotel or property name |
| `propertyUrl` | string | Link back to the property page |
| `city` / `country` | string | Where the property is |
| `latitude` / `longitude` | number | Coordinates for mapping |
| `checkIn` / `checkOut` | string | The stay these rates are quoted for |
| `available` | boolean | Whether the property has rooms for that stay |
| `lowestPricePerNight` | number | Cheapest nightly rate across every offer |
| `currency` | string | Currency the rates are quoted in |
| `roomRates` | array | One entry per bookable offer, with `pricePerNight`, `originalPricePerNight`, `taxesAndFeesIncluded`, `nights`, and `policies` |
| `reviewScore` / `reviewCount` | number / integer | Overall guest score and how many reviews back it |
| `reviewScoreBreakdown` | object | Cleanliness, comfort, location, facilities, staff, value for money |
| `locationRating` / `locationRatingLabel` | number / string | Numeric location score and its word form |
| `rating`, `reviewPositive`, `reviewNegative` | number / string | Per-review score and the liked and disliked halves, in reviews mode |
| `nightsStayed`, `authorName`, `ownerReply` | integer / string | Review context, in reviews mode |
| `fetched_at` | string | UTC timestamp for the row, which is what makes a price history a time series |

The Output tab ships four ready-made views: **All Results**, **Room rates**, **Property overview**, and **Guest reviews**. Each exports to JSON, CSV, or Excel.

### Use cases

- **Monitor rates over time.** Run a destination and date range on a schedule and diff `lowestPricePerNight` to catch price moves.
- **Compare the real discount.** Every offer carries both the pre-discount and final price, so you can see how deep a "deal" actually is.
- **Filter by cancellation terms.** Policies come through per offer, so you can separate refundable from non-refundable rates.
- **Track availability.** The availability flag plus the room table tells you what is actually bookable for a given stay.
- **Analyse guest sentiment.** Reviews split liked from disliked, which is far easier to work with than one blob of text.
- **Run a rate parity check.** Pull the same stay here and from another source, with `currency` and `country` pinned, and see where the two disagree.

### Input parameters

| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| `mode` | string | **Required** | `search` | `search` finds properties with rates from a destination and dates. `property` and `reviews` collect from hotel URLs. | `search` |
| `locations` | array of strings | Required in search mode | none | Cities, regions, or landmarks. Up to 20. | `["Singapore"]` |
| `checkIn` | string | Required in search mode | none | `YYYY-MM-DD`. | `2026-09-15` |
| `checkOut` | string | Required in search mode | none | `YYYY-MM-DD`, later than check-in. | `2026-09-18` |
| `adults` | integer | Optional | `2` | Number of adults, which changes the rates returned. 1 to 20. | `2` |
| `currency` | string | Optional | source default | Three-letter code for the rates. | `USD` |
| `country` | string | Optional | source default | Two-letter point-of-sale country. Rates differ by market. | `SG` |
| `hotelUrls` | array of strings | Required in property and reviews modes | none | [Agoda](https://www.agoda.com) property URLs. Up to 200. | `["https://www.agoda.com/.../hotel/singapore-sg.html"]` |
| `maxResultsPerInput` | integer | Optional | `20` | Properties per destination, or reviews per hotel. 1 to 2000. This is your cost control. | `20` |
| `sortReviewsBy` | string | Optional | source default | Sort order for reviews mode, passed through to the source. Leave empty for the default order. | `Most recent` |

```json
{
  "mode": "search",
  "locations": ["Singapore"],
  "checkIn": "2026-09-15",
  "checkOut": "2026-09-23",
  "adults": 2,
  "currency": "USD",
  "maxResultsPerInput": 20
}
```

Dates are required in search mode, and both are validated before anything is sent upstream. Room rates only exist for a specific stay, so a search without dates has no meaningful answer.

The dates above are illustrative. Use whatever future stay you care about, and if you are scripting this, compute the dates from today rather than hard-coding them so your job does not quietly start asking for a stay in the past.

### Example output

```json
{
  "result_type": "property",
  "propertyName": "Village Hotel Bugis by Far East Hospitality",
  "city": "Singapore",
  "country": "Singapore",
  "checkIn": "2026-09-15T00:00:00.000Z",
  "checkOut": "2026-09-23T00:00:00.000Z",
  "available": true,
  "lowestPricePerNight": 129.27,
  "currency": "USD",
  "reviewScore": 8.2,
  "reviewCount": 23921,
  "reviewScoreBreakdown": {
    "cleanliness": 8.1, "comfort": 8.2, "location": 8.9,
    "facilities": 7.9, "staff": 8.3, "value_for_money": 8.1
  },
  "locationRating": 8.9,
  "locationRatingLabel": "Excellent",
  "roomRates": [
    {
      "roomType": "Superior",
      "bedConfiguration": "2 single beds or 1 king bed",
      "adults": 2,
      "pricePerNight": 129.27,
      "originalPricePerNight": 327.63,
      "currency": "USD",
      "taxesAndFeesIncluded": true,
      "nights": 8,
      "policies": ["Non-refundable (Low price!)", "Book and pay now"]
    }
  ],
  "summary": "Village Hotel Bugis by Far East Hospitality in Singapore. Scored 8.2 from 23,921 reviews, from USD 129.27 per night."
}
```

An input that returns nothing produces a row with `result_type: "error"` and a plain-language `error_message`.

### Pricing

Pay per result. Two events: `property-scraped` for each property returned with its full rate table, and `review-scraped` for each review. A property counts as one result no matter how many offers its rate table holds.

`maxResultsPerInput` caps what a run can cost, and the cap is applied at the source. Current rates are shown on the Store card.

### How to get started

1. [View on Apify Store](https://apify.com/johnvc/agoda-hotel-api?fpr=9n7kx3) and click Try for free.
2. Leave **Mode** on `search`, enter a destination, and set your check-in and check-out dates.
3. Run it. Results appear on the Output tab and export as JSON, CSV, or Excel. The **Room rates** view puts the offer table next to the lowest nightly price.
4. Prefer to start from code? The [example repo](https://github.com/johnisanerd/Apify-Agoda-Hotel-API) has a Python quick-start plus MCP install walkthroughs for Claude, Cursor, and ChatGPT.

### 🔌 Use this API from Claude (MCP)

Add this Actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), Cursor, or any other MCP client through the hosted Apify MCP server:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api
```

With [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial):

```
claude mcp add --transport http agoda "https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api"
```

Then ask your agent something like "what is the cheapest refundable rate in Singapore for those dates".

https://www.youtube.com/watch?v=jREWahDGhJM

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The Agoda Hotel API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### Speed

Search returns in about a minute for a handful of properties. Reviews are considerably slower, several minutes per batch, because each property's review history is paged through. The Actor collects in chunks and pushes each chunk as it completes, so results arrive as they go rather than all at the end.

### 🔌 Integrations: Automate Agoda Rate Monitoring

One search tells you what a room costs right now. Run the same search tomorrow and the day after and you have something more useful, which is a record of which way the rate is moving. The native [Apify platform integrations](https://docs.apify.com/platform/integrations) let you wire this Actor into the tools you already use without standing up a server or writing your own cron job.

#### Tasks and schedules: build a rate history

The pattern is one saved task per stay you care about, one schedule across all of them.

1. **Create a task.** A [saved task](https://docs.apify.com/platform/actors/running/tasks) is this Actor plus a saved input, so give each stay its own named task, for example *"Singapore, first week of December"* with your `locations`, `checkIn`, `checkOut`, `currency`, and `country`. Click **Create empty task** on the Actor page, fill in the input, and save.
2. **Attach a schedule.** Open [Schedules](https://docs.apify.com/platform/schedules) in the Apify Console, create one with a standard cron expression, and add your tasks to it. Useful examples: `0 7 * * *` (every morning at 7 AM), `0 */6 * * *` (every six hours), `0 9 * * 1` (Mondays at 9 AM). One schedule can trigger many tasks, so a single "daily rate check" schedule can watch every stay you have saved.
3. **Diff the number.** Each run appends fresh rows with a new `fetched_at`, so comparing `lowestPricePerNight` between runs gives you the price move, and `roomRates` tells you which room type caused it.

A monitoring task holds its dates fixed and watches the price for that stay move. When the stay is behind you, update the dates on the task rather than leaving it asking for the past.

The published task [Track Agoda hotel prices for a destination and dates](https://apify.com/johnvc/agoda-hotel-api/examples/track-agoda-hotel-prices-for-a-destination-and-dates?fpr=9n7kx3) is this recipe already set up.

#### n8n

There is no dedicated community node for this Actor yet, so use the [Apify n8n integration](https://docs.apify.com/platform/integrations/n8n), which can run any Actor. A price-drop workflow is four nodes:

1. **Schedule Trigger**, every morning at 7 AM.
2. **Apify node**, run `johnvc/agoda-hotel-api` in `search` mode with your destination and dates.
3. **Filter node**, keep rows where `lowestPricePerNight` is below your threshold.
4. **Slack or email node**, send yourself the property name, the rate, and the cancellation policy.

#### Make and Zapier

Both have native Apify integrations, [Apify on Make](https://docs.apify.com/platform/integrations/make) and [Apify on Zapier](https://docs.apify.com/platform/integrations/zapier), with "Run Actor" and "Get Dataset Items" actions. The same pattern applies: trigger on a schedule, run this Actor, filter on price, then notify or store.

#### Supabase: keep the price history somewhere queryable

A rate history is only useful if it lands in something you can query. [Supabase](https://supabase.com/) (hosted Postgres) fits well, and there are two paths:

- **No code:** in n8n, connect the Apify node to the built-in Supabase node and insert a row per property after each scheduled run.
- **A few lines of Python:** run the Actor and bulk-insert the flat property rows into a table. Note the dates are computed from today, so this script keeps working months from now.

```python
from datetime import date, timedelta

from apify_client import ApifyClient
from supabase import create_client

apify = ApifyClient("YOUR_APIFY_TOKEN")
supabase = create_client("https://YOUR_PROJECT.supabase.co", "YOUR_SERVICE_ROLE_KEY")

check_in = date.today() + timedelta(days=45)
check_out = check_in + timedelta(days=3)

run = apify.actor("johnvc/agoda-hotel-api").call(
    run_input={
        "mode": "search",
        "locations": ["Singapore"],
        "checkIn": check_in.isoformat(),
        "checkOut": check_out.isoformat(),
        "adults": 2,
        "currency": "USD",
        "country": "SG",
        "maxResultsPerInput": 20,
    }
)

rows = [
    {
        "property_name": item["propertyName"],
        "city": item.get("city"),
        "check_in": item.get("checkIn"),
        "check_out": item.get("checkOut"),
        "lowest_price_per_night": item.get("lowestPricePerNight"),
        "currency": item.get("currency"),
        "available": item.get("available"),
        "review_score": item.get("reviewScore"),
        "fetched_at": item.get("fetched_at"),
    }
    for item in apify.dataset(run.default_dataset_id).iterate_items()
    if item.get("result_type") == "property"
]

if rows:
    supabase.table("agoda_rates").insert(rows).execute()
```

Point a schedule at that and the table fills itself in, ready for a chart or a parity report.

#### MCP and AI agents

Apify exposes this Actor through the [Apify MCP server](https://mcp.apify.com/), so MCP clients such as [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), and Cursor can run live searches as a tool and answer things like "which Singapore hotels under 200 a night for those dates have free cancellation". The published task [Get Agoda hotel rates in Claude via MCP](https://apify.com/johnvc/agoda-hotel-api/examples/get-agoda-hotel-rates-in-claude-via-mcp?fpr=9n7kx3) walks through the setup.

#### Webhooks

For anything custom, attach an [Apify webhook](https://docs.apify.com/platform/integrations/webhooks) to the `ACTOR.RUN.SUCCEEDED` event. When a scheduled run finishes, Apify POSTs the run details, including the dataset ID, to your endpoint, and your code takes it from there: refresh a dashboard, update a sheet, or text you when a rate drops.

### 🔗 Related Tools

Hotel pricing is rarely a one-source question, so these pair well with this API:

- [Tripadvisor API](https://apify.com/johnvc/tripadvisor-api?fpr=9n7kx3) for hotel, restaurant, and attraction reviews when you want a second read on a property before you trust its score
- [Google Hotels Search Scraper](https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3) for aggregated hotel prices across booking sites, which is the other half of a rate parity check
- [Google Flights API](https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3) for the flights half of a trip, on the same monitoring pattern
- [Google Travel Explore API](https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3) for destination discovery before you know where you are pricing
- [Google Maps Places Scraper](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3) for what is actually around a property

Other Agoda Actors exist, and it is worth knowing what you are choosing between. [Fast Agoda Scraper](https://apify.com/knagymate/fast-agoda-scraper?fpr=9n7kx3) is an older one; at the time of writing its Store card shows a run success rate in the mid fifties and a last update in June 2026, which means a meaningful share of runs come back empty. This API is actively maintained, validates your dates before a request leaves the building, and returns the same field set on every row so downstream code does not have to guess.

### Applications of the Agoda API

Ready-to-run examples of this API in action. Open any one and run it in a single click.

#### Get Agoda hotel rates as JSON without an API key

Structured rates for a destination and stay, without applying to a partner programme first.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/get-agoda-hotel-rates-as-json-without-an-api-key?fpr=9n7kx3)

#### Track Agoda hotel prices for a destination and dates

The rate monitoring recipe: same stay, on a schedule, diffing `lowestPricePerNight` run over run.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/track-agoda-hotel-prices-for-a-destination-and-dates?fpr=9n7kx3)

#### Get Agoda hotel rates in Claude via MCP

Add the Actor to [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) or another MCP client and ask for rates in plain language.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/get-agoda-hotel-rates-in-claude-via-mcp?fpr=9n7kx3)

#### Find Agoda hotel rates with free cancellation

Every offer carries its policy, so you can keep only the refundable ones.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/find-agoda-hotel-rates-with-free-cancellation?fpr=9n7kx3)

#### Pull live Agoda rates for a hotel rate parity check

Pin the currency and the point-of-sale country, then compare the same stay against another channel.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/pull-live-agoda-rates-for-a-hotel-rate-parity-check?fpr=9n7kx3)

#### Export Agoda guest reviews to CSV or Excel

Reviews mode with liked and disliked kept apart, ready for a spreadsheet or a sentiment pass.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/export-agoda-guest-reviews-to-csv-or-excel?fpr=9n7kx3)

#### 获取实时酒店房价，用于酒店比价分析 (Live hotel room rates for price comparison, in Chinese)

酒店比价: live nightly rates for a destination and stay, set up for hotel price comparison work.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/agoda-jiudian-bijia-shishi-fangjia?fpr=9n7kx3)

#### 获取酒店评价数据，逐条含评分与酒店回复 (Hotel review data with scores and owner replies, in Chinese)

酒店评价: one row per guest review, with the score, the liked and disliked halves, and any reply from the property.
[Run this task](https://apify.com/johnvc/agoda-hotel-api/examples/agoda-jiudian-pingjia-shuju?fpr=9n7kx3)

### ❓ FAQ

#### How do I use the Agoda API?

Set **Mode** to `search`, give it one or more destinations in `locations`, and set `checkIn` and `checkOut`. That is the whole minimum input. Add `currency` and `country` when the numbers need to be comparable to another source, and use `maxResultsPerInput` to cap how many properties come back. You can run it from the Console, from the [Apify API](https://apify.com/johnvc/agoda-hotel-api/api?fpr=9n7kx3), from an MCP client, or from the [example repo](https://github.com/johnisanerd/Apify-Agoda-Hotel-API).

#### Can I schedule this Agoda Scraper to run automatically?

Yes, and most people should. One run gives you today's rate, which is rarely the question you actually had. Save your input as a [task](https://docs.apify.com/platform/actors/running/tasks), then attach a [schedule](https://docs.apify.com/platform/schedules) from the Actor's **Actions** menu, then **Schedule**. Standard cron applies: `0 7 * * *` runs every morning at 7 AM, `0 */6 * * *` every six hours, `0 9 * * 1` every Monday. One schedule can trigger many tasks at once, so a single "daily rate check" can cover every stay you are watching. The full monitoring recipe, including where to put the results, is in the Integrations section above.

#### Should I use an official API or a web Scraper for hotel data?

An official [API](https://en.wikipedia.org/wiki/API) is the cleanest option when you can get one, but hotel APIs are usually gated behind a partner programme, rate limited, and quota bound, and they often drop the fields you actually wanted. [Web scraping](https://en.wikipedia.org/wiki/Web_scraping) fills that gap, and this Actor sits in between: you get the reliability of a hosted endpoint and the field coverage of a scraper, with no quota to manage and no approval to wait for. You call it, you get JSON, you pay for the rows you got.

#### Can I use this Agoda Scraper through an MCP Server?

Yes. It runs as a tool in any MCP client through the hosted [Apify MCP server](https://mcp.apify.com/). The Actor-specific URL is `https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api`, which works in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), Cursor, and anything else that speaks MCP. See the [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp) for client setup, and the MCP section above for the one-line install command.

#### Can I use this Actor with the Apify API?

Yes. The [Apify API](https://apify.com/johnvc/agoda-hotel-api/api?fpr=9n7kx3) lets you start runs, read run status, and pull dataset items programmatically, and there is an `apify-client` package for both Python and Node.js so you are not hand-rolling HTTP. The Actor's API tab gives you ready-made snippets with your input already filled in.

#### Can I integrate this Agoda Scraper with other apps?

It connects to almost anything through [Apify integrations](https://docs.apify.com/platform/integrations): [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier), [n8n](https://docs.apify.com/platform/integrations/n8n), [Slack](https://docs.apify.com/platform/integrations/slack), Google Drive, and more. For anything not on that list, attach a [webhook](https://docs.apify.com/platform/integrations/webhooks) to `ACTOR.RUN.SUCCEEDED` and handle the run yourself. The Integrations section above has the full recipes.

#### Is this an official Agoda API?

No. This Actor is not affiliated with, endorsed by, or connected to [Agoda](https://www.agoda.com). It collects publicly visible listing and review data and returns it as structured JSON. It is an independent tool and makes no claim of feature parity with Agoda's own partner API.

#### How do I track hotel prices over time?

Run search mode on a schedule with the same destination and dates, and compare `lowestPricePerNight` between runs. Every property also keeps its full offer table, so you can see which room type moved.

#### How do I compare hotel rates across booking sites?

Rates here are quoted for a specific stay, currency, and point-of-sale country. Set `currency` and `country` explicitly so you are comparing like with like against another source.

#### How do I get hotel availability programmatically?

Every property row carries an `available` boolean for the stay you asked about, plus `roomsAvailable` and the `roomRates` table showing what is actually bookable. A property that comes back with `available: false` was checked and had nothing for those nights, which is itself a useful signal when you are watching a sold-out period.

#### Can I get only refundable rates?

The Actor returns all offers with their policies attached, so filter on the `policies` field in `roomRates`. Free-cancellation offers say so there.

#### Why do I need check-in and check-out dates?

Because room rates only exist for a specific stay. A hotel has no single price, it has a price for a set of nights and an occupancy. Without dates there is nothing meaningful to return, so both are required and validated up front.

#### Does the price include taxes and fees?

Each offer says so, in `taxesAndFeesIncluded`. Do not assume it is consistent across offers, because it is not.

#### What is the difference between the two prices on each offer?

`pricePerNight` is what you would pay. `originalPricePerNight` is the pre-discount rate the source displays alongside it. The gap between them is the advertised saving.

#### Can I get reviews and rates in one run?

Not in a single run: rates come from search mode and reviews from reviews mode. Run search first, take the property URLs from the results, then run reviews mode on those.

#### Does it cover properties outside Asia?

Yes. Coverage is strongest across Asia-Pacific, but the source lists properties worldwide and the Actor returns whatever the destination search finds.

#### How much does it cost to scrape hotel rates?

You pay per result, not per run: one charge per property returned with its full rate table, and one per review. Rate tables are free of extra charge no matter how many offers they hold. `maxResultsPerInput` is a hard ceiling on how many results a run can produce, so it doubles as your budget control. Current per-result rates are on the Store card.

#### What do I do if I get no results?

Check the error rows first: any input that produced nothing comes back as a row with `result_type: "error"` and a plain-language `error_message` telling you why. The usual causes are a destination string the search does not recognise, dates in the past, a check-out that is not after the check-in, or a genuinely sold-out stay. Try a broader destination such as the city name on its own, and confirm the dates are in the future.

#### Is it legal to scrape hotel data?

Collecting publicly available data is generally lawful in many jurisdictions, and Apify has a readable overview in [is web scraping legal](https://blog.apify.com/is-web-scraping-legal/). That said, what you do with the data matters more than how you got it, so check your own obligations before republishing prices or reviews, and take your own legal advice for anything commercial.

#### How can I collect hotel data from other travel sites?

Pair this API with the neighbours in the portfolio: [Google Hotels Search Scraper](https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3) for prices aggregated across booking sites, [Tripadvisor API](https://apify.com/johnvc/tripadvisor-api?fpr=9n7kx3) for a second opinion on a property's reviews, and [Google Flights API](https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3) when you need the airfare next to the room rate. The full list is in Related Tools above.

### Resources

- [Example repo: Python quick-start and MCP walkthroughs](https://github.com/johnisanerd/Apify-Agoda-Hotel-API)
- [Actor API tab, with ready-made client snippets](https://apify.com/johnvc/agoda-hotel-api/api?fpr=9n7kx3)
- [Apify platform integrations](https://docs.apify.com/platform/integrations)
- [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp)

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/agoda-hotel-api/issues/open?fpr=9n7kx3).

Last Updated: 2026.08.10

# Actor input Schema

## `mode` (type: `string`):

Search finds properties with live room rates from a destination and dates, and needs no URL. Property collects full detail from hotel URLs. Reviews collects guest reviews from hotel URLs.

## `locations` (type: `array`):

Cities, regions, or landmarks to search, for example "Singapore" or "Bangkok". Used in search mode. Up to 20 per run.

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

Check-in date as YYYY-MM-DD. Required in search mode: room rates only exist for a specific stay.

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

Check-out date as YYYY-MM-DD. Required in search mode, and must be later than check-in.

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

Number of adults, which changes the rates returned.

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

Three-letter currency code for the rates, for example USD or EUR. Leave empty for the source default.

## `country` (type: `string`):

Two-letter country code for the point of sale. Rates can differ by market, so set this if you are comparing like for like.

## `hotelUrls` (type: `array`):

Agoda property URLs, for example https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html. Used in property and reviews modes. Up to 200 per run.

## `maxResultsPerInput` (type: `integer`):

Properties per destination in search mode, or reviews per hotel in reviews mode. You are charged per result returned, so this is also your cost control.

## `sortReviewsBy` (type: `string`):

Optional sort order for reviews mode, passed through to the source, for example 'Most recent' or 'Most helpful'. Leave empty for the source's default order.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Singapore"
  ],
  "checkIn": "2026-09-15",
  "checkOut": "2026-09-18",
  "adults": 2,
  "maxResultsPerInput": 20
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every dataset item from this run.

## `rates` (type: `string`):

Each property with its lowest nightly rate for the requested stay and the full table of bookable offers.

## `properties` (type: `string`):

Property-level view: score, review count, location rating, and facilities.

## `reviews` (type: `string`):

Guest reviews with liked and disliked split apart, nights stayed, and any owner reply.

# 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 = {
    "locations": [
        "Singapore"
    ],
    "checkIn": "2026-09-15",
    "checkOut": "2026-09-18"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/agoda-hotel-api").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 = {
    "locations": ["Singapore"],
    "checkIn": "2026-09-15",
    "checkOut": "2026-09-18",
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/agoda-hotel-api").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 '{
  "locations": [
    "Singapore"
  ],
  "checkIn": "2026-09-15",
  "checkOut": "2026-09-18"
}' |
apify call johnvc/agoda-hotel-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/agoda-hotel-api"
        }
    }
}

```

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/QwAkysoIIBCPz3yc8/builds/vP8o5SX1og3EVkF8l/openapi.json
