
ReKrute Job Scraper
scrape.ly/store/openrole/rekrute-scraperJobsLead generation
2 monthly users

Export Traveloka hotel and activity reviews: paste hotel, tour or ticket links from any Traveloka market. Get the score, translated and original review text, reviewer, trip type, photos, helpful votes, property replies, and the overall rating with hotel category scores. Filter by date, rating, language and content. No login needed.
Export reviews of any Traveloka hotel, resort, tour, attraction or ticket into a clean table: score, review text in your language plus the original, reviewer, trip type, photos, helpful votes and the property's reply. Paste links from any Traveloka market (or just type hotel names), set how many reviews you want, and get JSON, CSV or Excel in seconds. No login, no browser, no cookies to copy.
| Field | What it does |
|---|---|
startUrls | Traveloka hotel links (/hotel/<country>/<name>-<id> or /hotel/detail?spec=...) and activity links (/activities/<country>/product/<name>-<id>), any market. Bare ids work too. |
hotelNames | Optional. Hotel names to look up with Traveloka's own search, e.g. ibis Bandung Trans Studio (the match is logged). |
maxReviewsPerUrl | Reviews to save per hotel or activity (default 20, 0 = all). |
maxReviews | Optional cap for the whole run. |
sortBy | newest, oldest, mostHelpful, highestRating or lowestRating. |
reviewsNewerThan | Only reviews from this date on (2026-01-01) or a period like 90 days. |
ratingFilter | One of Traveloka's rating bands: all, exceptional (9 and up), veryGood (about 8 to 9), pleasant (about 6 to 8), fair (5 to 6), poor (below 5). |
reviewLanguage | Only reviews written in en, id, ms, th, vi, ja, ko or zh. |
reviewFormat | withText (default), all (also score-only reviews), withMedia, withTextAndMedia. |
translateTo | Language of the translated text: auto (the link's market), en, id, ms, th, vi, ja, ko, zh-tw, zh. |
includeAggregateRatings | Add the listing's overall rating and category scores to every row (default on). |
{
"startUrls": [
{ "url": "https://www.traveloka.com/en-en/hotel/indonesia/the-apurva-kempinski-bali-3000020019601" },
{ "url": "https://www.traveloka.com/en-en/activities/japan/product/universal-studios-japan-2000814134443" }
],
"maxReviewsPerUrl": 20,
"sortBy": "newest",
"reviewsNewerThan": "2026-01-01",
"translateTo": "en"
}
One row per review.
| Field | Description |
|---|---|
pageId, pageName, pageUrl | The hotel or activity (pageUrl is the link you pasted; empty for hotel names and bare ids) |
productType | HOTEL or EXPERIENCE (activity, tour, ticket) |
reviewId | Traveloka review id |
reviewerName, reviewerId | Reviewer as Traveloka shows them (some names are masked by the site) |
reviewTimestamp | When the review was written (ISO 8601, UTC) |
reviewScore, reviewMaxScore | Score out of 10 |
reviewContentText | Review text in the chosen language |
reviewOriginalText, translationStatus | The text as written, and whether it was translated |
travelPurpose, reviewAdditionalInformation | Trip type (Leisure, Business, Family, Staycation, ...) and other labels |
reviewMediaUrls | Photos and videos attached to the review |
reactionCount | Helpful votes |
replierName, reviewReplyText, reviewReplyOriginalText, reviewReplySubmissionTime, reviewReplyTranslationStatus | The property's or operator's reply |
reviewProvider, locale, scrapedAt | Source, market/language read, time saved |
aggregatedReview | Listing review count, overall rating, rating label and (hotels) category scores |
Example (one hotel review, trimmed):
{
"pageId": "3000020019601",
"pageUrl": "https://www.traveloka.com/en-en/hotel/indonesia/the-apurva-kempinski-bali-3000020019601",
"pageName": "The Apurva Kempinski Bali",
"productType": "HOTEL",
"reviewId": "1879455402923405009",
"reviewerName": "Hassan A.",
"reviewTimestamp": "2026-10-19T05:39:06.599Z",
"reviewScore": 10,
"reviewMaxScore": 10,
"reviewContentText": "A truly luxurious stay worth experiencing. Thank you to all the staff at the Kempinski Resort from the moment I arrived until my departure; everyone was smiling and welcoming.",
"reviewOriginalText": "إقامة فاخرة تستحق التجربة ، شكراً لجميع طاقم عمل منتجع كمبنسكي من بداية وصولي وحتى مغادرتي والكل مبتسم ويرحب فيني",
"translationStatus": "GOOGLE_TRANSLATE",
"travelPurpose": "Leisure",
"reviewMediaUrls": [],
"reactionCount": 0,
"hasReacted": false,
"reviewProvider": "TRAVELOKA",
"replierName": null,
"reviewReplyText": null,
"locale": "en-en",
"aggregatedReview": {
"count": 1816,
"overallRating": 9,
"maxRating": 10,
"ratingText": "Exceptional",
"distributions": [
{ "label": "Cleanliness", "rating": 9.4 },
{ "label": "Room Comfort", "rating": 9.4 },
{ "label": "Meal", "rating": 9.1 },
{ "label": "Location", "rating": 9.2 },
{ "label": "Service and Facilities", "rating": 9.3 }
]
}
}
You pay $3.50 per 1,000 reviews ($0.0035 per review) plus a small amount of platform usage (compute and proxy traffic), which for this actor is a fraction of a cent per run. For example, 1,000 reviews ≈ $3.50 in review fees plus well under $0.01 of usage. Failed pages, duplicates and rows that are not saved are never charged, and a maximum charge you set for a run is respected.
Is it legal to scrape Traveloka reviews? The actor reads only public reviews that any visitor can see without logging in. Reviews contain personal data such as reviewer names, so make sure your use complies with the GDPR and other privacy rules that apply to you, and with Traveloka's terms.
Do I need a Traveloka account, cookies or a proxy? No. No login or cookies are needed. The default datacenter proxy works; if the site ever refuses it, the run switches to Indonesian residential exits on its own.
How many reviews can I get? For hotels, every review Traveloka lists. For activities, Traveloka lets visitors page through 100 reviews per sort order and filter; for larger activities the actor combines sort orders, languages, rating bands and formats to collect as many different reviews as the site shows, which is usually a large share but not always all of them.
Why is a field empty? Fields are empty when Traveloka has no value: many reviews have no reply or photos, some reviewer names are masked, and rating-only reviews have no text (they are skipped unless you choose "All reviews"). Category scores exist for hotels only.
Can I schedule runs or use the API? Yes. Schedule the actor (e.g. daily with "Only reviews newer than: 2 days") to collect new reviews, and start runs or read results through the REST API, webhooks or integrations.
hasReacted is always false because nobody is logged in.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalTraveloka links
Hotel links (https://www.traveloka.com/en-en/hotel//-, also hotel/detail?spec=... links) and activity, tour or ticket links (https://www.traveloka.com/en-en/activities//product/-). Any Traveloka market works (id-id, th-th, vi-vn, en-sg, ...). A bare hotel or activity id works too.
hotelNamesarrayOptionalHotel names
Optional. Hotel names to look up on Traveloka, one per line, ideally with the city, e.g. 'ibis Bandung Trans Studio'. The best match from Traveloka's own search is used and logged.
maxReviewsPerUrlintegerOptionaldefault 20Maximum reviews per hotel or activity
How many reviews to save for each link or hotel name. 0 = all reviews the site lets visitors read.
maxReviewsintegerOptionaldefault 0Maximum reviews in total
Optional cap across all links in the run. 0 = no total cap.
sortByenumOptionaldefault "newest"Sort reviews by
Order in which reviews are read. Activities have no 'most helpful' order (newest first is used).
reviewsNewerThanstringOptionalOnly reviews newer than
Only save reviews written on or after this date (YYYY-MM-DD), or a relative period like '30 days' or '6 months'. Empty = all dates.
ratingFilterenumOptionaldefault "all"Rating
Only reviews in one of Traveloka's rating bands (scores out of 10). The bands do not overlap: 'Very good' does not include 'Exceptional'.
reviewLanguageenumOptionaldefault "all"Review language
Only reviews originally written in this language.
reviewFormatenumOptionaldefault "withText"Review content
With text (default) skips rating-only reviews, as Traveloka's review list does. 'All' also returns reviews that only have a score.
translateToenumOptionaldefault "auto"Translate reviews to
Language of the translated review text (reviewContentText; the original stays in reviewOriginalText). 'Language of the link' uses the market in each link, e.g. id-id gives Indonesian.
includeAggregateRatingsbooleanOptionaldefault trueAdd overall rating and category scores
Add the hotel's or activity's review count, overall rating and (for hotels) the Cleanliness, Room Comfort, Meal, Location and Service scores to every review as aggregatedReview.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for Traveloka's review data. If the site refuses them, the run switches to Indonesian residential exits by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| pageId | string | null | Traveloka hotel or activity id |
| pageUrl | string | null | Link to the hotel or activity on Traveloka |
| pageName | string | null | Hotel or activity name |
| productType | string | null | HOTEL or EXPERIENCE (activity, tour, ticket) |
| reviewId | string | null | Traveloka review id |
| reviewerName | string | null | Reviewer display name (Traveloka masks some names) |
| reviewerId | string | null | Traveloka reviewer id, when the profile is public |
| reviewTimestamp | string | null | When the review was written (ISO 8601, UTC) |
| reviewScore | number | null | Review score |
| reviewMaxScore | number | null | Maximum score (10) |
| reviewContentText | string | null | Review text, translated into the chosen language |
| reviewOriginalText | string | null | Review text as the reviewer wrote it |
| translationStatus | string | null | ORIGINAL or the translation used (e.g. GOOGLE_TRANSLATE) |
| travelPurpose | string | null | Trip type the reviewer chose (Leisure, Business, Family, Staycation, ...) |
| reviewAdditionalInformation | object | null | Extra review labels as Traveloka shows them |
| reviewMediaUrls | array | Links to the photos or videos attached to the review |
| reactionCount | number | null | How many people marked the review helpful |
| hasReacted | boolean | null | Always false for visitors (no login) |
| reviewProvider | string | null | Review source (TRAVELOKA) |
| replierName | string | null | Who replied (e.g. Accommodation's Reply) |
| reviewReplyText | string | null | Reply text, translated into the chosen language |
| reviewReplyOriginalText | string | null | Reply text as written |
| reviewReplySubmissionTime | string | null | Reply date (YYYY-MM-DD) |
| reviewReplyTranslationStatus | string | null | ORIGINAL or the translation used for the reply |
| locale | string | null | Traveloka market and language the review was read in (e.g. en-en, id-id) |
| scrapedAt | string | null | When the review was saved (ISO 8601, UTC) |
| aggregatedReview | object | null | Review count, overall rating and (hotels) category scores of the hotel or activity |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Review | One saved Traveloka review. | $0.0035 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/traveloka-scraper').call({
"startUrls": [
{
"url": "https://www.traveloka.com/en-en/hotel/indonesia/the-apurva-kempinski-bali-3000020019601"
},
{
"url": "https://www.traveloka.com/en-en/activities/japan/product/universal-studios-japan-2000814134443"
}
],
"maxReviewsPerUrl": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/traveloka-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/traveloka-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Type a hotel name (here ibis Bandung Trans Studio) and get its 10 newest Traveloka reviews with the overall rating and the Cleanliness, Room Comfort, Meal, Location and Service scores.
An Indonesian-market hotel link (id-id): the 15 most helpful reviews of Mercure Convention Center Ancol, translated to Indonesian, with the hotel's replies.
Universal Studios Japan tickets: only reviews rated 9 and up that were written in Thai, translated to English.
Every review a Bandung hotel received in the last 180 days, including score-only reviews, without the ratings overview.
The first 10 reviews ever written about The Apurva Kempinski Bali, oldest first.
The first 10 reviews of Universal Studios Japan tickets on Traveloka, oldest first.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.