TripAdvisor Scraper
Pricing
from $0.80 / 1,000 results
TripAdvisor Scraper
Scrape TripAdvisor hotels, restaurants, and attractions by destination. Get structured names, addresses, coordinates, ratings, photos, phone numbers, and breadcrumb context — ideal for travel research, lead generation, and competitive analysis.
Scrape TripAdvisor hotels, restaurants, and attractions for any destination and get back clean structured data: names, addresses, coordinates, ratings, review counts, contact details, photos, and the full geographic breadcrumb — all in JSON, ready for analysis.
Built for travel analysts, lead-gen teams, content publishers, and developers who need fresh, accurate TripAdvisor data without the hassle of writing and maintaining their own scraper.
What you can do with it
- Hotel & restaurant market research — pull every property in a destination and compare ratings, review volumes, price tiers, and locations.
- Lead generation — extract phone numbers, websites, and structured addresses for outreach lists.
- Competitive intelligence — see where competitors rank, how many reviews they have, and what guests say in numbers.
- Map / location products — geocoded results (lat/lng) drop straight into mapping pipelines.
- Travel content sites — power your own "best hotels in X" pages with fresh data.
- AI / LLM training & retrieval — feed structured place data into RAG pipelines or recommendation systems.
Why use this actor
- No TripAdvisor account required — operates entirely on public data.
- No CAPTCHA solving on your side — point it at a destination URL, it returns data.
- Geographic context built in — every record includes its breadcrumb (region → country → city → neighbourhood), making it easy to roll up data by area.
- Reliable structured output — 25+ fields per place, including a separate
addressobject with street/city/region/country/postal_code. - Three place types in one actor — hotels, restaurants, and attractions all parse into the same record shape.
- Pay only for results — straightforward per-record pricing on the Apify platform.
How it works
- You give the actor one or more destination URLs (the same URLs you would copy from TripAdvisor's hotels / things-to-do / restaurants list pages).
- The actor opens each list page and extracts the full set of places it contains.
- Each place is normalised into a clean record with its address, coordinates, rating, review count, photo, and contact details.
- Optionally, the actor visits each place's detail page to fill in extra fields (amenities, descriptions, room counts, hours).
- Records stream into the run's dataset as they are extracted — you can start using the data while the run is still going.
The actor handles retries and proxy rotation automatically — you do not need to configure anything beyond your input URL.
Input
Minimum input is one destination URL.
{"mode": "hotels_list","geo_urls": ["https://www.tripadvisor.com/Hotels-g294226-Bali-Hotels.html"],"enrich_from_detail": false,"max_results": 100,"proxy": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | yes | hotels_list (recommended), tourism (mixed POI list), or hotel_detail for explicit hotel URLs |
geo_urls | string[] | for list modes | Full TripAdvisor list URLs, e.g. https://www.tripadvisor.com/Hotels-g294226-Bali-Hotels.html |
hotel_urls | string[] | for hotel_detail | Full https://www.tripadvisor.com/Hotel_Review-... URLs |
enrich_from_detail | boolean | no | When true, each list result is enriched with extra fields from its detail page (default false — keeps runs fast) |
max_results | integer | no | Hard cap on records (default 50) |
proxy | object | no | Apify proxy configuration; residential is recommended |
How to find a destination URL:
- Go to TripAdvisor.com.
- Search for the destination (e.g. "Bali").
- Click "Hotels", "Things to Do", or "Restaurants" in the navigation.
- Copy the URL — it will look like
https://www.tripadvisor.com/Hotels-g<geoId>-<Slug>-Hotels.html.
Sample output
One record per place. Real data from a Bali hotels run:
{"name": "Grand Mercure Bali Seminyak","type": "Hotel","position": 1,"location_id": "25240057","geo_id": "469404","url": "https://www.tripadvisor.com/HotelHighlight-g469404-d25240057-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html","image": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/2d/b2/96/20/hotel-s-facade-overlooking.jpg?w=1200&h=-1&s=1","phone": "+62 361 9342900","price_range": "€","address": {"street": "Jalan Arjuna No. 40 Seminyak Kecamatan Kuta","city": "Seminyak","region": null,"country": "Indonesia","postal_code": "80361"},"lat": -8.696946,"lng": 115.16274,"rating": 4.8,"reviews_count": 1726,"best_rating": null,"worst_rating": null,"amenities": [],"amenity_count": 0,"breadcrumb": ["Asia", "Indonesia", "Bali"],"_source_url": "https://www.tripadvisor.com/Hotels-g294226-Bali-Hotels.html"}
Output schema
Every result has the same fields. Unset fields are null.
| Field | Type | Description |
|---|---|---|
name | string | Place name |
type | string | Hotel, Restaurant, TouristAttraction, Resort, LodgingBusiness |
position | integer | Position in the list (1-based) |
location_id | string | TripAdvisor's internal d<id> |
geo_id | string | TripAdvisor's geographic g<id> for the parent location |
url | string | Canonical TripAdvisor URL for the place |
image | string | Primary photo URL |
phone | string | Contact phone |
email | string | Email if listed |
price_range | string | Tier label (e.g. $, $$$, €) |
description | string | Place description (often filled when detail enrichment is on) |
star_rating | number | Hotel star classification (when available) |
category | string / string[] | Service category — restaurants get cuisines here |
address.street | string | Street address |
address.city | string | City |
address.region | string | Region / state |
address.country | string | Country |
address.postal_code | string | Postcode |
lat / lng | numbers | Coordinates |
rating | number | Overall rating (0–5) |
reviews_count | integer | Total reviews |
best_rating / worst_rating | numbers | Scale bounds |
amenities | string[] | Available amenities (richer when detail enrichment is on) |
amenity_count | integer | Length of amenities |
pets_allowed | string / null | Pet policy text |
checkin_time / checkout_time | string | Times when published |
number_of_rooms | integer | For hotels (when available) |
served_cuisines | string[] | For restaurants |
breadcrumb | string[] | Hierarchical location chain, e.g. ["Asia", "Indonesia", "Bali"] |
_source_url | string | The list URL the record was scraped from |
Tips
- The hotels-list mode is the fastest and most reliable. Use it when you want everything in a city.
- Enable
enrich_from_detailonly when you need amenities, descriptions, or room counts — it roughly doubles the runtime per record. - The actor exposes results in JSON, CSV, Excel, and XML directly from the Apify console.
- Pair with the Apify Schedule feature to snapshot a destination weekly and track rating changes over time.