Google Maps List Scraper — Shared Lists to CSV, Phones, Emails
Pricing
from $1.00 / 1,000 place exporteds
Google Maps List Scraper — Shared Lists to CSV, Phones, Emails
Google Maps shared list scraper (maps.app.goo.gl): export saved places to CSV with name, note, phone, website, rating, hours, photos, and filters. Optional newest reviews and website emails. Accepts short links, full list URLs, or a place CID. No API key. JSON or CSV out.
Pricing
from $1.00 / 1,000 place exporteds
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
53
Total users
8
Monthly active users
3 days ago
Last modified
Categories
Share
Turn any public Google Maps shared list into a structured dataset. Paste a maps.app.goo.gl link and get one row per saved place — name, creator note, full address, coordinates, categories, phone, website, rating, review count, opening hours, and photos — with optional Google reviews and website contact emails per place. JSON or CSV out, priced per place, not per compute unit.
Why Use This Scraper?
- ✅ Works with short
maps.app.goo.gllinks, full list links, and direct place links — all auto-classified - ✅ One row per saved place, with the creator's note and list order preserved
- ✅ Rich place details: phone, website, rating, review count, hours, plus code, categories, photos
- ✅ Optional newest Google reviews attached to each place (translated to English when needed)
- ✅ Optional website email harvest — turn a saved list into a lead list
- ✅ Filters: min rating, review count, country, category, phone, website, permanently closed
- ✅ No Google API key, no browser, no login — pure HTTP, a 63-place list exports in seconds
- ✅ Deduplicates places across lists automatically
Overview
The Google Maps Shared List Scraper is built for travelers, researchers, and sales teams who need the places saved in a public Google Maps list as structured data.
The output is place-shaped rows. Whether you start from a shared-list link or a direct place link, the dataset is a stream of place rows — one per unique place. List context (list ID, title, the creator's note, position in the list, saved-by name, saved-at date) rides along on each row when the place came from a list.
Private lists (ones that require a Google login to open) are not supported — only lists shared with a public link.
Supported Inputs
URL types
| URL type | Pattern | Example |
|---|---|---|
| Short shared-list link | maps.app.goo.gl/{code} | https://maps.app.goo.gl/MMjvFNWpUTjiupHc9 |
| Full shared-list link | google.com/maps/placelists/list/{id} | https://www.google.com/maps/placelists/list/PiSwyqmbpwpP... |
| Direct place link | google.com/maps/place/... | https://www.google.com/maps/place/SAVOY/@35.65,139.73,17z/data=... |
| Place by CID | maps.google.com/?cid={number} | https://maps.google.com/?cid=214453715609291850 |
| Bare CID | decimal number | 214453715609291850 |
Copy-pasteable input
{"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9","https://maps.google.com/?cid=214453715609291850"]}
Unsupported inputs
- ❌ Private or login-protected lists ("You need access" lists)
- Google Maps search-results URLs (
/maps/search/Top+hotels+in+Paris) — accepted as a top-list query (one viewport, not an exhaustive city crawl) - ❌
goo.gllinks that don't point at Google Maps
Use Cases
| Audience | Use case |
|---|---|
| Travelers & creators | Export a trip shortlist to a spreadsheet, keep notes and list order |
| Sales & lead-gen teams | Turn a curated list of businesses into phones, websites, and emails |
| Researchers | Bulk-collect place metadata (categories, ratings, hours) for local-market analysis |
| Food & travel media | Compare saved venues by rating and review count, pull recent review quotes |
| Agencies | Deliver client-ready location datasets without writing scrapers |
How It Works

- Input — paste one or more public shared-list links and/or direct place links
- Resolve — short links are followed to the underlying list; every input is auto-classified
- Collect — one JSON call per list returns every saved place (up to Google's 500-place list cap)
- Enrich — place details are fetched in parallel; reviews and website emails are added when enabled
- Output — one row per unique place, exported as JSON, CSV, or via the dataset API
Input Configuration
Input fields
| Field | Type | Required | Notes |
|---|---|---|---|
listUrls | array<string> | yes* | Shared list links and single place links, mixed as you like. Optional when topListQueries is set |
topListQueries | array<string> | no | Google's ready-made lists, e.g. Top hotels in Paris, or a /maps/search/ link |
enrichPlaces | boolean | optional | Phone, website, rating, hours and photos per place. Default true; off = list-only (name, note, address, coordinates) |
includeReviews | boolean | optional | Newest Google reviews on each row. Default true |
maxReviewsPerPlace | integer | optional | Default 10, up to 200 |
includeWebsiteEmails | boolean | optional | Public emails from each place's own website. Default false |
maxEmailsPerPlace | integer | optional | Default 3, up to 10 |
excludePermanentlyClosed | boolean | optional | Leave out places closed for good. Default true |
onlyWithPhone | boolean | optional | Leave out places with no phone. Default false |
onlyWithWebsite | boolean | optional | Leave out places with no website. Default false |
filterByCategories | array<string> | optional | Keep places whose category contains any of these words |
filterByCountry | string | optional | Two-letter code or name (JP, Japan). Empty = any country |
minReviewCount | integer | optional | At least this many reviews. 0 = no minimum |
minRating | number | optional | At least this many stars. 0 = no minimum |
maxResults | integer | optional | Places in the whole run. Default 1000 |
maxPlacesPerList | integer | optional | Places from each list. Default 100, up to 500 |
maxConcurrency | integer | optional | Places read at once. Default 10 |
proxy | object | optional | Residential connection by default, best for larger runs |
Common scenarios
1. Export a whole list
{"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"]}
2. Lead list with reviews and emails
{"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"],"includeReviews": true,"maxReviewsPerPlace": 5,"includeWebsiteEmails": true,"maxEmailsPerPlace": 3}
3. Lead-gen filters (open restaurants in Japan with a phone)
{"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"],"onlyWithPhone": true,"excludePermanentlyClosed": true,"minRating": 4,"filterByCountry": "Japan","filterByCategories": ["Restaurant"]}
4. List-only (no per-place detail fetch)
{"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"],"enrichPlaces": false}
5. Google "Top hotels in Paris" list
{"topListQueries": ["Top hotels in Paris", "Best coffee in Brooklyn"],"maxPlacesPerList": 30}
6. Specific places only (no list)
{"listUrls": ["https://maps.google.com/?cid=214453715609291850","https://www.google.com/maps/place/SAVOY/@35.6548695,139.7364827,17z/data=!3m1!4b1!4m6!3m5!1s0x60188b9e21c65eb1:0x6e98556d60ee756e!8m2!3d35.6548695!4d139.7364827"]}
Output Overview
Each dataset item is one place row containing:
- Identity —
name,localName,placeId(feature id),placeIdChIJ,cid,knowledgeId,googleMapsUrl - Location —
address,streetAddress,city,state,postalCode,countryCode,latitude,longitude,plusCode,timezone - Business info —
categories,rating,reviewCount,priceLevel,description,phone,website,websiteDomain,currentStatus,isPermanentlyClosed,isClaimed,businessHours,photos,thumbnail - List context —
note(the creator's note),listId,listTitle,sourceListUrl,sourceIndex,savedByName,savedAt - Optional enrichment —
reviews[](whenincludeReviews),emails[](whenincludeWebsiteEmails)
Fields Google doesn't publish for a given place come back null — e.g. a place without a phone listing has phone: null. description and priceLevel are the same: present when Google publishes them. Filtered places are not written to the dataset. If the same place appears in more than one submitted list, the first eligible match is kept and later matches are skipped.
Output Samples
Place from a shared list, with reviews
{"name": "Tamai Nihonbashi Main Branch","categories": ["Anago restaurant", "Japanese restaurant", "Kaiseki restaurant"],"rating": 4.5,"reviewCount": 2168,"currentStatus": "Closed · Opens 11 AM","isPermanentlyClosed": false,"isClaimed": true,"phone": "+81 3-3272-3227","website": "http://anago-tamai.com/","websiteDomain": "anago-tamai.com","address": "2 Chome-9-9 Nihonbashi, Chuo City, Tokyo 103-0027, Japan","postalCode": "103-0027","city": "Chuo City","state": "Tokyo","countryCode": "JP","latitude": 35.6812297,"longitude": 139.7746943,"plusCode": "8Q7XMQJF+FV","timezone": "Asia/Tokyo","businessHours": [{ "day": "Wednesday", "hours": ["11 AM–2:30 PM", "5–9:30 PM"] },{ "day": "Thursday", "hours": ["11 AM–2:30 PM", "5–9:30 PM"] }],"note": null,"photos": [{ "url": "https://lh3.googleusercontent.com/gps-cs-s/...", "caption": null }],"reviews": [{"rating": 5,"text": "The eel was delicious, but I always felt unsatisfied eating just the small box…","originalLanguage": "zh-Hant","relativeDate": "9 hours ago","publishedAt": "2026-07-22T11:08:24.602Z","authorName": "42绿子","reviewUrl": "https://www.google.com/maps/reviews/data=..."/* + reviewId, originalText, authorProfileUrl, authorPhoto, photos[] */}/* ... more reviews ... */],"googleMapsUrl": "https://maps.google.com/?cid=214453715609291850","cid": "214453715609291850","placeId": "0x601889579765230f:0x2f9e484a3a78c4a","placeIdChIJ": "ChIJDyNll1eJGGARSoyno4Tk-QI","listTitle": "Tokyo","listId": "PiSwyqmbpwpP_Nr5sAang4x5QxbKwA","sourceListUrl": "https://maps.app.goo.gl/MMjvFNWpUTjiupHc9","sourceIndex": 3,"savedByName": "Shahed Khan","savedAt": "2026-05-08T06:26:59.000Z"}
Place with a creator note
{"name": "SAVOY Azabujuban","rating": 4.4,"phone": "+81 3-6665-8102","website": "https://savoy-azabujyuban.com/","note": "Bluefin tuna pizza","sourceIndex": 1/* same place shape as above */}
Key Output Fields
Place identity
name,localName,placeId,placeIdChIJ,cid,knowledgeId,googleMapsUrl
Location
address,streetAddress,city,state,postalCode,countryCodelatitude,longitude,plusCode,compoundPlusCode,timezone
Business
categories[],rating,reviewCount,priceLevel,descriptionphone,phoneRaw,website,websiteDomain,currentStatus,isPermanentlyClosed,isClaimedbusinessHours[]({day, hours[]}),photos[]({url, caption}),thumbnailleadScore(0–100),leadScoreSignals[]
List context
note,listId,listTitle,sourceListUrl,sourceIndex,savedByName,savedAt
Reviews (when includeReviews: true)
reviews[].rating,reviews[].text,reviews[].originalText,reviews[].originalLanguagereviews[].authorName,reviews[].publishedAt,reviews[].photos[]
Emails (when includeWebsiteEmails: true)
emails[],websitePhones[],socials(instagram/facebook/etc. from the same pages)
FAQ
Can I use a short Google Maps link?
Yes. Short maps.app.goo.gl links and full google.com/maps list links both work — short links are resolved automatically.
What about lists that are not shared publicly?
They cannot be read. The actor sees what anyone sees when they open the link while signed out of Google, so share the list as public first.
Do I need a Google Maps API key?
No. The actor reads the same public endpoints the Google Maps website uses — no API key, no browser.
Why is phone or website null for some places?
Google Maps doesn't publish the same details for every place. A place without a listed phone number has phone: null; a place without a website has website: null. The actor keeps whatever public fields exist.
Does businessHours contain the full week?
Usually yes. Google sometimes only sends today in the main hours block; the actor then fills the rest from the menu-hours table when that table is present. currentStatus is the live string (e.g. "Open · Closes 9:30 PM").
Can I scrape "Top hotels in Paris"?
Yes. Put the phrase in topListQueries, or paste a /maps/search/Top+hotels+in+Paris URL. That is one viewport (Google's ~120 cap), not an exhaustive city crawl — use Google Maps Leads Scraper when you need tiling past that cap.
Can I export just the list without phones and websites?
Yes. Set enrichPlaces to false. Each row then has the list fields only (name, note, address, coordinates, list context). Filters that need ratings, phones, websites, or closed status turn details back on automatically.
Do filters cost extra?
No. Dropped places are not written to the dataset, so they are not billed. The run keeps reading the list until it hits maxResults passing places or the list ends.
What happens when a place is in two lists?
The first eligible match is saved; later matches for the same place are skipped, so the saved row keeps the first list's context (note, index, savedAt).
How reliable is the email lookup?
Best-effort. The actor visits the place's own website (homepage plus contact/about pages) and harvests publicly displayed emails. Places whose "website" is an Instagram or delivery-platform link usually yield no email — that's a property of the data.
What about rate limits?
Lists are fetched with a single call each and place details in parallel. For runs of hundreds of places, keep the default residential proxy enabled; Google may throttle heavy anonymous traffic from datacenter IPs.
Support
- Open an issue on the actor's Issues tab in Apify Console
- Email: muhamed.didovic@gmail.com
Additional Services
- Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
- Need scheduled monitoring of a list (alert on new saved places)? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com
Explore More Scrapers
- Have a Maps search (keyword + city), not a shared list? Google Maps Leads Scraper — tiles past the ~120-result cap.
- Need reviews and owner replies? Google Maps Reviews Scraper.
- Other scrapers: memo23 on Apify.
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/google-maps-list-scraper).
Purpose: exports every place saved in a public Google Maps shared list (or given as a direct place link) as one structured row — including the list creator's notes, plus optional reviews and website emails.
Minimal input:
{ "listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"], "maxResults": 10 }
Output: one dataset row per place — name, categories[], priceLevel, rating, reviewCount, currentStatus, isPermanentlyClosed, isClaimed, phone, website, websiteDomain, address, streetAddress, postalCode, city, state, countryCode, latitude, longitude, plusCode, timezone, businessHours [{day, hours}], description, note, photos [{url, caption}], googleMapsUrl, cid, placeId, placeIdChIJ, listTitle, listId, sourceListUrl, sourceIndex, savedByName, savedAt, plus emails[] after websiteDomain when includeWebsiteEmails is on and reviews[] after photos when includeReviews is on.
Behaviors an agent should know:
- Always set
maxResults— a list can hold up to 500 places, and multiple lists multiply that. listUrlsaccepts short links, full list links, direct place links,?cid=URLs, and bare CIDs — mixed freely.- Duplicate places across lists are deduplicated; the first match wins.
- Billing is per place row saved to the dataset. Filtered places, unresolvable links, and empty lists produce no charge.
enrichPlaces: falseskips the per-place detail fetch. Filters that need rating/phone/website/closed status turn details back on.includeWebsiteEmailsbills separately, as Contact email found, and only when an email is actually discovered — a place whose website yields nothing is never charged for the attempt. Leave the option off and you never see the event at all.- Private (login-gated) lists fail with a logged warning — only public lists work. Fields Google doesn't publish are
null.
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google LLC or any of its subsidiaries. All trademarks, including Google Maps, are the property of their respective owners.
The scraper accesses only publicly available Google Maps pages and endpoints — no authenticated endpoints, no private lists, and no content behind the Google login wall. Users are responsible for ensuring their use complies with Google's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.
SEO Keywords
google maps shared list scraper, scrape google maps list, google maps saved places export, google maps list to spreadsheet, maps.app.goo.gl scraper, google maps list export csv, google maps place scraper, google maps reviews scraper, google maps lead generation, local business data scraper, google maps email finder, place list export, travel list export, restaurant list scraper, google maps data extraction, saved places to excel, google maps API alternative, local leads scraper, Apify google maps