Google Maps By WebUnlocker
Pricing
Pay per event
Google Maps By WebUnlocker
The fastest, most cost-effective Google Maps scraper on Apify. Extract 20-30 businesses per request at 50-70% lower cost than competitors. Get names, ratings, reviews, phone numbers, websites, addresses, coordinates, and 50-100+ photos per place with Deep Photo Scrape mode.
Pricing
Pay per event
Rating
5.0
(2)
Developer

WebUnlocker
Actor stats
0
Bookmarked
7
Total users
3
Monthly active users
a day ago
Last modified
Categories
Share
πΊοΈ Google Maps by WebUnlocker
The fastest, most cost-effective Google Maps scraper on Apify. Extract businesses with names, ratings, reviews, phone numbers, websites, addresses, coordinates, price levels ($-$$$$), opening hours, weekly schedules, timezone, business descriptions, and 50-100+ photos per place. Perfect for lead generation, market research, and competitive analysis.
π v3.0 - Latest Release!
π° Just $3/1,000 places - Best value on Apify!
- πΈ Improved Photo Extraction - More accurate photo-to-place matching
- π― Enhanced Deep Photo Scrape - Reliable 50-100+ photos per place
- π Timezone Detection - IANA timezone for every place (e.g.,
America/New_York,Europe/Paris) - π Weekly Hours - Full 7-day schedule with open/close times
- π Business Descriptions - Review snippets and business summaries
- β‘ Blazing fast - 10x faster than browser scrapers
- π― 30+ data fields - Most comprehensive Google Maps data
β¨ Key Features
- β‘ 10x faster than browser-based scrapers
- π° Best value: $3/1K places with MORE features included
- π NEW! Timezone - Automatic IANA timezone detection from coordinates
- π NEW! Weekly hours - Full 7-day business schedule
- π NEW! Descriptions - Business descriptions and review snippets
- π FREE filters: Rating, website, closed status (competitors charge extra!)
- π² Price level included: $, $$, $$$, $$$$ extraction
- π Opening hours included: Current status and hours
- β Deep Gathering (Premium): Get 100-500+ results with intelligent multi-area search
- πΈ Deep Photo Scrape: Get 50-100+ HD photos per business
- π― Clean data: Structured JSON with all business details
- π GPS Coordinate Search: Search by lat/lng with custom radius
- π Global Support: Phone formatting for 18+ countries, timezones for all regions
- π Reliable: High success rate with automatic retries
π Two Modes
π Normal Mode (Default)
Simple, fast single search. Returns whatever Google gives you (typically 20-40 results).
- β Quick results in ~15-20 seconds
- β Great for basic searches
- β Low cost
β Deep Gathering (Premium)
Get more results with our premium deep search technology.
- β 50 results per page (set pages: 1-10)
- β 2 pages = ~100 results, 3 pages = ~150 results
- β Up to 500 results per search
- β Premium pricing per page
| Pages | Max Results | Best For |
|---|---|---|
| 1 | 50 | Quick overview |
| 2 | 100 | Standard project |
| 3 | 150 | Comprehensive list |
| 5 | 250 | Market research |
| 10 | 500 | Full city coverage |
β‘ Why Choose This Scraper?
| Feature | WebUnlocker | Outscraper | Compass |
|---|---|---|---|
| Base price | $3/1K π | $3/1K | $4/1K |
| Speed | 10x faster | Browser-based | Browser-based |
| Timezone | β Included | β Not available | β Not available |
| Weekly hours | β Included | Extra | $2/1K extra |
| Descriptions | β Included | Extra | Extra |
| Rating filter | β FREE | Limited | $1/1K extra |
| Website filter | β FREE | β | $1/1K extra |
| Price level | β Included | Extra | $2/1K extra |
| Opening hours | β Included | Extra | $2/1K extra |
| Photos | 0-4 FREE* | $2-3/1K | $0.50/1K |
*Standard mode: 0-4 photos depending on availability. Photos not guaranteed. For reliable photo extraction, use Deep Photo Scrape.
π° Pricing
Pay per event - Simple, transparent pricing!
| Event | Price | Description |
|---|---|---|
| Place scraped | $3.00 / 1,000 π | Each business/place extracted |
| Standard photos | FREE | 0-4 photos per place (not guaranteed, depends on availability) |
| Filters applied | FREE | Rating, website, closed - no extra charge! |
| Timezone | FREE | IANA timezone included for every place |
| Weekly hours | FREE | Full 7-day schedule included |
| Descriptions | FREE | Business descriptions included |
| Price level | FREE | Included in base price |
| Opening hours | FREE | Included in base price |
| Deep photo scrape | $0.40 / 1,000 | β RECOMMENDED: 50-100+ photos guaranteed per place |
| Actor start | $0.003 | One-time fee per run |
| Platform usage | Free | Included in plan |
β οΈ Photo Tip: Standard mode extracts photos from search results only (0-4 photos, not guaranteed). For reliable, high-quality photo extraction, always use Deep Photo Scrape which visits each place's gallery.
Cost Examples
| Use Case | Places | Photos | Total Cost |
|---|---|---|---|
| Quick search | 100 | 0-4 FREE (not guaranteed) | ~$0.30 |
| Lead gen (rating β₯4.0, has website) | 1,000 | No | ~$3.00 |
| Business list | 1,000 | No | ~$3.00 |
| With photos (recommended) | 1,000 | 50+ per place | ~$23.00 |
| Large dataset | 10,000 | No | ~$30.00 |
Note: Standard mode photos depend on Google's search response and are NOT guaranteed. For best results, always enable Deep Photo Scrape which visits each place's gallery to extract 50-100+ photos.
π‘ Why Choose Us Over Competitors?
β Our Advantages
| Feature | WebUnlocker | Compass | Why It Matters |
|---|---|---|---|
| Standard Photos | β 5-10 FREE | $0.50 / 1K images | No extra cost for basic photos |
| Deep Photos | $0.40 / 1K | $0.50 / 1K images | 20% cheaper per image |
| Filters | β FREE | $1.00 / 1K / filter | Save on every filtered search |
| Setup | Simple | Complex add-ons | Easier to use |
π° Real Cost: 1,000 Places + 50 Photos Each
| Provider | Places | Photos (50K) | Total | Savings |
|---|---|---|---|---|
| WebUnlocker | $4.00 | $20.00 | $24.00 | β |
| Compass | $4.00 | $25.00 | $29.00 | 17% cheaper |
| Google API | $17.00 | $350.00 | $367.00 | 93% cheaper |
π― Best For
- Lead generation - Filter by rating & website (FREE!)
- Photo-heavy projects - Deep Photo Scrape at $0.40/1K
- Market research - Price levels and opening hours included
- Standard scraping - Get 5-10 photos FREE per place
π― What Data You Get
For each place, the scraper extracts 30+ structured fields:
| Core Data | Contact Info | Location | Business Info |
|---|---|---|---|
| β Business name | β Phone number | β Full address | β Price level ($-$$$$) |
| β Category | β Website URL | β Street | β Opening hours |
| β Rating (1-5 stars) | β City | β Weekly schedule π | |
| β Review count | β Postal/ZIP code | β Timezone π | |
| β Description π | β State/Province | β Permanently closed | |
| β Country (name + code) | β Photos (5-100+) | ||
| β GPS coordinates | β Cover image |
Complete Output Fields
| Field | Type | Description |
|---|---|---|
title | string | Business name |
categoryName | string | Business category (e.g., "German restaurant") |
totalScore | number | Rating (1.0-5.0) |
reviewsCount | number | Number of reviews |
priceLevel | string | Price level ($, $$, $$$, $$$$) - when available |
openingHours | string | Current hours status (e.g., "Open Β· Closes 10 PM") - when available |
weeklyHours | object | π Full 7-day schedule (see example below) |
timezone | string | π IANA timezone (e.g., "America/New_York", "Europe/Paris") |
description | string | π Business description or review snippet |
permanentlyClosed | boolean | True if permanently closed |
address | string | Full address string |
street | string | Street address only |
city | string | City name |
postalCode | string | Postal/ZIP code (all formats: US, UK, EU, JP, etc.) |
state | string | State/Province (US, CA, AU states) |
country | string | Full country name (e.g., "Germany", "United Kingdom") |
countryCode | string | ISO country code (e.g., "DE", "GB", "US") |
phone | string | Phone with country code (+1, +44, +49, etc.) |
website | string | Website URL |
location | object | { lat, lng } GPS coordinates |
imageUrl | string | Primary image URL |
photos | array | Standard photos |
ownerPhotos | array | Owner-uploaded photos |
additionalPhotos | array | Extra photos (deep scrape mode) |
placeId | string | Google Place ID |
cid | string | Google CID (numeric) |
fid | string | Google's internal hex ID |
url | string | Google Maps URL |
scrapedAt | string | ISO timestamp of scrape |
π Global Address Parsing
Automatically extracts and formats addresses for 190+ countries:
| Country | Postal Format | Example |
|---|---|---|
| πΊπΈ USA | 12345 | postalCode: "10036", state: "NY" |
| π¬π§ UK | SW1A 1AA | postalCode: "SW1A 2HN" |
| π¨π¦ Canada | A1A 1A1 | postalCode: "M5T 3A5", state: "ON" |
| π©πͺ Germany | 12345 | postalCode: "10178" |
| π«π· France | 75000 | postalCode: "75004" |
| π―π΅ Japan | 123-4567 | postalCode: "168-0063" |
| π¦πΊ Australia | 1234 | postalCode: "2000", state: "NSW" |
π₯ Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "restaurants" | What to search for (e.g., "pizza", "hotels", "dentist") |
location | string | "New York NY" | Location to search in |
minRating | number | null | NEW! Minimum rating filter (1.0-5.0) - FREE! |
requireWebsite | boolean | false | NEW! Only places with website - FREE! |
skipClosed | boolean | false | NEW! Skip permanently closed - FREE! |
deepGathering | boolean | false | β Premium: Enable intelligent multi-area search |
pages | number | 1 | Deep Gathering only: Number of pages (1 page = 50 results) |
maxPhotos | number | 20 | Photos per place (0-100) |
deepPhotoScrape | boolean | false | Visit each place's photo gallery for 50-100+ photos |
fetchWeeklyHours | boolean | false | π Extract full 7-day weekly schedule |
enableScrolling | boolean | true | Scroll for more results |
tileRadiusKm | number | 3 | Deep Gathering: Size of search tiles in km |
Example Input (Normal Mode - Quick Search)
{"searchQuery": "coffee shops","location": "San Francisco CA","maxPhotos": 10,"enableScrolling": true}
Example Input (Deep Gathering - 100 Results)
{"searchQuery": "restaurants","location": "Miami FL","deepGathering": true,"pages": 2,"maxPhotos": 10}
Example Input (Deep Gathering - 200 Results)
{"searchQuery": "hotels","location": "New York NY","deepGathering": true,"pages": 4,"maxPhotos": 5}
π€ Output Example
{"title": "Blue Bottle Coffee","categoryName": "Coffee shop","totalScore": 4.5,"reviewsCount": 1247,"priceLevel": "$$","openingHours": "Open Β· Closes 7 PM","weeklyHours": {"Monday": "7 AM β 7 PM","Tuesday": "7 AM β 7 PM","Wednesday": "7 AM β 7 PM","Thursday": "7 AM β 7 PM","Friday": "7 AM β 7 PM","Saturday": "8 AM β 6 PM","Sunday": "8 AM β 6 PM"},"timezone": "America/Los_Angeles","description": "Trendy cafe chain offering upscale espresso drinks","permanentlyClosed": false,"address": "315 Linden St, San Francisco, CA 94102","street": "315 Linden St","city": "San Francisco","postalCode": "94102","state": "CA","country": "United States","countryCode": "US","phone": "+1 (510) 653-3394","website": "https://bluebottlecoffee.com","location": {"lat": 37.7763,"lng": -122.4213},"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipN...","photos": [{"url": "https://lh3.googleusercontent.com/p/AF1QipN...=w800-h600","id": "AF1QipN..."}],"ownerPhotos": [],"additionalPhotos": [],"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4","fid": "0x808f7e4d525e4e5:0x7e3e8a1234567890","cid": "9876543210123456789","url": "https://www.google.com/maps/place/?q=place_id:ChIJN1t_tDeuEmsRUsoyG83frY4","scrapedAt": "2026-01-24T12:00:00.000Z"}
Note:
timezoneis always populated from GPS coordinates.weeklyHoursanddescriptionare populated whenfetchWeeklyHours: trueand data is available.priceLevelandopeningHourscome from search results.
π How to Use
Via Apify Console
- Click "Start" or "Try for free"
- Enter your search query and location
- Adjust settings as needed
- Click "Run"
- Download results as JSON, CSV, or Excel
Via API
curl -X POST "https://api.apify.com/v2/acts/webunlocker~google-maps-by-webunlocker/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "restaurants","location": "Miami FL","maxResults": 100}'
Via JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('webunlocker/google-maps-by-webunlocker').call({searchQuery: 'hotels',location: 'Las Vegas NV',maxResults: 200});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Via Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("webunlocker/google-maps-by-webunlocker").call(run_input={"searchQuery": "gyms","location": "Los Angeles CA","maxResults": 50})items = client.dataset(run["defaultDatasetId"]).list_items().itemsfor place in items:print(f"{place['title']} - {place['totalScore']}β")
Via Python (Coordinate Search)
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")# Search 3km around Central Park, New Yorkrun = client.actor("webunlocker/google-maps-by-webunlocker").call(run_input={"searchQuery": "restaurants","coordinates": {"lat": 40.785091,"lng": -73.968285,"radiusKm": 3},"maxResults": 100})items = client.dataset(run["defaultDatasetId"]).list_items().itemsfor place in items:print(f"{place['title']} - {place['address']}")
π API Reference (External Applications)
Access this scraper programmatically from any application, platform, or language using the Apify REST API.
Authentication
Get your API token from: Apify Console β Settings β Integrations
Authorization: Bearer YOUR_API_TOKEN
Or append ?token=YOUR_API_TOKEN to any URL.
Base URL
https://api.apify.com/v2
Actor ID
webunlocker/google-maps-by-webunlocker
π‘ API Endpoints
1. Start a Scraping Run
POST /acts/webunlocker~google-maps-by-webunlocker/runs
curl -X POST "https://api.apify.com/v2/acts/webunlocker~google-maps-by-webunlocker/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "restaurants","location": "New York NY","maxResults": 100,"deepPhotoScrape": false}'
Response:
{"data": {"id": "abc123xyz","status": "RUNNING","defaultDatasetId": "dataset123","defaultKeyValueStoreId": "kvs123"}}
2. Check Run Status
GET /actor-runs/{runId}
$curl "https://api.apify.com/v2/actor-runs/abc123xyz?token=YOUR_TOKEN"
Response:
{"data": {"id": "abc123xyz","status": "SUCCEEDED","startedAt": "2026-01-16T12:00:00.000Z","finishedAt": "2026-01-16T12:00:45.000Z"}}
3. Get Results (Dataset Items)
GET /datasets/{datasetId}/items
$curl "https://api.apify.com/v2/datasets/dataset123/items?token=YOUR_TOKEN&format=json"
Query Parameters:
| Parameter | Description |
|---|---|
format | json, csv, xlsx, xml, html |
limit | Max items to return (default: 250000) |
offset | Skip first N items |
fields | Comma-separated field names to include |
Example with filters:
# Get only name, phone, and rating as CSVcurl "https://api.apify.com/v2/datasets/dataset123/items?token=YOUR_TOKEN&format=csv&fields=title,phone,totalScore"
4. Start Run and Wait for Results (Synchronous)
POST /acts/webunlocker~google-maps-by-webunlocker/run-sync-get-dataset-items
curl -X POST "https://api.apify.com/v2/acts/webunlocker~google-maps-by-webunlocker/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "coffee shops","location": "Seattle WA","maxResults": 20}'
β οΈ Note: This endpoint waits for completion and returns results directly. Timeout is 5 minutes.
π» Code Examples for External Apps
Node.js / TypeScript (No SDK)
const API_TOKEN = 'YOUR_TOKEN';const BASE_URL = 'https://api.apify.com/v2';async function scrapeGoogleMaps(query, location, maxResults = 50) {// Start the runconst startResponse = await fetch(`${BASE_URL}/acts/webunlocker~google-maps-by-webunlocker/runs?token=${API_TOKEN}`,{method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ searchQuery: query, location, maxResults })});const { data: run } = await startResponse.json();console.log(`Run started: ${run.id}`);// Poll for completionlet status = 'RUNNING';while (status === 'RUNNING' || status === 'READY') {await new Promise(r => setTimeout(r, 5000)); // Wait 5 secondsconst statusResponse = await fetch(`${BASE_URL}/actor-runs/${run.id}?token=${API_TOKEN}`);const { data } = await statusResponse.json();status = data.status;console.log(`Status: ${status}`);}if (status !== 'SUCCEEDED') {throw new Error(`Run failed with status: ${status}`);}// Get resultsconst resultsResponse = await fetch(`${BASE_URL}/datasets/${run.defaultDatasetId}/items?token=${API_TOKEN}`);return resultsResponse.json();}// UsagescrapeGoogleMaps('restaurants', 'Miami FL', 100).then(places => console.log(`Found ${places.length} places`)).catch(console.error);
Python (No SDK)
import requestsimport timeAPI_TOKEN = "YOUR_TOKEN"BASE_URL = "https://api.apify.com/v2"def scrape_google_maps(query, location, max_results=50):# Start the runresponse = requests.post(f"{BASE_URL}/acts/webunlocker~google-maps-by-webunlocker/runs",params={"token": API_TOKEN},json={"searchQuery": query,"location": location,"maxResults": max_results})run = response.json()["data"]print(f"Run started: {run['id']}")# Poll for completionstatus = "RUNNING"while status in ["RUNNING", "READY"]:time.sleep(5)response = requests.get(f"{BASE_URL}/actor-runs/{run['id']}",params={"token": API_TOKEN})status = response.json()["data"]["status"]print(f"Status: {status}")if status != "SUCCEEDED":raise Exception(f"Run failed: {status}")# Get resultsresponse = requests.get(f"{BASE_URL}/datasets/{run['defaultDatasetId']}/items",params={"token": API_TOKEN})return response.json()# Usageplaces = scrape_google_maps("hotels", "Las Vegas NV", 100)print(f"Found {len(places)} places")for place in places[:5]:print(f" - {place['title']}: {place.get('phone', 'N/A')}")
PHP
<?php$API_TOKEN = "YOUR_TOKEN";$BASE_URL = "https://api.apify.com/v2";function scrapeGoogleMaps($query, $location, $maxResults = 50) {global $API_TOKEN, $BASE_URL;// Start the run$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "$BASE_URL/acts/webunlocker~google-maps-by-webunlocker/runs?token=$API_TOKEN");curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['searchQuery' => $query,'location' => $location,'maxResults' => $maxResults]));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = json_decode(curl_exec($ch), true);$runId = $response['data']['id'];$datasetId = $response['data']['defaultDatasetId'];// Poll for completiondo {sleep(5);curl_setopt($ch, CURLOPT_URL, "$BASE_URL/actor-runs/$runId?token=$API_TOKEN");curl_setopt($ch, CURLOPT_POST, false);$status = json_decode(curl_exec($ch), true)['data']['status'];} while (in_array($status, ['RUNNING', 'READY']));// Get resultscurl_setopt($ch, CURLOPT_URL, "$BASE_URL/datasets/$datasetId/items?token=$API_TOKEN");$results = json_decode(curl_exec($ch), true);curl_close($ch);return $results;}// Usage$places = scrapeGoogleMaps("dentists", "Chicago IL", 50);echo "Found " . count($places) . " places\n";?>
C# / .NET
using System.Net.Http.Json;public class ApifyClient{private readonly HttpClient _client;private readonly string _token;public ApifyClient(string token){_token = token;_client = new HttpClient { BaseAddress = new Uri("https://api.apify.com/v2/") };}public async Task<List<Place>> ScrapeGoogleMaps(string query, string location, int maxResults = 50){// Start runvar response = await _client.PostAsJsonAsync($"acts/webunlocker~google-maps-by-webunlocker/runs?token={_token}",new { searchQuery = query, location, maxResults });var run = await response.Content.ReadFromJsonAsync<ApiResponse<Run>>();// Poll for completionstring status;do{await Task.Delay(5000);var statusResponse = await _client.GetFromJsonAsync<ApiResponse<Run>>($"actor-runs/{run.Data.Id}?token={_token}");status = statusResponse.Data.Status;} while (status == "RUNNING" || status == "READY");// Get resultsreturn await _client.GetFromJsonAsync<List<Place>>($"datasets/{run.Data.DefaultDatasetId}/items?token={_token}");}}
Ruby
require 'net/http'require 'json'require 'uri'API_TOKEN = "YOUR_TOKEN"BASE_URL = "https://api.apify.com/v2"def scrape_google_maps(query, location, max_results = 50)uri = URI("#{BASE_URL}/acts/webunlocker~google-maps-by-webunlocker/runs?token=#{API_TOKEN}")# Start runhttp = Net::HTTP.new(uri.host, uri.port)http.use_ssl = truerequest = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')request.body = { searchQuery: query, location: location, maxResults: max_results }.to_jsonresponse = JSON.parse(http.request(request).body)run_id = response['data']['id']dataset_id = response['data']['defaultDatasetId']# Poll for completionloop dosleep(5)status_uri = URI("#{BASE_URL}/actor-runs/#{run_id}?token=#{API_TOKEN}")status = JSON.parse(Net::HTTP.get(status_uri))['data']['status']break unless ['RUNNING', 'READY'].include?(status)end# Get resultsresults_uri = URI("#{BASE_URL}/datasets/#{dataset_id}/items?token=#{API_TOKEN}")JSON.parse(Net::HTTP.get(results_uri))end# Usageplaces = scrape_google_maps("cafes", "Portland OR", 30)puts "Found #{places.length} places"
π Webhooks (Real-time Notifications)
Get notified when scraping completes instead of polling:
curl -X POST "https://api.apify.com/v2/acts/webunlocker~google-maps-by-webunlocker/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "restaurants","location": "Boston MA","maxResults": 100}' \--header "X-Apify-Webhook-Url: https://your-server.com/webhook"
Your webhook receives:
{"eventType": "ACTOR.RUN.SUCCEEDED","resource": {"id": "abc123xyz","defaultDatasetId": "dataset123","status": "SUCCEEDED"}}
π Rate Limits & Best Practices
| Limit | Value |
|---|---|
| Concurrent runs | 25 (default) |
| API requests/sec | 30 |
| Max run time | 3 hours |
Best Practices:
- β Use webhooks instead of polling for production apps
- β Store your API token securely (environment variables)
- β Implement retry logic with exponential backoff
- β Cache results to avoid redundant scraping
- β
Use
fieldsparameter to reduce response size
π‘ Use Cases
π― Lead Generation
Build targeted B2B contact lists with business names, phone numbers, websites, and addresses. Perfect for sales teams and marketing agencies.
π Market Research
Analyze competitors in any geographic area. Understand market density, ratings distribution, and identify gaps in service coverage.
π Real Estate
Find all businesses near properties using GPS coordinate search. Enter property coordinates and radius to discover all nearby amenities. Useful for property valuations, neighborhood analysis, and commercial real estate research.
π Location Intelligence
Use coordinate-based search to analyze specific areas by lat/lng. Perfect for delivery zone analysis, site selection, and geographic market segmentation.
π Local SEO
Audit local business listings at scale. Track ratings, review counts, and listing completeness across regions.
π Data Enrichment
Add location intelligence to your CRM or database. Enrich existing records with phone numbers, websites, and coordinates.
π’ Franchise Analysis
Research competitor franchise locations, analyze store density by region, and identify expansion opportunities.
βοΈ Performance
What to Expect
- Results per run: 60-200 places (depending on location density)
- Typical run time: 15-60 seconds
- Memory usage: 256-512 MB
- Success rate: 95%+ with residential proxies
Tips for Best Results
- Be specific with location - "Miami Beach FL" works better than "Florida"
- Use common search terms - "restaurant", "hotel", "dentist" return more results
- Enable scrolling - Gets 2-3x more results than without
- Start small - Test with 50 results before scaling up
π Proxy Configuration
The scraper uses Apify's residential proxies by default for best reliability:
{"proxyConfig": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
π Integrations
Connect your scraped data to your favorite tools:
- Google Sheets - Auto-export results to spreadsheets
- Webhooks - Trigger workflows when scraping completes
- Zapier - Connect to 5000+ apps
- Make (Integromat) - Build automated workflows
- Slack - Get notifications with results
- Any REST API - Send data anywhere
β FAQ
Q: How many results can I get per run? A: Typically 60-200 places per search, depending on location density and scroll settings. For more results, run multiple searches with different locations.
Q: Why are some fields empty? A: Not all businesses have complete Google listings. Phone, website, and photos may be missing for some places.
Q: Can I search multiple locations? A: Yes! Run the actor multiple times with different locations, or use scheduled runs to automate the process.
Q: How fresh is the data? A: Data is scraped in real-time directly from Google Maps. Each run gets the latest information.
Q: What format can I export to? A: JSON, CSV, Excel, XML, and HTML. You can also push directly to Google Sheets or your own API.
Q: Is this legal to use? A: Web scraping publicly available data is generally legal. Always use the data responsibly and comply with applicable laws in your jurisdiction.
π Support
Having issues?
- β Check the Run log for error messages
- β
Try reducing
maxResultsorscrollCount - β Ensure your search query is valid
- β Contact support via the Issues tab
π Changelog
v2.0.0 (Current) π
- π° PRICE DROP: Now just $3/1,000 places (was $4)
- π Timezone Detection - Automatic IANA timezone for every place
- π
Weekly Hours - Full 7-day business schedule with
fetchWeeklyHours: true - π Business Descriptions - Review snippets and business summaries
- π Global Testing - Verified across 7 countries (USA, UK, Japan, Australia, France, UAE, Brazil)
- β‘ 30+ Data Fields - Most comprehensive Google Maps data available
v1.5.5
- π§ Garbage data filter improvements
- π Stricter coordinate validation
v1.5.4
- π Plus Code GPS Recovery - Decode Plus Codes to coordinates
- π Works for remote locations without street addresses
v1.5.0-1.5.3
- β Deep Gathering - Multi-area search for 50-500 results
- π§ Global coordinate fixes
- π Coordinate radius validation
v1.4.0
- β Garbage data filtering
- π Structured address fields (street, city, postalCode, state, country)
- πΊοΈ Global postal code support
Built with β€οΈ by WebUnlocker
Trusted by 1000+ businesses for Google Maps data extraction

