Google Maps Email & Social Enricher avatar

Google Maps Email & Social Enricher

Pricing

from $2.40 / 1,000 lead-results

Go to Apify Store
Google Maps Email & Social Enricher

Google Maps Email & Social Enricher

Find emails and social profiles for businesses on Google Maps. Enriches each listing with up to four social profiles (LinkedIn, Facebook, Instagram, Twitter) and emails surfaced from the business website's home, contact, and about pages. Pay-per-lead pricing, CSV-friendly flat output.

Pricing

from $2.40 / 1,000 lead-results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

7.2 days

Issues response

6 days ago

Last modified

Share

Google Maps Email & Social Enricher

Find emails, social profiles, and contact data for businesses discovered on Google Maps. Bridges the gap between a physical Google Maps listing and digital outreach (email + social) — built for B2B cold outreach, lead-gen agencies, and local-SEO marketers.

V1 stays deliberately shallow on the website side (homepage + a small number of likely contact / about pages, capped by maxCrawledPages) so runs are fast and cost-predictable. You pay one flat event per business pushed to the dataset that contains at least one of: website, email, or social link.

✨ Why this scraper

  • Maps + website in one pass — 16 flat fields per business covering Google Maps metadata plus emails and four social profiles.
  • Shallow by design — homepage + up to maxCrawledPages-1 extra contact / about pages per site. No deep crawling, no AI, no review scraping.
  • Pay-Per-Event — one flat lead-result event per saved business that has at least one contact point. Empty rows are pushed for completeness but never charged.
  • Place URLs and search queries — supply queries, direct Google Maps URLs, or both.
  • CSV-friendly output — flat structure, no nested objects, drops cleanly into Sheets / Excel / CRMs.

🚀 Quick start — sample inputs

Example 1 — single query

{
"queries": ["Digital Marketing Agency London"],
"maxResults": 10,
"extractEmails": true,
"extractSocials": true,
"maxCrawledPages": 3,
"proxyConfiguration": { "useApifyProxy": true }
}

Example 2 — mix queries with direct Maps URLs, custom residential via your own provider

{
"queries": ["Plumbers in Brooklyn", "Electricians in Sydney NSW"],
"startUrls": [
"https://www.google.com/maps/place/?q=place_id:ChIJN1t_tDeuEmsRUoP3ySjGub4",
"https://www.google.com/maps/search/dentists+in+melbourne+vic"
],
"maxResults": 200,
"extractEmails": true,
"extractSocials": true,
"maxCrawledPages": 3,
"deDuplication": true,
"proxyConfiguration": {
"useApifyProxy": false,
"proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]
}
}

The actor blocks Apify Residential proxy; if you need residential routing, supply your own provider via proxyConfiguration.proxyUrls as shown. See 🚦 Proxy policy below.


📦 Output

The dataset has one view: Business leads — a 16-column flat table. Every row is the same shape; fields that were not found are returned as "".

Business leads — table view

Output fields (16)

placeId, title, website, phone, emails, linkedin, facebook, instagram, twitter, category, address, city, zipCode, mapUrl, scraped_at, is_enriched.

Sample record — Business leads

{
"placeId": "0x48761b292e45619f:0x9aca541f20fc060",
"title": "Influence Digital",
"website": "https://influence.digital/",
"phone": "+44 20 7034 2669",
"emails": "info@influence.digital",
"linkedin": "https://linkedin.com/company/the-united-agency",
"facebook": "https://facebook.com/InfluenceDGTL",
"instagram": "https://instagram.com/influencedgtl",
"twitter": "https://twitter.com/InfluenceDGTL",
"category": "Marketing agency",
"address": "Second Home Spitalfields, 68 Hanbury St",
"city": "",
"zipCode": "",
"mapUrl": "https://www.google.com/maps/place/Influence+Digital/data=!4m7!3m6!1s0x48761b292e45619f:0x9aca541f20fc060!8m2!3d51.5200292!4d-0.0703168!16s%2Fg%2F11btm9p_tl!19sChIJn2FFLikbdkgRYMAP8kGlrAk",
"scraped_at": "2026-05-10T01:06:39.345Z",
"is_enriched": true
}

is_enriched is true whenever the row has at least one of: website, emails, linkedin, facebook, instagram, twitter. The lead-result event is charged only for enriched rows.


💰 Pricing

Pay-Per-Event. One flat event per saved row that has any contact point (final per-event price is configured on the Apify console):

EventCharged when
lead-resultOnce per business pushed to the dataset that contains at least one of: website, emails, or any social profile URL.

So your bill is count_of_enriched_rows × price_per_event.

The actor honours the user-configured per-run spending cap (Apify eventChargeLimitReached) and stops cleanly when reached.

Not charged

  • Rows with no website, no email, and no social link — pushed for completeness, but is_enriched: false and not billed.
  • Duplicates (de-duplicated by Google Place ID).
  • Rows missing a title (filtered out).
  • Failed dataset pushes.
  • Failed website fetches when no contact data was found.
  • Anything after the per-run spending cap is reached.

🚦 Proxy policy

Use Apify Datacenter proxy or no proxy for normal runs — both work reliably for Google Maps search and shallow website fetches at this actor's conservative concurrency.

Apify Residential proxy is not supported. The actor will fail at startup if proxyConfiguration.apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

📊 Run summary

After each run, a RUN_SUMMARY entry is written to the key-value store:

{
"inputs_total": 2,
"businesses_found": 100,
"websites_enriched": 68,
"emails_found": 75,
"charged_events": 60,
"runtime_seconds": 240,
"scraped_at": "2026-05-09T00:00:00.000Z"
}

charged_events always equals the number of dataset rows where is_enriched === true (and is bounded by the user's spending cap).


⚙️ Inputs

FieldTypeDefaultPurpose
queriesArray[]Google Maps search terms.
startUrlsArray[]Direct Google Maps place URLs or search URLs.
maxResultsInteger50Run-wide cap on businesses processed (hard ceiling 5000).
extractEmailsBooleantrueScan website pages for email addresses.
extractSocialsBooleantrueDetect LinkedIn / Facebook / Instagram / Twitter URLs.
maxCrawledPagesInteger3Pages fetched per business website (homepage + contact / about).
proxyConfigurationObject{ "useApifyProxy": true }Apify Proxy settings (Apify Residential is rejected at startup).
deDuplicationBooleantrueSkip duplicate businesses by Google Place ID.

At least one of queries or startUrls must be provided.


🚧 Limitations (V1)

  • Cards-only Maps extraction for search queries: V1 reads each business directly from the search results panel and does not click into individual place detail panels. Phone, website, full address, and placeId only appear when Google surfaces them on the card. Direct Maps place URLs (via startUrls) read the full panel.
  • Shallow website extraction: homepage + up to maxCrawledPages-1 extra pages (default 3 total). No deep crawling, no JS-rendered pages.
  • No email verification, deliverability checks, or AI scoring.
  • No phone-number enrichment from the website (only the Maps phone is included).
  • No login / cookie / session-based scraping.
  • Address parsing into city / zipCode is best-effort; the full address field is the source of truth.
  • Per-run hard cap is 5000 results; per-website page cap is 5.

🛠️ Technical notes

  • Stack: Node.js 18+ · Apify SDK 3 · Crawlee · Puppeteer (Maps) · Cheerio + native fetch (websites).
  • Concurrency: Maps min=1, max=3 (conservative); website pool =5.
  • Memory: 1 GB min · 2 GB default · 4 GB max.
  • Per-page timeout: 15s; per-business budget: 45s; Maps handler timeout: 120s.
  • Diagnostics: On the first Maps render failure (no feed, zero cards, or no place panel), the actor saves the page HTML and URL to the key-value store as debug-no-feed-html / debug-zero-cards-html / debug-no-place-panel-html.