# Changelog of Yelp Scraper API - Businesses, Emails, Reviews & Leads (`pro100chok/yelp-scraper`) Actor

- **URL**: https://apify.com/pro100chok/yelp-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/pro100chok/yelp-scraper.md

## Changelog

### 1.2.1 (2026-09-20)

- **An empty page no longer passes for a page.** Yelp answers the same URL either with the
  full server-rendered page or with a bare shell: the frame renders, the data island is
  missing, and none of the usual bot-wall markers are there. Measured on `/biz_photos`:
  one request in six came back whole (947 KB, island present), the rest were the 278 KB
  shell — and the shell was parsed as "no photos", so photos, Q\&A and profile extras
  quietly came back empty. A page with no data island is now treated as a blocked answer
  and re-read from another address, which is what it always was.

### 1.2 (2026-08-20)

- **Stability hardening.** HTTP 429 now gets its own patient backoff (8-35 s, and the server's own `Retry-After` wins) instead of the short pause used for bot-wall answers, which a fresh IP clears but a rate limit does not. A profile that arrives as a client-rendered shell is re-read once before falling back to the thinner record, so `partialData` rows are rarer. Verified on a 60-business run with every add-on enabled: 2,109 reviews, **0 errors, 0 warnings**, 112 MB peak of the 256 MB limit.
- **Real-time API (Standby mode).** The Actor now also runs as an always-warm HTTP service: `GET /search`, `GET /business` and `GET /reviews` answer with JSON in the response body, no run to start and no dataset to poll. Every input option works as a query parameter.
- **OpenAPI 3 schema** shipped with the Actor, so the Standby tab documents every endpoint and can send test requests straight from the browser.
- Standby serves at most 6 requests at a time (further callers queue, then get an honest 503 rather than a timeout) and caps one request at 50 businesses, 200 reviews, 60 photos and 10 questions with a 270-second budget; larger jobs still belong in a normal run. Pricing is unchanged - the same pay-per-event charges apply to both paths.

### 1.1 (2026-08-20)

- **Reviews are now nested inside the business row.** Businesses mode returns exactly one row per business, with its reviews, not-recommended reviews, menu, photos and Q\&A inside it - so the row count always matches the number of businesses you asked for. Reviews mode still returns the flat shape, one row per review, for text analysis.
- **Cleaner records.** Amenities were being published three ways; they are now one list of labels plus `attributes` keyed by Yelp's language-independent aliases. `allCategories` merged into `categories`, `menuItemCount` dropped (it is the length of `menu`), opening hours reduced to one readable line per day, and empty values are stripped at every level instead of only the top - so no `null`s inside nested reviews and no dead CSV columns.
- **United States is now the default output language** and every URL in the dataset is a canonical `www.yelp.com` link, whichever language you pick.
- Dropped the Hong Kong option: it could not be served in Chinese, so offering it promised a language it could not deliver.
- **`Max reviews` now caps not-recommended reviews too**, so a run can no longer return more review rows than you asked for.
- Renamed the domain input to **Results language** and spelled out in the log and the docs that businesses and reviews are separate dataset rows - 20 businesses with 20 reviews each is ~420 rows, not 20.
- Removed the redundant `sourceUrl` field; `url` is the canonical link.
- Search now runs on the language you selected, so `searchRank` matches the ordering you would see on that Yelp site.

### 1.0 (2026-08-19)

Initial release.

- **Business profiles** with 60+ fields: name, categories, rating, review count, price range, phone, website, full address with coordinates and timezone, neighbourhoods, opening hours per weekday, special hours, amenities and attributes, business highlights, claimed/advertiser/Yelp-Guaranteed status, verified trade licences, health inspection results with individual violations, owner "about" text, specialties, year established, editorial summary, review highlights, photos, videos, and search context (keyword, location, rank, sponsored flag).
- **E-mail and social lookup**: visits each business's own website and extracts e-mail addresses plus Facebook, Instagram, X, LinkedIn, YouTube, TikTok and Telegram profiles. Addresses on the business's own domain are ranked first.
- **Reviews** with full text, star rating, language, publish date, author profile (name, location, review/friend/photo counts, Elite status), reader reactions, check-in count, attached photos and the owner's public reply. Optional "not recommended" reviews.
- **Menus** for food businesses: section, item name, price, description, photo and per-item review count.
- **Community Q\&A** with answers, authors and helpful votes.
- **Search modes**: keyword × location, Yelp category aliases, direct business URLs/aliases, and Yelp search URLs (filters preserved).
- **27 Yelp domains** supported, which also selects the output language for categories, amenities and hours.
- Results stream to the dataset as they are found, so an aborted run keeps everything collected so far.
- Pay-per-event pricing; rows that failed to extract are never charged.
