Google Maps Scraper
Pricing
from $1.05 / 1,000 place scrapeds
Google Maps Scraper
Scrape Google Maps search results: name, full address with city and postcode, phone in E.164, website, rating, review count, opening hours, closed status, coordinates and place ID. Optional emails and social links from each business website.
Pricing
from $1.05 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
Solar G
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Scrapes Google Maps search results into a clean dataset: business name, categories, full address (with street, city, postal code, state and country as separate fields), phone number in national and E.164 format, website, rating, review count, opening hours, closed status, coordinates and Google place ID. As an option, it also visits each business website to collect email addresses and social media links.
Input
| Field | Description |
|---|---|
searchQueries | What you'd type into Google Maps, including the location: "dentists in Leeds", "coffee shops in Austin TX". |
maxPlacesPerQuery | Default 100, maximum 300. Google Maps returns up to about 120 places per search. |
includeContactDetails | Visit each business website (homepage and up to 3 contact/about pages) for emails and social links. Default false. |
skipWithoutWebsite | Only return places that list a website. |
language | Default en. Any language code Google supports, e.g. de, fr, pt-BR. Affects category names, descriptions, opening-hours labels and the country name in addresses. |
country | Default us. Two-letter country code for the search region (uk is accepted for gb). It only biases which places Google returns; addresses and phone numbers come out in the same format whatever the region. |
An unknown country or language code stops the run straight away with a message saying which value is wrong.
{"searchQueries": ["plumbers in Manchester", "dentists in Leeds"],"maxPlacesPerQuery": 100,"country": "gb","includeContactDetails": true}
To cover a whole city beyond about 120 results, run several narrower searches (by neighbourhood, district or postcode). Duplicates within a query, and repeated queries, are removed.
Output
{"searchQuery": "dentists in Leeds","rank": 1,"name": "Leeds City Dentalcare","categories": ["Dentist", "Cosmetic dentist", "Dental hygienist"],"category": "Dentist","address": "159 Beeston Rd, Leeds LS11 6AW, United Kingdom","street": "159 Beeston Rd","city": "Leeds","postalCode": "LS11 6AW","state": null,"locality": "Leeds LS11 6AW","cityLine": "Leeds LS11 6AW","neighborhood": null,"country": "United Kingdom","countryCode": "GB","latitude": 53.7784034,"longitude": -1.5529913,"phone": "0113 270 5020","phoneInternational": "+441132705020","website": "https://www.leedscitydentalcare.co.uk/","rating": 4.9,"reviewsCount": 597,"price": null,"description": null,"permanentlyClosed": false,"temporarilyClosed": false,"openingHours": [{ "day": "Monday", "dayLabel": "Monday", "hours": "8 am-5 pm", "periods": [{ "open": "08:00", "close": "17:00" }] },{ "day": "Saturday", "dayLabel": "Saturday", "hours": "Closed", "periods": [] }],"timezone": "Europe/London","imageUrl": "https://lh3.googleusercontent.com/grass-cs/...=w800-h600-k-no","placeId": "ChIJYVVk-IJeeUgRuqS8KGHdmNI","cid": "7492290227201009660","googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJYVVk-IJeeUgRuqS8KGHdmNI","emails": ["info@leedscitydentalcare.co.uk"],"socials": {"instagram": ["https://www.instagram.com/leedscitydentalcareltd"],"facebook": ["https://www.facebook.com/Leedscitydentalcare"]}}
Field notes
addressalways ends with the country name (in the result language), so the same place gives the same address whatevercountryyou search from.city,postalCodeandstatecome from Google's structured address.stateis the full name (e.g.Texas) and is null where Google does not use one.localityis the town and postcode part of the address, without the street, district or country, e.g.Leeds LS11 6AW,Austin, TX 78751or75018 Paris.cityLineis the same value, kept for compatibility; uselocalityin new integrations.phoneis the national format;phoneInternationalis E.164 (+and digits only).openingHoursruns Monday to Sunday.dayis always the English day name;dayLabelandhoursare as Google shows them in the result language.periodsgives 24-houropen/closetimes:24:00means midnight, and a close time earlier than the open time means the place closes after midnight.permanentlyClosedis true for places Google marks as permanently closed (they are still returned so you can remove them from your lists).temporarilyClosedis true when Google labels the place temporarily closed.priceis Google's price level where shown; for hotels it is the nightly price Google shows, in the currency Google picks.imageUrlis the main photo at 800x600.descriptionis Google's short summary, when there is one.- Tracking parameters (
utm_*,fbclid,gclid,y_source,mc_cidand similar) are removed from website URLs. neighborhoodis the district Google gives for the place (e.g.WortleyorHyde Park), or null.emailsandsocialsonly appear whenincludeContactDetailsis on. Social links use one form per network (https://, a single host such aswww.facebook.comorx.com, no query string) and are deduplicated ignoring case. WhatsApp links are normalised tohttps://wa.me/<number>.
Empty and failed queries
- A query with no results adds one item with
searchQuery,inputand aninfomessage. It is not charged. - A query that fails (for example, Google does not respond) adds one item with
searchQuery,inputanderror. It is not charged. - An entry in
searchQueriesthat is not text adds an item withinput(the entry as JSON text, e.g.123) anderror. The other queries still run.
The dataset has three views: Places, Contacts, and Errors and empty queries.
API usage
curl -X POST "https://api.apify.com/v2/acts/solarg~google-maps-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["dentists in Leeds"], "country": "gb", "maxPlacesPerQuery": 50}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("solarg/google-maps-scraper").call(run_input={"searchQueries": ["plumbers in Manchester"], "country": "gb", "includeContactDetails": True})items = client.dataset(run["defaultDatasetId"]).list_items().items
Pricing
- Place: $1.50 per 1,000 places saved.
- Emails and socials add-on: $2.00 per 1,000 places, charged only when
includeContactDetailsis on.
Platform usage is included in the price. Info and error items are not charged. Apify subscription plans get a discount on these prices.
Limitations
- About 120 places per search query (a Google Maps limit). Use more specific queries for wider coverage.
- Review text, photos beyond the main image, plus codes and whether a listing is claimed are not available from search results and are not included.
- Emails are taken from the business's own website and are only available when the site publishes one.
- Contact details are public business information. Use them in line with applicable law (e.g. GDPR, CAN-SPAM).
Report problems in the Issues tab.