# Tripadvisor Place Details Scraper (`boncross/tripadvisor-location-details`) Actor

Scrape the full Tripadvisor record for any hotel, restaurant or attraction. Just add URLs and get the rating, reviews per star and language, popular mentions, ranking, sub-ratings, amenities, price band, coordinates, address, phone, website and opening hours. $1.60 per 1,000 places.

- **URL**: https://apify.com/boncross/tripadvisor-location-details.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 location-scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tripadvisor Place Details Scraper

### What is Tripadvisor Place Details Scraper?

Give Tripadvisor Place Details Scraper a list of Tripadvisor links or ids and you get one row per place: what it is, how it's rated, where it ranks locally and how to contact it. It works for hotels, restaurants, attractions and destinations, and a list of 900 ids finishes in about 12 seconds.

This is the enrichment step. Use it when you already have the places, from your own list or from one of the Tripadvisor city scrapers, and want the full record behind each. Reviews themselves come from Tripadvisor Reviews Scraper.

Why pick this one:

- You get the review breakdown most place data leaves out: the count for each star from one to five, the count per review language, and the phrases travellers mention most. All three were filled on 5 of 5 hotels and 4 of 4 attractions we measured.
- Rankings arrive as numbers and as Tripadvisor's sentence. "#118 of 587 hotels in New York City" is also `rankingPosition` 118 and `rankingDenominator` 587, ready to sort.
- Hotels come with six sub-ratings, the amenity list (20 to 59 per hotel in the sample), room features, languages spoken, style rankings and the Travellers' Choice award. Restaurants come with four sub-ratings, dietary options, meal types and dining options.
- It's quick: a list of 900 ids took 11.9 seconds with the extra details, which is about 4,500 ids a minute.
- $1.60 per 1,000 places on the Free plan and $0.70 on Business, usage included. A place that can't be read costs you nothing.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 19 of 19 live checks on its inputs and filters passed on 7 October 2026
- 15 places run the same day, hotels, restaurants and attractions: 14 places, 1 error row
- Charges checked against the 14 places
- A place that can't be read gets an uncharged row saying why

The basics are there too:

- Get the name, description, rating and total review count for each place on your list
- Collect coordinates, full address, phone, email and official website
- Read the hotel class, the price band and the nightly price range Tripadvisor shows
- Get restaurant cuisines and opening hours per day
- See the neighbourhoods a place sits in and its parent city, region and country
- Look a place up by its Tripadvisor address or by numeric id
- Download the records as JSON, CSV, Excel, XML or HTML

### What data do you get for each place?

| Field | Description |
|---|---|
| 🏷️ Name | The place's name on Tripadvisor |
| Category | Hotel, restaurant, attraction or destination |
| ⭐ Rating | The overall score out of five |
| Review count | How many reviews the place has |
| 🥇 Ranking | Position, total and the ranking sentence |
| 🛎️ Hotel class | The star class, where one applies |
| 💷 Price band | The price level and the nightly range |
| 📍 Coordinates | Latitude and longitude |
| 🏠 Address | Street, city, state, postcode and country |
| ☎️ Contact | Phone, email and official website |
| 🍽️ Cuisines | Restaurant cuisines |
| 🕐 Opening hours | Per day, as clock times |
| 🎟️ Entry fee | Whether an attraction charges, where Tripadvisor says |
| Neighbourhoods | The areas a place sits in |
| Ancestors | Parent city, region and country |
| 🖼️ Photo | The place's lead image |
| 📊 Rating breakdown | Reviews per star, one to five, and per review language |
| 💬 Popular mentions | The phrases travellers mention most in reviews |
| Sub-ratings | Cleanliness, location, rooms, service, sleep quality and value for hotels. Food, service, value and atmosphere for restaurants |
| 🛏️ Amenities | Hotel amenities, room features, room types and languages spoken |
| 🏆 Award | The hotel's Travellers' Choice award and year |
| 🥗 Restaurant options | Dietary options, meal types and dining options |

### How much does it cost to scrape Tripadvisor place details?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `location-scraped`, per place returned | $0.0016 | $0.00096 | $0.00085 | $0.0007 |

Enterprise plans pay the Business price.

**$1.60 per 1,000 places** on the Free plan, $0.70 on Business. Proxy usage and platform usage are inside that price, and the extra details don't cost more.

- A list of 1,000 places: $0.001 + 1,000 × $0.0016 = **$1.601** ($0.70 on Business).
- A list of five: $0.001 + 5 × $0.0016 = **$0.009** ($0.0045 on Business).

With the $5 of monthly credits on Apify's Free plan you can look up about 3,100 places before paying anything.

### How to scrape Tripadvisor place details

1. [Sign up for Apify](https://console.apify.com/sign-up), which is free, and open [Tripadvisor Place Details Scraper](https://apify.com/boncross/tripadvisor-location-details).
2. Paste your Tripadvisor page addresses or location ids into the list of places.
3. Press Start.
4. Download the records as Excel, CSV or JSON when the run finishes.

There's nothing else to set. One switch is on by default, and you'd only touch it to slim the row down.

### ⬇️ Input

You give it Tripadvisor page addresses or numeric location ids, mixed however you like. If your list lives in a file or a Google Sheet, load it through "Start URLs (bulk upload)". Both inputs are combined.

"Include rating breakdown, mentions and amenities" is on by default. It adds the rating breakdown, popular mentions, sub-ratings, amenities and the other columns marked Extra in the output table. Turn it off if you want the basic record only.

There's one limit, "Maximum places for the whole run". Leave it at 0 and your whole list is read. You aren't charged for anything past the cap when you set one.

#### A single hotel

```json
{
  "locations": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"]
}
```

#### A mixed batch by id

```json
{
  "locations": ["93589", "1073239", "188151", "297704"]
}
```

#### For developers

- `locations` and `startUrls` are merged. `maxItems` (default 0, no cap) stops the run after that many places.
- `includeExtraDetails` (default true) controls the Extra columns. With it off the row is the basic record.
- `maxConcurrency` (default 32, from 1 to 32) is the number of requests in flight across the run. Drop it if a run reports errors. At 1 the run goes strictly one at a time, with the same rows in the same order.
- `delayMs` (default 0) is a pause before each request, in milliseconds.
- Each row is saved as soon as it's read. A run that Apify interrupts and restarts picks up where it stopped, and no place is saved or charged twice.

### ⬆️ Output

You get one row per place. This one is a full hotel record with the extra details on.

```json
{
  "id": "93589",
  "locationId": "93589",
  "input": "93589",
  "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
  "scrapedAt": "2026-09-12T17:58:11.904Z",
  "name": "The Michelangelo New York",
  "category": "Hotel",
  "rating": 4.5,
  "ratingScale": 5,
  "totalReviews": 5211,
  "rankingText": "#118 of 587 hotels in New York City",
  "rankingPosition": 118,
  "rankingDenominator": 587,
  "stars": 4,
  "priceLevel": "$$$$",
  "priceText": "$268 - $959",
  "priceMin": 268,
  "priceMax": 959,
  "lat": 40.761528,
  "lng": -73.98261,
  "street": "152 W 51st St",
  "city": "New York City",
  "state": "NY",
  "postcode": "10019",
  "country": "United States",
  "phone": "12127651900",
  "website": "https://www.michelangelohotel.com/",
  "timezone": "America/New_York",
  "neighborhoods": ["Theater District", "Midtown"],
  "tags": ["Manhattan", "Mid-range"],
  "photoUrl": "https://media-cdn.tripadvisor.com/media/photo-o/0a/22/4a/e8/mezzanine.jpg",
  "ratingDistribution": { "1": 81, "2": 109, "3": 293, "4": 1127, "5": 3605 },
  "reviewCountByLanguage": { "en": 4806, "it": 168, "pt": 70, "es": 53, "fr": 37 },
  "reviewKeywords": ["times square", "great location", "central park", "rooms are large", "junior suite"],
  "subRatings": [
    { "name": "Cleanliness", "rating": 4.71 }, { "name": "Location", "rating": 4.88 }, { "name": "Rooms", "rating": 4.62 },
    { "name": "Service", "rating": 4.56 }, { "name": "Sleep quality", "rating": 4.68 }, { "name": "Value", "rating": 4.33 }
  ],
  "amenities": ["Paid private parking on-site", "Free High Speed Internet (WiFi)", "Fitness Center with Gym / Workout Room", "Bar / lounge"],
  "roomFeatures": ["Bathrobes", "Air conditioning", "Room service", "Minibar"],
  "roomTypes": ["Non-smoking rooms", "Suites", "Family rooms"],
  "languagesSpoken": ["English", "French", "Spanish", "German", "Italian"],
  "hotelStyles": [{ "name": "Romantic", "rank": 42 }, { "name": "Quiet", "rank": 23 }],
  "awardType": "COE",
  "awardYear": 2026,
  "dietaryRestrictions": null,
  "mealTypes": null,
  "diningOptions": null
}
```

| Column | Meaning |
|---|---|
| `category`, `categoryKey`, `subcategories`, `locationType` | What the place is: hotel, restaurant, attraction or destination, and Tripadvisor's finer classes |
| `description` | The place's description |
| `rawRanking` | Tripadvisor's underlying popularity score behind the ranking |
| `rankingPosition`, `rankingDenominator`, `rankingCategory`, `rankingText`, `rankingGeo`, `rankingGeoId` | The place's rank, what it is ranked among, and where |
| `stars`, `starsAttribution` | Hotel class, and who awarded it |
| `priceLevel`, `priceText`, `priceMin`, `priceMax` | Price band ($ to $$$$) and the price range Tripadvisor shows |
| `address`, `street`, `city`, `state`, `postcode`, `country`, `locationString` | The address, whole and in parts |
| `timezone`, `neighborhoods`, `ancestors` | The place's timezone, its neighbourhoods, and the regions it sits in |
| `phone`, `email`, `website`, `writeReviewUrl` | Contact details as published, and the page for writing a review |
| `cuisines` | Restaurant cuisines |
| `tags` | Tripadvisor's tags for the place, such as the area and price style |
| `openingHours`, `openNowText` | Opening hours by day, and Tripadvisor's open-now wording |
| `hasFee` | Whether an attraction charges for entry, where Tripadvisor says |
| `isClosed`, `isLongClosed` | Closed for good, or closed for a long period |
| `photoUrl`, `photoCaption` | The lead photo and its caption |
| `isPartialRecord` | `true` when Tripadvisor's full place record was not available and the row has the core details only (see the limits in the FAQ). `false` on a full row |
| `ratingDistribution` | Extra. Reviews per star: `{"1": …, "5": …}` |
| `reviewCountByLanguage` | Extra. Reviews per language code, most first (`en`, `fr`, `zh-CN` …) |
| `reviewKeywords` | Extra. The popular mentions Tripadvisor shows above the reviews, up to 20 |
| `subRatings` | Extra. `{name, rating}` per aspect, out of five: six for hotels, four for restaurants |
| `amenities`, `roomFeatures`, `roomTypes`, `languagesSpoken` | Extra, hotels. All the amenities listed, highlighted or not |
| `hotelStyles` | Extra, hotels. The styles the hotel ranks for (Romantic, Quiet, Classic …) and its rank in the city for each |
| `awardType`, `awardYear` | Extra, hotels. The Travellers' Choice award (`COE`, or `BOB` for Best of the Best) and its year. Null when the hotel has none |
| `dietaryRestrictions`, `mealTypes`, `diningOptions` | Extra, restaurants. Dietary options, meals served, and dining options such as reservations, seating or cards accepted |
| `input`, `error` | What you asked for and, on a row for a place that could not be read, why |

#### How often the extra columns are filled

We measured this on 4 October 2026 across 5 hotels, 2 restaurants, 4 attractions and 1 destination. A dash means the column doesn't apply to that kind of place and is always empty there.

| Column | Hotels | Restaurants | Attractions | Destinations |
|---|---|---|---|---|
| `ratingDistribution` | 5 of 5 | 2 of 2 | 4 of 4 | - |
| `reviewCountByLanguage` | 5 of 5 | 2 of 2 | 4 of 4 | - |
| `reviewKeywords` | 5 of 5 (12 to 20 each) | 1 of 2 | 4 of 4 (19 to 20 each) | - |
| `subRatings` | 5 of 5 (6 each) | 2 of 2 (4 each) | - | - |
| `amenities`, `roomFeatures`, `roomTypes`, `languagesSpoken` | 5 of 5 (20 to 59 amenities) | - | - | - |
| `hotelStyles` | 5 of 5 (8 to 10 each) | - | - | - |
| `awardType`, `awardYear` | 3 of 5 | - | - | - |
| `dietaryRestrictions` | - | 1 of 2 | - | - |
| `mealTypes`, `diningOptions` | - | 2 of 2 | - | - |

When you see an empty value, Tripadvisor shows nothing there for that place. The restaurant without mentions has eight reviews, and a hotel without an award hasn't won one.

### How many places can you get, and how fast?

| Run | Places | Time | Charge on the Free plan |
|---|---|---|---|
| One hotel | 1 | 2.5 s | $0.0026 |
| 10 places of mixed kinds, with the extra details | 10 | 3.6 to 5.5 s | $0.017 |
| 900 ids, 569 of them real places, with the extra details | 569, plus 331 error rows | 11.9 s | $0.9114 |

That works out at about 4,500 ids a minute with the extra details (4 October 2026). Without them the same list took 8.4 seconds on 3 October, about 6,400 a minute. The times are whole runs on Apify, start-up included, and the 331 ids that weren't real places cost nothing.

Your list can be as long as you like. If you only want to try it on part of a list, set the run-wide maximum.

### Use it from a pipeline

You'll probably run this behind something else: a venue list in a spreadsheet, a CRM, or the output of a city scrape. `POST https://api.apify.com/v2/acts/boncross~tripadvisor-location-details/run-sync-get-dataset-items` with `{"locations": [...]}` as the body returns the records in the same call for a short list, and the `apify-client` packages for Node.js and Python handle long ones. To track rankings over time, put the same list on an Apify Schedule and compare `rankingPosition` between runs.

Through the Apify MCP server (`mcp.apify.com`) an AI agent sees the actor as the tool `tripadvisor-location-details` and can look a place up mid-conversation.

### FAQ

#### Do I need proxies or a Tripadvisor account?

You need neither. You don't sign in to anything, and proxy usage is included in the price.

#### Does it return reviews?

You get the place record, including how the reviews split by star and language and what they mention most. For the review text, use Tripadvisor Reviews Scraper with the same links.

#### Can I look a place up without its URL?

The numeric location id works on its own. It's the number after `-d` in any Tripadvisor address, such as 93589.

#### Why does a tour come back with fewer columns?

Bookable tours and activities have no full place record on Tripadvisor. You get a partial row, marked `isPartialRecord: true`, with the name, link, rating, review count, description, city and country, the lead photo, the write-a-review link, the rating breakdown and the popular mentions. Ranking, price, contact details and opening hours are empty. A partial row is billed like any other place.

#### Why is `hasFee` empty on my attractions?

The column is filled only where Tripadvisor states one. In our check on 7 October 2026 it was empty on all 5 attractions in the sample.

#### Why don't the star counts add up to the review total?

Tripadvisor keeps `ratingDistribution` and `totalReviews` separately, and on the busiest places they can differ slightly. The Louvre showed 104,628 against 103,407.

#### What are the limits?

- The record is in English. Language and currency settings don't change it.
- You get one lead photo per place, not the gallery.
- Amenities and style rankings are for hotels, dietary options for restaurants, and awards for hotels only.
- Sub-ratings are Tripadvisor's averages. A restaurant with few reviews can show the same score on each aspect.
- Destination pages return a review count and a description but no rating, ranking or address, because those belong to places. They get no rating breakdown or mentions either: the counts Tripadvisor keeps for a destination describe the destination page, not the places in it, and we leave the columns empty.
- `rankingText` is Tripadvisor's wording and can count a wider list than `rankingDenominator`. A restaurant reads "#692 of 15,866 places to eat" where the ranked list of restaurants is 9,146.
- `phone` is as each place publishes it, and formats differ ("+1 212-883-7373", "(212) 310-6600", "12127651900").
- Nightly price ranges come from Tripadvisor's display. Treat them as indicative, not as a live quote.
- An input with no Tripadvisor id in it, or a place that can't be read, gets a row with `input` and an `error` message. Those rows are free.

#### Is it legal to scrape Tripadvisor place data?

Everything here is published by Tripadvisor to visitors who aren't signed in. Collecting public data is broadly lawful. How you use it, contact details included, is your responsibility under GDPR and similar rules, and it's worth taking legal advice if you're unsure.

### More from BonCross

- [Tripadvisor Reviews Scraper](https://apify.com/boncross/tripadvisor-reviews): Every Tripadvisor review for any hotel, restaurant, attraction or tour.
- [Agoda Reviews Scraper](https://apify.com/boncross/agoda-reviews): Agoda hotel reviews, including the Booking.com reviews Agoda shows.
- [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews): Every Booking.com guest review for any hotel.
- [Expedia Reviews Scraper](https://apify.com/boncross/expedia-reviews): Expedia guest reviews for any hotel, including hotels given as Hotels.com links.
- [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews): Google Maps reviews for any place using URLs, Place IDs or names.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.

### Your feedback

If a column is empty where Tripadvisor's page shows a value, or a place you expected came back as an error, open an issue on the Issues tab in Apify Console and include the link. We read them all and answer there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/tripadvisor-location-details/changelog.md

# Actor input Schema

## `locations` (type: `array`):

The places to scrape. Paste the address of any Tripadvisor hotel, restaurant, attraction or destination page, or just the numeric location id.

## `startUrls` (type: `array`):

Tripadvisor page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxItems` (type: `integer`):

A run-wide ceiling on places, across the list and Start URLs. Zero means no limit.

## `includeExtraDetails` (type: `boolean`):

Adds the review count per star and per language, the popular mentions travellers write about, and — for hotels — sub-ratings, amenities, room features, languages spoken, style rankings and the Travellers' Choice award; for restaurants, sub-ratings, dietary options, meal types and dining options. Turn off for the basic record only, which is slightly faster.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "locations": [
    "93589"
  ],
  "startUrls": [],
  "maxItems": 0,
  "includeExtraDetails": true,
  "delayMs": 0,
  "maxConcurrency": 32
}
```

# Actor output Schema

## `dataset` (type: `string`):

Tripadvisor places: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/tripadvisor-location-details").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locations": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/tripadvisor-location-details").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"
  ]
}' |
apify call boncross/tripadvisor-location-details --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/tripadvisor-location-details"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cxK6zCrl70AteORok/builds/zwsEXDKKvWopvPfmk/openapi.json
