Scraper for TripAdvisor — Restaurants, Hotels & Reviews avatar

Scraper for TripAdvisor — Restaurants, Hotels & Reviews

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Scraper for TripAdvisor — Restaurants, Hotels & Reviews

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

Logiover

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

ModeSurfaceStatus
hotelsRegistered GraphQL hotel shelvesWorking on Apify residential proxies
reviewsRegistered GraphQL review listWorking on Apify residential proxies
restaurants, attractions, search, detailsLegacy HTML / TypeAheadJsonUpstream 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

FieldTypeMeaning
modestringhotels (default), reviews, or a legacy mode
querystringGeoId such as g187791 is recommended; free text is legacy/best effort
locationIdstringGeoId for hotels or d… POI id for reviews/details
urlstringFull matching Tripadvisor URL; takes priority
locationIdsstring[]Batch inputs for legacy details mode
maxResultsintegerOutput cap, not a guaranteed row count
languagestringRequested locale; Tripadvisor may still return mixed-language content
proxyConfigurationobjectDefaults 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, numReviews
  • lowestOffer (display text, not a normalized or guaranteed bookable rate)
  • photoUrl, photoCaption, awardType, awardYear
  • shelfType, shelfTitle, url

Review rows can include:

  • locationId, locationName, reviewId, rating, title, text
  • publishedDate, stayDate, tripType
  • username, 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-scraping through 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 + Rome g187791, 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 band 2 while preserving priceRange.