Google Maps Photos Scraper | Categorized by Menu, Food, Vibe
Pricing
from $0.50 / 1,000 photos
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
Actor stats
0
Bookmarked
10
Total users
6
Monthly active users
2 days ago
Last modified
Categories
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, orStreet 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
uploadedByOwnerflag 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/β¦orgoo.gl/maps/β¦URL. place_id:URL β a Google Maps/place/?q=place_id:ChIJβ¦URL, handy when you already haveChIJβ¦IDs from the Google Places API.- Hex CID only β pass a raw
0xβ¦:0xβ¦identifier toplaceIdsinstead ofplaceUrls.
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.
Menu Photos Only (Fastest)
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:
- Run Google Maps Scraper with your search query (e.g.
restaurants in Amman) - Export the dataset and grab the
urlcolumn - Paste those URLs into
placeUrlshere β done
Input Reference
Places
| Parameter | Type | Default | Description |
|---|---|---|---|
placeUrls | string[] | [] | 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. |
placeIds | string[] | [] | 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
| Parameter | Type | Default | Description |
|---|---|---|---|
photoCategories | string[] | ["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. |
maxPhotosPerPlace | integer | 0 | Cap photos per place. Useful when some places have thousands of photos. 0 = unlimited. |
imageSize | string | "original" | Resolution for returned image URLs. Options: thumbnail (~150px), medium (~800px), large (~1600px), original (highest available). |
Advanced
| Parameter | Type | Default | Description |
|---|---|---|---|
language | string | "en" | Language for category labels and any surfaced metadata (en, nl, de, fr, es, it, ja, ar, zh-CN, and 20+ more). |
proxyConfiguration | object | Apify Proxy | Proxy 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
| Field | Type | Description |
|---|---|---|
placeId | string | Google place ID in hex CID format. |
placeName | string | Display name of the place. |
url | string | Original Google Maps place URL. |
photosCount | number | Total photos returned in this record. |
photosCountByCategory | object | {category: count} breakdown across returned photos. |
totalPhotosAvailable | number | Total photos Google reports for the place across all tabs. |
scrapedAt | string | ISO 8601 timestamp of when the place was processed. |
photos | object[] | Array of photo objects (see below). |
Fields on each photo
| Field | Type | Description |
|---|---|---|
photoId | string | Google's unique ID for the photo β safe for deduplication. |
imageUrl | string | Direct image URL at the requested resolution. |
category | string | Category slug (menu, food_and_drink, vibe, by_owner, latest, videos, street_and_360, inside). |
categoryLabel | string | Human-readable category label in the requested language. |
width | number | Pixel width of the image. |
height | number | Pixel height of the image. |
uploadedByOwner | boolean | true if the business owner uploaded the photo, false if a visitor did. |
uploadDate | string | ISO 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 scansmediumβ good default for web display (Retina-quality on most screens)largeβ high-quality editorial useoriginalβ 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.
| Images | Cost |
|---|---|
| 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
Legal & Ethical Use
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.