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.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
placeUrls,maxPhotosPerPlace,maxPhotos(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export 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 for | When | Price |
|---|---|---|
| Photo scraped | One 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
| Field | What it does | Type |
|---|---|---|
placeUrls | The 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 |
maxPhotosPerPlace | Ceiling on how many rows a single place may produce. | integer |
maxPhotos | Total rows for the whole run, shared evenly between your places. Keep it low while you are testing - you pay per row. | integer |
mediaType | Keep everything, drop the videos and Street View panoramas, or keep only video clips. | string |
imageWidth | Width 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 |
language | Two-letter interface language. It changes captions Google has translated, not the pictures themselves. | string |
country | Two-letter country code used for the request. | string |
proxyUrls | Leave 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:
placeNamemediaTypephotoUrlcaptionwidthheightuploadedAtphotoIdplaceUrlExport 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
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.
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.
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.
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.
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.
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.
Where this tool sits
- Categories
- 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.
| Input | Google Maps place links, Share links, ?cid= links or place ids |
| Output | One row per photo, video or Street View shot |
| Ceiling | One gallery page per place (150 on the place we tested), 50 places and 5,000 rows per run |
| Account needed | None |
| 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
}
| Field | If you leave it empty | What it is |
|---|---|---|
placeUrls | the free sample row | Up 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. |
maxPhotosPerPlace | 50 | The most rows one place may produce, 1 to 1,000. The form suggests 30. A place still stops at its first gallery page. |
maxPhotos | 200 | Rows for the whole run, 1 to 5,000, shared evenly between your places. |
mediaType | all | all, photos (no videos or Street View) or videos. |
imageWidth | 1600 | Width in pixels for photoUrl, 100 to 4,096. The height follows the picture's own shape. |
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 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"
}
| Field | What it is |
|---|---|
photoUrl, thumbnailUrl | The picture at the width you asked for, and the small version exactly as Google sent it. |
width, height | The picture's native size, so you can tell when imageWidth asked for more pixels than exist. |
mediaType | photo, video or street_view. |
videoDurationMs, videoUrl | On a video row, the clip's length in milliseconds and a link to the clip. Null on photos. |
caption | What the uploader typed. Null when they typed nothing, or only the place's name. Most rows have none. |
uploadedAt | When it went up, 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, cid, placeUrl | The place as Google's internal id, as a decimal id and as a maps?cid= link. placeId is the one to join on. |
photoId | Google's id for the picture. It stayed the same between our runs, so diff on it to find new pictures. |
target | The link or id you gave for this place. |
🧾 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 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.
errorCode | What it means |
|---|---|
PLACE_NOT_RESOLVED | The link couldn't be tied to a place. Paste the address-bar link with the place open, or the Share link. |
NO_PHOTOS | Google shows no pictures of that kind for the place. |
BLOCKED | Google wouldn't show the gallery this time. Try again later. |
NETWORK, TIME_BUDGET and the rest | Rare. 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
uploadedAtand 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
maxPhotosPerPlacedoesn'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 want | Use |
|---|---|
| The photos and videos on a place | This one |
| The places themselves: name, address, rating, coordinates | Google Maps Scraper |
| What people wrote about a place, with star ratings | Google Maps Reviews Scraper |
| Instagram posts tagged at a place | Instagram Location Scraper |
| Places from Apple Maps, with phones and hours | Apple 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.