Google Maps Photos Scraper - Videos, Uploaders & Dates avatar

Google Maps Photos Scraper - Videos, Uploaders & Dates

Pricing

$0.12 / 1,000 photo or videos

Go to Apify Store
Google Maps Photos Scraper - Videos, Uploaders & Dates

Google Maps Photos Scraper - Videos, Uploaders & Dates

Scrape every photo and video of Google Maps places from links, Place IDs or a search: full-size image URL, width/height, upload date, uploader name and profile, owner or visitor, caption, GPS, MP4 links. Filter by videos, owner, 360°, date. No login. $0.12 per 1,000 photos.

Pricing

$0.12 / 1,000 photo or videos

Rating

0.0

(0)

Developer

Top Api

Top Api

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

What does Google Maps Photos Scraper do?

Google Maps Photos Scraper extracts every photo, video and 360° capture of a Google Maps place, one row each: the image at the size you choose, its original width and height, when it was uploaded, who uploaded it (name and Google Maps profile), whether the business or a visitor posted it, the caption, where it was taken and, for videos, a playable MP4. Paste place links or IDs, or find places with a search. Built for menu and listing catalogs, local-SEO agencies, travel and real-estate sites, and teams building image datasets.

Google Maps Photo Scraper - Google Place Photos API - Google Business Profile photo downloader

  • Every photo the public gallery lists: 2,873 rows for Katz's Delicatessen in one run, read to the gallery's end
  • The uploader on every row: name, profile link, contributor id and avatar, included in the price
  • Videos with MP4, HLS and DASH links and their length; Street View and 360° captures with their heading
  • Filters before you pay: Videos, By owner, Street View & 360°, Latest, media type, owner or visitor, upload date window, caption only
  • No login, cookies or Google API key: paste links, Place IDs, CIDs, feature ids or a search term
  • Pay only for delivered photos: no start fee; filtered, duplicate and unreadable photos are free
  • Monitor mode: a scheduled run delivers only photos added since the last one
  • Export anywhere: JSON, CSV, Excel, XML, RSS; schedules, webhooks, Make, Zapier, n8n, Google Sheets, Slack, and AI agents over MCP

What data can you get from Google Maps photos?

🖼️ Image URL at your size (`imageUrl`)🔍 200 px thumbnail (`thumbnailUrl`)📐 Original width and height
🎬 Video MP4, HLS, DASH + length📅 Upload time (`uploadedAt`, hour) + day taken🏢 Owner or visitor (`uploadedBy`)
👤 Uploader name (`contributorName`)🔗 Uploader profile + id💬 Caption + Google's translation
📱 Source app (Android, iOS, web, business)⭐ Posted with a review (`fromReview`)📍 Where it was taken (lat, lng)
🧭 Heading of 360° / Street View🏷️ Google's topic code🆔 Photo ID
🗺️ Place name, address, category🔢 Place ID, CID, feature id, KG id📊 Google's photo count, rating, reviews

How to scrape Google Maps photos with Google Maps Photos Scraper

  1. Create a free Apify account (it comes with free monthly credit).
  2. Open Google Maps Photos Scraper and paste Google Maps place links, or Place IDs, or a search term with a location.
  3. Pick the photo categories and how many photos you want per place.
  4. Click Start. Rows arrive place by place within seconds.
  5. Download the dataset as JSON, CSV or Excel, or read it through the API.

⬇️ Input

ParameterTypeDescription
startUrlsarrayGoogle Maps place links, maps.app.goo.gl share links, ?cid= and place_id: links, or a CSV/TXT file of links.
placeIdsarrayPlace IDs (ChIJ…), CIDs (3545819340560108778) or feature ids (0x…:0x…), one per line.
searchStringsArrayarraySearch terms as typed in Google Maps (coffee shop) or business names.
locationQuerystringCity, area or country for the search terms, e.g. Seattle, WA.
maxCrawledPlacesPerSearchintegerPlaces per search term. Default 10; use 1 to look up a business by name.
photoCategoriesarrayall (default), latest (past 30 days, newest first), videos, by_owner, street_and_360. Several combine.
mediaTypesarrayphoto, video, photo360, streetView. Empty = all.
uploadedBystringany (default), owner or visitor.
languagestringLanguage of names, categories and caption translations. Default en.
photosNewerThan / photosOlderThanstringUpload date window: 2026-01-31, 30 days, 6 months.
withCaptionOnlybooleanOnly photos with a caption.
includeContributorbooleanUploader name, profile, id and avatar. Default on, included in the price.
monitorMode / monitorStoreNameboolean / stringDeliver only photos no earlier run with the same store name has seen.
maxPhotosPerPlaceintegerRows per place. Default 100; 0 = every photo Google lists.
maxResultsintegerRows in total. 0 = no limit.
imageSizestringoriginal (default), large (1600 px), medium (800 px), thumbnail (200 px).
compactbooleanCore fields only, for AI and MCP pipelines.
maxConcurrencyintegerPlaces read at once. Default 3.
maxPhotosScannedPerPlaceintegerWith filters or Latest on: photos read per place to find matches. Default 5,000.
proxyConfigurationobjectLeave as is.

Input JSON

{
"startUrls": [{ "url": "https://www.google.com/maps/place/Katz%27s+Delicatessen/@40.722233,-73.987429,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea!8m2!3d40.722233!4d-73.987429" }],
"placeIds": ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
"searchStringsArray": ["dentist"],
"locationQuery": "Boise, ID",
"maxCrawledPlacesPerSearch": 5,
"photoCategories": ["all"],
"maxPhotosPerPlace": 100,
"imageSize": "large"
}

A place link carries the place's id (!1s0x…:0x…) or a cid / place_id. A link that only has coordinates (/@40.72,-73.98,17z) points at the map, not a place: click the place on Google Maps first, or use Search terms with its name and maxCrawledPlacesPerSearch: 1.

Use the categories to pay only for what you need

Videos, By owner and Street View & 360° keep only those photos, Latest keeps photos uploaded in the past 30 days and delivers them newest first. Photos the filters drop are read but never charged. With a filter on, the actor reads up to maxPhotosScannedPerPlace photos of each place to find maxPhotosPerPlace matches.

Get every photo of a place

Set maxPhotosPerPlace to 0. The actor pages the place's public gallery to its end, 100 photos per request.

⬆️ Output

One row per photo, video or 360° capture. A real row from a test run (long links shortened):

{
"placeName": "Katz's Delicatessen",
"mediaType": "video",
"category": "all",
"photoId": "CIHM0ogKEICAgIDKz8nA1AE",
"imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9Rm…=s0",
"thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9Rm…=s200",
"videoUrl": "https://lh3.googleusercontent.com/gpms-cs-s/AM4Q-U8W…=m37",
"videoDurationSec": 60,
"width": 1920,
"height": 1080,
"uploadedAt": "2021-05-20T18:00:00.000Z",
"dateTaken": "2021-05-20",
"uploadedBy": "visitor",
"contributorName": "Steve Costello",
"contributorUrl": "https://maps.google.com/maps/contrib/105103597162936345941",
"source": "ios",
"sourceDetail": "photos:gmm_ios",
"latitude": 40.72223300082572,
"longitude": -73.98742897561966,
"placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
"cid": "3545819340560108778",
"fid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
"address": "205 E Houston St, New York, NY 10002",
"placeCategory": "Deli",
"placeImagesCount": 95866
}

Fields and how often they are filled

Measured on Apify on the 2,873 rows of Katz's Delicatessen (every photo its gallery lists):

FieldFilledMeaning
photoId, imageUrl, thumbnailUrl, width, height100%Google's photo id, image links, original size
uploadedAt, uploadDate, uploadTimestamp100%Upload time (Google gives the hour)
dateTaken99.4% (646-row run)Day the photo was taken; 65% of those rows were uploaded on a later day
uploadedBy, uploadedByOwner100%owner, visitor or google
contributorName, contributorId, contributorUrl, contributorPhotoUrl99.9%The uploader
source, sourceDetail, fromReview100%App the photo came from, posted with a review
latitude, longitude100%Where it was taken
caption3%What the uploader wrote (most write nothing)
captionTranslated1%Google's translation, when the caption is in another language
videoUrl, videoDurationSec, videoHlsUrl, videoDashUrlevery video7 videos in this gallery
headingevery 360° / Street View captureFirst view's compass heading
internalCategoryCode93%Google's own topic code(s), raw
placeName, placeId, cid, fid, placeKgmid, placeUrl, address, placeCategory, placeRating, placeReviewsCount, placeImagesCount100%The place
searchString, placeRankrows found by a searchHow the place was found

The run's key-value store holds RUN_SUMMARY with one entry per place: Google's photo count, photos read, delivered, filtered, already delivered and whether the gallery was read to its end.

Use cases

  • 🍽️ Menu and food catalogs: every dish and menu photo of the restaurants in a city, with dates to keep the freshest.
  • 📈 Local SEO and reputation: how many photos a business posts versus its visitors, and how recent they are, across competitors.
  • 🏨 Travel, hotel and real-estate listings: interior, exterior and 360° imagery of venues to enrich pages.
  • 🧠 Image datasets: labelled place photos with size, date, GPS and source app for vision models.
  • 🎥 Video collection: every visitor video of a place with a direct MP4 link.
  • 🔁 Brand monitoring: a weekly monitor run delivers only the new photos customers post of your locations.

How much does it cost to scrape Google Maps photos?

$0.12 per 1,000 photos (photo event), no start fee, no per-place or per-search fee. Uploader details, video links and the place summary are included. Filtered, duplicate and unreadable photos are free.

PhotosPrice
100$0.012
1,000$0.12
10,000$1.20
100,000$12.00

Measured on Apify on 2026-10-28:

RunPlacesRowsTimePrice
Prefilled run (Katz's Delicatessen + Sydney Opera House, 25 each)2506 s$0.006
Empty input (the same two places, 100 each)220011 s$0.024
pizza in Chicago, IL, 3 places, 80 each32406 s$0.029
Every photo of Katz's Delicatessen (maxPhotosPerPlace: 0)12,873120 s$0.34
5 places, 500 each, rebooted by Apify halfway52,29772 s$0.28
Monitor run, nothing new since the last one302 s$0

A run stops cleanly at the maximum charge you set: a $0.003 cap delivered and charged exactly 25 photos. A run Apify restarts on another server does not deliver or charge a photo twice.

Integrations, API, scheduling & MCP

  • ⏰ Schedules: track your places weekly with monitorMode on; each run delivers only new photos.
  • 🔔 Webhooks: get a call when a run finishes and fetch the dataset.
  • 🔌 Make, Zapier, n8n, Google Sheets, Slack: through Apify's integrations.
  • 🧑‍💻 API: start runs and read rows with the Python or JavaScript client, or plain HTTP.
  • 🤖 MCP: AI agents call it through the Apify MCP server.

Photos of one place from your own code:

curl -X POST "https://api.apify.com/v2/acts/TopApi~google-maps-photos-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"placeIds":["ChIJCar0f49ZwokR6ozLV-dHNTE"],"maxPhotosPerPlace":50}'

More scrapers from TopApi

Limits & empty runs

  • Google's photo count is larger than its gallery. Katz's Delicatessen shows 95,866 photos; its public gallery lists 2,873, and that is what any signed-out visitor (and this actor) can page through. RUN_SUMMARY shows both numbers per place.
  • Menu, Food & drink and Vibe tabs are not offered: Google serves those topic tabs only to signed-in visitors. Every row carries Google's own topic code (internalCategoryCode) instead.
  • Street View captures are links to Google's Street View images, at most 1,024 x 768.
  • The gallery is not in date order. Latest, the date window and monitor mode read a place's gallery up to maxPhotosScannedPerPlace photos to find the matches.
  • A run that returns nothing says why in its status: no photos, every photo filtered out, nothing new since the last monitor run, or an input that is not a Google Maps place. Nothing is charged.
  • A run Google refuses completely ends FAILED with the reason and charges nothing. When Google shows its unusual-traffic page the actor moves from the datacenter proxy to the container's own IP and then to a residential IP by itself.

❓ FAQ

How much does Google Maps Photos Scraper cost?

$0.12 per 1,000 delivered photos, with no start fee. A place's first 100 photos cost $0.012. Uploader details and video links are included.

How many photos can Google Maps Photos Scraper get per place?

Every photo the place's public gallery lists, page by page to its end: 2,873 for Katz's Delicatessen, 46 for a neighbourhood dental practice. Set maxPhotosPerPlace to 0 for all of them.

Does Google Maps Photos Scraper download the image files?

It returns direct links: images at the size you choose plus a 200 px thumbnail, and MP4, HLS and DASH links for videos. Download them with any tool.

Can Google Maps Photos Scraper get only the business's own photos or only videos?

Yes. Pick By owner or Videos in Photo categories, or use uploadedBy and mediaTypes. Photos dropped by a filter are never charged.

Yes. Put a term in Search terms (coffee shop) and a Location (Seattle, WA); each place the search finds returns its photos. A business name with maxCrawledPlacesPerSearch: 1 looks up that one business.

Can Google Maps Photos Scraper run on a schedule and return only new photos?

Turn on monitorMode and schedule the actor. The first run is the baseline; later runs deliver only photos the earlier runs have not seen, and a place whose photo count did not change is not read again.

Do I need a Google account or API key for Google Maps Photos Scraper?

No. It reads the public Google Maps gallery, logged out.

Can I use Google Maps Photos Scraper through the Apify API or MCP?

Yes. Start runs over the REST API or the Python and JavaScript clients, or let an AI agent call it through the Apify MCP server.

Why did my Google Maps Photos Scraper run return no rows?

The status line says why: the place has no public photos, the filters removed every photo, nothing is new since the last monitor run, or the input is not a Google Maps place. None of these is charged.

Your feedback

Found a bug or need a field? Open an issue on the actor's Issues tab and we will look at it.