Google Maps Place Photos Scraper avatar

Google Maps Place Photos Scraper

Pricing

from $0.22 / 1,000 photos

Go to Apify Store
Google Maps Place Photos Scraper

Google Maps Place Photos Scraper

Get the photos on a Google Maps place, one row per picture: 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

5

Total users

2

Monthly active users

3 days ago

Last modified

Share

Paste a Google Maps place and get its photos and videos back as rows: an image link at the width you choose, the original 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: each place gives you one page of its gallery, which was 150 pictures on the Seattle roastery we tested, out of the 67,548 Google said it had. No row names the person who took the picture, because Google's gallery doesn't say. 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 or place ids
OutputOne row per photo, video or Street View shot
CeilingOne gallery page per place (150 on the place we tested), 50 places and 5,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 keep everything, photographs only (videos and Street View panoramas dropped) or videos only. Whatever you drop is never charged.

📋 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 place: its name, Google's id, the numeric id and a linkplaceName, placeId, cid, placeUrl
The link or id you gave for the placetarget

▶️ 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.
  3. Set Maximum photos per place and Maximum photos for the run.
  4. Pick What to keep: everything, photographs only, or videos only.
  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. The sample row and the diagnostic rows are never charged, and neither is anything mediaType filtered out.

📥 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 rowUp to 50 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. The form arrives with a Seattle Starbucks in it.
maxPhotosPerPlace50The most rows one place may produce, 1 to 1,000. The form suggests 30. A place still stops at its first gallery page.
maxPhotos200Rows for the whole run, 1 to 5,000, shared evenly between your places.
mediaTypeallall, photos (no videos or Street View) or videos (the clips only). All three read the same first gallery page.
imageWidth1600Width in pixels for photoUrl, 100 to 4,096. The height follows the picture's own shape.
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 from a run on 20 September 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/gps-cs-s/AHRPTWlnERVZyB9D3zFYFg7wFEDmh5g...=w1600-h900-k-no",
"thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlnERVZyB9D3zFYFg7wFEDmh5g...=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-09-20T16:19:23.434Z"
}
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.
photoIdGoogle's id for the picture. It stayed the same between our runs, so diff on it to find new pictures.

🧾 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 placeUrls is empty. 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. Paste the address-bar link with the place open, or the Share link.
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. Until 12 October 2026 this code was called BLOCKED.
TIME_BUDGETThe run reached its time limit. The photos already delivered stay, and the rest were not charged. The run ends as failed only when the time limit stopped it before any photo came back.
NETWORK and the restRare. The details sentence says what happened.

💡 What people use it for

  • Watching a place change over time. Sort by uploadedAt and a refit or a new sign shows up in the dates.
  • Comparing the branches of a chain by what their galleries actually show.

From a city search to photos matched to their places, in three steps:

  1. Run Google Maps Scraper on a search like cafes in Lisbon and copy the placeUrl column.
  2. Paste those links into placeUrls here, with maxPhotosPerPlace at 20 and mediaType on photos.
  3. Join the two datasets on placeId, which both actors write the same way, so every picture sits next to its place's name, rating and address.

🚧 What it does not do

  • More than one gallery page per place. That was 150 pictures on the place we tested, out of 67,548. Raising maxPhotosPerPlace doesn't change it.
  • Every video a place has. videos keeps the clips in that one gallery page, which was 10 of 150 on the Eiffel Tower.
  • Name the photographer. Google's gallery carries no uploader, and nothing is guessed.
  • Anything else about the place. No rating, address, hours or reviews. The scrapers below cover those.
  • Captions you can count on. Most pictures have none.
  • Upload minutes. Dates stop at the hour.
  • More than 50 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.

Can I get the original resolution?

Set imageWidth as high as 4,096. Every row reports the native width and height, so you can see when you've asked for more than the picture has.

Why did I get fewer photos than I asked for?

Each place stops at its first gallery page, maxPhotos is split between your places, and mediaType drops whatever you didn't ask for.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-maps-place-photos-scraper. Either way the run happens on 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. 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.