How to scrape Google Maps Listing Change Monitor
Track a fixed set of Google Maps listings (clients, competitors or a category search) and get one row per change: closed, reopened, rating drop, review spike or stall, hours, phone, website or category changed, listing gone. Run 1 records a health baseline. No login.
Open Google Maps Listing Change Monitor: Ratings, Hours, Closures on Apify
Track a fixed set of Google Maps listings and get one row for every change that matters: a place closes or reopens, its rating drops, reviews suddenly spike or stop coming in, reviews get removed, hours change, the phone number or website changes, the primary category changes, or the listing disappears. The first run records a health baseline for every place, with a listing completeness score and its rank inside the set by rating and by review count.
It is built for the job local SEO agencies and multi-location brands already do by hand or pay a listing-management tool for: watching their own listings and their competitors' listings week after week. No login, no Google API key, no browser.
What it outputs
A change event:
Example input
{
"placeUrls": [
"https://www.google.com/maps/place/?q=place_id:ChIJn8X_1xevJIgR0nUJVsjFMb4",
"ChIJ2eUgeAK6j4ARbn5u_wAGqWA"
],
"preset": "clientListings",
"monitorKey": "agency-clients"
}Sample output
{
"rowType": "event",
"eventType": "RATING_DROP",
"severity": "medium",
"summary": "RATING_DROP: \"Northside Dental\" (Dentist, Royal Oak) fell from 4.6 to 4.3 stars (-0.3) since 2026-10-06; 212 reviews.",
"setName": "Tracked places",
"title": "Northside Dental",
"categoryName": "Dentist",
"status": "OPERATIONAL",
"rating": 4.3,
"reviewsCount": 212,
"field": "rating",
"oldValue": "4.6",
"newValue": "4.3",
"ratingDelta": -0.3,
"completenessScore": 86,
"missingFields": "website",
"placeId": "ChIJ...",
"mapsUrl": "https://www.google.com/maps/search/?api=1&query=Northside%20Dental&query_place_id=ChIJ...",
"sourceUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ...&hl=en&gl=us",
"previousCheckedAt": "2026-10-06T08:00:00.000Z",
"daysSinceLastCheck": 7,
"monitorKey": "dental-reputation",
"runNumber": 3,
"checkedAt": "2026-10-13T08:00:00.000Z"
}Sample taken from the actor's README; values shown as placeholders there are placeholders.
FAQ
How is this different from a Google Maps scraper?
A scraper returns every place every time. This actor remembers what it saw and returns only what changed, plus a one-time baseline. On a weekly schedule you pay for a handful of rows instead of the whole list.
Does it find new businesses in an area?
Not as its purpose. It watches a set you define. With competitorSet it tells you when a new place enters a search you already monitor, which is useful for competitor tracking but is not a full new-business feed.
What happens if a run fails halfway?
The monitor state is saved at the end of a run. Places checked in a failed run are compared again next time, so a change is reported late rather than lost.
Can I run several monitors?
Yes. Use a different monitorKey for each client or market. Each key keeps its own history in the same key-value store.
How do I see the stored state?
Open the key-value store maps-listing-change-monitor in your Apify account; the record snap-<monitorKey> holds it. The run's OUTPUT record summarises counts per set.
Why did I get no rows on run 2?
Nothing changed. The set summary row confirms the check ran and shows the current numbers.
Can I change the rating threshold?
Yes, ratingDropThreshold (0.1 to 2 stars).
Is this allowed?
It reads publicly visible listing data at a low request rate, without logging in or bypassing any access control. You are responsible for how you use the data in your jurisdiction.
Where do I run it?
On Apify: https://apify.com/transparent_meteorite/maps-listing-change-monitor. Check the Pricing tab there for current prices.
Try Google Maps Listing Change Monitor: Ratings, Hours, Closures on Apify