2026-10-16 — Keyword Planner and locale documentation
Validated search terminology against Google Ads Keyword Planner and Store shelves. Added localized usage guidance and bounded examples; retained existing English phrases. Clarified locale limitations where measured. No runtime, output fields, defaults, or pricing changed.
1.2 — listing and input form reworded, 2026-10-11
No behaviour, output or price changed; the same inputs return the same rows.
Title and Store description now carry the nouns agents and buyers search for, as phrases: TripAdvisor restaurant reviews, attraction reviews, diner reviews, ratings (food, service, value, atmosphere), the free location row (rating, review count, cuisine, menu, hours) and the filters (negative reviews, new reviews only). "Up to 30 languages" is corrected to what the code reads: 30 country sites in 24 languages. The seoDescription carries the French, Italian, Spanish and German nouns (avis restaurant, recensioni, opiniones, Bewertungen); the README adds the Portuguese one.
The input form is reordered: restaurantNames first, then startUrls, locationIds, locationType, maxReviewsPerLocation, sinceDate, maxRating, tripTypes, languages, the two review switches, the location row, then proxy and pacing. Nothing was renamed, removed or re-defaulted.
Every input now says what to pass, with an example, its default, what 0/empty means and what it costs.maxReviewsPerLocation states that the filters apply after the cap; locationType says what wrong_type means and that hotels are always refused free of charge; maxRating and tripTypes say filtered reviews are never billed.
The review event text restates the price per 1,000, the at-most-$0.50-per-location default, what is never charged (location row, filtered reviews, no-review places, unknown ids, hotel ids, duplicates, failed pages, status rows), that there is no start fee, and that a run stops at maxTotalChargeUsd. It also says the four sub-ratings exist on restaurant reviews only. The price is unchanged.
README: a section mapping common requests to the exact input, with the row types and the status/empty-result contract, and the other-language nouns.
1.2 — 2026-10-02
Fix: TripAdvisor moved the review list of every restaurant and attraction page to another server-rendered result on 2026-10-02 and renamed its date, visit, translation and owner-reply fields, so every run failed with 200-unusable and delivered (and charged) nothing. The parser now reads the new shape and the one before it; the dining sub-ratings on the location row are read from their new place too. Row keys, filters, paging and billing are unchanged.
1.1 — 2026-09-01
Fix: TripAdvisor's DataDome gate stopped serving the Firefox 147 fingerprint (403 on every IP, residential included, from 2026-09-01), which failed every run. The client now impersonates Safari 26.0.1, the one profile the site still serves; restaurant and attraction paging, typeahead and the localized domains are unchanged.
2026-08-30
Reliability: a run that cannot act on its input — a URL from the wrong site, a name nothing resolves to, an empty target list, a number outside the documented range — now ends cleanly with the reason on the run card instead of as a failed run. Nothing is charged in either case; a blocked or throttled source still fails loudly.
Store listing: moved into the categories buyers actually browse (the old Business category has no Store page).
1.0 — 2026-08-29
First release.
Every TripAdvisor review of a restaurant or attraction as structured rows: 1-5 bubbles, title, full text, the diner's food / service / value / atmosphere sub-ratings, language and original language, machine-translation flag, publication and visit dates, trip type, the tips the reviewer left for the next guest, reviewer profile (name, handle, verified flag, contribution counts, hometown), photos, helpful votes and the owner's reply.
Restaurants and attractions by TripAdvisor URL, by location id (the d<number>) or by name through TripAdvisor's own typeahead, with a word-overlap guard so a nonsense name is an error row rather than a random bistro.
locationType (restaurant | attraction | any) validates the family: a target that turns out to be the other family — or a hotel — is reported as status = wrong_type with what it actually is, after a single page, and is never charged. Hotel ids are pointed at the hotel sibling, kestrel/tripadvisor-reviews-scraper .
Correct paging per family: TripAdvisor lists 15 reviews on a restaurant page and 10 on an attraction page, and the actor reads the step off the page's own paging links, so no page is ever fetched twice or skipped.
Up to 30 site languages in one run — each TripAdvisor domain serves the reviews in its own language, machine-translated ones included; includeTranslated: false keeps only reviews written in that language.
Filters that run before billing: maxRating (complaints feeds), tripTypes, sinceDate (relative dates for schedules; paging stops once a whole page predates it), requireText, includeTranslated.
A free location row per location and language: bubble rating, review count, reviews per rating and per language, the four dining sub-ratings, city ranking, cuisines, price band, dish tags, category tags, address, coordinates, phone, e-mail, website, menu link, opening hours and open/closed state.
Reads the server-rendered review pages through Apify's residential proxy with a Firefox-fingerprinted client — no browser, no GraphQL, no login. A DataDome refusal rotates the IP and retries; it is never reported as "no reviews".
Pay per review row; locations with no reviews, unknown ids, wrong-family ids, duplicate targets and filtered reviews are free.