# TripAdvisor Scraper API — Hotels, Restaurants & Reviews (`pro100chok/tripadvisor-all-in-one`) Actor

TripAdvisor scraper and unofficial TripAdvisor API: extract hotels, restaurants and full review threads with prices, ratings, GPS, amenities, cuisines, hours, awards and photos. Input by URL, keyword or city name, 38 languages. Export JSON, CSV, Excel. From $2.20/1k places, $0.25/1k reviews.

- **URL**: https://apify.com/pro100chok/tripadvisor-all-in-one.md
- **Developed by:** [Raven](https://apify.com/pro100chok) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 30 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TripAdvisor Scraper — Hotels, Restaurants & Reviews 🧳

**Scrape TripAdvisor reviews from $0.25 per 1,000 and full place records from $2.20 per 1,000 (paid Apify plans).** This unofficial TripAdvisor API extracts hotels and restaurants with prices, rankings, GPS coordinates, amenities, cuisines, opening hours, awards, photos and complete review threads — and exports everything to JSON, CSV or Excel.

No login, no TripAdvisor API key, no proxies to configure and no code. Paste a TripAdvisor URL, type a keyword, or just name a city — the actor finds the places, extracts the data and embeds each place's reviews inside its record. **You pay only for what lands in the dataset.**

***

### 🧭 What does this TripAdvisor Scraper do?

TripAdvisor's official content API is restricted to approved partners. This actor works as an **unofficial TripAdvisor API alternative**: it collects the same public data — places, ratings, prices, reviews — with nothing to apply for. One actor covers what usually takes two:

| What you get | How |
|--------------|-----|
| 🏨 **Hotels** | Price range & headline prices, deals count, booking provider, amenities, awards, phone |
| 🍽️ **Restaurants** | Cuisines, establishment types, price level, opening hours, open-now status, awards |
| 💬 **Reviews** | Full review threads embedded inside each place record — ratings, per-category sub-ratings, trip type, traveler photos, reviewer profile and owner responses |

And three ways to tell it what to scrape:

| Input mode | Give it | Best for |
|------------|---------|----------|
| 🔗 **Start URLs** | Any TripAdvisor page — detail pages or listing pages | Known targets |
| 🔍 **Search terms** | Free-text keywords like `"Eiffel Tower"` | Named places, quick lookups |
| 🏙️ **Cities** | City names — `"Paris"`, `"Dubai"` — or numeric geo IDs | Scraping a whole destination |

***

### ✨ Why use this TripAdvisor scraper?

- ✅ **Hotels, restaurants and reviews in one actor** — no juggling separate scrapers per category.
- ✅ **Type a city, get the data** — `"Paris"`, `"New York City"`, `"Dubai"` resolve to the right TripAdvisor destination automatically; no geo IDs to look up.
- ✅ **Reviews embedded inline** — each place record carries a `reviews: [...]` array, so one dataset row = one place with everything about it.
- ✅ **City listing crawler** — paginates hotel and restaurant listings to discover every POI in a destination (up to 5,000 per listing).
- ✅ **38 languages & regional variants** — pick a `locale` and descriptions, reviews and amenities come back in that language.
- ✅ **Rich place records** — prices and deals, GPS coordinates, amenities, cuisines, opening hours, Travelers' Choice awards, rankings, up to 30 photos per place.
- ✅ **Business emails, straight from TripAdvisor** — hotels with a Business Advantage listing come back with an `emails` array (≈65% of hotels), pulled directly from TripAdvisor — no external website visit — ready-made B2B lead-gen.
- ✅ **Hard budget cap** — `Maximum cost per run` (default $20) stops the run cleanly the moment your budget is hit. No surprise bills.
- ✅ **Zero setup, all-in price** — reliability, retries and delivery are handled for you and fully included in the per-result price.

#### How does it compare?

| | Official TripAdvisor Content API | Typical single-purpose scrapers | **This actor** |
|---|---|---|---|
| Access | Partner approval + API key | None | **None** |
| Hotels + restaurants | Depends on partnership | Usually one category per actor | ✔️ **All in one** |
| Reviews | Limited | Often a separate actor | ✔️ **Embedded in each place** |
| Input by city name | — | Often URL or geo ID only | ✔️ Plain city names |
| Localized output | — | Often English only | ✔️ 38 languages/regions |
| Budget control | — | Rare | ✔️ Hard cost cap per run |
| Pricing | Partnership terms | Per result | **Per result, from $0.25/1,000 reviews** |

***

### 📦 What data can you extract from TripAdvisor?

Every dataset row is a single place record (hotel or restaurant). When `Include reviews` is on, reviews come embedded inside that record as an array.

#### 🏨 Hotel record

| Field | Description |
|-------|-------------|
| `__type` | `"hotel"` |
| `locationId` | TripAdvisor numeric POI id |
| `parentGeoId` | Numeric city id |
| `url` | Canonical TripAdvisor URL |
| `name` | Hotel name |
| `description` | "About this hotel" text |
| `accommodationType` | Property type, e.g. `"Hotel"` |
| `priceRange` | TripAdvisor price band (`$$`) |
| `priceRangeMin`, `priceRangeMax` | Low / high end of the nightly price band in USD, e.g. `187` – `473` |
| `priceFrom` | Lowest deal price across booking partners |
| `finalPrice` | Headline price shown in the booking module |
| `dealsCount` | How many booking partners have a deal |
| `bookingProvider` | Provider of the cheapest deal, e.g. `all.accor.com` |
| `specialOffer` | Promo teaser when present, e.g. `"BOOK DIRECT & SAVE 15%"` |
| `offers` | Per-partner booking offers — each `{provider, displayPrice, basePrice, currency, isSupplierDirect, freeCancellationDate, roomsRemaining}` |
| `awards` | Travelers' Choice / Best of the Best / etc. |
| `phone` | Contact phone number |
| `emails` | Business contact email(s) TripAdvisor exposes **directly** for hotels with a Business Advantage listing (≈65% of hotels), e.g. `["hotel.astra@astotel.com"]` — straight from TripAdvisor, no external website visit |
| `rating`, `reviewCount`, `ranking`, `rankingPosition` | Aggregate rating, total reviews, "#3 of 1,882 hotels" and the numeric rank (e.g. `13`) |
| `address`, `neighborhood`, `city`, `postalCode`, `country`, `countryCode`, `region` | Full address, district (e.g. `"8th Arr. - Élysée"`) and ISO-3166 alpha-2 country code (e.g. `"FR"`) |
| `latitude`, `longitude` | GPS coordinates |
| `amenities` | Flat list of highlighted amenities (e.g. `["Pool", "Spa", "Restaurant"]`) |
| `images` | Main photo URL (single-item list with the primary thumbnail) |
| `totalReviews` | Total reviews available in the review feed |
| `scrapedAt` | ISO 8601 timestamp of when the record was scraped |

#### 🍽️ Restaurant record

| Field | Description |
|-------|-------------|
| `__type` | `"restaurant"` |
| `locationId`, `parentGeoId`, `url`, `name` | Identity |
| `phone`, `image` | Contact + cover photo |
| `rating`, `reviewCount` | Aggregate rating and total reviews |
| `priceLevel` | `$`, `$$`, `$$ - $$$`, etc. |
| `cuisines` | `["Japanese", "Sushi", "Asian"]` |
| `establishmentTypes` | `["Restaurants"]` |
| `awards` | Travelers' Choice / Michelin / etc. |
| `openingHours` | Hours per day of week — keys `mon`/`tue`/…/`sun`, each a list of `"HH:MM:SS-HH:MM:SS"` spans |
| `openStatusText` | Current status, e.g. `"Open now"` / `"Closed today"` |
| `menuUrl` | Link to the restaurant's menu when TripAdvisor has one |
| `hasDelivery` | Whether delivery is available |
| `hasReservation` | Whether online reservation is available |
| `reservationProvider` | Online reservation partner, e.g. `"TheFork"` |
| `reviewSnippet` | Short highlighted excerpt from a recent review |
| `address`, `postalCode`, `city`, `country` | Full address |
| `latitude`, `longitude` | GPS coordinates |
| `images` | Main photo URL (single-item list with the primary thumbnail) |
| `totalReviews` | Total reviews available in the review feed |
| `scrapedAt` | ISO 8601 timestamp of when the record was scraped |

#### 💬 Embedded review (when `Include reviews = true`)

Reviews live inside their parent place record under `reviews: [...]`. Each review carries:

| Field | Description |
|-------|-------------|
| `reviewId` | TripAdvisor review id |
| `url` | Permalink to the single-review page |
| `title` | Review title |
| `rating` | Overall score, 1–5 |
| `subratings` | Per-category scores when present, e.g. `{"Value": 1, "Rooms": 3, "Location": 5, "Cleanliness": 4, "Service": 5, "Sleep Quality": 2}` |
| `text` | Full review body |
| `photos` | Traveler photos attached to the review (image URLs) |
| `language` | Review language code (e.g. `"en"`, `"fr"`) |
| `travelDate` | When the user stayed/visited, ISO date (e.g. `"2026-06-30"`) |
| `tripType` | `"COUPLES"` / `"FAMILY"` / `"SOLO"` / `"BUSINESS"` / `"FRIENDS"` |
| `writtenDate` | When the review was posted, ISO date (e.g. `"2026-06-10"`) |
| `helpfulVotes` | Helpful-vote count |
| `reviewer` | `{name, profileUrl, contributions, location, isVerified, avatar}` |
| `ownerResponse` | Owner/management reply if present — `{rawText, respondent, respondedAt}` |

Plus `reviewsScraped: N` on the parent place — handy when you set `maxReviewsPerPoi` and want to know how many actually came back.

***

### 🚀 How to scrape TripAdvisor step by step

1. Click **Try for free** — an Apify account includes $5 of free usage every month, no credit card needed.
2. **Pick an Input Mode** at the top of the form — `Start URLs`, `Search terms`, or `Cities`.
3. **Fill the matching field** — paste TripAdvisor URLs, type keywords like `"Eiffel Tower"`, or list cities like `"Paris"`, `"Dubai"`.
4. **Pick a Category** — `All` / `Hotels` / `Restaurants` (ignored when you pass a direct detail URL).
5. **Toggle `Include reviews`** — embeds reviews inside each place record (charged separately per review).
6. **Set caps** — `Max items total`, `Max reviews per POI`, `Max POIs per listing`, `Maximum cost per run`.
7. **Run and download** — JSON, CSV or Excel from the dataset; the table view shows name, rating, price, ranking and city out of the box.

***

### 🛠️ Input parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `locations` | `startUrls`, `searchTerms`, or `locations` |
| `startUrls` | URL list | — | TripAdvisor pages: `Hotel_Review-`, `Restaurant_Review-`, `Hotels-`, `Restaurants-` |
| `searchTerms` | string list | — | Free-text keywords (resolved via TripAdvisor typeahead) |
| `locations` | string list | — | City names (`"Paris"`, `"New York City"`) or numeric geo IDs (`"187147"`) |
| `category` | enum | `all` | `all`, `hotels`, `restaurants` |
| `includeReviews` | boolean | `false` (UI prefill: `true`) | Fetch reviews and embed them inside each place record |
| `maxReviewsPerPoi` | integer | `10` | Cap on reviews per place (up to 50,000) |
| `maxPois` | integer | `50` | Cap on POIs per listing in `searchTerms` / `locations` modes (up to 5,000) |
| `maxItems` | integer | `10` | Hard cap on total dataset rows. `0` = unlimited |
| `locale` | enum | `en-US` | Result language — descriptions, reviews and amenities come back in the language you pick (38 languages/regions) |
| `maxRetries` | integer | `5` | How many times to retry a failed request before giving up |
| `maxConcurrency` | integer | `10` | How many places to fetch in parallel (up to 30) |

***

### 🍳 Ready-to-paste input recipes

**A. Every hotel in a city** — competitive set for a destination:

```json
{
  "mode": "locations",
  "locations": ["Paris"],
  "category": "hotels",
  "maxPois": 5000,
  "maxItems": 0
}
```

**B. Two cities, top 10 hotels each, 5 reviews per hotel:**

```json
{
  "mode": "locations",
  "locations": ["Paris", "Dubai"],
  "category": "hotels",
  "includeReviews": true,
  "maxReviewsPerPoi": 5,
  "maxPois": 10,
  "maxItems": 0
}
```

**C. One specific hotel with 50 reviews** — reputation deep-dive:

```json
{
  "mode": "startUrls",
  "startUrls": [
    { "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html" }
  ],
  "includeReviews": true,
  "maxReviewsPerPoi": 50
}
```

**D. Keyword search across all place types:**

```json
{
  "mode": "searchTerms",
  "searchTerms": ["Eiffel Tower", "Le Bernardin"],
  "category": "all",
  "includeReviews": false
}
```

**E. Restaurant market scan** — every restaurant in a city with cuisines, diets and hours:

```json
{
  "mode": "locations",
  "locations": ["Rome"],
  "category": "restaurants",
  "maxPois": 1000,
  "maxItems": 0
}
```

**F. Localized run** — hotels in Tokyo with Japanese descriptions and reviews:

```json
{
  "mode": "locations",
  "locations": ["Tokyo"],
  "category": "hotels",
  "locale": "ja",
  "includeReviews": true,
  "maxReviewsPerPoi": 10
}
```

***

### 📄 Output examples

#### 🏨 Hotel with embedded reviews

```json
{
  "__type": "hotel",
  "locationId": 250927,
  "parentGeoId": 187147,
  "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d250927-Reviews-Hotel_Europe_Saint_Severin-Paris_Ile_de_France.html",
  "name": "Hotel Europe Saint Severin",
  "description": "Friendly and comfortable property located in the heart of the Latin quarter…",
  "accommodationType": "Hotel",
  "priceRange": "$$ (Based on Average Nightly Rates for a Standard Room from our Partners)",
  "priceRangeMin": 149,
  "priceRangeMax": 320,
  "priceFrom": "$160",
  "finalPrice": "$221",
  "dealsCount": 11,
  "bookingProvider": "all.accor.com",
  "specialOffer": "BOOK DIRECT & SAVE 15%",
  "offers": [
    {
      "provider": "Hotels.com",
      "displayPrice": "$221",
      "basePrice": 221,
      "currency": "USD",
      "isSupplierDirect": false,
      "freeCancellationDate": "2026-07-25",
      "roomsRemaining": 4
    }
  ],
  "awards": ["Travelers' Choice"],
  "rating": 4.5,
  "reviewCount": 3256,
  "ranking": "#383 of 1,882 hotels",
  "rankingPosition": 383,
  "address": "38-40 Rue Saint Severin",
  "neighborhood": "5th Arr. - Panthéon",
  "city": "Paris",
  "postalCode": "75005",
  "country": "France",
  "countryCode": "FR",
  "emails": ["reservation@hoteleuropesaintseverin.com"],
  "latitude": 48.852753,
  "longitude": 2.344314,
  "amenities": ["Free WiFi", "24-hour front desk", "Concierge", "Air conditioning", "Non-smoking rooms"],
  "images": ["https://dynamic-media-cdn.tripadvisor.com/..."],
  "reviews": [
    {
      "reviewId": 1057616466,
      "title": "Perfect hotel for a family",
      "rating": 5.0,
      "text": "I can only recommend this hotel! We stayed here as a family of three…",
      "travelDate": "April 2026",
      "tripType": "Traveled with family",
      "writtenDate": "Apr 26",
      "helpfulVotes": 1,
      "reviewer": {
        "name": "Erdal A",
        "profileUrl": "https://www.tripadvisor.com/Profile/erdala957",
        "contributions": null,
        "location": null
      }
    }
  ],
  "reviewsScraped": 5
}
```

#### 🍽️ Restaurant

```json
{
  "__type": "restaurant",
  "locationId": 425227,
  "parentGeoId": 60827,
  "name": "Geido Restaurant",
  "rating": 4.4,
  "reviewCount": 287,
  "priceLevel": "$$ - $$$",
  "cuisines": ["Japanese", "Sushi", "Asian"],
  "establishmentTypes": ["Restaurants"],
  "awards": ["Travelers' Choice"],
  "openingHours": {
    "sun": ["17:00:00-22:00:00"],
    "mon": ["17:00:00-22:00:00"]
  },
  "openStatusText": "Open now",
  "hasReservation": true,
  "reservationProvider": "TheFork",
  "reviewSnippet": "Best sushi in the neighborhood — the omakase is a must.",
  "latitude": 40.677,
  "longitude": -73.969
}
```

***

### 💰 How much does it cost to scrape TripAdvisor?

Pay per result — no subscription, no minimum. Page discovery, retries, proxies and everything under the hood are absorbed by the actor, never charged to you.

| Event | Free plan | Paid Apify plans |
|-------|-----------|------------------|
| **Place** (one hotel or restaurant) | $3.50 / 1,000 | **from $2.20 / 1,000** |
| **Review** (embedded in its parent place) | $0.50 / 1,000 | **from $0.25 / 1,000** |

Real-world examples (free-plan prices):

| Job | Cost |
|-----|------|
| Top 50 hotels in Paris with 10 reviews each | $0.43 |
| One hotel with 1,000 reviews | ~$0.50 |
| 1,000 restaurants across 5 cities (no reviews) | $3.50 |
| 100 hotels with 100 reviews each (10,000 reviews) | $5.35 |

Apify's free plan includes **$5 of usage every month** — roughly 1,400 places or 9,900 reviews at no cost, no credit card required.

**Budget protection:** `Maximum cost per run` (default **$20**) is a hard cap — the run stops cleanly the moment your budget is hit, exit code 0, no partial double-charge. Combine with `maxItems` and `maxReviewsPerPoi` to control spend precisely.

***

### 🔌 Integrations

Send results anywhere: **Make, Zapier, Google Sheets, Slack, n8n, Airbyte, webhooks** or cloud storage. Pull data programmatically with the **Apify API** and the official [Python](https://docs.apify.com/api/client/python/) and [JavaScript](https://docs.apify.com/api/client/js/) clients.

Run it on a schedule with [Apify Schedules](https://docs.apify.com/platform/schedules) to monitor new reviews or price changes daily or weekly, and trigger a webhook whenever a run finishes.

### 🤖 Use with AI agents (MCP)

Like every Apify actor, this scraper is available to AI agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — connect it to Claude, Cursor or any MCP-compatible agent and ask things like *"Get the top 20 hotels in Lisbon with their latest reviews and summarize common complaints."* Structured place + review records are ideal input for LLM, RAG and sentiment pipelines.

***

### 💡 Popular use cases

- 🏨 **Hotel competitive analysis** — pull every hotel in a city with prices, ratings, amenities, ranking and photos for benchmarking against your own property.
- 🍽️ **Restaurant market research** — scrape restaurants by city; compare cuisines, price bands, ratings, awards and customer sentiment from review text.
- 💬 **Review sentiment mining** — bulk-extract review text, ratings, dates and trip types for sentiment analysis, brand monitoring and reputation management.
- 💵 **Pricing intelligence** — track `priceFrom` and `dealsCount` across hotels to spot pricing trends and OTA partner availability.
- 🗺️ **OTA / aggregator data feed** — power your own travel site or app with place data: GPS, amenities, hours, photos.
- 🔍 **Hospitality SEO research** — which cuisines and price bands rank top in a city, which Travelers' Choice winners exist, and what amenities matter most.
- 📞 **Lead generation for travel suppliers** — extract hotel and restaurant contact phone numbers for outreach.
- 📧 **B2B hotel email lists** — collect hotel business emails that TripAdvisor exposes directly (no website scraping) to build outreach lists for travel-tech, OTAs and hospitality suppliers.
- ✍️ **Travel content creation** — auto-generate destination guides with curated lists of top-rated places, photos and review quotes.

***

### ⚠️ Limitations

- **Listing depth** — default cap is 50 POIs per listing; set `maxPois` higher to scrape more (up to 5,000).
- **Reviews per POI** — default cap is 10 reviews to keep runs cheap; raise `maxReviewsPerPoi` as needed (up to 50,000).
- **Coverage & language** — TripAdvisor's data is global. Default results are in English; pick a `locale` for another of the 38 languages/regions. Some multilingual-country sub-variants (e.g. fr-CA, fr-CH) and markets without a localized TripAdvisor site aren't offered.

***

### ⚖️ Is it legal to scrape TripAdvisor?

This actor extracts only **publicly available data** — the same listings, ratings and reviews anyone can open in a browser. Scraping public data is generally legal; note that reviews contain personal data (reviewer names, profiles), which is protected by GDPR in the EU and similar regulations elsewhere. Make sure you have a legitimate basis for how you store and use it. Read more in Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

***

### ❓ FAQ

#### Do I need a TripAdvisor account or API key?

No. No login, no partner application, no API key — just enter what you want to scrape.

#### Does TripAdvisor have a public API?

TripAdvisor's official content API is limited to approved partners. This actor is an unofficial alternative that extracts the same public data with nothing to apply for.

#### What kinds of TripAdvisor data does this actor scrape?

Hotels, restaurants, and customer reviews. Reviews come embedded inside each place record.

#### How do I scrape every hotel in a city?

Use the `Cities` mode, type `"Paris"` (or paste the geo ID `"187147"`), set `category = hotels`, `maxPois = 5000` and `maxItems = 0` for unlimited.

#### Can I scrape a specific hotel or restaurant page?

Yes — switch to `Start URLs` and paste the `Hotel_Review-` URL. Same for restaurants (`Restaurant_Review-`).

#### How are reviews formatted?

Reviews live inside their parent place under `reviews: [...]`. Each review has `reviewId`, `title`, `rating`, `text`, `travelDate`, `tripType`, `helpfulVotes`, `reviewer`, `ownerResponse` and more. Set `Include reviews = true` to fetch them.

#### Can I get results in another language?

Yes — pick a `locale` and descriptions, reviews and amenities come back in that language. 38 languages and regional variants are supported, from French and German to Japanese and Thai.

#### How do I cap the cost per run?

The default `Maximum cost per run` is **$20**. Lower it in the Run options panel, or set `maxItems` / `maxReviewsPerPoi` to hard-cap the volume.

#### Will I be charged for URLs that return nothing?

No. Billing is per record delivered to the dataset — if a page yields nothing, you pay nothing for it.

#### Why are some review fields `null`?

TripAdvisor doesn't always show every field per review (e.g. reviewer location, contributions count, owner response). When the page doesn't surface it, the field is `null`.

#### Why does my run return zero reviews on some hotels?

Occasionally a place page comes back without its review section. The place itself is still pushed; only its `reviews` array is empty. Re-running usually fills them in.

#### How fast is it?

Expect roughly 3–8 seconds per place, depending on how many reviews you pull. Places are fetched in parallel (up to 30 at once).

#### Can I export to CSV or Excel?

Yes. The dataset exports to JSON, CSV, Excel, XML, RSS and HTML. Embedded `reviews: [...]` arrays flatten in CSV via dot-notation; if you need one-row-per-review, post-process the JSON export by unwinding the `reviews` field.

#### Can I run it on a schedule?

Yes — use Apify Schedules to run daily or weekly and capture new reviews or price changes automatically, with webhook notifications.

#### Are there any extra costs?

No. The per-place and per-review prices are all-in — no bandwidth charges, no add-ons, no hidden costs.

***

### 🩺 Having issues? Help me fix them faster

If you experience any problems, please share your run data with me so I can debug and improve the actor:

1. Go to [Apify Security Settings](https://console.apify.com/settings/security)
2. Find **"Share run data with developers"**
3. In the **"Manage list of Actors"** section, check this actor (or **All Actors**)
4. Save

This data is used **only for debugging** and helps me resolve issues much faster. Thank you!

### 🗣️ Feedback & support

Found a bug or missing a feature? Open an issue on the **Issues tab** of this actor, or write to **afrcanec@gmail.com**. Feature requests are welcome — the actor is actively maintained. If it saves you time, a review helps other users find it. ⭐

### 🧰 More scrapers by this developer

- [Trustpilot Scraper — Reviews, Companies & TrustScores](https://apify.com/pro100chok/trustpilot-all-in-one-scraper)
- [Booking.com Scraper — Hotels, Prices, Reviews & Host Data](https://apify.com/pro100chok/booking-all-in-one-scraper)
- [Google Maps Scraper — Emails, Reviews & Photos](https://apify.com/pro100chok/google-maps-scraper)
- [Apartments.com Scraper — Rentals, Prices & Reviews](https://apify.com/pro100chok/apartments-scraper-usage)
- [Amazon Scraper API — Products, Reviews, Sellers](https://apify.com/pro100chok/amazon-scraper)
- [Ultimate YouTube Scraper — Videos, Transcripts & Comments](https://apify.com/pro100chok/youtube-scraper-all-in-one)

***

**Tags:** TripAdvisor Scraper, TripAdvisor API, TripAdvisor API Alternative, Unofficial TripAdvisor API, TripAdvisor Hotels Scraper, TripAdvisor Restaurants Scraper, TripAdvisor Reviews Scraper, TripAdvisor Reviews API, Scrape TripAdvisor, How to Scrape TripAdvisor, Extract TripAdvisor Reviews, Hotel Reviews Scraper, Restaurant Reviews Scraper, Hotel Price Scraper, Hotel Data Extraction, Travel Data Scraper, Hospitality Data, Tourism Scraper, City Listings Scraper, Hotel Ratings Extractor, Hotel Amenities Scraper, Hotel Booking Data, Travel Reviews Mining, Sentiment Analysis Travel, Hotel Competitor Analysis, Restaurant Competitor Analysis, OTA Data Scraping, Hotel Star Rating Scraper, Travelers Choice Awards, Hotel Photo Scraper, Travel Market Research, Hospitality Market Research, Tourism Analytics, Hotel Aggregator, Review Aggregator, Restaurant Discovery, Travel Industry Data, Hotel Pricing API, Customer Review Mining, AI Training Data Travel

# Actor input Schema

## `mode` (type: `string`):

How to discover what to scrape. 'startUrls' takes any TripAdvisor page URL. 'searchTerms' walks every typeahead match for the keyword (city + named POIs). 'locations' walks city listings only — accepts city names or numeric TripAdvisor geo IDs.

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

TripAdvisor URLs to scrape. Supported: /Hotel\_Review-, /Restaurant\_Review-, /Hotels-, /Restaurants-. Used only when mode = 'startUrls'.

## `searchTerms` (type: `array`):

Free-text keywords (e.g. 'Paris', 'Hotels in Rome'). Resolved via TripAdvisor typeahead. Used only when mode = 'searchTerms'.

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

City names or numeric TripAdvisor geo IDs. Names are resolved via TripAdvisor typeahead at runtime (the first geographic match wins). Used only when mode = 'locations'. Examples: Paris, Dubai, New York City, 187791.

## `category` (type: `string`):

What to fetch when expanding a city or keyword. Ignored for direct detail-page start URLs.

## `includeReviews` (type: `boolean`):

If true, fetch reviews for every POI scraped (charged separately as the 'reviews' event at $0.50 / 1,000).

## `maxReviewsPerPoi` (type: `integer`):

Cap on reviews per place. Active only when 'Include reviews' is on. Each review is charged at $0.50 / 1,000.

## `maxPois` (type: `integer`):

Cap on POIs pulled from each city listing in 'searchTerms' / 'locations' modes. Each place record is charged at $3.50 / 1,000.

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

Hard cap on total dataset rows (each row = one place record with reviews embedded). 0 = unlimited.

## `locale` (type: `string`):

Language the results come back in — descriptions, reviews and amenities are returned in the language you pick.

## `maxRetries` (type: `integer`):

How many times to retry a failed request before giving up.

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

How many TripAdvisor pages to fetch in parallel.

## Actor input object example

```json
{
  "mode": "locations",
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html"
    },
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g60827-d425227-Reviews-Geido-Brooklyn_New_York.html"
    }
  ],
  "searchTerms": [
    "Paris",
    "Dubai"
  ],
  "locations": [
    "Paris",
    "Dubai"
  ],
  "category": "all",
  "includeReviews": true,
  "maxReviewsPerPoi": 10,
  "maxPois": 50,
  "maxItems": 10,
  "locale": "en-US",
  "maxRetries": 5,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

All scraped places — hotels and restaurants side by side.

## `hotels` (type: `string`):

Hotel records only.

## `restaurants` (type: `string`):

Restaurant records only.

# 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 = {
    "mode": "locations",
    "startUrls": [
        {
            "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html"
        },
        {
            "url": "https://www.tripadvisor.com/Restaurant_Review-g60827-d425227-Reviews-Geido-Brooklyn_New_York.html"
        }
    ],
    "searchTerms": [
        "Paris",
        "Dubai"
    ],
    "locations": [
        "Paris",
        "Dubai"
    ],
    "category": "all",
    "includeReviews": true,
    "maxReviewsPerPoi": 10,
    "maxPois": 50,
    "maxItems": 10,
    "locale": "en-US",
    "maxRetries": 5,
    "maxConcurrency": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("pro100chok/tripadvisor-all-in-one").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 = {
    "mode": "locations",
    "startUrls": [
        { "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html" },
        { "url": "https://www.tripadvisor.com/Restaurant_Review-g60827-d425227-Reviews-Geido-Brooklyn_New_York.html" },
    ],
    "searchTerms": [
        "Paris",
        "Dubai",
    ],
    "locations": [
        "Paris",
        "Dubai",
    ],
    "category": "all",
    "includeReviews": True,
    "maxReviewsPerPoi": 10,
    "maxPois": 50,
    "maxItems": 10,
    "locale": "en-US",
    "maxRetries": 5,
    "maxConcurrency": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("pro100chok/tripadvisor-all-in-one").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "locations",
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d229968-Reviews-Hotel_Astra_Opera_Astotel-Paris_Ile_de_France.html"
    },
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g60827-d425227-Reviews-Geido-Brooklyn_New_York.html"
    }
  ],
  "searchTerms": [
    "Paris",
    "Dubai"
  ],
  "locations": [
    "Paris",
    "Dubai"
  ],
  "category": "all",
  "includeReviews": true,
  "maxReviewsPerPoi": 10,
  "maxPois": 50,
  "maxItems": 10,
  "locale": "en-US",
  "maxRetries": 5,
  "maxConcurrency": 10
}' |
apify call pro100chok/tripadvisor-all-in-one --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=pro100chok/tripadvisor-all-in-one",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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