Google Maps Contact Scraper avatar

Google Maps Contact Scraper

Pricing

from $1.80 / 1,000 business phone numbers

Go to Apify Store
Google Maps Contact Scraper

Google Maps Contact Scraper

Search Google Maps by category and city to find local businesses, and export phone numbers, websites and addresses to CSV or Excel. 46 columns each: split address fields, opening hours, rating, and flags for no website or an unclaimed profile. Build cold calling and lead lists.

Pricing

from $1.80 / 1,000 business phone numbers

Rating

0.0

(0)

Developer

Stable

Stable

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Type a category and a city. Get back every local business Google Maps lists for it, with the phone number, the website, the address split into fields, and the opening hours — 46 columns, straight to CSV, Excel, JSON or your CRM.

{ "searchTerms": ["dentist"], "locations": ["Austin, TX"] }

No Google API key, no daily quota, no browser.

What one row looks like

Copied from a real run in August 2026. Nothing here is typed by hand.

{
"name": "Toothbar",
"categoryName": "Dentist",
"categories": ["Dentist", "Cosmetic dentist", "Dental implants provider", "Emergency dental service"],
"phone": "(512) 607-4268",
"phoneUnformatted": "+15126074268",
"website": "https://www.toothbar.com/",
"domain": "toothbar.com",
"bookingUrl": "https://www.toothbar.com/contact/",
"hasPhone": true,
"hasWebsite": true,
"claimed": true,
"address": "211 Walter Seaholm Dr LR 160, Austin, TX 78701",
"street": "211 Walter Seaholm Dr LR 160",
"city": "Austin",
"state": "Texas",
"stateCode": "TX",
"postalCode": "78701",
"countryCode": "US",
"neighborhood": "Seaholm District",
"latitude": 30.2671177,
"longitude": -97.7527535,
"distanceFromCenterKm": 0.93,
"rating": 4.9,
"reviewsCount": null,
"description": "Downtown spot specializing in cosmetic dentistry such as veneers and dental checkups, and offering fillings.",
"openNow": false,
"currentStatusText": "Closed · Opens 8 AM Mon",
"openingHours": [{ "day": "Sunday", "hours": "Closed" }],
"timezone": "America/Chicago",
"permanentlyClosed": false,
"temporarilyClosed": false,
"serviceAreaBusiness": false,
"attributes": ["Wheelchair accessible entrance", "Wheelchair accessible parking lot", "Wheelchair accessible restroom"],
"highlights": ["Identifies as women-owned"],
"placeId": "ChIJO0xN0RG1RIYRIDFDZYJkYjA",
"cid": "6448317149061214008",
"googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJO0xN0RG1RIYRIDFDZYJkYjA",
"rank": 17,
"searchTerm": "dentist",
"searchLocation": "Austin, TX",
"searchQuery": "dentist Austin, TX",
"scrapedAt": "2026-08-16T23:45:06Z"
}

How often each field is actually filled

Measured across 260 businesses — five categories in five cities, on 17 August 2026. These are the numbers to plan a campaign against, and they are published because a lead list is only as good as the columns you can act on.

ColumnFilled
Name, category, coordinates, rating, Google Maps link, place ID100%
A phone number, a website, or both100%
Website97%
Phone number93%
Address, split into street / city / state / postcode / country97%
Opening hours (at least today's)99.6%
Editorial description40%
Accessibility and service attributes77%
Review count28% — see Limits

Fields

46 columns on every row, in a fixed order, so the CSV is never ragged.

FieldWhat it is
nameBusiness name
categoryName · categoriesPrimary category, and every category Google lists
phone · phoneUnformattedAs Google prints it, and in +E.164 form for a dialer
website · domainPublished website with Google's tracking parameters stripped, and the bare domain
bookingUrlAppointment or ordering link, where the business publishes one
hasPhone · hasWebsiteBooleans, for filtering in a spreadsheet
claimedfalse when nobody has claimed the Google Business Profile
addressThe printed one-line address
street · city · state · stateCode · postalCode · countryCodeThe same address split into fields, for a mail merge
neighborhood · plusCodeDistrict, and the Open Location Code when there is no street address
latitude · longitude · distanceFromCenterKmPosition, and how far it is from the place you searched
rating · reviewsCountStars out of five, and the review count when Google returns it
descriptionGoogle's own editorial summary of the business
openNow · currentStatusText · openingHours · timezoneOpen right now, the status line, the week, and the local time zone
permanentlyClosed · temporarilyClosedClosure flags
serviceAreaBusinesstrue for a trade that serves an area and keeps no storefront — these have no street address by design
attributes · highlightsWheelchair access, service options, and owner-identity badges
thumbnailUrlThe listing photo
placeId · cid · featureId · googleMapsUrlGoogle's own identifiers, and a link that opens the exact business
rankPosition in Google's result list
searchTerm · searchLocation · searchQuery · searchResolvedLocationWhich of your searches found it, and where Google decided to look
scrapedAtUTC timestamp

Filters

Every filter runs before a row is stored or billed, so a business you filter out costs you nothing.

InputWhat it does
onlyWithPhoneDrop businesses with no phone number
websiteFilterOnly businesses with no website — the classic local-agency lead list
onlyUnclaimedOnly profiles nobody has claimed
minRatingStar floor
skipClosedBusinessesDrop permanently and temporarily closed businesses
language · countryCodeLanguage of the opening-hours text, and which Google edition to search

Recipes

Cold-call list for one trade in one city. searchTerms: ["plumber"], locations: ["Chicago, IL"], onlyWithPhone: true.

Businesses with nowhere to send customers.

websiteFilter: "withoutWebsite"
— on a measured run, 11 of those 38 businesses also had an unclaimed profile.

Profiles nobody is managing. onlyUnclaimed: true. About 2 businesses in 100, and the clearest signal that a local business is not looking after its own listing.

A whole region, one run. Three categories across four towns is twelve searches: searchTerms: ["dentist", "orthodontist", "dental clinic"], locations: ["Austin, TX", "Round Rock, TX", "Georgetown, TX", "San Marcos, TX"].

What it costs

Billed per business stored, at one of two rates, decided by what came back:

EventWhenShare of a measured run
Business phone numberthe row has a phone number94%
Business listingthe row has no phone number6%

A business with no phone number is billed at the lower rate. Nothing is charged for a row a filter removed, and one business found by three of your searches is stored and billed once.

One price covers the whole row — the phone number, the website, the split address and the opening hours are all included in the rate on the card. There is no separate charge for contacts.

Apify's free plan includes $5 of platform credit a month, which is roughly 1 100 businesses at the free-plan rate. Paid plans pay the rate shown on the card. There is no separate free trial — you are billed per row from the first row, so start with maxResults: 20 and look at the output before scaling up.

Speed: 300 businesses in 36 seconds on the smallest machine Apify offers, in 16 requests.

Limits

Stated plainly, because you will meet all four.

One search returns about 200 businesses, and then Google stops. Measured: offsets 0–180 each returned a full page, offset 200 returned 17, offset 220 returned nothing. Asking deeper buys nothing. More coverage comes from asking more questions — and it genuinely works: one search for dentist Austin, TX returned 20 businesses, while four narrower searches around the same city returned 83 different ones, 16 to 20 of every 20 unseen in the first. Split by neighbourhood, by postcode, by suburb, or by a narrower category.

Review counts arrive on about a third of responses. The star rating comes back every time; the number of reviews behind it is Google's choice, made per response, and a repeat request recovers it only about one time in four. So reviewsCount is null rather than 0 when it is missing — a zero would be a lie you could sort on — and there is deliberately no minimum-reviews filter, because it would silently drop three businesses in four.

Opening hours are the full week on about a quarter of responses and today's row on the rest. Same decision by Google, same response: you always get openNow and the status line.

No e-mail addresses and no social profiles. Google Maps does not publish them; the listings that do sell them get them by visiting each company's own website afterwards. This actor returns what Google itself publishes, which is why it is fast and cheap. If you need e-mail, take the website column and enrich it separately.

Output

Five ready-made views on the dataset tab: Call list, Lead signals, Address fields, Opening hours, and All fields. Export any of them to CSV, Excel, JSON, XML or HTML, or pull them through the Apify API.

Every run also writes a RUN_SUMMARY record: how many businesses were stored, how many carried a phone number, which searches returned nothing, which filter dropped what, and how many searches ran into Google's own ceiling.

FAQ

How much does it cost to scrape 10,000 businesses?

Ten thousand rows at the rate on the card, plus a few cents of Apify platform usage — a measured 300-row run used $0.002 of it. Rows removed by a filter are not billed.

Can I search a whole country?

Not in one search. Google caps a single search at about 200 businesses wherever you point it. List the cities you want as separate locations; every category × location pair is its own search, and the results are de-duplicated by place ID across all of them.

Does it work outside the United States?

Yes. The location is plain text, so Camden, London, Kreuzberg, Berlin or Shibuya, Tokyo all work. Set countryCode and language to match the market you are searching.

Why is the address empty on some rows?

Because the business has no storefront — a mobile locksmith, a plumber, a groomer who comes to you. Google publishes a service area instead of an address for these, and the row is flagged with serviceAreaBusiness: true. They still carry a phone number.

Do I need a Google Maps API key?

No. Nothing here touches the Google Places API, so there are no daily quotas and no billing account to set up.

Will one business appear twice?

No. Rows are de-duplicated by Google's own place ID across every search in the run, so a plumber matched by both plumber and drain cleaning is stored once and billed once.

How do I get more than 200 results for one category?

Narrow the location and repeat. Four searches around Austin returned 83 distinct dentists where one returned 20. Postcodes, neighbourhoods and suburbs all work as locations.

Other scrapers we maintain

Same engine, same pricing model, same promise: flat rows, stated limits, and no charge for a row that came back empty.

Local Business Phone ScraperThe same job from directory sources, with Better Business Bureau accreditation on the row.
YouTube Influencer ScraperCreators by niche, with the website and socials they publish and a subscriber filter.
Telegram Channel Messages ScraperPosts from public channels — text, views, reactions and media links, no account needed.
Threads Hashtag ScraperThreads posts by hashtag or keyword, with author, engagement and links.
RedNote Xiaohongshu Profile ScraperPublic RedNote creator profiles in bulk — followers, bio, IP location and their notes.
ATS Jobs ScraperOpen roles straight from company career pages on Greenhouse, Lever, Ashby and Workday.