TripAdvisor Hotels Scraper
Pricing
from $2.34 / 1,000 hotel result pusheds
TripAdvisor Hotels Scraper
Search TripAdvisor hotels by destination and fetch full hotel detail plus genuinely paginated reviews (a real cursor, not a fixed 20-review cap) for one or more hotel ids. Talks directly to TripAdvisor's internal mobile API — no account or key needed. Derived from tripadvisor-all-in-one-api.
What does TripAdvisor Hotels Scraper do?
TripAdvisor Hotels Scraper searches TripAdvisor hotels for a destination and/or fetches full detail plus paginated reviews for one or more hotel ids — a batch-run Actor that pushes one dataset row per result.
It talks directly to the same internal API the official TripAdvisor Android app uses, reverse-engineered by capturing live traffic from a real device. No TripAdvisor account, no API key of your own — set up an input, run the Actor, get a dataset.
This is the hotels-only, batch-run slice of TripAdvisor All-in-One API, which also serves restaurants and attractions as an always-on Standby REST API. Use this Actor instead when you just want hotel search/detail/reviews as normal dataset rows, no API integration required.
Why use TripAdvisor Hotels Scraper?
- Search, detail, and reviews in one Actor — pass a destination id to search, hotel ids to get full detail, or both
- Real filters that genuinely work — price range, amenities, minimum rating, sort — confirmed live against the same underlying endpoint the parent Actor validated
- Real paginated reviews, not a 20-item cap — confirmed live end-to-end: page 2 returns 20 genuinely new reviews with zero overlap with page 1, using TripAdvisor's own real (non-trivial) pagination cursor, wrapped so you don't have to reverse-engineer it yourself
- No account needed — every endpoint works fully anonymously
- Use cases: hotel price/rating monitoring, review analysis, destination research, travel content aggregation
Input
At least one of geoId or hotelIds is required.
| Field | Type | Description |
|---|---|---|
geoId | string | Numeric TripAdvisor destination id, e.g. "293916" for Bangkok. Runs a hotel search when set. |
priceMin / priceMax | integer | Nightly price range — confirmed live to genuinely filter results |
amenities | string[] | Amenity tag ids. Get ids from a prior response's filters.availableFilterGroups |
minRating | string | Confirmed live values "1"-"5" |
sort | string | Confirmed live values: BEST_VALUE, PRICE_LOW_TO_HIGH |
maxPages | integer, default 10 | Stop after this many search pages. In practice this Actor's search only ever returns 1 page — see Known limitations |
maxItems | integer | Stop once this many hotels from the search have been pushed |
hotelIds | string[] | TripAdvisor hotel content ids to fetch full detail for (and reviews, if requested) |
includeReviews | boolean, default false | For each hotel id, also fetch its paginated reviews and attach them to the hotel's row |
reviewsMaxItems | integer | Stop once this many reviews have been fetched per hotel. Leave empty for all reviews |
currency | string, default "GBP" | ISO code — confirmed live to change returned prices |
Example — search:
{ "geoId": "293916", "minRating": "4", "sort": "PRICE_LOW_TO_HIGH", "maxItems": 20 }
Example — detail + reviews:
{ "hotelIds": ["25246100", "302769"], "includeReviews": true, "reviewsMaxItems": 40 }
Output
Search (geoId) — one dataset row per hotel card:
{"stableDiffingType": "HotelListCard_hotel_302769_HOTEL_0","listSingleCardContent": {"cardTitle": { "string": "The Peninsula Bangkok" },"bubbleRating": { "rating": 4.7, "numberReviews": { "string": "(5,968)" } },"commerceInfo": { "priceForDisplay": { "string": "£260" } },"cardLink": { "route": { "params": { "contentId": "302769", "contentType": "hotel" } } }}}
Detail (hotelIds) — one dataset row per hotel id:
{"hotelId": "25246100","hotel": {"AppPresentation_queryAppDetailV2": [{ "container": { "navTitle": "Villa Deva Resort & Hotel Bangkok" } }]},"reviews": [{ "htmlTitle": { "htmlString": "Special thanks to May, Im, and Benz" }, "bubbleRating": { "rating": 5 } }]}
reviews is omitted entirely when includeReviews is false.
Data notes
- No request signing exists at all — confirmed by capturing the real app's traffic and finding just static identity headers, not validated against any server-side registry.
- Review pagination is genuinely non-trivial, and this Actor handles it for you. Confirmed live: a raw page-number parameter alone silently re-returns page 1 — real pagination requires threading an opaque continuation cursor from the previous response back into the next request, alongside an internal page-depth counter. Verified end-to-end during this Actor's own smoke test: fetching hotel
25246100's reviews returned real, distinct review content. currencychanges real prices, not just a symbol.
Known limitations
- Hotel search only returns 1 page, confirmed live during this Actor's own smoke test. Search pagination beyond page 1 was genuinely attempted (not just left unwrapped like the parent Actor) — the same
extractUpdateToken()cursor mechanism the reviews pagination below uses was threaded into a secondlistContent()call asupdateToken. TripAdvisor's GraphQL schema rejects it:updateTokenis not a valid field of the list endpoint'srouteParameters(InputMapDefinesTooManyFieldsException/ "not defined for input object typeRouting_AppListParametersInput"), unlike the reviews endpoint where the identical mechanism works.maxPagesabove 1 has no further effect until TripAdvisor's app is found sending that cursor through some other field. - This Actor only wraps guest-accessible endpoints. No login flow is implemented or planned — features requiring a real TripAdvisor account (saved trips, writing reviews, booking) are out of scope by design.
- Restaurants and attractions, destination search, the home feed, and photo galleries are covered by TripAdvisor All-in-One API instead.
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Tripadvisor LLC. Behavior may change if TripAdvisor changes its API.
Pricing
Pay per event: $0.003 per hotel — charged once for each hotel returned by search and once for each hotel id's detail row (Free plan price; lower on paid Apify plans). See the Actor's Pricing tab for current tiered rates.
Found a bug or have a feature request? Use the Issues tab on this Actor's page.