# Changelog of Google Maps Lead Scraper (`incognito_mode/google-maps-lead-scraper`) Actor

- **URL**: https://apify.com/incognito_mode/google-maps-lead-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/incognito_mode/google-maps-lead-scraper.md

## Changelog

### 2.1

#### Fixed

- Addresses in Brazil, Portugal, Poland, Sweden, Czechia, the Netherlands,
  Mexico and Argentina were mis-parsed: the postcode was written to `city` and
  `postalCode` was left empty, for every result in those markets. Their postcode
  schemes are dashed (`01310-100`), space-separated (`111 22`) or letter-led
  (`C1007ABN`), and none of them matched the digits-only patterns the parser
  recognised. The Dutch code lost its two trailing letters to the city
  (`1079 CV Amsterdam` became city `CV Amsterdam`, postcode `1079`).
- `state` is now filled for Brazil (`São Paulo - SP`) and Australia
  (`Sydney NSW`), which previously kept the region glued to the city.
- A record whose address lines Google returns out of order no longer puts the
  street in `city`; the locality label is preferred when the derived city
  carries a house number.
- `state` no longer holds the country name. Google appends the country to the
  locality label whenever the requesting IP is in another country, which is
  routine behind rotating proxies, so international runs were storing
  "Portugal" or "Netherlands" as the region.

#### Changed

- The live test suite checks address parsing against eleven markets, and covers
  `customGeolocation`, which previously had no live coverage at all.
- Removed the undocumented `minReviews` filter. It was never exposed in the
  input schema, and because Google no longer publishes review counts it removed
  every result when set through the API.
- The Actor start fee is **$0.005**, down from $0.02. The README listed a flat
  per-place price and never mentioned that fee at all, so it understated every
  run by the base charge — most visibly on small ones, where it was double the
  advertised cost. Both chargeable events are now shown with worked totals: a
  1,000-place run is $4.01.

#### Deployment

- The build workflows use a vendored push action that passes `--force`, so a
  `beta` build from `main` no longer blocks the next `production` deploy. Both
  workflows are serialized with a `concurrency` group.
- GitHub Actions moved off the deprecated Node 20 runtime.

### 2.0

Complete rewrite. The Actor now reads Google Maps data over plain HTTP instead of
driving a headless browser, which makes runs dramatically cheaper and removes the
dependency on Google's rotating CSS class names.

#### Added

- `locationQuery` to reuse one set of search queries across cities.
- `customGeolocation` to centre a search on exact coordinates and zoom.
- Filters: `minRating`, `requireWebsite`, `requirePhone`, `skipClosed`, `categoryIncludes`.
- `maxTotalResults` as a hard cap across all queries.
- New output fields: `categories`, `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode`, `phoneUnformatted`, `websiteDomain`, `googleFeatureId`, `googleKnowledgeGraphId`, `timezone`, `openingHours`, `permanentlyClosed`, `temporarilyClosed`, `attributes`, `imageUrl`.
- Emails are now also read from JSON-LD structured data and Cloudflare-protected markup.

#### Fixed

- Businesses that share one website (chain locations) were deduplicated out of the request queue, so every branch after the first was silently dropped.
- Addresses outside the US were mis-parsed. UK postcodes, German postcode-first lines, Japanese addresses and the country line Google appends when the request IP is in another country are all handled now.
- Phone numbers and nearby words merged into extracted email addresses.
- `businessStatus` was inferred by searching the whole page for the word "Closed", which mislabelled open businesses as permanently closed.
- Bot-challenge responses from business websites are no longer parsed as page content.

#### Changed

- Default memory is 2048 MB, chosen by measuring cost and runtime across memory tiers.
- Removed Playwright; the image is now `apify/actor-node`.

#### Known limitations

- `reviewCount` is usually empty. Google removed review counts from the data behind Maps search results. The field is kept so it repopulates if Google restores it.
- `openingHours` covers the current day only, which is all Google returns in search results.

### 0.1

Initial release. Browser-based scraper using Playwright.
