Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $1.05 / 1,000 place scrapeds

Go to Apify Store
Google Maps Scraper

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

Solar G

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

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

FieldDescription
searchQueriesWhat you'd type into Google Maps, including the location: "dentists in Leeds", "coffee shops in Austin TX".
maxPlacesPerQueryDefault 100, maximum 300. Google Maps returns up to about 120 places per search.
includeContactDetailsVisit each business website (homepage and up to 3 contact/about pages) for emails and social links. Default false.
skipWithoutWebsiteOnly return places that list a website.
languageDefault 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.
countryDefault 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

  • address always ends with the country name (in the result language), so the same place gives the same address whatever country you search from.
  • city, postalCode and state come from Google's structured address. state is the full name (e.g. Texas) and is null where Google does not use one.
  • locality is the town and postcode part of the address, without the street, district or country, e.g. Leeds LS11 6AW, Austin, TX 78751 or 75018 Paris. cityLine is the same value, kept for compatibility; use locality in new integrations.
  • phone is the national format; phoneInternational is E.164 (+ and digits only).
  • openingHours runs Monday to Sunday. day is always the English day name; dayLabel and hours are as Google shows them in the result language. periods gives 24-hour open/close times: 24:00 means midnight, and a close time earlier than the open time means the place closes after midnight.
  • permanentlyClosed is true for places Google marks as permanently closed (they are still returned so you can remove them from your lists). temporarilyClosed is true when Google labels the place temporarily closed.
  • price is Google's price level where shown; for hotels it is the nightly price Google shows, in the currency Google picks.
  • imageUrl is the main photo at 800x600.
  • description is Google's short summary, when there is one.
  • Tracking parameters (utm_*, fbclid, gclid, y_source, mc_cid and similar) are removed from website URLs.
  • neighborhood is the district Google gives for the place (e.g. Wortley or Hyde Park), or null.
  • emails and socials only appear when includeContactDetails is on. Social links use one form per network (https://, a single host such as www.facebook.com or x.com, no query string) and are deduplicated ignoring case. WhatsApp links are normalised to https://wa.me/<number>.

Empty and failed queries

  • A query with no results adds one item with searchQuery, input and an info message. It is not charged.
  • A query that fails (for example, Google does not respond) adds one item with searchQuery, input and error. It is not charged.
  • An entry in searchQueries that is not text adds an item with input (the entry as JSON text, e.g. 123) and error. 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 ApifyClient
client = 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 includeContactDetails is 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.