Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $1.75 / 1,000 place scrapeds

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Scrape Google Maps worldwide. Extract business names, addresses, phones, websites, reviews, ratings, hours, and 30+ fields. HTTP-only. Fast and cheap (~80MB RAM). Optional AI-powered contact and job extraction from company websites.

Pricing

from $1.75 / 1,000 place scrapeds

Rating

0.0

(0)

Developer

Alessandro Santamaria

Alessandro Santamaria

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Maps Scraper -- Extract Business Data from Any Location on Earth

Scrape Google Maps search results worldwide. Get business names, addresses, phone numbers, websites, reviews, ratings, opening hours, GPS coordinates, and 30+ structured fields per place. HTTP-only architecture delivers results in seconds, not minutes.

Why this scraper

  • All-inclusive pricing -- 30+ fields per place at one flat rate. No extra charges for reviews, photos, hours, or address parsing.
  • Extremely fast -- HTTP-only, no browser. Returns 20 results in ~10 seconds. Runs on ~80 MB RAM.
  • Volume-friendly pricing -- from $3.75/1,000 places (Free/Starter) down to $1.75/1,000 places (Business tier).
  • Built-in enrichment -- optionally trigger AI-powered contact extraction or job listing extraction on every website found.
  • Your LLM, your choice -- Gemini (recommended, free tier available), Groq, or OpenRouter with automatic fallback between providers.
  • Works worldwide -- any country, any language. Pass an ISO language code and get localized results.

How it works

This scraper uses Google's search?tbm=map HTTP endpoint to fetch structured business data directly -- no browser, no JavaScript execution, no headless Chrome. Each HTTP request returns up to 20 places with full details. The scraper paginates automatically up to ~120 results per query.

TLS fingerprinting via got-scraping ensures requests look like real browser traffic. Datacenter proxies work reliably -- no expensive residential proxies required.

Performance benchmarks:

MetricValue
Speed~20 results in 10 seconds
Memory~80 MB RAM
Max results per query~120 (6 pages of 20)
Proxy typeDatacenter (included with Apify)
ConcurrencyUp to 20 parallel queries

Quick start

Pass plain search strings. Include the location in the string itself:

{
"searchStrings": [
"restaurants in Paris",
"coffee shops in Tokyo",
"dentists in New York"
],
"maxResults": 20
}

Structured queries

For programmatic use with company IDs, location filtering, and country codes:

{
"queries": [
{
"query": "software companies",
"location": "Berlin",
"country": "DE",
"company_id": "my-internal-id-123"
},
{
"query": "plumbers",
"location": "London",
"country": "GB"
}
],
"maxResults": 50,
"language": "en"
}

With contact extraction

Find businesses and automatically extract team contacts from their websites:

{
"searchStrings": ["IT companies in Munich"],
"maxResults": 20,
"enableContactExtraction": true,
"geminiApiKey": "your-gemini-api-key"
}

With job listing extraction

Find businesses and automatically extract open positions from their career pages:

{
"searchStrings": ["software companies in Berlin"],
"maxResults": 20,
"enableJobExtraction": true,
"geminiApiKey": "your-gemini-api-key"
}

Input parameters

ParameterTypeDefaultDescription
searchStringsstring[][]Simple search strings. Include location in the string for geo-targeting.
queriesobject[][]Structured queries with optional query, location, country, company_id.
maxResultsinteger20Results per query. Max ~120 (Google Maps limit).
languagestring"en"ISO 639-1 language code (en, de, fr, ja, es, pt, it, ko, zh, ar, etc.).
enableContactExtractionbooleanfalseAfter scraping, extract contacts from company websites via AI.
enableJobExtractionbooleanfalseAfter scraping, extract job listings from career pages via AI.
outputLanguagestring"en"Language for AI-extracted fields (en/de/fr/it/es/pt/nl/auto).
geminiApiKeystring--Gemini API key. Recommended for add-ons. Free tier: 1M tokens/min.
groqApiKeystring--Groq API key. Ultra-fast inference. Optional fallback.
openrouterApiKeystring--OpenRouter API key. Access 100+ models. Optional fallback.
excludeCidsstring[][]Google CIDs to skip. Useful for excluding already-scraped places.
maxConcurrencyinteger10Parallel HTTP requests (1-20).
requestDelayinteger300Delay between pagination requests in milliseconds (100-10,000).
proxyConfigurationobjectApify proxyProxy settings. Datacenter proxies work well.

Use either searchStrings or queries (or both). With searchStrings, each string is sent directly to Google Maps. With queries, you can separate the search term from the location and attach your own company_id for linking results back to your data.

Output

Each result contains 30+ fields. Here is an example:

{
"company_id": "restaurants in Paris",
"title": "Le Petit Cler",
"category": "French restaurant",
"categories": ["French restaurant", "Restaurant"],
"address": "3 Rue Cler, 75007 Paris, France",
"complete_address": {
"street": "3 Rue Cler",
"city": "Paris",
"postal_code": "75007",
"state": "Ile-de-France",
"country": "France"
},
"latitude": 48.8571,
"longitude": 2.3007,
"plus_code": "8FW4V87C+X3",
"timezone": "Europe/Paris",
"phone": "+33 1 45 51 24 52",
"website": "https://www.lepetitcler.com/",
"emails": [],
"review_rating": 4.5,
"review_count": 1823,
"reviews_per_rating": { "1": 42, "2": 31, "3": 89, "4": 312, "5": 1349 },
"reviews_link": "https://search.google.com/local/reviews?placeid=...",
"user_reviews": [
{
"name": "Marie Dupont",
"rating": 5,
"text": "Excellent cuisine, warm atmosphere...",
"published_at": "2 months ago"
}
],
"status": "OPERATIONAL",
"price_range": "$$",
"open_hours": {
"Monday": ["12:00-14:30", "19:00-22:30"],
"Tuesday": ["12:00-14:30", "19:00-22:30"],
"Wednesday": ["12:00-14:30", "19:00-22:30"],
"Thursday": ["12:00-14:30", "19:00-22:30"],
"Friday": ["12:00-14:30", "19:00-23:00"],
"Saturday": ["12:00-23:00"],
"Sunday": []
},
"thumbnail": "https://lh3.googleusercontent.com/places/...",
"images": [
{ "title": "Interior", "image": "https://lh3.googleusercontent.com/..." }
],
"owner": { "name": "Le Petit Cler", "link": "https://maps.google.com/..." },
"about": [
{ "id": "dine_in", "name": "Dine-in" },
{ "id": "reservations", "name": "Reservations" }
],
"reservations": [
{ "link": "https://www.thefork.com/...", "source": "TheFork" }
],
"order_online": [],
"menu": { "link": "https://www.lepetitcler.com/menu", "source": "lepetitcler.com" },
"description": "Cozy French bistro in the heart of the 7th arrondissement.",
"link": "https://www.google.com/maps/place/Le+Petit+Cler/...",
"cid": "12345678901234567",
"data_id": "0x47e671a4e...",
"searchString": "restaurants in Paris",
"_rank": 1,
"scraped_at": "2026-03-05T10:30:00.000Z"
}

Complete field reference

FieldTypeDescription
company_idstringYour reference ID (from queries) or the search string
titlestringBusiness name
categorystringPrimary Google Maps category
categoriesstring[]All assigned categories
addressstringFull formatted address
complete_addressobjectParsed components: street, city, postal_code, state, country
latitudenumberGPS latitude
longitudenumberGPS longitude
plus_codestringGoogle Plus Code
timezonestringIANA timezone identifier
phonestringPhone number
websitestringWebsite URL
emailsstring[]Email addresses found on the listing
open_hoursobjectOpening hours grouped by day of week
popular_timesobjectVisitor traffic patterns by hour and day
price_rangestringPrice level ($ to $$$$)
statusstringOPERATIONAL, CLOSED_TEMPORARILY, or CLOSED_PERMANENTLY
review_countintegerTotal number of reviews
review_ratingnumberAverage rating (1.0 to 5.0)
reviews_per_ratingobjectBreakdown of reviews by star rating (1 through 5)
reviews_linkstringDirect URL to all reviews
user_reviewsarraySample reviews with name, rating, text, date, owner response
thumbnailstringMain business photo URL
imagesarrayAdditional photos with titles
reservationsarrayReservation links with source (TheFork, OpenTable, etc.)
order_onlinearrayOnline ordering links with source
menuobjectMenu link and source
ownerobjectBusiness owner name and profile link
aboutarrayAmenities and features (dine-in, Wi-Fi, wheelchair access, etc.)
descriptionstringBusiness description from Google
linkstringFull Google Maps URL for this place
cidstringGoogle Maps CID -- stable identifier that persists across name/address changes
data_idstringGoogle internal data ID
searchStringstringThe search query that produced this result
_rankintegerPosition in search results (1-based)
scraped_atstringISO 8601 timestamp

Enrichment add-ons

After the Maps scrape completes, this actor can automatically trigger AI-powered extraction on every website found in the results. Each add-on runs as a separate actor and produces its own dataset.

Contact extraction

Extracts team member names, email addresses, phone numbers, positions, and departments from company websites. Powered by the Website Contact Extractor.

Enable it by setting enableContactExtraction: true and providing at least one LLM API key. The sub-actor run ID is stored in the key-value store as CONTACT_EXTRACTOR_RUN_ID.

Job listing extraction

Extracts open positions, job titles, locations, departments, and career page URLs from company websites. Powered by the Website Job Extractor.

Enable it by setting enableJobExtraction: true and providing at least one LLM API key. The sub-actor run ID is stored in the key-value store as JOB_EXTRACTOR_RUN_ID.

LLM API keys

Both add-ons use LLMs to extract structured data. Provide one or more API keys. When multiple keys are provided, the system uses them in priority order with automatic fallback:

  1. Gemini (recommended) -- Best quality-to-cost ratio. Free tier includes 1M tokens/min. Get a key at Google AI Studio.
  2. Groq (optional) -- Ultra-fast inference. Get a key at Groq Console.
  3. OpenRouter (optional) -- Access to 100+ models. Get a key at OpenRouter.

One key is sufficient. With multiple keys, if the primary provider hits a rate limit, the system falls back to the next available provider automatically.

Use cases

  • Lead generation -- Search for businesses by type and location. Get phone numbers, websites, and emails in one run.
  • Market research -- Map competitors in a geographic area with ratings, review counts, and price ranges.
  • Company enrichment -- Add addresses, phone numbers, GPS coordinates, and opening hours to your existing database.
  • Local SEO monitoring -- Track your business listing and competitor rankings across locations.
  • Real estate analysis -- Find nearby amenities, restaurants, and services for property listings.
  • Hiring intelligence -- Discover companies in a region and extract their open positions in a single pipeline.
  • Review analysis -- Collect review ratings and sample reviews across competitors for sentiment analysis.

Excluding already-scraped places

Use the excludeCids parameter to skip places you have already scraped. The CID (Customer ID) is a stable Google Maps identifier that does not change even if the business changes its name or address.

{
"searchStrings": ["cafes in Zurich"],
"maxResults": 100,
"excludeCids": ["12345678901234567", "98765432109876543"]
}

This is useful for incremental scraping workflows where you want to collect only new results.

Pricing

All 30+ fields are included per place. No extra charges for reviews, photos, opening hours, parsed addresses, or any other field.

Apify PlanPer 1,000 placesPer place
Free / Starter$3.75$0.00375
Scale (Silver)$2.75$0.00275
Business (Gold)$1.75$0.00175
Add-onPricing
Contact extractionBilled separately by the Website Contact Extractor
Job listing extractionBilled separately by the Website Job Extractor

Cost examples:

  • 20 places (1 query): ~$0.08 on Free/Starter
  • 100 places (5 queries): ~$0.38 on Free/Starter
  • 1,000 places (50 queries): ~$3.75 on Free/Starter, ~$1.75 on Business
  • 10,000 places: ~$37.50 on Free/Starter, ~$17.50 on Business

Platform compute costs (memory, CPU) are minimal due to the HTTP-only architecture (~80 MB RAM). A typical run of 100 results uses approximately 0.005 compute units.

Limitations

  • ~120 results per query -- Google Maps returns a maximum of approximately 120 places per search query. For broader coverage, split your search into multiple queries by neighborhood or sub-region.
  • No individual place detail pages -- Data comes from search results, not from visiting each place page individually. Most fields are populated, but some niche fields (full review text, all photos) may be limited to what Google includes in search results.
  • Search relevance -- Results depend on Google's ranking algorithm. The same query may return slightly different results over time.
  • Rate limiting -- Very high concurrency or very low request delays may trigger temporary blocks from Google. The defaults (10 concurrency, 300ms delay) are tuned for reliability.

Technical details

  • Architecture: Pure HTTP requests to Google's search?tbm=map endpoint. No browser, no Playwright, no Puppeteer.
  • TLS fingerprinting: Uses got-scraping to present a realistic browser TLS fingerprint. This is critical -- plain HTTP clients receive empty responses from Google.
  • Pagination: 20 results per page. The scraper automatically paginates to reach your maxResults target.
  • Proxy: Datacenter proxies work reliably. No residential proxy required.
  • CID stability: The Google CID is a permanent identifier for a place. Use it for deduplication and incremental scraping.
  • Memory: Runs at ~80 MB. Allocated 128-512 MB on Apify (128 MB is sufficient for most runs).

Support

Found a bug or have a feature request? Open an issue.

Changelog

v4.0 (2026-03-05)

  • Worldwide support (50+ countries, any language)
  • Added searchStrings for simple search mode alongside structured queries
  • Contact extraction add-on via Website Contact Extractor
  • Job listing extraction add-on via Website Job Extractor
  • Multi-LLM support: Gemini, Groq, OpenRouter with automatic fallback
  • Pay-per-result pricing with tier discounts ($0.00375-$0.00175 per place)
  • Default max results increased to 20
  • Default language changed to English

v3.0 (2026-02-27)

  • Complete HTTP-only rewrite (no browser required)
  • Memory reduced from ~1 GB to ~80 MB
  • Speed improved to ~2 results/second

v2.0

  • Single Playwright crawler with DOM fallback
  • Memory reduced from ~1.3 GB to ~978 MB

v1.0 (2025-12-29)

  • Initial release with dual Playwright crawlers
  • DACH region optimized