If you are building a restaurant menu aggregator, a travel or hotel booking directory, a commercial real estate platform, or a multimodal computer vision dataset, you have likely encountered the most expensive bottleneck in location intelligence: Google Places Photo API pricing and its hard 10-photo ceiling.
Developers integrating the official Google Maps Platform quickly discover a painful reality once their prototype hits production scale:
Google’s official Places Photo API charges $7.00 per 1,000 photo requests (on top of $17.00–$32.00 per 1,000 Place Details calls), hard-caps every business listing at a maximum of 10 photos, restricts image dimensions to 1600×1600 px, and strips out gallery categories (menu,food_and_drink,vibe,rooms), playable MP4 videos, dish captions, and Local Guide portfolios.
For a startup enriching 25,000 restaurants or hotels with 40 photos each (1,000,000 images), the official API either cannot return the data at all (due to the 10-photo cap) or racks up $7,000+ in bandwidth and SKU charges while prohibiting you from permanently caching the images.
In this comprehensive guide, we break down the true unit economics of the official Google Places Photo API, explain why DIY headless browser scrapers (Puppeteer/Playwright) choke on Google Maps WebGL galleries, and introduce the UnitBytes Google Maps Photos, Menus & Videos Scraper—delivering uncompressed original (=s0, 4000×3000+ px) photos, all 9 native gallery tabs, playable MP4 videos, and Local Guide contributor portfolios for $0.50 per 1,000 photos with zero Google Cloud API keys.
1. The True Economics of the Official Google Places Photo API#
On Google Cloud's pricing table, $7.00 per 1,000 Place Photo requests looks straightforward. However, in real-world data pipelines, three architectural and billing traps multiply your costs while starving your application of critical visual metadata:
The "Double-Billing" SKU Multiplier ($87+ per 1,000 Venues)
You cannot call the official Places Photo endpoint directly with a Place ID or business name. Instead, Google forces a two-step billing cascade:
- Step 1 — Place Details Call ($17.00 to $32.00+ per 1,000 calls): First, you must query the Place Details SKU (or Text Search SKU at $32/1K) requesting the
photosfield mask just to receive an array of ephemeralphoto_referencetokens. - Step 2 — Individual Place Photo Calls ($7.00 per 1,000 photos): Next, you must make a separate billable HTTP request for each individual photo (up to 10 per place).
- The Real Math: Fetching just 10 photos across 1,000 businesses costs $17.00 (Place Details) + $70.00 (10,000 Photo requests) = $87.00 per 1,000 businesses—and still leaves you blind to 99% of the venue's gallery.
The Hard 10-Photo & 1600px Resolution Ceiling
A popular landmark or restaurant like Katz's Delicatessen in New York has over 95,000 uploaded photos and videos on Google Maps.
- No Pagination Beyond Photo #10: The official Google Places API returns a maximum of 10 photos per location. There is no
next_page_tokenfor photos. You cannot retrieve photo #11, #50, or #500. - Downscaled 1600px Cap vs. Original
=s0(4032×3024px): Official Places Photo API requests are hard-capped atmaxWidthPx=1600andmaxHeightPx=1600. For AI OCR menu digitization—where fine-print menu prices and ingredients must be legible—1600px compression often renders text unreadable compared to the uncompressed=s0(4000×3000+px) camera original.
Zero Gallery Tabs, Zero Videos & Strict Anti-Caching Terms
When a human user opens Google Maps, photos are neatly organized into specialized tabs: Menu, Food & Drink, Vibe / Interior, Exterior, By Owner, Videos, 360° Street View, Rooms, and Amenities.
- No Category Filtering: The official API dumps 10 unsorted photos with zero category tags. You cannot request "only menu boards" or "only hotel rooms."
- No Playable MP4 Video Streams: Short-form vertical videos uploaded by diners, hotel guests, and business owners are completely omitted by the Places Photo API.
- No Owner vs. Customer Attribution (
uploadedByOwner): You cannot tell whether a photo was uploaded by the verified business owner via Google Business Profile (owner) or by a random visitor (visitor). - No Caching Allowed: Under Google Maps Platform Terms of Service (§3.2.3), you are prohibited from pre-fetching, indexing, or permanently storing Places API photos outside temporary caching—forcing you to pay $7.00/1K repeatedly as users view your site.
2. Why DIY Headless Browsers Are Not The Answer#
When developers hit the 10-photo Places API wall, the knee-jerk reaction is to spin up Puppeteer, Playwright, or Selenium to click open the Google Maps photo modal and scroll the DOM.
In production, browser-based Google Maps photo scraping collapses under its own weight:
DIY Headless Chrome / Playwright (WebGL Canvas):
[User Request] ➔ [Boot 2GB Chromium + GPU Canvas] ➔ [Scroll Virtual DOM (45–90s)] ➔ [Parse Low-Res Thumbnails]
Cost: $4.00 – $8.00 / 1k photos | Memory: 1.5–2 GB RAM | Speed: ~60 seconds / venue
UnitBytes Managed Cloud Engine:
[User Request] ➔ [UnitBytes High-Speed Cloud Engine] ➔ [Category & =s0 Normalization] ➔ [Instant Flat Output]
Cost: $0.50 / 1k photos | Memory: 256 MB RAM | Speed: ~2–4 seconds total
- Massive WebGL & GPU Memory Bloat: Google Maps renders an interactive 3D WebGL vector map alongside high-resolution image carousels. Running headless Chromium consumes 1,500MB to 2,048MB of RAM per worker, burning through cloud compute credits in minutes.
- The Thumbnail Trap (
=w203-h152): The Google Maps DOM lazy-loads heavily cropped, low-resolution=w203or=w400preview thumbnails as you scroll, hiding the full-resolution=s0URLs, playable MP4 video streams (=m22/=m18), and per-photo camera GPS coordinates inside deep internal state arrays. - Broken Virtualized Scrolling: After ~60–100 photos, Google Maps' virtualized DOM recycles nodes, causing Playwright scroll loops to stall, duplicate images, or crash with out-of-memory (
OOM Exit 137) errors.
3. The UnitBytes Cloud Alternative: Uncompressed =s0 Photos, 9 Gallery Tabs & MP4 Videos at $0.50/1K#
At UnitBytes, we engineered the Google Maps Photos, Menus & Videos Scraper on a lightweight, high-throughput cloud architecture running on the Apify platform:
- ⚡ Blazing Fast (2–4 Seconds): Extracts dozens or hundreds of categorized venue photos and videos in seconds with zero browser startup overhead.
- 🪶 256MB RAM Footprint: Runs effortlessly in the smallest cloud container tier—10x faster and cheaper than headless browser scrapers.
- 📸 Original Uncompressed Resolution (
=s0): Automatically upgrades every image tophotoUrlHighRes(=s0,4032×3024px and higher) alongside a fast preview (thumbnailUrl). - 🍽️ All 9 Native Gallery Tabs + Custom Dish Keywords: Filter upstream on Google Maps by
menu,food_and_drink,vibe,exterior,by_owner,videos,street_view,rooms,amenities, or pass any custom dish/keyword (e.g.,"pastrami","rooftop","pool"). - 🎬 Playable MP4 Videos & Owner vs. Visitor Tags: Captures direct MP4 video streams (
videoUrlin 720p/360p,videoDurationMs), distinguishes verified Google Business Profile owner uploads (uploadedByOwner: true,photoSource: "owner") from customer uploads ("visitor"), and preserves dish captions (caption). - 📍 Per-Photo Camera GPS, Compass Bearing & Local Guide Reach: Every row includes exact venue metadata (
placeId,placeCid,placeRating) plus per-photo EXIF camera coordinates (photoLatitude,photoLongitude), compass heading (headingin degrees0–360°), and the uploader's Local Guide level (1–10) and lifetimetotalPhotoViews(often 10M–50M+ views). - 💰 Pay-Per-Result Pricing ($0.50 per 1,000 Photos): 14x cheaper than Google's $7.00/1K Photo API. Private profiles and listings with 0 photos cost $0.00.
🏆 Head-to-Head Comparison: 4 Approaches#
| Feature / Metric | Official Google Places Photo API | Legacy SERP / Maps APIs | Headless Browsers (Playwright) | UnitBytes Google Maps Photos Scraper |
|---|---|---|---|---|
| Cost per 1,000 Photos | 💸 $7.00 / 1k photos (+ $17/1k Place Details) | $3.00 – $15.00 / 1k calls | $4.00 – $8.00 / 1k (Cloud RAM fees) | 💰 $0.50 / 1k clean photos ($0.0005/photo) |
| Max Photos per Place | 🛑 Hard-capped at 10 photos | ⚠️ Usually 10–20 photos | ⚠️ Crashes after ~80–100 DOM nodes | ✅ Up to 1,000+ photos per place |
| Max Image Resolution | ⚠️ Capped at 1600×1600 px | ⚠️ Often thumbnail URLs | ⚠️ Cropped =w400 DOM previews | ✅ Original Uncompressed (=s0, 4000×3000+ px) |
| Gallery Tab Filtering | ❌ None (10 random photos) | ⚠️ Partial / Limited | ⚠️ Fragile UI tab clicking | ✅ All 9 Tabs (menu, food_and_drink, vibe, by_owner, videos, rooms...) + Custom Keywords |
| Playable MP4 Videos & 360° | ❌ Photos only | ❌ Missing or unplayable | ❌ Blob URLs only | ✅ Direct MP4 videoUrl (720p/360p) + videoDurationMs + street_view |
| Owner vs. Visitor Tag | ❌ Not returned | ❌ Not distinguished | ❌ Not distinguished | ✅ uploadedByOwner (true/false) + photoSource (owner/visitor) |
| Per-Photo GPS & Heading | ❌ Not returned | ❌ Venue center only | ❌ Not in DOM | ✅ photoLatitude, photoLongitude & compass heading (0–360°) |
| Multi-Place Search Discovery | ⚠️ Requires separate $32/1k Text Search call | ⚠️ Separate search credits | ❌ Single URL only | ✅ Built-in (maxPlacesPerSearch up to 20 businesses per query) |
| Local Guide Portfolios & Views | ❌ Impossible (No API endpoint) | ❌ Not supported | ❌ Blocked / Incomplete | ✅ Full contributor portfolio + verified totalPhotoViews (10M–50M+) |
| Empty / Private Target Cost | 💸 Billable Place Details call | 💸 Billable credit | 💸 30–60s compute burn | ✅ $0.00 (Fair Billing Guarantee) |
4. The 4 Specialized Tools in the UnitBytes Google Maps Ecosystem#
Rather than forcing every local SEO, reputation management, and visual discovery workflow into a single bloated script, UnitBytes provides four modular Google Maps engines (browse all specs in the UnitBytes Catalog or download ready-to-import n8n Google Maps workflow templates):
┌───────────────────────────────────────────────┐
│ UnitBytes Google Maps Ecosystem │
└───────────────────────┬───────────────────────┘
│
┌──────────────────────┬───────────────┴──────────────┬──────────────────────┐
▼ ▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Photos, Menus │ │ Bulk 10K │ │ Review Takedown │ │ Contributor & │
│ & Videos │ │ Reviews Scraper │ │ & ORM Tracker │ │ Local Guides │
│ (8SRmH83iVuntC) │ │ (fPCCsergoMBWO) │ │ (191pZQj7avHsF) │ │ (fQmUF4KtQ3dcQ) │
└──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘
• $0.50 / 1K photos • $0.25 / 1K reviews • Live vs. Deleted • Reviewer Audit
• Original =s0 HD • Up to 10,000/place • 1-Click RAP Link • Cross-Place Map
• 9 Tabs + MP4s • Newest / Keyword • ORM SLA Verification• Local Guide Lvl 10
1. Google Maps Photos, Menus, Videos & Local Guides Scraper
- Best For: Restaurant menu digitization, hospitality & travel directories, GBP visual audits, Local Guide influencer discovery, and computer vision datasets.
- Features: Accepts any mixture of Google Maps Place URLs, Place IDs (
ChIJ...), city search queries (withmaxPlacesPerSearchup to20), share shortlinks (maps.app.goo.gl/...), and Contributor Profile URLs (/maps/contrib/...). Extracts uncompressed=s0imagery, playable MP4 videos, all 9 gallery tabs, owner vs. visitor tags, per-photo GPS, and lifetimetotalPhotoViews. - 👉 View Specs & Sample CSV • Launch Photos & Menus Scraper on Apify
2. Google Maps Reviews Scraper ($0.25/1K — All 10K Reviews)
- Best For: Bulk sentiment analysis, multi-location franchise monitoring, competitor benchmarking, and LLM customer feedback pipelines.
- Features: Bypasses the official 5-review Places API cap to extract up to 10,000 reviews per business location starting at $0.25 per 1,000 reviews. Supports upstream sorting (
newest,lowest_rating,highest_rating,most_relevant), server-sidereviewKeywordfiltering, detailed aspect sub-ratings (Food, Service, Atmosphere), and owner responses. - 👉 View Specs & Sample CSV • Launch 10K Reviews Scraper on Apify
3. Google Maps Review Takedown & Removal Tracker (ORM Audit)
- Best For: Online Reputation Management (ORM) agencies, legal defamation audits, and franchise SLA compliance.
- Features: Verifies in real time whether specific Google Maps review links (
/maps/reviews/data=...,maps.app.goo.gl/...) are still LIVE or have been DELETED / REMOVED, and generates direct 1-click Google Review Assessment Portal (review_report_url) dispute links for policy-violating reviews. - 👉 View Specs & Sample CSV • Launch Review Takedown Tracker on Apify
4. Google Maps Contributor & Local Guide Reviews Scraper
- Best For: Fake review attack investigations, Local Guide vetting, and consumer brand-affinity mapping.
- Features: Given any reviewer's
/maps/contrib/<UID>URL or Place URL, extracts their complete cross-location review history, Local Guide badge level (1–10), points balance, and every business they have rated across the map with exact GPS coordinates. - 👉 View Specs & Sample CSV • Launch Contributor Scraper on Apify
5. Step-by-Step: Scraping Google Maps Photos, Menus & Videos in Python#
You can trigger the Google Maps Photos, Menus & Videos Scraper directly from your Python scripts, Airflow DAGs, or backend services using apify-client:
Installation
pip install apify-client pandas
Example A: Extracting Restaurant Menu Boards, Food Photos & MP4 Videos
from apify_client import ApifyClient
import pandas as pd
# 1. Initialize Apify Client
client = ApifyClient("YOUR_APIFY_API_TOKEN")
# 2. Extract full-res (=s0) photos & videos from a specific gallery tab or custom dish keyword
run = client.actor("unitbytes/google-maps-photos-scraper").call(
run_input={
"placeUrls": [
"https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/",
"boutique hotels in Miami"
],
"category": "food_and_drink", # Options: "all", "menu", "food_and_drink", "vibe", "exterior", "by_owner", "videos", "street_view", "rooms", "amenities", or custom keyword
"maxPhotos": 100,
"maxPlacesPerSearch": 5, # Expands plain-text search queries up to 20 places
"highResOnly": True # Automatically upgrades URLs to uncompressed =s0 (4000x3000+ px)
}
)
# 3. Load clean flat records directly into a Pandas DataFrame
items = client.dataset(run["defaultDatasetId"]).list_items().items
df = pd.DataFrame(items)
print(f"Scraped {len(df)} high-res media items in seconds!")
print(df[["placeName", "photoCategory", "mediaType", "uploadedByOwner", "caption", "photoUrlHighRes"]].head())
# Export directly to Excel or CSV
df.to_excel("google_maps_menus_and_photos.xlsx", index=False)
Example B: Auditing Local Guide Influencer Portfolios (totalPhotoViews)
Want to find the top hospitality photographers in your city whose Google Maps uploads generate 10M to 50M+ views? Pass their contributor URLs or 21-digit User IDs into contributors:
run = client.actor("unitbytes/google-maps-photos-scraper").call(
run_input={
"contributors": [
"https://www.google.com/maps/contrib/102520373756565203865/photos"
],
"maxPhotos": 100,
"highResOnly": True
}
)
guide_photos = client.dataset(run["defaultDatasetId"]).list_items().items
if guide_photos:
first = guide_photos[0]
print(f"Local Guide: {first['name']} (Level {first['localGuideLevel']})")
print(f"Total Portfolio Photos: {first['totalPhotosCount']:,} | Lifetime Views: {first['totalPhotoViews']:,}")
What the Flat Data Output Looks Like
Unlike raw API responses that bury image dimensions and author metadata inside deeply nested arrays, every row is a self-contained record ready for SQL, BigQuery, or Excel:
{
"targetType": "place",
"placeName": "Katz's Delicatessen",
"placeAddress": "205 E Houston St, New York, NY 10002",
"placeCategory": "Deli",
"placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
"placeCid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
"placeRating": 4.5,
"placeReviewsCount": 56227,
"totalPhotosCount": 95669,
"latitude": 40.722233,
"longitude": -73.987429,
"photoId": "CIABIhAIA6OcsGxnZ7k2_COajcYb",
"photoCategory": "food_and_drink",
"mediaType": "photo",
"uploadedByOwner": false,
"photoSource": "visitor",
"caption": "Katz's signature pastrami sandwich",
"photoUrlHighRes": "https://lh3.googleusercontent.com/grass-cs/AABkmLfLi0lcU6f-15jBy8...=s0",
"photoUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLfLi0lcU6f-15jBy8...=s0",
"thumbnailUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLfLi0lcU6f-15jBy8...=w400-h400-k-no",
"videoUrl": null,
"videoDurationMs": null,
"imageWidth": 4032,
"imageHeight": 3024,
"photoLatitude": 40.722233,
"photoLongitude": -73.987429,
"heading": 157.8,
"uploadDate": "2026-08-19",
"uploadDateRelative": "2 months ago",
"name": "David M.",
"userId": "102520373756565203865",
"isLocalGuide": true,
"localGuideLevel": 8,
"totalPhotoViews": 28450190,
"status": "OK",
"scrapedAt": "2026-10-24T12:00:00Z"
}
6. 6 High-ROI Real-World Business Use Cases#
1. 🍔 Restaurant Menu Digitization, POS Onboarding & Food Delivery Apps
Onboarding thousands of independent restaurants onto a delivery marketplace or POS platform traditionally requires chasing owners for PDF menus and dish photography. By setting category: "menu" and category: "food_and_drink", you can automatically extract high-resolution =s0 (4000×3000+ px) menu board photos for GPT-4o / Gemini Vision OCR extraction alongside dish photos pre-labeled with Google's native dish captions (caption).
2. 🏨 Travel Portals, Hotel Directories & Programmatic SEO Sites
Building a programmatic directory of 10,000 boutique hotels, campgrounds, or coworking spaces using the official Google Places Photo API costs $870+ per refresh and limits you to 10 medium-res images. With unitbytes/google-maps-photos-scraper, you can bulk-extract categorized exterior, vibe, rooms, and amenities galleries matched to exact placeId (ChIJ...) at $0.50 per 1,000 photos—a 93%+ cost reduction.
3. 🎬 Short-Form Video Reels, Hospitality Social Proof & 360° Walkthroughs
Static images rarely capture the ambiance of a rooftop lounge, resort pool, or live music venue. By filtering with category: "videos", travel creators and booking apps extract playable 720p/360p MP4 video streams (videoUrl) with exact durations (videoDurationMs), or use category: "street_view" to pull 360° panoramas with camera compass headings (heading).
4. 📈 Multi-Location Google Business Profile (GBP) Owner vs. Visitor Audits
Google Business Profile listings with fresh owner photos receive up to 42% more direction requests and 35% more website clicks. Multi-location retail brands and franchise marketing directors schedule automated audits using uploadedByOwner (true/false), photoSource ("owner" vs. "visitor"), and uploadDate to flag store branches that lack official owner photography or have unflattering visitor photos pinned at the top.
5. 🌟 Local Guide Influencer Discovery & Hospitality PR Outreach
Paying Instagram or TikTok influencers thousands of dollars buys a fleeting 24-hour story that has zero impact on Google Maps search rankings. Meanwhile, a Level 8–10 Google Local Guide whose photos rack up 20M–50M+ views keeps a venue's hero photo at the top of Google Maps for years. Hospitality PR agencies scrape top local restaurants in placeUrls mode to collect active photographer userIds, then run contributors mode to rank local photographers by verified totalPhotoViews.
6. 🤖 Computer Vision, Geo-Localization & Multimodal AI Training
Training spatial AI, autonomous navigation, and indoor/outdoor scene understanding models requires geo-tagged high-resolution imagery paired with camera orientation and natural-language descriptions. Every record provides uncompressed =s0 imagery, MP4 video links, per-photo camera GPS (photoLatitude, photoLongitude), compass bearing (heading in degrees 0–360°), and human captions (caption).
7. Frequently Asked Questions (FAQ)#
Is it legal to scrape publicly available Google Maps photos and reviews?
Yes. Extracting publicly available information from the open web that is accessible to any unauthenticated visitor without bypassing login walls is legal under prevailing US judicial precedent (including hiQ Labs v. LinkedIn and Meta v. Bright Data). Our actors strictly extract public venue and Local Guide data and respect contributor privacy flags (isPrivate: true profiles exit cleanly with $0.00 charged).
How do I get original uncompressed (=s0) photos instead of 400px thumbnails?
Keep "highResOnly": true (enabled by default). The scraper automatically rewrites Google's CDN sizing parameters to =s0 (photoUrlHighRes), serving the original camera-resolution upload (4032×3024 px and above) while also providing a fast =w400-h400-k-no preview in thumbnailUrl.
Do I need a Google Cloud API key or my own residential proxies?
No. You do not need a Google Cloud billing account, a Places API key, or third-party proxy subscriptions. Every UnitBytes actor includes managed residential proxy routing out of the box on Apify Cloud, ensuring fast, uninterrupted extraction across any country or city.
What happens if a business listing has zero photos or a profile is private?
We enforce a strict Fair Billing Guarantee: you only pay per valid photo extracted ($0.0005 / photo). If a target business has 0 photos for a requested keyword, does not exist (status: "NOT_FOUND"), or a contributor profile has hidden contributions (status: "PRIVATE"), the run exits cleanly with $0.00 charged.
Can I automate this in n8n or schedule recurring runs without writing code?
Yes! You can schedule runs hourly, daily, or weekly directly in the Apify Console, or copy our ready-to-import Google Maps Photos Scraper n8n Workflow Template (Ctrl+V directly into n8n) to pipe new venue photos, menus, and reviews straight into Google Sheets, Airtable, Slack, or PostgreSQL.
🚀 Get Started: Start Scraping in 30 Seconds#
Stop paying $7.00 per 1,000 photos for downscaled 1600px images and a 10-photo ceiling.
UnitBytes Google Maps Scrapers run in your browser or via Python in 1 click. Apify includes $5.00 in free monthly usage credit, meaning you can extract your first 10,000 full-resolution (=s0) Google Maps photos or 20,000 reviews completely free:
- 📸 Try Google Maps Photos, Menus & Videos Scraper ($0.50/1K)
- 🔍 Try Google Maps Bulk 10K Reviews Scraper ($0.25/1K)
- 🛡️ Try Google Maps Review Takedown & Removal Tracker (ORM Audit)
- 🏆 Try Google Maps Contributor & Local Guide Scraper
- Need a Done-For-You Excel/CSV dataset for 1,000+ restaurant menus, hotel galleries, or franchise locations? Submit your target list via the Done-For-You Dataset Request Form below or email our engineering team at [email protected].
Bypass Google Places API Caps — Extract 100% of Photos, Menus & 10K Reviews
Extract uncompressed original (=s0) photos, 9 gallery tabs (menus, food, rooms, MP4 videos), up to 10,000 reviews per place ($0.25/1K), and Local Guide contributor histories at a fraction of official Places API costs.