Google Maps Place Photos Scraper - Images, Dates & Captions avatar

Google Maps Place Photos Scraper - Images, Dates & Captions

Pricing

from $0.22 / 1,000 photos

Go to Apify Store
Google Maps Place Photos Scraper - Images, Dates & Captions

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

4

Monthly active users

17 hours ago

Last modified

Security

Limited permissions

Share

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.

InputGoogle Maps place links, Share links, ?cid= links, place ids, Google Place IDs, place names, or search terms with a location or an area
OutputOne row per photo or video, with the place's details if you ask
Ceiling150 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 neededNone
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 getField
The picture at the width you asked for, and the small version Google showedphotoUrl, thumbnailUrl
The picture's native sizewidth, height
Photo, video or Street ViewmediaType
A video's length and a link to the clipvideoDurationMs, videoUrl
What the uploader typed, when they typed anythingcaption
When it went up, to the houruploadedAt
Where Google pins that picturelatitude, longitude
Google's id for the picturephotoId
The kind of app it was posted from, and whether it came with a reviewuploadSource, postedWithReview
With photographerName on, a paid extra: the name the photographer shows on Google MapsphotographerName
The place: its name, Google's ids, the numeric id and a linkplaceName, placeId, googlePlaceId, cid, placeUrl
How many photos Google says the place hasplaceTotalPhotos
With placeDetails on: rating, reviews, categories, address, phone, website, hours, closed or notplaceRating, placeReviewCount, placeCategories, placeAddress, placePhone, placeWebsite, placeOpeningHours, placeClosed
The link, id, name or search term you gavetarget, and searchTerm on rows from a search

▶️ How to scrape Google Maps photos

  1. Open Google Maps Place Photos Scraper and click Try for free.
  2. 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.
  3. Set Maximum photos per place and Maximum photos for the run.
  4. Pick What to keep, and tick Keep reading past the first page if you want more than 150 a place.
  5. 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
}
FieldIf you leave it emptyWhat it is
placeUrlsthe free sample rowPlaces: 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.
placeIdsemptyGoogle Place IDs in the ChIJ... form.
placeNamesemptyNames like Pike Place Market Seattle. Google's top match is read only when its name is the one you typed.
maxPhotosPerPlace50The most rows one place may produce, 1 to 10,000. The form suggests 30. Without fullGallery a place stops at 150.
maxPhotos200Rows for the whole run, 1 to 20,000, shared evenly between your places.
mediaTypeallall, 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.
imageWidth1600Width in pixels for photoUrl, 100 to 4,096. The height follows the picture's own shape.
fullGalleryoffKeep 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.
newestFirstoffSort 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.
originalSizeoffphotoUrl at the picture's native size instead of imageWidth.
photographerNameoffAdds 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.
searchTermsemptyWhat to search Maps for, like coffee. Needs searchLocation, searchCircle or searchPolygon.
searchLocationemptyWhere to search, like Seattle, WA. If Google can't place it, you get a free row instead of places from somewhere else.
searchCircleemptylatitude, longitude, radius in km, up to 100 km. Only places inside are kept.
searchPolygonemptyThree or more latitude, longitude corners. Only places inside are kept.
maxPlacesPerSearch20Places to read per search term, 1 to 100.
placeDetailsoffAdds the place columns to every row. The phone and website are the ones the business publishes on Google.
minRatingemptyLeave out places rated under this, or with no rating.
skipClosedoffLeave out places Google shows as closed.
placeCategoriesemptyKeep places whose Google categories contain one of these words.
languageenTwo-letter interface language for the request.
countryusTwo-letter country code for the request.
proxyUrlsemptyOnly 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
}
FieldHow to read it
width, heightThe picture's native size, so you can tell when imageWidth asked for more pixels than exist.
videoDurationMs, videoUrlOn a video row, the clip's length in milliseconds and a link to the clip. Null on photos.
captionNull when the uploader typed nothing, or only the place's name. Most rows have none.
uploadedAtIn UTC, to the hour. Google doesn't give the minute.
latitude, longitudeWhere Google pins that picture. It can differ from photo to photo, so it isn't the business's own pin.
placeIdGoogle's internal id for the place, in the same 0x…:0x… form Google Maps Scraper writes. The one to join on.
googlePlaceIdThe same place as a ChIJ... Place ID.
placeTotalPhotosGoogle's own count when the run asked. It moves from day to day.
uploadSourceandroid, ios, web, street_view_app, business_profile (posted through Google's tools for business profiles) or other.
placeOpeningHoursThe coming week as Google shows it, Monday first.
photoIdGoogle's id for the picture. It stayed the same between our runs, so diff on it to find new pictures.
photographerNameThere 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.

RowHow to spot itCharged
A picturecharged: trueyes
The sample row_sample: trueno
A diagnostic_diagnostic: true, with an errorCode and a details sentenceno

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.

errorCodeWhat it means
PLACE_NOT_RESOLVEDThe link couldn't be tied to a place, or Google's match for a name wasn't the name you typed.
NO_PHOTOSThe place's first gallery page has no pictures of that kind.
NOT_SERVEDThis photo was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here.
GALLERY_CUT_SHORTGoogle stopped sending a place's later pages. What came before is delivered; the rest wasn't charged.
DUPLICATE_PLACEThe same place was given twice, so it was read once.
FILTERED_OUT, DETAILS_NOT_READA filter left the place out, or its details didn't come back so the filters couldn't be checked.
SEARCH_NOT_PLACED, NO_PLACES_FOUNDGoogle didn't search where you asked, or the search found nothing to read.
PHOTOGRAPHER_NAMES_STOPPEDNames stopped partway through the run. The photos after it still come, without a name, and no name is charged for them.
TIME_BUDGETThe 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 restThe details sentence says what happened.
UNEXPECTED_ERRORThe 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 newestFirst with fullGallery, 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:

  1. Put cafes in Search terms and Lisbon, Portugal in Search location.
  2. Tick Add place details and set Minimum rating to 4.5, with mediaType on photos.
  3. Each row comes with its café's rating, address and hours. For reviews or more about each place, join on placeId with 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 videos brings back a few and street_view usually 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 wantUse
Places from a search, with reviews optionalGoogle Maps Scraper
Reviews for a place you can link or name, with exact datesGoogle Maps Reviews Scraper
The photos and videos on a placeThis one
Only what changed in your own locations' reviews, on a scheduleGoogle Reviews Monitor
Businesses in Russia and the CIS, from Yandex MapsYandex Maps Scraper

❓ Questions people ask

No. The gallery is public, and the run needs nothing from you but the 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.