Google Maps Photos Scraper
Pricing
from $0.82 / 1,000 photo extracteds
Google Maps Photos Scraper
Extract public Google Maps place photos, thumbnails, URLs, and visible metadata from place URLs or search queries.
Pricing
from $0.82 / 1,000 photo extracteds
Rating
0.0
(0)
Developer
Fetch Cat
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
6
Monthly active users
16 hours ago
Last modified
Categories
Share
Google Maps Photos Scraper exports public Google Maps place photos from URLs, share links, Place IDs, and search queries to JSON, CSV, Excel, or an API. Get image links and thumbnails, not downloaded image files. Complete gallery coverage is not guaranteed.
Quick start
Paste this input into the Actor, start a run, then open its dataset to inspect or export the photo records:
{"queries": ["Statue of Liberty National Monument"],"maxPhotosPerPlace": 10}
Provide at least one URL, query, or Place ID. The form's example values are prefills, not API inputs. An empty API input is rejected.
Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.
What you get
Export photo URLs and thumbnails with the place name, Maps identifiers and visible captions when available. The Actor returns links, not image files, and does not collect private photos or Street View imagery. Mixed batches preserve useful photos when an isolated place fails. Inspect RUN_SUMMARY for target-level warnings.
What data can it export?
- Public Google-hosted photo URLs and thumbnail URLs
- Stable photo IDs for deduplication across places and retries
- Place name and resolved Google Maps URL
- Query or URL that produced each record
- Photo order/rank, visible dimensions, captions, and contributor labels when shown
- Google Maps identifiers when present in the public URL
Who is it for?
- Local SEO agencies reviewing the public photo links visible for a client's business locations.
- Hospitality, restaurant and retail teams assembling place-linked media review sheets.
- Lead-research teams adding public photo references to an existing location list.
- Reputation and media analysts comparing their own location exports without assuming complete gallery coverage.
How you can use the data
- Review one landmark's public photo links. Use the existing Statue of Liberty query with a 10-photo cap, then keep
placeName,placeUrl,photoUrlandthumbnailUrltogether in a review sheet. The Actor exports links rather than downloaded files. - Inspect a local category sample. Use the existing pizza-near-Times-Square query with search discovery enabled. Retain
query, place identifiers and photo IDs because a discovery search can include multiple places rather than one gallery. - Compare your own repeat exports. For a known place, use its identifier and keep
photoIdandscrapedAtwith each export. Join the files yourself to review which links recur, without treating missing links as deleted photos or the encounter rank as newest-first order. - Review visible captions and source context. Keep available captions, contributor labels and dimensions alongside source links. Missing values remain unknown,
categoryis always null, and downloading or reusing an image requires a separate permitted workflow.
Input settings
Single landmark or business
{"queries": ["Statue of Liberty National Monument"],"maxPhotosPerPlace": 10,"includeSearchDiscovery": true,"maxConcurrency": 1,"proxyConfiguration": { "useApifyProxy": false }}
Category and location monitoring
{"queries": ["pizza near Times Square New York"],"maxPhotosPerPlace": 25,"includeSearchDiscovery": true,"maxConcurrency": 1}
Existing Google Maps URLs
{"startUrls": [{ "url": "https://www.google.com/maps/search/Eiffel+Tower" }],"maxPhotosPerPlace": 10}
Google business/place share links
startUrls also accepts https://share.google/... business/place links and maps.app.goo.gl links. A business/place share must resolve to the intended Maps place. Ordinary web searches, external destinations, ambiguous results and unresolved identities are rejected rather than returning another place's photos. Search-discovery mode does not relax this requirement.
Completed valid extraction with zero usable public photos succeeds with an empty dataset and a truthful RUN_SUMMARY warning. This does not prove the place has no photos. When Google's visible dialog explicitly requires sign-in to access reviews and photos, the target completes with no rows and a warning explaining that photo access is login-gated. The scraper does not sign in or charge photo events for that target; the run-start fee still applies. A limited or challenged view without that explicit evidence remains an unresolved extraction failure, not ordinary emptiness. Wrong-place resolutions and execution failures also remain actionable failures. No Street View images or fabricated rows are substituted for place photos.
Place ID with original-resolution URLs
{"placeIds": ["ChIJLU7jZClu5kcR4PcOOO6p3I0"],"imageSize": "original","language": "en","country": "FR","maxPhotosPerPlace": 20}
More input settings
| Field | Type | Description |
|---|---|---|
startUrls | array | Google Maps place/search URLs, maps.app.goo.gl or share.google business/place links. Up to 100 unique inputs in total. |
placeIds | array | Place IDs (ChIJ...), feature IDs (0x...:0x...), or numeric CIDs. |
queries | array | Place names or category + location searches. |
maxPhotosPerPlace | integer | Maximum photo records to save per input. |
imageSize | string | thumbnail, medium, large (the backward-compatible default), or original. |
includeSearchDiscovery | boolean | Include visible search-result thumbnails before a result resolves to a single place. |
language | string | Google Maps language code, such as en, de, or pt. |
country | string | Two-letter country code used to regionalize results. |
allowEmptyResults | boolean | Retained compatibility field. Completed valid empty extraction succeeds automatically. It cannot suppress configuration, identity, challenge or execution failures. |
maxRunSeconds | integer | Work deadline from 60 to 270 seconds. The Actor reserves 30 seconds for checkpointing. |
maxConcurrency | integer | 1–3 targets in parallel. Default 1. Higher concurrency uses more memory and can increase blocking. |
proxyConfiguration | object | Optional connection settings. Direct by default. See the field help for supported proxy settings and limitations. |
Output data
Illustrative record shape only. Abbreviated URLs below are not downloadable examples. Optional labels and dimensions can be null.
{"placeName": "Statue of Liberty","placeUrl": "https://www.google.com/maps/place/...","placeId": "0x89c25090129c363d:0x40c6a5770d25022b","cid": null,"query": "Statue of Liberty National Monument","rank": 1,"photoId": "79d631fd633b36afc9bf1218","photoUrl": "https://lh3.googleusercontent.com/...=w2048-h2048-k-no","thumbnailUrl": "https://lh3.googleusercontent.com/...=w320-h320-k-no","imageWidth": 408,"imageHeight": 544,"category": null,"caption": "Photo of Statue of Liberty","contributorName": null,"extractionSource": "photometa","scrapedAt": "2026-07-10T10:00:00.000Z"}
More output fields
| Field | Description |
|---|---|
placeName | Visible Google Maps place name when available. |
placeUrl | Resolved Maps URL used for extraction. |
placeId, cid | Google Maps identifiers when present in the URL. |
query | Query that produced the record, if any. |
rank | Encounter order within the input, not a popularity or newest-first sort. Gaps can remain after duplicate photos are removed. |
photoId | Deterministic photo identifier used for cross-target and retry deduplication. |
photoUrl | Google-hosted photo URL at the requested resolution. |
thumbnailUrl | Google-hosted 320 px preview URL. |
imageWidth, imageHeight | Source dimensions when available, not a measurement of the requested resized image. |
category | Reserved compatibility field. Currently always null. Category filtering and labels are not supported. |
caption | Visible alt text or aria label when available. |
contributorName | Public contributor/owner label when visible. |
extractionSource | dom for a visible image or photometa for browser-delivered photo metadata. |
scrapedAt | ISO timestamp for the scrape. |
Download your results
Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.
See Apify's download and export guide for the available formats and field options.
Pricing
A one-time start event is charged for initialization, including runs that later return no photos or fail. A photo event is charged only for each successfully saved photo row. Failed targets, duplicate photos and error or status messages are not charged as photo records.
See the live Pricing tab for current event rates and subscription-tier discounts.
Tips for best results
- Name the place and its city together. A query such as
Hotel Chelsea New Yorkis more specific than a business name alone. - Keep search discovery enabled for category research. Queries such as
coffee shops near Shibuya Tokyocan expose thumbnails from several places, so retain each row's place context. - Start with a small photo cap and one concurrent target. Inspect the links and resolved place before expanding the batch.
- Use a known place identifier for repeated location checks. This reduces ambiguity without guaranteeing gallery completeness.
- Keep the default connection settings for an initial sample. Changing connection settings does not guarantee access or complete photos.
Limits and caveats
Only public photo URLs and visible public metadata are in scope. There is no login or private-content access. Google Maps can change its interface or limit traffic, and no run guarantees a complete gallery. Search discovery can include multiple places. Use a specific place URL or identifier for a single place.
Runs support up to 100 unique targets and 200 saved photos per input, with a default of 10. The original processing budget is at most 270 seconds, including a 30-second cleanup reserve. A large batch may remain unfinished. Keep concurrency at 1 for initial runs.
RUN_SUMMARY reports saved counts, failed/pending inputs and warnings. Completed empty extraction reports a reason without claiming that a place is private or deleted. Suspected extraction defects and fatal failures are not hidden.
Automation and integrations
Save your settings for next time
Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.
Run on a schedule
Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.
Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.
Send results to your other tools
Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.
For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.
API usage
Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.
The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.
For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~google-maps-photos-scraper/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \--data @- <<'JSON'{"queries": ["Statue of Liberty National Monument"],"maxPhotosPerPlace": 10}JSON
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/google-maps-photos-scraper').call({"queries": ["Statue of Liberty National Monument"],"maxPhotosPerPlace": 10});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/google-maps-photos-scraper').call(run_input={'queries': ['Statue of Liberty National Monument'], 'maxPhotosPerPlace': 10})print(client.dataset(run['defaultDatasetId']).list_items().items)
MCP and AI agents
You can ask your AI assistant to collect data with Google Maps Photos Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.
Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.
Easier setup with an Apify plugin
If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.
Use Apify AI in Console
Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Google Maps Photos Scraper. You can describe the data you want and ask questions about the results.
Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.
Choose your assistant
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
Connect just this scraper
To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/google-maps-photos-scraper"}}}
Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.
Use Apify's general server
Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Google Maps Photos Scraper by Fetch Cat, or give it the identifier fetch_cat/google-maps-photos-scraper.
Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.
Example requests
- “Use Fetch Cat’s Google Maps Photos Scraper to collect up to 10 public photo links for Statue of Liberty National Monument. Show place names, thumbnails and source links without downloading image files.”
- “Collect up to 5 photo records per input for pizza near Times Square New York with search discovery enabled. Keep place identifiers and the original query, and explain that several places may appear.”
- “Retrieve up to 5 photo records for Place ID ChIJLU7jZClu5kcR4PcOOO6p3I0 with original-resolution URLs, English and country FR. Keep photo IDs and collection times for my own comparison, marking unavailable captions or dimensions.”
Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.
Pay with x402
If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.
Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.
Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.
Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.
Other ways for agents to pay
Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.
FAQ
Does it download image files?
No. It exports public image URLs and thumbnails. You can download files separately if your use case allows it.
Can it scrape private photos?
No. Only public Google Maps media visible without login is in scope.
Why are some fields empty?
Captions, contributor labels, dimensions and identifiers can be null when unavailable. category is always null in this Actor. It does not extract gallery categories or filter photos by category.
Is this a Google Maps Photos API?
You can call it through the Apify API or MCP to return public photo links. It is not Google's official Places Photo API and does not require a Google API key. It provides no history, Street View, videos, private photos or guaranteed gallery completeness.
Why did a zero-photo run fail?
An empty result can mean an unavailable place or a public view exposing no usable photos. Inspect RUN_SUMMARY for the reason. It does not establish privacy or deletion. Challenges, unresolved or wrong-place identities and fatal execution errors are not treated as ordinary empty results.
Can a stopped run continue safely?
Multi-target runs save pending targets and seen photo IDs in RUN_CHECKPOINT. Resumption preserves completed output and successful charges, but does not renew the original processing deadline. An expired deadline cannot be extended by resurrecting the run.
Related Actors
More Google scrapers
- Google Hotels Scraper — Collect public hotel listings with displayed stay prices and available ratings for travel research.
- Google News Scraper — Collect news headlines, publisher names, dates and feed links, without full article text.
- Google Scholar Profiles Scraper — Collect public academic-profile metadata and visible citation metrics from known author profiles.
- Google Autocomplete Scraper — Collect suggested search phrases from seed keywords with country and language context.
- Google Maps Reviews Scraper — Collect public place reviews, ratings and available reviewer details for location-feedback analysis.
Support and feedback
For custom additions or integrations, email hello@fetchcat.dev.
Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.
Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.
Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.
Made with care for curious people, AI agents and the possibilities in data. ♥