Tripadvisor Scraper: Places, Reviews, Hotel Prices
Pricing
from $1.89 / 1,000 reviews
Tripadvisor Scraper: Places, Reviews, Hotel Prices
Get Tripadvisor hotels, restaurants, attractions and reviews from a search or link. Compare places in a city and study guest feedback. No login or API key.
Pricing
from $1.89 / 1,000 reviews
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Features
Share
Tripadvisor Scraper turns a search, a place link or a place ID into rows of hotels, restaurants, attractions and reviews from public Tripadvisor pages, with no login. Use the rows to compare places in a city or to study guest feedback. A first run with 10 places takes about 20 to 35 seconds and costs about $0.03.

Table of contents
- What it does
- How it works
- Quick start
- Use cases
- Input
- Output
- Pricing
- Limits
- API, export and integrations
- Troubleshooting
- FAQ
- Related Actors
- Support
What it does
This Actor reads public Tripadvisor pages and saves clean rows in an Apify dataset. It has three modes:
- Search for places finds hotels, restaurants and attractions from a search like
Pattaya restaurants. - Place details reads one place or a list of places.
- Reviews collects reviews of the places you choose, with filters.
A place row can hold the rating, review count, rank, address, phone, website, coordinates, opening hours, awards and hotel offers. A review row can hold the text, rating, dates, trip type, language, helpful votes and the owner's reply.
Good fit
- You compare restaurants, hotels or attractions in one city.
- You read what guests say about your place or a competitor.
- You check hotel prices for your stay dates.
- You feed fresh place data to a spreadsheet, a database or an AI agent.
How it works
- You give a search, links, place IDs or a dataset with links.
- The Actor opens the public pages and reads up to one page per second. It applies your place types and review filters.
- It saves place rows or review rows in the dataset. It also saves a run summary with the counts and the reason the run stopped.
If an input finds nothing, you get a free status row that explains why. You never get a silent empty result.
Quick start
-
Open the Input tab and keep What to collect on Search for places (box 1).
-
Keep Pattaya restaurants in Search query or place ID, or type your own city and place type (box 2).
-
Keep Maximum places at 10 (box 3).
-
Click Start at the bottom of the page (below the form, not in the picture).
-
When the run ends, open the Output tab and keep the Places view (box 5).
-
Check
name,type,ratingandreviewsCount(box 6). -
Check
rankingto see the place's position in its city (box 7).
Expected result: 10 place rows in about 20 to 35 seconds, for about $0.03.
Use cases
| Buyer job | Input path | Output entity | Key fields | Next integration |
|---|---|---|---|---|
| Compare restaurants in a city | mode: search, query | Place | name, rating, reviewsCount, ranking, priceLevel | CSV or Excel export |
| Study guest feedback | mode: reviews, placeUrls | Review | rating, title, text, publishedDate, tripType | Spreadsheet or AI agent |
| Check hotel prices for your dates | mode: place, placeUrls, checkInDate, checkOutDate | Place | name, offers, priceRange, roomCount | API |
| Find top attractions for a trip plan | mode: search, query, placeTypes | Place | name, ranking, tags, openingHours, awards | Slack or Notion summary |
| Watch new reviews of your place | mode: reviews, placeUrls, recentDays | Review | publishedDate, rating, text, ownerResponse | Apify schedule |
Input
Input fields
You must give at least one of query, placeUrls, startUrls or sourceDatasetId. Empty lists mean "no filter". Repeated places are read once.
| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
|---|---|---|---|---|---|---|---|---|
mode | What to collect | string | no | default search | search, place, reviews | Picks place rows or review rows | reviews | Start with search |
query | Search query or place ID | string | one input needed | prefill Pattaya restaurants | City, business name, numeric ID or URL, up to 300 characters | Finds places | Lyon hotels | Add the place type to the city |
placeUrls | Place or listing URLs | array | one input needed | empty | Up to 100 place, city list or public trip links, or numeric IDs. Each is up to 2,048 characters | Reads these pages | ["186338"] | Use for known places |
startUrls | Start URLs | array | one input needed | empty | Up to 100 Tripadvisor links, each up to 2,048 characters | Same as placeUrls | a place link | Use when you move from another scraper |
sourceDatasetId | Source dataset | string | one input needed | empty | A dataset you can read, up to 100 rows | Reads place links from its rows | a dataset ID | Use to chain runs |
maxItems | Maximum places | integer | no | default and prefill 10 | 1 to 1,000,000 | Stops after this many unique place checks | 50 | Keep low on a first run |
maxReviews | Maximum reviews per place | integer | no | default 100 | 1 to 1,000,000 | Limits reviews from each place | 300 | Controls the cost |
maxResults | Maximum reviews in total | integer | no | default 1000 | 1 to 1,000,000 | Limits reviews across all places | 5000 | Raise it for big jobs |
placeTypes | Place types | array | no | all three types | restaurants, hotels, attractions | Limits a city search | ["hotels"] | Pick one for a clean list |
reviewLanguages | Review languages | array | no | empty | Up to 10 language codes | Keeps these original languages | ["en","fr"] | Leave empty for all |
reviewRatings | Review ratings | array | no | empty | "1" to "5" | Keeps these ratings | ["1","2"] | Use to read complaints |
travelerTypes | Traveler types | array | no | empty | FAMILIES, COUPLES, SOLO, BUSINESS, FRIENDS | Keeps these groups | ["FAMILIES"] | Leave empty for all |
monthsOfVisit | Months of visit | array | no | empty | "1" to "12" | Keeps these visit months | ["7"] | Use for season checks |
keyword | Review keyword | string | no | empty | An English word or phrase, up to 200 characters | Searches inside reviews | breakfast | Use one short word |
since | Reviews since | string | no | empty | YYYY-MM-DD | Keeps reviews from this date | 2026-01-01 | Use for a fixed period |
until | Reviews until | string | no | empty | YYYY-MM-DD | Keeps reviews up to this date | 2026-06-30 | Use with since |
recentDays | Recent days | integer | no | default 0 (off) | 0 to 36,500 | Keeps reviews from the last days | 30 | Use on a schedule |
sortBy | Review order | string | no | default mostRecent | mostRecent, mostHelpful, detailed | Sets the review order | mostHelpful | Keep the default |
scrapeReviewerInfo | Include reviewer information | boolean | no | default true | true, false | Adds public reviewer data | false | Turn off if you do not need names |
includeAiReviewsSummary | Include AI review summary | boolean | no | default false | true, false | Adds the summary shown on the page | true | Not all places have one |
includeNearbyResults | Include nearby places | boolean | no | default false | true, false | Adds nearby places | true | Use for area checks |
includeTags | Include tags | boolean | no | default true | true, false | Adds cuisine, amenity and type tags | false | Keep on |
maxPhotosPerPlace | Maximum place photos | integer | no | default 0 (off) | 0 to 100 | Adds photo links | 5 | Keep low |
photosType | Photo contributors | string | no | default fromEveryone | fromEveryone, fromTravelers, fromManagement | Picks whose photos to add | fromTravelers | Use with photos on |
checkInDate | Hotel check-in date | string | no | empty | YYYY-MM-DD | Asks for offers on these dates | 2026-12-10 | Set both dates |
checkOutDate | Hotel check-out date | string | no | empty | YYYY-MM-DD, after check-in | Asks for offers on these dates | 2026-12-12 | Set both dates |
currency | Currency | string | no | default USD | Currency code | Sets the offer currency | EUR | Use with hotel dates |
language | Language | string | no | default en | Language code | Sets review labels | fr | Keep the default |
locale | Site locale | string | no | default en-US | Site locale | Sets labels and review responses | fr-FR | Keep the default |
outputShape | Review output | string | no | default flat | flat, nested | One row per review, or reviews inside a place row. A place with more than about 2,500 reviews takes several rows | nested | Keep flat for tables |
deliveryConnector | Send results to (optional) | string | no | empty | Your MCP connector, up to 200 characters | Posts a short summary | your Slack connector | Optional |
deliveryTarget | Notion page or channel (optional) | string | no | empty | Notion page link or Slack channel ID, up to 2,048 characters | Sets where it posts | a channel ID | Optional |
maxPages | Maximum pages per listing or place | integer | no | default 50000 | 1 to 1,000,000 | Stops a long scan | 100 | Keep the default |
proxyMode | Connection route | string | no | default auto | auto, direct, datacenter | Picks the connection | direct | Keep auto |
proxyGroups | Datacenter proxy groups | array | no | empty | Up to 5 datacenter group names | Picks proxy groups | ["SHADER"] | Leave empty |
Interacting settings
| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
|---|---|---|---|---|---|
| Both are set | placeUrls | query | Links win, and the search is ignored | A link plus a city | Only the links are charged |
| Both are set | since | recentDays | since wins | A date plus 30 days | Fewer or more reviews |
| A date filter is set | since or until | sortBy | Reviews run from most recent first | mostHelpful plus a date | Order changes |
| Reviews mode | maxReviews | maxResults | The first limit reached stops the run | 100 per place, 1,000 in total | Caps review charges |
| Only one date is set | checkInDate | checkOutDate | The run stops before work with a clear message | Check-in only | Start fee only |
| Nested output | outputShape | maxReviews | One place row holds its reviews | 3 reviews inside 1 row | Each review is still charged |
| Search with a city | query | placeTypes | Only chosen types are read | Lyon, hotels only | Fewer place checks |
Input examples
Search for places
{"mode": "search","query": "Pattaya restaurants","maxItems": 10}
Expected behavior: the Actor opens the restaurant list for Pattaya and reads 10 place pages.
Expected output: 10 place rows with name, rating, reviewsCount, ranking and phone.
Limit or cost note: about 20 to 35 seconds and about $0.03.
Reviews with filters
{"mode": "reviews","placeUrls": ["https://www.tripadvisor.com/Hotel_Review-g187147-d207742-Reviews-Intercontinental_Paris_Le_Grand_By_IHG-Paris_Ile_de_France.html"],"maxReviews": 300,"reviewRatings": ["1", "2"],"maxResults": 300}
Expected behavior: the Actor reads the review pages of this hotel and keeps only 1 and 2 star reviews.
Expected output: up to 300 review rows with rating, title, text and publishedDate.
Limit or cost note: without filters, 300 reviews of one place took 21 to 27 seconds and cost about $0.82.
Output
Output fields
Fields depend on the row type and the place type. An empty field means the source did not show that value for this place.
| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
|---|---|---|---|---|---|
recordType | Row type | string | no | place, review | Missing on status rows |
status | Row state | string | no | complete, not_found, failed, invalid_url | Status rows are free |
reason | Why a status row exists | string | on data rows | NO_RESULTS, NO_MATCHING_REVIEWS | Status rows only |
placeId, locationId | Place ID | number | on some status rows | 12283373 | From the place link |
name | Place name | string | conditional | Longhorn Steakhouse & Grill | Place and review rows |
type | Place type | string | conditional | restaurant, hotel, attraction | Place rows |
rating | Rating of the place or review | number | conditional | 4.7 | 1 to 5 |
reviewsCount | Number of reviews | number | conditional | 597 | As the page shows it |
ranking | Position in the city | string | conditional | #30 of 1,515 Restaurants in Pattaya | Text from the page |
address, phone, website | Contact details on the page | string | conditional | +66 81 860 1575 | Public values only |
latitude, longitude | Coordinates | number | conditional | 12.930813 | Place rows |
priceLevel | Price band | string | yes, often on attractions | $$ - $$$ | Text from the page |
priceRange | Hotel price range | object | yes | {minimum: 94, maximum: 156, currency: "USD"} | Empty when the source shows no range |
offers | Hotel offers | array | yes | price text, amount, provider, currency, dates | Offers for your dates have no provider name |
roomCount | Number of rooms | number | yes | 390 | Some hotels |
description | Place description | string | yes | Some places | |
cuisines | Cuisines | array | yes | ["Steakhouse"] | Restaurants only |
amenities | Amenities | array | yes | Hotels only | |
tags | Cuisine, amenity and type tags | array | yes | ["European"] | With includeTags |
openingHours | Opening times | array | yes | {day, opens, closes} | Restaurants and attractions; the day format differs by type |
awards | Awards of this place | array | yes | {type: "COE", year: 2026} | COE is Travelers' Choice; BOTB is Best of the Best |
subratings | Ratings by topic | array | yes | {name: "food", rating: 4.5} | Rare on attractions |
ratingHistogram | Count per star | object | yes | {five: 488} | Place rows |
neighborhoods | Area names | array | yes | Some places | |
menuUrl | Menu link | string | yes | Some restaurants | |
aiReviewSummary | Summary shown on the page | string | yes | With includeAiReviewsSummary | |
nearbyPlaces | Nearby places | array | yes | With includeNearbyResults | |
photos | Photo links | array | yes | With maxPhotosPerPlace | |
url | Page link | string | no on data rows | a Tripadvisor link | |
id | Review ID | number | on place rows | 1079747211 | Review rows |
title, text | Review title and text | string | conditional | Mixed | Review rows |
publishedDate, date | Date and time of the review | string | conditional | 2026-09-28T22:09:55.062Z | Review rows |
travelDate | Month of the visit | string | yes | 2026-09 | Review rows |
tripType | Traveler group | string | yes | FRIENDS | Review rows |
language, lang, originalLanguage | Row language and original language | string | yes | en, fr | Review rows |
isMachineTranslated | Text was translated by the source | boolean | yes | true | Review rows |
helpfulVotes | Helpful votes | number | yes | 1 | Review rows |
user | Public reviewer data | object | yes | With scrapeReviewerInfo | |
ownerResponse | The owner's reply | object | yes | When the place replied | |
placeInfo | Short place data on a review | object | yes | Review rows | |
reviews | Reviews inside a place row | array | yes | With nested output | |
query, sourceDatasetId | Input of a status row | string | yes | Status rows | |
source, fetchedAt | Source name and read time | string | no on data rows | Tripadvisor |
Compared with some other scrapers, id is a number, publishedDate holds a date and a time, and an empty subratings is null or [].
Output entities and surfaces
The dataset has three views: Places, Reviews and Places with reviews.
| Situation | Dataset/API/KVS/live view | Result shape | User action |
|---|---|---|---|
| Normal item | Dataset | One row per place or per review | Open a view or export the rows |
| Domain-empty result | Dataset | A free status row with status: not_found and reason | Check the search or relax the filters |
| Partial result | Dataset and RUN_SUMMARY | The saved rows, and a summary with the stop reason | Raise the limit or the timeout and run again |
| Technical failure or retry | Status message and RUN_SUMMARY | Saved rows are kept, and the run shows as failed | Try later, or open an issue with the run ID |
Output example
This example is trimmed and comes from the first search example above.
{"recordType": "place","status": "complete","placeId": 12283373,"name": "Longhorn Steakhouse & Grill","type": "restaurant","rating": 4.7,"reviewsCount": 597,"ranking": "#30 of 1,515 Restaurants in Pattaya","address": "216/47-48 Pattaya 2nd Rd Inside Plaza Arcade, 20150, TH","phone": "+66 81 860 1575","latitude": 12.930813,"longitude": 100.88198,"priceLevel": "$$ - $$$","cuisines": ["Steakhouse", "European"],"awards": [{ "type": "COE", "year": 2026 }],"description": null,"menuUrl": null,"source": "Tripadvisor"}
null means the page did not show this value for this place. Some fields fit only one place type. For example, cuisines fits restaurants, and amenities and offers fit hotels.
Send results to Slack or Notion
Choose your connector in the optional deliveryConnector field. When the run has saved its rows, the Actor posts a short summary there: up to 25 rows and a link to the full dataset. Put a Notion page link or a Slack channel ID in deliveryTarget. In Notion, each run goes on top of that one page, so you do not get a new page each time. If delivery fails, the run still succeeds, and delivery has no extra fee. Connect a service once in Apify Console β MCP connectors.
Use case β fields
| Buyer job | Input path | Output entity | Key fields | Next integration |
|---|---|---|---|---|
| Rank places in a city | query | Place | name, ranking, rating | CSV export |
| Read complaints | placeUrls, reviewRatings | Review | rating, text, ownerResponse | Spreadsheet |
| Check stay prices | placeUrls, checkInDate, checkOutDate | Place | offers, priceRange | API |
Pricing
Pricing unit
You pay per event. Tripadvisor and Apify proxy use is included in the event price.
| Event | When charged | No plan or Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|---|
| Review | Each saved review | $0.0027 | $0.00243 | $0.00216 | $0.00189 |
| Place | Each saved place row | $0.0017 | $0.00153 | $0.00136 | $0.00119 |
| Place check | Each unique place the Actor opens | $0.001 | $0.0009 | $0.0008 | $0.0007 |
| Review page | Each page of reviews read | $0.0005 | $0.00045 | $0.0004 | $0.00035 |
| Start | Each run | $0.0036 | $0.00324 | $0.00288 | $0.00252 |
Bronze saves 10%. Silver saves 20%. Gold, Platinum and Diamond save 30%. The start fee scales with run memory, per GB. Runs up to 1 GB pay it once, and this Actor's maximum is 512 MB.
- Search with no results: you pay the start fee only. The status row is free.
- Filter with no match: you pay the start fee, the place check and the review pages read. The status row is free.
- Partial and failed runs: you pay for what was saved or checked before the stop. You can set a maximum cost per run, and the Actor stops there.
- Platform use: it is included in these prices.
Cost examples
Prices below are for No plan or Free.
| Scenario | Input scope | Expected item/event count | Base charge | Optional charge | Stop/cap behavior |
|---|---|---|---|---|---|
| First run | 10 restaurants in Pattaya | 10 places, 10 checks | about $0.03 | none | Stops at maxItems |
| City list | 100 restaurants in London | 100 places, 100 checks | about $0.27 | none | Set a 900-second timeout |
| 300 reviews | 1 attraction | 300 reviews, 15 pages | about $0.82 | none | Stops at maxReviews |
| 700 reviews | 1 hotel | 700 reviews, 36 pages | about $1.91 | none | Stops at maxReviews |
| No match | 1 place, strict filter | 1 check, 1 page | about $0.005 | none | Free status row |
| Not found | A search with no result | start only | $0.0036 | none | Free status row |
Limits
- Public pages only: there is no login, no private data and no email search.
- Speed: up to one request per second. A place usually takes 2 to 7 seconds, and reviews come at 11 to 16 per second. When Tripadvisor refuses a page, retries can stretch one place to about 45 seconds.
- Time limit: the Actor stops 20 seconds before your timeout and keeps the saved rows. The default 300 seconds fits about 40 places. 100 London restaurants took from 200 to 534 seconds, and one run saved only 94 places in 600 seconds. Tripadvisor pages load at different speeds, so use a 900-second timeout for 100 places.
- Direct inputs: up to 100 links in
placeUrls, up to 100 instartUrls, and up to 100 rows insourceDatasetId. A link can have up to 2,048 characters. You need read access to this dataset. - City lists: the Actor reads the list as the source shows it. It does not split a big city into smaller areas, so a list can end before all places are read.
- Hotel offers: the list can be empty on a complete row. Offers for your dates have no provider name. Occupancy is fixed at 2 adults and 1 room.
- Page size: a single response over 8 MB is refused.
- Failures: 3 failed inputs in a row stop the run, and saved rows stay in the dataset. If no input works, the run shows as failed.
- Nested rows: one row holds up to 8 MB of reviews, about 2,500. A place with more reviews takes several rows. 300 reviews made a row of 0.84 MB.
- Connection: a direct connection comes first, and an Apify datacenter proxy follows after a block. Residential, Unblocker and SERP groups are not supported.
- Not included: Standby mode, a list of only new items, and custom scripts. Use
recentDayson a schedule for recent reviews. - Missing values: the source does not show every field for every place.
- Terms: Tripadvisor's terms restrict automated collection without permission, so check that your use is allowed. This Actor is not made or approved by Tripadvisor.
API, export and integrations
- API: start the Actor through the Apify API with the same JSON input, then read rows from its dataset. This is not a Tripadvisor API.
- Export: download the dataset as CSV, Excel, JSON or XML.
- Scheduling: run a saved task on an Apify schedule, for example with
recentDaysfor recent reviews. - Webhooks / no-code: an Apify webhook or integration can start the next step when the run ends. It reads the rows from the default dataset.
- SDK / MCP / agent: use the Apify client for JavaScript or Python, or the MCP server below.
Use with AI agents (MCP)
MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/tripadvisor-scraper
The smallest useful input:
{ "mode": "search", "query": "Pattaya restaurants", "maxItems": 10 }
Key output fields:
name: the place name.rating: the average rating, from 1 to 5.reviewsCount: the number of reviews.ranking: the position of the place in its city.url: the link to the place page.
This run takes about 20 to 35 seconds and costs about $0.03. Each place usually takes 2 to 7 seconds. Reviews cost $0.0027 each on the Free plan, so set maxReviews and a maximum cost.
Troubleshooting
| Symptom | Likely reason | Check | Action |
|---|---|---|---|
One row with status: not_found and NO_RESULTS | The search found no places | The words in query | Use a city plus a place type, or a link |
| A place that does not look like your search | Tripadvisor search matched one word of your query | The words in query | Use a city plus a place type, or a link |
status: not_found and NOT_FOUND | The place link or ID does not exist | Open the link in a browser | Fix the link or the ID |
status: not_found and NO_MATCHING_REVIEWS | No review passes your filters | Your review filters | Remove a filter |
status: invalid_url | The link is not from Tripadvisor | The link in the row | Use a Tripadvisor link |
| "An input field has a wrong value: placeUrls." | The field breaks a limit, such as over 100 links in placeUrls or startUrls. A name such as placeUrls.1 points to one item, counted from 0 | The field or item named in the message | Split the links into smaller runs, or shorten that item |
| "Add a search query, a Tripadvisor URL, or a source dataset." | All inputs are empty | The input form | Fill in one input |
| "The run reached its time limit." | The timeout was too short | The run options | Raise the timeout, and run again |
| "The run stopped at your maximum cost per run." | Your cost limit was reached | The run options | Raise the limit, and run again |
| "Maximum pages was reached, so more results may exist." | maxPages stopped the scan | maxPages | Raise it |
One row with status: failed, or "Some inputs failed." | Tripadvisor refused or timed out on this place | url and reason in the row | Run that link again. The other rows are kept |
| "Tripadvisor refused the requests." or "asked to slow down" | The source is blocking for now | RUN_SUMMARY | Keep proxyMode on auto, and try later |
| "The source dataset could not be read." | Wrong ID or no access | The dataset ID | Use a dataset you can read |
| "The source dataset has over 100 rows." | The dataset is too large | The dataset size | Use up to 100 rows |
| "The Tripadvisor page format has changed." | The source page changed | The run log | Open an issue with the run ID |
offers is empty | The source shows no offers for this hotel | checkInDate, checkOutDate | Try other dates |
FAQ
Do I need a Tripadvisor account or an API key?
No. The Actor reads public pages. You need only an Apify account.
Is this a Tripadvisor API?
No. It is a scraper that you can start through the Apify API. It does not use a Tripadvisor key.
Why are some fields empty?
The source does not show every value for every place. Some fields also fit only one place type. For example, attractions have no cuisines.
Can I get all reviews of a place?
Set maxReviews and maxResults above the review count, and set a long enough timeout. We measured up to 700 reviews from one place in one run. The count on the page can differ from the rows you get.
What do I pay when nothing is found?
You pay the start fee. If a place was opened, you also pay the place check and the review pages. Status rows are free.
How fresh is the data?
Each row shows the read time in fetchedAt. The Actor does not keep history between runs.
Related Actors
- OpenTable Reviews & Restaurants Scraper, No Login: add restaurant reviews from another source.
- Trustpilot Reviews Scraper - Ratings & Replies, No Login: compare guest feedback with company reviews.
Support
For a bug, a question or a feature request, open the Issues tab of this Actor on Apify. Include the run ID, the mode and the error text. Never send tokens, cookies or private data.

