TripAdvisor Hotel, Restaurant & Attraction Finder
Search TripAdvisor by phrase or place URL for hotels, restaurants, and attractions, with rating, ranking, address, contact details, and pricing per place.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | search finds ranked places from a query; details reads one place per URL or ID; reviews exports review rows with optional filters. |
query | string | optional | What to search for, for example 'hotels in New York', 'restaurants Paris' or 'Eiffel Tower'. The place family is inferred from words such as hotels, restaurants, museums or things to do. |
location | string | optional | Optional destination used with query, for example 'New York' or 'Paris'. When set, query can be just 'hotels' or 'restaurants'. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | search finds ranked places from a query; details reads one place per URL or ID; reviews exports review rows with optional filters. |
query | string | optional | What to search for, for example 'hotels in New York', 'restaurants Paris' or 'Eiffel Tower'. The place family is inferred from words such as hotels, restaurants, museums or things to do. |
location | string | optional | Optional destination used with query, for example 'New York' or 'Paris'. When set, query can be just 'hotels' or 'restaurants'. |
startUrls | array | optional | Tripadvisor place URLs (Hotel_Review, Restaurant_Review or Attraction_Review) or numeric location IDs. Used by details and reviews modes. |
maxItems | integer | optional | Maximum search results, detail places, or review target places to process. One place can return many reviews. |
includeDetails | boolean | optional | Fetches amenities and a larger photo for place rows. HTML enrichment is used in details mode when the JSON fields are missing. |
maxReviews | integer | optional | Reviews to collect for each target place in reviews mode. Upstream returns 20 per request; the actor paginates until this cap. |
reviewSort | string | optional | Order of the review stream. Attractions automatically use DETAILED for MOST_RECENT so product reviews do not mix into the attraction's own reviews. |
reviewRating | string | optional | Only return reviews with this bubble rating. |
reviewLanguage | string | optional | Only return reviews written in this language. |
reviewTripType | string | optional | Only return reviews from this traveler type. |
reviewMonth | string | optional | Only return reviews submitted in this month. |
reviewKeyword | string | optional | Only return reviews whose text matches this keyword, for example 'pool' or 'breakfast'. |
proxyConfiguration | object | optional | Optional. The actor tries direct access first, then the free Apify datacenter proxy, and only escalates after a real block. You do not need to configure a proxy to run it. |
Download the published input schema
View complete JSON
{
"description": "Choose a mode, give it a query or Tripadvisor place URLs, and optionally narrow the review export by rating, language, traveler type, month, keyword and sort.",
"properties": {
"includeDetails": {
"default": true,
"description": "Fetches amenities and a larger photo for place rows. HTML enrichment is used in details mode when the JSON fields are missing.",
"prefill": false,
"sectionCaption": "Details",
"title": "Enrich place details",
"type": "boolean"
},
"location": {
"description": "Optional destination used with query, for example 'New York' or 'Paris'. When set, query can be just 'hotels' or 'restaurants'.",
"editor": "textfield",
"title": "Location",
"type": "string"
},
"maxItems": {
"default": 20,
"description": "Maximum search results, detail places, or review target places to process. One place can return many reviews.",
"maximum": 500,
"minimum": 1,
"prefill": 1,
"sectionCaption": "Limits",
"title": "Maximum places",
"type": "integer"
},
"maxReviews": {
"default": 20,
"description": "Reviews to collect for each target place in reviews mode. Upstream returns 20 per request; the actor paginates until this cap.",
"maximum": 500,
"minimum": 1,
"prefill": 20,
"sectionCaption": "Reviews",
"title": "Maximum reviews per place",
"type": "integer"
},
"mode": {
"default": "search",
"description": "search finds ranked places from a query; details reads one place per URL or ID; reviews exports review rows with optional filters.",
"editor": "select",
"enum": [
"search",
"details",
"reviews"
],
"enumTitles": [
"Search places",
"Place details",
"Reviews"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"proxyConfiguration": {
"description": "Optional. The actor tries direct access first, then the free Apify datacenter proxy, and only escalates after a real block. You do not need to configure a proxy to run it.",
"editor": "proxy",
"sectionCaption": "Proxy",
"sectionDescription": "Leave empty unless you want to supply your own proxy. Direct access is attempted first.",
"title": "Proxy configuration",
"type": "object"
},
"query": {
"description": "What to search for, for example 'hotels in New York', 'restaurants Paris' or 'Eiffel Tower'. The place family is inferred from words such as hotels, restaurants, museums or things to do.",
"editor": "textfield",
"prefill": "Eiffel Tower",
"sectionCaption": "Search",
"title": "Search query",
"type": "string"
},
"reviewKeyword": {
"description": "Only return reviews whose text matches this keyword, for example 'pool' or 'breakfast'.",
"editor": "textfield",
"title": "Review keyword",
"type": "string"
},
"reviewLanguage": {
"default": "ANY",
"description": "Only return reviews written in this language.",
"editor": "select",
"enum": [
"ANY",
"en",
"es",
"de",
"fr",
"it",
"pt",
"nl",
"ru",
"ja",
"zhCN",
"zhTW",
"ko",
"ar",
"tr",
"pl",
"sv",
"da",
"no",
"fi",
"cs",
"el",
"hu",
"iw",
"in",
"th",
"vi",
"ro",
"uk",
"bg",
"hr",
"sk",
"sr",
"sl",
"lt",
"lv",
"et",
"ca",
"ms",
"tl",
"hi"
],
"enumTitles": [
"Any language",
"English",
"Spanish",
"German",
"French",
"Italian",
"Portuguese",
"Dutch",
"Russian",
"Japanese",
"Chinese (Simplified)",
"Chinese (Traditional)",
"Korean",
"Arabic",
"Turkish",
"Polish",
"Swedish",
"Danish",
"Norwegian",
"Finnish",
"Czech",
"Greek",
"Hungarian",
"Hebrew",
"Indonesian",
"Thai",
"Vietnamese",
"Romanian",
"Ukrainian",
"Bulgarian",
"Croatian",
"Slovak",
"Serbian",
"Slovenian",
"Lithuanian",
"Latvian",
"Estonian",
"Catalan",
"Malay",
"Filipino",
"Hindi"
],
"title": "Review language",
"type": "string"
},
"reviewMonth": {
"default": "ANY",
"description": "Only return reviews submitted in this month.",
"editor": "select",
"enum": [
"ANY",
"JANUARY",
"FEBRUARY",
"MARCH",
"APRIL",
"MAY",
"JUNE",
"JULY",
"AUGUST",
"SEPTEMBER",
"OCTOBER",
"NOVEMBER",
"DECEMBER"
],
"enumTitles": [
"Any month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"title": "Month of visit",
"type": "string"
},
"reviewRating": {
"default": "ANY",
"description": "Only return reviews with this bubble rating.",
"editor": "select",
"enum": [
"ANY",
"1",
"2",
"3",
"4",
"5"
],
"enumTitles": [
"Any rating",
"1 star",
"2 stars",
"3 stars",
"4 stars",
"5 stars"
],
"title": "Review rating",
"type": "string"
},
"reviewSort": {
"default": "MOST_RECENT",
"description": "Order of the review stream. Attractions automatically use DETAILED for MOST_RECENT so product reviews do not mix into the attraction's own reviews.",
"editor": "select",
"enum": [
"MOST_RECENT",
"MOST_HELPFUL",
"DETAILED"
],
"enumTitles": [
"Most recent",
"Most helpful",
"Detailed"
],
"sectionCaption": "Review filters",
"sectionDescription": "Optional filters for the review export. They apply only in reviews mode.",
"title": "Review sort",
"type": "string"
},
"reviewTripType": {
"default": "ANY",
"description": "Only return reviews from this traveler type.",
"editor": "select",
"enum": [
"ANY",
"FAMILY",
"COUPLES",
"SOLO",
"BUSINESS",
"FRIENDS"
],
"enumTitles": [
"Any traveler type",
"Family",
"Couples",
"Solo",
"Business",
"Friends"
],
"title": "Traveler type",
"type": "string"
},
"startUrls": {
"description": "Tripadvisor place URLs (Hotel_Review, Restaurant_Review or Attraction_Review) or numeric location IDs. Used by details and reviews modes.",
"editor": "stringList",
"items": {
"type": "string"
},
"sectionCaption": "Targets",
"title": "Place URLs or IDs",
"type": "array"
}
},
"required": [],
"schemaVersion": 1,
"title": "Tripadvisor Place and Review Scraper input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
recordType | string | required | place or review |
sourceUrl | string | required | Tripadvisor page the record came from |
scrapedAt | string | required | ISO timestamp of the run |
id | string | required | Place ID for place rows, review ID for review rows |
locationId | string | optional | Legacy alias of id for place rows |
name | string | optional | Place name |
type | string | optional | hotel, restaurant or attraction |
subcategory | string | optional | Legacy specific subcategory label; falls back to the place type |
url | string | optional | Canonical Tripadvisor place page |
webUrl | string | optional | Legacy alias of url |
rating | string | optional | Legacy bubble rating as text, 0-5 |
ratingValue | string | optional | Numeric bubble rating, 0-5 |
reviewCount | string | optional | Numeric total number of reviews for the place |
numberOfReviews | string | optional | Legacy review count as text |
ranking | string | optional | Tripadvisor ranking text, for example #13 of 588 hotels in New York City |
rankingString | string | optional | Legacy alias of ranking |
rankingPosition | string | optional | Numeric rank parsed from the ranking string |
priceRange | string | optional | Price range text published by Tripadvisor |
priceLevel | string | optional | Price level symbols when published |
cuisine | string | optional | Restaurant cuisines |
phone | string | optional | Phone number |
email | string | optional | Published email |
website | string | optional | Official website URL when published |
hotelClass | string | optional | Hotel star rating when published |
hours | string | optional | Opening hours text when published |
description | string | optional | Place description when published |
neighborhoods | string | optional | Neighborhood names when published |
address | string | optional | Full address |
street | string | optional | Street address |
city | string | optional | City name |
state | string | optional | State or province |
country | string | optional | Country name |
postalCode | string | optional | Postal or ZIP code |
lat | string | optional | Numeric latitude |
lng | string | optional | Numeric longitude |
latitude | string | optional | Legacy latitude as text |
longitude | string | optional | Legacy longitude as text |
amenities | string | optional | Hotel amenities |
photos | string | optional | Place photo URLs |
photoUrl | string | optional | Legacy alias of the first photo |
searchQuery | string | optional | The search query that found the place |
isClosed | string | optional | Whether the place is permanently closed, as text |
scrapeTimestamp | string | optional | Legacy alias of scrapedAt |
detailSource | string | optional | detailPage or typeaheadFallback |
detailStatus | string | optional | complete or partial when only a TypeAhead fallback was available |
placeId | string | optional | Place ID for review rows |
title | string | optional | Review title |
text | string | optional | Review body |
date | string | optional | Review submission timestamp |
tripType | string | optional | Traveler type reported by the reviewer |
language | string | optional | Review language tag |
author | string | optional | Reviewer display name |
authorLocation | string | optional | Reviewer hometown when published |
helpfulVotes | string | optional | Helpful votes on the review |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One row per place in search/details modes and one row per review in reviews mode. Empty fields are omitted at every depth. Every record carries recordType, sourceUrl and scrapedAt. Legacy place names are kept for backward compatibility; rating, numberOfReviews, latitude and longitude are strings, while ratingValue, reviewCount, lat and lng are numeric.",
"properties": {
"address": {
"description": "Full address",
"template": "{{address}}",
"title": "Address",
"type": "string"
},
"amenities": {
"description": "Hotel amenities",
"template": "{{amenities}}",
"title": "Amenities",
"type": "string"
},
"author": {
"description": "Reviewer display name",
"template": "{{author}}",
"title": "Author",
"type": "string"
},
"authorLocation": {
"description": "Reviewer hometown when published",
"template": "{{authorLocation}}",
"title": "Author location",
"type": "string"
},
"city": {
"description": "City name",
"template": "{{city}}",
"title": "City",
"type": "string"
},
"country": {
"description": "Country name",
"template": "{{country}}",
"title": "Country",
"type": "string"
},
"cuisine": {
"description": "Restaurant cuisines",
"template": "{{cuisine}}",
"title": "Cuisine",
"type": "string"
},
"date": {
"description": "Review submission timestamp",
"template": "{{date}}",
"title": "Review date",
"type": "string"
},
"description": {
"description": "Place description when published",
"template": "{{description}}",
"title": "Description",
"type": "string"
},
"detailSource": {
"description": "detailPage or typeaheadFallback",
"template": "{{detailSource}}",
"title": "Detail source",
"type": "string"
},
"detailStatus": {
"description": "complete or partial when only a TypeAhead fallback was available",
"template": "{{detailStatus}}",
"title": "Detail status",
"type": "string"
},
"email": {
"description": "Published email",
"template": "{{email}}",
"title": "Email",
"type": "string"
},
"helpfulVotes": {
"description": "Helpful votes on the review",
"template": "{{helpfulVotes}}",
"title": "Helpful votes",
"type": "string"
},
"hotelClass": {
"description": "Hotel star rating when published",
"template": "{{hotelClass}}",
"title": "Hotel class",
"type": "string"
},
"hours": {
"description": "Opening hours text when published",
"template": "{{hours}}",
"title": "Hours",
"type": "string"
},
"id": {
"description": "Place ID for place rows, review ID for review rows",
"template": "{{id}}",
"title": "ID",
"type": "string"
},
"isClosed": {
"description": "Whether the place is permanently closed, as text",
"template": "{{isClosed}}",
"title": "Is closed",
"type": "string"
},
"language": {
"description": "Review language tag",
"template": "{{language}}",
"title": "Review language",
"type": "string"
},
"lat": {
"description": "Numeric latitude",
"template": "{{lat}}",
"title": "Numeric latitude",
"type": "string"
},
"latitude": {
"description": "Legacy latitude as text",
"template": "{{latitude}}",
"title": "Legacy latitude",
"type": "string"
},
"lng": {
"description": "Numeric longitude",
"template": "{{lng}}",
"title": "Numeric longitude",
"type": "string"
},
"locationId": {
"description": "Legacy alias of id for place rows",
"template": "{{locationId}}",
"title": "Legacy location ID",
"type": "string"
},
"longitude": {
"description": "Legacy longitude as text",
"template": "{{longitude}}",
"title": "Legacy longitude",
"type": "string"
},
"name": {
"description": "Place name",
"template": "{{name}}",
"title": "Place name",
"type": "string"
},
"neighborhoods": {
"description": "Neighborhood names when published",
"template": "{{neighborhoods}}",
"title": "Neighborhoods",
"type": "string"
},
"numberOfReviews": {
"description": "Legacy review count as text",
"template": "{{numberOfReviews}}",
"title": "Legacy number of reviews",
"type": "string"
},
"phone": {
"description": "Phone number",
"template": "{{phone}}",
"title": "Phone",
"type": "string"
},
"photoUrl": {
"description": "Legacy alias of the first photo",
"template": "{{photoUrl}}",
"title": "Legacy photo URL",
"type": "string"
},
"photos": {
"description": "Place photo URLs",
"template": "{{photos}}",
"title": "Photos",
"type": "string"
},
"placeId": {
"description": "Place ID for review rows",
"template": "{{placeId}}",
"title": "Place ID",
"type": "string"
},
"postalCode": {
"description": "Postal or ZIP code",
"template": "{{postalCode}}",
"title": "Postal code",
"type": "string"
},
"priceLevel": {
"description": "Price level symbols when published",
"template": "{{priceLevel}}",
"title": "Price level",
"type": "string"
},
"priceRange": {
"description": "Price range text published by Tripadvisor",
"template": "{{priceRange}}",
"title": "Price range",
"type": "string"
},
"ranking": {
"description": "Tripadvisor ranking text, for example #13 of 588 hotels in New York City",
"template": "{{ranking}}",
"title": "Ranking",
"type": "string"
},
"rankingPosition": {
"description": "Numeric rank parsed from the ranking string",
"template": "{{rankingPosition}}",
"title": "Ranking position",
"type": "string"
},
"rankingString": {
"description": "Legacy alias of ranking",
"template": "{{rankingString}}",
"title": "Legacy ranking string",
"type": "string"
},
"rating": {
"description": "Legacy bubble rating as text, 0-5",
"template": "{{rating}}",
"title": "Rating",
"type": "string"
},
"ratingValue": {
"description": "Numeric bubble rating, 0-5",
"template": "{{ratingValue}}",
"title": "Numeric rating",
"type": "string"
},
"recordType": {
"description": "place or review",
"template": "{{recordType}}",
"title": "Record type",
"type": "string"
},
"reviewCount": {
"description": "Numeric total number of reviews for the place",
"template": "{{reviewCount}}",
"title": "Review count",
"type": "string"
},
"scrapeTimestamp": {
"description": "Legacy alias of scrapedAt",
"template": "{{scrapeTimestamp}}",
"title": "Legacy scrape timestamp",
"type": "string"
},
"scrapedAt": {
"description": "ISO timestamp of the run",
"template": "{{scrapedAt}}",
"title": "Scraped at",
"type": "string"
},
"searchQuery": {
"description": "The search query that found the place",
"template": "{{searchQuery}}",
"title": "Search query",
"type": "string"
},
"sourceUrl": {
"description": "Tripadvisor page the record came from",
"template": "{{sourceUrl}}",
"title": "Source URL",
"type": "string"
},
"state": {
"description": "State or province",
"template": "{{state}}",
"title": "State or province",
"type": "string"
},
"street": {
"description": "Street address",
"template": "{{street}}",
"title": "Street",
"type": "string"
},
"subcategory": {
"description": "Legacy specific subcategory label; falls back to the place type",
"template": "{{subcategory}}",
"title": "Subcategory",
"type": "string"
},
"text": {
"description": "Review body",
"template": "{{text}}",
"title": "Review text",
"type": "string"
},
"title": {
"description": "Review title",
"template": "{{title}}",
"title": "Review title",
"type": "string"
},
"tripType": {
"description": "Traveler type reported by the reviewer",
"template": "{{tripType}}",
"title": "Trip type",
"type": "string"
},
"type": {
"description": "hotel, restaurant or attraction",
"template": "{{type}}",
"title": "Place type",
"type": "string"
},
"url": {
"description": "Canonical Tripadvisor place page",
"template": "{{url}}",
"title": "Place URL",
"type": "string"
},
"webUrl": {
"description": "Legacy alias of url",
"template": "{{webUrl}}",
"title": "Legacy web URL",
"type": "string"
},
"website": {
"description": "Official website URL when published",
"template": "{{website}}",
"title": "Website",
"type": "string"
}
},
"required": [
"recordType",
"sourceUrl",
"scrapedAt",
"id"
],
"title": "Tripadvisor Place and Review Scraper output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"title": "Tripadvisor places and reviews",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"address": {
"format": "text",
"label": "Address"
},
"author": {
"format": "text",
"label": "Author"
},
"date": {
"format": "text",
"label": "Date"
},
"name": {
"format": "text",
"label": "Place"
},
"ranking": {
"format": "text",
"label": "Ranking"
},
"rating": {
"format": "number",
"label": "Rating"
},
"recordType": {
"format": "text",
"label": "Record"
},
"reviewCount": {
"format": "number",
"label": "Reviews"
},
"sourceUrl": {
"format": "link",
"label": "Source"
},
"title": {
"format": "text",
"label": "Review title"
},
"type": {
"format": "text",
"label": "Type"
}
}
},
"title": "All records",
"transformation": {
"fields": [
"recordType",
"name",
"title",
"type",
"rating",
"reviewCount",
"ranking",
"address",
"author",
"date",
"sourceUrl"
]
}
},
"places": {
"display": {
"component": "table",
"properties": {
"address": {
"format": "text",
"label": "Address"
},
"amenities": {
"format": "text",
"label": "Amenities"
},
"cuisine": {
"format": "text",
"label": "Cuisine"
},
"email": {
"format": "text",
"label": "Email"
},
"id": {
"format": "text",
"label": "Place ID"
},
"name": {
"format": "text",
"label": "Name"
},
"phone": {
"format": "text",
"label": "Phone"
},
"photos": {
"format": "text",
"label": "Photos"
},
"priceRange": {
"format": "text",
"label": "Price"
},
"ranking": {
"format": "text",
"label": "Ranking"
},
"rating": {
"format": "number",
"label": "Rating"
},
"reviewCount": {
"format": "number",
"label": "Reviews"
},
"type": {
"format": "text",
"label": "Type"
},
"url": {
"format": "link",
"label": "Tripadvisor URL"
}
}
},
"title": "Places",
"transformation": {
"fields": [
"id",
"name",
"type",
"rating",
"reviewCount",
"ranking",
"priceRange",
"cuisine",
"phone",
"email",
"address",
"amenities",
"photos",
"url"
]
}
},
"reviews": {
"display": {
"component": "table",
"properties": {
"author": {
"format": "text",
"label": "Author"
},
"authorLocation": {
"format": "text",
"label": "Author location"
},
"date": {
"format": "text",
"label": "Date"
},
"helpfulVotes": {
"format": "number",
"label": "Helpful votes"
},
"id": {
"format": "text",
"label": "Review ID"
},
"language": {
"format": "text",
"label": "Language"
},
"placeId": {
"format": "text",
"label": "Place ID"
},
"rating": {
"format": "number",
"label": "Rating"
},
"sourceUrl": {
"format": "link",
"label": "Source"
},
"title": {
"format": "text",
"label": "Title"
},
"tripType": {
"format": "text",
"label": "Traveler type"
}
}
},
"title": "Reviews",
"transformation": {
"fields": [
"id",
"placeId",
"title",
"rating",
"date",
"tripType",
"language",
"author",
"authorLocation",
"helpfulVotes",
"sourceUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
TripAdvisor Hotel, Restaurant & Attraction Finder
Read Tripadvisor places and reviews in one actor. Search a destination for ranked hotels, restaurants and attractions, open a specific place by its Tripadvisor URL or numeric ID, or export a review stream with server-side filters. Everything works without a Tripadvisor account, API key or cookie.
Modes
| Mode | What it does | Main inputs |
|---|---|---|
search |
Finds ranked places through Tripadvisor listing pages. If those pages are unavailable, it falls back to the GraphQL type-ahead index. | query, optional location |
details |
Reads one place per URL or ID from the place page JSON-LD and embedded data, including amenities and a larger photo when published. | startUrls |
reviews |
Reads reviews for each target place, 20 per request, with offset pagination and filters. Targets can come from URLs, IDs, or a search query. | startUrls or query, review filters |
Every record is a flat JSON object. Place rows carry recordType: "place", review rows carry recordType: "review", and both include sourceUrl and scrapedAt. Empty fields are omitted at every depth, so there are no nulls, empty strings, empty arrays or empty objects in the dataset.
Place fields
Current fields: id, name, type, url, ratingValue, reviewCount, ranking, priceRange, cuisine, phone, email, address, lat, lng, amenities, photos, sourceUrl, scrapedAt, recordType, detailSource, detailStatus.
Backward-compatible legacy fields are always restored on place rows: locationId, subcategory, street, city, state, country, postalCode, latitude, longitude, rating, numberOfReviews, rankingPosition, rankingString, priceLevel, website, hotelClass, hours, description, neighborhoods, webUrl, isClosed, photoUrl, searchQuery, scrapeTimestamp.
type is hotel, restaurant or attraction. ratingValue, reviewCount, lat and lng are numeric. The legacy rating, numberOfReviews, latitude and longitude fields are strings, matching the pre-revamp contract. amenities and photos are arrays of strings. ranking is the full Tripadvisor ranking text when the place page publishes it.
A TypeAhead fallback row carries detailSource: "typeaheadFallback" and detailStatus: "partial"; a normal detail-page row carries detailStatus: "complete". Media URLs are checked for scheme, host and extension before they are published.
Review fields
id, placeId, title, text, rating, date, tripType, language, author, authorLocation, helpfulVotes, sourceUrl, scrapedAt, recordType.
date is the review submission timestamp, tripType is the traveler type reported by the reviewer, and authorLocation is the reviewer's published hometown.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
select | search |
search, details or reviews. |
query |
string | - | Search phrase, for example hotels in New York or Eiffel Tower. Also used by reviews when no URLs are given. |
location |
string | - | Optional destination for search, for example New York. With this set, query can be just hotels. |
startUrls |
string list | - | Tripadvisor place URLs or numeric location IDs. Used by details and reviews. |
maxItems |
integer 1-500 | 20 |
Maximum places to return in search, process in details, or use as review targets in reviews. |
includeDetails |
boolean | true |
Fetch extra place data: key amenities, a larger photo, and HTML enrichment when the JSON fields are missing. |
maxReviews |
integer 1-500 | 20 |
Reviews per place in reviews mode. |
reviewSort |
select | MOST_RECENT |
MOST_RECENT, MOST_HELPFUL or DETAILED. Attractions automatically use DETAILED for MOST_RECENT so bookable product reviews do not mix into the attraction's reviews. |
reviewRating |
select | ANY |
ANY or 1-5. |
reviewLanguage |
select | ANY |
Common Tripadvisor language tags such as en, de, fr or es. |
reviewTripType |
select | ANY |
FAMILY, COUPLES, SOLO, BUSINESS or FRIENDS. |
reviewMonth |
select | ANY |
JANUARY through DECEMBER. |
reviewKeyword |
string | - | Text that must appear in the review. |
proxyConfiguration |
object | - | Optional. Direct access is tried first. |
At least one search phrase or start URL is required, depending on the mode. Search and details modes need their own target. Reviews mode accepts either start URLs or a query.
Examples
Open one hotel and include amenities:
{
"mode": "details",
"startUrls": [
"https://www.tripadvisor.com/Hotel_Review-g60763-d675616-Reviews-The_Plaza_New_York_A_Fairmont_Managed_Hotel-New_York_City_New_York.html"
],
"maxItems": 1,
"includeDetails": true
}
Search hotels in New York:
{
"mode": "search",
"query": "hotels",
"location": "New York",
"maxItems": 10,
"includeDetails": false
}
Export recent five-star English reviews for a place:
{
"mode": "reviews",
"startUrls": ["675616"],
"maxItems": 1,
"maxReviews": 100,
"reviewSort": "MOST_RECENT",
"reviewRating": "5",
"reviewLanguage": "en"
}
Search a city and then export its reviews:
{
"mode": "reviews",
"query": "restaurants in Paris",
"maxItems": 5,
"maxReviews": 20
}
How search works
The actor resolves the destination with the type-ahead GraphQL index and always sends the full free-text query first, even when the query contains a family word such as restaurants. Queries like sushi restaurants in New York therefore keep sushi in the request instead of browsing every restaurant in the city.
Ranked listing pages (Hotels, Restaurants and Attractions) 30 places at a time are used as a supplement. When listing rows are added for a free-text query, they are filtered client-side by the remaining terms against name, cuisine and description; unrelated rows are dropped and reported as relevance_filtered in the run status. TypeAhead results are limited to 20 per request, so a free-text-only query can stop at 20 rows; listing supplement and pagination extend family searches up to maxItems.
Duplicates are removed by place ID, and TypeAhead results keep their order ahead of listing supplements. search never uses a browser, a cookie or a login. Listing pages use a Safari TLS profile; the JSON APIs are called with plain HTTP. With includeDetails: true, each place is opened once to fill the full ranking, amenities and photo.
How details works
Place IDs are read from URLs such as /Hotel_Review-g60763-d675616-... or from numeric IDs. Each place page is read as HTML and its schema.org JSON-LD plus server-rendered data supply the place fields, including rating, review count, ranking, price range, contacts, coordinates, amenities, cuisine and photos.
When only a numeric ID is given, the actor opens a category-agnostic Tripadvisor URL and follows the canonical redirect to the hotel, restaurant or attraction page. Redirected URLs are accepted when they keep the same location ID; a redirect to a different ID or to a category page is treated as not found, so data is never attributed to the wrong place.
If a detail page is blocked, details mode falls back to the public TypeAhead record for the same location ID, including ID-only targets with no URL. The fallback is attempted even when the only target is a numeric ID. If TypeAhead cannot identify the place, the review clients resolve the type as a last resort (detailSource: "reviewTypeFallback"). Those rows are marked detailStatus: "partial" and counted as details_fallback in the run status. For reviews, an ID-only target whose detail page cannot resolve the place type also tries the three review clients before the run is marked blocked.
Unsupported Tripadvisor entities such as activities, cruises and airlines are skipped with a counter instead of failing the whole run.
How reviews works
Reviews come from the public reviews GraphQL endpoint. Each request returns at most 20 reviews; the actor pages by offset until maxReviews, the place total, or the run cap is reached. Filters are sent to the server, not applied after downloading everything.
Unlike many review tools, the actor filters every row by the target location ID. Attractions are read with the DETAILED sort when MOST_RECENT is requested, which keeps bookable product reviews out of the attraction's own review stream.
Limits
- 20 results per TypeAhead request. Free-text-only queries can therefore stop at 20 unless listing pages add relevant rows.
- Search listing pages hold 30 places; up to 17 pages (500 places) are read per family, matching the
maxItemsceiling. - 500 reviews per place per run (a product cap; the upstream offset pagination was verified past 5,000).
- 10,000 reviews per run across all targets.
- 500 places per run.
- Reviews are deduplicated by review ID and places by location ID.
- Media URLs are validated for scheme, host and extension, but are not rehosted; a hotlink-blocked CDN URL can still fail in a consumer application.
The actor fails the run when it produces zero records or when every request is blocked. If only some targets or pages fail, it pushes the records it has and reports the partial counts in the run status, including details_fallback and relevance_filtered.
Proxy and anti-bot behaviour
Access is direct first. If Tripadvisor returns a real block, the actor tries the free Apify datacenter proxy (AUTO). It only moves to the RESIDENTIAL group after AUTO is also blocked. A user-supplied proxyConfiguration is used after a direct block. You do not need to configure anything for a normal run.
Escalation is per request: every JSON or HTML request starts at direct and only that request moves up the ladder after a block. A blocked detail page therefore does not force later TypeAhead or review requests onto a paid rung.
The TypeAhead and reviews GraphQL endpoints are the primary path for discovery and reviews. Place details are read from the place page HTML, which is fetched with the Safari TLS profile and only when a place record is needed.
FAQ
Do I need a Tripadvisor account or API key? No. The actor reads public place and review data. It does not log in, and it does not need user cookies.
Do I need a proxy? No. Direct access is tried first and works for the JSON APIs. The actor escalates automatically only after a block.
Why is amenities missing for some places?
Tripadvisor publishes amenities mainly for hotels. Restaurants and attractions often have none, and the field is omitted rather than filled with a placeholder.
Why are there fewer reviews than the total on the page?
The review count on a place page can include reviews in many languages and, for attractions, reviews from bookable products. The actor returns the reviews that match the target place and your filters, up to maxReviews.
Why does a search return fewer places than maxItems?
Tripadvisor may not render enough ranked cards for a destination, a page may be unavailable, or a free-text TypeAhead query may return at most 20 rows. The actor supplements TypeAhead with filtered listing pages and reports relevance_filtered, listing_failures and other partial counts in the status message.
Are the records always the same shape?
No. Empty fields are removed, so a restaurant row has cuisine while a hotel row may have amenities. Every record keeps the identity, source and timestamp fields.
Is this affiliated with Tripadvisor? No. This is an independent, third-party actor that reads publicly available Tripadvisor data. It is not affiliated with or endorsed by Tripadvisor.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build gsx9VyA0GeR1bwgRX. Documentation is regenerated from the default published build; private drafts are not included.