TripAdvisor Attractions Scraper
Pricing
from $2.34 / 1,000 attraction result pusheds
TripAdvisor Attractions Scraper
Search TripAdvisor attractions and things-to-do for a destination, and fetch full detail plus genuinely paginated reviews for one or more attraction ids. Talks directly to TripAdvisor's internal mobile API; no account or API key needed. Derived from romy/tripadvisor-all-in-one-api.
What does TripAdvisor Attractions Scraper do?
TripAdvisor Attractions Scraper searches attractions/things-to-do for a destination, and/or fetches full detail plus paginated reviews for specific attraction ids — one dataset row per attraction (search) or per attraction id (detail).
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 — this is the attractions slice of TripAdvisor All-in-One API, split out as its own focused Actor.
Why use TripAdvisor Attractions Scraper?
- Search or detail, in one Actor — give a destination
geoIdfor search results, orattractionIdsfor full detail, or both in one run - Real paginated reviews, not a fixed 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
- One row per attraction id, sub-calls merged — detail and (optionally) all requested review pages are fetched and merged into a single dataset row per id
- No account needed — every request works fully anonymously
- Use cases: things-to-do content aggregation, review analysis, destination research bots, rating monitoring
Input
| Field | Type | Description |
|---|---|---|
geoId | string | Destination geo id (e.g. "293916" for Bangkok, from the parent API's /search endpoint). If set, runs an attraction search for this destination. |
minRating | string | "1"-"5". Only applies to the geoId search. |
sort | string | Sort order (see a response's filters.availableSorts for values that apply to attractions). Only applies to the geoId search. |
maxPages | integer | Default 10. Stop after this many search result pages. See Known limitations — genuine pagination beyond page 1 is not confirmed to work. |
maxItems | integer | Stop once this many attractions have been pushed from the search. Default: unlimited (bounded by maxPages). |
attractionIds | string[] | Attraction content ids (from a geoId search, or the parent API). For each id, fetches full detail. |
includeReviews | boolean | Default false. If true, also paginates and includes reviews for each id in attractionIds. |
reviewsMaxItems | integer | Stop once this many reviews have been fetched for a given attraction id. Default: unlimited (all available reviews). Only applies when includeReviews is true. |
currency | string | ISO code, default GBP. Confirmed live to change returned prices where applicable. |
At least one of geoId or attractionIds is required (validated at run time, not by the input schema, so both can be supplied together in one run).
Example — search:
{ "geoId": "293916", "minRating": "4", "maxItems": 20 }
Example — detail + reviews:
{ "attractionIds": ["450971", "311043"], "includeReviews": true, "reviewsMaxItems": 40 }
Output
Search (geoId set) — one row per attraction, e.g.:
{"cardTitle": { "string": "Chatuchak Weekend Market" },"bubbleRating": { "rating": 4.3, "numberReviews": { "string": "(18,374)" } },"cardLink": { "route": { "params": { "contentId": "450971", "contentType": "attraction" } } },"...": "full AppPresentation_HorizontalStandardCard fields"}
Detail / reviews (attractionIds set) — one row per attraction id:
{"attractionId": "450971","attraction": { "...": "full QueryHotelAppDetail response" },"reviews": [{"userProfile": { "displayName": "Rwo H" },"bubbleRating": { "rating": 5 },"htmlTitle": { "htmlString": "Plan Ahead for Chatuchak Weekend Market" },"htmlText": { "htmlString": "Chatuchak was the perfect last stop..." },"publishedDate": { "string": "4 days ago" },"...": "full AppPresentation_UserReviewSection fields"}]}
reviews is omitted entirely when includeReviews is false.
How it connects to the parent
This Actor is a narrow spin-off of TripAdvisor All-in-One API (a Standby REST API covering hotels, restaurants, and attractions), scoped to the attractions/things-to-do vertical only — derived from its GET /attractions, GET /attractions/{id}, and GET /attractions/{id}/reviews endpoints. Unlike the parent, this is a normal batch-run Actor: give it input, get dataset rows out.
Known limitations
- Attraction list search only reliably returns page 1. Confirmed live during this Actor's own testing: the
AppPresentation_queryAppListV2response forcontentType=attractionnever carries anupdateToken/continuation cursor at all (unlike the reviews endpoint), and re-requesting without one returns byte-identical items. This matches the parent Actor's README, which flagsupdate_tokenon/attractionsas exposed but not fully wrapped. This Actor attempts to thread a cursor viaextractUpdateToken()(the same mechanism that works for reviews) and will page further if a future TripAdvisor response ever includes one that demonstrably advances — but as of this writing it caps at 1 page and logs a warning rather than silently re-fetching the same results. - Reviews pagination is genuinely non-trivial, and this Actor handles it for you. Confirmed live: page 2 returned 20 genuinely new reviews with zero overlap with page 1, using an opaque continuation cursor threaded internally — you don't need to understand TripAdvisor's own token format.
- This Actor only wraps guest-accessible endpoints. No login flow is implemented — features requiring a real TripAdvisor account are out of scope by design.
- 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 attraction — charged once for each attraction returned by search and once for each attraction 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.