TripAdvisor Hotels & Reviews Scraper | $3.50 / 1k avatar

TripAdvisor Hotels & Reviews Scraper | $3.50 / 1k

Pricing

from $3.50 / 1,000 results

Go to Apify Store
TripAdvisor Hotels & Reviews Scraper | $3.50 / 1k

TripAdvisor Hotels & Reviews Scraper | $3.50 / 1k

Scrape TripAdvisor hotels, restaurants, things to do, and reviews in one Actor. Get prices, star ratings, GPS, amenities, hours, photos, awards, and full review threads. Input by URL, search keyword, or city name. $3.50 / 1k places, $0.50 / 1k reviews.

Pricing

from $3.50 / 1,000 results

Rating

0.0

(0)

Developer

Raven

Raven

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

TripAdvisor Scraper — Hotels, Restaurants, Attractions and Reviews in One Actor

Scrape TripAdvisor hotels, restaurants, things to do, and customer reviews — all from a single Actor. Three input modes: paste any TripAdvisor URL, type a free-text keyword, or pass a city name. Get pricing, star ratings, GPS coordinates, amenities, opening hours, photos, awards, and full review threads.

Pricing

Pay per result. No subscription, no minimum.

EventPricePer 1,000
Result (one place — hotel, restaurant or attraction)$0.0035$3.50
Review (one TripAdvisor review, embedded in its parent place)$0.0005$0.50

You only pay for what lands in the dataset. Listing pagination, typeahead, retries, and DataDome rotations are absorbed by the Actor — never charged to you. Set maxItems and maxReviewsPerPoi to cap the run, plus Maximum cost per run (default $20) as a hard budget.

Key Features

  • Three input modes — paste TripAdvisor URLs, type free-text search terms, or list cities by name (or numeric geo ID). Each mode has its own dedicated input field.
  • All four place types — hotels, restaurants, things to do, and a single review parser that handles all of them
  • Reviews embedded inline — each place record carries a reviews: [...] array, so one row in the dataset = one place with everything about it
  • City listing crawler — paginates Hotels-g{id}-…html, Restaurants-g{id}-…html, Attractions-g{id}-Activities-…html to discover all POIs in a destination
  • Typeahead resolver — turn "Paris", "Dubai", "New York City" into the right TripAdvisor geo ID at runtime via TripAdvisor's official autocomplete GraphQL
  • DataDome bypass — TLS fingerprint impersonation (tls_client Chrome 133, no headers overridden) auto-rotates the proxy session on every 403 / captcha hit, up to 5 retries per request, each with a fresh IP
  • Parallel scraping — up to 10 concurrent worker pool (configurable), each with its own IP and cookie jar; a dedicated thread pool keeps tls_client's sync API from queueing on Python's tiny default executor
  • Two-layout review parser — TripAdvisor uses different DOM for hotels vs attractions; the Actor detects both (data-test-target="HR_CC_CARD" and legacy data-automation="reviewCard") automatically
  • Hard budget capMaximum cost per run stops the run cleanly the moment your $X budget is hit, exit code 0, no partial double-charge
  • Apify Residential US proxy — hardcoded; users never see proxy settings or IP rotation logic

What Data You Get

Every dataset row is a single place record (hotel, restaurant or attraction). When Include reviews is on, reviews come embedded inside that record as an array.

Hotel record

FieldDescription
__type"hotel"
locationIdTripAdvisor numeric POI id
parentGeoIdNumeric city id
urlCanonical TripAdvisor URL
nameHotel name
description"About this hotel" text
starRatingOfficial hotel class (1.0–5.0 stars)
priceRangeTripAdvisor price band ($$)
priceFromLowest deal price across booking partners
finalPriceHeadline price shown in the booking module
dealsCountHow many booking partners have a deal
awardsTravelers' Choice / Best of the Best / etc.
phone, officialWebsiteContact details
rating, reviewCount, rankingAggregate rating, total reviews, "#3 of 1,882 hotels"
address, city, postalCode, country, regionFull address
latitude, longitudeGPS coordinates
amenitiesFlat list of all amenities
amenityGroupsSame amenities split by property / room_amenities / room_types
languagesSpokenWhen TripAdvisor lists them
imagesUp to 30 photo URLs
breadcrumbsFull geo hierarchy (Europe > France > Ile-de-France > Paris > …)

Restaurant record

FieldDescription
__type"restaurant"
locationId, parentGeoId, url, nameIdentity
descriptionAbout this restaurant
phone, imageContact + cover photo
rating, reviewCount, rankingAggregate rating, total reviews, "#24 of 14,022 Restaurants"
priceLevel$, $$, $$ - $$$, etc.
cuisines["Japanese", "Sushi", "Asian"]
mealTypes["Lunch", "Dinner", "Brunch"]
specialDiets["Vegetarian friendly", "Gluten Free", "Vegan options"]
features["Reservations", "Outdoor Seating", "Takeout", "Delivery"]
awardsTravelers' Choice / Michelin / etc.
openingHoursHours per day of week
latitude, longitudeGPS coordinates
city, country, regionGeo
imagesUp to 30 photo URLs
breadcrumbsFull geo hierarchy

Attraction record

FieldDescription
__type"attraction"
locationId, parentGeoId, url, nameIdentity
descriptionAbout this attraction
phone, officialWebsite, imageContact + cover photo
rating, reviewCount, ranking, bestRatingRatings + "#11 of 4,244 things to do"
openingHourse.g. "Mo-Su 09:30-23:00"
durationSuggested visit length, e.g. "1-2 hours"
ticketPriceFromCheapest ticket / tour price ("$54")
categoriesList of attraction categories (Architectural Buildings, Monuments, etc.)
awardsTravelers' Choice / Best of the Best / etc.
address, city, postalCode, countryFull address
latitude, longitudeGPS coordinates
imagesUp to 30 photo URLs
breadcrumbsFull geo hierarchy

Embedded review (when Include reviews = true)

Reviews live inside their parent place record under reviews: [...]. Each review carries:

FieldDescription
reviewIdTripAdvisor review id
urlPermalink to the single-review page
titleReview title
rating1.0–5.0 (parsed from "X of 5 bubbles")
textFull review body
languageBCP-47 language code (when tagged)
travelDateWhen the user stayed/visited (e.g. "April 2026")
tripType"Traveled with family" / "Couples" / "Solo" / etc.
writtenDateWhen the review was posted
helpfulVotesHelpful-vote count
reviewer{name, profileUrl, contributions, location}
ownerResponseOwner reply if present

Plus reviewsScraped: N on the parent place — handy when you set maxReviewsPerPoi and want to know how many actually came back.

Use Cases

  • Hotel competitive analysis — pull every hotel in a city with prices, ratings, amenities, ranking, and photos for benchmarking against your own property
  • Restaurant market research — scrape restaurants by cuisine and price band; compare ratings, awards, and customer sentiment from review text
  • Tourism analytics — top attractions per city with visit duration, ticket prices, and rating breakdowns for tour operators and travel agencies
  • Review sentiment mining — bulk-extract review text, ratings, dates, and trip types for sentiment analysis, brand monitoring, and reputation management
  • Pricing intelligence — track priceFrom and dealsCount across hotels to spot pricing trends and OTA partner availability
  • OTA / aggregator data feed — power your own travel site or app with TripAdvisor's place data: GPS, amenities, hours, photos
  • Hospitality SEO research — what cuisines / categories rank top in a city, which Travelers' Choice winners exist, what features customers ask about
  • Lead generation for travel suppliers — extract hotel and restaurant contact info (phone, website, email when listed) for outreach
  • Travel content creation — auto-generate destination guides with curated lists of top-rated places, photos, and review quotes

How It Works

  1. Pick an Input Mode at the top of the form — Start URLs, Search terms, or Cities
  2. Fill the matching field — paste TripAdvisor URLs, type keywords like "Eiffel Tower", or list cities like "Paris", "Dubai", "187147"
  3. Pick a CategoryAll / Hotels / Restaurants / Attractions (ignored when you pass a direct detail URL)
  4. Toggle Include reviews — embeds reviews inside each place record (charged separately)
  5. Set capsMax items total (hard cap on dataset rows), Max reviews per POI, Max POIs per listing, Maximum cost per run
  6. Run — actor pulls TripAdvisor pages through Apify Residential US proxy, parses JSON-LD + DOM, pushes flat rows to the dataset
  7. Download — JSON, CSV, or Excel from the Apify dataset; the table view is preconfigured to show name, rating, price, ranking, city

Input Parameters

FieldTypeDefaultDescription
modestringlocationsstartUrls, searchTerms, or locations
startUrlsURL listTripAdvisor pages: Hotel_Review-, Restaurant_Review-, Attraction_Review-, Hotels-, Restaurants-, Attractions-
searchTermsstring listFree-text keywords (resolved via TripAdvisor typeahead)
locationsstring listCity names ("Paris", "New York City") or numeric geo IDs ("187147")
categoryenumallall, hotels, restaurants, attractions
includeReviewsbooleanfalse (UI prefill: true)Fetch reviews and embed them inside each place record
maxReviewsPerPoiinteger10Cap on reviews per place. Each review = $0.50 / 1,000
maxPoisinteger50Cap on POIs per listing in searchTerms / locations modes
maxItemsinteger10Hard cap on total dataset rows. 0 = unlimited
localestringen-USBCP-47 — used for typeahead and Accept-Language
maxRetriesinteger5Retries per request before giving up; each retry uses a new IP
maxConcurrencyinteger10Parallel workers (each with its own IP)

Example: scrape Paris and Dubai with 10 hotels each + 5 reviews per hotel

{
"mode": "locations",
"locations": ["Paris", "Dubai"],
"category": "hotels",
"includeReviews": true,
"maxReviewsPerPoi": 5,
"maxPois": 10,
"maxItems": 0
}

Example: pull a specific hotel with 50 reviews

{
"mode": "startUrls",
"startUrls": [
{ "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html" }
],
"includeReviews": true,
"maxReviewsPerPoi": 50
}

Example: keyword search across types

{
"mode": "searchTerms",
"searchTerms": ["Eiffel Tower", "Le Bernardin"],
"category": "all",
"includeReviews": false
}

Output Example

Hotel with embedded reviews

{
"__type": "hotel",
"locationId": 250927,
"parentGeoId": 187147,
"url": "https://www.tripadvisor.com/Hotel_Review-g187147-d250927-Reviews-Hotel_Europe_Saint_Severin-Paris_Ile_de_France.html",
"name": "Hotel Europe Saint Severin",
"description": "Friendly and comfortable property located in the heart of the Latin quarter…",
"starRating": 3.0,
"priceRange": "$$ (Based on Average Nightly Rates for a Standard Room from our Partners)",
"priceFrom": "$160",
"finalPrice": "$221",
"dealsCount": 11,
"awards": ["Travelers' Choice"],
"rating": 4.5,
"reviewCount": 3256,
"ranking": "#383 of 1,882 hotels",
"address": "38-40 Rue Saint Severin",
"city": "Paris",
"postalCode": "75005",
"country": "FR",
"latitude": 48.852753,
"longitude": 2.344314,
"amenityGroups": {
"property": ["Free WiFi", "24-hour front desk", "Concierge", "..."],
"room_amenities": ["Air conditioning", "Bathrobes", "..."],
"room_types": ["Non-smoking rooms", "Family rooms"]
},
"images": ["https://dynamic-media-cdn.tripadvisor.com/..."],
"reviews": [
{
"reviewId": 1057616466,
"title": "Perfect hotel for a family",
"rating": 5.0,
"text": "I can only recommend this hotel! We stayed here as a family of three…",
"travelDate": "April 2026",
"tripType": "Traveled with family",
"writtenDate": "Apr 26",
"helpfulVotes": 1,
"reviewer": {
"name": "Erdal A",
"profileUrl": "https://www.tripadvisor.com/Profile/erdala957",
"contributions": null,
"location": null
}
}
],
"reviewsScraped": 5
}

Restaurant

{
"__type": "restaurant",
"locationId": 425227,
"parentGeoId": 60827,
"name": "Geido Restaurant",
"description": null,
"rating": 4.4,
"reviewCount": 287,
"ranking": "#42 of 5,341 Restaurants in Brooklyn",
"priceLevel": "$$ - $$$",
"cuisines": ["Japanese", "Sushi", "Asian"],
"specialDiets": ["Vegetarian friendly"],
"features": ["Delivery"],
"awards": ["Travelers' Choice"],
"openingHours": {
"Sunday": ["12:00-22:00"],
"Monday": ["12:00-22:00"]
},
"latitude": 40.677,
"longitude": -73.969
}

Attraction

{
"__type": "attraction",
"locationId": 188151,
"parentGeoId": 187147,
"name": "Eiffel Tower",
"rating": 4.6,
"reviewCount": 143855,
"ranking": "#11 of 4,244 things to do",
"openingHours": "Mo-Su 09:30-23:00",
"duration": "1-2 hours",
"ticketPriceFrom": "$54",
"categories": ["Architectural Buildings in Paris", "Monuments & Statues in Paris", "..."],
"awards": ["Travelers' Choice", "Best of the Best"],
"officialWebsite": "https://www.toureiffel.paris/",
"phone": "+33 892 70 12 39",
"latitude": 48.858353,
"longitude": 2.294464
}

Proxy Requirements

Apify Residential US proxy is hardcoded — you never configure it. TripAdvisor uses DataDome bot management; only residential IPs from the right pool consistently pass. No SOCKS5, no datacenter — Apify Residential is required.

The Actor rotates the proxy session (= new IP) on every 403 / captcha / connection error, up to 5 times per request. With 10 parallel workers, each runs on its own IP — even bursty fan-outs to 50 hotels at once stay under DataDome's per-IP rate.

Limitations

  • Reviews behind DataDome lite-mode — on some Apify residential IPs TripAdvisor returns a stripped detail page (JSON-LD intact, but review markup omitted). The Actor falls back to the dedicated -or10- review-pagination URL automatically. If both fail, the review array is empty for that place — the place itself is still pushed
  • Listing depth — city listings paginate at 30 POIs per page; default cap is 50 POIs per listing (set maxPois higher to scrape more, up to 5,000)
  • Reviews per POI cap — server-side TripAdvisor allows hundreds of pages; default cap is 10 reviews to keep runs cheap, set maxReviewsPerPoi higher (up to 50,000)
  • Persisted GraphQL queries rotate — TripAdvisor's typeahead uses a persisted query id (58aa2507ecd677af at the time of writing). When TripAdvisor deploys, this id changes and searchTerms / locations modes (the ones that go through typeahead) start failing. Start URLs mode keeps working unaffected. Re-deploy of the Actor will pick up the new id
  • Two-layout review markup — TripAdvisor uses different DOM for hotels vs attractions reviews. The Actor detects and parses both. If TripAdvisor adds a third layout, expect a few hours of zero-review runs before a hotfix
  • Geo coverage — TripAdvisor's data is global; this Actor specifically scrapes the tripadvisor.com domain (English / US locale by default). Non-English locales work via the locale parameter

FAQ

What kinds of TripAdvisor data does this Actor scrape? Hotels, restaurants, things to do (attractions), and customer reviews. Reviews come embedded inside each place record.

How are reviews formatted? Reviews live inside their parent place under reviews: [...]. Each review has reviewId, title, rating, text, travelDate, tripType, helpfulVotes, reviewer, and more. Set Include reviews = true to fetch them.

How do I scrape every hotel in a city? Use the Cities mode, type "Paris" (or paste the geo ID "187147"), set category = hotels, maxPois = 5000, and maxItems = 0 for unlimited.

Can I scrape a specific hotel page? Yes — switch to Start URLs and paste the Hotel_Review- URL. Same for restaurants (Restaurant_Review-) and attractions (Attraction_Review-).

How do I cap the cost per run? The default Maximum cost per run is $20. Lower it in the Run options panel, or set maxItems to hard-cap dataset rows.

Why are some review fields null? TripAdvisor doesn't always show every field per review (e.g. reviewer location, contributions count, owner response). When the page doesn't surface it, the field is null.

Why does my run return zero reviews on some hotels? DataDome occasionally serves a stripped HTML to Apify residential IPs that omits review-card markup. The Actor falls back to a fresh fetch of the -or10- review-pagination URL — usually that returns full content. If both fail, the place is still pushed; only reviews ends up empty. Retrying the run typically gets the reviews on a fresh proxy session.

How fast is it? With maxConcurrency = 10, four hotel detail fetches complete in ~1.7 seconds locally. On Apify Residential, expect ~3–8 seconds per place depending on review depth.

Can I export to CSV / Excel? Yes. Apify dataset supports JSON, CSV, Excel, XML, RSS, HTML. Embedded reviews: [...] arrays flatten in CSV via dot-notation; if you need one-row-per-review for spreadsheet analysis, run with includeReviews = false then a second run on the same startUrls with includeReviews = true and post-process.

Does the price include the proxy cost? Yes. The $3.50 / 1,000 results and $0.50 / 1,000 reviews are all-in. You don't pay for proxy bandwidth, retries, or DataDome rotations.

Having issues? Help me fix them faster

If you experience any problems, please share your run data with me so I can debug and improve the Actor:

  1. Go to Apify Security Settings
  2. Find "Share run data with developers"
  3. In the "Manage list of Actors" section, check this Actor (or All Actors)
  4. Save

This data is used only for debugging and helps me resolve issues much faster. Thank you!

Support

Questions, bug reports, or feature requests: afrcanec@gmail.com

🏷️ Tags

TripAdvisor Scraper, TripAdvisor API, TripAdvisor Hotels Scraper, TripAdvisor Restaurants Scraper, TripAdvisor Attractions Scraper, TripAdvisor Reviews Scraper, TripAdvisor Data Extractor, Hotel Reviews Scraper, Restaurant Reviews Scraper, Hotel Price Scraper, Hotels Data Mining, Travel Data Scraper, Hospitality Data, Tourism Scraper, City Listings Scraper, Hotel Ratings Extractor, Restaurant Ratings, Things To Do Scraper, Tourist Attractions API, Hotel Amenities Scraper, Hotel Booking Data, Travel Reviews Mining, Sentiment Analysis Travel, Hotel Competitor Analysis, Restaurant Competitor Analysis, OTA Data Scraping, Hotel Star Rating Scraper, Travelers Choice Awards Tracker, Hotel Photo Scraper, How to Scrape TripAdvisor, Extract TripAdvisor Reviews, Travel Market Research, Hospitality Market Research, Tourism Analytics, Hotel Aggregator, Review Aggregator, Restaurant Discovery, Tourist Reviews Database, Travel Industry Data, Vacation Rentals Scraper, Hotel Pricing API, Customer Review Mining