WhatsApp Maps - All-in-One
Pricing
from $0.01 / 1,000 results
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
Actor stats
0
Bookmarked
1
Total users
0
Monthly active users
18 hours ago
Last modified
Categories
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:
- Direct links — scans
<a href>tags forwa.me/orapi.whatsapp.com/send?phone=links - Meta tags — looks for WhatsApp numbers in
<meta name="description">and<meta property="og:description"> - Contact sections — searches visible text in
footer,.contact,#contact, and elements withwhatsappin their class or id - 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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQuery | string | Yes | — | What to search on Google Maps (e.g. "restaurantes em São Paulo") |
apifyToken | string | Yes | — | Your personal Apify API token — used to call Google Maps Scraper on your behalf |
maxResults | integer | No | 100 | Max number of places to fetch from Google Maps (1–1000) |
maxConcurrency | integer | No | 5 | Websites scraped in parallel during enrichment (1–20) |
maxRetries | integer | No | 2 | Retries per failed website request (0–5) |
proxyConfiguration | object | No | Apify Proxy | Proxy settings for the website enrichment phase |
Where to find your Apify token
- Log in at console.apify.com
- Click your avatar → Settings → Integrations
- Copy the Personal API token
- Paste it into the
apifyTokenfield
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.
| Field | Type | Description |
|---|---|---|
name | string | Business name from Google Maps |
website | string | Website URL from Google Maps |
phone | string | null | Phone from Google Maps |
address | string | null | Full address from Google Maps |
category | string | null | Business category from Google Maps |
rating | string | null | Google Maps rating score |
placeId | string | null | Google Maps unique place ID |
googleMapsUrl | string | null | Direct link to the Google Maps listing |
whatsappNumber | string | null | WhatsApp number in raw digits (e.g. 5511999990000) |
whatsappLink | string | null | Clickable link (e.g. https://wa.me/5511999990000) |
whatsappSource | "href" | "text" | "meta" | null | Where the number was found on the page |
hasWhatsApp | boolean | true if a valid WhatsApp number was found — use to filter results |
extractedPhone | string | null | Any phone number found on the website (fallback) |
extractedEmail | string | null | Any email address found on the website |
scrapedUrl | string | Exact URL that was scraped |
httpStatus | number | null | HTTP response code (e.g. 200, 403, 404) |
scrapedAt | string | ISO 8601 timestamp of when the page was scraped |
error | string | Only 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:
| Operation | Billed 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
maxResultsto 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
maxConcurrencybetween 3 and 10 for most runs. Higher values are faster but increase the chance of rate limiting. - Set
maxRetriesto 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 format —
whatsappNumberreturns digits only (e.g.5511999990000), compatible withwa.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.