Google Maps Scraper
Pricing
from $1.75 / 1,000 place scrapeds
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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:
| Metric | Value |
|---|---|
| Speed | ~20 results in 10 seconds |
| Memory | ~80 MB RAM |
| Max results per query | ~120 (6 pages of 20) |
| Proxy type | Datacenter (included with Apify) |
| Concurrency | Up to 20 parallel queries |
Quick start
Simple search
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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchStrings | string[] | [] | Simple search strings. Include location in the string for geo-targeting. |
queries | object[] | [] | Structured queries with optional query, location, country, company_id. |
maxResults | integer | 20 | Results per query. Max ~120 (Google Maps limit). |
language | string | "en" | ISO 639-1 language code (en, de, fr, ja, es, pt, it, ko, zh, ar, etc.). |
enableContactExtraction | boolean | false | After scraping, extract contacts from company websites via AI. |
enableJobExtraction | boolean | false | After scraping, extract job listings from career pages via AI. |
outputLanguage | string | "en" | Language for AI-extracted fields (en/de/fr/it/es/pt/nl/auto). |
geminiApiKey | string | -- | Gemini API key. Recommended for add-ons. Free tier: 1M tokens/min. |
groqApiKey | string | -- | Groq API key. Ultra-fast inference. Optional fallback. |
openrouterApiKey | string | -- | OpenRouter API key. Access 100+ models. Optional fallback. |
excludeCids | string[] | [] | Google CIDs to skip. Useful for excluding already-scraped places. |
maxConcurrency | integer | 10 | Parallel HTTP requests (1-20). |
requestDelay | integer | 300 | Delay between pagination requests in milliseconds (100-10,000). |
proxyConfiguration | object | Apify proxy | Proxy 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
| Field | Type | Description |
|---|---|---|
company_id | string | Your reference ID (from queries) or the search string |
title | string | Business name |
category | string | Primary Google Maps category |
categories | string[] | All assigned categories |
address | string | Full formatted address |
complete_address | object | Parsed components: street, city, postal_code, state, country |
latitude | number | GPS latitude |
longitude | number | GPS longitude |
plus_code | string | Google Plus Code |
timezone | string | IANA timezone identifier |
phone | string | Phone number |
website | string | Website URL |
emails | string[] | Email addresses found on the listing |
open_hours | object | Opening hours grouped by day of week |
popular_times | object | Visitor traffic patterns by hour and day |
price_range | string | Price level ($ to $$$$) |
status | string | OPERATIONAL, CLOSED_TEMPORARILY, or CLOSED_PERMANENTLY |
review_count | integer | Total number of reviews |
review_rating | number | Average rating (1.0 to 5.0) |
reviews_per_rating | object | Breakdown of reviews by star rating (1 through 5) |
reviews_link | string | Direct URL to all reviews |
user_reviews | array | Sample reviews with name, rating, text, date, owner response |
thumbnail | string | Main business photo URL |
images | array | Additional photos with titles |
reservations | array | Reservation links with source (TheFork, OpenTable, etc.) |
order_online | array | Online ordering links with source |
menu | object | Menu link and source |
owner | object | Business owner name and profile link |
about | array | Amenities and features (dine-in, Wi-Fi, wheelchair access, etc.) |
description | string | Business description from Google |
link | string | Full Google Maps URL for this place |
cid | string | Google Maps CID -- stable identifier that persists across name/address changes |
data_id | string | Google internal data ID |
searchString | string | The search query that produced this result |
_rank | integer | Position in search results (1-based) |
scraped_at | string | ISO 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:
- Gemini (recommended) -- Best quality-to-cost ratio. Free tier includes 1M tokens/min. Get a key at Google AI Studio.
- Groq (optional) -- Ultra-fast inference. Get a key at Groq Console.
- 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 Plan | Per 1,000 places | Per place |
|---|---|---|
| Free / Starter | $3.75 | $0.00375 |
| Scale (Silver) | $2.75 | $0.00275 |
| Business (Gold) | $1.75 | $0.00175 |
| Add-on | Pricing |
|---|---|
| Contact extraction | Billed separately by the Website Contact Extractor |
| Job listing extraction | Billed 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=mapendpoint. No browser, no Playwright, no Puppeteer. - TLS fingerprinting: Uses
got-scrapingto 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
maxResultstarget. - 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
searchStringsfor simple search mode alongside structuredqueries - 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