Traveloka Hotel Scraper - SEA Hotel Prices & Ratings
Pricing
from $1.80 / 1,000 hotel results
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
Maintained by CommunityActor 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.
| Field | Example 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" |
| price | 210.0 |
| currency | "SGD" |
| starRating | 4.0 |
| guestRating | 8.5 |
| guestRatingLabel | "Very Good" |
| numReviews | 18265 |
| latitude | 1.307744 |
| longitude | 103.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). | |
| address | street-level address; backfilled via coordinates when the feed leaves it empty (detail toggle) |
| description | document-only field, populated only for pasted hotel links (URL mode) |
| address | document-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
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | select | search | Search by city, or paste Traveloka links. |
| market | select | en-sg | Storefront locale; sets language and currency. |
| locations | stringList | ["Singapore"] | Cities or areas to walk (search mode). |
| checkInDate | date | tomorrow | Check-in date (YYYY-MM-DD). |
| checkOutDate | date | day after check-in | Check-out date (YYYY-MM-DD). |
| adults | integer | 2 | Adult guests per search. |
| rooms | integer | 1 | Rooms per search. |
| sortBy | select | popularity | Result order: popularity, price low to high, price high to low. |
| minPrice / maxPrice | integer | empty | Nightly price window, applied to returned results (client side). |
| minStarRating | integer | 0 | Drop hotels below this star rating (client side). |
| minGuestRating | number | empty | Drop hotels scoring below this out of 10 (client side). |
| urls | stringList | empty | Traveloka search (spec=) links or hotel detail links (URL mode). |
| fetchDetails | boolean | false | Read each hotel's own page for description, address and amenities. Bills the detail-enrichment surcharge per successfully read hotel. |
| maxItems | integer | 20 | Maximum records per run; 0 for unlimited. |
| maxPages | integer | 0 | Safety cap on pages per location; 0 for no page cap. |
| resumeFromRunId | string | empty | Continue an interrupted run, skipping already-saved hotels. |
| incrementalMode | boolean | false | Only emit new or changed rows on repeated runs of the same scope. |
| stateKey | string | empty | Optional name for the incremental baseline storage. |
| emitUnchanged | boolean | false | Also emit (and bill) unchanged rows in incremental mode. |
| emitExpired | boolean | false | Also emit (and bill) rows that disappeared in a complete walk. |
| proxy | proxy | Apify residential | The 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. |
| mcpConnectors | array | empty | Optionally 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.