FDN Google Map Master Scraper avatar

FDN Google Map Master Scraper

Pricing

Pay per usage

Go to Apify Store
FDN Google Map Master Scraper

FDN Google Map Master Scraper

Pricing

Pay per usage

Rating

0.0

(0)

Developer

The Profesor Baltazar

The Profesor Baltazar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

🌐 FDN Google Map Master Scraper

Extract comprehensive Google Maps business data β€” listings, contacts, emails, reviews, photos, and opening hours β€” no API key required.

Actor: sitcod3.lab/fdn-google-map-master-scraper Console: https://console.apify.com/actors/1nuEIgtSbhTsKBb2W Status: βœ… Live & verified (build 1.9.1)


πŸ“– What does it do?

The FDN Google Map Master Scraper searches Google Maps for businesses matching your queries and returns one structured dataset record per place. It optionally:

  • Opens each business detail page for the full ~25-field record (scrapeDetails)
  • Visits each business website to find emails and social media profiles (scrapeContacts)
  • Collects reviews, photos, opening hours, popular times, rating breakdowns, and amenities

It works exactly like a human using Google Maps: real browser (Playwright), auto-accepts the consent dialog, scrolls the results feed, and deduplicates on Google's canonical place_id.


βœ… Feature overview

FeatureSupported
Search by keyword + locationβœ”οΈ queries ("food manufacturer Chicago IL")
Scrape by exact Google Place IDβœ”οΈ placeIds (ChIJ...)
Scrape by direct Google Maps URLβœ”οΈ startUrls (/maps/place/..., /maps/search/...)
Detail-page enrichment (~25 fields/place)βœ”οΈ scrapeDetails
Email + social media extraction from websitesβœ”οΈ scrapeContacts
Reviews with owner repliesβœ”οΈ scrapeReviews + maxReviews
Photo URLsβœ”οΈ scrapePhotos + maxPhotos
Opening hours & popular timesβœ”οΈ always (detail mode)
Rating / review count / price levelβœ”οΈ always
Parse confidence score + field warningsβœ”οΈ every record
Deduplication on Google place IDsβœ”οΈ built-in (across all queries)
Proxy rotation with verified fallbackβœ”οΈ RESIDENTIAL β†’ UNBLOCKER β†’ StaticUS3 β†’ direct
Multi-language / multi-countryβœ”οΈ language + country
10,000-row lead campaignsβœ”οΈ see the 10k guide below

πŸš€ Quick start (60 seconds)

Option A β€” Apify Console (no code)

  1. Open https://console.apify.com/actors/1nuEIgtSbhTsKBb2W
  2. Click Run (or Try for free)
  3. In the Input tab, paste your search queries, one per line:
food manufacturer Chicago IL
food production facility Chicago IL
  1. Set Max results per query to e.g. 100
  2. (Recommended) turn on Scrape detail pages and Scrape contact info
  3. Click Start β€” watch the log for Pushed place #N
  4. When finished β†’ Dataset tab β†’ Export β†’ CSV / JSON / Excel

Option B β€” API (curl)

TOKEN="apify_api_XXXX"
curl -X POST "https://api.apify.com/v2/acts/sitcod3.lab~fdn-google-map-master-scraper/runs?token=$TOKEN" \
-H "Content-Type: application/json" \
-d '{
"queries": ["food manufacturer Chicago IL"],
"maxResults": 100,
"scrapeDetails": true,
"scrapeContacts": true
}'

Then check the run and download results:

# run status
curl "https://api.apify.com/v2/actor-runs/RUN_ID?token=$TOKEN"
# results as CSV
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=$TOKEN&format=csv" -o results.csv

Option C β€” Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient("apify_api_XXXX")
run = client.actor("sitcod3.lab/fdn-google-map-master-scraper").call(
run_input={
"queries": ["food manufacturer Chicago IL"],
"maxResults": 100,
"scrapeDetails": True,
"scrapeContacts": True,
}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"Got {len(items)} businesses")

🎯 Use cases

Use caseHow
Lead generation (name, phone, email, website)queries + scrapeContacts
10,000-row food-industry listsee the dedicated guide below
Competitor & market researchqueries per niche/city, then filter by category
Location/geo enrichmentlatitude, longitude, plus_code, timezone on every row
Reputation monitoringscrapeReviews + ratings per place
Rescrape a known listfeed previous run's place_id column back into placeIds
Multi-country expansionset language / country per run

βš™οΈ Full input reference

FieldTypeRequiredDefaultMin–MaxDescription
queriesstring[]⚠️ one ofβ€”1–100Google Maps search queries, e.g. food manufacturer Chicago IL
placeIdsstring[]⚠️ one ofβ€”1–300Direct Google Place IDs (ChIJ...) β€” output place_id feeds straight back in
startUrlsstring[]⚠️ one ofβ€”1–300Direct Google Maps URLs (/maps/place/..., /maps/search/...)
locationstringβŒβ€”β€”Optional location context (usually already inside the query)
maxResultsinteger❌201–300Max places per query (per query, not total)
scrapeDetailsboolean❌falseβ€”Open each business detail page β†’ full record. 3–5Γ— slower
scrapeContactsboolean❌falseβ€”Fetch each business website β†’ emails + social links (requires scrapeDetails: true)
scrapeReviewsboolean❌falseβ€”Extract reviews
maxReviewsinteger❌00–1000Reviews per place (0 = none, fastest)
scrapePhotosboolean❌falseβ€”Extract photo URLs
maxPhotosinteger❌00–100Photos per place
languagestring❌enISO 639-1Results language (en, es, fr…)
countrystring❌usISO 3166-1Results country (us, gb…)
proxyConfigurationobject❌Apify proxyβ€”See Proxy section. Use RESIDENTIAL

⚠️ At least one of queries, placeIds, or startUrls is required. The actor fails fast with a clear message otherwise.

Example full input (JSON)

{
"queries": [
"food manufacturer Chicago IL",
"food production facility Chicago IL",
"food processing plant Chicago IL",
"food & beverage manufacturer Chicago IL",
"food distributor Chicago IL"
],
"location": "Chicago, IL",
"maxResults": 300,
"scrapeDetails": true,
"scrapeContacts": true,
"scrapeReviews": false,
"maxReviews": 0,
"scrapePhotos": false,
"maxPhotos": 0,
"language": "en",
"country": "us",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

πŸ“€ Output β€” every field explained

FieldTypeDescriptionExample
place_idstringCanonical Google Maps place IDChIJMTPiK98sDogRyvG0QTKkxK8
namestringBusiness nameThe Fresh Factory
categorystringPrimary Google categoryFood manufacturer
addressstringFull address (best from detail page)1937 N Damen Ave, Chicago, IL 60647
latitudestringLatitude41.9170698
longitudestringLongitude-87.6773214
plus_codestringOpen Location CodeW88F+R3
phonestringPhone (Google often masks: +177****0900)+131****1000
websitestringBusiness websitehttps://thefreshfactory.co/
emailsstringEmails found on the website (comma-separated) β€” only with scrapeContactssales@thefreshfactory.co
social_linksstringkey=value pairs, comma-separatedfacebook=fb.com/...
ratingstringStar rating 0–55.0
reviews_countstringTotal review count2
price_levelstringDollar-sign count 1–42
price_rangestringVisual price range$$
opening_hoursstringDay: time entries, semicolon-separatedMonday: 8:00 AM - 5:00 PM;…
is_claimedstringProfile claimed by ownertrue
amenitiesstringService options (delivery, takeout…)Delivery, Takeout
querystringWhich search query found this placefood manufacturer Chicago IL
rankstringPosition in the run output1
scraped_atstringUTC timestamp2026-10-01T15:30:44Z
parse_pathstringExtractor used: search_feed or detail_pagedetail_page
parse_confidencestring0–1 confidence score for the record0.95
warningsstringField-level parse warnings, comma-separatedphone_missing,website_missing
contact_enrichedstringWhether the website was visited for contactstrue

🧭 How parse_path affects what you get

Extract pathWhen usedFields typically populatedSpeed
search_feedscrapeDetails: falsename, category, address, rating, reviews_count, place_id, (lat/lng if in feed)fast (~1–2 s/place)
detail_pagescrapeDetails: trueeverything: full address, phone, website, hours, price, claimed, amenities3–5Γ— slower (~2–4 s/place)

πŸ’‘ Emails require both flags: scrapeContacts works by fetching each business website during the detail-page visit, so set scrapeDetails: true and scrapeContacts: true for a lead list (name, address, phone, website, email). For complete records also turn on reviews/photos. Budget ~3–6 s per place.


πŸ“¦ The 10,000-row food-industry guide (Chicago IL)

Target: 10,000 food-manufacturing businesses in Chicago with contact emails.

The 5 queries

food manufacturer Chicago IL
food production facility Chicago IL
food processing plant Chicago IL
food & beverage manufacturer Chicago IL
food distributor Chicago IL
{
"queries": [
"food manufacturer Chicago IL",
"food production facility Chicago IL",
"food processing plant Chicago IL",
"food & beverage manufacturer Chicago IL",
"food distributor Chicago IL"
],
"location": "Chicago, IL",
"maxResults": 300,
"scrapeDetails": true,
"scrapeContacts": true,
"language": "en",
"country": "us",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

πŸ›‘ Read this before promising 10,000 rows

Chicago does not contain 10,000 food-manufacturing businesses. These five queries overlap heavily β€” measured live yield was ~114 unique businesses from 25-per-query (5 queries). At the max 300 per query the real ceiling is a few hundred unique rows, not 10,000. The scraper is not the bottleneck β€” the number of real businesses in the niche is.

To actually reach 10,000 unique rows, widen the scope with the client's agreement before billing:

StrategyExample queries
1. Add cities / statesfood manufacturer IL, food manufacturer Ohio, food manufacturer Texas…
2. Add adjacent verticalsfood packaging Chicago, bakery equipment Chicago, ingredient supplier Chicago, food truck manufacturer Chicago
3. Grid-split a city by nicheco-packer Chicago, bottling plant Chicago, bakery production Chicago, cold storage Chicago

🧾 Emails β€” the honest expectation

  • Emails only appear when scrapeContacts: true, and only for businesses whose website publishes an address.
  • Expect a minority of rows to have an email (typical hit rate 30–50% of businesses with websites).
  • A 10,000-row job will not produce 10,000 emails β€” it will produce 10,000 businesses, some fraction with verified contact emails.

πŸ”Œ Proxy setup (critical for Google Maps)

The actor probes proxy groups in order and uses the first one that actually reaches the internet, then falls back to a direct connection.

GroupBest forNotes
RESIDENTIALGoogle Maps (recommended)Requires a paid Apify residential plan
UNBLOCKERAnti-bot / CAPTCHA-heavy targetsPaid plan
StaticUS3General US datacenterAll plans
BUYPROXIES94952Extra residential poolIf configured on account
(none)FallbackWorks but Google may throttle large jobs

Input:

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

⚠️ If your account has no residential proxy capacity, the log will say Proxy group RESIDENTIAL has no paying subscribers β€” the actor falls back automatically and still works, but large sustained jobs may get throttled. For heavy 10k+ runs, enable Apify residential proxy or run from your own machine with browser-use.


πŸ’° Pricing (as configured on the platform)

Verified live from the actor's public store page (2026-10-01):

ItemValue
Billing modelPay per usage (platform usage only)
Actor itselfFree to run β€” no per-place charge currently
Platform usageApify compute/memory/proxy β€” billed by Apify at platform rates, cheaper with volume

⚠️ The actor currently has no pay-per-event monetization enabled. If you want to charge clients per scraped place (e.g. $2.00 / 1,000), enable Monetize β†’ Pay per event in Apify Console; until then every run is free (plus platform usage).

Typical platform-usage budgets (routes β‰ˆ $0.002/place of compute)

ScalePlacesEstimated platform usage
Test100~$0.20
Small campaign1,000~$2.00
Large campaign10,000~$20.00

Memory 4–8 GB, default timeout 3,600 s.


πŸ”§ Troubleshooting

SymptomCauseFix
Run finished green but dataset emptyGoogle throttled/blocked the requestRe-run later; lower maxResults; enable RESIDENTIAL proxy
Query "..." returned 0 places in logSame as above (temporary Google block)Wait, re-run; the actor rotates proxies per query
Proxy group RESIDENTIAL has no paying subscribersNo residential capacity on accountFallback is automatic; buy residential for sustained runs
Only 3 results per querymaxResults left tiny, or consent wallVerify maxResults in run input; re-run
phone shows +177****0900Google masks phones β€” not a bugUnmasked numbers come from scrapeContacts (business website)
emails emptyscrapeContacts off, or website has no public emailTurn scrapeContacts: true; expect only 30–50% hit rate
opening_hours / price_range emptyNot shown in search feedEnable scrapeDetails: true
Run too slowscrapeDetails / scrapeContacts on for thousands of placesReduce maxResults; batch; keep detail mode off for pure lead lists
Sample Business 0-0 rowsUsed a build older than 1.1 (old stub)Re-run on latest (1.9.1) β€” stub removed

πŸ§ͺ What was verified (live, 2026-10-01)

CheckResult
Buildβœ… SUCCEEDED (1.9.1, Playwright + Chromium)
Live run on Google Mapsβœ… real businesses collected, no fixtures
Place IDsβœ… all canonical ChIJ...
Deduplication across queriesβœ… 0 duplicates (114 unique / 114)
Detail-page enrichmentβœ… working
search_feed fallbackβœ… name/category/address/rating/reviews_count
Output schemaβœ… 25 fields, validated

πŸ” Input / output JSON example (full record)

{
"place_id": "ChIJMTPiK98sDogRyvG0QTKkxK8",
"name": "The Fresh Factory",
"category": "Food manufacturer",
"address": "1937 N Damen Ave, Chicago, IL 60647",
"latitude": "41.9170698",
"longitude": "-87.6773214",
"plus_code": "W88F+R3",
"phone": "+177****0900",
"website": "https://thefreshfactory.co/",
"emails": "sales@thefreshfactory.co",
"social_links": "facebook=fb.com/thefreshfactory",
"rating": "5.0",
"reviews_count": "2",
"price_level": "2",
"price_range": "$$",
"opening_hours": "Monday: 8:00 AM - 5:00 PM; Tuesday: 8:00 AM - 5:00 PM",
"is_claimed": "true",
"amenities": "Delivery, Takeout",
"query": "food manufacturer Chicago IL",
"rank": "1",
"scraped_at": "2026-10-01T15:30:44Z",
"parse_path": "detail_page",
"parse_confidence": "0.95",
"warnings": "phone_missing",
"contact_enriched": "true"
}

Last updated: 2026-10-01 Β· Maintainer: sitcod3.lab