Google Maps Photos Scraper: Place Photos, Videos, Owner Uploads
Pricing
from $1.00 / 1,000 photo delivereds
Google Maps Photos Scraper: Place Photos, Videos, Owner Uploads
Scrape the photos, images and videos of any Google Maps business: original-size links, width and height, upload date, owner or visitor, review pictures, video MP4 links, plus an optional photo summary per place for local SEO. By link, CID, name or search. Export to JSON, CSV or Excel, or via API.
Pricing
from $1.00 / 1,000 photo delivereds
Rating
0.0
(0)
Developer
Steady Scrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Security
Limited permissionsShare
Google Maps Photos Scraper
Google Maps Photos Scraper lists the photos and videos of any place on Google Maps — a business, a restaurant, a
hotel, a landmark — the way its photo panel shows them: each photo's link at its original size (or any size you
want), its width and height, when it was uploaded, whether the owner or a visitor uploaded it, whether it came with
a review, and each video's MP4 link and length. Give it Google Maps links, CIDs, place ids, names, or a search such as
dentist in Austin, TX. Add a photo summary per place — Google's own photo count, owner vs visitor photos, the
newest owner upload — for local SEO audits. No login, no browser. Export to JSON, CSV or Excel, or via API.
What you can do with Google Maps photos
- Local SEO audits: see when a business last uploaded a photo to its Google Business Profile and how many of its photos come from the owner versus customers — a stale profile is an easy pitch.
- Competitor research: compare the photos the top places of a search show, and how fresh they are.
- Listing and content checks: find every photo a location uploaded, with its size, to spot low-resolution images.
- Reputation and UGC monitoring: follow the photos visitors post with their reviews.
- Datasets: build image datasets of places (links and metadata; download the files you are allowed to use).
How to scrape Google Maps photos
- Paste one or more places: a Google Maps place link, a
maps.app.goo.glshare link, a?cid=link, a place id (ChIJ…), a CID, orname, city. Or type a search term and a location. - Choose how many photos per place, and whether you want photo rows, a summary row per place, or both.
- Optionally keep only the owner's or visitors' photos, only videos, or only recent uploads.
- Run it and download the dataset.
Input example
{"places": ["https://www.google.com/maps/place/Swish+Dental+Downtown/data=!4m2!3m1!1s0x8644b5b434046875:0x644e6eb422388b7a"],"searchTerms": ["coffee shop"],"location": "Austin, TX","maxPlacesPerSearch": 5,"maxPhotosPerPlace": 30,"output": "photos_and_summary","uploadedBy": ["owner"]}
Google Maps photos output
One row per photo or video:
{"rowType": "photo","source": "place","input": "https://www.google.com/maps/place/Swish+Dental+Downtown/data=!4m2!3m1!1s0x8644b5b434046875:0x644e6eb422388b7a","inputIndex": 1,"searchQuery": null,"searchRank": null,"placeName": "Swish Dental Downtown","placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ","cid": "7227836171923524474","mapsUrl": "https://www.google.com/maps?cid=7227836171923524474","address": "201 W 5th St Ste 175, Austin, TX 78701","primaryCategory": "Dentist","positionInPlace": 1,"photoId": "CIABIhCWUcgEtRg-429FERFJdZlw","mediaType": "photo","imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9Ti4A…=s0","imageBaseUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9Ti4A…","thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9Ti4A…=w203-h155-k-no","width": 2500,"height": 1911,"uploadedAt": "2025-07-21T23:00:00.000Z","uploadedBy": "owner","uploadChannel": "bizbuilder:gmb_on_local_universal_desktop","fromReview": false,"latitude": 30.2675996,"longitude": -97.7448115,"videoUrl": null,"videoDurationSeconds": null,"scrapedAt": "2026-11-03T06:10:00.510Z"}
And, when asked, one summary row per place:
{"rowType": "summary","placeName": "Swish Dental Downtown","totalPhotos": 24,"photosRead": 13,"allPhotosRead": true,"ownerPhotos": 12,"visitorPhotos": 1,"visitorReviewPhotos": 1,"videos": 0,"streetViewAnd360Photos": 1,"newestOwnerUploadAt": "2025-07-22T17:00:00.000Z","daysSinceOwnerUpload": 468,"newestVisitorUploadAt": "2026-05-21T22:00:00.000Z","ownerUploadsLast90Days": 0,"visitorUploadsLast90Days": 0}
Photo fields
| field | what it is |
|---|---|
photoId | Google's id of the photo or video |
mediaType | photo, video or photo_360 (a 360° photo someone uploaded) |
imageUrl | the image at its original size (for a video, its still) |
imageBaseUrl | the same link without its size: add =w800-h600 for a box, =s0 for the original |
thumbnailUrl | the small image Google Maps' photo list shows |
width, height | the original size in pixels |
uploadedAt | when it was uploaded, to the hour (UTC) |
uploadedBy | owner (the business) or visitor |
fromReview | true when a visitor uploaded it with a review |
uploadChannel | Google's name for where it was uploaded from, e.g. bizbuilder:gmb_web (Business Profile on the web), photos:gmm_ios_review_post (a review from the iPhone app) |
latitude, longitude | where the photo is placed on the map |
videoUrl, videoDurationSeconds | a video's MP4 link (best quality) and its length |
positionInPlace | its position in the place's photo list (1 = the first Google shows) |
placeName, placeId, cid, mapsUrl, address, primaryCategory | the place |
rowType | photo; summary for a summary row; place or search for a free row (see below) |
source, input, inputIndex, searchQuery, searchRank | which input the row answers (inputIndex is its line, from 1); for a search, the place's rank |
scrapedAt | when the run read it (UTC) |
Summary fields
totalPhotos is the photo count Google Maps shows on the place. Every other count is over the photos the run read
(photosRead: "Photos per place" rounded up to Google's pages of 10, more when a filter makes the run read on, or
the whole list when it is shorter;
allPhotosRead says whether that was the whole list): ownerPhotos,
visitorPhotos, visitorReviewPhotos, videos, streetViewAnd360Photos, newestUploadAt, newestOwnerUploadAt,
newestVisitorUploadAt, daysSinceOwnerUpload, ownerUploadsLast90Days, visitorUploadsLast90Days, plus the
place's rating, review count, website and phone.
Rows that cost nothing
A place that is not found, a link that names no single place, a place without photos, a place with no photo matching
your filters, a search that finds nothing, a Google refusal, or a place the spending limit left out: one free row with
rowType place or search, its status (place_not_found, invalid, no_photos, no_matching_photos,
blocked, spending_limit; no_results for a search) and the reason. The run still succeeds.
Pricing
Pay per result, no subscription:
- US$0.001 per photo or video row (US$1 per 1,000 photos).
- US$0.002 per place summary.
- Every free row above costs nothing.
Set a spending limit on the run and it stops at what it pays for.
Limits and good to know
- The order is Google's: the photos come as Google Maps' photo panel lists them ("All"), by relevance, not by date. Google lists 10 photos per request. With a date or uploader filter the run reads up to 1,000 photos per place to find the matching ones; you pay only for the photos delivered.
- Google's count and the list differ: a place's page can say "24 photos" while its photo list shows 14 (Swish
Dental Downtown, November 2026).
totalPhotosis Google's count; the rows are what the list shows. - Google's own Street View panoramas are not delivered: their images open only on Google Maps' own page. The
summary counts them in
streetViewAnd360Photos. - Uploader names are not included: Google's photo list does not carry them.
- Only links and metadata: the Actor never downloads the files. Photos uploaded by visitors are their copyright; use them only as the law and Google's terms allow.
- When Google asks an IP for verification — its "unusual traffic" page, a CAPTCHA, a JavaScript check, or any
answer that is not Google Maps' normal data — that IP is done for the run: nothing more is sent from it, and the
run goes on from another IP of Apify's datacenter proxy. It never solves, bypasses or replays a challenge. Plain
overloads (HTTP 429 or 5xx without a challenge) take the same way. When every IP the run can use has been refused,
the places left are free
blockedrows that say so, and the run ends normally with a message. Try again later.
Is it legal to scrape Google Maps photos?
This Actor reads public data that Google Maps shows to anyone without logging in: photo links, sizes, dates and whether the owner or a visitor uploaded them. It does not log in, does not solve or bypass any challenge, and does not download the images. Scraping public data is generally legal, but Google's terms of service restrict automated access, and the photos themselves belong to whoever took them. Make sure your use complies with the law where you are and with copyright; ask a lawyer if in doubt.
This Actor is not affiliated with, endorsed by or sponsored by Google. Google Maps is a trademark of Google LLC.
Related Actors
- Google Business Profile Audit — scores a profile (photos, posts, reviews, hours…) against its competitors.
- Google Maps Business Posts Scraper — the posts a business publishes ("Updates", offers, events).
- Google Maps Rank Tracker — where a business ranks on the map, point by point.