Traveloka Scraper - Hotels, Rooms, Reviews and Flights
Pricing
from $2.20 / 1,000 results
Traveloka Scraper - Hotels, Rooms, Reviews and Flights
Extract Traveloka hotels, room details, guest reviews and flights across Southeast Asian and regional locales, plus links from other travel pages. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
22
Total users
7
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Traveloka Scraper
Extract Traveloka hotel prices, room details, guest reviews and flight results across Southeast Asian and regional markets as rows you can export.
- Hotel searches by destination, area ID or hotel-list URL.
- Optional room and review rows linked to their hotel.
- Flight searches by airport codes and dates.
- Links from activities, car rental, airport transfer and train pages.
- Free-plan pricing: $3.00 per 1,000 delivered rows plus a start fee.
What does Traveloka Scraper do?
Traveloka Scraper collects public travel listings from traveloka.com. It does not make bookings or access private accounts, and is not affiliated with Traveloka.
- Hotels: date-specific prices, ratings and locations. Hotel-list URLs instead return advertised “from” prices.
- Details and reviews:
enrichDetailsadds hotel information and separate room rows;includeReviewsadds separate review rows. Both default tofalse. Each extra row is billed at the same price as a hotel row. - Flights: fares and itinerary fields where available.
- Other services: relevant page links, not bookable inventory or confirmed fares.
Locales cover Indonesia, Malaysia, Singapore, the Philippines, Thailand, Vietnam, Australia, Japan, Korea and global English. Service availability varies by locale.
What data can you extract from Traveloka?
Every row has rowType and id. Fields depend on the service and what Traveloka shows; missing values may be omitted.
Hotel rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type | hotel |
id | Hotel identifier | 148997 |
name | Hotel name | Example Hotel |
url | Traveloka listing | https://www.traveloka.com/en-sg/hotel/indonesia/aston-kuta-hotel--residence-148997 |
area | Hotel area | Kuta, Badung |
starRating | Hotel stars | 4 |
rating | Guest score | 8.7 |
reviewCount | Reported review count | 3271 |
price | Nightly or advertised starting price | 55.01 |
currency | Price currency | SGD |
priceType | Meaning of the price | per_room_per_night |
priceBeforeTaxes | Nightly price before tax | 45.46 |
taxesAndFees | Nightly taxes and fees | 9.55 |
originalPrice | Higher crossed-out price, if shown | 65.00 |
totalPrice | Total for the requested stay | 110.02 |
freeCancellation | Cancellation flag | true |
sponsored | Sponsored placement | false |
Details can also add address, postalCode, checkInTime, checkOutTime, facilities, policies, description and reviewSources. Coordinates, photos and stay dates are included where available.
Room rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type | room |
parentId | Parent hotel ID | 148997 |
name | Room name | Deluxe Room |
price | Room offer price, if available | 65.00 |
maxOccupancy | Maximum guests | 2 |
breakfast | Breakfast terms | Breakfast Included |
refundable | Refundable rate flag | true |
cancellationPolicy | Cancellation terms | Free cancellation |
remainingRooms | Remaining rooms shown | 2 |
Room and review rows also carry parentName, parentUrl and parentLocation. A room can be an unpriced catalog entry if no dated offer is available.
Review rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type | review |
parentId | Parent hotel ID | 148997 |
reviewId | Source review ID, if present | review-example |
rating | Review score | 9.0 |
text | Review text | Comfortable room. |
originalText | Original text when supplied alongside a translation | Comfortable room. |
date | Review date | 2026-10-01 |
reviewSource | Review provider | TRAVELOKA |
Flight rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type | flight |
airline | Airline name | Example Airline |
departureAirport | Departure airport | CGK |
arrivalAirport | Arrival airport | DPS |
departureTime | Displayed departure time | 09:00 |
arrivalTime | Displayed arrival time | 12:00 |
duration | Displayed duration | 2h |
stops | Stop information | Direct |
price | Displayed fare | 120.00 |
Activity links
| Field | Description | Example |
|---|---|---|
rowType | Entity type | activity_link |
name | Link text | Example activity |
locale | Selected locale | en-sg |
Car rental links
| Field | Description | Example |
|---|---|---|
rowType | Entity type | car_rental_link |
name | Link text | Example car rental |
locale | Selected locale | en-sg |
Airport transfer links
| Field | Description | Example |
|---|---|---|
rowType | Entity type | airport_transfer_link |
name | Link text | Example airport transfer |
locale | Selected locale | en-sg |
Train links
| Field | Description | Example |
|---|---|---|
rowType | Entity type | train_link |
name | Link text | Example train route |
locale | Selected locale | en-id |
All four link types include url; they do not represent confirmed availability.
How to scrape Traveloka
- Open Traveloka Scraper in Apify Console.
- Fill a target, such as
destination: "Bali". - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Open the dataset and download it or read it through the API.
Empty input with service left on auto starts a Bali hotel example with at most 3 rows. Normal event charges apply. Filling a hotel target selects hotels automatically; filling origin selects flights. Conflicting targets take priority in this order: hotelListUrl, geoId, origin, destination.
Hotels
Use destination for a place name or geoId for an exact area. Explicit service: "hotels" without a target uses Bali and your normal row limit. Check-in defaults to 21 days ahead, with a two-night stay.
Flights
Fill origin and destination with three-letter IATA codes. Explicit service: "flights" defaults missing codes to CGK and DPS. Departure defaults to 28 days ahead; a round trip defaults to returning seven days later.
Activities
Set service to activities; no destination is needed. Results are links from the selected locale's activities page.
Car rental
Set service to car_rental for car-rental page links, not vehicle availability.
Airport transfer
Set service to airport_transfer for transfer page links, not journey quotes.
Trains
Set service to trains for train page links. A missing page or redirect to the home page is treated as a failure, not a successful train search.
What to fill in
| Field | What to enter | Default |
|---|---|---|
service | auto, hotels, flights, activities, car_rental, airport_transfer, trains | auto; form prefill hotels |
destination | Hotel destination or flight arrival IATA code | Example Bali; flights DPS |
origin | Flight departure IATA code | Flights CGK |
geoId | Numeric hotel-area ID | Empty |
hotelListUrl | Traveloka hotel area/region URL | Empty |
maxResults | Combined row limit, 1–500 | 70; form prefill 3 |
checkin, checkout | Stay dates, YYYY-MM-DD; maximum 30 nights | Today +21 days; +2 nights |
adults, children, rooms | Guest and room counts | 2, 0, 1 |
childAges | Ages 0–17, one per child | Empty |
enrichDetails | Hotel details and room rows | false |
includeReviews, maxReviews | Review rows; 1–20 per hotel within the row limit | false, 20 |
departureDate, returnDate | Flight dates, YYYY-MM-DD | Today +28 days; +7 for round trips |
tripType, cabinClass | oneway/roundtrip; ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST | oneway, ECONOMY |
infants | Infant count | 0 |
locale | Site language and market | en-sg |
currency | Optional currency code | Locale currency |
domain | Traveloka host | www.traveloka.com |
proxyCountry | Optional two-letter country hint | Empty |
Hotels:
{"destination": "Bali", "maxResults": 3}
Hotel details and reviews:
{"destination": "Ubud", "enrichDetails": true, "includeReviews": true, "maxReviews": 2, "maxResults": 5}
Hotel area listings, with starting prices rather than dated rates:
{"hotelListUrl": "https://www.traveloka.com/en-id/hotel/indonesia/area/ubud-102771", "maxResults": 3}
Flights:
{"service": "flights", "origin": "CGK", "destination": "DPS", "maxResults": 3}
Activities:
{"service": "activities", "locale": "en-sg", "maxResults": 3}
Car rental:
{"service": "car_rental", "locale": "en-sg", "maxResults": 3}
Airport transfer:
{"service": "airport_transfer", "locale": "en-sg", "maxResults": 3}
Trains:
{"service": "trains", "locale": "en-id", "maxResults": 3}
maxItems and limit are aliases for maxResults; city and location are aliases for destination. Close field-name misspellings are corrected when possible; other unknown fields are ignored with a note. Invalid filters may be ignored or adjusted.
Unusable targets produce INVALID_INPUT: <field> — <how to fix>. Date and model validation errors can instead name the field directly, such as checkin is in the past; use today or a later date (YYYY-MM-DD). Validation happens before row delivery, so no rows are charged. The start fee can still apply.
INPUT_REPORT records inferred, filled, corrected and ignored fields in the default key-value store. INPUT_ECHO includes the resolved dates. Blank dates get relative defaults; explicit invalid dates are not moved forward automatically.
Output example
Illustrative hotel row, not a current price quote:
{"rowType": "hotel","id": "148997","hotelId": "148997","name": "Aston Kuta Hotel & Residence","service": "hotels","locale": "en-sg","price": 55.01,"priceBeforeTaxes": 45.46,"taxesAndFees": 9.55,"totalPrice": 110.02,"currency": "SGD","priceType": "per_room_per_night","checkin": "2030-11-20","checkout": "2030-11-22","nights": 2}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Filter by rowType before comparing prices across rows.
Why use this Traveloka scraper?
- Pay for delivered rows: unsuccessful searches do not create row charges.
- Keep usable data: partial results returned by a search are delivered; warnings appear in
RUN_SUMMARY. Rows already saved remain available after a stop. - Separate entities: hotels, rooms and reviews can be joined by
parentId. - Check missing fields: unavailable information stays empty or absent instead of becoming invented values.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Traveloka?
Pricing is pay-per-event. An Actor start event costs $0.005, with one event per GB of allocated memory and a minimum of one. At the default 512 MB, the start charge is $0.005. Platform usage is included in these prices.
| Apify plan | Start at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxResults applies to the run's single destination, area ID, hotel-list URL, flight route or service input. It defaults to 70; larger counts are collected in parts of 70, up to the input limit of 500. All row types share the limit: maxResults: 3 can mean one hotel and two room/review rows, not three hotels plus unlimited children.
Free Apify plan users are limited to 200 rows per run and 10 total runs of this Actor. These are publisher-set limits. The whole run also stops at your Maximum cost per run (maxTotalChargeUsd in the API).
Example: 5 delivered rows on the Free plan at 512 MB cost 5 × $0.003 + $0.005 = $0.020.
What happens when the run timeout is too short
A search that outlasts the chosen timeout can pause automatically instead of failing. The run shows ABORTED with “Queued on the collection backend; this run will resume automatically when results are ready (about Ns).”
When results are ready, the same run resumes, reports “Resumed: delivering N rows.”, writes to the same dataset and finishes as SUCCEEDED. Previously delivered rows are skipped, so they are not delivered or charged twice. No action is needed for this automatic pause.
This can happen at most 3 times per run. Keep the default timeout of 3600 seconds to reduce interruptions. A manual stop is not a promise that unfinished results will be delivered.
Synchronous endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset during a pause. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server in a compatible Claude, ChatGPT, Cursor or VS Code client:
https://mcp.apify.com?tools=lentic_clockss/traveloka-scraper
Sign in through Apify OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read rows with get-dataset-items.
For clients without remote support, use npx @apify/actors-mcp-server --tools lentic_clockss/traveloka-scraper with APIFY_TOKEN set.
Example prompt: “Find three Bali hotels using Traveloka Scraper, with default dates, and show their names, prices and currencies.”
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/traveloka-scraper").call(run_input={"destination": "Bali", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/traveloka-scraper').call({destination: 'Bali', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP, send POST https://api.apify.com/v2/acts/lentic_clockss~traveloka-scraper/runs with your JSON input and bearer token. After success, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json. Apply the pause guidance above to SDK calls that wait for completion too.
Integrations
Use the Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or webhooks. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape Traveloka?
This Actor collects public data. You are responsible for applicable terms and data-protection law. Personal data, including review content, needs a lawful basis; consult qualified counsel when uncertain.
Why did my run end as ABORTED?
Check the status message. The automatic pause described above resumes when results are ready. Not every ABORTED run is an automatic pause.
How many results can I get?
Request 1–500 rows for one input. Free-plan runs stop at 200; your cost limit and available results can reduce this further. Multiple destinations or routes require separate runs.
Why are some fields empty?
Traveloka may not show them for that listing, locale or date. Room catalog entries can lack prices. Detail fields also require enrichDetails and enough remaining rows.
Do I need a geoId?
No. Use a destination name, or supply geoId to select an exact area when a name is ambiguous.
Are hotel prices for my dates?
Normal searches use your dates. Hotel-list URLs return priceType: "seo_from_price", an advertised starting price rather than a dated quote.
Why did a search return no rows?
An unresolved destination or no matching availability can finish successfully with zero rows and an explanation. A search that cannot load results can fail instead. Check RUN_SUMMARY or ERROR_SUMMARY.
Can I book travel with this Actor?
No. It collects data, not bookings, payments or private-account information.
Limitations
- One scalar input per run; no destination or route arrays.
- Hotel details cover at most the first 100 hotels, subject to the shared row limit.
- Reviews are a page-provided sample, at most 20 per hotel, not the full review history.
- Activities, car rental, airport transfer and trains provide links only. Train pages may be unavailable in a locale.
- Locale selection does not guarantee every service or translated text is available.
- Prices and availability can change after collection. The Actor does not reserve a price.
- Attribute lists such as photos, facilities and policies are capped at 50 entries, sometimes fewer.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Trip.com Scraper — Hotels Flights Trains Cars
- Expedia Scraper
- Skyscanner Scraper
- Agoda Scraper — Hotels, Flights, Packages & More
- Despegar Scraper
- TripAdvisor Scraper — Hotels, Restaurants & More
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.