Traveloka Hotel Scraper - SEA Hotel Prices & Ratings avatar

Traveloka Hotel Scraper - SEA Hotel Prices & Ratings

Pricing

from $1.80 / 1,000 hotel results

Go to Apify Store
Traveloka Hotel Scraper - SEA Hotel Prices & Ratings

Traveloka Hotel Scraper - SEA Hotel Prices & Ratings

Scrape Traveloka hotels across Singapore, Malaysia, Indonesia, Thailand, Vietnam and the Philippines: nightly prices, star ratings, guest scores, coordinates and photos by city. Paste search or hotel links, and monitor price changes with recurring updates.

Pricing

from $1.80 / 1,000 hotel results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Traveloka Hotel Scraper

Pull hotel listings from Traveloka, Southeast Asia's largest travel platform, across its Singapore, Malaysia, Indonesia, Thailand, Vietnam, Philippines and Australia storefronts. Search by city or area, paste Traveloka links, and get structured records: nightly prices in the local currency, star ratings, guest review scores, coordinates, photos and change tracking for recurring monitoring runs.

Why This Scraper?

  • 30+ fields per hotel: price, star rating, guest score out of 10, review count, region, coordinates, photos, facilities.
  • Seven storefronts (en-sg, en-my, en-id, en-th, en-vn, en-ph, en-au) with per-market currency handling.
  • Two modes: keyword search by city or area, and URL mode for pasted search (spec=) links and hotel detail links.
  • Recurring updates: incremental mode remembers what changed between runs (NEW, UPDATED, UNCHANGED, EXPIRED) and can resume an interrupted run.
  • Client-side filters for price range, star rating and guest score, plus result sorting.
  • Optional detail enrichment from the JSON lane (no page loads): facility codes + labels, feature highlights, extra images and UGC ratings merged per row (per-row surcharge). Pasted hotel detail links (URL mode) are still read as documents.
  • Fail-loud runs: when the site refuses to serve, the run says so instead of returning an empty result set.

Data You Get

Sample shape - values are illustrative placeholders, not from a live listing.

FieldExample value
hotelId"254056"
name"Sample City Hotel"
url"https://www.traveloka.com/en-sg/hotel/singapore/sample-city-hotel-254056?checkIn=2026-10-01"
locationName"Singapore"
region"Sample District, Singapore"
price210.0
currency"SGD"
starRating4.0
guestRating8.5
guestRatingLabel"Very Good"
numReviews18265
latitude1.307744
longitude103.862695
facilities["Wi-Fi in public areas", "Swimming pool"]
imageUrl"https://ik.imagekit.io/tvlk/.../asset/000000-0000000000000.jpeg"
market"en-sg"
checkInDate"2026-10-01"
checkOutDate"2026-10-02"
changeType"NEW"
changedFields["price"]
firstSeenAt"2026-01-01T00:00:00Z"
lastSeenAt"2026-01-01T00:00:00Z"
features["Free cancellation"] (detail toggle: feature highlights from the static feed)
reviews[{"author": "…", "rating": 8.0, "date": "2026-09-01", "text": "…"}] (fetchReviews toggle: guest reviews, newest first, up to maxReviews per hotel, max 1000)
Billing scales with review volume: 1 surcharge unit per row plus 1 per started block of 10 reviews (10 reviews = 1 unit, 25 = 3, 1000 = 100).
addressstreet-level address; backfilled via coordinates when the feed leaves it empty (detail toggle)
descriptiondocument-only field, populated only for pasted hotel links (URL mode)
addressdocument-only field, populated only for pasted hotel links (URL mode)

How to Use

Search hotels in one city:

{
"mode": "search",
"market": "en-sg",
"locations": ["Singapore"],
"maxItems": 20
}

Search with filters, sorting and multiple cities:

{
"mode": "search",
"market": "en-th",
"locations": ["Bangkok", "Phuket"],
"checkInDate": "2026-11-01",
"checkOutDate": "2026-11-03",
"adults": 2,
"sortBy": "price-asc",
"minStarRating": 4,
"maxPrice": 5000,
"maxItems": 40
}

Walk a pasted Traveloka search link and enrich the results:

{
"mode": "url",
"urls": ["https://www.traveloka.com/en-sg/hotel/search?spec=01-10-2026.02-10-2026.1.1.HOTEL_GEO.107493.Singapore.2"],
"fetchDetails": true,
"maxItems": 30
}

Monitor a scope for changes (recurring schedule):

{
"mode": "search",
"market": "en-my",
"locations": ["Kuala Lumpur"],
"maxItems": 50,
"incrementalMode": true,
"emitUnchanged": false
}

Input Parameters

ParameterTypeDefaultDescription
modeselectsearchSearch by city, or paste Traveloka links.
marketselecten-sgStorefront locale; sets language and currency.
locationsstringList["Singapore"]Cities or areas to walk (search mode).
checkInDatedatetomorrowCheck-in date (YYYY-MM-DD).
checkOutDatedateday after check-inCheck-out date (YYYY-MM-DD).
adultsinteger2Adult guests per search.
roomsinteger1Rooms per search.
sortByselectpopularityResult order: popularity, price low to high, price high to low.
minPrice / maxPriceintegeremptyNightly price window, applied to returned results (client side).
minStarRatinginteger0Drop hotels below this star rating (client side).
minGuestRatingnumberemptyDrop hotels scoring below this out of 10 (client side).
urlsstringListemptyTraveloka search (spec=) links or hotel detail links (URL mode).
fetchDetailsbooleanfalseRead each hotel's own page for description, address and amenities. Bills the detail-enrichment surcharge per successfully read hotel.
maxItemsinteger20Maximum records per run; 0 for unlimited.
maxPagesinteger0Safety cap on pages per location; 0 for no page cap.
resumeFromRunIdstringemptyContinue an interrupted run, skipping already-saved hotels.
incrementalModebooleanfalseOnly emit new or changed rows on repeated runs of the same scope.
stateKeystringemptyOptional name for the incremental baseline storage.
emitUnchangedbooleanfalseAlso emit (and bill) unchanged rows in incremental mode.
emitExpiredbooleanfalseAlso emit (and bill) rows that disappeared in a complete walk.
proxyproxyApify residentialThe Actor rotates a multi-country residential pool (SG/ID/MY/TH/VN/PH — a fresh exit per attempt) and fails over automatically if every pool exit is refused. Runs without the RESIDENTIAL group (datacenter) are refused by the site and only get the operator's datacenter failover lane when configured.
mcpConnectorsarrayemptyOptionally pipe results into Notion, Linear, Airtable or another MCP-connected app.

Output Example

Sample shape - values are illustrative placeholders, not from a live listing.

{
"hotelId": "254056",
"name": "Sample City Hotel",
"url": "https://www.traveloka.com/en-sg/hotel/singapore/sample-city-hotel-254056?checkIn=2026-10-01&checkOut=2026-10-02",
"locationName": "Singapore",
"region": "Sample District, Singapore",
"price": 210.0,
"priceMinor": 21000,
"currency": "SGD",
"starRating": 4.0,
"guestRating": 8.5,
"guestRatingMax": 10.0,
"guestRatingLabel": "Very Good",
"numReviews": 18265,
"latitude": 1.307744,
"longitude": 103.862695,
"facilities": ["Wi-Fi in public areas"],
"imageUrl": "https://ik.imagekit.io/tvlk/.../asset/000000-0000000000000.jpeg",
"market": "en-sg",
"checkInDate": "2026-10-01",
"checkOutDate": "2026-10-02",
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00Z",
"lastSeenAt": "2026-01-01T00:00:00Z"
}

With fetchDetails enabled, records also carry description, address, amenities and detailFetched when the hotel's own page was read successfully.

Send results into your apps (MCP connectors)

You can optionally send results into the apps you already use through Apify MCP connectors: authorize a connector under Apify, Settings, API & Integrations, then pick it in the mcpConnectors input. Notion receives one page per hotel under the page you set in notionParentPageUrl; other connectors receive a condensed summary per item (title plus the main fields flattened as text). The connector write is a side-channel: it never changes the dataset, and the complete record always stays in the Apify dataset. Cap the export per run with maxNotifyListings.