Traveloka Scraper - Hotels, Rooms, Reviews and Flights avatar

Traveloka Scraper - Hotels, Rooms, Reviews and Flights

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Traveloka Scraper - Hotels, Rooms, Reviews and Flights

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

22

Total users

7

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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: enrichDetails adds hotel information and separate room rows; includeReviews adds separate review rows. Both default to false. 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

FieldDescriptionExample
rowTypeEntity typehotel
idHotel identifier148997
nameHotel nameExample Hotel
urlTraveloka listinghttps://www.traveloka.com/en-sg/hotel/indonesia/aston-kuta-hotel--residence-148997
areaHotel areaKuta, Badung
starRatingHotel stars4
ratingGuest score8.7
reviewCountReported review count3271
priceNightly or advertised starting price55.01
currencyPrice currencySGD
priceTypeMeaning of the priceper_room_per_night
priceBeforeTaxesNightly price before tax45.46
taxesAndFeesNightly taxes and fees9.55
originalPriceHigher crossed-out price, if shown65.00
totalPriceTotal for the requested stay110.02
freeCancellationCancellation flagtrue
sponsoredSponsored placementfalse

Details can also add address, postalCode, checkInTime, checkOutTime, facilities, policies, description and reviewSources. Coordinates, photos and stay dates are included where available.

Room rows

FieldDescriptionExample
rowTypeEntity typeroom
parentIdParent hotel ID148997
nameRoom nameDeluxe Room
priceRoom offer price, if available65.00
maxOccupancyMaximum guests2
breakfastBreakfast termsBreakfast Included
refundableRefundable rate flagtrue
cancellationPolicyCancellation termsFree cancellation
remainingRoomsRemaining rooms shown2

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

FieldDescriptionExample
rowTypeEntity typereview
parentIdParent hotel ID148997
reviewIdSource review ID, if presentreview-example
ratingReview score9.0
textReview textComfortable room.
originalTextOriginal text when supplied alongside a translationComfortable room.
dateReview date2026-10-01
reviewSourceReview providerTRAVELOKA

Flight rows

FieldDescriptionExample
rowTypeEntity typeflight
airlineAirline nameExample Airline
departureAirportDeparture airportCGK
arrivalAirportArrival airportDPS
departureTimeDisplayed departure time09:00
arrivalTimeDisplayed arrival time12:00
durationDisplayed duration2h
stopsStop informationDirect
priceDisplayed fare120.00
FieldDescriptionExample
rowTypeEntity typeactivity_link
nameLink textExample activity
localeSelected localeen-sg
FieldDescriptionExample
rowTypeEntity typecar_rental_link
nameLink textExample car rental
localeSelected localeen-sg
FieldDescriptionExample
rowTypeEntity typeairport_transfer_link
nameLink textExample airport transfer
localeSelected localeen-sg
FieldDescriptionExample
rowTypeEntity typetrain_link
nameLink textExample train route
localeSelected localeen-id

All four link types include url; they do not represent confirmed availability.

How to scrape Traveloka

  1. Open Traveloka Scraper in Apify Console.
  2. Fill a target, such as destination: "Bali".
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. 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

FieldWhat to enterDefault
serviceauto, hotels, flights, activities, car_rental, airport_transfer, trainsauto; form prefill hotels
destinationHotel destination or flight arrival IATA codeExample Bali; flights DPS
originFlight departure IATA codeFlights CGK
geoIdNumeric hotel-area IDEmpty
hotelListUrlTraveloka hotel area/region URLEmpty
maxResultsCombined row limit, 1–50070; form prefill 3
checkin, checkoutStay dates, YYYY-MM-DD; maximum 30 nightsToday +21 days; +2 nights
adults, children, roomsGuest and room counts2, 0, 1
childAgesAges 0–17, one per childEmpty
enrichDetailsHotel details and room rowsfalse
includeReviews, maxReviewsReview rows; 1–20 per hotel within the row limitfalse, 20
departureDate, returnDateFlight dates, YYYY-MM-DDToday +28 days; +7 for round trips
tripType, cabinClassoneway/roundtrip; ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRSToneway, ECONOMY
infantsInfant count0
localeSite language and marketen-sg
currencyOptional currency codeLocale currency
domainTraveloka hostwww.traveloka.com
proxyCountryOptional two-letter country hintEmpty

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 planStart at 512 MBPrice per rowPrice 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 ApifyClient
client = 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

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.

More travel, hotel and flight scrapers from the same publisher:

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.