Tripadvisor Hotels Scraper
Shahid Irfan · @shahidirfan
Extract hotel data from TripAdvisor instantly. Scrape reviews, ratings, prices, amenities & location details at scale. Perfect for travel startups.
About
What does TripAdvisor Hotels Scraper do?
TripAdvisor Hotels Scraper collects structured hotel listings from public TripAdvisor destination pages. Paste one or more TripAdvisor Hotels URLs, choose how many hotels you need, and get a dataset with names, ratings, review totals, destination rankings, prices and offers, addresses, coordinates, amenities, descriptions, and photos.
Use it for destination market research, competitor price checks, hotel lead lists, travel content planning, or enriching an existing property database with TripAdvisor fields. Records are deduplicated across pages, so a sponsored hotel that appears twice is saved once.
Why use TripAdvisor Hotels Scraper?
- Collect beyond the first screen - Walk through result pages until your limit is reached instead of copying the first 30 hotels by hand.
- One record per hotel - Sponsored placements repeat between pages. The Actor keeps the first occurrence and drops later duplicates.
- Compare prices across providers - Each hotel carries the lowest displayed price, the offer count, and per-provider offer details with currency and payment timing.
- Location data ready for maps - Address parts, latitude, and longitude are saved separately, so the dataset loads into GIS or spreadsheet map tools without parsing.
- Clean output - Empty strings, nulls, and empty arrays are omitted rather than saved as placeholders.
- Runs on a schedule - Track a destination weekly or monthly and compare snapshots over time.
What data can you extract from TripAdvisor?
Each dataset item is one hotel. Optional fields appear only when TripAdvisor publishes a value for that property.
Identity, reviews, and ranking
| Field | Type | Description |
|---|---|---|
hotel_name | String | Hotel or property name |
location_id | Integer | TripAdvisor hotel location identifier |
hotel_url | String | TripAdvisor hotel page URL |
hotel_result_key | String | Listing result key from the destination page |
rating | Number | Average guest rating, 0 to 5 |
reviews_count | Integer | Published review total |
review_snippet | Object | One published review excerpt with title, rating, date, reviewer, and URL |
ranking_type_text | String | Localized ranking, for example #8 of 1,249 B&Bs / Inns in Istanbul |
ranking_position | Integer | Numeric rank from the destination payload |
ranking_out_of | Integer | Property total used by that rank |
is_sponsored | Boolean | Whether the listing was a paid placement |
position | Integer | Position of the hotel in the result sequence |
source_url | String | Destination page the hotel was found on |
geo_id | Integer | TripAdvisor destination identifier |
Address and location
| Field | Type | Description |
|---|---|---|
full_address | String | Complete formatted address |
street_1 | String | Primary street address |
street_2 | String | Secondary street address |
city | String | City |
state | String | State or region |
postal_code | String | Postal code |
country | String | Country |
latitude | Number | Latitude |
longitude | Number | Longitude |
parent_geo_name | String | Parent destination name |
neighborhoods | Array | Neighborhoods or areas containing the hotel |
country_id | Integer | TripAdvisor country identifier |
iso_country_code | String | Two-letter country code |
Prices and offers
| Field | Type | Description |
|---|---|---|
lowest_price | String | Lowest displayed price, for example $154 |
offer_count | Integer | Offers found for the hotel |
available_offer_count | Integer | Offers currently available |
primary_offers | Array | Main offers with provider, price, currency, base price, payment timing, and rate flags |
secondary_offers | Array | Additional offers |
price_range | Object | Published minimum and maximum price |
price_range_usd | Object | Published minimum and maximum price in US dollars |
Property details and media
| Field | Type | Description |
|---|---|---|
accommodation_type | String | Property type, for example Small Hotel |
accommodation_category | String | TripAdvisor accommodation category |
star_rating_tag_ids | Array | Star classification tag identifiers |
amenities | Array | Highlighted amenity names |
amenity_details | Array | Amenity names with tag identifiers and icons |
hotel_description | String | Property description or published summary |
phone | String | Telephone number |
email | String | Email address when published |
best_award_type | String | Active award type |
best_award_year | Integer | Active award year |
thumbnail_url | String | Hotel photo URL at 1400 by 933 pixels |
thumbnail_width | Integer | Maximum source image width |
thumbnail_height | Integer | Maximum source image height |
thumbnail_caption | String | Photo caption |
thumbnail_lang | String | Photo language code |
merchandising_labels | Array | Listing labels such as Sponsored |
special_offer | Object | Published special offer |
is_smb_or_kasm | Boolean | Property account classification flag |
How to use TripAdvisor Hotels Scraper
- Open the Actor in Apify Console.
- Paste a TripAdvisor Hotels destination URL, for example
https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html. - Set how many hotels you want and the page cap.
- Choose a sort order, or leave the default.
- Run the Actor and open the dataset when it finishes.
- Download the dataset or connect it to Sheets, a webhook, or your own API.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | Array | No | Istanbul Hotels page | TripAdvisor Hotels destination URLs, up to 100 per run |
destination | String | No | - | TripAdvisor geo ID, for example 298184. Replaces startUrls and scrapes that single destination |
sorting | String | No | BEST_VALUE | BEST_VALUE, POPULARITY, PRICE_LOW_TO_HIGH, or DISTANCE |
results_wanted | Integer | No | 20 | Maximum hotels saved across all destinations |
max_pages | Integer | No | 5 | Page cap per destination. Each page holds up to 30 hotels |
proxyConfiguration | Object | No | Apify Proxy | Proxy settings. Residential proxies reduce challenge frequency |
How the two search inputs interact
startUrls and destination are alternative ways to choose what to scrape. When destination is filled in, the Actor scrapes that one destination and ignores the URL list. When destination is empty, every usable URL in startUrls is scraped in order.
A hotel page URL such as /Hotel_Review-g293974-d12345-... is converted to the destination list for the same city, because the listing data lives on the destination page.
Usage Examples
Collect the first hotels of a destination
{
"startUrls": [
"https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html"
],
"results_wanted": 20,
"max_pages": 2
}
Collect several destinations in one run
{
"startUrls": [
"https://www.tripadvisor.com/Hotels-g187147-Paris-Ile_de_France-Hotels.html",
"https://www.tripadvisor.com/Hotels-g298184-Tokyo-Tokyo_Prefecture_Kanto-Hotels.html"
],
"results_wanted": 150,
"max_pages": 4
}
Cheapest hotels first, using a geo ID only
{
"destination": "298184",
"sorting": "PRICE_LOW_TO_HIGH",
"results_wanted": 60,
"max_pages": 3
}
Larger run with residential proxies
{
"startUrls": [
"https://www.tripadvisor.com/Hotels-g60763-New_York_City_New_York-Hotels.html"
],
"results_wanted": 300,
"max_pages": 10,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}
Sample Output
{
"item_type": "hotel",
"source_url": "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html",
"geo_id": 293974,
"position": 1,
"hotel_result_key": "21034531:s:MzQ3MjkwMDA:4428aabb-2c5b-41f2-ab8a-1edc894eade0",
"location_id": 21034531,
"hotel_name": "World House Boutique Hotel Galata",
"hotel_url": "https://www.tripadvisor.com/Hotel_Review-g293974-d21034531-Reviews-World_House_Boutique_Hotel_Galata-Istanbul.html",
"is_sponsored": true,
"rating": 4.5,
"reviews_count": 368,
"review_snippet": {
"text": "They were incredibly kind, attentive, and made my birthday so special with a complimentary bottle of wine and a beautiful room upgrade.",
"title": "SOLO BIRTHDAY TRIP",
"rating": 5,
"created_date": "2026-09-14",
"reviewer_name": "Jacquetta Y",
"review_url": "https://www.tripadvisor.com/ShowUserReviews-g293974-d21034531-r1077681360-World_House_Boutique_Hotel_Galata-Istanbul.html"
},
"ranking_type_text": "#8 of 1,249 B&Bs / Inns in Istanbul",
"ranking_position": 172,
"ranking_out_of": 5167,
"accommodation_type": "Small Hotel",
"accommodation_category": "BB",
"star_rating_tag_ids": [
9568
],
"full_address": "Galip Dede Cd. No:85/A Şahkulu Mah., Istanbul 34421 Türkiye",
"street_1": "Galip Dede Cd. No:85/A",
"street_2": "Şahkulu Mah.",
"city": "Istanbul",
"postal_code": "34421",
"country": "Türkiye",
"latitude": 41.02651,
"longitude": 28.97464,
"parent_geo_name": "Istanbul",
"neighborhoods": [
"Beyoglu"
],
"country_id": 293969,
"iso_country_code": "TR",
"lowest_price": "$154",
"offer_count": 9,
"available_offer_count": 9,
"primary_offers": [
{
"availability": "AVAILABLE",
"display_price": "$154",
"base_price": 153.75,
"currency": "USD",
"provider": "Agoda.com",
"pricing_mode": "BASE_PLUS_FEES",
"payment_timing": "TIME_OF_BOOKING",
"rooms_remaining": 1,
"member_rate": false,
"mobile_rate": false,
"supplier_direct": false
}
],
"price_range": {
"minimum": 143,
"maximum": 413
},
"amenities": [
"Air conditioning",
"Airport transportation",
"Family Friendly",
"Free Wifi"
],
"hotel_description": "Boutique hotel near Istanbul's Galata Tower and historic sites. Features stylish design, stunning views, and excellent service. Close to shops, restaurants, and public transport for easy city exploration.",
"phone": "+90 212 593 55 20",
"best_award_type": "COE",
"best_award_year": 2026,
"thumbnail_url": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/2e/29/c7/55/caption.jpg?w=1400&h=933&s=1",
"thumbnail_width": 5622,
"thumbnail_height": 3752,
"thumbnail_lang": "en",
"merchandising_labels": [
"Sponsored"
]
}
Tips for Best Results
- Use a destination page URL. City, region, and country listing pages work; a single hotel page is converted to its city list.
- Each page adds about 30 hotels. To get 100 hotels, set
max_pagesto 4 or more. - Sponsored hotels repeat between pages, so deduplication removes some records.
results_wantedis a hard cap. The Actor stops as soon as it reaches the number.- Keep the default proxy setting. TripAdvisor challenges repeated requests from a single address, and the Actor switches to a new proxy session when that happens.
- For large runs or frequent schedules, use residential proxies.
- Prices follow the stay dates TripAdvisor selects for the destination page. The Actor does not send custom check-in or check-out dates, so a price is a reference point rather than a quote for your travel dates.
- TripAdvisor sometimes serves a page whose partner offers did not load. The Actor requests that page once more, up to three times per destination, to recover prices.
PRICE_LOW_TO_HIGHorders hotels by TripAdvisor's price index. That view usually returns no live partner offers, solowest_priceandprimary_offersare often empty whileprice_rangeis still filled. UseBEST_VALUEorDISTANCEwhen you need live prices.- If a field is missing for one hotel, check another record before assuming a failure. Hotels publish different amounts of data.
Integrations
- Google Sheets - Import the dataset for quick comparison and sharing.
- Webhooks - Trigger your own pipeline when a run finishes.
- Make or Zapier - Send new hotel records to a CRM, database, or notification flow.
- Apify API - Read datasets programmatically from your application.
- CSV, Excel, JSON, XML - Download the dataset in any format Apify supports.
Frequently Asked Questions
How many hotels can I collect per destination?
Each result page holds about 30 hotels, plus sponsored listings that repeat on later pages. The Actor follows further pages while max_pages allows, and stops at results_wanted. A destination with 1,200 hotels needs max_pages of 40 or more.
Can I set check-in and check-out dates?
No. TripAdvisor's destination pages ignore date parameters from the URL and always report prices for the stay window it picks. The Actor reports those prices as published instead of showing a price for dates you did not request.
Why is lowest_price missing for some hotels?
TripAdvisor shows a price only when a partner returns an available offer. Two things can happen: one hotel has no live offer, or a whole page loads without partner offers. For the second case the Actor requests the page again, up to three times per destination. If offers still do not appear, records keep offer_count, price_range, and price_range_usd without lowest_price.
Can I scrape several cities in one run?
Yes. Add up to 100 destination URLs to startUrls. The Actor processes them in order and applies results_wanted across the whole run.
Does it collect full reviews?
No. Each hotel includes one published review snippet with its title, rating, date, reviewer, and URL. Full review pages are a separate dataset.
What happens when TripAdvisor shows a challenge page?
The Actor opens a new proxy session and retries. If all retries fail for a page, it logs a warning and moves to the next destination instead of writing incomplete records.
Can I export the data to CSV or Excel?
Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and HTML from the Console or through the API.
Can I run this Actor on a schedule?
Yes. Set a schedule in Apify Console to refresh a destination daily, weekly, or monthly, then compare snapshots over time.
Is it legal to collect TripAdvisor hotel data?
Collecting publicly available data can be legal, but you are responsible for following applicable laws, TripAdvisor's terms, and privacy rules. Use the data for research and analysis, not to republish reviews as your own content.
Support
Report a problem or request a field through the Issues tab on the Actor page. Include the destination URL and the run ID so the failure can be reproduced.
Legal Notice
This Actor collects publicly available hotel listing data. It is not affiliated with TripAdvisor. Users are responsible for how the collected data is used and for complying with applicable laws and website terms.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Fields
startUrlsTripAdvisor Hotels destination URLs, for example https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html. Up to 100 URLs per run.
destinationOptional TripAdvisor destination geo ID, for example 293974. When set, this destination replaces the URLs above and the run scrapes one destination.
sortingOrder applied to each destination result list. The price view usually returns no live partner offers, so price fields can be empty for that sort.
results_wantedMaximum number of hotel records to save across all destinations.
max_pagesPagination cap per destination. Each page holds up to 30 hotels.
proxyConfigurationTripAdvisor serves a challenge to repeated requests from one address. Apify Proxy is enabled by default; residential proxies reduce challenge frequency further.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is shahidirfan/tripadvisor-hotels-scraper (or shahidirfan~tripadvisor-hotels-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"helloWorld": 123
};
const run = await client.actor('shahidirfan/tripadvisor-hotels-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"helloWorld": 123
}
run = client.actor("shahidirfan/tripadvisor-hotels-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/shahidirfan~tripadvisor-hotels-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"helloWorld":123}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

G2 Product Reviews Scraper ⭐
Shahid Irfan · @shahidirfan
Scrape G2 reviews, software ratings, SaaS product reviews, customer feedback, pros, cons, reviewer insights, and product details. Extract structured G2 reviews.
Lead generationDeveloper toolsAutomation$29/mo1-day free trial
Indeed Job Scraper
Shahid Irfan · @shahidirfan
Extract job listings from Indeed with job titles, company names, salaries, locations, descriptions, employment types, posting dates, and application URLs.
JobsAutomation$29/mo1-day free trial
Pinterest Search Scraper
Shahid Irfan · @shahidirfan
Scrape Pinterest search results with images, pins, titles, descriptions, boards, creators, URLs, engagement data, and more. Extract keyword-based content.
SEO toolsSocial mediaOther$19/mo1-day free trial
YouTube Comments Scraper API
Shahid Irfan · @shahidirfan
Scrape YouTube comments at scale. Get comment text, replies, author details, timestamps & engagement metrics from any video. Perfect for sentiment analysis.
AISocial mediaVideos$29/mo1-day free trial