π Google Maps Scraper
Pricing
from $1.00 / 1,000 place scrapeds
π 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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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?
| Category | Fields |
|---|---|
| π·οΈ Identity | Title, subtitle, description, category, categories, Place ID |
| π Location | Full address, street, city, state, postal code, country, coordinates (lat/lng), Plus Code |
| βοΈ Contact | Phone (formatted + raw), website URL |
| β Rating | Average score, review count, review distribution (1β5 stars) |
| π Reviews | Reviewer name, photo, star rating, text, date, owner response, images, Local Guide status |
| πΌοΈ Images | Full-resolution image URLs, optional author attribution |
| π Hours | Opening hours per day |
| π Popularity | Popular times histogram (by hour/day), live occupancy text |
| β Attributes | Service options, accessibility, atmosphere, dining, payments, amenities |
| π Social | Facebook, Instagram, LinkedIn, Twitter, YouTube, TikTok, Pinterest (from website) |
| π§ Contact enrichment | Emails, extra phone numbers from the place''s own website |
| β Q&As | Community questions and answers |
| π½οΈ Restaurant extras | Price range, table reservation provider, food delivery links |
| π¨ Hotel extras | Star rating, description |
| π Discover | "People also search for" related places |
| π Web results | External web results shown in the place listing |
| π€ Competitor analysis | Scored 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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchStringsArray | string[] | β | Search keywords (e.g. ["pizza", "burger"]). Each runs a separate search. |
locationQuery | string | β | Location in free text (e.g. "New York, USA" or "Paris, France"). Combined with search terms. |
language | string | "en" | Language for results β ISO 639-1 code ("en", "fr", "de", etc.) |
countryCode | string | β | ISO country code for geolocation ("US", "GB", "DE", etc.) |
city | string | β | City name for precise geolocation |
state | string | β | State or province for geolocation |
postalCode | string | β | Postal/ZIP code (best combined with countryCode) |
customGeolocation | object | β | GeoJSON geometry: Point (with radiusKm), Polygon, or MultiPolygon |
maxCrawledPlacesPerSearch | integer | 50 | Max places per search query (1 β 10,000) |
startUrls | object[] | β | Direct Google Maps URLs to scrape (bypasses keyword search) |
placeIds | string[] | β | Google Place IDs to scrape directly (e.g. ChIJ...) |
π½ Filtering
| Parameter | Type | Default | Description |
|---|---|---|---|
categoryFilterWords | string[] | β | Include only places whose category contains one of these words |
searchMatching | string | "all" | all Β· only_includes (name contains search term) Β· only_exact |
placeMinimumStars | string | β | Minimum rating: two, twoAndHalf, three, threeAndHalf, four, fourAndHalf |
website | string | "allPlaces" | allPlaces Β· withWebsite Β· withoutWebsite |
skipClosedPlaces | boolean | false | Skip permanently or temporarily closed places |
π Reviews
| Parameter | Type | Default | Description |
|---|---|---|---|
maxReviews | integer | 0 | Reviews per place (0 = none, 99999 = all available) |
reviewsSort | string | "newest" | Sort order: newest Β· mostRelevant Β· highestRanking Β· lowestRanking |
reviewsStartDate | string | β | Only reviews after this date (YYYY-MM-DD or e.g. "3 months") |
reviewsFilterString | string | β | Keyword filter β only reviews containing this phrase |
reviewsOrigin | string | "all" | all sources or google only |
scrapeReviewsPersonalData | boolean | true | Include reviewer name, photo, and profile URL |
πΌοΈ Images
| Parameter | Type | Default | Description |
|---|---|---|---|
maxImages | integer | 0 | Images per place (0 = none, 99999 = all available) |
scrapeImageAuthors | boolean | false | Include image author name and Google Maps profile URL |
π Detail Page & Extras
| Parameter | Type | Default | Description |
|---|---|---|---|
scrapePlaceDetailPage | boolean | false | Scrape the full detail page. Required for: opening hours, popular times, Q&As, amenities |
maxQuestions | integer | 0 | Q&A pairs to extract per place (0 = none) |
scrapeTableReservation | boolean | false | Extract table reservation provider (Resy, OpenTable, etc.) |
scrapeOrderOnline | boolean | false | Extract food delivery / order-online providers |
includeWebResults | boolean | false | Include external web results shown in the listing |
scrapeContacts | boolean | false | Visit each place website to extract emails, phones, and social media links |
π€ Competitor Analysis
| Parameter | Type | Default | Description |
|---|---|---|---|
enableCompetitorAnalysis | boolean | false | After scraping, generate a scored competitor report + interactive HTML map |
π‘οΈ Proxy
| Parameter | Type | Description |
|---|---|---|
proxyConfiguration | object | Proxy 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
| Field | Description |
|---|---|
reviewId | Unique Google review ID |
reviewerName | Reviewer's display name |
reviewerPhotoUrl | Profile photo URL |
reviewerNumberOfReviews | Total reviews by this person |
isLocalGuide | Whether reviewer is a Google Local Guide |
stars | 1β5 star rating |
text | Full review text |
publishAt | Relative time ("2 months ago") |
publishedAtDate | Absolute date |
likesCount | "Helpful" likes count |
responseFromOwnerText | Owner's reply |
reviewImageUrls | Photos attached to the review |
reviewDetailedRating | Per-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:
- Scores each place (0β100 composite): rating 50% + review volume 30% + data completeness 20%
- Ranks all places from strongest to weakest
- Identifies signals per place: exceptional rating, high review volume, missing website, etc.
- Produces a market summary: competitive stats, gaps, and opportunities
- 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
categoryFilterWordsto narrow broad searches.
Reviews efficiently
- Set
maxReviewsonly as high as needed. - Combine
reviewsSort: "newest"+reviewsStartDateto 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
| Format | Best for |
|---|---|
| JSON | Full nested structure, API ingestion |
| CSV / Excel | Spreadsheet analysis, CRM import |
| XML | Legacy 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 ApifyClientclient = 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.