Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Google Maps Place Photos Scraper icon

Google Maps Place Photos Scraper

Scrape the photos and videos on a Google Maps place: full-size image URL, caption, pixel size, upload date and coordinates. No API key, no account.

56 runs on Apify $0.00023 per photo ($0.23 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust placeUrls, maxPhotosPerPlace, maxPhotos (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00023 per photo = $0.23 per 1,000

You are charged forWhenPrice
Photo scrapedOne photo from a place gallery, with its size, upload date and caption where there is one. Blocked runs are never charged.$0.00023

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.

Inputs

FieldWhat it doesType
placeUrlsThe places whose pictures you want, up to 50 per run. A full Google Maps link works, so does the short link from the Share button, a ?cid= link, or the raw 0x...:0x... place id if you already have one.array
maxPhotosPerPlaceCeiling on how many rows a single place may produce.integer
maxPhotosTotal rows for the whole run, shared evenly between your places. Keep it low while you are testing - you pay per row.integer
mediaTypeKeep everything, drop the videos and Street View panoramas, or keep only video clips.string
imageWidthWidth for the photoUrl link on each row. The height follows the picture's own aspect ratio. Each row also reports the native size, so you can tell when you asked for more pixels than exist.integer
languageTwo-letter interface language. It changes captions Google has translated, not the pictures themselves.string
countryTwo-letter country code used for the request.string
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the requests to go out through proxy servers of your own, one per line, as http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

placeNamemediaTypephotoUrlcaptionwidthheightuploadedAtphotoIdplaceUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Google Maps Place Photos Scraper: the photos and videos on a place, one row each

Paste a Google Maps place and you get its pictures 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, so you can keep only the kind you want. 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, flat on every plan

🔍 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.

You decide what to keep: everything, photographs only (videos and Street View panoramas dropped), or video clips only. Whatever you drop is never charged.

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.

📥 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.
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 real run, 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"
}
FieldWhat it is
photoUrl, thumbnailUrlThe picture at the width you asked for, and the small version exactly as Google sent it.
width, heightThe picture's native size, so you can tell when imageWidth asked for more pixels than exist.
mediaTypephoto, video or street_view.
videoDurationMs, videoUrlOn a video row, the clip's length in milliseconds and a link to the clip. Null on photos.
captionWhat the uploader typed. Null when they typed nothing, or only the place's name. Most rows have none.
uploadedAtWhen it went up, in 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.
placeId, cid, placeUrlThe place as Google's internal id, as a decimal id and as a maps?cid= link. placeId is 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.
targetThe link or id you gave for this place.

🧾 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 shows the shape of a real row and also says recordType: "photo", so filter on charged rather than recordType to keep just the pictures.

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_PHOTOSGoogle shows no pictures of that kind for the place.
BLOCKEDGoogle wouldn't show the gallery this time. Try again later.
NETWORK, TIME_BUDGET and the restRare. The details sentence says what happened.

▶️ How to run it

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. 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 API.

💰 How much does it cost?

$0.23 per 1,000 photos, flat on every Apify plan. 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 people use it for

  • Real photography of a venue for a listing, directory or travel page, in place of stock pictures.
  • Watching a place change over time. Sort by uploadedAt and a refit or a new sign shows up in the dates.
  • Image sets for a vision model, where the pixel size and the date matter as much as the file itself.
  • Comparing the branches of a chain by what their galleries actually show.

🚧 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.
  • 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.

🧭 Which Google Maps scraper do you need?

If you wantUse
The photos and videos on a placeThis one
The places themselves: name, address, rating, coordinatesGoogle Maps Scraper
What people wrote about a place, with star ratingsGoogle Maps Reviews Scraper
Instagram posts tagged at a placeInstagram Location Scraper
Places from Apple Maps, with phones and hoursApple Maps Scraper

❓ Questions people ask

Do I need a Google API key or account? 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.

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 run it on a schedule? Yes. Nothing is kept between runs, so compare photoId with last time to see what's new.

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 article on whether web scraping is legal covers the first part.

🆘 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.