- 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.
- 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.
- 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.
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.
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.
- 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.
- Default memory is 2048 MB, chosen by measuring cost and runtime across memory tiers.
- Removed Playwright; the image is now
apify/actor-node.
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.
Initial release. Browser-based scraper using Playwright.