Google Maps By WebUnlocker avatar
Google Maps By WebUnlocker

Pricing

Pay per event

Go to Apify Store
Google Maps By WebUnlocker

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

WebUnlocker

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

3

Monthly active users

a day ago

Last modified

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
PagesMax ResultsBest For
150Quick overview
2100Standard project
3150Comprehensive list
5250Market research
10500Full city coverage

⚑ Why Choose This Scraper?

FeatureWebUnlockerOutscraperCompass
Base price$3/1K πŸŽ‰$3/1K$4/1K
Speed10x fasterBrowser-basedBrowser-based
Timezoneβœ… Included❌ Not available❌ Not available
Weekly hoursβœ… IncludedExtra$2/1K extra
Descriptionsβœ… IncludedExtraExtra
Rating filterβœ… FREELimited$1/1K extra
Website filterβœ… FREE❌$1/1K extra
Price levelβœ… IncludedExtra$2/1K extra
Opening hoursβœ… IncludedExtra$2/1K extra
Photos0-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!

EventPriceDescription
Place scraped$3.00 / 1,000 πŸŽ‰Each business/place extracted
Standard photosFREE0-4 photos per place (not guaranteed, depends on availability)
Filters appliedFREERating, website, closed - no extra charge!
TimezoneFREEIANA timezone included for every place
Weekly hoursFREEFull 7-day schedule included
DescriptionsFREEBusiness descriptions included
Price levelFREEIncluded in base price
Opening hoursFREEIncluded in base price
Deep photo scrape$0.40 / 1,000⭐ RECOMMENDED: 50-100+ photos guaranteed per place
Actor start$0.003One-time fee per run
Platform usageFreeIncluded 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 CasePlacesPhotosTotal Cost
Quick search1000-4 FREE (not guaranteed)~$0.30
Lead gen (rating β‰₯4.0, has website)1,000No~$3.00
Business list1,000No~$3.00
With photos (recommended)1,00050+ per place~$23.00
Large dataset10,000No~$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

FeatureWebUnlockerCompassWhy It Matters
Standard Photosβœ… 5-10 FREE$0.50 / 1K imagesNo extra cost for basic photos
Deep Photos$0.40 / 1K$0.50 / 1K images20% cheaper per image
Filtersβœ… FREE$1.00 / 1K / filterSave on every filtered search
SetupSimpleComplex add-onsEasier to use

πŸ’° Real Cost: 1,000 Places + 50 Photos Each

ProviderPlacesPhotos (50K)TotalSavings
WebUnlocker$4.00$20.00$24.00β€”
Compass$4.00$25.00$29.0017% cheaper
Google API$17.00$350.00$367.0093% 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 DataContact InfoLocationBusiness 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

FieldTypeDescription
titlestringBusiness name
categoryNamestringBusiness category (e.g., "German restaurant")
totalScorenumberRating (1.0-5.0)
reviewsCountnumberNumber of reviews
priceLevelstringPrice level ($, $$, $$$, $$$$) - when available
openingHoursstringCurrent hours status (e.g., "Open Β· Closes 10 PM") - when available
weeklyHoursobjectπŸ†• Full 7-day schedule (see example below)
timezonestringπŸ†• IANA timezone (e.g., "America/New_York", "Europe/Paris")
descriptionstringπŸ†• Business description or review snippet
permanentlyClosedbooleanTrue if permanently closed
addressstringFull address string
streetstringStreet address only
citystringCity name
postalCodestringPostal/ZIP code (all formats: US, UK, EU, JP, etc.)
statestringState/Province (US, CA, AU states)
countrystringFull country name (e.g., "Germany", "United Kingdom")
countryCodestringISO country code (e.g., "DE", "GB", "US")
phonestringPhone with country code (+1, +44, +49, etc.)
websitestringWebsite URL
locationobject{ lat, lng } GPS coordinates
imageUrlstringPrimary image URL
photosarrayStandard photos
ownerPhotosarrayOwner-uploaded photos
additionalPhotosarrayExtra photos (deep scrape mode)
placeIdstringGoogle Place ID
cidstringGoogle CID (numeric)
fidstringGoogle's internal hex ID
urlstringGoogle Maps URL
scrapedAtstringISO timestamp of scrape

🌍 Global Address Parsing

Automatically extracts and formats addresses for 190+ countries:

CountryPostal FormatExample
πŸ‡ΊπŸ‡Έ USA12345postalCode: "10036", state: "NY"
πŸ‡¬πŸ‡§ UKSW1A 1AApostalCode: "SW1A 2HN"
πŸ‡¨πŸ‡¦ CanadaA1A 1A1postalCode: "M5T 3A5", state: "ON"
πŸ‡©πŸ‡ͺ Germany12345postalCode: "10178"
πŸ‡«πŸ‡· France75000postalCode: "75004"
πŸ‡―πŸ‡΅ Japan123-4567postalCode: "168-0063"
πŸ‡¦πŸ‡Ί Australia1234postalCode: "2000", state: "NSW"

πŸ“₯ Input Parameters

ParameterTypeDefaultDescription
searchQuerystring"restaurants"What to search for (e.g., "pizza", "hotels", "dentist")
locationstring"New York NY"Location to search in
minRatingnumbernullNEW! Minimum rating filter (1.0-5.0) - FREE!
requireWebsitebooleanfalseNEW! Only places with website - FREE!
skipClosedbooleanfalseNEW! Skip permanently closed - FREE!
deepGatheringbooleanfalse⭐ Premium: Enable intelligent multi-area search
pagesnumber1Deep Gathering only: Number of pages (1 page = 50 results)
maxPhotosnumber20Photos per place (0-100)
deepPhotoScrapebooleanfalseVisit each place's photo gallery for 50-100+ photos
fetchWeeklyHoursbooleanfalseπŸ†• Extract full 7-day weekly schedule
enableScrollingbooleantrueScroll for more results
tileRadiusKmnumber3Deep Gathering: Size of search tiles in km
{
"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: timezone is always populated from GPS coordinates. weeklyHours and description are populated when fetchWeeklyHours: true and data is available. priceLevel and openingHours come from search results.

πŸš€ How to Use

Via Apify Console

  1. Click "Start" or "Try for free"
  2. Enter your search query and location
  3. Adjust settings as needed
  4. Click "Run"
  5. 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 ApifyClient
client = 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().items
for place in items:
print(f"{place['title']} - {place['totalScore']}⭐")
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
# Search 3km around Central Park, New York
run = 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().items
for 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:

ParameterDescription
formatjson, csv, xlsx, xml, html
limitMax items to return (default: 250000)
offsetSkip first N items
fieldsComma-separated field names to include

Example with filters:

# Get only name, phone, and rating as CSV
curl "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 run
const 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 completion
let status = 'RUNNING';
while (status === 'RUNNING' || status === 'READY') {
await new Promise(r => setTimeout(r, 5000)); // Wait 5 seconds
const 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 results
const resultsResponse = await fetch(
`${BASE_URL}/datasets/${run.defaultDatasetId}/items?token=${API_TOKEN}`
);
return resultsResponse.json();
}
// Usage
scrapeGoogleMaps('restaurants', 'Miami FL', 100)
.then(places => console.log(`Found ${places.length} places`))
.catch(console.error);

Python (No SDK)

import requests
import time
API_TOKEN = "YOUR_TOKEN"
BASE_URL = "https://api.apify.com/v2"
def scrape_google_maps(query, location, max_results=50):
# Start the run
response = 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 completion
status = "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 results
response = requests.get(
f"{BASE_URL}/datasets/{run['defaultDatasetId']}/items",
params={"token": API_TOKEN}
)
return response.json()
# Usage
places = 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 completion
do {
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 results
curl_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 run
var 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 completion
string 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 results
return 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 run
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
request.body = { searchQuery: query, location: location, maxResults: max_results }.to_json
response = JSON.parse(http.request(request).body)
run_id = response['data']['id']
dataset_id = response['data']['defaultDatasetId']
# Poll for completion
loop do
sleep(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 results
results_uri = URI("#{BASE_URL}/datasets/#{dataset_id}/items?token=#{API_TOKEN}")
JSON.parse(Net::HTTP.get(results_uri))
end
# Usage
places = 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

LimitValue
Concurrent runs25 (default)
API requests/sec30
Max run time3 hours

Best Practices:

  1. βœ… Use webhooks instead of polling for production apps
  2. βœ… Store your API token securely (environment variables)
  3. βœ… Implement retry logic with exponential backoff
  4. βœ… Cache results to avoid redundant scraping
  5. βœ… Use fields parameter 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

  1. Be specific with location - "Miami Beach FL" works better than "Florida"
  2. Use common search terms - "restaurant", "hotel", "dentist" return more results
  3. Enable scrolling - Gets 2-3x more results than without
  4. 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?

  1. βœ… Check the Run log for error messages
  2. βœ… Try reducing maxResults or scrollCount
  3. βœ… Ensure your search query is valid
  4. βœ… 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