Google Maps New Business Monitor — Fresh Local Leads avatar

Google Maps New Business Monitor — Fresh Local Leads

Under maintenance

Pricing

Pay per event

Go to Apify Store
Google Maps New Business Monitor — Fresh Local Leads

Google Maps New Business Monitor — Fresh Local Leads

Under maintenance

Be the first to reach every business that opens in a Google Maps search. Watch a search and each run returns only the businesses that newly appeared, with phone, website and email pulled from the site. Pay per new lead, not per rescan.

Pricing

Pay per event

Rating

0.0

(0)

Developer

MoreLock

MoreLock

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

Be the first to reach every business that opens near you. This new business monitor watches a Google Maps search and hands you, on every run, only the fresh local leads — the businesses that just started showing up — already carrying phone, website, and email pulled from the site. It is a continuous local business monitor that runs on its own: a stream of fresh leads where you never rescan the whole area, you get only the difference.

Works globally, on any Google Maps search in any city. For businesses in Brazil it adds a bonus layer: the CNPJ and public registry data (legal name, status, size) when the site publishes it.

Overview

You pick what to watch and where ("coffee shops" in "Austin, TX") and schedule the run. The first time, the monitor records the current inventory of that search (the baseline). On the following runs it compares what is on Google Maps now against what was there before and delivers only the delta: the businesses that appeared (new businesses), the ones that vanished (possible closure), and the ones that changed name or category.

For each new business — and only for it — the monitor opens the listing and does the heavy lifting: phone, official website, email, social links, full address with postal code and GPS. When the business is in Brazil and its site publishes a CNPJ in text, the number is validated by check digits and the public registry is queried (legal name, registration status, size, capital, activity, partners) in the same record. The baseline and the already-seen businesses come out in the light format; the expensive enrichment is reserved for what is new.

This is a purpose-built monitor, not a generic scraper with a filter bolted on. The parsing understands Google Maps cards, the website crawl looks for real contact details, and the delta engine is the same audited core that powers the one-shot Google Maps Local Leads scraper. This Actor trades the one-time sweep for continuous watching.

Features

  • Delta between runs: each run reports only what changed — new businesses, possible closures, and edits — never the whole list again.
  • Isolated state per watch: search term + location define the watch; every combination keeps its own history, so two monitors never contaminate each other.
  • Enrichment only on the new: phone, website, email, social links (and CNPJ/registry for Brazil) are fetched only for freshly detected businesses, so cost tracks the delta, not the size of the search.
  • Match and chain guard: a CNPJ is "high confidence" only when the legal name matches the business name; a CNPJ repeated across several units in the same delta is flagged as a chain and charged only once.
  • Honest degradation: if Google Maps is down or blocked, the monitor preserves the state and charges nothing, so a block is never mistaken for "everyone closed".
  • Schedulable: built to run hourly or daily via Apify Schedules; the first run is the baseline, the rest are the alert.

Input example

{
"search_term": "coffee shops",
"location": "Austin, TX",
"max_results": 60,
"enrich_from_website": true,
"max_new_hydrated": 40,
"proxy": { "useApifyProxy": true }
}

Output example

A new business record detected in the delta (with website contact enrichment):

{
"change_type": "new_business",
"search_term": "coffee shops",
"location": "Austin, TX",
"name": "Cedar & Bean",
"category": "Coffee shop",
"address": "812 W 5th St, Austin, TX 78703",
"postal_code": "78703",
"region": "TX",
"phone": "(512) 320-1200",
"phone_digits": "5123201200",
"website": "https://www.cedarandbean.com/",
"email": "hello@cedarandbean.com",
"rating": 4.8,
"reviews_count": 42,
"place_url": "https://www.google.com/maps/place/Cedar+%26+Bean/...",
"registry_enriched": false,
"match_confidence": null,
"detected_at": "2026-07-18T09:00:00.000Z"
}

On the first run of a watch, each business comes out as change_type: "baseline" in the light format (name, category, rating, location) — the snapshot of what already exists. A business that vanished comes out as change_type: "possible_closure", but only after it has been missing from 3 consecutive runs — Google Maps returns a rotating sample of the results, so a single absence means nothing and is never reported. For a Brazilian business whose site publishes a CNPJ, the same new_business record also carries cnpj, legal_name, registration_status, and registry_enriched: true.

You are never charged twice for the same business. Once a business has been reported (as new, or as a possible closure), the monitor keeps it in its memory forever. If a place that was flagged as a possible closure shows up again later, it is recorded as a reopening — a free signal — and never billed again as a new lead.

Parameters

FieldTypeDefaultDescription
search_termstring"restaurants"What to watch, exactly as you would type it into Maps.
locationstring"Austin, TX"City and area to watch. Search term + location define the watch.
max_resultsinteger120Safety cap of businesses watched (the monitor scrolls to the end of the list; ~120 is the practical Maps maximum). Changing the cap re-baselines the watch.
enrich_from_websitebooleantrueFor each new business: visits the site (when it exists) for email, social links, and (for Brazil) CNPJ, then queries the registry.
max_new_hydratedinteger25Cap of new businesses hydrated and enriched per run (protects the first delta run after a large search; the excess is deferred to the next run). Max 40.
stateStoreNamestring"" (auto)Advanced. Empty = state derived from search term + location. Fill in only to control the watch explicitly.
modeselectautoauto = baseline on the 1st run, delta after. baseline = force a rebase of the current state.
proxyobjectApify ProxyRotating datacenter by default; switch to Residential + a nearby country if you see blocking at volume.

Tips

  • Schedule it, do not run it by hand. The value is the recurrence: set up a Schedule (daily or hourly). The 1st run becomes the baseline automatically; the following ones only alert you to what is new.
  • One watch per search term + location. To watch "coffee shops" and "gyms" in the same city, create two schedules; each keeps its own state, without mixing.
  • Narrower searches give sharper alerts. "burger joints" + "Brooklyn, NY" produces a much more actionable "a competitor opened" signal than "restaurants" + "New York".
  • The baseline is free of per-business charges. The first run only charges the run itself (not per business); it is the initial snapshot. Money starts when a real new business shows up.
  • Check match_confidence: low means the CNPJ from the site may belong to a group/chain entity, not the exact unit on the map (Brazilian businesses only).

Use cases

  • B2B lead generation / fresh new business leads: be the first to reach every restaurant, clinic, or gym that opens near you, with phone and website contact already in hand.
  • Newly opened businesses / new entrants: know the moment a new business opens in your segment and neighborhood, ahead of the competition — a live feed of newly opened businesses in your area.
  • Competitor tracking (competitive intelligence): monitor competitors in a segment and an area to know instantly when a new competitor appears (or disappears) on the map.
  • Continuous B2B prospecting for agencies: deliver clients a weekly stream of qualified local leads instead of a static list that ages.
  • Franchise / retail expansion: track the density of a segment in a market over time to decide where to enter.
  • Incremental CRM enrichment: only the new records come in, already carrying contact details.
  • Closure signal: possible_closure flags places that dropped off the map for 3 runs in a row, useful for cleaning a book of business or mapping churn in a sector.

FAQ

What exactly changes between the 1st run and the following ones? The 1st run of a watch (search term + location) is the baseline: it records what already exists, in the light format, and charges only the run. From the 2nd run on, the monitor compares against the previous state and delivers the delta — new businesses (enriched), possible closures, and changes.

Does it work for tracking new business openings? Yes, that is exactly the use case: on each run it lists only the new businesses that started showing up in that Maps search, with contact details.

Does it work outside Brazil? Yes. New business detection and website contact enrichment (email, phone, social links) work on any Google Maps search worldwide. The CNPJ / registry layer is a bonus that only applies to Brazilian businesses; elsewhere those fields simply stay empty and you are not charged for them.

How does the monitor keep its state? In a named store, derived from search term + location, that persists between runs. Each watch is isolated, so watching two terms or two cities never blinds one to the other.

Does every new business come with contact details? Not always, and the Actor is honest about it. Email and CNPJ only appear when the business has a website and the site publishes the data in scrapable text. Without that, the field stays empty and you do not pay for enrichment that did not happen.

What is match_confidence: "low"? It is the warning that a CNPJ found may not belong to that exact unit: either the legal name does not match the business name, or it is a chain (the same CNPJ showed up across several units in the delta, one shared corporate site). The data is labeled, and the chain is charged only once.

If Google Maps is down, does the monitor wipe everything? No. A blocked run preserves the state and charges nothing; it emits a STATUS: UNAVAILABLE record. A block is never read as "every business closed" (the cardinal sin of a monitor).

What if the search has more results than the cap? The monitor scrolls toward the end of the list. If it does not reach the real end — because the search overflows the cap, or because scrolling ran out of time budget — possible_closure records are not computed on that run (marked window_truncated in the summary), because a business that fell past the cutoff did not necessarily close. New businesses within the window keep being detected. For the sharpest closure signal, narrow the search term + location until the search fits comfortably inside the cap.

Why 3 runs before reporting a closure? Because Google Maps does not return a stable list. The same search, minutes apart, gives back a rotating sample of a larger set — measured on a live search: 49, then 39, then 50 businesses, with nothing having opened or closed. A monitor that trusted a single absence would cry wolf on healthy businesses and re-detect them as "new" when they rotate back. Requiring 3 consecutive absences, plus permanent memory of every business ever seen, is what makes the closure signal meaningful and the billing exactly-once.

A run ended before enriching every new business. Did I lose them? No. Each run works within a time budget; whatever it cannot open and enrich in time is left for the next run, not emitted and not charged (shown as deferred in the summary). You never pay for a partial record, and nothing is dropped.

A search that is legitimately empty? A real search with no businesses is a valid state, not an error: the monitor computes the delta normally over that state.

Why do I need a proxy? The default (Apify Proxy datacenter) is tested and works on Google Maps without captcha. At high volume, if a cookie consent or block appears, switch to Residential and a country near your target area in the proxy selector.

Pricing

Pay per result (PPE): you pay for the run and for the novelty, not for the rescan.

EventWhen it is charged
monitor_runOnce per valid run (renders the search and computes the delta). A blocked run or a source that is down is not charged.
new_businessEach business that started appearing since the previous run, already hydrated (phone/website/postal code). An already-seen business is not re-charged; the 1st run (baseline) does not charge per business.
registry_enrichedOnly when a real CNPJ is found on a new business's site and resolved in the registry. Charged once per unique CNPJ — a chain with N units on the same CNPJ does not multiply.

You do NOT pay for: the baseline list (only the run), already-seen businesses, a blocked/down search, our own errors, or enrichment that did not happen (site without CNPJ / no site = honest abstention).

Changelog

  • 0.1.10: closure signal now requires 3 consecutive absences (Google Maps returns a rotating sample, so one absence is not a closure), and every business ever seen is kept in memory — a place that reappears after being flagged is recorded as a reopening and never billed again as a new lead. Both the list scroll and the enrichment now run under a time budget: a run always delivers what it managed to collect instead of ending empty, and the rest rolls over to the next run uncharged. Default cap of businesses enriched per run adjusted to 5.
  • 0.1: first version — monitor of new businesses in a Google Maps search, with delta between runs (new / closure / change), isolated state per watch, website contact enrichment on the new ones (plus CNPJ/registry for Brazil), chain guard, and honest degradation.

Contact

Questions, issues, or requests for a new source: use the Actor's Issues tab.