Skip to content

How to Scrape Tripadvisor: Hotels, Restaurants, Attractions and Reviews

Scrape Tripadvisor hotels, restaurants and attractions by city or URL, then pull the reviews: ratings, rankings, prices, contacts, trip types and owner replies. Two real runs, their exact cost, and code for curl, Python, Node.js and AI agents.

Published
Reading time
10 min read
Pixel-art robot with an orange >_ on its terminal head pulls a review card with five green rating bubbles out of a hotel tower whose sign shows the green Tripadvisor owl logo, and drops it into a crate
In this article
  1. What data you can get from Tripadvisor
  2. How to scrape Tripadvisor without code
  3. How to scrape Tripadvisor reviews
  4. How to scrape Tripadvisor with the API
  5. A real run: ten Chicago hotels and ten New York reviews
  6. What it costs
  7. What to watch out for
  8. Is it legal to scrape Tripadvisor?
  9. Why Scrape.ly for Tripadvisor data
  10. FAQ
  11. Can you scrape Tripadvisor for free?
  12. How do I scrape Tripadvisor reviews with Python?
  13. Can I get Tripadvisor restaurants instead of hotels?
  14. Does Tripadvisor have an API?
  15. How do I get only new Tripadvisor reviews?
  16. Can I compare Tripadvisor with Airbnb or Google Maps?

To scrape Tripadvisor, give a scraper a city name or a Tripadvisor place URL and save each hotel, restaurant or attraction as a row: name, rating, review count, ranking, address, phone, price range and amenities. Then, for the places you care about, scrape Tripadvisor reviews with a second tool that reads every review with its stars, trip type, sub-ratings and the owner's reply.

On Scrape.ly both jobs are ready-made: the Tripadvisor Scraper returns places at $2.50 per 1,000, and the Tripadvisor Reviews Scraper returns reviews at $2.50 per 1,000, with Tripadvisor's bot check handled for you. Everything below comes from two real runs on 23 October 2026: ten Chicago hotels and ten reviews of a New York hotel, with the exact inputs, outputs, logs and charges.

What data you can get from Tripadvisor

The Tripadvisor Scraper writes one row per place. Hotel rows add class, rooms, amenities and booking offers; restaurant rows add cuisines, hours and diets; attraction rows add subcategories.

Field What it holds
name, type, category Place name and HOTEL, RESTAURANT or ATTRACTION
rating, numberOfReviews, ratingHistogram Average rating, review count and the count per star
rankingString, rankingPosition Tripadvisor's ranking, such as "#6 of 260 hotels in Chicago"
categoryReviewScores Aspect scores: Location, Rooms, Cleanliness, Service, Sleep Quality, Value
address, addressObj, latitude, longitude Address text, its parts and coordinates
phone, email, website, webUrl Contact details and the Tripadvisor page
priceLevel, priceRange, offers Price band, price range and per-site offers (Expedia, Booking.com and others) for your dates
hotelClass, numberOfRooms, amenities Star class, room count and the amenity list
reviewTags, neighborhoodLocations, nearestMetroStations Review keywords, neighborhoods and nearby stations

The Tripadvisor Reviews Scraper writes one row per review: title, text, rating, publishedDate, travelDate, tripType, subratings (Value, Rooms, Location and so on), helpfulVotes, photos, ownerResponse with its date, and a placeInfo block with the place's rating, review count and address. Reviewer details are optional and off in the preset we used.

Fields stay empty when Tripadvisor has nothing to show: not every hotel publishes an email, and not every review has sub-ratings.

How to scrape Tripadvisor without code

  1. Open the Tripadvisor Scraper in the Scrape.ly Store.
  2. Pick a ready-made input. We used the preset Places in Chicago, 10 results. "Try this input" opens it in the console.
  3. Type your own city. This is the exact input of our run:
json
{
  "query": "Chicago",
  "maxItemsPerQuery": 10,
  "language": "en",
  "currency": "EUR",
  "maxPhotosPerPlace": 0
}
  1. Click Start. A 10-place run takes about half a minute, most of it spent on Tripadvisor's bot check.
  2. Export the rows as JSON, CSV, Excel or HTML.

The fields that matter most:

  • query: a destination as you'd type it into Tripadvisor. The first matching destination is used. A place name returns that one place.
  • startUrls: place pages (Hotel_Review, Restaurant_Review, Attraction_Review) or category pages (Hotels-g…, Restaurants-g…, Attractions-g…).
  • maxItemsPerQuery: places to save for the query, and again for each URL. Default 10.
  • includeHotels, includeRestaurants, includeAttractions: a city search reads hotels first, then restaurants, then attractions, until it hits the maximum. Switch hotels off to get a restaurant list, as in the preset Restaurants in Paris in French, 15 results.
  • checkInDate, checkOutDate: dates for hotel offers, absolute (2026-12-01) or relative (30 days). Empty means tomorrow for one night.

How to scrape Tripadvisor reviews

Reviews come from the second Actor, one place URL at a time. We ran the preset url-light: the ten latest reviews of one hotel, in every language, without reviewer profiles. Its input:

json
{
  "startUrls": [
    { "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d113311-Reviews-The_Peninsula_New_York-New_York_City_New_York.html" }
  ],
  "maxItemsPerQuery": 10,
  "reviewRatings": ["ALL_REVIEW_RATINGS"],
  "reviewsLanguages": ["ALL_REVIEW_LANGUAGES"],
  "scrapeReviewerInfo": false,
  "disableMachineTranslations": false
}

Newest reviews are read first. lastReviewDate (2026-01-01 or 30 days) stops the run at a date, reviewRatings keeps only certain stars (for example ["1", "2"] for complaints), reviewsLanguages keeps one language, and disableMachineTranslations returns the text as written instead of Tripadvisor's translation.

How to scrape Tripadvisor with the API

Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN.

Our place run took 31 seconds because of the bot check, too close to the 45-second limit of the synchronous endpoint. Use the asynchronous flow: start the run, wait, then read the rows.

shell
# 1. start the run; the response's data.id is the run ID
curl -X POST "https://api.scrape.ly/v2/actors/roamandroof~tripadvisor-scraper/runs" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "Chicago", "maxItemsPerQuery": 10, "includeRestaurants": false, "includeAttractions": false}'
# 2. wait (up to 60 s per call; repeat until status is SUCCEEDED)
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID?waitForFinish=60" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
# 3. read the places (CSV here)
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID/dataset/items?format=csv" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN"

Python (pip install scrapely-client-python). call() waits however long the run takes. This example finds the hotels, then pulls the latest low-star reviews of the three with the most reviews:

python
import os
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("roamandroof/tripadvisor-scraper").call(
    run_input={"query": "Chicago", "maxItemsPerQuery": 10, "includeRestaurants": False, "includeAttractions": False}
)
hotels = list(client.dataset(run.default_dataset_id).iterate_items())
top = sorted(hotels, key=lambda h: h.get("numberOfReviews") or 0, reverse=True)[:3]

reviews_run = client.actor("roamandroof/tripadvisor-reviews-scraper").call(
    run_input={
        "startUrls": [{"url": h["webUrl"]} for h in top],
        "maxItemsPerQuery": 20,
        "reviewRatings": ["1", "2"],
        "scrapeReviewerInfo": False,
    }
)
for r in client.dataset(reviews_run.default_dataset_id).iterate_items():
    print(r["placeInfo"]["name"], r["rating"], r["publishedDate"], r["title"])

Node.js (npm install scrapely-client):

javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('roamandroof/tripadvisor-scraper').call({
  query: 'Chicago',
  maxItemsPerQuery: 10,
  includeRestaurants: false,
  includeAttractions: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((h) => [h.name, h.rating, h.rankingString, h.priceRange]));

For AI agents, add the Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:

json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask: "Use scrapely to run roamandroof/tripadvisor-scraper for hotels in Chicago, 10 places, then get the 20 newest reviews of the top-ranked one and summarize the complaints." The agent reads both input schemas, runs the Actors and polls get-actor-run when a run outlasts the 45-second wait. The Tripadvisor API page shows the same data as an API product, and the MCP docs cover every client.

A real run: ten Chicago hotels and ten New York reviews

We ran the "Places in Chicago, 10 results" preset on 23 October 2026. It returned 10 places in 31 seconds and was charged $0.0307. All ten were hotels, because a city search fills the limit with hotels before it moves on to restaurants. The first five rows:

Hotel Rating Reviews Ranking Class Price range
Hampton Inn Chicago Downtown/Magnificent Mile 4.2 2,488 #50 of 260 hotels in Chicago 3 $130 - $533
LondonHouse Chicago, Curio Collection by Hilton 4.8 5,086 #6 of 260 hotels in Chicago 4 $207 - $856
The Congress Plaza Hotel & Convention Center 3.0 3,659 #186 of 260 hotels in Chicago 3 $124 - $478
Hampton Inn & Suites Chicago-Downtown 4.4 3,652 #32 of 260 hotels in Chicago 3 $126 - $506
Hilton Chicago 3.9 7,505 #61 of 260 hotels in Chicago 4 $181 - $725

What the full ten show:

  • Rankings spread wide. The ten sat between #6 and #186 of 260 Chicago hotels, with ratings from 3.0 to 4.8 and 1,210 to 7,505 reviews each.
  • Offers for real dates. Every hotel carried 5 to 13 offers from booking sites for the default stay (24 to 25 October). The Hampton Inn on Magnificent Mile ranged from $139 on Skyscanner to $144 on Expedia, Hotels.com and Booking.com.
  • Contacts for outreach. Nine of the ten had a phone number, eight an email address and seven a website.
  • Aspect scores. Each row splits the rating into six scores; the first hotel scored 4.8 for Location and 4.1 for Value.

Prices came back in US dollars, as tripadvisor.com quoted them, so check the currency symbol in priceRange before you mix runs from different markets.

Then we ran the reviews preset on The Peninsula New York (4.5 from 1,523 reviews). It returned 10 reviews in 11 seconds and was charged $0.0272:

Published Stars Trip type Title Owner reply
2026-08-30 5 Business Simply the best yes
2026-08-23 5 Couples Unsurpassed luxury yes
2026-08-08 5 Family Great experience! yes
2026-07-03 5 Friends Bar review - "Braw" as we would say in Scotland yes
2026-06-04 5 Family Grand Hotel With Excellent Service yes

Reviewer profiles were off in this preset, so no reviewer names were saved; reviewers are private people, and staff or manager names that appear in review and reply text are masked in our stored sample. Nine of the ten reviews gave five stars and one gave four, the trips were split across business, couples, family, friends and solo, and the hotel had replied to all ten. Seven reviews carried sub-ratings; one rated Value 3 while giving Rooms and Service 5.

The two logs, without the platform's start-up lines:

Text
2026-10-23T03:01:53.659Z [scrapely.actor] INFO  Anti-bot solver source: platform.
2026-10-23T03:02:03.047Z [scrapely.actor] INFO  Reading 10 places.
2026-10-23T03:02:20.645Z [scrapely.actor] INFO  Saved 10 places. Solver calls: 2.
2026-10-23T03:02:21.364Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
2026-10-23T03:04:17.055Z [scrapely.actor] INFO  Challenge solver source: platform.
2026-10-23T03:04:25.085Z [scrapely.actor] INFO  Saved 10 reviews from 1 places. Solver calls 1. Datacenter bytes 0. Residential bytes 1702177.

The place run spent about nine seconds on the bot check before it started reading; the reviews run cleared the check once and moved 1.7 MB of residential traffic. You don't configure either.

What it costs

Both Actors charge one event of $0.0025 per row saved, which is $2.50 per 1,000 places or 1,000 reviews. Platform usage (compute and proxy) is billed on top.

  • Places: 10 × $0.0025 = $0.025 in result fees. The run was charged $0.0307, because it also used $0.0041 of compute, $0.0016 of datacenter proxy traffic and $0.00005 of dataset writes.
  • Reviews: 10 × $0.0025 = $0.025 in review fees. The run was charged $0.0272, with $0.0015 of compute and $0.0007 of residential proxy traffic on top.

A 1,000-hotel price list costs $2.50 in result fees, and 1,000 reviews another $2.50, plus usage of the same small kind. The Free plan's $5 of monthly credit covers about 2,000 places or reviews in event fees. Set Max cost per run in the run options and a run stops cleanly when it reaches the cap.

What to watch out for

  • City searches fill up with hotels first. With all three types on, ten results means ten hotels. Turn hotels off for a restaurant or attraction list, or paste a Restaurants-g… category URL.
  • Hotel prices depend on dates. Offers are for the stay you set; empty dates mean tomorrow, one night. Set checkInDate and checkOutDate (or relative values like 30 days) before you compare cities.
  • Bot checks add time, not work. Tripadvisor puts a challenge in front of its pages. Both Actors solve it with the platform's own solver; expect about half a minute for ten places.
  • Reviews need residential traffic. Tripadvisor refuses datacenter exits for review pages, so the reviews Actor uses residential proxies by default. That's why its usage line is proxy-heavy, and it's still well under a cent for ten reviews.
  • Large review histories take minutes. The README measures about 5 to 8 minutes for 10,000 reviews from 5 places. Use the async API or a client, and lastReviewDate to fetch only what's new.
  • Personal data. Reviewer names, usernames and hometowns identify private people. Leave Include reviewer profile off unless you need it.

Both Actors read public pages that anyone can open without an account, and they never log in. That doesn't settle every question. Tripadvisor's Terms of Use (effective July 15, 2025) say users may not use "any robot, spider, scraper or other automated means" to access or copy content without its express written permission, and how those terms bind you depends on where you are and what you do with the data.

Privacy law matters most for reviews. A reviewer's name, profile and hometown are personal data under the GDPR and the CCPA, and review text can name staff or other guests. Collect only the fields you need, keep them secure, and have a lawful basis for processing them. Review text is also the reviewer's writing, so analyze and summarize it rather than republishing it wholesale. This is not legal advice: if Tripadvisor data feeds a product or a public site, ask a lawyer about your case.

Why Scrape.ly for Tripadvisor data

  • The official API is on its way out. Tripadvisor's Content API documentation now opens with "This API is deprecated" and points developers to a new platform. Its reviews endpoint "returns up to 5 of the most recent reviews for a specific location." The Actor reads every review a place shows.
  • No bot check to fight. A hand-written scraper has to get past Tripadvisor's challenge page before it can read a single rating. Here the solver and the proxy are built in, as the logs show, and you read rating and rankingString fields instead of CSS selectors.
  • Places and reviews in one pipeline. Find hotels by city, then pass their webUrl values straight into the reviews Actor, as in the Python example. Same token, same client, same dataset format.
  • Built for monitoring. Schedule a weekly run with lastReviewDate: "7 days", send new low-star reviews to Slack or Google Sheets with automations, or hand the job to an AI agent over MCP.

FAQ

Can you scrape Tripadvisor for free?

The Scrape.ly Free plan includes $5 of usage credit every month with no credit card, enough for about 2,000 places or reviews in event fees at $2.50 per 1,000. Our two 10-row runs cost $0.0307 and $0.0272.

How do I scrape Tripadvisor reviews with Python?

Install scrapely-client-python, call roamandroof/tripadvisor-reviews-scraper with one or more place URLs, and iterate over the dataset, as in the example above. The client waits for the run, including the bot check.

Can I get Tripadvisor restaurants instead of hotels?

Yes. Set includeHotels and includeAttractions to false, or paste a Restaurants-g… category URL. Restaurant rows include cuisines, meal types, diets, opening hours and features.

Does Tripadvisor have an API?

Tripadvisor's legacy Content API is marked deprecated in its own documentation, and its reviews endpoint returns at most five recent reviews per location. For complete review histories and city-wide place lists, scrape the public pages with the Actors above.

How do I get only new Tripadvisor reviews?

Set lastReviewDate to a date or a relative value such as 7 days. Newest reviews are read first and the run stops at the first older one, so a quiet week costs almost nothing. Schedule the run to repeat.

Can I compare Tripadvisor with Airbnb or Google Maps?

Yes. Run the same city through our guides on Airbnb scraping for short-term rentals and how to scrape Google Maps for every local business, then join the rows on name and address.

  • tripadvisor
  • travel
  • hotels
  • reviews
  • python
  • api

About the author

Actor publisher on the Scrape.ly Store

Homes, stays, trips and cars: listings from 40+ property portals, the big travel and booking sites and the main car marketplaces. For agents, investors, travel analysts and dealers. A Scrapely studio.

//Keep reading\\

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.