# Traveloka Hotel Reviews Scraper - Guest Ratings & Replies (`factden/traveloka-hotel-reviews-scraper`) Actor

Scrape Traveloka hotel & activity reviews - guest reviews, 1-10 ratings, category sub-scores, owner replies, reviewer data, photos and full timestamps, with LLM-ready markdown. Structured JSON/CSV for analytics, AI and market research. No login.

- **URL**: https://apify.com/factden/traveloka-hotel-reviews-scraper.md
- **Developed by:** [Factden](https://apify.com/factden) (community)
- **Categories:** Travel, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reviews

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?

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

## Traveloka Hotel & Activity Reviews Scraper (September 2026)

Extract guest reviews from **Traveloka hotels** and **Traveloka Xperience activities** in a single run - no login, no
proxy setup, no code required.

> **From $4 per 1,000 reviews** (drops to **$1.50 / 1,000** on higher Apify plans) · effectively-free $0.00005 start
> fee · New Apify users get **~1,250 reviews free** with the $5 platform credit.

**▶ Watch the 60-second walkthrough:** https://www.youtube.com/watch?v=NhIrJ8fyfg8

**Contents**: [What's different](#whats-different) · [Who it's for](#who-this-scraper-is-for) ·
[Use cases](#common-use-cases) · [Step by step](#how-to-scrape-traveloka-reviews---step-by-step) · [Input](#input) ·
[Output](#output) · [Pricing](#pricing) · [Schedule](#how-to-run-this-traveloka-reviews-api-on-a-schedule) ·
[AI agents & RAG](#ai-agents--rag---using-the-data-with-llms) · [GDPR](#data-sources--gdpr) · [FAQ](#faq) ·
[Changelog](#changelog) · [Support](#support--maintenance)

***

### What's different

Two things no other Apify actor for Traveloka does today:

- **Hotels and activities in one run.** Add Traveloka `/hotel/…` URLs and Traveloka Xperience
  `/activities/…/product/…` URLs together - the actor returns each listing's full review set from the same run.
  Most Traveloka scrapers do hotels only; Traveloka's huge attractions, tours, and experiences catalog (theme parks,
  water parks, day tours) is left on the table. This actor reads both.
- **Original text *and* English machine translation, per review.** Traveloka reviews are mostly Bahasa Indonesia,
  Thai, and Vietnamese. Each row carries the original body **and** an English translation (`isMachineTranslated`
  flags it), so a non-Indonesian analyst can use the data directly - no separate translation step.

**Plus:**

- **Every native Traveloka review**, paginated to completion (or to your `maxReviews` cap), on Traveloka's
  **10-point scale**, matching the website exactly.
- **Owner/management responses** (translated + original + responder name + date).
- **Reviewer profile**, **trip type** (Business / Family / Staycation / Romantic / …), helpful-reaction count, and
  attached photo URLs.
- **Hotel-level category sub-ratings** (cleanliness, comfort, food, location, service) on the per-listing summary.
- **LLM-ready `markdownContent`** per review - a self-contained chunk ready for direct vector-DB / RAG ingestion.

**No-setup checklist:**

- No login or account required
- Apify Proxy bundled (Residential by default for clean routing to Traveloka)
- No code required (form-based input in the Apify Console)
- Pay-per-event pricing - no subscription, no commitment

***

### What does this scraper do?

You paste hotel or activity URLs (mix freely, up to 500 per run). The actor returns two structured datasets:

**Reviews dataset** - one row per guest review:

- Core: `overallRating` (10-point), `travelType`, `submittedAt`, `productType` (`hotel` or `activity`)
- Text: `reviewText` (original) + `reviewTextTranslated` (English) + `isMachineTranslated`
- Reviewer: `reviewer.name`, `reviewer.reviewerId`, `reviewer.isAnonymous`, `reviewer.photoUrl`
- Management response: `ownerResponse.text`, `ownerResponse.textOriginal`, `ownerResponse.replierName`,
  `ownerResponse.date`
- Media & engagement: `usefulCount`, `imagesCount`, `imageUrls`, `hasVideo`
- AI-ready: `markdownContent` - self-contained per-review markdown block, direct vector-DB input

**Listings dataset** - one summary row per hotel/activity: aggregate rating, rating band, total review count,
category sub-ratings (hotels), partner-source count, and completeness percentage.

Both datasets are accessible via the Output-tab dropdown - see [Output](#output).

***

### Why this scraper (vs the official API and other Apify scrapers)

Traveloka publishes **no public reviews API** - scraping the public review data is the only way to get it at scale.
Among the Apify actors that do, this is the only one that reads **hotels and activities in a single run** and keeps
the per-review depth most others drop:

| Capability | **This actor** | Other Apify Traveloka scrapers | Official API |
|---|---|---|---|
| Traveloka **hotel** reviews | ✅ | ✅ (most) | ❌ none |
| **Traveloka Xperience activity** reviews (same run) | ✅ | ❌ hotels-only | ❌ |
| Original text **+ English machine translation** | ✅ both | ❌ original only | ❌ |
| Hotel-level category sub-ratings (cleanliness / comfort / food / location / service) | ✅ | varies | ❌ |
| Owner / management responses | ✅ | varies | ❌ |
| Reviewer profile + trip type + photo URLs | ✅ | varies | ❌ |
| LLM-ready `markdownContent` per review | ✅ | ❌ | ❌ |
| No login, proxy, or anti-bot setup | ✅ | ✅ | n/a |
| Pricing | from $5 / 1,000 reviews (to $2 on higher plans) | varies | n/a |

The headline difference is **activities coverage**: hotels-only tools ignore Traveloka Xperience entirely, while this
actor reads theme parks, water parks, tours, and attractions with the same schema - so you can analyze a resort and
the nearby water park in one dataset.

***

### Who this scraper is for

- **Hotel revenue & reputation managers** tracking competitor properties' rating trends and category sub-ratings on
  Traveloka across Indonesia and Southeast Asia.
- **Attractions & experiences operators** (theme parks, tours, activities) monitoring guest sentiment on Traveloka
  Xperience - a segment most scrapers can't reach.
- **AI / RAG engineers** ingesting reviews into vector databases - `markdownContent` is chunk-ready, and the English
  translation means multilingual reviews are usable without a separate pipeline.
- **Market researchers** filtering by `travelType`, rating, and date for ICP-scoped Southeast-Asia travel datasets.
- **Brand reputation teams** monitoring `ownerResponse` coverage and rating movements across a portfolio.

***

### Common use cases

#### 1. Daily sentiment monitoring for a hotel portfolio

```json
{
  "startUrls": [
    "https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155",
    "https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272"
  ],
  "maxReviews": 50,
  "sortBy": "mostRecent",
  "fromDate": "2026-08-01"
}
```

Pair with the [Schedule](#how-to-run-this-traveloka-reviews-api-on-a-schedule) section to run nightly with `fromDate`
set to yesterday.

#### 2. Negative-review mining for a competitor analysis

```json
{
  "startUrls": ["https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272"],
  "maxReviews": 500,
  "sortBy": "mostRecent",
  "minRating": 1,
  "maxRating": 5
}
```

Cap the rating at 5 (on the 10-point scale) to surface only the reviews rated 5/10 or lower - the painful ones.
`ownerResponse.text` shows how the hotel handles complaints.

#### 3. Attraction / experience intelligence (Traveloka Xperience)

```json
{
  "startUrls": [
    "https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383"
  ],
  "maxReviews": 200,
  "sortBy": "mostRelevant"
}
```

Activity rows use the same schema as hotels (`productType: "activity"`), so theme-park and tour reviews slot straight
into the same analysis - a segment hotels-only scrapers can't touch.

#### 4. Backfill a full review history for AI / RAG ingestion

```json
{
  "startUrls": ["https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272"],
  "maxReviews": 5000,
  "sortBy": "mostRelevant"
}
```

The `markdownContent` field on each row is a self-contained chunk - original text, English translation, rating, trip
type, and owner reply inlined - ready for direct embedding. See
[AI agents & RAG](#ai-agents--rag---using-the-data-with-llms).

***

### How to scrape Traveloka reviews - step by step

1. Click **Try for free** on this actor's Apify Store page.
2. Paste one or more Traveloka **hotel** or **activity** URLs into **Start URLs** (mix freely; up to 500 per run).
3. Set `maxReviews`, `fromDate`, `minRating` / `maxRating`, and `sortBy` as needed.
4. Click **Start**. Results stream into the Output tab in real time.
5. Switch the Output-tab dropdown between **Reviews** and **Listings** to inspect either dataset. Download as JSON,
   CSV, or Excel.

`completenessPct` on the Listings dataset tracks how much of each listing's exposed reviews you retrieved. See
[Pricing](#pricing) below for per-event rates and the tiered discount ladder.

#### Where to find a Traveloka URL

Open any hotel or activity on [traveloka.com](https://www.traveloka.com) and copy the address bar. Both shapes work:

- Hotel: `https://www.traveloka.com/en-en/hotel/{country}/{name}-{id}`
- Activity: `https://www.traveloka.com/en-en/activities/{country}/product/{name}-{id}`

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array of URL | (prefilled) | Traveloka hotel or activity URLs. Mix freely. Max 500. |
| `maxReviews` | integer | 200 | Max reviews per listing (1–5,000) |
| `sortBy` | enum | `mostRecent` | `mostRecent` / `mostRelevant` / `mostHelpful` |
| `fromDate` | date | - | YYYY-MM-DD; only reviews submitted on or after this date |
| `minRating` | integer | 1 | 1–10 (Traveloka's 10-point scale) |
| `maxRating` | integer | 10 | 1–10; the default 10 means no cap. Set e.g. 5 to keep only reviews rated 5/10 or lower |
| `proxyConfiguration` | proxy | Apify Proxy (Residential) | Residential recommended for clean routing |

URL examples:

- `https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272`
- `https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155`
- `https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383`

<p align="center"><img src="https://raw.githubusercontent.com/factden/apify-actor-assets/main/traveloka-hotel-reviews-scraper/01-input-form.png" width="600" alt="Traveloka Hotel and Activity Reviews Scraper input form on Apify Store with emoji-rich field titles, two prefilled demo URLs (a hotel and a Traveloka Xperience activity), date range and 10-point rating filters, and a one-line section description above each group"></p>

***

### Output

Two named alias datasets, accessible via the **Output-tab dropdown** in the Apify Console:

- **Reviews** - one row per review. Two table views: **Overview** (the columns most users want) and
  **AI ingest** (LLM-ready columns led by `markdownContent`).

<p align="center"><img src="https://raw.githubusercontent.com/factden/apify-actor-assets/main/traveloka-hotel-reviews-scraper/02-reviews-overview.png" width="1400" alt="Traveloka Hotel and Activity Reviews Scraper Reviews dataset Overview table on Apify Console showing per-review columns: listing, reviewer, trip type, overall rating on the 10-point scale, original review text, English translation, helpful count, and the owner response"></p>

- **Listings** - one summary row per hotel/activity scraped: aggregate rating, rating band, total review count,
  category sub-ratings (hotels), partner-source count, and completeness percentage.

<p align="center"><img src="https://raw.githubusercontent.com/factden/apify-actor-assets/main/traveloka-hotel-reviews-scraper/04-listings-overview.png" width="1400" alt="Traveloka Hotel and Activity Reviews Scraper Listings dataset Overview table on Apify Console showing the per-listing summary row with aggregate rating, rating band, total review count, the clubbed category subRatings array, partner-source count and completeness percentage"></p>

#### Sample review row

```json
{
  "reviewId": "700123456",
  "objectId": "3000010001272",
  "objectName": "Marina Bay Sands",
  "objectUrl": "https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272",
  "productType": "hotel",
  "source": "traveloka",
  "submittedAt": "2026-08-12T00:00:00+00:00",
  "reviewer": {
    "name": "Andi P.",
    "reviewerId": "998877",
    "isAnonymous": false,
    "photoUrl": "https://ik.imagekit.io/tvlk/..."
  },
  "travelType": "Family",
  "overallRating": 9,
  "subRatings": [],
  "reviewText": "Pemandangan dari kamar luar biasa, staf sangat ramah...",
  "reviewTextTranslated": "The view from the room was incredible, the staff were very friendly...",
  "isMachineTranslated": true,
  "usefulCount": 6,
  "imagesCount": 2,
  "imageUrls": ["https://ik.imagekit.io/tvlk/...", "https://ik.imagekit.io/tvlk/..."],
  "hasVideo": false,
  "ownerResponse": {
    "text": "Thank you for staying with us...",
    "textOriginal": "Terima kasih telah menginap...",
    "replierName": "Guest Relations",
    "date": "2026-08-14T00:00:00+00:00"
  },
  "markdownContent": "# Marina Bay Sands review (Hotel)\n\n**Rating:** 9/10 ★★★★★★★★★☆\n**Travel type:** Family\n\n## Review\nPemandangan dari kamar luar biasa, staf sangat ramah...\n\n## Translation\nThe view from the room was incredible, the staff were very friendly...\n\n## Management response\nThank you for staying with us...",
  "extractedAt": "2026-08-27T10:15:00+00:00"
}
```

#### Sample listing summary row

```json
{
  "objectId": "3000010001272",
  "objectName": "Marina Bay Sands",
  "objectUrl": "https://www.traveloka.com/en-en/hotel/singapore/marina-bay-sands-3000010001272",
  "productType": "hotel",
  "source": "traveloka",
  "overallRating": 8.6,
  "maxRating": 10,
  "ratingLabel": "Impressive",
  "reviewsCount": 4213,
  "subRatings": ["cleanliness: 8.7", "comfort: 8.5", "food: 8.1", "location: 9.0", "service: 8.4"],
  "otherSourcesProvider": "EXPEDIA",
  "otherSourcesCount": 1560,
  "reviewsExtracted": 200,
  "completenessPct": 4.7,
  "extractedAt": "2026-08-27T10:15:30+00:00"
}
```

**Timestamps:** `submittedAt` and `ownerResponse.date` come from Traveloka as calendar dates; we emit them as UTC ISO
8601\. `extractedAt` is our scrape time in UTC. `otherSourcesProvider` / `otherSourcesCount` report partner reviews
Traveloka also aggregates (e.g. Expedia) - those are **not** scraped; only native Traveloka reviews are returned.

***

### Pricing

Pay-per-event. No subscription, no minimum spend.

| Event | Rate |
|---|---|
| `apify-actor-start` | $0.00005 per run (one-time, effectively free) |
| `apify-default-dataset-item` | from $0.004 per review row |

**Effective rate: $4 per 1,000 reviews at base (Free) tier**, dropping automatically with your Apify subscription -
down to **$1.50 per 1,000 reviews** on higher plans. The start fee is a one-time $0.00005 per run (negligible). You
are only charged for the reviews you actually receive.

**Cost examples (base tier):**

| Scope | Reviews | Cost |
|---|---|---|
| Quick validation (1 listing, 50 reviews) | 50 | ~$0.20 |
| Single listing pull | 200 | ~$0.80 |
| Competitor set (10 listings × 100 reviews) | 1,000 | ~$4.00 |
| Deep pull (10 listings × 500 reviews) | 5,000 | ~$20.00 |

Apify's **$5 new-account credit** covers ~1,250 reviews on day one - enough to validate end-to-end before any spend.
Incremental daily runs (50–200 new reviews per listing) typically cost a few cents each.

***

### How to run this Traveloka reviews API on a schedule

For continuous monitoring, daily delta refreshes, or ORM dashboards:

1. Open the [Apify Schedules tab](https://docs.apify.com/platform/schedules) in your Console.
2. Add a new schedule and select this actor.
3. Set the cron expression (e.g., `0 6 * * *` for daily at 06:00 UTC).
4. In the schedule's input override, set `fromDate` to a sliding window - for example, yesterday's date via Apify's
   `{{NOW - 1.day | date('YYYY-MM-DD')}}` template.
5. (Optional) Wire an [Apify webhook](https://docs.apify.com/platform/integrations/webhooks) on
   `ACTOR.RUN.SUCCEEDED` to push the dataset into Snowflake, BigQuery, S3, or your CRM.

With `fromDate` set to a sliding window, each run returns only the reviews posted since the previous sync - so
incremental runs stay small and cheap. Pair it with `sortBy: "mostRecent"` for newest-first, and `maxReviews` to cap
each run.

***

### AI agents & RAG - using the data with LLMs

The `markdownContent` field on every review is a self-contained markdown block - title, rating, trip type, original
body, English translation, and property response inlined. Designed for direct vector-DB ingestion and LLM context
windows.

<p align="center"><img src="https://raw.githubusercontent.com/factden/apify-actor-assets/main/traveloka-hotel-reviews-scraper/03-reviews-ai-ingest.png" width="1400" alt="Traveloka Hotel and Activity Reviews Scraper AI ingest LLM-ready view on Apify Console showing the markdownContent column with self-contained per-review markdown chunks, original Bahasa Indonesia text, English translation, rating, trip type and product type ready for direct vector database ingestion and RAG pipelines"></p>

Use the standard [Apify API or client libraries](https://docs.apify.com/api) to run the actor and iterate the Reviews
dataset - `markdownContent` is your ready-to-embed chunk.

#### Field glossary for AI agents

| Field | What it carries | Why an agent cares |
|---|---|---|
| `markdownContent` | Per-review self-contained markdown chunk | RAG / vector-DB ingestion |
| `reviewTextTranslated` | English machine translation of the original body | Multilingual reviews usable without a translation step |
| `productType` | `hotel` or `activity` | Segment hotels vs experiences before embedding |
| `travelType` | Business / Family / Staycation / Romantic / … (hotels) | ICP filtering before embedding |
| `subRatings` (Listings dataset) | Category scores as a labeled array (cleanliness, comfort, food, location, service) | Fine-grained sentiment retrieval |
| `ownerResponse.text` | Property management reply (English) | Reputation-management agents |
| `otherSourcesCount` (Listings dataset) | Count of partner reviews Traveloka aggregates (not scraped) | Coverage / completeness signal |

***

### Data sources & GDPR

This actor extracts publicly visible review data from Traveloka. The `reviewer.name` field may contain the display
name a reviewer chose to show publicly; anonymous reviewers are surfaced as a masked handle with
`reviewer.isAnonymous: true`. You are responsible for ensuring your downstream use of this data complies with GDPR,
Indonesia's PDP Law, and any other applicable data-protection regulations in your jurisdiction.

***

### FAQ

#### How much does it cost to scrape 10,000 Traveloka reviews?

10,000 × $0.004 = **$40.00** at base tier, plus a one-time $0.00005 start fee (negligible). New Apify accounts get a
$5 credit that covers ~1,250 reviews - enough to validate the actor end-to-end before any spend. Tiered discounts
reduce the per-row price automatically as your Apify plan scales, down to $1.50 per 1,000 (so 10,000 reviews for ~$15
on higher plans).

#### Can I scrape both hotels and activities in one run?

Yes. Hotels are the primary focus, and Traveloka Xperience activity URLs work too - paste them together in
`startUrls` (up to 500) and the actor handles both in one pass. Activity rows use the same schema with
`productType: "activity"` (activities carry no trip type or category sub-ratings).

#### Does this return non-English (Bahasa Indonesia / Thai / Vietnamese) reviews?

Yes, and it translates them. Each review row carries the **original** body (`reviewText`) **and** an English machine
translation (`reviewTextTranslated`), with `isMachineTranslated` flagging which rows were translated. So a
non-Indonesian analyst can use the dataset directly.

#### How does this compare to other Traveloka scrapers on Apify?

Three things unique to this actor: (1) **hotels and activities in one run** - most competitors are hotels-only and
skip Traveloka Xperience entirely; (2) **original text plus English translation** on every review, not just the
original; (3) **`markdownContent` chunks** - self-contained per-review markdown ready for direct vector-DB / RAG
ingestion. Plus hotel-level category sub-ratings, owner responses, reviewer profile, and trip type.

#### How fresh is the review data?

Real-time. Every run pulls fresh data from Traveloka directly - there is no caching layer between the upstream and
your dataset. A review posted recently appears in the next run as soon as Traveloka's own indexing picks it up.

#### Can I export Traveloka reviews to CSV or Excel?

Yes. The Output tab in Apify Console offers JSON, JSONL, CSV, Excel, and HTML downloads on both the Reviews and
Listings datasets. The Overview view is column-ordered for clean import into Google Sheets or Excel without
reformatting. For large exports use the [Apify API](https://docs.apify.com/api/v2) for direct dataset streaming.

#### Can I scrape incrementally instead of refetching everything?

Yes. Set `fromDate` to your last successful scrape date and the run returns only the reviews posted since then - much
cheaper than a full re-scrape. Use `sortBy: "mostRecent"` to get the newest first. See
[Schedule](#how-to-run-this-traveloka-reviews-api-on-a-schedule) for cron + webhook wiring.

#### Do the ratings match the Traveloka website?

Yes. `overallRating` is on Traveloka's **10-point scale**, exactly as shown on the site. The `minRating` / `maxRating`
filters operate on the same 1–10 scale - the default `maxRating` of 10 means no cap; set e.g. 5 to keep only reviews
rated 5/10 or lower.

#### Do I need a Traveloka account, API key, or proxy to use this scraper?

No. Only an Apify account (free) is required. No Traveloka login, no API key, and no proxy configuration - Apify's
built-in Residential proxy is bundled and handles routing automatically. You can run your first extraction in under a
minute with zero infrastructure setup.

#### Is scraping Traveloka legal?

This actor extracts publicly visible data - no login is required, no rate-limit bypass is performed. Whether your
downstream use is permissible depends on your jurisdiction's regulations (GDPR, PDP Law, CCPA, etc.) and on
Traveloka's Terms of Service for the data category you're collecting. Reviewing both is your responsibility before
deploying at scale.

***

### Related Actors

Pair Traveloka Hotel & Activity Reviews Scraper with our other FactDen actors on the Apify Store:

- [Qunar Hotel Reviews Scraper](https://apify.com/factden/qunar-hotel-reviews-scraper) — the only Apify actor for Qunar (去哪儿): per-review sub-scores, sentiment, owner replies and LLM-ready markdown
- [Agoda Hotel Reviews Scraper](https://apify.com/factden/agoda-hotel-reviews-scraper) - Agoda hotel reviews at scale: scores, review text, traveler type & owner responses, in 33 languages
- [MakeMyTrip & Goibibo Reviews Scraper](https://apify.com/factden/makemytrip-scraper) - MakeMyTrip + Goibibo hotel reviews & details (India's largest OTAs)
- [Trip.com & Ctrip Reviews Scraper](https://apify.com/factden/ctrip-trip-reviews-scraper) - bilingual Trip.com + Ctrip (携程) hotel reviews with owner responses and sub-ratings
- [Google Hotels Scraper](https://apify.com/factden/google-hotels-scraper) - live hotel prices, OTA rate ladder, per-room rates & guest reviews from Google Hotels
- [Expedia Reviews Scraper](https://apify.com/factden/expedia-hotel-reviews-scraper) - hotel reviews, ratings, and sentiment across Expedia Group brands
- [Hotels.com Reviews Scraper](https://apify.com/factden/hotels-com-reviews-scraper) - hotel ratings, review text, and sentiment from Hotels.com listings
- [Airbnb Data Scraper](https://apify.com/factden/airbnb-data-scraper) - Airbnb listings, prices, availability, occupancy, ADR/RevPAR, and reviews; a pay-per-use AirDNA alternative
- [G2 Reviews Scraper](https://apify.com/factden/g2-reviews-scraper) - B2B SaaS competitive intelligence and battlecard data

***

### Changelog

#### v1.0 - Public launch (2026-08-31)

Initial public release. Traveloka **hotel and activity** review extraction in a single run, original text + English
machine translation, hotel-level category sub-ratings, owner responses, reviewer profile and trip type, LLM-ready
`markdownContent`, and pay-per-event pricing with tiered discounts. Ratings on Traveloka's 10-point scale;
`minRating` / `maxRating` operate on the same scale (default `maxRating` 10 = no cap).

***

### Support & maintenance

> ⭐ **Found this useful?** Leaving a quick review on this page helps other travel-data teams discover the actor - and
> tells us what to build next. Thank you!

**Actively maintained.** Bug reports and feature requests are typically triaged within 1–2 business days.

- **Apify Issues tab** - primary support channel; we get notified instantly and other users can upvote your report.
  Please include the run ID, one example URL, and what you expected vs what you saw.
- **Email** - <support@factden.com> for private / billing / partnership questions.

Looking for reviews from another OTA? Try our sibling
**[Agoda Hotel Reviews Scraper](https://apify.com/factden/agoda-hotel-reviews-scraper)** or
**[Trip.com & Ctrip Reviews Scraper](https://apify.com/factden/ctrip-trip-reviews-scraper)**.

***

*Built by [factden](https://apify.com/factden) on the Apify platform. **Try the Traveloka Hotel & Activity Reviews
Scraper free** with Apify's $5 monthly credit - covers ~1,000 reviews on first run.*

# Actor input Schema

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

Traveloka hotel (/hotel/…) or activity (/activities/…/product/…) URLs. Mix freely - each is scraped in the en-en locale (English text, original-language body preserved). Up to 500 URLs per run.

## `maxReviews` (type: `integer`):

Maximum reviews to extract per hotel or activity.

## `sortBy` (type: `string`):

Order reviews are returned in (and, with a per-listing cap, which ones are kept first). The date and rating filters below are always applied to every review independently of the sort.

## `fromDate` (type: `string`):

Only include reviews submitted on or after this date (YYYY-MM-DD). Applied to every review found, so incremental runs return exactly the reviews posted since your last sync.

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

Minimum overall rating to include, on Traveloka's 10-point scale (matches the website).

## `maxRating` (type: `integer`):

Maximum overall rating to include, on Traveloka's 10-point scale (matches the website). The default of 10 means no cap (all reviews); set a specific value like 5 to keep only lower-rated reviews (5/10 or below).

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

Apify Residential proxy by default (recommended - Traveloka blocks most datacenter IPs).

## Actor input object example

```json
{
  "startUrls": [
    "https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155",
    "https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383"
  ],
  "maxReviews": 200,
  "sortBy": "mostRecent",
  "minRating": 1,
  "maxRating": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Per-review rows covering every native Traveloka review, on a 10-point rating scale. Original + English-translated text, a reviewer object, an ownerResponse object, trip type, helpful count, attached photo URLs, and an LLM-ready markdown view.

## `objects` (type: `string`):

Per-listing summary rows. One row per hotel or activity scraped, with aggregate rating (10-point), hotel-level category sub-ratings, total review count, and partner-source counts.

# 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": [
        "https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155",
        "https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factden/traveloka-hotel-reviews-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": [
        "https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155",
        "https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("factden/traveloka-hotel-reviews-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": [
    "https://www.traveloka.com/en-en/hotel/indonesia/whiz-prime-balikpapan-3000010002155",
    "https://www.traveloka.com/en-en/activities/singapore/product/universal-studios-singapore-1001603749383"
  ]
}' |
apify call factden/traveloka-hotel-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,factden/traveloka-hotel-reviews-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/MG1vTa0AwRs4YAGEl/builds/2fn5SjE8VGXcugG0C/openapi.json
