Scraper for TripAdvisor — Restaurants, Hotels & Reviews
Pricing
from $1.50 / 1,000 results
Scraper for TripAdvisor — Restaurants, Hotels & Reviews
Independent, unofficial scraper for TripAdvisor — no key, no login. Get restaurants, hotels, attractions & reviews by city, geoId or URL: ratings, prices, cuisine, coordinates & review text. Not affiliated with or endorsed by TripAdvisor; all trademarks belong to their owners.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Tripadvisor Hotels & Reviews Scraper
Independent, unofficial tool. Not affiliated with, endorsed by, or sponsored by Tripadvisor LLC. Tripadvisor trademarks belong to their owners.
Extract public hotel shelf cards and review rows without a Tripadvisor API key, login, user cookie, or browser. Results are written as flat records to the default Apify dataset.
Current upstream status — 2026-08-01
| Mode | Surface | Status |
|---|---|---|
hotels | Registered GraphQL hotel shelves | Working on Apify residential proxies |
reviews | Registered GraphQL review list | Working on Apify residential proxies |
restaurants, attractions, search, details | Legacy HTML / TypeAheadJson | Upstream blocked on tested Apify residential exits; fails closed |
The healthy modes use the registered GraphQL operations currently called by Tripadvisor's public web client. They require no user-supplied credential. Registered query IDs are upstream implementation details and can rotate: if Tripadvisor removes them, the Actor fails explicitly until the current web-client operation is identified and revalidated. It never converts a blocked or structurally unknown response into a misleading successful empty dataset.
For reliable targeting, give hotels a numeric geoId (for example g187791) or hotel-list URL, and give reviews a d… locationId or detail URL. Free-text name resolution uses the challenged legacy autocomplete endpoint and is not a healthy production path right now.
Quick start
Empty input defaults to a bounded hotel shelf for Rome (g187791). An explicit run:
{"mode": "hotels","url": "https://www.tripadvisor.com/Hotels-g187791-Rome_Lazio-Hotels.html","maxResults": 20,"language": "en-US","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Reviews for a known location:
{"mode": "reviews","url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html","maxResults": 100,"language": "en-US"}
Inputs
| Field | Type | Meaning |
|---|---|---|
mode | string | hotels (default), reviews, or a legacy mode |
query | string | GeoId such as g187791 is recommended; free text is legacy/best effort |
locationId | string | GeoId for hotels or d… POI id for reviews/details |
url | string | Full matching Tripadvisor URL; takes priority |
locationIds | string[] | Batch inputs for legacy details mode |
maxResults | integer | Output cap, not a guaranteed row count |
language | string | Requested locale; Tripadvisor may still return mixed-language content |
proxyConfiguration | object | Defaults to Apify RESIDENTIAL |
Hotel shelves are a bounded discovery surface, not deep search pagination. maxResults caps the unique cards available in the returned shelves. Reviews paginate in batches until the cap, upstream end, or the Actor time budget.
Output
Every row includes _mode, sourceSurface, and scrapedAt.
Hotel rows can include:
geoId,locationId,name,rating,numReviewslowestOffer(display text, not a normalized or guaranteed bookable rate)photoUrl,photoCaption,awardType,awardYearshelfType,shelfTitle,url
Review rows can include:
locationId,locationName,reviewId,rating,title,textpublishedDate,stayDate,tripTypeusername,userContributions,helpfulVotes,ownerResponse,url
Fields are optional because Tripadvisor controls the live payload. IDs, counts and ratings are normalized where possible; no inference fills missing source data.
Operational behavior
- Requests use
got-scrapingthrough Apify residential proxies with a sticky cookie/IP session after success. - A blocked response gets one fresh residential session. Repeated 403/429 responses are not blindly retried.
- GraphQL errors, unknown payload shapes, blocked pages, and zero trustworthy rows fail the run explicitly.
- Trustworthy partial review rows already written before a later pagination failure remain in the dataset.
- No headless browser is launched and no user credentials are collected.
API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('YOUR_ACTOR_ID').call({mode: 'hotels',query: 'g187791',maxResults: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Limits and responsible use
Tripadvisor can change or withdraw public surfaces without notice. Residential proxy access improves reachability but is not a guarantee. Review text, photos, reviewer names, and other fields may be protected by copyright or privacy law. Follow Tripadvisor's terms and applicable law, minimize personal-data use, and do not use outputs for spam, harassment, or re-identification. Consider Tripadvisor's official Content API when you need a supported commercial integration.
Changelog
2026-08-01
- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
- Kept the last successful residential proxy session, browser fingerprint and cookie jar sticky across typeahead and subsequent list/detail requests; blocked sessions now rotate together with their cookies.
- Added blocked/challenge and response-structure guards so an entirely blocked or structurally unreadable run fails explicitly instead of reporting SUCCEEDED with an empty dataset.
- Corrected priceLevel normalization so ranges such as $$ - $$$ produce the valid lower band 2 instead of the impossible summed value 5, while preserving the raw priceRange.
- Aligned explicit URL priority, the UI maxResults prefill, locale headers, input copy and README claims with best-effort source coverage.
- Recovered hotels and reviews through Tripadvisor's current public registered GraphQL hotel-shelf and review-list operations, repeatedly verified over Apify RESIDENTIAL routing without a user key or cookie.
- Moved empty input and Console defaults to hotels plus Rome geoId g187791 so the healthy path does not depend on the currently challenged TypeAheadJson surface.
- Limited blocked responses to one residential-session rotation, kept explicit fail-closed behavior, and documented the persisted-query rotation recovery path and current BLOCKED status of legacy HTML modes.
- Added typed GraphQL dataset fields and curated explicit-URL variations for Rome hotels and Michelangelo reviews.
2026-08-01 — deterministic hotel/review recovery
- Replaced challenged hotel HTML and review-page fetches with current registered GraphQL hotel-shelf and review-list operations.
- Moved empty input and Console defaults to
hotels+ Romeg187791, avoiding challenged autocomplete. - Reduced blocked-response handling to one session rotation and kept fail-closed semantics.
- Added typed GraphQL output fields, curated Rome hotel/Michelangelo review validations, and explicit upstream-status/recovery documentation.
- Preserved legacy modes for compatibility while marking their current residential-proxy status accurately.
2026-08-01 — parser and session hardening
- Kept successful proxy, browser fingerprint, and transient cookie jar together across related legacy requests.
- Added challenge/structure guards so blocked or unreadable runs do not report successful empty datasets.
- Corrected
priceLevel:$$ - $$$now yields lower band2while preservingpriceRange.