Google Maps Photos Scraper - Bulk Image URLs per Place avatar

Google Maps Photos Scraper - Bulk Image URLs per Place

Pricing

$0.80 / 1,000 image url extracteds

Go to Apify Store
Google Maps Photos Scraper - Bulk Image URLs per Place

Google Maps Photos Scraper - Bulk Image URLs per Place

Get the photo URLs of any Google Maps place in bulk: one row per place with every returned image link, its position, width and height. Paste place URLs, export JSON or CSV. For local SEO audits, travel and real estate sites, and image datasets.

Pricing

$0.80 / 1,000 image url extracteds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

19

Total users

12

Monthly active users

a month ago

Last modified

Share

Google Maps Photos Scraper — Bulk Image URLs per Place

Google Maps Photos Scraper collects the photo URLs and image dimensions of Google Maps places in bulk. Paste full place URLs and get one dataset row per place, with the Google Maps images nested inside that row: each photo's position, its direct image link, and the width and height carried in that link. It is built for anyone who needs place photos as data rather than as screenshots: local SEO teams, listing auditors, travel and real estate sites, and researchers building image datasets.

The actor returns image links rather than image files. Export the dataset as JSON, CSV or Excel through Apify, or read it over the Apify API, and download or process the images with your own tools. It does not promise every image from the complete Google Maps gallery: it returns the photo URLs available in the place response for the current request.

What the Google Maps Photos Scraper gives you

  • One row per requested place, in input order, with the place name, the place identifier and the original place URL.
  • A nested photos list with position, url, width and height for every returned image.
  • photos_count_returned, so you can filter places without photos in one step.
  • Coordinates when the input URL carries them, plus the retrieval time in UTC.
  • A clear per-row error when a URL cannot identify a place, instead of a failed run.

Input

The required place_urls input is an array of full Google Maps place URLs. Copy the full URL for an individual place. It must include the hexadecimal place identifier in the !1s0x...:0x...! segment. Search URLs and shortened share links may not contain that identifier and therefore cannot identify a place for this actor. Input order is preserved. If the same URL appears twice, it remains two separate requested places and two separate dataset positions.

max_photos_per_place defaults to 30. It limits the number of photo URLs returned for each requested place and is bounded between 1 and 200. Choosing 200 does not guarantee 200 results. The available set can be smaller, including zero, and can change between runs. use_cookies defaults to true and selects an anonymous Google session for the request. You may set it to false, although the available photo set can be smaller.

The optional hl and gl inputs retain their defaults of en and us. They select the Google Maps language and country parameters. Place names may therefore be localized when you supply another language. Existing automation can keep using the original input names and defaults.

The following is the actual input used for the recorded output below:

{
"place_urls": [
"https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z/data=!3m1!4b1!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813!16zL20vMDJqODE",
"https://www.google.com/maps/place/Statue+of+Liberty/@40.6892494,-74.0445004,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445004!16zL20vMDcxdnI"
],
"max_photos_per_place": 30,
"use_cookies": true
}

Output

The default dataset contains one row per place. Successful rows include place_url, place_name, place_fid, photos_count_returned, and photos. Each photo contains position, url, width, and height. Positions start at one. Width and height are integers when present in the source URL and null when no matching dimension suffix is available. photos_count_returned is the length of the nested photo list, rather than a count of dataset rows.

The actor retains different complete URLs for the same underlying photograph when Google supplies different size variants. These variants can therefore appear as separate photo entries. It does not claim that all returned photo URLs represent different photographs. Image URLs are returned exactly as supplied, including their dimensions; the actor does not claim permanent availability or that modifying a dimension suffix will produce another supported image size.

New fields include source, platform, fetched_at, input_index, name, and url. The last two mirror the legacy place name and URL. fetched_at records retrieval time in UTC. Coordinates and a Google Place ID are included only when available from the input URL. The old fields remain present with their original JSON types.

Here is the second place row from that run, the Statue of Liberty, with its complete returned photo list:

{
"place_url": "https://www.google.com/maps/place/Statue+of+Liberty/@40.6892494,-74.0445004,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445004!16zL20vMDcxdnI",
"place_name": "Statue of Liberty",
"place_fid": "0x89c25090129c363d:0x40c6a5770d25022b",
"photos_count_returned": 7,
"photos": [
{
"position": 1,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnrhDaT2k1_mwKC5alLMDU0CUDugjd_ovxjJZEA5KbnNhd-rumkXiasozWFZLt1a0Mzs_ar_LRi1oqWr5YmV1WtgaLk1b7f-KlcdECJOMRLKRzzMxFUs4FP-9gE4hJhpU8hlkxy=w408-h544-k-no",
"width": 408,
"height": 544
},
{
"position": 2,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnrhDaT2k1_mwKC5alLMDU0CUDugjd_ovxjJZEA5KbnNhd-rumkXiasozWFZLt1a0Mzs_ar_LRi1oqWr5YmV1WtgaLk1b7f-KlcdECJOMRLKRzzMxFUs4FP-9gE4hJhpU8hlkxy=w86-h114-k-no",
"width": 86,
"height": 114
},
{
"position": 3,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlNGArt7FnFzv3dPEZtkKfi0_tno9Xg_c9LbPtgX5ikNFIEQAYf2v80qmoH9CwINxCs4dFKuDwpBgwZTA8OSHkAs1OAcMKjUxdpMRFWKPHdWp3eua9qYXVZM3eHcvsw8YVnwXGAASBShCc=w203-h270-k-no",
"width": 203,
"height": 270
},
{
"position": 4,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkkMn120TzTROO17YzYy3Ykj3mQ_Z6yKCl7dWV1peSxR8rZILdO0tLu3h2-FJROfY53DCdRELuX9MX1vL43UXjko_SwyoZG6NcnJPVmu_9jWIQkooniquTIek2tjwhuwDPIM9Qi=w203-h135-k-no",
"width": 203,
"height": 135
},
{
"position": 5,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWm2GG6qjZuZR_b6O-ClJwSJxqPVSypbHuKJ0AHqcDpx3CG53O4r3kHk-jaK9DHkQTT87sevc7s6rH-VoTgAD91KuLh84YSjm4-6m2T20_YGpkE0x5VCRkcgattmnSUPxdJd-MDIXg=w203-h114-k-no",
"width": 203,
"height": 114
},
{
"position": 6,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnrhDaT2k1_mwKC5alLMDU0CUDugjd_ovxjJZEA5KbnNhd-rumkXiasozWFZLt1a0Mzs_ar_LRi1oqWr5YmV1WtgaLk1b7f-KlcdECJOMRLKRzzMxFUs4FP-9gE4hJhpU8hlkxy=w203-h270-k-no",
"width": 203,
"height": 270
},
{
"position": 7,
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkkMn120TzTROO17YzYy3Ykj3mQ_Z6yKCl7dWV1peSxR8rZILdO0tLu3h2-FJROfY53DCdRELuX9MX1vL43UXjko_SwyoZG6NcnJPVmu_9jWIQkooniquTIek2tjwhuwDPIM9Qi=w360-h240-k-no",
"width": 360,
"height": 240
}
],
"fetched_at": "2026-10-03T10:33:48.991Z",
"input_index": 1,
"source": "google-maps-images-scraper",
"platform": "google_maps",
"name": "Statue of Liberty",
"url": "https://www.google.com/maps/place/Statue+of+Liberty/@40.6892494,-74.0445004,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445004!16zL20vMDcxdnI",
"lat": 40.6892494,
"lng": -74.0445004
}

In the same run the Eiffel Tower row returned a single photo. The number of photos differs per place and per session, which is why the count is part of every row.

Use cases for Google Maps images

  • Local SEO and listing audits. Check whether a business profile shows enough photos, and compare photo coverage across your own locations or against nearby competitors.
  • Travel, hospitality and real estate sites. Collect the image links of hotels, restaurants, attractions or neighbourhoods to review them before you license or commission your own photography.
  • Lead qualification. Places with few or no photos are often under-managed profiles; photos_count_returned makes that visible across a list of places.
  • Research and machine learning. Build a labelled set of place images keyed by place name and place identifier, with dimensions already parsed.
  • Change monitoring. Run the same place list on a schedule and compare which photo URLs appear over time.

Respect the rights of photo owners: the actor gives you links to images that Google displays publicly, not a licence to reuse them.

How it compares

OptionWhat you getEffort
Saving photos by hand from Google MapsOne image at a time, no dimensions, no structureHigh for more than a few places
Official Google Places photo endpointsPhoto references that need an API key, a billing account and a second request per imageDeveloper work and per-request fees
This actorDirect image URLs with position, width and height, one row per place, in bulkPaste URLs, export the dataset

Compared with other Store tools, this actor stays deliberately simple: no image file downloads, no categorisation, and a price per place rather than per photo, so a place with 30 photos costs the same as a place with one.

Pricing

The existing pay-per-event price is $0.0008 per delivered place with at least one photo. The event is named image, but its count is the number of qualifying place rows, not the number of nested photos. There is no actor-start event in this actor's price model. A place with an empty photo list and a place error are not charged for the image event. Apify platform usage is separate from actor event pricing.

Users without a paid Apify plan receive at most 10 place rows per run. The free-plan limit applies to places, not to the number of photos requested for each place. Paying users retain their requested list within the run's available time. Results are delivered before the actor's result events are charged. A collection interrupted by the run budget reports that the result is partial.

Errors and limits

A URL without the required place identifier returns a row with the original place_url and error: could_not_parse_fid. An unavailable photo response may produce an HTTP, CAPTCHA or parsing error in the row. A place that is identified but has no available photos keeps an empty photos list and a count of zero. Row errors and empty photos do not invent a place image or substitute data from a different place.

The key-value store contains a summary record with itemCount and errorCount, and an errors record when applicable. itemCount counts dataset rows, including ordinary per-place error rows. errorCount counts processing exceptions, so it need not equal the number of rows containing an error field. The OUTPUT record adds run status, delivery counts, warnings and event-charge information. Larger input lists are collected in multiple internal requests; you do not need to manage continuation in an ordinary Apify run.

FAQ

No. The value is a maximum number of embedded photo URLs per place. Google may return a smaller set or no photos. Availability depends on the place and the session used for that request.

Is each photo a separate dataset row?

No. Each input place has one row with a nested photo list. The same complete photo URL is removed when repeated within that place, while different size variants remain separate entries.

Will an empty result incur the image event charge?

No. Only delivered places with at least one photo contribute to the image event count. Empty photo lists and place error rows contribute zero.

Can I download the Google Maps images themselves?

The dataset contains direct image URLs. Open them in a browser or pass them to any download tool or script; the actor itself does not store image files.

Which URLs work as input?

Full place URLs copied from the Google Maps address bar after opening a single place. Search result pages and short share links usually lack the place identifier and return a could_not_parse_fid row.

Can I use it for free?

Yes, within the free-plan limit of 10 place rows per run. A paid Apify plan removes that limit.

Can I use my existing input and output processing?

Yes. The original names and defaults are preserved, as are the place fields and the nested photo types. Added fields provide source identity, retrieval time and input position without replacing the legacy fields.