# Google Maps Photos Scraper (`crawlerbros/google-maps-photos`) Actor

Extract photos from any Google Maps place - carousel scraping with max-resolution URLs, contributor info, and category metadata.

- **URL**: https://apify.com/crawlerbros/google-maps-photos.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 28 total users, 2 monthly users, 93.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps Photos Scraper

Extract every photo from any Google Maps place — including max-resolution image URLs, contributor names, upload dates, captions, and category tabs (Food & Drink, Indoor, Outdoor, Menu, Videos, etc.).

### What It Does

Give this actor a Google Maps place URL and it returns up to 5,000 photos for that place. For each photo you get:

- **Max-resolution photo URL** (full-size, not thumbnail)
- **Photo category** — All Photos, By Owner, By Visitors, Food & Drink, Outdoor, Indoor, Menu, Videos
- **Contributor name** and profile URL (when available)
- **Upload date** as a relative string (e.g. "2 months ago")
- **Original dimensions** + aspect ratio + orientation
- **Caption** and tags (when published by the contributor)
- **Video flag** — distinguishes photos from short clips
- **Business context** — `businessName`, `placeId`, `placeUrl` echoed on every record so the dataset stays joinable

### Use Cases

- Build a visual asset library for restaurants, hotels, and venues
- Track menu / interior photo updates over time
- Source UGC photography for travel and food blogs
- Power "what does this place look like" previews in custom apps
- Enrich lead-generation pipelines with visual context

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `placeUrl` | String | Yes | — | Google Maps place URL |
| `maxPhotos` | Integer | No | `100` | Maximum number of photos to extract (1–5000) |
| `photoCategory` | Enum | No | `all` | Filter by tab: `all`, `by_owner`, `by_visitors`, `food_and_drink`, `outdoor`, `indoor`, `menu`, `videos` |
| `enrichDetails` | Boolean | No | `true` | Visit each photo individually to capture contributor, date, dimensions, tags. Disable for ~3–5x faster runs that only return thumbnail-level data. |
| `proxyConfiguration` | Object | No | Apify Proxy | Optional proxy settings |

#### Example input

```json
{
  "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/",
  "maxPhotos": 50,
  "photoCategory": "all",
  "enrichDetails": true
}
```

### Output

One record per photo:

```json
{
  "photoId": "AF1QipP...XYZ",
  "photoUrl": "https://lh3.googleusercontent.com/p/AF1QipP...XYZ=s0",
  "category": "by_visitors",
  "contributorName": "Jane Smith",
  "contributorUrl": "https://maps.google.com/maps/contrib/123...",
  "uploadDate": "2 months ago",
  "caption": "Sunset view from the observation deck",
  "width": 4032,
  "height": 3024,
  "aspectRatio": 1.33,
  "orientation": "landscape",
  "isVideo": false,
  "tags": ["sunset", "view", "observation deck"],
  "businessName": "Empire State Building",
  "placeId": "0x89c259a9b3117469:0xd134e199a405a163",
  "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/...",
  "rank": 1,
  "scrapedAt": "2026-06-16T12:00:00+00:00"
}
```

Empty fields are omitted automatically — no `null` values in the dataset.

### FAQ

**Does it need a proxy or cookies?**
No login or cookies. A proxy is recommended for large runs to avoid rate limiting, and Apify Proxy is enabled by default.

**Which categories does Google show?**
Every place is different. Restaurants typically have Food & Drink + Menu, hotels have Indoor + Outdoor, and landmarks usually have a single "All Photos" tab. Selecting a category that doesn't exist for a place yields the All tab automatically.

**What does `enrichDetails` actually do?**
With enrichment on, the actor walks through every photo (one network request per photo) to capture contributor and upload metadata. With it off, only thumbnail-level fields (photoUrl, category, businessName) are returned — much faster but less detail.

**Are video clips supported?**
Yes — short video clips on Google Maps are included when `photoCategory` is `all` or `videos`, with `isVideo: true` on the record.

**How many photos can I get per place?**
Google Maps caps each photo tab at ~5,000 — the same limit this actor exposes.

### Data Source

Public Google Maps web UI. No Google API key required.

### 🗺️ Complete Google Maps Scraper Suite

This actor is part of a comprehensive Google Maps data extraction toolkit by **crawlerbros**. All actors run on the free Apify plan, use no proxy by default, and return clean, structured data.

| Actor | What it does |
|---|---|
| 🏢 [Google Maps Business Scraper](https://apify.com/crawlerbros/google-maps-scraper) | Extract business data — name, address, phone, website, rating, reviews, hours, amenities |
| ⭐ [Google Maps Reviews Scraper](https://apify.com/crawlerbros/google-maps-reviews-scraper) | Scrape reviews with reviewer Local Guide level, photos, mentioned items, owner replies |
| 🕐 [Google Maps Business Hours Scraper](https://apify.com/crawlerbros/google-maps-business-hours) | Full 7-day hours, timezone, current local time, next open/close, holiday hours |
| 📊 [Google Maps Popular Times Scraper](https://apify.com/crawlerbros/google-maps-popular-times) | Busy hours histogram for all 7 days + current busyness + typical visit time |
| 📧 [Google Maps Email Extractor](https://apify.com/crawlerbros/google-maps-email-extractor) | Find business emails + social media links by crawling websites |
| 🗺️ [Google Maps Area Scanner](https://apify.com/crawlerbros/google-maps-area-scanner) | Geographic grid scanning — bypass the 120-place limit with bounding box / circle / polygon |
| 💼 [Google Maps Leads Scraper](https://apify.com/crawlerbros/google-maps-leads) | B2B lead generation with email + phone enrichment, US states + global countries |
| 🤖 [Google Maps MCP Server](https://apify.com/crawlerbros/google-maps-mcp) | Unified MCP server combining search + reviews for AI assistants |
| 🧭 [Google Maps Directions Scraper](https://apify.com/crawlerbros/google-maps-directions) | A→B routing — distance, duration, traffic, route alternatives for driving/walking/transit |
| 📍 [Google Maps Geocoding Scraper](https://apify.com/crawlerbros/google-maps-geocoding) | Bidirectional geocoding — address ↔ coordinates, with address components |
| 🔗 [Google Maps Similar Places Scraper](https://apify.com/crawlerbros/google-maps-similar-places) | "People also search for" / related place discovery — competitor & alternative finder |
| 🍽️ [Google Maps Menu Scraper](https://apify.com/crawlerbros/google-maps-menu) | Restaurant menu items, prices, descriptions, photos |
| 📌 [Google Maps Nearby Scraper](https://apify.com/crawlerbros/google-maps-nearby) | Find places near a coordinate point — lightweight POI search by category |
| 📋 [Google Maps Place List Scraper](https://apify.com/crawlerbros/google-maps-place-list) | Extract Google's curated "Top X in Y" lists — best hotels/restaurants/things to do |
| 🌍 [Google Maps Timezone Scraper](https://apify.com/crawlerbros/google-maps-timezone) | IANA timezone + current local time from coordinates |

# Actor input Schema

## `placeUrl` (type: `string`):

Google Maps URL of the place to scrape photos from.

## `maxPhotos` (type: `integer`):

Maximum number of photos to extract (1-5000).

## `photoCategory` (type: `string`):

Filter photos by category tab.

## `enrichDetails` (type: `boolean`):

When enabled, walks through each photo to capture contributor name/URL, upload date, original dimensions, aspect ratio, orientation, video flag, and tags. Disable for ~3-5x faster runs that only return thumbnail-level data.

## `proxyConfiguration` (type: `object`):

Proxy settings.

## Actor input object example

```json
{
  "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584!16zL20vMDJfMjg2",
  "maxPhotos": 20,
  "photoCategory": "all",
  "enrichDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584!16zL20vMDJfMjg2",
    "maxPhotos": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/google-maps-photos").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584!16zL20vMDJfMjg2",
    "maxPhotos": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/google-maps-photos").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "placeUrl": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584!16zL20vMDJfMjg2",
  "maxPhotos": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/google-maps-photos --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/google-maps-photos"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eA8dLif54EJtaHi7U/builds/hlrIlFWY1Qok59FLF/openapi.json
