# Changelog of Google Maps Business Scraper (`meridiancorp.ai/google-maps-business-scraper`) Actor

- **URL**: https://apify.com/meridiancorp.ai/google-maps-business-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/meridiancorp.ai/google-maps-business-scraper.md

## Changelog

### \[0.3.0] — 2026-04-22

#### Added

- **Email extraction from business websites** (PPE event `EMAIL_EXTRACTED` at $0.005). Enable with `includeEmails=true` input.
- Contact-page fallback: if homepage has no email, scraper also tries `/contact`, `/contact-us`, `/kontakt`, `/contacto`, `/impressum`, `/about`. Significantly higher hit rate than homepage-only.
- `mailto:` link priority over regex text scan (higher precision).
- Noise filtering: excludes `noreply`, `postmaster`, `sentry.io`, `wixpress.com` and similar false positives.

#### Changed

- `extract_email()` signature unchanged (internal only) — consumers call the same function.

***

### \[0.2.0] — 2026-04-21

#### Added

- **Concurrent scraping**: new `concurrency` input parameter (1–20, default 5). Five parallel workers deliver 3–5x faster throughput on large queries.
- **Retry logic**: each failed place is retried up to 3 times with exponential backoff (2 s, 5 s). Partial failures no longer abort the entire run.
- **Place URL deduplication**: duplicate listings that appear multiple times in the Google Maps sidebar are filtered before scraping.
- **Per-place timeout**: 90-second hard cap per listing prevents stuck workers from blocking the queue.
- **Error counter**: run completion log now reports `X saved, Y failed` for visibility into partial failures.

#### Fixed

- **reviewsCount now populated**: DOM selector updated to `div.F7nice span[aria-label*='reviews']` with regex-based integer extraction. Previously always returned null.
- **priceLevel now populated**: DOM selector updated to `span.mgr77e` with leading `·` character stripped. Previously always returned null.

#### Changed

- Input schema: `concurrency` field added.
- Browser context moved to `run()` level — shared across all queries. Previously a new browser context was created per query.

***

### \[0.1.0] — 2026-04-21

#### Added

- Initial release: Google Maps Business Scraper.
- Pay-Per-Event pricing: $0.003 per record, $0.005 per email (when `includeEmails=true`).
- Input: `searchQueries`, `maxResultsPerQuery` (1–1000), `language` (EN/CS/DE/ES/FR), `includeEmails`, `includePhotos`.
- Output fields: `name`, `category`, `address`, `lat`, `lon`, `phone`, `website`, `email` (optional), `rating`, `reviewsCount`, `priceLevel`, `hours`, `placeId`, `url`, `scrapedAt`.
- Playwright-based scraping with anti-detection (user-agent rotation, random delays).
- Cookie consent dialog auto-dismissal.
- Integration tests for URL collection and full scrape pipeline.

#### Known limitations (addressed in v0.2.0)

- `reviewsCount` always null — fixed in 0.2.0.
- `priceLevel` always null — fixed in 0.2.0.
- Sequential scraping only — fixed with `concurrency` parameter in 0.2.0.
