Google Maps Photos Scraper | Categorized by Menu, Food, Vibe avatar

Google Maps Photos Scraper | Categorized by Menu, Food, Vibe

Pricing

from $0.50 / 1,000 photos

Go to Apify Store
Google Maps Photos Scraper | Categorized by Menu, Food, Vibe

Google Maps Photos Scraper | Categorized by Menu, Food, Vibe

[πŸ’° $0.5 / 1K] Extract every photo for any Google Maps place β€” categorized exactly like the Maps website (Menu, Food & drink, Vibe, By owner, and more). Perfect companion to the Google Maps Scraper: paste place URLs, get a complete categorized photo library per place.

Pricing

from $0.50 / 1,000 photos

Rating

5.0

(1)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

6

Monthly active users

2 days ago

Last modified

Share

Google Maps Photos Scraper

Extract every photo for any Google Maps place β€” categorized exactly like the Maps website (Menu, Food & drink, Vibe, By owner, Street View & 360Β°, Videos, and more). The perfect companion to the Google Maps Scraper: paste a list of place URLs, get a complete, categorized photo library for each one.

Why This Scraper?

  • Exhaustive photo coverage β€” thousands of photos per place when available, not the random handful most scrapers return. A single popular restaurant can yield 5,000+ photos across every category tab.
  • Google's own category labels β€” every photo is tagged Menu, Food & drink, Vibe, By owner, Latest, Inside, Videos, or Street View & 360Β° β€” the exact tabs you see on maps.google.com.
  • Filter by category to cut cost β€” only need menu photos for a food-delivery catalog? Pick "Menu" and skip everything else for faster, cheaper runs.
  • Pick your image resolution β€” thumbnail, medium, large, or original. One input controls every returned URL.
  • Owner vs. user uploads detected β€” each photo carries an uploadedByOwner flag so you can separate the business's official shots from customer photos.
  • Per-photo metadata β€” image URL, dimensions, upload date, and Google's unique photo ID for deduplication.
  • One record per place β€” photos arrive bundled with their place, so joining back to your Google Maps Scraper output is a simple merge on place ID or URL.
  • Works at scale β€” designed for runs with hundreds of thousands of photos at $0.50 per 1,000 images.

Use Cases

Menu Digitization & Food Delivery

  • Pull menu photos for every restaurant in a city to build or enrich a delivery catalog
  • OCR menu images into structured dish/price data
  • Spot restaurants with outdated or missing menu photos for outreach

Real Estate & Hospitality

  • Collect interior, exterior, and ambience photos for every hotel, cafΓ©, or venue in an area
  • Compare visual branding across competitors at a glance
  • Enrich property or listing databases with authentic location imagery

Brand Monitoring & Competitive Intelligence

  • Track every image customers and owners post about a brand's locations
  • Audit visual presentation consistency across a chain's franchises
  • Separate owner-approved photos from user-submitted ones for analysis

Training Data & Machine Learning

  • Build large, labeled image datasets grouped by place category and photo type
  • Collect food imagery tagged by cuisine for ML classifiers
  • Pull interior/exterior shots for architectural or streetview models

Content & Marketing

  • Source location photos for travel guides, blogs, or city directories
  • Populate landing pages with fresh Google Maps imagery
  • Build photo galleries for aggregator or review sites

Getting Started

Accepted Place URL Formats

The actor needs a URL (or ID) that uniquely identifies a place. Any of these work:

  • Full Google Maps URL from your browser address bar β€” after clicking the place pin. The URL must contain a !1s0x…:0x… segment (Google's internal place identifier). See the examples below.
  • Share link (shortlink) β€” tap the Share button on maps.google.com or the mobile app; you get a maps.app.goo.gl/… or goo.gl/maps/… URL.
  • place_id: URL β€” a Google Maps /place/?q=place_id:ChIJ… URL, handy when you already have ChIJ… IDs from the Google Places API.
  • Hex CID only β€” pass a raw 0x…:0x… identifier to placeIds instead of placeUrls.

Plain coordinate URLs (ones that contain only @lat,lng,zoom and no !1s0x…:0x… segment) will not work β€” they point to a map view, not a specific place. Click the actual place pin on Google Maps first so the URL updates to include the !1s segment before copying.

Perfect for food-delivery catalogs β€” skip everything except menus.

{
"placeUrls": [
"https://www.google.com/maps/place/Restaurant+Gordon+Ramsay+High/@51.5144189,-0.7422276,9z/data=!3m1!5s0x48760352a2c5056b:0xd53caca6e8f63804!4m10!1m2!2m1!1sgordon+ramsay!3m6!1s0x48760352b04347ff:0xd0e3c5f99ed75b85!8m2!3d51.5144189!4d-0.0830479"
],
"photoCategories": ["menu"],
"imageSize": "large"
}

All Photos for a Place

Get every photo across every Google category, deduplicated.

{
"placeUrls": [
"https://www.google.com/maps/place/Restaurant+Gordon+Ramsay/@51.5144189,-0.7422276,9z/data=!4m10!1m2!2m1!1sgordon+ramsay!3m6!1s0x487605f0a8504091:0x95cc2f42ec47f8b4!8m2!3d51.4853968!4d-0.1620078"
],
"photoCategories": ["all"]
}

Multiple Places with a Cap

Process a list of places and cap photos-per-place to control cost. Full URLs and share-link shortlinks can be mixed freely:

{
"placeUrls": [
"https://www.google.com/maps/place/Restaurant+Gordon+Ramsay+High/@51.5144189,-0.7422276,9z/data=!3m1!5s0x48760352a2c5056b:0xd53caca6e8f63804!4m10!1m2!2m1!1sgordon+ramsay!3m6!1s0x48760352b04347ff:0xd0e3c5f99ed75b85!8m2!3d51.5144189!4d-0.0830479",
"https://www.google.com/maps/place/Restaurant+Gordon+Ramsay/@51.5144189,-0.7422276,9z/data=!4m10!1m2!2m1!1sgordon+ramsay!3m6!1s0x487605f0a8504091:0x95cc2f42ec47f8b4!8m2!3d51.4853968!4d-0.1620078",
"https://maps.app.goo.gl/7yP7Wq5p7xnSf4yH6"
],
"photoCategories": ["menu", "food_and_drink"],
"maxPhotosPerPlace": 50,
"imageSize": "medium"
}

Using Place IDs Instead of URLs

If you already have Google Maps hex CID identifiers, pass them to placeIds directly β€” no URL parsing needed. Note: the ChIJ… format is not a hex CID and must be sent as a place_id: URL via placeUrls instead.

{
"placeIds": [
"0x48760352b04347ff:0xd0e3c5f99ed75b85",
"0x487605f0a8504091:0x95cc2f42ec47f8b4"
],
"photoCategories": ["food_and_drink"],
"maxPhotosPerPlace": 30
}

Pipeline with Google Maps Scraper

Run the Google Maps Scraper first to discover places, then feed the url column into this actor:

  1. Run Google Maps Scraper with your search query (e.g. restaurants in Amman)
  2. Export the dataset and grab the url column
  3. Paste those URLs into placeUrls here β€” done

Input Reference

Places

ParameterTypeDefaultDescription
placeUrlsstring[][]Google Maps place URLs. Must contain a place identifier β€” full URLs with a !1s0x…:0x… segment, place_id:ChIJ… URLs, or maps.app.goo.gl / goo.gl/maps shortlinks all work. URLs with only coordinates (@lat,lng,zoom) are not valid. The url field from Google Maps Scraper is the easiest source.
placeIdsstring[][]Alternative to URLs β€” Google Maps place IDs in hex CID format (0x…:0x…). ChIJ… IDs must be passed as a place_id: URL via placeUrls instead.

At least one of placeUrls or placeIds must be provided.

Photos

ParameterTypeDefaultDescription
photoCategoriesstring[]["all"]Which photo categories to collect. "all" returns every photo deduplicated across tabs. Valid values: all, latest, menu, food_and_drink, vibe, by_owner, street_and_360, videos.
maxPhotosPerPlaceinteger0Cap photos per place. Useful when some places have thousands of photos. 0 = unlimited.
imageSizestring"original"Resolution for returned image URLs. Options: thumbnail (~150px), medium (~800px), large (~1600px), original (highest available).

Advanced

ParameterTypeDefaultDescription
languagestring"en"Language for category labels and any surfaced metadata (en, nl, de, fr, es, it, ja, ar, zh-CN, and 20+ more).
proxyConfigurationobjectApify ProxyProxy settings. Defaults to Apify Proxy, which works for most runs.

Output

One record per place, with every collected photo bundled into a photos array.

{
"placeId": "0x48760352b04347ff:0xd0e3c5f99ed75b85",
"placeName": "Restaurant Gordon Ramsay High",
"url": "https://www.google.com/maps/place/Restaurant+Gordon+Ramsay+High/@51.5144189,-0.7422276,9z/data=!3m1!5s0x48760352a2c5056b:0xd53caca6e8f63804!4m10!1m2!2m1!1sgordon+ramsay!3m6!1s0x48760352b04347ff:0xd0e3c5f99ed75b85!8m2!3d51.5144189!4d-0.0830479",
"photosCount": 50,
"photosCountByCategory": {
"menu": 15,
"food_and_drink": 20,
"vibe": 10,
"by_owner": 5
},
"totalPhotosAvailable": 5565,
"scrapedAt": "2026-04-19T14:32:18Z",
"photos": [
{
"photoId": "AF1QipN_example123",
"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipN_example123=w1600-h1200-k-no",
"category": "menu",
"categoryLabel": "Menu",
"width": 1600,
"height": 1200,
"uploadedByOwner": true,
"uploadDate": "2024-08-12"
},
{
"photoId": "AF1QipO_example456",
"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipO_example456=w1600-h1200-k-no",
"category": "food_and_drink",
"categoryLabel": "Food & drink",
"width": 1600,
"height": 1200,
"uploadedByOwner": false,
"uploadDate": "2025-11-03"
}
]
}

All Available Fields

Place-level fields

FieldTypeDescription
placeIdstringGoogle place ID in hex CID format.
placeNamestringDisplay name of the place.
urlstringOriginal Google Maps place URL.
photosCountnumberTotal photos returned in this record.
photosCountByCategoryobject{category: count} breakdown across returned photos.
totalPhotosAvailablenumberTotal photos Google reports for the place across all tabs.
scrapedAtstringISO 8601 timestamp of when the place was processed.
photosobject[]Array of photo objects (see below).

Fields on each photo

FieldTypeDescription
photoIdstringGoogle's unique ID for the photo β€” safe for deduplication.
imageUrlstringDirect image URL at the requested resolution.
categorystringCategory slug (menu, food_and_drink, vibe, by_owner, latest, videos, street_and_360, inside).
categoryLabelstringHuman-readable category label in the requested language.
widthnumberPixel width of the image.
heightnumberPixel height of the image.
uploadedByOwnerbooleantrue if the business owner uploaded the photo, false if a visitor did.
uploadDatestringISO date (YYYY-MM-DD) when the photo was uploaded, if available.

Tips for Best Results

Pick Specific Categories Instead of "All" When You Can

Choosing ["menu"] or ["food_and_drink"] is faster and cheaper than ["all"] because the actor can skip the full-category discovery step. Only use "all" when you genuinely need the complete photo library.

Use maxPhotosPerPlace for Cost Control

A popular restaurant can have 5,000+ photos. If you only need a representative sample, cap at 50 or 100 β€” you'll get the most relevant shots from each category without the long tail.

Match Image Size to Your Use Case

  • thumbnail β€” fastest to download, ideal for preview grids or quick visual scans
  • medium β€” good default for web display (Retina-quality on most screens)
  • large β€” high-quality editorial use
  • original β€” maximum resolution for archival, ML training, or print

Chain with the Google Maps Scraper

Running both actors in a pipeline is the fastest way to go from a search query to a complete categorized photo library. Export the url column from your Google Maps Scraper run, paste into placeUrls here, and you're done.

Deduplicate by photoId, Not by URL

The same photo can appear under multiple categories (Food & drink and By owner, for example). The actor deduplicates automatically in "all" mode, but if you're merging datasets yourself, always dedupe on photoId β€” the image URL changes with resolution.

Pricing

$0.50 per 1,000 images β€” you only pay for the photos you actually receive.

ImagesCost
1,000$0.50
10,000$5.00
100,000$50.00
500,000$250.00

Platform fees (compute, proxy, storage) are additional and depend on your Apify plan. Filtering by a single category and setting maxPhotosPerPlace meaningfully reduces both image count and compute time.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n β€” Workflow automation
  • Google Sheets β€” Direct spreadsheet export
  • Slack / Email β€” Notifications on run completion
  • Webhooks β€” Custom API integrations
  • Apify API β€” Full programmatic access

This actor is designed for legitimate business intelligence, market research, content enrichment, and ML training workflows. Users are responsible for complying with applicable laws, image copyright, and Google's Terms of Service. Only publicly visible photos are returned. Do not use collected data for spam, harassment, copyright infringement, or any illegal purpose.