apihq/tripadvisor-reviews-scraper · TripAdvisor
TripAdvisor Reviews Scraper
Export TripAdvisor reviews to JSON from a hotel, restaurant, or attraction URL or location ID. Filter by rating, traveler type, and date; owner replies, photos, and sub-ratings included.
$0.0004/review · failed items $0.0000 — on your existing Apify account, a one-item first run costs under a cent.
What does TripAdvisor Reviews Scraper do?
Scrape TripAdvisor reviews to JSON from hotel, restaurant, or attraction URLs or location IDs. No TripAdvisor account or API key. Get rating, text, trip type, photos, sub-ratings, and owner replies. Filter by rating, traveler type, and date. Empty locations cost $0. $0.40 per 1,000 reviews.
Data and AI workflows that turn place reviews into text: sentiment and reputation analysis, competitor and property monitoring, hospitality research, and building review datasets for LLM pipelines. The failure-free billing matters most when the extraction runs unattended and one bad location must not take down the batch.
No guaranteed review count. maxReviews is a target, not a promise: TripAdvisor sits behind an anti-bot layer, so a very deep walk can be stopped by a challenge or capacity limit — the actor keeps what it delivered, adds one free diagnostic row, and finishes SUCCEEDED. It claims no fixed maximum depth.
Example run
{
"urls": [
"https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York.html",
"not-a-tripadvisor-location"
],
"maxReviews": 3,
"ratings": ["4", "5"],
"travelerTypes": ["Couples", "Family"]
}outcome
- Up to 3 success: true review rows matching the filters (4-5 stars, couples or families) — billed
- 1 success: false row, code: VALIDATION_FAILED, for the unrecognizable value — not billed
- Run status: SUCCEEDED
- Charged: up to 3 reviews = $0.0012
Good input returns billed rows. Bad input returns free error rows in the same dataset, and the run still succeeds.
Why pipelines pick it
Filter before you pay
Narrow each location by star ratings, traveler type (Business, Couples, Family, Friends, Solo), and a published-date window — only matching reviews are delivered and billed.
Owner and management replies included
Each review carries the property's public reply (owner_response) with its text, date, responder name, and role.
Photos, sub-ratings, and trip context
Rows carry reviewer photos, feature sub-ratings (Rooms, Service, Value), the trip type, stay date, and the reviewer's hometown and contribution count.
You pay only for reviews
Billing fires on an explicit per-review event, not on dataset writes. There is no per-run start fee, so a location that returns nothing costs $0.
Best for: Data and AI workflows that turn place reviews into text: sentiment and reputation analysis, competitor and property monitoring, hospitality research, and building review datasets for LLM pipelines. The failure-free billing matters most when the extraction runs unattended and one bad location must not take down the batch.
Input & output
{
"urls": [
"https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-x.html",
"93589"
],
"maxReviews": 500,
"language": "en",
"ratings": ["4", "5"],
"travelerTypes": ["Couples", "Family"],
"dateFrom": "2026-01-01",
"dateTo": "2026-12-31"
}{
"success": true,
"review_id": "1068526713",
"location_id": "93589",
"rating": 5,
"title": "Great suite & staff",
"text": "We stayed in a Grand Suite for our wedding trip.",
"published_date": "2026-07-15",
"created_date": "2026-07-15",
"trip_type": "COUPLES",
"stay_date": "2026-07-31",
"language": "en",
"helpful_votes": 1,
"url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d93589-r1068526713-x.html",
"user_name": "koala",
"user_id": "C9A937BB",
"user_hometown": "United Kingdom",
"user_contributions": 6,
"owner_response": {
"text": "What a special occasion!",
"published_date": "2026-07-16",
"responder": "Hotel Manager",
"connection": "Guest Services / Front Office"
},
"additional_ratings": [
{ "feature": "Value", "rating": 5 },
{ "feature": "Rooms", "rating": 4 }
],
"photos": ["https://cdn.tripadvisor.com/photo-o/33/caption.jpg"],
"place_name": "The Michelangelo New York",
"place_url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-x.html"
}{
"success": false,
"location_input": "not-a-tripadvisor-location",
"code": "VALIDATION_FAILED",
"error": "not a valid TripAdvisor URL or location id: not-a-tripadvisor-location",
"request_id": "req_911f37d2e55644ff9d9e4a3f",
"status_code": 400
}Branch on the success field to split hits from misses. Quote the request_id in any support issue and we can trace the exact request.
output fields
| field | type | what it is |
|---|---|---|
| success | boolean | true for a review (billed). false for an unbilled diagnostic row: one bad, empty, or filter-unmatched location, or a row marking that the walk stopped early. |
| review_id | string | TripAdvisor's unique review ID. |
| location_id | string | The numeric location ID the review belongs to. Copied onto every row so each row stands alone. |
| rating | integer | Bubble rating, 1 to 5. |
| title | string or null | The review title. |
| text | string | The review body. |
| published_date | string or null | Publish date, YYYY-MM-DD. |
| created_date | string or null | Creation date, YYYY-MM-DD. |
| trip_type | string or null | Trip type: couples, family, business, solo, or friends. |
| stay_date | string or null | Visit or stay date, YYYY-MM-DD. |
| language | string or null | The review's language code. |
| helpful_votes | integer | Helpful-vote count. |
| url | string or null | Permalink to the review on tripadvisor.com. |
| user_name | string or null | Reviewer display name. |
| user_id | string or null | Reviewer ID. |
| user_hometown | string or null | Reviewer's stated hometown. |
| user_contributions | integer or null | Number of contributions the reviewer has made. |
| owner_response | object or null | The owner/management reply: text, published_date, responder, connection. |
| additional_ratings | array | Feature sub-ratings, e.g. Rooms, Service, Value with a 1-5 rating each. |
| photos | array | Reviewer photo URLs. |
| place_name | string or null | The location's name. |
| place_url | string or null | The location's TripAdvisor page URL. |
Error codes, stable across releases
Every failure record carries one of these machine-readable codes. None of them are ever charged.
| code | billed | meaning |
|---|---|---|
| NO_REVIEWS | $0.0000 | The location has no reviews, or the location does not exist. |
| NO_MATCHING_REVIEWS | $0.0000 | The location has reviews, but none match the filters you set. |
| VALIDATION_FAILED | $0.0000 | The input was not a valid TripAdvisor URL or numeric location ID. |
| INVALID_FILTER | $0.0000 | A supplied filter had no valid value (e.g. ratings: [6]). The run stops before any request so you are never charged for reviews outside the filter you intended. |
| PAGINATION_STALLED | $0.0000 | One location stopped early after repeated pages returned nothing new. The batch continues. |
| TRIPADVISOR_CHALLENGED | $0.0000 | TripAdvisor's anti-bot layer challenged the request. Early stop: delivered reviews are kept and the run still succeeds. |
| TRIPADVISOR_UPSTREAM | $0.0000 | TripAdvisor was unavailable. Early stop; delivered reviews are kept. |
| NO_FRESH_IP | $0.0000 | The extraction service had no fresh session capacity. Early stop; delivered reviews are kept. |
| POOL_STOPPED | $0.0000 | The extraction service's session pool stopped. Early stop; delivered reviews are kept. |
| MINT_BLOCKED | $0.0000 | The extraction service could not establish a new session. Early stop; delivered reviews are kept. |
| MINT_QUEUE_FULL | $0.0000 | The extraction service's session queue was full. Early stop; delivered reviews are kept. |
| DEADLINE_EXCEEDED | $0.0000 | The per-request deadline was hit. Returned as an unbilled row with status_code 504. |
| ACTOR_DEADLINE_NEAR | $0.0000 | The run approached its time limit and stopped cleanly after the reviews already delivered. |
| NO_INPUT | $0.0000 | No usable location URL or ID was provided. |
What a run costs
The charge fires only when a result is delivered, and platform compute is included in the per-result price. To cap the spend of a run, set a limit in Apify's Run Limits panel. The actor stops at the cap and reports how far it got.
What this actor doesn't do
- No guaranteed review count. maxReviews is a target, not a promise: TripAdvisor sits behind an anti-bot layer, so a very deep walk can be stopped by a challenge or capacity limit — the actor keeps what it delivered, adds one free diagnostic row, and finishes SUCCEEDED. It claims no fixed maximum depth.
- Reviews are per language. language filters to one language at a time (default en) and sets the machine-translation target; run the location again per language for wider coverage.
- Owner replies appear only when the property replied. Most reviews have no reply; owner_response is simply null on those rows.
- It reads public reviews only — what a signed-out visitor sees on the TripAdvisor listing.
Frequently asked questions
- Do I need a TripAdvisor account or API key?
- No. The Actor reads public TripAdvisor reviews directly from a location URL or ID.
- How do I point it at a location?
- Use a TripAdvisor detail URL (hotel, restaurant, or attraction) or the bare numeric location ID. Both resolve to the same location; up to 50 unique locations run per job. An unrecognizable value comes back as success:false with code VALIDATION_FAILED, not a rejected run.
- Can I filter TripAdvisor reviews by rating, traveler type, or date?
- Yes. Combine star ratings (any of 1-5), travelerTypes (Business, Couples, Family, Friends, Solo), and an inclusive published-date range (dateFrom / dateTo). Only matching review rows are delivered and billed. Every filter is optional.
- What if the Actor stops before maxReviews?
- You keep everything delivered so far. If TripAdvisor challenges the request or the run reaches a capacity limit, delivered reviews stay in the dataset and are billed, one free success:false diagnostic row records why it stopped, and the run still finishes SUCCEEDED.
- Can I get reviews in other languages?
- Yes. Set language (fr, de, pt-BR). It filters reviews to that language and sets the machine-translation target. One run covers one language.
- How does billing know a location returned nothing?
- Billing fires on an explicit per-review charge event, not on dataset writes. The Actor only fires it when a review is delivered, so success:false records sit in your dataset for free.
Pairs with
Google Play Reviews Scraper
Export a Google Play app's reviews to JSON from a package name or store URL. One record per review with rating, text, author, developer reply, and date.
App Store Reviews Scraper
Export Apple App Store reviews and developer replies to JSON from an app ID or apps.apple.com URL. One record per review with rating, title, text, author, developer reply, and date.
Run it on the Apify account you already have
Paste one input into the actor's console and check the dataset it returns. A one-item first run costs under a cent — no new subscription, pay only for delivered results.
Get a location's reviews