# Agoda Activities Scraper (`aboo.script/agoda-scraper`) Actor

\[💰$3 / 1K] ⚡ Fast, cheap Agoda Activities scraper. No login, no API key. Tours, attractions, tickets, transfers, eSIMs by city, keyword or URL in 60 currencies: every package with price and time slot, 30-day price calendar, rating, reviews, bookings, photos, GPS.

- **URL**: https://apify.com/aboo.script/agoda-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 results

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

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

## What's an Apify Actor?

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 Activities Scraper

![Agoda Activities Scraper](https://i.ibb.co/SwQDktMR/agoda-banner.png)

**Agoda Activities Scraper** extracts tours, attractions, tickets, transfers, and eSIMs from [Agoda Activities](https://www.agoda.com/activities) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Type a city name or keyword, or paste an Agoda Activities search or activity page, and get one row per activity with its location, categories, rating, reviews, bookings, photos, price, every package option with its own price and time slot, and a 30-day price calendar. No account or login required.

### Introduction

[Agoda](https://www.agoda.com/) is one of the largest online travel agencies in Asia. Agoda Activities lists tens of thousands of things to do around the world: theme park and museum tickets, city tours, desert safaris, cruises, airport transfers, SIM cards, and more, often with several packages and time slots per activity.

This Agoda scraper turns those listings into a ready-to-use dataset. Use it as an Agoda Activities API alternative: compare prices across packages and dates, track discounts, or build a catalog of things to do in any city.

### What data can you extract from Agoda Activities?

- 🎟️ Activity title, ID, and URL
- 📍 City, country, address, postal code, and GPS coordinates
- 🗂️ Categories and subcategories (Attractions, Tours, Food and Drinks, Transportation, and more)
- 📝 Description, highlight, and additional information (overview, what to expect, rules)
- ⭐ Rating, review count, booking count, and badges such as Best Seller or Instant Confirmation
- ⏱️ Duration
- 🖼️ Main image and the full photo gallery
- 💰 Lowest price, original price, discount, and currency
- ✅ Cancellation policy, free cancellation, and instant confirmation
- 🕒 Opening hours notes
- 📦 Every package option for the travel date: title, description, type, time slot, price, original price, price unit (adult, child, person, ticket), seats left, minimum and maximum travelers, traveler types with ages, cancellation, provider, inclusions, and exclusions
- 📅 Price calendar: the lowest price and availability for each of the next 30 days

### Use Cases

- 💹 **Price monitoring**: track activity and package prices across dates and currencies.
- 🧭 **Travel apps and itineraries**: build a catalog of things to do per city with photos, ratings, and prices.
- 📊 **Market research**: compare categories, providers, discounts, and bookings across destinations.
- 🏷️ **Competitor analysis for tour operators**: see how similar tours are packaged and priced.
- 🤖 **AI and recommendation datasets**: train models on descriptions, categories, and traveler ratings.

### How to scrape Agoda Activities step by step

1. Type city names or keywords into **Search activities**, or paste Agoda Activities URLs into **Start URLs**.
2. Set **Maximum number of activities** per search or URL.
3. Pick the **Currency**, and optionally a **Travel date** and search filters.
4. Click **Start** and wait for the run to finish.
5. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Agoda Activities URLs. Supported pages:
  - A city search page, with any filters you set on Agoda (category, subcategory, duration, price, rating, free cancellation, instant confirmation, sort), such as `https://www.agoda.com/activities/search?cityId=2994&category=3`. A `page` parameter starts from that page.
  - A keyword search page, such as `https://www.agoda.com/activities/search?keyword=desert%20safari`.
  - An activity page, such as `https://www.agoda.com/activities/detail?activityId=1033770`.
- **Search activities**: city names (Dubai, Bali, Bangkok) or keywords (desert safari, Universal Studios). A city name returns every activity of that city; other text uses the Agoda keyword search.
- **Maximum number of activities**: how many activities to collect for each start URL or search. Set 0 to get every activity.
- **Include details and packages**: on by default. Turn it off for a faster list with the main price only (no photo gallery, packages, or price calendar).
- **Currency**: currency of all prices (60 currencies). A `currency` in a start URL is used for that URL.
- **Travel date**: date of the package prices and the start of the price calendar. Leave it empty to use the first day each activity can be booked.
- **Search filters** (for search queries): category, duration, minimum and maximum price, minimum rating, free cancellation only, instant confirmation only, and sort order. Start URLs keep the filters of their own URL.

You can use start URLs, searches, or both in the same run.

### Input Examples

Scrape attractions in Dubai and activities in Bali:

```json
{
  "startUrls": [
    { "url": "https://www.agoda.com/activities/search?cityId=2994&category=3" }
  ],
  "searchQueries": ["Bali"],
  "maxResults": 5,
  "includeDetails": true,
  "currency": "USD",
  "freeCancellation": false,
  "instantConfirmation": false,
  "sort": "recommended"
}
```

Find tours with free cancellation for a travel date, cheapest first:

```json
{
  "searchQueries": ["Bangkok"],
  "maxResults": 20,
  "includeDetails": true,
  "currency": "EUR",
  "travelDate": "2026-12-20",
  "category": "Tours",
  "freeCancellation": true,
  "sort": "priceLowToHigh"
}
```

### Output

Each activity is saved as one item in the dataset. Here is an example of a single item (long text and lists are shortened):

```json
{
  "url": "https://www.agoda.com/activities/detail?activityId=1664154&currency=USD",
  "id": 1664154,
  "title": "Dubai Miracle Garden Ticket",
  "city": "Dubai",
  "cityId": 2994,
  "country": "United Arab Emirates",
  "address": null,
  "postalCode": null,
  "latitude": null,
  "longitude": null,
  "categories": ["Attractions"],
  "subcategories": [],
  "description": "Opened in 2013 on Dubai’s outskirts, Dubai Miracle Garden spreads across about 72,000 square meters and is described as the world’s largest natural flower garden. Visitors walk amo...",
  "highlight": null,
  "rating": null,
  "reviewCount": 0,
  "bookingCount": 6906,
  "badges": ["Instant Confirmation", "Free Cancellation"],
  "durationMinutes": 360,
  "durationMaxMinutes": null,
  "imageUrl": "https://pix6.agoda.net/generic/9e70db05ba67d5bae180c4c2ea764f04.jpeg?ce=0",
  "images": [
    "https://pix6.agoda.net/generic/9e70db05ba67d5bae180c4c2ea764f04.jpeg?ce=0",
    "https://pix6.agoda.net/generic/3d447e3195b395bb82c7e4053f369b44.jpeg?ce=0"
  ],
  "currency": "USD",
  "price": 8.94,
  "originalPrice": 10.94,
  "discountPercent": null,
  "cancellation": "Free Cancellation",
  "freeCancellation": true,
  "instantConfirmation": true,
  "additionalInfo": "Overview\nDubai Miracle Garden is a 72,000sqm floral attraction built as a lush oasis in the desert. Themed gardens, pathways, structures, and water features are...",
  "operatingHours": [
    {
      "day": "All Days",
      "description": "Please refer to your voucher for final information regarding meeting points, pick-up locations, and pick-up time"
    }
  ],
  "travelDate": "2026-10-16",
  "packages": [
    {
      "packageId": 2374150,
      "title": "Butterfly Garden - Dubai",
      "description": "Miracle Garden Dubai How to Redeem Please download your ticket from the dashboard Present it at the venue for scanning (...",
      "packageType": "Admission tickets",
      "time": null,
      "price": 8.94,
      "originalPrice": 10.94,
      "priceUnit": "Adult",
      "currency": "USD",
      "availableQuantity": null,
      "minTravelers": 1,
      "maxTravelers": 198,
      "travelerTypes": [
        { "label": "Adult", "minAge": 13, "maxAge": 99 },
        { "label": "Child", "minAge": 3, "maxAge": 12 }
      ],
      "cancellation": "Non Refundable",
      "freeCancellation": false,
      "instantConfirmation": false,
      "mostBooked": false,
      "durationMinutes": null,
      "provider": "Kkday",
      "inclusions": [
        "Access to the butterfly garden to observe a variety of butterfly species.",
        "Well-maintained walking paths and seating areas for relaxation."
      ],
      "exclusions": ["All personal expenses spend for shopping, dining etc on-site."]
    }
  ],
  "priceCalendar": [
    { "date": "2026-10-16", "price": 8.94, "available": true },
    { "date": "2026-10-17", "price": 8.94, "available": true },
    { "date": "2026-10-18", "price": 8.94, "available": true }
  ]
}
```

With **Include details and packages** turned off, the same fields are returned from the search results, with an empty package list, price calendar, photo gallery of one image, and no additional information.

You can download the dataset in JSON, CSV, Excel, XML, or HTML, or access it through the Apify API.

### Notes

- Only Agoda Activities search and activity pages are supported. Other URLs (for example hotel pages or the Activities home page) are skipped with a warning.
- Agoda shows at most 1,000 results for a keyword search. A city name in **Search activities**, or a city search URL, returns every activity of the city (for example more than 6,500 in Dubai).
- Package prices are the prices Agoda shows by default for each option (usually per adult, per person, or per ticket) on the travel date.
- Without a travel date, packages are read for the first day each activity can be booked; same-day booking is often closed, so this can be tomorrow.
- Agoda sorts city results by its own ranking, which can start with regional SIM cards or eSIMs.
- Missing values are returned as `null` or an empty list; for example, many activities have no exact address or map position.
- An activity reached from several start URLs or searches is saved only once.
- Need reviews, prices per traveler type, or other data without these limits? Ask for a custom version using the contact below.

### Why use the Agoda Activities Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 📦 **Every package, not just the cheapest**: each option with its price, time slot, seats left, and inclusions.
- 📅 **30-day price calendar** for every activity.
- 🌍 **Any city, 60 currencies**: search by city name or keyword, with Agoda's own filters.
- ⚡ **Fast list mode**: turn off details for quick price and rating lists of whole cities.
- 🔄 **Ready for automation**: schedule runs, export to Google Sheets, or connect to Make, Zapier, and n8n.

### FAQ

#### How many activities can I scrape?

As many as Agoda lists. Type a city name in **Search activities** and set **Maximum number of activities** to 0 to get every activity of that city.

#### Can I get prices for a specific date?

Yes. Set **Travel date** and every package price is read for that day. The price calendar also starts on that date.

#### Do I need an Agoda account?

No. The actor only collects publicly available data. You do not need to log in or provide any account details.

#### Can I scrape data on a schedule?

Yes. Use Apify Schedules to run the actor every day or week and track price changes automatically.

#### Can I get a custom or private version?

Yes. The actor can be customized for your workflow, delivered as a private version, or a new scraper can be built for a different website. Use the contact details below.

### Need to scrape other travel and event data?

- [Ticketmaster Scraper](https://apify.com/aboo.script/ticketmaster-scraper): concerts, sports, theater, and other events from Ticketmaster with dates, venues, and ticket prices.

***

**Need help or want a custom solution?**

- 📧 Email: aboo.script@gmail.com
- 🧩 More scrapers: [Apify profile](https://apify.com/aboo.script)

### Image Credit

Image credit: [Agoda](https://www.agoda.com/)

# Actor input Schema

## `startUrls` (type: `array`):

Agoda Activities URLs: a city search page with any filters (https://www.agoda.com/activities/search?cityId=2994\&category=3), a keyword search (https://www.agoda.com/activities/search?keyword=desert%20safari), or an activity page (https://www.agoda.com/activities/detail?activityId=1033770).

## `searchQueries` (type: `array`):

City names (Dubai, Bali, Bangkok) or keywords (desert safari, Universal Studios). A city name returns every activity of that city; other text uses the Agoda keyword search.

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

Maximum number of activities to scrape per start URL or search query. Set 0 to get every activity.

## `includeDetails` (type: `boolean`):

Open every activity for all photos, subcategories, highlights, additional information, opening hours, every package option with its price for the travel date, and a 30-day price calendar. Turn off for a faster list with the main price only.

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

Currency of all prices. A currency in a start URL is used for that URL.

## `travelDate` (type: `string`):

Date of the package prices and the start of the price calendar. Leave empty to use the first available day of each activity.

## `category` (type: `string`):

Only activities of this category.

## `duration` (type: `string`):

Only activities with this duration.

## `minPrice` (type: `integer`):

Lowest price, in the selected currency.

## `maxPrice` (type: `integer`):

Highest price, in the selected currency.

## `minRating` (type: `integer`):

Only activities rated at least this score (1 to 5).

## `freeCancellation` (type: `boolean`):

Only activities with free cancellation.

## `instantConfirmation` (type: `boolean`):

Only activities with instant confirmation.

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

Order of the results.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.agoda.com/activities/search?cityId=2994&category=3"
    }
  ],
  "searchQueries": [
    "Bali"
  ],
  "maxResults": 5,
  "includeDetails": true,
  "currency": "USD",
  "freeCancellation": false,
  "instantConfirmation": false,
  "sort": "recommended"
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.agoda.com/activities/search?cityId=2994&category=3"
        }
    ],
    "searchQueries": [
        "Bali"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/agoda-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 = {
    "startUrls": [{ "url": "https://www.agoda.com/activities/search?cityId=2994&category=3" }],
    "searchQueries": ["Bali"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.agoda.com/activities/search?cityId=2994&category=3"
    }
  ],
  "searchQueries": [
    "Bali"
  ]
}' |
apify call aboo.script/agoda-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sqZcA5ELxnxa3fuaT/builds/gV5wYYfXsSaNta73W/openapi.json
