No-Website Business Leads Scraper (Google Maps) avatar

No-Website Business Leads Scraper (Google Maps)

Pricing

from $1.00 / 1,000 results

Go to Apify Store
No-Website Business Leads Scraper (Google Maps)

No-Website Business Leads Scraper (Google Maps)

Find businesses with weak or missing websites on Google Maps — a priority-ranked lead generation list for website developers and designers

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Leafy

Leafy

Maintained by Community

Actor stats

1

Bookmarked

10

Total users

7

Monthly active users

10 hours ago

Last modified

Share

Find local businesses with weak or missing websites — and get a ready-to-pitch, priority-ranked outreach list, straight from any Google Maps search.

Point it at a business type and a city. Walk away with every matching business, each one tagged with how strong (or weak) its web presence is and the exact reason to reach out — so you spend your time pitching, not scrolling Maps and opening 80 tabs to see which sites actually load.

Built for web design agencies, freelance developers, and local SEO consultants.


Why it beats a generic Maps scraper

A normal Google Maps scraper dumps every business and leaves you to figure out who's worth contacting. This one does the qualifying for you:

  • Filters by web presence, not just contact info — it actually fetches each website and checks whether it's missing, social-only, a directory link, broken, outdated, or healthy.
  • Ranks every lead HIGH → MEDIUM → LOW so you work the hottest prospects first.
  • Tells you why each business is a lead in plain English — drop it straight into your cold-email merge fields.

What you get

One row per business. Export to CSV / JSON / Excel, or pipe straight into Instantly, Smartlead, Apollo, HubSpot, or Pipedrive.

{
"businessName": "Bayshore Cuts & Color",
"address": "123 Bayshore Blvd, Tampa, FL 33606",
"phone": "(813) 555-0100",
"googleMapsUrl": "https://www.google.com/maps/place/Bayshore+Cuts+%26+Color/...",
"websiteUrl": "https://www.facebook.com/bayshorecuts",
"category": "Hair salon",
"rating": 4.8,
"reviewCount": 312,
"websiteType": "SOCIAL",
"ssl": null,
"pageSpeedScore": null,
"isMobileResponsive": null,
"siteLoads": null,
"webPresenceCategory": "SOCIAL_ONLY",
"outreachPriority": "HIGH",
"outreachReason": "Website field links to a social profile only (https://www.facebook.com/bayshorecuts)"
}

The 6 categories

Every business gets exactly one webPresenceCategory, based on deterministic signals. Anything we genuinely can't verify defaults to HEALTHY, so we never mislabel a real customer's healthy site as a lead.

CategoryWhat it meansPriority
NO_WEBSITENo website on the listing, or the domain is parked / for saleHIGH
SOCIAL_ONLY"Website" links to Facebook, Instagram, TikTok, LinkedIn, etc.HIGH
DIRECTORY_ONLY"Website" links to Yelp, Yellow Pages, Houzz, BBB, etc.HIGH
WEBSITE_UNREACHABLEA real domain is listed but it didn't load — timed out, refused, or erroredMEDIUM
OUTDATED_WEBSITEReal site that loads, but missing SSL or mobile viewportMEDIUM
HEALTHYLoads with SSL + mobile viewportLOW

Priority at a glance:

  • HIGH — no real website to speak of (NO_WEBSITE, SOCIAL_ONLY, DIRECTORY_ONLY). Your strongest pitch.
  • MEDIUM — a site exists but there's a clear problem to lead with (WEBSITE_UNREACHABLE, OUTDATED_WEBSITE).
  • LOW — modern, working site (HEALTHY). Probably not your lead — kept in the dataset so you can decide.

The raw pageSpeedScore is included for advanced filtering (e.g. "HEALTHY businesses scoring under 60"), but it never drives the category, because Lighthouse scores swing ±5–10 points run-to-run.


How it works

  1. Searches Google Maps for {businessType} in {neighborhood, city, country}.
  2. Harvests every business in the results panel, up to your maxResults.
  3. Opens each listing and pulls name, address, phone, category, rating, reviews, and the website link.
  4. Fetches each website and audits it — reachability, SSL, mobile viewport, and (optionally) PageSpeed.
  5. Categorizes, prioritizes, and writes the row to the dataset.

Input

{
"businessType": "coffee shops",
"country": "PH",
"city": "Manila",
"neighborhood": "Pureza, Santa Mesa",
"maxResults": 50,
"onlyNoOrWeakWebsite": false,
"pageSpeedApiKey": "AIzaSy...",
"maxConcurrency": 5,
"mapsConcurrency": 3,
"useProxy": false
}
FieldTypeRequiredDefaultWhat it does
businessTypestringyesWhat to search for. Examples: "coffee shops", "plumbers", "hair salons"
countrystringyesUSPick from the country dropdown. Added to the search query, and used as the proxy country if proxy is on. Choose the country, not a stateUS for Florida, then put "Tampa FL" in city.
citystringyesCity or town. Examples: "Tampa FL", "Manila", "London"
neighborhoodstringnoNarrow to a district or zip. Useful for big cities where Maps caps at ~120 results per area.
maxResultsintno501–200
onlyNoOrWeakWebsiteboolnofalseWhen on, returns only businesses worth pitching — no website, social/directory-only, outdated, or unreachable (HIGH + MEDIUM). Skips healthy sites (LOW). Off returns everything.
pageSpeedApiKeystringnoFree Google PageSpeed Insights v5 key. Adds pageSpeedScore to every record.
maxConcurrencyintno5Parallel website checks (1–20)
mapsConcurrencyintno3Parallel Google Maps detail-page extractions (1–8)
useProxyboolnofalseOff uses Apify's IP — fastest, and fine for most searches. Turn on only if you hit blocks/captchas or need strict same-country routing — it's slower.

Output fields

Every record contains every field below. Nullable fields are null when not applicable (e.g. ssl is null for NO_WEBSITE records).

FieldTypeDescription
businessNamestringFrom the Google Maps listing
addressstring | nullFull street address
phonestring | nullPhone number as listed
googleMapsUrlstringDirect link to the listing
websiteUrlstring | nullFinal URL after following redirects
categorystring | nullGoogle's category label (e.g. "Hair salon")
ratingnumber | nullStar rating
reviewCountint | nullNumber of reviews
websiteTypeenumNONE | REAL | SOCIAL | DIRECTORY | DEAD | PARKED
sslbool | nullTrue if final URL is HTTPS
pageSpeedScoreint | nullMobile Lighthouse score 0–100 (only with an API key)
isMobileResponsivebool | nullTrue if the HTML contains a viewport meta tag
siteLoadsbool | nullTrue if the URL responded 2xx/3xx within 10s
webPresenceCategoryenumOne of the 6 categories above
outreachPriorityenumHIGH | MEDIUM | LOW
outreachReasonstringOne-line plain-English explanation

Sample output

Five rows showing each priority band (illustrative data):

[
{
"businessName": "Westshore Cuts",
"address": "456 Kennedy Blvd, Tampa, FL 33609",
"phone": "(813) 555-0142",
"googleMapsUrl": "https://www.google.com/maps/place/Westshore+Cuts/...",
"websiteUrl": null,
"category": "Hair salon",
"rating": 4.5,
"reviewCount": 89,
"websiteType": "NONE",
"ssl": null,
"pageSpeedScore": null,
"isMobileResponsive": null,
"siteLoads": null,
"webPresenceCategory": "NO_WEBSITE",
"outreachPriority": "HIGH",
"outreachReason": "No website listed on Google Maps"
},
{
"businessName": "Bayshore Cuts & Color",
"address": "123 Bayshore Blvd, Tampa, FL 33606",
"phone": "(813) 555-0100",
"googleMapsUrl": "https://www.google.com/maps/place/Bayshore+Cuts+%26+Color/...",
"websiteUrl": "https://www.facebook.com/bayshorecuts",
"category": "Hair salon",
"rating": 4.8,
"reviewCount": 312,
"websiteType": "SOCIAL",
"ssl": null,
"pageSpeedScore": null,
"isMobileResponsive": null,
"siteLoads": null,
"webPresenceCategory": "SOCIAL_ONLY",
"outreachPriority": "HIGH",
"outreachReason": "Website field links to a social profile only (https://www.facebook.com/bayshorecuts)"
},
{
"businessName": "Old Town Barber",
"address": "789 7th Ave, Tampa, FL 33605",
"phone": "(813) 555-0177",
"googleMapsUrl": "https://www.google.com/maps/place/Old+Town+Barber/...",
"websiteUrl": "http://oldtownbarbertampa.com/",
"category": "Barber shop",
"rating": 4.6,
"reviewCount": 64,
"websiteType": "REAL",
"ssl": false,
"pageSpeedScore": 42,
"isMobileResponsive": false,
"siteLoads": true,
"webPresenceCategory": "OUTDATED_WEBSITE",
"outreachPriority": "MEDIUM",
"outreachReason": "Website loads but no SSL (still on HTTP) and no mobile viewport meta tag"
},
{
"businessName": "Hair on Howard",
"address": "321 Howard Ave, Tampa, FL 33606",
"phone": "(813) 555-0123",
"googleMapsUrl": "https://www.google.com/maps/place/Hair+on+Howard/...",
"websiteUrl": "https://haironhoward.com/",
"category": "Hair salon",
"rating": 4.7,
"reviewCount": 215,
"websiteType": "DEAD",
"ssl": null,
"pageSpeedScore": null,
"isMobileResponsive": null,
"siteLoads": false,
"webPresenceCategory": "WEBSITE_UNREACHABLE",
"outreachPriority": "MEDIUM",
"outreachReason": "Website is listed but did not load (timed out, refused, or errored) — a strong pitch, but verify by hand: it may just be slow or blocking automated checks"
},
{
"businessName": "SoHo Salon Tampa",
"address": "654 Howard Ave, Tampa, FL 33606",
"phone": "(813) 555-0188",
"googleMapsUrl": "https://www.google.com/maps/place/SoHo+Salon+Tampa/...",
"websiteUrl": "https://www.sohosalontampa.com/",
"category": "Beauty salon",
"rating": 4.9,
"reviewCount": 1204,
"websiteType": "REAL",
"ssl": true,
"pageSpeedScore": 91,
"isMobileResponsive": true,
"siteLoads": true,
"webPresenceCategory": "HEALTHY",
"outreachPriority": "LOW",
"outreachReason": "Website loads with SSL and mobile viewport (PageSpeed mobile score 91/100)"
}
]

How fast and how big

  • Typical run: ~30–50 qualified leads in a couple of minutes. Results stream in as they're found, so you don't wait for the whole run to see data.
  • Per-search cap: Google Maps returns ~120 results per search area. For more, run the same query across several neighborhood values and merge the datasets.
  • Cost scales with maxResults. Proxy off (the default) is the fastest and lightest option; only turn it on if you actually get blocked.

FAQ

How many businesses can I get per run? Up to maxResults (max 200), but Google Maps itself caps a single search area at ~120. Use the neighborhood field to cover a big city district-by-district.

Can I get only the businesses that need a website? Yes — turn on onlyNoOrWeakWebsite. The output is then limited to HIGH + MEDIUM leads (no site, social/directory-only, outdated, or unreachable) and skips healthy sites. It's off by default so you get the full picture. Every business is still scraped and audited; the toggle only filters what's saved.

The filter is on and I got 0 results — is it broken? No. It means every business found in that search already has a healthy website, so none matched the filter. The run's status message says exactly that. Turn onlyNoOrWeakWebsite off to see the full list, or widen the search area.

Do I need a proxy? No — it's off by default and works for most searches, because the location comes from your query text, not your IP. Turn useProxy on only if you start seeing blocks/captchas or need strict same-country routing. It's slower.

Do I need the PageSpeed API key? No. Without it you still get every category and priority — you just don't get the numeric pageSpeedScore. The key is free (25,000 requests/day); setup is below.

The results aren't pre-sorted — why? Rows are written the instant each business is processed, so you see progress live. Every row carries outreachPriority, so sort or filter on that column in your spreadsheet/CRM in one click.

A business is marked HEALTHY but I think its site is bad — why? Categories use conservative, deterministic signals (SSL + mobile viewport + reachability). If a site is reachable and technically modern, it's HEALTHY even if it's ugly. Use pageSpeedScore to find slow-but-healthy sites worth a redesign pitch.

Is this allowed? It collects publicly visible business-listing information. You're responsible for using the data in line with applicable laws and platform terms — including marketing/anti-spam rules (e.g. CAN-SPAM, GDPR) when you run outreach.


Get a free PageSpeed API key (optional, 1 minute)

Adds the raw mobile Lighthouse score to every record — great for fine-grained sorting. Free, 25,000 requests/day.

  1. Go to console.cloud.google.com and create a project.
  2. APIs & Services → Library → "PageSpeed Insights API" → Enable.
  3. Credentials → Create credentials → API key. Copy it.
  4. Paste it into the pageSpeedApiKey input field.

Use cases

  • Web design agencies building targeted cold-outreach lists
  • Freelance developers who want HIGH-priority leads on tap
  • Local SEO consultants filtering by technical signal (OUTDATED_WEBSITE, low PageSpeed)
  • Cold-email tools — pipe directly into Instantly, Smartlead, or Apollo
  • CRM enrichment — augment HubSpot / Pipedrive with a current web-presence signal
  • Niche research — find categories where most local businesses are still offline

Limitations

  • Google Maps caps results at ~120 per search area. For bigger pulls, split by neighborhood and merge.
  • Lighthouse scores fluctuate ±5–10 points between runs — that's why they don't drive categorization.
  • Selectors can shift when Google A/B tests new layouts. The actor logs a one-time selector audit on the first place per run, so you see immediately if any field went null.
  • A site that fails to load is labeled WEBSITE_UNREACHABLE (MEDIUM), not HIGH — a plain fetch can be fooled by slow servers or bot-blocking, so treat it as "worth a manual look," not a guaranteed dead site. Anything we genuinely can't verify still defaults to HEALTHY, so real customers' sites aren't mislabeled.