FDN Google Map Master Scraper
Pricing
Pay per usage
FDN Google Map Master Scraper
Pricing
Pay per usage
Rating
0.0
(0)
Developer
The Profesor Baltazar
Maintained by CommunityActor 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
| Feature | Supported |
|---|---|
| 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)
- Open https://console.apify.com/actors/1nuEIgtSbhTsKBb2W
- Click Run (or Try for free)
- In the Input tab, paste your search queries, one per line:
food manufacturer Chicago ILfood production facility Chicago IL
- Set Max results per query to e.g.
100 - (Recommended) turn on Scrape detail pages and Scrape contact info
- Click Start β watch the log for
Pushed place #N - 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 statuscurl "https://api.apify.com/v2/actor-runs/RUN_ID?token=$TOKEN"# results as CSVcurl "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 ApifyClientclient = 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().itemsprint(f"Got {len(items)} businesses")
π― Use cases
| Use case | How |
|---|---|
| Lead generation (name, phone, email, website) | queries + scrapeContacts |
| 10,000-row food-industry list | see the dedicated guide below |
| Competitor & market research | queries per niche/city, then filter by category |
| Location/geo enrichment | latitude, longitude, plus_code, timezone on every row |
| Reputation monitoring | scrapeReviews + ratings per place |
| Rescrape a known list | feed previous run's place_id column back into placeIds |
| Multi-country expansion | set language / country per run |
βοΈ Full input reference
| Field | Type | Required | Default | MinβMax | Description |
|---|---|---|---|---|---|
queries | string[] | β οΈ one of | β | 1β100 | Google Maps search queries, e.g. food manufacturer Chicago IL |
placeIds | string[] | β οΈ one of | β | 1β300 | Direct Google Place IDs (ChIJ...) β output place_id feeds straight back in |
startUrls | string[] | β οΈ one of | β | 1β300 | Direct Google Maps URLs (/maps/place/..., /maps/search/...) |
location | string | β | β | β | Optional location context (usually already inside the query) |
maxResults | integer | β | 20 | 1β300 | Max places per query (per query, not total) |
scrapeDetails | boolean | β | false | β | Open each business detail page β full record. 3β5Γ slower |
scrapeContacts | boolean | β | false | β | Fetch each business website β emails + social links (requires scrapeDetails: true) |
scrapeReviews | boolean | β | false | β | Extract reviews |
maxReviews | integer | β | 0 | 0β1000 | Reviews per place (0 = none, fastest) |
scrapePhotos | boolean | β | false | β | Extract photo URLs |
maxPhotos | integer | β | 0 | 0β100 | Photos per place |
language | string | β | en | ISO 639-1 | Results language (en, es, frβ¦) |
country | string | β | us | ISO 3166-1 | Results country (us, gbβ¦) |
proxyConfiguration | object | β | Apify proxy | β | See Proxy section. Use RESIDENTIAL |
β οΈ At least one of
queries,placeIds, orstartUrlsis 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
| Field | Type | Description | Example |
|---|---|---|---|
place_id | string | Canonical Google Maps place ID | ChIJMTPiK98sDogRyvG0QTKkxK8 |
name | string | Business name | The Fresh Factory |
category | string | Primary Google category | Food manufacturer |
address | string | Full address (best from detail page) | 1937 N Damen Ave, Chicago, IL 60647 |
latitude | string | Latitude | 41.9170698 |
longitude | string | Longitude | -87.6773214 |
plus_code | string | Open Location Code | W88F+R3 |
phone | string | Phone (Google often masks: +177****0900) | +131****1000 |
website | string | Business website | https://thefreshfactory.co/ |
emails | string | Emails found on the website (comma-separated) β only with scrapeContacts | sales@thefreshfactory.co |
social_links | string | key=value pairs, comma-separated | facebook=fb.com/... |
rating | string | Star rating 0β5 | 5.0 |
reviews_count | string | Total review count | 2 |
price_level | string | Dollar-sign count 1β4 | 2 |
price_range | string | Visual price range | $$ |
opening_hours | string | Day: time entries, semicolon-separated | Monday: 8:00 AM - 5:00 PM;β¦ |
is_claimed | string | Profile claimed by owner | true |
amenities | string | Service options (delivery, takeoutβ¦) | Delivery, Takeout |
query | string | Which search query found this place | food manufacturer Chicago IL |
rank | string | Position in the run output | 1 |
scraped_at | string | UTC timestamp | 2026-10-01T15:30:44Z |
parse_path | string | Extractor used: search_feed or detail_page | detail_page |
parse_confidence | string | 0β1 confidence score for the record | 0.95 |
warnings | string | Field-level parse warnings, comma-separated | phone_missing,website_missing |
contact_enriched | string | Whether the website was visited for contacts | true |
π§ How parse_path affects what you get
| Extract path | When used | Fields typically populated | Speed |
|---|---|---|---|
search_feed | scrapeDetails: false | name, category, address, rating, reviews_count, place_id, (lat/lng if in feed) | fast (~1β2 s/place) |
detail_page | scrapeDetails: true | everything: full address, phone, website, hours, price, claimed, amenities | 3β5Γ slower (~2β4 s/place) |
π‘ Emails require both flags:
scrapeContactsworks by fetching each business website during the detail-page visit, so setscrapeDetails: trueandscrapeContacts: truefor 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 ILfood production facility Chicago ILfood processing plant Chicago ILfood & beverage manufacturer Chicago ILfood distributor Chicago IL
Recommended production input
{"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:
| Strategy | Example queries |
|---|---|
| 1. Add cities / states | food manufacturer IL, food manufacturer Ohio, food manufacturer Texas⦠|
| 2. Add adjacent verticals | food packaging Chicago, bakery equipment Chicago, ingredient supplier Chicago, food truck manufacturer Chicago |
| 3. Grid-split a city by niche | co-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.
| Group | Best for | Notes |
|---|---|---|
RESIDENTIAL | Google Maps (recommended) | Requires a paid Apify residential plan |
UNBLOCKER | Anti-bot / CAPTCHA-heavy targets | Paid plan |
StaticUS3 | General US datacenter | All plans |
BUYPROXIES94952 | Extra residential pool | If configured on account |
| (none) | Fallback | Works 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 withbrowser-use.
π° Pricing (as configured on the platform)
Verified live from the actor's public store page (2026-10-01):
| Item | Value |
|---|---|
| Billing model | Pay per usage (platform usage only) |
| Actor itself | Free to run β no per-place charge currently |
| Platform usage | Apify 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)
| Scale | Places | Estimated platform usage |
|---|---|---|
| Test | 100 | ~$0.20 |
| Small campaign | 1,000 | ~$2.00 |
| Large campaign | 10,000 | ~$20.00 |
Memory 4β8 GB, default timeout 3,600 s.
π§ Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Run finished green but dataset empty | Google throttled/blocked the request | Re-run later; lower maxResults; enable RESIDENTIAL proxy |
Query "..." returned 0 places in log | Same as above (temporary Google block) | Wait, re-run; the actor rotates proxies per query |
Proxy group RESIDENTIAL has no paying subscribers | No residential capacity on account | Fallback is automatic; buy residential for sustained runs |
| Only 3 results per query | maxResults left tiny, or consent wall | Verify maxResults in run input; re-run |
phone shows +177****0900 | Google masks phones β not a bug | Unmasked numbers come from scrapeContacts (business website) |
emails empty | scrapeContacts off, or website has no public email | Turn scrapeContacts: true; expect only 30β50% hit rate |
opening_hours / price_range empty | Not shown in search feed | Enable scrapeDetails: true |
| Run too slow | scrapeDetails / scrapeContacts on for thousands of places | Reduce maxResults; batch; keep detail mode off for pure lead lists |
Sample Business 0-0 rows | Used a build older than 1.1 (old stub) | Re-run on latest (1.9.1) β stub removed |
π§ͺ What was verified (live, 2026-10-01)
| Check | Result |
|---|---|
| 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"}
π Related resources
- Apify Actors docs: https://docs.apify.com/actors
- Apify API reference: https://docs.apify.com/api/v2
apify-client(Python): https://pypi.org/project/apify-client/- Apify MCP for AI agents: https://mcp.apify.com
Last updated: 2026-10-01 Β· Maintainer: sitcod3.lab