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.

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.

Use something else when

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.

Price
$0.40 per 1,000 reviews · failed items $0

Example run

input
{
  "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

input example
{
  "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"
}
output — success (billed)
{
  "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"
}
output — failure (free, same dataset)
{
  "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

fieldtypewhat it is
successbooleantrue 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_idstringTripAdvisor's unique review ID.
location_idstringThe numeric location ID the review belongs to. Copied onto every row so each row stands alone.
ratingintegerBubble rating, 1 to 5.
titlestring or nullThe review title.
textstringThe review body.
published_datestring or nullPublish date, YYYY-MM-DD.
created_datestring or nullCreation date, YYYY-MM-DD.
trip_typestring or nullTrip type: couples, family, business, solo, or friends.
stay_datestring or nullVisit or stay date, YYYY-MM-DD.
languagestring or nullThe review's language code.
helpful_votesintegerHelpful-vote count.
urlstring or nullPermalink to the review on tripadvisor.com.
user_namestring or nullReviewer display name.
user_idstring or nullReviewer ID.
user_hometownstring or nullReviewer's stated hometown.
user_contributionsinteger or nullNumber of contributions the reviewer has made.
owner_responseobject or nullThe owner/management reply: text, published_date, responder, connection.
additional_ratingsarrayFeature sub-ratings, e.g. Rooms, Service, Value with a 1-5 rating each.
photosarrayReviewer photo URLs.
place_namestring or nullThe location's name.
place_urlstring or nullThe 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.

codebilledmeaning
NO_REVIEWS$0.0000The location has no reviews, or the location does not exist.
NO_MATCHING_REVIEWS$0.0000The location has reviews, but none match the filters you set.
VALIDATION_FAILED$0.0000The input was not a valid TripAdvisor URL or numeric location ID.
INVALID_FILTER$0.0000A 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.0000One location stopped early after repeated pages returned nothing new. The batch continues.
TRIPADVISOR_CHALLENGED$0.0000TripAdvisor's anti-bot layer challenged the request. Early stop: delivered reviews are kept and the run still succeeds.
TRIPADVISOR_UPSTREAM$0.0000TripAdvisor was unavailable. Early stop; delivered reviews are kept.
NO_FRESH_IP$0.0000The extraction service had no fresh session capacity. Early stop; delivered reviews are kept.
POOL_STOPPED$0.0000The extraction service's session pool stopped. Early stop; delivered reviews are kept.
MINT_BLOCKED$0.0000The extraction service could not establish a new session. Early stop; delivered reviews are kept.
MINT_QUEUE_FULL$0.0000The extraction service's session queue was full. Early stop; delivered reviews are kept.
DEADLINE_EXCEEDED$0.0000The per-request deadline was hit. Returned as an unbilled row with status_code 504.
ACTOR_DEADLINE_NEAR$0.0000The run approached its time limit and stopped cleanly after the reviews already delivered.
NO_INPUT$0.0000No usable location URL or ID was provided.

Every error code across the eight APIs, in one reference →


What a run costs

per review$0.0004
per 1,000 reviews$0.40
per failed item$0.0000
per-run start fee$0.0000

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.

How pay-per-result billing works →


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

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