# Changelog of Free Hotel Review Checker — Ratings From 6 Sites (`kestrel/hotel-reputation-checker`) Actor

- **URL**: https://apify.com/kestrel/hotel-reputation-checker/changelog.md
- **Full Actor documentation**: https://apify.com/kestrel/hotel-reputation-checker.md

## Changelog

### 1.1 — 2026-09-01

- Tripadvisor: rebuilt on the Safari 26.0.1 TLS fingerprint. DataDome dropped curl\_cffi's Firefox 147 profile on 2026-09-01 and now answers 403 to it on every IP, so the Tripadvisor column of every run errored. The parser is unchanged; `curl_cffi` is pinned to `>=0.16.2` so the image always resolves a build that carries the Safari profile.

### 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. Free: there is no pay-per-event pricing and no charging call anywhere in the actor.

- One `reputation` row per hotel per review site — Google Hotels, Tripadvisor, Booking.com, Agoda, Hostelworld and Despegar — carrying the headline score on the site's own scale, the same score on a shared 0-5 scale, the review count, the star class, the city and the property URL.
- Tripadvisor's ranking sentence is parsed into `ranking`, `ranking_position` and `ranking_of`; the free sub-scores are kept where a site publishes them (Tripadvisor's six, Hostelworld's seven, Despegar's six).
- One `summary` row per hotel across sites: the mean on the 0-5 scale, the kindest and harshest site, the spread between them, the total reviews found and which site had nothing.
- One `status` row per hotel per site, `ok | not_found | unsupported | skipped | error`, always with a reason. A refusal is an `error`; a genuinely absent property is `not_found`; the two are never merged.
- Hotels by name (`hotelNames`, ideally `Name, City`) resolved through each site's own autocomplete or typeahead, or by property URL (`startUrls`) on any of the six. A URL's own site is read first and the name it returns is what the other sites are then searched by.
- Name matching is guarded twice: each module's own check (Tripadvisor's >= 50% typeahead word overlap, Booking's `dest_type: hotel` plus country match, Despegar's canonical-id check) and a uniform word-overlap score reported as `matched_confidence`. Below 0.6 the site is reported `not_found` with the score that failed, never guessed at.
- Free-run bounds: 10 hotels per run (the rest are `skipped` with a clear message and never fetched) and at most one lookup request plus one aggregate request per site per hotel. No paging anywhere.
- Tripadvisor and Despegar are fetched through the residential proxy group whatever `proxyConfiguration` says, because both refuse datacenter ranges; the other four run on datacenter. An account without residential access gets a warning and the configured proxy.
- Every row names the paid per-source scraper that returns the full review text in `reviews_scraper`, and the dataset ships nine views: an overview, one per site, the cross-source summary and the status list.
