WhatsApp Maps - All-in-One avatar

WhatsApp Maps - All-in-One

Pricing

from $0.01 / 1,000 results

Go to Apify Store
WhatsApp Maps - All-in-One

WhatsApp Maps - All-in-One

Search Google Maps by category and city, then automatically detect WhatsApp numbers from each business website. Get a ready-to-use lead list with name, address, phone, rating, and WhatsApp link — all in a single run.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

Fernando Lisboa

Fernando Lisboa

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

18 hours ago

Last modified

Share

Search Google Maps for businesses by category and city, then automatically detect WhatsApp numbers on their websites — all in a single run. Get a ready-to-use leads list with no manual steps.


What it does

This Actor combines two stages in one run:

Stage 1 — Google Maps Search Calls the Google Maps Scraper using your Apify token to fetch businesses matching your search query (e.g. "restaurantes em São Paulo"). Returns name, address, phone, website, rating, and more.

Stage 2 — WhatsApp Enrichment For every business that has a website, the Actor visits the page and scans it for WhatsApp contact information using four strategies, in order of reliability:

  1. Direct links — scans <a href> tags for wa.me/ or api.whatsapp.com/send?phone= links
  2. Meta tags — looks for WhatsApp numbers in <meta name="description"> and <meta property="og:description">
  3. Contact sections — searches visible text in footer, .contact, #contact, and elements with whatsapp in their class or id
  4. Full body fallback — scans the entire page body for any mention of "WhatsApp" or "Zap" followed by a phone number

All extracted numbers are validated against the E.164 standard (7–15 digits) to avoid false positives.


Input

Schema

FieldTypeRequiredDefaultDescription
searchQuerystringYesWhat to search on Google Maps (e.g. "restaurantes em São Paulo")
apifyTokenstringYesYour personal Apify API token — used to call Google Maps Scraper on your behalf
maxResultsintegerNo100Max number of places to fetch from Google Maps (1–1000)
maxConcurrencyintegerNo5Websites scraped in parallel during enrichment (1–20)
maxRetriesintegerNo2Retries per failed website request (0–5)
proxyConfigurationobjectNoApify ProxyProxy settings for the website enrichment phase

Where to find your Apify token

  1. Log in at console.apify.com
  2. Click your avatar → SettingsIntegrations
  3. Copy the Personal API token
  4. Paste it into the apifyToken field

The token is stored encrypted and never exposed in logs or outputs.

Input example

{
"searchQuery": "dentistas em Curitiba",
"apifyToken": "apify_api_xxxxxxxxxxxxxxxxxxxx",
"maxResults": 200,
"maxConcurrency": 5,
"maxRetries": 2,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Search query tips

  • Use the format "category in city" for best results
  • Write in the local language for more accurate Maps results
  • Examples:
    • "clínicas veterinárias em Belo Horizonte"
    • "academias de ginástica em Fortaleza"
    • "lojas de roupa em Florianópolis"
    • "salões de beleza em Brasília"

Output

Each business produces one record in the dataset. Fields from Google Maps are preserved alongside the enrichment results.

FieldTypeDescription
namestringBusiness name from Google Maps
websitestringWebsite URL from Google Maps
phonestring | nullPhone from Google Maps
addressstring | nullFull address from Google Maps
categorystring | nullBusiness category from Google Maps
ratingstring | nullGoogle Maps rating score
placeIdstring | nullGoogle Maps unique place ID
googleMapsUrlstring | nullDirect link to the Google Maps listing
whatsappNumberstring | nullWhatsApp number in raw digits (e.g. 5511999990000)
whatsappLinkstring | nullClickable link (e.g. https://wa.me/5511999990000)
whatsappSource"href" | "text" | "meta" | nullWhere the number was found on the page
hasWhatsAppbooleantrue if a valid WhatsApp number was found — use to filter results
extractedPhonestring | nullAny phone number found on the website (fallback)
extractedEmailstring | nullAny email address found on the website
scrapedUrlstringExact URL that was scraped
httpStatusnumber | nullHTTP response code (e.g. 200, 403, 404)
scrapedAtstringISO 8601 timestamp of when the page was scraped
errorstringOnly present if the request failed after all retries

Output example

{
"name": "Pizzaria do João",
"website": "https://pizzariadojoao.com.br",
"phone": "+55 11 99999-0000",
"address": "Rua das Flores, 123 - Centro, São Paulo - SP",
"category": "Pizzaria",
"rating": "4.7",
"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"googleMapsUrl": "https://www.google.com/maps/place/...",
"scrapedUrl": "https://pizzariadojoao.com.br",
"httpStatus": 200,
"whatsappNumber": "5511999990000",
"whatsappLink": "https://wa.me/5511999990000",
"whatsappSource": "href",
"hasWhatsApp": true,
"extractedPhone": "(11) 99999-0000",
"extractedEmail": "contato@pizzariadojoao.com.br",
"scrapedAt": "2025-01-15T14:32:00.000Z"
}

Billing and costs

This Actor runs two paid operations under your Apify account:

OperationBilled to
Google Maps Scraper (Stage 1)Your account, via your apifyToken
WhatsApp website enrichment (Stage 2)Whoever runs this Actor

Estimated cost for 100 businesses:

  • Google Maps Scraper: ~$0.50–$1.00 (varies by plan and result count)
  • WhatsApp enrichment (Cheerio, no browser): ~$0.05
  • Total: ~$0.55–$1.05 per 100 results

Tip: Use maxResults to control how many places are fetched and keep costs predictable.


Proxy configuration

Using proxies is strongly recommended for large runs to avoid IP blocks on websites:

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

To use your own proxies:

{
"proxyConfiguration": {
"useApifyProxy": false,
"proxyUrls": [
"http://user:password@proxy1.example.com:8000"
]
}
}

Performance tips

  • Set maxConcurrency between 3 and 10 for most runs. Higher values are faster but increase the chance of rate limiting.
  • Set maxRetries to 2 or 3 to handle transient network errors without wasting credits on permanently unavailable sites.
  • Only businesses with a website listed on Google Maps are enriched. Businesses without a website are skipped automatically.

Limitations and known behavior

  • JavaScript-heavy websites — This Actor uses a fast HTML scraper (Cheerio). Websites that load WhatsApp buttons dynamically via JavaScript may not be detected.
  • Social media URLs — Instagram, Facebook, and similar platforms block automated scraping. If a business lists a social media URL as its website on Google Maps, it will return not found.
  • Google Maps Scraper timeout — Stage 1 waits up to 10 minutes for the Maps Scraper to finish. For very large queries (500+ results), consider increasing your Actor timeout in Settings.
  • Number formatwhatsappNumber returns digits only (e.g. 5511999990000), compatible with wa.me/ links. No dashes, spaces, or plus signs.

FAQ

Q: Do I need a paid Apify plan? A: Yes. The Google Maps Scraper is a paid actor. You need Apify credits to run it. The WhatsApp enrichment phase uses very few credits on top of that.

Q: Is my Apify token safe? A: Yes. The apifyToken field is marked as a secret — the Apify platform encrypts it at rest and never exposes it in logs, outputs, or the UI after you save it.

Q: The Actor found fewer results than maxResults — why? A: Google Maps may return fewer results than requested for a given query. This is normal. Try a broader query or split it into multiple runs by neighborhood or subcategory.

Q: A business has WhatsApp but it returned not found — why? A: This usually happens when the WhatsApp button is loaded by JavaScript after the initial page load. This Actor scrapes static HTML only.

Q: Can I use this for businesses outside Brazil? A: Yes. WhatsApp link detection works globally. The Brazilian phone regex used for the extractedPhone fallback is Brazil-specific, but whatsappNumber detection works for any country.

Q: How do I filter only businesses with WhatsApp? A: After the run, use the Filter option in the dataset view and set hasWhatsApp = true. You can also export to CSV and filter in Excel or Google Sheets.