Tripadvisor Reviews scraper artworkHotels, restaurants & attractions

Tripadvisor Reviews Scraper.

Collect the public Tripadvisor reviews of a hotel, restaurant or attraction and the places it competes with. Each review comes as written, with Tripadvisor's English translation alongside, so you can compare markets in one table.

Run on Apify

Ways to use this scraper.

Try these examples for marketing, growth and competitor research.

01

Benchmark a hotel against its competitive set

Collect six months of reviews for your hotel and four nearby competitors. Compare average ratings and sub-ratings for rooms, service and value to see where each property leads.

Keep a benchmark table by property, with links to the reviews behind each score.

02

Find what international guests mention

Collect reviews in every language and use the English translations to read them together. Look for topics that come up more often in one market, such as breakfast or check-in.

Write a short guest experience brief by market, quoting translated reviews.

03

Check response times and tone

See which negative reviews received a management response, who wrote it and how quickly. Compare with competitors and pick examples worth following.

Keep a response log with reply dates and the responder’s role.

FROM FIRST RUN TO REPEATABLE WORKFLOW

Your first run, step by step.

  1. Open the Actor on Apify, select its Input tab and switch to the JSON editor if you want to paste a configuration.
  2. Replace the example link with a Tripadvisor link to your own hotel, restaurant or attraction, or a competitor’s. Copy it from the place’s page in your browser.
  3. Keep maxReviewsPerPlace at 100 for the first run and leave the filters empty. Check the original text, the English translation and the place fields, then add rating, language, trip type or date filters.
  4. Start the run and watch the log. Check which targets and filters were actually read before assuming an empty result means nothing exists.
  5. Open Storage → Dataset, inspect several records and export JSON for nested data or CSV for a first spreadsheet review.
First-run configuration
{
  "places": [
    "https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"
  ],
  "maxReviewsPerPlace": 100
}

Paste this into the Actor’s JSON input editor. Replace the example targets with yours before running.

Check the current input form on Apify

Choose how to search.

Give the scraper a Tripadvisor link, a location ID or a place name. Links and IDs point to one place; names can match several. Every review comes as written, with Tripadvisor’s English translation alongside, and the full history back to the first review is available.

Search methodWhen to use itWhat changes
Tripadvisor linksWhen to use itYou already configured the search on the source website.What changesA link from tripadvisor.com, .co.uk, .de or any other Tripadvisor site gives the same place and reviews. It is the clearest way to name one place.
Location IDsWhen to use itYou know the exact entity you want to collect.What changesThe location ID is the d number in a Tripadvisor link, such as d187591. It is short and stable, which suits a saved watchlist.
Place namesWhen to use itYou want to find relevant results before choosing specific targets.What changesA name reads every place Tripadvisor’s search finds under it, biggest first. Ritz London gives the hotel and several Ritz restaurants. Check place_name, or paste a link to get one place.

The difference that matters

Every review comes in the language it was written in, with Tripadvisor’s English translation in title_english and text_english. Read the English versions to compare markets, and quote the original text in reports.

Compare the related scraper

Every input, explained.

Use the exact field names below in JSON. In Apify’s form, enter list items separately, choose filters, and keep numbers and booleans in their proper types.

Default and prefill are different. A default applies when you omit a setting; a prefill is an example already entered in Apify’s form. Review prefilled targets and limits before every run. Some settings have no schema default. You still need to supply at least one supported target.

Targets and search inputs1
places
ListForm prefill: ["https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"]

One place per line: a Tripadvisor link to a hotel, restaurant, attraction or tour from any country’s Tripadvisor, its location ID (d187591), or its name. A name stands for every place Tripadvisor’s search finds under it.

Markets, dates and filters5
ratings
List

Only reviews with these ratings, as strings from 1 (Terrible) to 5 (Excellent). Select 1 and 2 for negative reviews. Empty means every rating.

languages
List

Only reviews written in these languages, as codes or names such as en, de or French. Empty means every language: each review in the language it was written in, with Tripadvisor’s English translation alongside.

dateFrom
Text

Only reviews published on or after this date. Use YYYY-MM-DD or a relative period such as 30 days or 6 months. With a daily or weekly schedule, a relative date collects only what is new.

tripTypes
List

Only reviews from these kinds of trips: Business, Couples, Family, Friends or Solo. Many reviewers leave the trip type out, so a filter also drops those reviews. Empty means every review.

searchText
Text

Only reviews that mention this word or phrase, as Tripadvisor’s own review search finds them, for example breakfast, noise or rooftop. Use one topic per run.

Limits, details and proxies3
maxReviewsPerPlace
IntegerForm prefill: 100

The newest this many reviews of each place. Start with 100. Empty means every review, back to the first one.

maxReviews
Integer

A hard cap on reviews across the whole run, for every target together. Use it to limit runtime and cost. Empty means no overall cap; the per-target limit still applies.

proxyConfiguration
ObjectDefault: {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}Form prefill: {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}

The US residential proxy is the working default. Tripadvisor answers residential exits, Apify’s datacenter proxy also works, and other settings fall back to residential when Tripadvisor refuses them.

Advanced settings and recovery2
resume
True or falseDefault: true

Saves progress about every 30 seconds so an Apify restart or migration can continue the current run. Leave it on for normal use.

continueFromLastRun
True or falseDefault: false

Continues unfinished work from the previous run with matching input. Earlier results remain in that run’s dataset. Keep false for a fresh collection or a recurring snapshot.

This reference follows the Actor’s published input fields. Check the live form before changing a production workflow. Check the current input form on Apify.

Configurations you can copy.

Each example is a separate run. Start small, inspect the results, then increase coverage. Update the targets, countries and dates to match your question.

Benchmark three hotels

Collect six months of reviews for one hotel by location ID and two competitors by name, up to 300 each. Check place_name before comparing, because a name can also match restaurants inside a hotel.

Benchmark three hotels
{
  "places": ["d187591", "The Savoy London", "The Langham London"],
  "dateFrom": "6 months",
  "maxReviewsPerPlace": 300
}

Review a year of negative feedback

Collect the 1- and 2-star reviews of one restaurant from the last 12 months. Check which ones received a management response and how quickly.

Review a year of negative feedback
{
  "places": ["d719141"],
  "ratings": ["1", "2"],
  "dateFrom": "12 months",
  "maxReviewsPerPlace": 200
}

Follow one topic across markets

Collect reviews that mention breakfast from family and couples trips, written in English, French or German. Compare what each group says, using the English translations to read them together.

Follow one topic across markets
{
  "places": ["d187591"],
  "searchText": "breakfast",
  "tripTypes": ["Family", "Couples"],
  "languages": ["en", "fr", "de"],
  "maxReviewsPerPlace": 200
}

Run, check, export, repeat.

Expect one row per review with its rating, text as written, English translation, dates, trip type, sub-ratings, reviewer and management response, plus the place’s rating and address. The run’s SUMMARY record shows how many reviews each place lists, how many matched your filters and how many were collected. Each place’s details are saved as the PLACES record in the key-value store.

  1. Check the dataset and the run’s SUMMARY record. Compare the number collected with your cap, inspect failed or skipped inputs, and verify a few original source links.
  2. Keep the original IDs and add collected_at and run_id when saving results. Export CSV for flat columns; retain JSON when arrays or nested details matter.
  3. Save the tested configuration as an Apify Task and schedule it. For repeated snapshots, leave continueFromLastRun false. Deduplicate new records by source ID while retaining each observation date.
  4. In Make or n8n, wait for a successful run, fetch its dataset and map fields into Sheets or your warehouse. Send records to Looker Studio through a reporting table; use dbt to flatten and test warehouse models.
  5. The same JSON works with Apify’s Actor API. In Claude with Apify MCP, name this Actor, ask it to inspect the live schema, and give explicit targets, markets and result limits before it runs.

Resume is not a fresh snapshot

resume protects the current run if Apify restarts it. continueFromLastRun continues an earlier run with the same configuration; earlier records stay in the earlier dataset. Combine both datasets for the complete collection, and raise a previously reached result cap when continuing. Start fresh when you want to see what changed today.

Follow the Sheets, Claude, Looker and BigQuery setup guides
Run this Actor from the API

Save one configuration above as input.json. Set APIFY_TOKEN to your Apify API token in your terminal, then send the file as the request body.

Start the run
curl --fail-with-body --request POST \
  --url "https://api.apify.com/v2/actors/jmlp~tripadvisor-reviews-scraper/runs" \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header "Content-Type: application/json" \
  --data-binary @input.json

The response contains a run ID and defaultDatasetId, not finished results. Wait for the run to succeed, set DATASET_ID to that dataset ID, then fetch its items. For large datasets, use limit and offset to page through the export.

Fetch the dataset
curl --fail-with-body \
  --url "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=json" \
  --header "Authorization: Bearer $APIFY_TOKEN"

Apify’s run and export API reference
Dataset export options

When the results look wrong.

Change one setting at a time, keep a small cap, and check the run summary before scaling up.

The results include places I didn’t ask for.

A name reads every place Tripadvisor’s search finds under it, biggest first. Ritz London gives the hotel and several Ritz restaurants. Check place_name, or paste a link to get one place.

Many reviews have no sub-ratings or trip type.

Sub-ratings, trip type and travel date are optional on Tripadvisor, and many reviewers leave them out. Missing values are left empty rather than guessed. Report how many reviews each average is based on.

The source keeps returning empty pages or access errors.

The US residential proxy is the working default. Tripadvisor answers residential exits, Apify’s datacenter proxy also works, and other settings fall back to residential when Tripadvisor refuses them.

The run succeeded but returned nothing

Success means the Actor finished handling the request, not that the source returned data. Check SUMMARY.inputProblem, SUMMARY.problem and the log for missing targets, unsupported filters or refused requests. Test one known target with fewer filters.

Fewer records than expected

Check the global limit, per-search or per-page limits, platform coverage and deduplication. Several searches can find the same record. A source’s headline count can include records the public endpoint does not return. Review unfinished jobs before treating the dataset as complete.

Use the results in your tools.

Google Sheets

Append review_id, place_name, rating, published_at, trip_type and language. Add columns for topic and follow-up, then filter negative reviews without a response.

Read the setup
Claude + MCP

Ask Claude to compare what guests mention at each place, using text_english and citing review_url. Have it mark which points rest on only a few reviews.

Read the setup
Looker Studio

Chart average rating and sub-ratings by month for each place. Add filters for trip type and language, and show how many reviews each figure is based on.

Read the setup
BigQuery + dbt

Keep reviews keyed by review_id with the collection time. Unnest subratings into a child table and store place snapshots separately so you can follow rating changes.

Read the setup
Copy a prompt for Claude
Prompt for Claude + Apify MCP
Inspect jmlp/tripadvisor-reviews-scraper, then collect up to 200 reviews published in the last six months for https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html. Summarize what guests praise and criticize using text_english, cite review_url for each point, and report the response rate for 1- and 2-star reviews.

The fields you’ll get.

Keep the collection time and original IDs with your records. You’ll need them to check where a result came from or compare it with a later run.

Before you draw conclusions

Reviews come from guests who chose to write one, so they aren't a representative survey of every visit. Sub-ratings and trip types are optional, and many reviews leave them out. The English versions are Tripadvisor's machine translations, so check the original text before quoting a review. A place name can match several places, so paste a link when you need one exact place.

review_id / review_url
Stable ID and the public review page.
rating / title / text / language
The rating and review as written, and its language.
title_english / text_english
Tripadvisor’s English translation of reviews written in other languages.
travel_date / trip_type / subratings
When the visit happened, the kind of trip and ratings by aspect.
reply_text / reply_author
The management response and the responder’s role.
place_name / place_rating / place_review_count
The place and its overall rating when collected.

Common questions.

Do I need a Tripadvisor account?

No. The scraper reads public Tripadvisor reviews as a signed-out visitor. You need an Apify account to run it.

Why do some reviews have no English version?

text_english is filled only for reviews written in another language. English reviews need no translation.

Source and current product details: JMLP’s Tripadvisor Reviews Actor on Apify.

Other scrapers
you might use.

Let’s talk about
your project.

Tell me what you need to collect or understand. I can help with a custom scraper, a pipeline or the analysis.

Start a project