Google Maps Scraper avatar
Google Maps Scraper

Pricing

from $2.10 / 1,000 results

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Extract business data from Google Maps at scale. Get names, addresses, phone numbers, websites, ratings, reviews, opening hours, popular times, photos, and 40+ data points per listing.

Pricing

from $2.10 / 1,000 results

Rating

0.0

(0)

Developer

AbotAPI

AbotAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Google Maps Business Scraper

Google Maps Business Scraper

Extract business data from Google Maps at scale. Get names, addresses, phone numbers, websites, ratings, reviews, opening hours, popular times, photos, and 40+ data points per listing.

What Data Can You Extract?

Business Information

  • Business name, category, subcategories
  • Full address with street, city, state, postal code, country
  • Phone number and website URL
  • Google Place ID and Maps URL

Ratings & Reviews

  • Average rating (1-5 stars)
  • Total review count
  • Individual reviews with text, rating, date, author
  • Owner responses to reviews

Location Data

  • Latitude and longitude coordinates
  • Plus Code (Google's location code)
  • "Located in" parent location (e.g., mall, airport)

Operational Details

  • Opening hours (daily schedule)
  • Popular times (hourly occupancy by day)
  • Temporarily/permanently closed status
  • Price level ($, $$, $$$, $$$$)

Rich Content

  • Photo URLs (configurable limit)
  • Menu URL
  • Order/delivery links (DoorDash, UberEats, etc.)
  • "People also search" related businesses

Search Context

  • Search query that found the business
  • Rank in search results
  • Sponsored/advertisement indicator

Quick Start

{
"searchStringsArray": ["restaurants"],
"location": "New York, NY",
"maxResultsPerSearch": 100
}

Search by Coordinates

{
"searchStringsArray": ["coffee shops"],
"lat": 40.7128,
"lng": -74.0060,
"zoom": 15,
"maxResultsPerSearch": 50
}
{
"searchStringsArray": ["hotels"],
"customGeolocation": {
"type": "Polygon",
"coordinates": [[[-122.5, 37.7], [-122.3, 37.7], [-122.3, 37.85], [-122.5, 37.85], [-122.5, 37.7]]]
},
"zoom": 16,
"maxResultsPerSearch": 200
}

With Reviews

{
"searchStringsArray": ["dentists"],
"location": "Chicago, IL",
"maxResultsPerSearch": 50,
"maxReviews": 20,
"reviewsSort": "newest"
}

Direct Place ID Lookup

{
"searchStringsArray": ["place_id:ChIJN1t_tDeuEmsRUsoyG83frY4"]
}

Input Parameters

Search Options

ParameterTypeDefaultDescription
searchStringsArraystring[]["restaurants"]Search queries or Place IDs (place_id:ChIJ...)
startUrlsobject[][]Direct Google Maps URLs to scrape
locationstring"New York, NY"Location text appended to search

Geographic Targeting

ParameterTypeDefaultDescription
latnumber-Latitude for coordinate search (-90 to 90)
lngnumber-Longitude for coordinate search (-180 to 180)
customGeolocationobject-GeoJSON Polygon/MultiPolygon for grid search
zoominteger14Map zoom level (1-21). Higher = smaller grid cells
countrystring-Country filter
statestring-State/region filter
citystring-City filter
postalCodestring-Postal/ZIP code filter

Extraction Limits

ParameterTypeDefaultDescription
maxResultsPerSearchinteger5Max results per search query (up to 10,000)
maxReviewsinteger0Max reviews per business (0 = skip reviews)
maxImagesinteger10Max photo URLs per business

Output Options

ParameterTypeDefaultDescription
reviewsSortstring"relevant"Sort reviews: relevant, newest, highest, lowest
skipClosedPlacesbooleanfalseSkip closed businesses
oneReviewPerRowbooleanfalseOutput one row per review (for CSV)
languagestring"en"Language code for results

Performance

ParameterTypeDefaultDescription
maxConcurrencyinteger5Parallel browser pages (1-20)
proxyConfigurationobject-Apify proxy settings

Resume Options

ParameterTypeDescription
resumeRunIdstringRun ID to resume from (loads previously scraped Place IDs)

Output Schema

Each business is saved with the following structure:

{
"placeId": "ChIJ49sQuK-AhYARM6U646SA12Y",
"title": "Blue Bottle Coffee",
"url": "https://www.google.com/maps/place/...",
"categoryName": "Coffee shop",
"address": "315 Linden St, San Francisco, CA 94102",
"street": "315 Linden St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94102",
"countryCode": "US",
"phone": "+1 510-653-3394",
"website": "https://bluebottlecoffee.com",
"totalScore": 4.5,
"reviewsCount": 1842,
"priceLevel": "$$",
"location": {
"lat": 37.7763,
"lng": -122.4158
},
"plusCode": "QHFJ+8R Hayes Valley, San Francisco, CA",
"openingHours": [
{ "day": "Monday", "hours": "7 AM - 6 PM" },
{ "day": "Tuesday", "hours": "7 AM - 6 PM" }
],
"popularTimes": [
{
"day": "Monday",
"hours": [
{ "hour": 7, "occupancyPercent": 20 },
{ "hour": 8, "occupancyPercent": 45 },
{ "hour": 9, "occupancyPercent": 65 }
]
}
],
"imageUrls": ["https://lh3.googleusercontent.com/..."],
"peopleAlsoSearch": [
{ "title": "Sightglass Coffee", "placeId": "ChIJ...", "url": "..." }
],
"menuUrl": "https://bluebottlecoffee.com/menu",
"orderLinks": [
{ "platform": "DoorDash", "url": "https://..." }
],
"temporarilyClosed": false,
"permanentlyClosed": false,
"searchString": "coffee shops",
"rank": 3,
"isAdvertisement": false,
"scrapedAt": "2025-12-06T10:30:00.000Z",
"reviews": [
{
"name": "John D.",
"text": "Great coffee and atmosphere!",
"rating": 5,
"date": "2 weeks ago",
"responseFromOwner": "Thanks for visiting!"
}
]
}

Scaling to Millions of Records

Google Maps limits search results to ~120-400 per query. To scrape millions of businesses:

Use customGeolocation to define a polygon. The scraper auto-generates grid points based on zoom level:

ZoomGrid Cell SizeExample: California
14~6 km~2,500 cells
15~3 km~10,000 cells
16~1.5 km~40,000 cells

Each cell runs a separate search, so:

  • 10,000 cells ร— 200 results/cell = 2 million potential results
{
"searchStringsArray": ["restaurants"],
"customGeolocation": {
"type": "Polygon",
"coordinates": [[[...california boundary...]]]
},
"zoom": 15,
"maxResultsPerSearch": 200
}

Strategy 2: Multiple Search Terms

Different queries return different businesses:

{
"searchStringsArray": [
"restaurants", "cafes", "bars", "hotels",
"gyms", "dentists", "plumbers", "lawyers"
],
"location": "Los Angeles, CA"
}

Strategy 3: Neighborhood Batching

Run separate Actor calls per area:

# Run 1: Downtown
{"searchStringsArray": ["restaurants"], "location": "Downtown, Los Angeles"}
# Run 2: Hollywood
{"searchStringsArray": ["restaurants"], "location": "Hollywood, Los Angeles"}

Resume & Recovery

Automatic Protection

  • Deduplication: Place IDs saved to persistent storage
  • Incremental saves: Results pushed immediately (never lost)
  • Migration handling: State saved when Apify migrates servers

Manual Resume

If a run crashes, start a new run with resumeRunId:

{
"searchStringsArray": ["restaurants"],
"location": "San Francisco, CA",
"resumeRunId": "abc123xyz"
}

The scraper loads Place IDs from the previous run and skips already-scraped businesses.

Anti-Detection Features

Built-in protections for reliable scraping:

  • Browser fingerprint rotation
  • Webdriver detection masking
  • Human-like scrolling with random delays
  • Rate limiting (30 requests/minute)
  • CAPTCHA detection with exponential backoff
  • Automatic retry with session rotation

Tip: For high-volume scraping, use residential proxies via proxyConfiguration.

Performance

MetricTypical Value
Speed800-1,200 listings/hour
Memory< 1 GB
Concurrency1-20 parallel pages
Retry attempts3 per failed request

Export Formats

Download from Apify Dataset:

  • JSON - Full nested structure
  • CSV - Flattened for spreadsheets
  • Excel - .xlsx format
  • XML - For integrations

Use Cases

  • Lead Generation: Build prospect lists with contact info
  • Market Research: Analyze competitors, pricing, ratings
  • Local SEO: Track rankings and reviews
  • Real Estate: Map amenities near properties
  • Investment: Assess retail density and competition
  • Data Enrichment: Add location data to existing records