Google Maps Place Photos Scraper - Images, Dates & Captions
Pricing
from $0.22 / 1,000 photos
Google Maps Place Photos Scraper - Images, Dates & Captions
Google Maps place photos scraper: the photos on a Google Maps place, one row per picture with an image link at the width you pick, the pixel size, upload date, caption and where the picture is pinned. Paste a Maps link, a Share link or a place id. No Google account. $0.23 per 1,000 photos.
Pricing
from $0.22 / 1,000 photos
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
4
Monthly active users
17 hours ago
Last modified
Security
Limited permissionsShare
Google Maps place photos scraper for a place, a Place ID, a name or a search, photos and videos back as rows: an image link at the width you choose or at the original size, the native pixel size, the upload date, the spot Google pins the picture to, and the caption when somebody wrote one. Videos and Street View shots come labelled.
The limit to plan around: by default each place gives you up to 150 pictures, out of the 67,469 Google said the
Seattle roastery had when we tested. Turn on fullGallery to keep reading: Google listed 3,093 of that roastery's
photos before its list ran out. Since 29 October 2026 Google's gallery shows two or so clips a place and no Street
View shots. Rows name the photographer only with photographerName on. And the form arrives filled in with a real
place and 30 photos, so pressing Start without editing it runs that job and bills the photos it finds.
| Input | Google Maps place links, Share links, ?cid= links, place ids, Google Place IDs, place names, or search terms with a location or an area |
| Output | One row per photo or video, with the place's details if you ask |
| Ceiling | 150 per place, or with fullGallery as far as Google's list goes (3,093 on the place we tested); 100 places and 20,000 rows per run |
| Account needed | None |
| Price | $0.23 per 1,000 photos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 21,000 |
🔍 What Google Maps Place Photos Scraper does
Open a place on Google Maps and click its photos. That grid is what this reads. Each picture becomes a row with a link to the image at the width you set, the thumbnail Google showed, the native size, the date it went up and its coordinates.
A run can take several places. maxPhotos is split evenly between them and maxPhotosPerPlace caps
any single one, so one busy place can't eat the whole budget. You can also name places, or search Maps for
dentist in a city or inside a circle on the map, and the places found are read the same way.
You can keep everything, photographs only, videos only or Street View only. Whatever you drop is never charged.
Switch on placeDetails and every row also carries the place's rating, address, phone, website and opening hours.
The rating, closed and category filters leave places out before their photos are read.
📋 What data you get from each Google Maps photo
| What you get | Field |
|---|---|
| The picture at the width you asked for, and the small version Google showed | photoUrl, thumbnailUrl |
| The picture's native size | width, height |
| Photo, video or Street View | mediaType |
| A video's length and a link to the clip | videoDurationMs, videoUrl |
| What the uploader typed, when they typed anything | caption |
| When it went up, to the hour | uploadedAt |
| Where Google pins that picture | latitude, longitude |
| Google's id for the picture | photoId |
| The kind of app it was posted from, and whether it came with a review | uploadSource, postedWithReview |
With photographerName on, a paid extra: the name the photographer shows on Google Maps | photographerName |
| The place: its name, Google's ids, the numeric id and a link | placeName, placeId, googlePlaceId, cid, placeUrl |
| How many photos Google says the place has | placeTotalPhotos |
With placeDetails on: rating, reviews, categories, address, phone, website, hours, closed or not | placeRating, placeReviewCount, placeCategories, placeAddress, placePhone, placeWebsite, placeOpeningHours, placeClosed |
| The link, id, name or search term you gave | target, and searchTerm on rows from a search |
▶️ How to scrape Google Maps photos
- Open Google Maps Place Photos Scraper and click Try for free.
- Open the place on Google Maps, copy the link from the address bar and paste it into Google Maps places, one place per line. Delete the example first. Place IDs, names and searches have their own fields.
- Set Maximum photos per place and Maximum photos for the run.
- Pick What to keep, and tick Keep reading past the first page if you want more than 150 a place.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost to scrape Google Maps photos?
$0.23 per 1,000 photos on the Free plan. Paid plans pay a little less: $0.228 on Starter, $0.226 on Scale and $0.224 on Business. On the free plan, the $5 Apify gives you each month covers about 21,000 photos. A video or a Street View row counts as one photo.
You pay per row delivered. Searches, place details and filters add nothing. photographerName is the one paid extra: a
photo that comes back with a name is billed once more, at the Pricing tab's price. The sample row and the diagnostic rows
are never charged, and neither is anything mediaType or a filter left out, or a place you pasted twice.
📥 What you give it
{"placeUrls": ["https://www.google.com/maps/place/Starbucks+Reserve+Roastery/data=!4m2!3m1!1s0x54906acdccf44db1:0x6da0c1f2d7a6736e"],"maxPhotosPerPlace": 30,"maxPhotos": 200,"mediaType": "all","imageWidth": 1600}
| Field | If you leave it empty | What it is |
|---|---|---|
placeUrls | the free sample row | Places: the address-bar link with the place open, the short link from the Share button, a ?cid= link, or Google's own 0x...:0x... place id. Up to 100 places a run, names and searches included. The form arrives with a Seattle Starbucks in it. |
placeIds | empty | Google Place IDs in the ChIJ... form. |
placeNames | empty | Names like Pike Place Market Seattle. Google's top match is read only when its name is the one you typed. |
maxPhotosPerPlace | 50 | The most rows one place may produce, 1 to 10,000. The form suggests 30. Without fullGallery a place stops at 150. |
maxPhotos | 200 | Rows for the whole run, 1 to 20,000, shared evenly between your places. |
mediaType | all | all, photos (no videos or Street View), videos or street_view. Google's gallery lists two or so clips a place and, since 29 October 2026, no Street View shots. |
imageWidth | 1600 | Width in pixels for photoUrl, 100 to 4,096. The height follows the picture's own shape. |
fullGallery | off | Keep reading a place's later pages until maxPhotosPerPlace or the end of Google's list for it (3,093 on the place we tested). The later pages are photographs. |
newestFirst | off | Sort each place's rows by upload date. It sorts what was read for that place, so a busy place's newest picture can sit deeper. |
originalSize | off | photoUrl at the picture's native size instead of imageWidth. |
photographerName | off | Adds the name each photographer shows on Google Maps, and nothing else about them. It takes one more request per photo, so the run takes longer. Street View shots have no name. |
searchTerms | empty | What to search Maps for, like coffee. Needs searchLocation, searchCircle or searchPolygon. |
searchLocation | empty | Where to search, like Seattle, WA. If Google can't place it, you get a free row instead of places from somewhere else. |
searchCircle | empty | latitude, longitude, radius in km, up to 100 km. Only places inside are kept. |
searchPolygon | empty | Three or more latitude, longitude corners. Only places inside are kept. |
maxPlacesPerSearch | 20 | Places to read per search term, 1 to 100. |
placeDetails | off | Adds the place columns to every row. The phone and website are the ones the business publishes on Google. |
minRating | empty | Leave out places rated under this, or with no rating. |
skipClosed | off | Leave out places Google shows as closed. |
placeCategories | empty | Keep places whose Google categories contain one of these words. |
language | en | Two-letter interface language for the request. |
country | us | Two-letter country code for the request. |
proxyUrls | empty | Only if you want the requests to go out through servers of your own, as http://user:pass@host:port. |
📤 What you get back
A real row read on 24 October 2026, with the two image links cut short:
{"ok": true,"charged": true,"recordType": "photo","target": "https://www.google.com/maps/place/Starbucks+Reserve+Roastery/data=!4m2!3m1!1s0x54906acdccf44db1:0x6da0c1f2d7a6736e","placeName": "Starbucks Reserve Roastery","placeId": "0x54906acdccf44db1:0x6da0c1f2d7a6736e","cid": "7899526995152106350","placeUrl": "https://www.google.com/maps?cid=7899526995152106350","photoId": "CIHM0ogKEICAgIC-7fOx6AE","mediaType": "photo","photoUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLd27dAXJDY_z9RzJf2V63nvdUiB89fx8dVfaL385IL...=w1600-h900-k-no","thumbnailUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLd27dAXJDY_z9RzJf2V63nvdUiB89fx8dVfaL385IL...=w203-h114-k-no","caption": null,"width": 4032,"height": 2268,"uploadedAt": "2022-11-10T20:00:00.000Z","latitude": 47.6140399947503,"longitude": -122.328100047145,"videoDurationMs": null,"videoUrl": null,"scrapedAt": "2026-10-24T16:44:22.032Z","googlePlaceId": "ChIJsU30zM1qkFQRbnOm1_LBoG0","placeTotalPhotos": 67469,"uploadSource": "android","postedWithReview": false}
| Field | How to read it |
|---|---|
width, height | The picture's native size, so you can tell when imageWidth asked for more pixels than exist. |
videoDurationMs, videoUrl | On a video row, the clip's length in milliseconds and a link to the clip. Null on photos. |
caption | Null when the uploader typed nothing, or only the place's name. Most rows have none. |
uploadedAt | In UTC, to the hour. Google doesn't give the minute. |
latitude, longitude | Where Google pins that picture. It can differ from photo to photo, so it isn't the business's own pin. |
placeId | Google's internal id for the place, in the same 0x…:0x… form Google Maps Scraper writes. The one to join on. |
googlePlaceId | The same place as a ChIJ... Place ID. |
placeTotalPhotos | Google's own count when the run asked. It moves from day to day. |
uploadSource | android, ios, web, street_view_app, business_profile (posted through Google's tools for business profiles) or other. |
placeOpeningHours | The coming week as Google shows it, Monday first. |
photoId | Google's id for the picture. It stayed the same between our runs, so diff on it to find new pictures. |
photographerName | There only with photographerName on, as the last column. Null when Google gives no name for that picture. |
🧾 Reading the output
Three kinds of row can land in the dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A picture | charged: true | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true, with an errorCode and a details sentence | no |
The sample row only turns up when no place, name or search is given. It also says recordType: "photo", so
filter on _sample and _diagnostic being absent rather than on recordType.
errorCode | What it means |
|---|---|
PLACE_NOT_RESOLVED | The link couldn't be tied to a place, or Google's match for a name wasn't the name you typed. |
NO_PHOTOS | The place's first gallery page has no pictures of that kind. |
NOT_SERVED | This photo was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here. |
GALLERY_CUT_SHORT | Google stopped sending a place's later pages. What came before is delivered; the rest wasn't charged. |
DUPLICATE_PLACE | The same place was given twice, so it was read once. |
FILTERED_OUT, DETAILS_NOT_READ | A filter left the place out, or its details didn't come back so the filters couldn't be checked. |
SEARCH_NOT_PLACED, NO_PLACES_FOUND | Google didn't search where you asked, or the search found nothing to read. |
PHOTOGRAPHER_NAMES_STOPPED | Names stopped partway through the run. The photos after it still come, without a name, and no name is charged for them. |
TIME_BUDGET | The run reached its time limit. The photos already delivered stay, and the rest were not charged. The run still ends as succeeded, with an amber status message, even when the time limit stopped it before any photo came back. |
BAD_INPUT, NETWORK and the rest | The details sentence says what happened. |
UNEXPECTED_ERROR | The run stopped early on an unexpected error. The results before this row are kept. |
💡 What people use it for
- Watching a place change over time. Turn on
newestFirstwithfullGallery, and a refit or a new sign shows up in the first rows. - Comparing the branches of a chain by what their galleries actually show.
From a city search to photos with their places' ratings, in three steps:
- Put
cafesin Search terms andLisbon, Portugalin Search location. - Tick Add place details and set Minimum rating to 4.5, with
mediaTypeonphotos. - Each row comes with its café's rating, address and hours. For reviews or more about each place, join on
placeIdwith the output of Google Maps Scraper.
🚧 What it does not do
- Many clips, or Street View. Since 29 October 2026 Google's gallery lists two or so clips at the top and no
Street View shots, so
videosbrings back a few andstreet_viewusually none. - Photo tabs like Menu or By owner. Google doesn't show them on the public page, so rows carry no tab label.
- The photographer's profile. Only the name they show, never their link, id or picture.
- Reviews. No review text. The scrapers below cover those.
- Captions you can count on. Most pictures have none.
- Upload minutes. Dates stop at the hour.
- More than 100 places in one run. Split a longer list across runs.
- It is not an official Google tool. Dami's Studio is independent and is not affiliated with or endorsed by Google, or by any other company named on this page.
🧭 Which Google Maps scraper do you need?
| If you want | Use |
|---|---|
| Places from a search, with reviews optional | Google Maps Scraper |
| Reviews for a place you can link or name, with exact dates | Google Maps Reviews Scraper |
| The photos and videos on a place | This one |
| Only what changed in your own locations' reviews, on a schedule | Google Reviews Monitor |
| Businesses in Russia and the CIS, from Yandex Maps | Yandex Maps Scraper |
❓ Questions people ask
Do I need a Google API key or account to get Google Maps photo links?
No. The gallery is public, and the run needs nothing from you but the place.
How do I get the link for a place?
Open it on Google Maps and copy the address bar, or press Share and copy the short link. Either works. A Place ID or the place's name works too, in their own fields.
Can I get the original resolution?
Turn on originalSize and photoUrl asks for the picture at its native size, which reached 12,387 pixels wide on
a panorama we tested. Without it, imageWidth goes up to 4,096.
Why did I get fewer photos than I asked for?
Without fullGallery each place stops at 150, and with it Google's list for a place can end long
before the total it reports. maxPhotos is split between your places, mediaType drops whatever you didn't ask
for, and the filters leave places out.
Can I call it from code or connect it to an AI assistant?
The API tab has code for Python,
JavaScript and the CLI. MCP clients like Claude and ChatGPT use
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-maps-place-photos-scraper; coding assistants can
load our skill
file. All
three bill your Apify account at the same price.
Can I use the photos?
Reading a public gallery is one question and republishing a picture is another. Each photo belongs
to whoever took it, so check the rights before you publish one. With photographerName on, each row names a
person, which GDPR and similar laws cover: keep names only if you need them. Apify's write-up on
the legality of web scraping covers the first part,
and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page and send the place link and the run ID. The diagnostic row in the dataset usually names the reason already.