# Agoda Search Scraper (`boncross/agoda-search`) Actor

Scrape Agoda search results for any destination and dates. Just add a city, area or Agoda URL and get every property with nightly and stay prices with and without tax, review score, stars, coordinates, cancellation deadline, pay-later, breakfast and rooms left. $4.00 per 1,000 properties.

- **URL**: https://apify.com/boncross/agoda-search.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 property-listeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Agoda Search Scraper

### What is Agoda Search Scraper?

Agoda Search Scraper gives you Agoda's search results as data, with 26 filters to shape them: the 17 on Agoda's own search page, applied by Agoda, and nine more on price, score and availability. You type a city, an area or a landmark, set your dates, and get the properties Agoda is selling for that stay, each priced with and without tax.

Agoda is a major booking site, especially across Asia, and it lists hotels and homes worldwide. A city id or a search URL copied from your browser works as a destination too.

What you get that a plain listing scrape doesn't:

- **Filters that do what they say.** 61 of 61 live checks on the inputs and filters passed on 7 October 2026. Where Agoda's own location and "excellent for" filters let through a property whose card shows a lower score, that row is removed too.
- **Tax on both sides.** Each priced row has the nightly and stay price including every tax and fee, and Agoda's own pre-tax figures beside them. Nothing is calculated.
- **Only real results.** When few properties match, Agoda pads the page with places from a neighbouring town or outside your filters. One measured search had 26 real matches and 17 of these fillers. You get the 26.
- **A feed of what moved.** Name a price memory, switch on "Only new or changed prices", and a scheduled run returns just the properties that are new or repriced. The unchanged ones aren't charged.
- **Speed.** Four cities at 250 properties each, 1,000 rows, took 10 to 12 seconds when Agoda answered promptly.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 66 of 66 live checks on its inputs and filters passed on 7 October 2026
- 7 destinations run the same day in 7 countries: 175 properties, none empty
- Charges checked against the 175 rows
- A place name that matches nothing where you said gets a free row listing what Agoda suggests

In each row you can:

- Read the review score, review count, star rating and property type
- See the crossed-out price and discount message when Agoda discounts a property
- Check the free-cancellation deadline, pay-later and pay-at-hotel eligibility, breakfast and rooms left
- Get what the search card shows beside the price: distance to the city centre, nearby stations and landmarks in metres, the location score, highlights and campaign badges
- Price any party size, children's ages included, in any currency Agoda supports
- Find out why a destination couldn't be reached, from a row that says so

### What data do you get for each property?

| | |
|---|---|
| 🏨 Property name and Agoda id | 🔗 Property URL |
| ⭐ Star rating | Review score and review count |
| 💷 Nightly price and stay total | Prices excluding tax, and whether the price includes tax |
| Crossed-out price and discount message | Currency |
| 📍 Area, city, country and coordinates | Rooms left |
| Free cancellation and its deadline | Pay later and pay at hotel |
| 🍳 Breakfast included | Property type and sponsored flag |
| 🖼 Main image | Highlighted facilities |
| Distance from the city-centre zone | 🚉 Nearby stations and landmarks, in metres |
| Location score and score breakdown | Highlights and campaign badge |
| 📈 Price change since the last run | Timestamp of the scrape |

### How to scrape Agoda search results

It's a form. You don't write any code, and the result downloads as a spreadsheet.

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [Agoda Search Scraper](https://apify.com/boncross/agoda-search).
2. Add one or more destinations: "Paris", "Times Square", "Eiffel Tower", an Agoda city id, or a search URL from your browser.
3. Set your dates and guests, pick a currency and a sort order, and tick the filters you'd tick on Agoda.
4. Click Start. A 10-property search took 3 to 4 seconds in the measured runs below.
5. Download the properties as Excel or CSV, or as JSON, XML or HTML.

### ⬇️ Input

Give it destinations by name: a city ("Paris"), an area ("Times Square", "Sukhumvit") or a landmark ("Eiffel Tower"). An Agoda city id works, and so does a search URL pasted from your browser. City, area and landmark URLs are all read, and a URL's own dates and guests are used for that destination.

Dates are either fixed ("Check-in date" and "Check-out date") or rolling ("Check-in days ahead" and "Nights"), which is what you want on a schedule. The rest is optional.

You have two limits. "Max results per destination" (1 to 5,000, default 100) applies to each destination separately: ten destinations at 50 each returns 500. "Maximum results for the whole run" caps the run as a whole, and nothing past it is fetched or charged for.

**A city for two nights, cheapest first**

```json
{
  "destinations": ["Paris"],
  "checkIn": "2026-11-18",
  "checkOut": "2026-11-20",
  "adults": 2,
  "currency": "USD",
  "sort": "price_low_to_high",
  "maxResultsPerDestination": 100
}
```

**A city, a district and a second city: four and five star hotels with free cancellation**

```json
{
  "destinations": ["Paris", "Times Square", "Bangkok"],
  "checkIn": "2026-11-18",
  "checkOut": "2026-11-20",
  "adults": 2,
  "currency": "USD",
  "sort": "review_score",
  "stars": ["4", "5"],
  "freeCancellationOnly": true,
  "maxResultsPerDestination": 100
}
```

**A rolling window with a price ceiling and a family party**

```json
{
  "destinations": ["Bangkok"],
  "checkInDaysAhead": 30,
  "nights": 3,
  "adults": 2,
  "childrenAges": [7, 4],
  "rooms": 1,
  "currency": "GBP",
  "maxPricePerNight": 150,
  "minReviewScore": 8
}
```

**A daily price monitor that returns only what moved**

```json
{
  "destinations": ["New York"],
  "checkInDaysAhead": 60,
  "nights": 2,
  "currency": "USD",
  "maxResultsPerDestination": 200,
  "priceStoreName": "new-york-prices",
  "onlyNewOrChanged": true
}
```

**Around a landmark, inside the city centre, with a bathtub, free cancellation and payment at the hotel**

```json
{
  "destinations": ["Eiffel Tower"],
  "checkInDaysAhead": 45,
  "nights": 2,
  "distanceToCenter": ["inside"],
  "roomAmenities": ["bathtub"],
  "paymentOptions": ["free_cancellation", "pay_at_hotel"],
  "minLocationScore": "9"
}
```

#### The filters

Tick several values in one filter and you get properties matching any of them, as on the site.

| Field | What it does |
|---|---|
| `stars`, `accommodationTypes`, `hotelBrands`, `hotelName` | Star class (Agoda Luxe included), property type, brand, and part of the property name. Applied by Agoda. |
| `distanceToCenter`, `minLocationScore`, `excellentFor` | Distance to the centre, minimum location rating, and Agoda's "Excellent cleanliness / service / value for money / location / facilities / room quality" filters. Applied by Agoda. |
| `paymentOptions`, `roomOffers`, `kidsStayFree` | Free cancellation, pay later, pay at hotel and the like, room offers such as breakfast or airport transfer, and kids stay free. Applied by Agoda. |
| `propertyFacilities`, `roomAmenities`, `bedTypes`, `goodFor` | Facilities, in-room amenities, bed type, and who the property suits. Applied by Agoda. |
| `minBedrooms`, `minBathrooms`, `minBeds` | For homes and larger parties. Applied by Agoda. |
| `productType` | Hotels, homes, or both. |
| `minReviewScore`, `minReviewCount` | A floor on the guest score and on how many reviews stand behind it. |
| `minPricePerNight`, `maxPricePerNight` | A price band per room per night. |
| `freeCancellationOnly`, `breakfastOnly`, `excludeSponsored` | Keep refundable or breakfast-included offers, and drop sponsored placements. |
| `onlyAvailable` | On by default. Switch it off to include sold-out or unpriced properties. |
| `includeNearbySuggestions` | Off by default. Switch it on to keep Agoda's padding suggestions, each marked `isOutsideSearch`. |
| `sort` | `recommended`, `price_low_to_high`, `price_high_to_low`, `review_score`, `stars_high_to_low`, `stars_low_to_high` or `distance_from_center`. |

#### For developers

- `maxResultsPerDestination` is the per-destination limit and `maxItems` the run-wide one (0 means no limit).
- Agoda returns up to 100 properties per request. A deeper `maxResultsPerDestination` means more requests, read in order.
- `priceStoreName` names the storage that remembers the last price per property. With `onlyNewOrChanged` on, the next run returns only new or moved rows and fills `previousPricePerNight`, `previousScrapedAt`, `priceChange` and `priceChangePct`. Use one name per watchlist.
- `maxConcurrency` (Parallel requests, default 8, 1 to 32) sets how many requests run at once. The default suits nearly every run.
- `delayMs` (Delay between requests, default 0) adds a pause before each request, in milliseconds. Values above 2000 are treated as 2000. We'd leave it at 0.
- Destinations in one run are searched at the same time. Rows are saved as they arrive, and if the platform restarts a run part-way, the properties already delivered are neither repeated nor charged again.
- `input` on each row is the destination exactly as you entered it, which lets you match rows from a long list back to it.

### ⬆️ Output

One row is one property for one stay. You can view the dataset as a table, as JSON or on a map in the Output tab.

```json
{
  "input": "Paris", "destination": "Paris", "destinationType": "city", "destinationCountry": "France", "destinationId": 15470, "destinationCityId": 15470, "isOutsideSearch": false,
  "id": "7266", "hotelId": 7266, "name": "Pullman Paris Tour Eiffel", "localName": "Pullman Paris Tour Eiffel",
  "url": "https://www.agoda.com/pullman-paris-tour-eiffel_11/hotel/paris-fr.html",
  "propertyType": "Hotel", "stars": 4, "isSponsored": false, "sponsoredType": "NoSponsored", "resultType": "NormalProperty",
  "country": "France", "countryCode": "FR", "city": "Paris", "cityId": 15470, "area": "15th - Tour Eiffel - Porte de Versailles", "areaId": 58391,
  "lat": 48.8555908203125, "lng": 2.292680025100708,
  "rating": 8.5, "ratingScale": 10, "reviewCount": 6310,
  "currency": "USD", "checkIn": "2026-11-06", "checkOut": "2026-11-08", "nights": 2,
  "adults": 2, "rooms": 1, "childrenAges": [],
  "isAvailable": true, "isSoldOut": false,
  "pricePerNight": 476.12, "pricePerNightExcludingTax": 418.04, "pricePerNightListed": null,
  "priceTotal": 952.24, "priceTotalExcludingTax": 836.08, "pricesIncludeTax": true,
  "isFreeCancellation": true, "freeCancellationUntil": "2026-11-05", "cancellationType": "FreeCancellation",
  "isPayLater": true, "isPayAtHotel": false, "isNoCreditCard": false, "isBreakfastIncluded": true, "benefitIds": [95, 1],
  "supplierId": 29004, "roomsLeft": 255, "discountMessage": null,
  "distanceToCenterKm": 0, "isInCityCenter": true, "facilities": ["Free Wi-Fi in all rooms!", "Gym/fitness"],
  "highlights": ["Eiffel Tower Balcony Views", "On-site Frame Restaurant"], "campaignBadge": null,
  "nearbyTransport": [{ "name": "Champ de Mars - Tour Eiffel RER Train Station", "distanceM": 259 }, { "name": "Bir-Hakeim Metro Station", "distanceM": 317 }],
  "nearbyLandmarks": [{ "name": "Eiffel Tower", "distanceM": 336 }, { "name": "Champs-Elysees", "distanceM": 1958 }],
  "locationScore": 9.3, "scoreBreakdown": { "cleanliness": 8.7, "facilities": 8.3, "location": 9.3, "roomComfort": 8, "staffPerformance": 8.5, "valueForMoney": 7.9 },
  "image": "https://pix8.agoda.net/hotelImages/7266/0/35abd7670c3765b9d010edaa780a67af.jpeg?va=1&ce=3",
  "engagement": "Booked 16 times today",
  "previousPricePerNight": null, "previousScrapedAt": null, "priceChange": null, "priceChangePct": null,
  "scrapedAt": "2026-10-07T13:12:12.931Z"
}
```

A few columns to know before you build on them:

- `distanceToCenterKm` is how far the property is from the edge of Agoda's city-centre zone. 0 means it's inside, which `isInCityCenter` says outright.
- `propertyType` is Agoda's own class for the listing: `Hotel`, `NonHotel` or `SingleRoom`.
- `facilities` holds the one or two facilities Agoda highlights for the property, not its full list.
- `highlights`, `campaignBadge`, `nearbyTransport`, `nearbyLandmarks` and `locationScore` are what Agoda's search card shows beside the price. `scoreBreakdown` is the guest rating by category.
- `destinationType` says whether a row came from a city, area or landmark search.
- `destinationCountry` is the country of the place your name resolved to. It's null when you gave a city id or a search URL.
- `pricePerNightListed` is the crossed-out price. It's filled only on discounted properties: 4% of rows in a 175-property sample on 7 October 2026.
- The four price-memory columns at the end stay null until a run reuses a price memory an earlier run filled.

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `destination-resolved`, per name resolved to a city | $0.002 | $0.002 | $0.002 | $0.002 |
| `destination-checked`, per destination given as a city id or link that returns no property | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `property-listed`, per property returned | $0.004 | $0.0036 | $0.0024 | $0.0012 |

Enterprise plans pay the Business price.

**$4.00 per 1,000 properties** on the Free plan, $1.20 on Business, with all fields included. That's the whole price: proxy usage and platform usage are part of it.

You pay for the rows you get. A property your filters remove is free, and so is one whose price hasn't changed when "Only new or changed prices" is on. Give a destination as an Agoda city id or a search URL and you skip the $0.002 resolution fee. If such a destination then returns no property at all, because every one was filtered out or nothing moved, it costs the $0.0005 `destination-checked` fee once.

- Three cities by name, 100 properties each: $0.002 + 3 × $0.002 + 300 × $0.004 = **$1.21** per run ($0.37 on Business).
- A daily monitor of one city at 200 properties for a month, where about 40 prices move each day: 30 × ($0.002 + $0.002 + 40 × $0.004) = **$4.92** for the month ($1.56 on Business).

The $5 of credits in Apify's Free plan each month covers about 12 searches of 100 properties each, roughly 1,200 properties, before you pay anything.

### How many properties can you get, and how fast?

| Run | Result |
|---|---|
| Osaka, 2 nights, USD, 10 properties | 10 properties from one request in 3 to 4 seconds, each priced, with URL and coordinates |
| Osaka, 2 nights, APA Hotels only, up to 30 | 27 properties from one request in 6 seconds |
| Bangkok, 2 nights, 100 properties | 100 properties, 6 of them sponsored placements |
| Osaka, Bangkok, Rome and Tokyo, 250 properties each | 1,000 properties in 10 to 12 seconds when Agoda answers promptly, 1 to 2 minutes in a busy hour |
| Bangkok, Tokyo, Paris and New York, 500 properties each | 2,000 properties in 23 to 56 seconds, depending on how fast Agoda answers |

These are whole runs on Apify, measured on 1 and 2 October 2026. Agoda's own response time varies by the hour, and an occasional slow answer can add up to a minute.

Agoda returns up to 100 properties per request and a large city has thousands. "Max results per destination" (up to 5,000) decides how deep you go. Adding cities adds little time, because they're searched together. At the measured rates a one-hour run lists well over 100,000 properties.

### Price monitoring, your own code and AI agents

The setup we'd recommend for rate shopping is the daily monitor: an Apify Schedule, a rolling check-in date, a price memory name and "Only new or changed prices". Each morning's dataset then holds only the hotels that moved, with the previous price and the change in money and percent. A webhook can push that into your revenue system, or the Google Sheets and Slack integrations can pass it to a team.

People also use the full list for market research on pricing and supply by area or star class, for building a hotel database with coordinates and review scores, for tracking discount depth and free-cancellation availability across a city, and for feeding metasearch or pricing models with dated inventory.

From code, one call runs a search and returns the rows:

```
POST https://api.apify.com/v2/acts/boncross~agoda-search/run-sync-get-dataset-items?token=YOUR_TOKEN
```

There's an `apify-client` package for Node.js and for Python. For an AI agent in Claude, ChatGPT, Cursor or LibreChat, add the Apify MCP server (`mcp.apify.com`) and reference the actor as `boncross/agoda-search`. The agent sends the destination and dates and gets the priced list back.

### FAQ

#### Do I need proxies or an Agoda account?

Neither. Proxy usage is included in the price with nothing to set up, and the actor reads what Agoda shows a visitor who isn't signed in.

#### Are the prices tax-inclusive?

`pricePerNight` and `priceTotal` include every tax and fee, including any Agoda lists as paid at the property, and `pricesIncludeTax` is true on each priced row (null on a row with no price). `pricePerNightExcludingTax` and `priceTotalExcludingTax` are Agoda's own pre-tax figures for the same offer.

#### How do I search a district or a landmark and not the whole city?

Type its name, for example "Times Square" or "Eiffel Tower", or paste the Agoda search URL for it. An area is searched inside its city with Agoda's own area filter, and results stay inside the district. A landmark is searched the way Agoda's landmark page searches it, around the landmark.

#### My destination landed in the wrong place. What happened?

A name is read the way Agoda's own search box reads it, and some names exist in more than one country. Say which you mean with the city or country after a comma: "Montmartre, Paris", "Cambridge, MA", "Soho, London". If nothing Agoda suggests is in the place you named, you get an `error` row listing what it does suggest, and you aren't charged for it. An Agoda city id or a search URL names its place exactly and is searched as given. `destination`, `destinationType` and `destinationCountry` on each row show the place that was searched.

#### Why did a search return fewer properties than I asked for?

Usually because that's all there is. When fewer properties match than fit on a page, Agoda fills the rest with suggestions that don't match, such as places in a neighbouring town or hotels outside your filters. Those are left out. Switch on "Include nearby suggestions" if you want them, each marked `isOutsideSearch: true`.

#### How do I get only the prices that changed?

Give "Price memory store" a name and switch on "Only new or changed prices". The actor remembers the last price for each property and returns only new or moved rows on the next run. Unchanged properties aren't charged. A destination given as a city id or link where nothing changed costs the $0.0005 `destination-checked` fee alone.

#### Can I get the room name, or more than the cheapest offer?

Not from search. Agoda's search results hold each property's cheapest offer and don't name the room. [Agoda Room Rates Scraper](https://apify.com/boncross/agoda-room-rates) returns the full grid of rooms and rate plans for the hotels you pick.

#### Is it legal to scrape Agoda?

The actor reads only what Agoda serves to any logged-out visitor, and hotel prices are public commercial data, not personal data. You're responsible for complying with Agoda's terms and applicable law in how you use the data.

#### What are the limits?

- Prices are Agoda's public rates. Member-only rates need a login and aren't included.
- With the cheapest-first or dearest-first sort, Agoda returns the cheapest (or dearest) properties but only roughly in that order. It ranks on its own display price, which can differ from the rate in the row.
- "Rated excellent for" with room quality is Agoda's filter alone. The card has no room-quality score to check it against.
- "Room offers" keeps properties that have a room offer with what you asked for. The price in the row is the cheapest offer, which may not include it.
- Sponsored placements are included unless you switch on "Exclude sponsored listings". They were 6 rows in 100 in a measured Bangkok search, and `sponsoredType` says which kind of placement paid for the position.
- Agoda's own accommodation type label isn't returned per row. `propertyType` is the class that's available. The "Property types" filter still works, because Agoda applies it.
- `facilities` is the one or two facilities Agoda highlights, not the complete list.

### More from BonCross

- [Agoda Reviews Scraper](https://apify.com/boncross/agoda-reviews): Agoda hotel reviews, including the Booking.com reviews Agoda shows.
- [Booking.com Hotel Search Scraper](https://apify.com/boncross/booking-hotel-search): Every hotel Booking.com is selling for a destination and your dates.
- [Expedia Hotel Search Scraper](https://apify.com/boncross/expedia-hotel-search): Every hotel Expedia and Hotels.com list for a destination and your dates.
- [Google Hotels Search Scraper](https://apify.com/boncross/google-hotels-search): Google Hotels prices for a whole city or map area.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.
- [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews): Every Booking.com guest review for any hotel.

### Your feedback

Seen a price that doesn't match Agoda's page, or a filter that let the wrong hotel through? Tell us on the Issues tab in Apify Console, with the destination and dates you used. We read every issue and answer there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/agoda-search/changelog.md

# Actor input Schema

## `destinations` (type: `array`):

Where to search: a city ("Paris", "Bangkok"), an area or district ("Times Square", "Sukhumvit"), or a landmark ("Eiffel Tower"), by name; an Agoda city id; or an Agoda search URL copied from your browser: city, area and landmark searches all work, and a URL's own dates and guests are used for it.

## `maxResultsPerDestination` (type: `integer`):

Stop after this many properties per destination. Agoda gives up to 100 per request and big cities have thousands.

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

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

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

Check-in date as YYYY-MM-DD. Leave empty to use the days-ahead field instead. The lowercase spelling checkin still works.

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

Check-out date as YYYY-MM-DD. Leave empty to use Nights. The lowercase spelling checkout still works.

## `checkInDaysAhead` (type: `integer`):

How many days from today to check in. Only used when Check-in is empty. Handy for schedules.

## `nights` (type: `integer`):

Length of stay. Only used when Check-out is empty.

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

Adults per room.

## `childrenAges` (type: `array`):

One age per child.

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

How many rooms.

## `sort` (type: `string`):

Agoda's own orderings. "Closest to the centre first" puts properties inside Agoda's city-centre zone first, then the rest by distance from it.

## `stars` (type: `array`):

Keep only these star classes. Agoda Luxe is Agoda's own label for top-rated luxury stays. Applied by Agoda.

## `accommodationTypes` (type: `array`):

Keep only these property types. Applied by Agoda.

## `distanceToCenter` (type: `array`):

Keep only properties this far from the city centre. Choose several to combine them.

## `paymentOptions` (type: `array`):

Keep only properties offering these ways to pay. Free cancellation is also available on its own below.

## `roomOffers` (type: `array`):

Keep only properties with a room offer including these.

## `propertyFacilities` (type: `array`):

Keep only properties with these facilities.

## `roomAmenities` (type: `array`):

Keep only properties with a room that has these amenities.

## `bedTypes` (type: `array`):

Keep only properties with a room with one of these beds.

## `goodFor` (type: `array`):

Agoda's "Looking for something special?" labels.

## `minLocationScore` (type: `string`):

Keep only properties whose guests rate the location at least this well.

## `excellentFor` (type: `array`):

Agoda's "Excellent …" review filters: keep only properties whose guests rate them 8 or more for each aspect ticked. Ticking several means all of them.

## `kidsStayFree` (type: `boolean`):

Keep only properties where children stay free. Add the children's ages under Dates and guests, or there is no child for it to apply to.

## `minBedrooms` (type: `integer`):

Keep only homes and apartments with at least this many bedrooms. 0 turns it off.

## `minBathrooms` (type: `integer`):

Keep only properties with at least this many bathrooms. 0 turns it off.

## `minBeds` (type: `integer`):

Keep only properties with at least this many beds. 0 turns it off.

## `hotelBrands` (type: `array`):

Keep only these hotel brands, by name ("APA Hotels", "Toyoko Inn") as Agoda lists them for the destination. A name that matches no brand there is reported in the log.

## `hotelName` (type: `string`):

Keep only properties whose name contains this text, as Agoda's own name search box matches it (any part of the name, upper or lower case).

## `includeNearbySuggestions` (type: `boolean`):

When fewer properties match than a page holds, Agoda adds suggestions that do not match your search, such as places in a neighbouring town. They are left out by default. Switch this on to include them, marked isOutsideSearch.

## `productType` (type: `string`):

all, hotels, or homes for Agoda Homes rentals.

## `minReviewScore` (type: `number`):

Minimum Agoda score out of 10. From 6 upwards Agoda applies it as a band (6 Good, 7 Very good, 8 Excellent, 9 Exceptional) and the actor then applies the exact number. 0 turns it off.

## `minReviewCount` (type: `integer`):

Minimum number of reviews. 0 turns it off.

## `freeCancellationOnly` (type: `boolean`):

Only properties whose cheapest offer is refundable. Applied by Agoda.

## `breakfastOnly` (type: `boolean`):

Only properties whose cheapest offer includes breakfast.

## `minPricePerNight` (type: `number`):

In the selected currency. 0 turns it off.

## `maxPricePerNight` (type: `number`):

In the selected currency. 0 turns it off.

## `excludeSponsored` (type: `boolean`):

Drop Agoda's paid placements.

## `onlyAvailable` (type: `boolean`):

Drop properties that are sold out or unpriced for the dates.

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

ISO currency code. Agoda quotes in it directly.

## `priceStoreName` (type: `string`):

Name of a key-value store. The actor remembers each property's nightly price for the dates, occupancy and currency, and fills previousPricePerNight and priceChange on the next run.

## `onlyNewOrChanged` (type: `boolean`):

With a price store set, skip properties whose price has not moved. Skipped properties are not charged.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.

## Actor input object example

```json
{
  "destinations": [
    "Paris"
  ],
  "maxResultsPerDestination": 100,
  "maxItems": 0,
  "checkIn": "",
  "checkOut": "",
  "checkInDaysAhead": 30,
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "sort": "recommended",
  "stars": [],
  "accommodationTypes": [],
  "distanceToCenter": [],
  "paymentOptions": [],
  "roomOffers": [],
  "propertyFacilities": [],
  "roomAmenities": [],
  "bedTypes": [],
  "goodFor": [],
  "minLocationScore": "any",
  "excellentFor": [],
  "kidsStayFree": false,
  "minBedrooms": 0,
  "minBathrooms": 0,
  "minBeds": 0,
  "hotelBrands": [],
  "hotelName": "",
  "includeNearbySuggestions": false,
  "productType": "all",
  "minReviewScore": 0,
  "minReviewCount": 0,
  "freeCancellationOnly": false,
  "breakfastOnly": false,
  "minPricePerNight": 0,
  "maxPricePerNight": 0,
  "excludeSponsored": false,
  "onlyAvailable": true,
  "currency": "USD",
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "maxConcurrency": 8,
  "delayMs": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Agoda search results: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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 = {
    "destinations": [
        "Paris"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/agoda-search").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 = { "destinations": ["Paris"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/agoda-search").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 '{
  "destinations": [
    "Paris"
  ]
}' |
apify call boncross/agoda-search --silent --output-dataset

```

## MCP server setup

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

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/aqm7L3vOqt6Kov85Z/builds/OuSW9Wzd9eTof74qW/openapi.json
