πŸ“ Google Maps Scraper avatar

πŸ“ Google Maps Scraper

Pricing

from $1.00 / 1,000 place scrapeds

Go to Apify Store
πŸ“ Google Maps Scraper

πŸ“ Google Maps Scraper

Extract business data from Google Maps β€” addresses, phones, websites, ratings, reviews, images, opening hours, popular times & more. Search by keyword, URL, Place ID, or custom GeoJSON area.

Pricing

from $1.00 / 1,000 place scrapeds

Rating

0.0

(0)

Developer

Vivek Gaur

Vivek Gaur

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Extract rich, structured data from any Google Maps place β€” business names, addresses, phone numbers, websites, ratings, reviews, images, opening hours, popular times, contact details, and much more. Supports keyword searches, direct place URLs, Place IDs, and custom GeoJSON area searches.


πŸ” What data does Google Maps Scraper extract?

CategoryFields
🏷️ IdentityTitle, subtitle, description, category, categories, Place ID
πŸ“ LocationFull address, street, city, state, postal code, country, coordinates (lat/lng), Plus Code
☎️ ContactPhone (formatted + raw), website URL
⭐ RatingAverage score, review count, review distribution (1–5 stars)
πŸ“ ReviewsReviewer name, photo, star rating, text, date, owner response, images, Local Guide status
πŸ–ΌοΈ ImagesFull-resolution image URLs, optional author attribution
πŸ• HoursOpening hours per day
πŸ“Š PopularityPopular times histogram (by hour/day), live occupancy text
βž• AttributesService options, accessibility, atmosphere, dining, payments, amenities
πŸ”— SocialFacebook, Instagram, LinkedIn, Twitter, YouTube, TikTok, Pinterest (from website)
πŸ“§ Contact enrichmentEmails, extra phone numbers from the place''s own website
❓ Q&AsCommunity questions and answers
🍽️ Restaurant extrasPrice range, table reservation provider, food delivery links
🏨 Hotel extrasStar rating, description
πŸ” Discover"People also search for" related places
🌐 Web resultsExternal web results shown in the place listing
πŸ€– Competitor analysisScored rankings, strengths/weaknesses, interactive HTML map

πŸš€ Quick Start

1. Search by keyword + location

{
"searchStringsArray": ["pizza restaurant"],
"locationQuery": "Manhattan, New York, USA",
"maxCrawledPlacesPerSearch": 50,
"maxReviews": 5
}

2. Scrape specific places by URL

{
"startUrls": [
{ "url": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z" }
],
"maxReviews": 20,
"maxImages": 10,
"scrapePlaceDetailPage": true
}

3. Scrape by Place ID

{
"placeIds": ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
"scrapePlaceDetailPage": true,
"maxReviews": 100
}

4. Custom GeoJSON area (polygon)

{
"searchStringsArray": ["coffee shop"],
"customGeolocation": {
"type": "Polygon",
"coordinates": [[
[-74.02, 40.70], [-73.97, 40.70],
[-73.97, 40.73], [-74.02, 40.73],
[-74.02, 40.70]
]]
}
}

5. Lead generation β€” scrape contacts from websites

{
"searchStringsArray": ["law firm"],
"locationQuery": "Chicago, USA",
"maxCrawledPlacesPerSearch": 100,
"scrapeContacts": true
}

πŸ“₯ Input Parameters

πŸ”Ž Search & Location

ParameterTypeDefaultDescription
searchStringsArraystring[]β€”Search keywords (e.g. ["pizza", "burger"]). Each runs a separate search.
locationQuerystringβ€”Location in free text (e.g. "New York, USA" or "Paris, France"). Combined with search terms.
languagestring"en"Language for results β€” ISO 639-1 code ("en", "fr", "de", etc.)
countryCodestringβ€”ISO country code for geolocation ("US", "GB", "DE", etc.)
citystringβ€”City name for precise geolocation
statestringβ€”State or province for geolocation
postalCodestringβ€”Postal/ZIP code (best combined with countryCode)
customGeolocationobjectβ€”GeoJSON geometry: Point (with radiusKm), Polygon, or MultiPolygon
maxCrawledPlacesPerSearchinteger50Max places per search query (1 – 10,000)
startUrlsobject[]β€”Direct Google Maps URLs to scrape (bypasses keyword search)
placeIdsstring[]β€”Google Place IDs to scrape directly (e.g. ChIJ...)

πŸ”½ Filtering

ParameterTypeDefaultDescription
categoryFilterWordsstring[]β€”Include only places whose category contains one of these words
searchMatchingstring"all"all Β· only_includes (name contains search term) Β· only_exact
placeMinimumStarsstringβ€”Minimum rating: two, twoAndHalf, three, threeAndHalf, four, fourAndHalf
websitestring"allPlaces"allPlaces Β· withWebsite Β· withoutWebsite
skipClosedPlacesbooleanfalseSkip permanently or temporarily closed places

πŸ“ Reviews

ParameterTypeDefaultDescription
maxReviewsinteger0Reviews per place (0 = none, 99999 = all available)
reviewsSortstring"newest"Sort order: newest Β· mostRelevant Β· highestRanking Β· lowestRanking
reviewsStartDatestringβ€”Only reviews after this date (YYYY-MM-DD or e.g. "3 months")
reviewsFilterStringstringβ€”Keyword filter β€” only reviews containing this phrase
reviewsOriginstring"all"all sources or google only
scrapeReviewsPersonalDatabooleantrueInclude reviewer name, photo, and profile URL

πŸ–ΌοΈ Images

ParameterTypeDefaultDescription
maxImagesinteger0Images per place (0 = none, 99999 = all available)
scrapeImageAuthorsbooleanfalseInclude image author name and Google Maps profile URL

πŸ” Detail Page & Extras

ParameterTypeDefaultDescription
scrapePlaceDetailPagebooleanfalseScrape the full detail page. Required for: opening hours, popular times, Q&As, amenities
maxQuestionsinteger0Q&A pairs to extract per place (0 = none)
scrapeTableReservationbooleanfalseExtract table reservation provider (Resy, OpenTable, etc.)
scrapeOrderOnlinebooleanfalseExtract food delivery / order-online providers
includeWebResultsbooleanfalseInclude external web results shown in the listing
scrapeContactsbooleanfalseVisit each place website to extract emails, phones, and social media links

πŸ€– Competitor Analysis

ParameterTypeDefaultDescription
enableCompetitorAnalysisbooleanfalseAfter scraping, generate a scored competitor report + interactive HTML map

πŸ›‘οΈ Proxy

ParameterTypeDescription
proxyConfigurationobjectProxy settings. Apify residential proxies recommended for Google Maps at scale.

πŸ“€ Output Schema

Each scraped place is saved as one JSON item in the dataset:

{
"title": "Joe's Pizza",
"subTitle": "Pizza restaurant",
"description": "Classic NYC slice joint since 1975.",
"price": "Under $10",
"categoryName": "Pizza restaurant",
"categories": ["Pizza restaurant", "Italian restaurant"],
"address": "7 Carmine St, New York, NY 10014",
"neighborhood": "Greenwich Village",
"street": "7 Carmine St",
"city": "New York",
"state": "NY",
"postalCode": "10014",
"countryCode": "US",
"lat": 40.7303,
"lng": -74.0019,
"plusCode": "Q22F+MF New York",
"googleMapsUrl": "https://www.google.com/maps/place/...",
"placeId": "ChIJD7fiBh9u5kcRYJSMaMOCCwQ",
"website": "https://joespizzanyc.com",
"phone": "(212) 255-3946",
"phoneUnformatted": "(212) 255-3946",
"totalScore": 4.5,
"reviewsCount": 4200,
"reviewsDistribution": {
"oneStar": 50, "twoStar": 30, "threeStar": 120,
"fourStar": 900, "fiveStar": 3100
},
"permanentlyClosed": false,
"temporarilyClosed": false,
"claimStatus": null,
"openingHours": [
{ "day": "Monday", "hours": "10 AM–11 PM" },
{ "day": "Tuesday", "hours": "10 AM–11 PM" }
],
"popularTimesHistogram": {
"Mo": [{ "hour": 9, "occupancyPercent": 20 }, { "hour": 12, "occupancyPercent": 75 }],
"Fr": [{ "hour": 18, "occupancyPercent": 95 }]
},
"popularTimesLiveText": "Usually not too busy",
"additionalInfo": {
"Service options": [{ "Dine-in": true }, { "Takeout": true }, { "Delivery": false }],
"Accessibility": [{ "Wheelchair accessible entrance": true }],
"Payments": [{ "Credit cards": true }, { "NFC mobile payments": true }]
},
"thumbnailUrl": "https://lh3.googleusercontent.com/...",
"imageUrls": ["https://lh3.googleusercontent.com/..."],
"images": [{ "imageUrl": "...", "authorName": "Alice Johnson", "authorUrl": "..." }],
"reviews": [{
"reviewId": "ChdDSUhNMG9nS0...",
"reviewerName": "Bob Smith",
"reviewerPhotoUrl": "https://lh3.googleusercontent.com/...",
"reviewerNumberOfReviews": 42,
"isLocalGuide": true,
"stars": 5,
"text": "Best pizza in NYC, no contest!",
"publishAt": "2 months ago",
"publishedAtDate": "2024-06-01",
"likesCount": 12,
"responseFromOwnerText": "Thank you so much!",
"responseFromOwnerDate": "a month ago",
"reviewImageUrls": [],
"reviewDetailedRating": { "Food": 5, "Service": 5, "Atmosphere": 4 }
}],
"questions": [{ "question": "Is parking available?", "answer": "Street parking nearby." }],
"peopleAlsoSearch": [{ "title": "John's Pizza", "totalScore": 4.3, "reviewsCount": 980 }],
"reserveTableUrl": "https://www.google.com/maps/reserve/v/dine/...",
"tableReservationProvider": "OpenTable",
"orderOnlineUrls": [{ "provider": "Uber Eats", "url": "https://ubereats.com/..." }],
"emails": ["contact@joespizzanyc.com"],
"phones": ["+1 212-255-3946"],
"facebook": "https://facebook.com/joespizzanyc",
"instagram": "https://instagram.com/joespizzanyc",
"linkedin": null,
"twitter": "https://twitter.com/joespizzanyc",
"youtube": null,
"tiktok": null,
"pinterest": null,
"searchString": "pizza restaurant",
"rank": 1,
"scrapedAt": "2026-08-19T00:00:00.000Z"
}

πŸ“ Geolocation Options

Free-text location (simplest)

Type any location into locationQuery:

  • "New York, USA" Β· "Paris, France" Β· "10001" (postal code)

Structured geolocation (more precise)

Combine countryCode, state, city, postalCode for pinpoint accuracy.

GeoJSON custom area (most flexible)

Circle β€” search within a radius:

{ "type": "Point", "coordinates": [-73.9857, 40.7484], "radiusKm": 5 }

Polygon β€” custom drawn area (first and last coordinate must match to close the shape):

{
"type": "Polygon",
"coordinates": [[
[-0.3228, 51.5972], [-0.3150, 51.3880],
[0.0605, 51.3892], [0.0519, 51.6004],
[-0.3228, 51.5972]
]]
}

MultiPolygon β€” multiple disconnected areas in one run:

{
"type": "MultiPolygon",
"coordinates": [
[[[-74.02,40.70],[-73.97,40.70],[-73.97,40.73],[-74.02,40.73],[-74.02,40.70]]],
[[[2.30,48.84],[2.37,48.84],[2.37,48.88],[2.30,48.88],[2.30,48.84]]]
]
}

πŸ’‘ Use geojson.io to draw your area visually and copy the GeoJSON output.

⚠️ GeoJSON uses longitude first, then latitude β€” opposite of Google Maps.


🎯 Common Use Cases

🧲 Lead generation

{
"searchStringsArray": ["dentist", "dental clinic"],
"locationQuery": "Austin, Texas, USA",
"maxCrawledPlacesPerSearch": 200,
"scrapeContacts": true,
"website": "withWebsite",
"placeMinimumStars": "three"
}

πŸ† Competitor research

{
"searchStringsArray": ["italian restaurant"],
"locationQuery": "Rome, Italy",
"maxCrawledPlacesPerSearch": 50,
"maxReviews": 20,
"enableCompetitorAnalysis": true
}

πŸ“… Monitor recent reviews

{
"startUrls": [{ "url": "https://www.google.com/maps/place/Your+Business/..." }],
"maxReviews": 50,
"reviewsSort": "newest",
"reviewsStartDate": "1 month"
}

🍽️ Full restaurant profile

{
"searchStringsArray": ["sushi restaurant"],
"locationQuery": "San Francisco, USA",
"maxCrawledPlacesPerSearch": 30,
"scrapePlaceDetailPage": true,
"maxReviews": 10,
"maxImages": 5,
"scrapeTableReservation": true,
"scrapeOrderOnline": true
}

⭐ Reviews in Detail

FieldDescription
reviewIdUnique Google review ID
reviewerNameReviewer's display name
reviewerPhotoUrlProfile photo URL
reviewerNumberOfReviewsTotal reviews by this person
isLocalGuideWhether reviewer is a Google Local Guide
stars1–5 star rating
textFull review text
publishAtRelative time ("2 months ago")
publishedAtDateAbsolute date
likesCount"Helpful" likes count
responseFromOwnerTextOwner's reply
reviewImageUrlsPhotos attached to the review
reviewDetailedRatingPer-category ratings (Food, Service, Atmosphere)

Sort: newest Β· mostRelevant Β· highestRanking Β· lowestRanking

Date filter: reviewsStartDate: "3 months" or "2024-01-01"

Keyword filter: reviewsFilterString: "parking" β†’ only reviews mentioning "parking"


πŸ“§ Contact Enrichment

When scrapeContacts: true, the scraper visits each place's website and extracts:

  • πŸ“§ Emails β€” from page text and mailto: links
  • ☎️ Extra phones β€” beyond the Google Maps listing
  • πŸ“± Social media: Facebook, Instagram, LinkedIn, Twitter/X, YouTube, TikTok, Pinterest

Uses only publicly visible data on each business's own website. No paid APIs required.


πŸ€– Competitor Analysis

Enable with enableCompetitorAnalysis: true. After scraping completes, the actor:

  1. Scores each place (0–100 composite): rating 50% + review volume 30% + data completeness 20%
  2. Ranks all places from strongest to weakest
  3. Identifies signals per place: exceptional rating, high review volume, missing website, etc.
  4. Produces a market summary: competitive stats, gaps, and opportunities
  5. Generates an interactive HTML map (dark mode):
    • 🟒 Top ranked β†’ 🟑 Mid β†’ πŸ”΄ Lowest β€” color-coded pins
    • Clickable popups: rank, score, reviews, address
    • Sidebar leaderboard with score bars

πŸ’‘ Use a single focused search term (e.g. "italian restaurant") so all places are in the same category and can be meaningfully compared.


πŸ’‘ Tips for Best Results

More results

  • Use locationQuery β€” the scraper automatically splits large areas into a grid of searches, unlocking thousands of results past Google's 120-result cap.
  • Multiple distinct search terms (["restaurant", "bar", "cafe"]) run separately and combine results.

Cleaner results

  • Avoid near-duplicates like ["restaurant", "restaurants"] β€” same results, slower run.
  • Use categoryFilterWords to narrow broad searches.

Reviews efficiently

  • Set maxReviews only as high as needed.
  • Combine reviewsSort: "newest" + reviewsStartDate to collect only recent feedback.

Proxy

  • For < 100 places, default proxies are fine.
  • For large-scale runs or reviews, use Apify residential proxies for maximum reliability.

πŸ“Š Export Formats

FormatBest for
JSONFull nested structure, API ingestion
CSV / ExcelSpreadsheet analysis, CRM import
XMLLegacy system integrations

For review analysis: use the Reviews dataset view to get one row per review instead of one row per place.


❓ FAQ

How is this different from the Google Places API? The Google Places API caps results at 60 per search and requires billing. This scraper has no result cap, no API key, and extracts more fields (popular times, full reviews, images, contact enrichment).

Can I scrape multiple cities in one run? Yes β€” use customGeolocation with a MultiPolygon containing one polygon per city.

Can I scrape a specific list of businesses? Yes β€” provide Google Maps URLs in startUrls or Place IDs in placeIds.

Can I schedule recurring runs? Yes β€” use Apify's built-in scheduling to run daily, weekly, or on any cron schedule.

Is it legal? Scraping publicly visible business data is generally permitted. Handle reviewer personal data in accordance with GDPR/CCPA. Disable reviewer data collection with scrapeReviewsPersonalData: false.


πŸ”— Integrations & API

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("YOUR_ACTOR_ID").call(run_input={
"searchStringsArray": ["coffee shop"],
"locationQuery": "Berlin, Germany",
"maxCrawledPlacesPerSearch": 100,
"maxReviews": 5,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR_ACTOR_ID').call({
searchStringsArray: ['coffee shop'],
locationQuery: 'Berlin, Germany',
maxCrawledPlacesPerSearch: 100,
maxReviews: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Also integrates with: Zapier, Make, Google Sheets, Slack, Airbyte, LangChain, and any tool supporting webhooks.


πŸ“¬ Feedback & Issues

Found a bug or want a new feature? Open an issue on the actor's Issues tab. All feedback is actively monitored.