TripAdvisor Scraper – Hotels, Restaurants & Reviews
Pricing
from $3.00 / 1,000 listing scrapeds
TripAdvisor Scraper – Hotels, Restaurants & Reviews
Extract hotels, restaurants, and attractions from TripAdvisor — including ratings, contact info, amenities, and reviews — from search queries or direct URLs.
Pricing
from $3.00 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Actor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
🗺️ TripAdvisor Scraper – Hotels, Restaurants & Reviews
What does this TripAdvisor Scraper do?
This actor extracts structured data from TripAdvisor — hotels, restaurants, attractions, and vacation rentals — including full listing details and user reviews, all in a single run. No need to chain two separate actors. Pass a search query like "hotels in Miami" or paste direct TripAdvisor URLs and get back clean, structured JSON ready for your pipeline, CRM, or AI agent.
Why use this TripAdvisor Scraper?
- All-in-one — listings + reviews in a single actor run (competitors require two)
- 40% cheaper than the market leader's free tier at $0.003/listing and $0.001/review
- B2B-ready output — includes phone, website, price range, ranking, coordinates, and amenities
- MCP-optimized — semantic field names and consistent output shape make it work seamlessly with Claude and other AI agents
- No login required — scrapes publicly available data without credentials
What data does this TripAdvisor Scraper extract?
Listing data (record_type: "listing")
| Field | Type | Description |
|---|---|---|
| name | string | Hotel / restaurant / attraction name |
| category | string | Hotel, Restaurant, Attraction, Vacation Rental |
| address | string | Full street address |
| city | string | City |
| country | string | Country |
| phone | string | Contact phone number |
| website | string | External website URL (decoded from TA redirect) |
| rating | number | TripAdvisor rating (1.0–5.0) |
| review_count | integer | Total number of reviews |
| price_range | string | $, $$, $$$, or $$$$ |
| price_level | integer | 1–4 numeric price level |
| ranking | string | Full ranking text, e.g. "#3 of 233 Hotels in Miami Beach" |
| ranking_position | integer | Numeric ranking within location |
| ranking_total | integer | Total properties in category + location |
| description | string | Property description |
| amenities | array | List of amenities (Pool, WiFi, Spa, etc.) |
| cuisines | array | Cuisine types (restaurants only) |
| awards | array | TripAdvisor awards (Travelers' Choice, etc.) |
| latitude | number | GPS latitude |
| longitude | number | GPS longitude |
| photos_count | integer | Number of photos on the listing |
| tripadvisor_id | string | TripAdvisor location ID |
| tripadvisor_url | string | Direct link to the TripAdvisor listing |
| scraped_at | string | ISO 8601 timestamp |
| source_url | string | Page URL scraped |
Review data (record_type: "review")
| Field | Type | Description |
|---|---|---|
| listing_name | string | Name of the reviewed property |
| listing_url | string | TripAdvisor URL of the property |
| rating | integer | Star rating (1–5) |
| title | string | Review headline |
| text | string | Full review body (including expanded "read more") |
| date_of_stay | string | When reviewer visited, e.g. "March 2024" |
| travel_type | string | Couples, Families, Solo, Business, Friends |
| reviewer_name | string | TripAdvisor username |
| reviewer_location | string | Reviewer's home location |
| helpful_votes | integer | How many found this review helpful |
| owner_response | string | Management's response to the review |
| scraped_at | string | ISO 8601 timestamp |
| source_url | string | Page URL scraped |
How to use this TripAdvisor Scraper
Option 1: Search by query
{"searchQueries": ["hotels in Miami Beach", "restaurants in Paris 1st arrondissement"],"scrapeMode": "listings_and_reviews","maxResults": 20,"maxReviewsPerListing": 15}
Option 2: Scrape specific URLs
{"startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g294471-d234567-Reviews-The_Setai-Miami_Beach.html" },{ "url": "https://www.tripadvisor.com/Restaurant_Review-g60763-d1234567-Reviews-Eleven_Madison_Park-New_York_City.html" }],"scrapeMode": "listings_and_reviews","maxReviewsPerListing": 50}
Option 3: Reviews only
{"startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g294471-d234567-Reviews-MyHotel.html" }],"scrapeMode": "reviews_only","maxReviewsPerListing": 200}
Via API (Node.js)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('khadinakbar/tripadvisor-scraper').call({ // replace with your username after first pushsearchQueries: ['hotels in Barcelona'],scrapeMode: 'listings_and_reviews',maxResults: 10,maxReviewsPerListing: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const listings = items.filter(i => i.record_type === 'listing');const reviews = items.filter(i => i.record_type === 'review');console.log(`${listings.length} listings, ${reviews.length} reviews`);
Via API (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("khadinakbar/tripadvisor-scraper").call(run_input={ # replace with your username after first push"searchQueries": ["restaurants in Rome"],"scrapeMode": "listings_and_reviews","maxResults": 15,"maxReviewsPerListing": 10,})items = client.dataset(run["defaultDatasetId"]).list_items().itemslistings = [i for i in items if i["record_type"] == "listing"]reviews = [i for i in items if i["record_type"] == "review"]
Pricing
This actor uses pay-per-event pricing with two event types:
| Event | Price | Description |
|---|---|---|
| Listing scraped | $0.003 | Each hotel / restaurant / attraction page scraped |
| Review scraped | $0.001 | Each individual user review extracted |
Cost examples
| Task | Listings | Reviews | Total cost |
|---|---|---|---|
| Quick test | 5 | 50 | ~$0.065 |
| City hotel survey | 30 | 0 | ~$0.09 |
| Competitive review audit | 10 | 200 | ~$0.23 |
| Monthly monitoring | 100 | 1,000 | ~$1.30 |
Compared to the market leader (up to $0.005/listing + $0.005/review), this actor saves you 40–80% on the same data.
Input configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
| searchQueries | string[] | — | Search terms, e.g. "hotels in Tokyo" |
| startUrls | URL[] | — | Direct TripAdvisor listing URLs |
| scrapeMode | string | listings_and_reviews | listings_only, reviews_only, or listings_and_reviews |
| maxResults | integer | 10 | Max listing pages to scrape |
| maxReviewsPerListing | integer | 20 | Reviews per listing (0 = skip reviews) |
| proxyConfiguration | object | Apify residential | Proxy settings — residential recommended for TripAdvisor |
Proxy requirements
TripAdvisor uses anti-bot measures. Residential proxies are strongly recommended and are pre-configured by default. Using datacenter proxies may result in CAPTCHAs or blocks. The Apify residential proxy pool is included in your plan.
FAQ
Can I scrape all TripAdvisor categories?
Yes — hotels, restaurants, attractions, and vacation rentals are all supported. The actor auto-detects the listing type from the URL.
Why do some fields come back as null?
TripAdvisor doesn't display every field for every listing type. Restaurants don't have hotel amenities; not all hotels list a website. Missing values are always null, never empty strings, so your code can filter cleanly.
How many results can I scrape per run?
The actor supports up to 1,000 listings and up to 500 reviews per listing. For very large runs, schedule multiple runs with different search queries.
Will it break if TripAdvisor updates their design?
The actor uses multiple CSS selector fallbacks per field plus __NEXT_DATA__ JSON extraction, making it more resilient than single-selector scrapers. If TripAdvisor makes breaking changes, the actor will be updated promptly.
Is this actor MCP-compatible?
Yes. The output uses semantic field names and a consistent structure across all records, making it ideal for use with Claude via the Apify MCP server.
Can I run it on a schedule?
Yes — use Apify Schedules to monitor competitor pricing, track review sentiment over time, or maintain a fresh hotel database.
Use cases
Hospitality competitive intelligence — Track competitor ratings, review counts, and amenities across your market. Identify weaknesses in competitor listings to target in your marketing.
Market research — Benchmark accommodation prices and quality in new markets before expansion decisions.
Reputation management — Monitor your property's reviews in real time. Feed reviews into a sentiment analysis pipeline for early issue detection.
Travel content creation — Populate travel guides, blog posts, or recommendation engines with structured property data.
Lead generation — Extract business contact information (phone, website) for hospitality-sector B2B outreach.
AI agent pipelines — Use with Claude via Apify MCP to answer questions like "find me the top 10 hotels in Lisbon under $$$ with a pool."
Works great with
- khadinakbar/shopify-all-in-one-scraper — Scrape hotel gift shops or destination retail alongside your property research.
- khadinakbar/google-trends-scraper — Combine with travel search trend data for demand forecasting.
This actor extracts publicly available data from TripAdvisor. Users are responsible for compliance with applicable laws, TripAdvisor's Terms of Service, and relevant data protection regulations (GDPR, CCPA). Use responsibly and only for lawful purposes.
Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools.