# Google Maps Photos Scraper - Menu, Food, Vibe & Owner (`sian.agency/google-maps-photos-scraper`) Actor

Extract every Google Maps photo for any place, tagged by the same categories Maps shows: Menu, Food & drink, Vibe, By owner, Street View & 360. Full resolution, dates, GPS.

- **URL**: https://apify.com/sian.agency/google-maps-photos-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Travel, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.06 / 1,000 place photos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 — Menu, Food, Vibe & Owner Photos 📸

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store Google Maps Scraper](https://img.shields.io/badge/Store-Google%20Maps%20Scraper-4285F4)](https://apify.com/sian.agency/local-business-data-scraper?fpr=sian) [![Store Google Maps Traffic](https://img.shields.io/badge/Store-Google%20Maps%20Traffic-EA4335)](https://apify.com/sian.agency/google-maps-traffic-alerts?fpr=sian) [![Store Tripadvisor Hotels](https://img.shields.io/badge/Store-Tripadvisor%20Hotels-34E0A1)](https://apify.com/sian.agency/tripadvisor-hotel-scraper?fpr=sian)

#### 🎉 Photos tagged the way Google tags them — Menu, Food & drink, Vibe, Rooms, By owner

##### For menu digitisation, hotel galleries, brand audits and vision-model training sets

***

### 🔎 What is the Google Maps Photos Scraper — and when should you use it?

The **Google Maps Photos Scraper** turns the photo library behind any Google Maps place into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** the photo library behind a Google Maps place, one row per photo, each tagged with the category tab Google files it under: Menu, Food & drink, Vibe, Rooms, Exterior, Amenities, By owner, From visitors, Street View & 360°. Rows carry a full-resolution image URL, a thumbnail, native pixel dimensions, the upload date, GPS coordinates, a flag saying whether the business or a visitor posted it, and the place's own name, address and category. Videos come through with a playable URL and a duration. Places can be given as Maps URLs, hex place IDs, or plain text such as a business name and city.

**Use something else when:** you need to find the places themselves rather than their photos. Use [Google Maps Scraper](https://apify.com/sian.agency/local-business-data-scraper?fpr=sian) for searching Google Maps for businesses and returning their details, emails, reviews and lead data. Use [Google Maps Traffic API](https://apify.com/sian.agency/google-maps-traffic-alerts?fpr=sian) for live traffic incidents, accidents and road closures rather than place imagery. This actor takes places you already know and goes deep on their photos. It does not search for places, and it does not return reviews, opening hours or contact details.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/google-maps-photos-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want categorised photos for Google Maps places using the Apify Actor `sian.agency/google-maps-photos-scraper`.

Use it when I need: the photo library behind a Google Maps place, one row per photo, each tagged with the category tab Google files it under: Menu, Food & drink, Vibe, Rooms, Exterior, Amenities, By owner, From visitors, Street View & 360°. Rows carry a full-resolution image URL, a thumbnail, native pixel dimensions, the upload date, GPS coordinates, a flag saying whether the business or a visitor posted it, and the place's own name, address and category. Videos come through with a playable URL and a duration. Places can be given as Maps URLs, hex place IDs, or plain text such as a business name and city.

Don't use it when: you need to find the places themselves rather than their photos — use local-business-data-scraper or google-maps-traffic-alerts instead.

How to call it: put one or more places in `places`, as a Google Maps place URL, a hex place ID like `0x89c2598f7ff4aa09:0x313547e757cb8cea`, or plain text such as "Katz's Delicatessen New York"; choose which tabs to pull with `photoCategories` (`all`, `menu`, `food_and_drink`, `vibe`, `rooms`, `exterior`, `amenities`, `from_visitors`, `by_owner`, `street_view_360`, `latest`, `videos`); cap spend per place with `maxPhotosPerPlace`; pick `imageSize` (`thumbnail`, `medium`, `large` or `original`); set `language` for the category labels; and turn `includeVideos` off for stills only.

Start with this input:
{
  "places": [
    "Katz's Delicatessen New York"
  ],
  "photoCategories": [
    "menu",
    "food_and_drink"
  ],
  "maxPhotosPerPlace": 50,
  "imageSize": "original"
}

Ask me which places you want photos for, and whether you need the whole library or only certain tabs such as Menu or By owner, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull the Menu tab for 30 pizzerias in Brooklyn and give me one image URL per row so I can run OCR over them.*
- *Get the Rooms and Amenities photos for these five hotels at full resolution and tell me which one has the fewest owner-posted images.*
- *Collect every By owner photo for our 12 store locations and flag any location whose newest owner photo is more than a year old.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/google-maps-photos-scraper.md](https://apify.com/sian.agency/google-maps-photos-scraper.md).

### 📋 Overview

**Google Maps holds more photos of a business than the business does.** It already sorts them for you, too. This Actor gives you that sorted library as data.

Point it at a place and you get one row per photo, each stamped with the category tab Google files it under. A restaurant returns Menu, Food & drink and Vibe. A hotel returns Rooms, Exterior, Amenities and From visitors. A museum returns its gallery names. You did not classify any of it, and neither did we.

**What you get:**

- ✅ **Google's own categories**: Menu, Food & drink, Vibe, Rooms, Exterior, Amenities, By owner, From visitors, Street View & 360°, Videos
- ⚡ **Up to 200 photos per request**, in under a second. A busy restaurant's whole library takes a handful of calls
- 🎯 **One row per photo**, so you can filter by category, sort by date and feed an image pipeline without unpacking a bundle first
- 💰 **From $1.20 per 1,000 photos on paid plans**, a third under the next-cheapest categorised photo Actor
- 💎 **Plain-text place lookup**: paste "Katz's Delicatessen New York" and skip the URL hunt
- 🏢 **Owner vs visitor flag** on every row, straight from Google's own upload source
- 🌐 **18 languages** for the category labels, matched on Google's language-independent category IDs

***

### ✨ Features

- 🏷️ **Category-tagged rows**: every photo carries the Maps tab it came from, plus a stable slug you can filter on
- 📍 **Three ways to name a place**: Maps URL, hex place ID, or just the name and city
- 🖼️ **Four resolutions**: thumbnail, medium, large, or each photo's own native size
- 🎬 **Videos included**: playable URL and clip length, or switch them off for stills only
- 📅 **Upload dates**: know whether a place's imagery is current or five years stale
- 🌐 **GPS per photo**: latitude and longitude on every row
- 🏢 **Owner-uploaded flag**: separate the business's approved shots from customer photos
- 🔢 **Per-place caps**: stop at 50 photos or 5,000. You decide what each place is worth
- 🚫 **Nothing invented**: a tab a place does not have is skipped, never filled with mislabelled photos
- 🔑 **No API key, no proxy, no account**. Paste places and press run

***

### 🎬 Quick Start

Paste one or more places, pick the categories you care about, and run. Results land in a dataset you can export as JSON, CSV or Excel. A bare run with no configuration returns photos for the example place, so you can see the shape of the data before committing to a list.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~google-maps-photos-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"places": ["Katz'\''s Delicatessen New York"]}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your places

Paste Google Maps URLs, hex place IDs, or plain business names, one per line.

#### Step 2: Pick your categories

Leave it on **All photos** for the whole library, or narrow to Menu, Rooms, By owner or any other tab.

#### Step 3: Set a cap and run

Choose how many photos each place is worth, then press Start.

**That's it! In under a minute, you'll have:**

- Every photo URL at the resolution you asked for
- The Google Maps category tab behind each one
- Upload dates, dimensions, GPS and the owner-versus-visitor split

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `places` | array | No | Maps URLs, hex place IDs, or plain place names, one per line |
| `photoCategories` | array | No | Which category tabs to pull. Default: all photos |
| `maxPhotosPerPlace` | integer | No | Photo cap per place. Default: 100 |
| `imageSize` | string | No | `thumbnail`, `medium`, `large` or `original`. Default: `original` |
| `language` | string | No | Language of the category labels. Default: `en` |
| `includeVideos` | boolean | No | Keep video clips alongside photos. Default: `true` |

**Example:**

```json
{
  "places": ["Katz's Delicatessen New York"],
  "maxPhotosPerPlace": 100
}
```

**Menu photos for several restaurants:**

```json
{
  "places": [
    "Joe's Pizza 7 Carmine St New York",
    "Lou Malnati's Pizzeria River North Chicago",
    "https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea!8m2!3d40.722233!4d-73.987429"
  ],
  "photoCategories": ["menu", "food_and_drink"],
  "maxPhotosPerPlace": 60,
  "imageSize": "original"
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **20+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `photoUrl` | string | Image URL at your chosen resolution |
| `thumbnailUrl` | string | 400px version, always present |
| `categoryLabel` | string | The Maps tab this photo came from, in your language |
| `categorySlug` | string | Stable, language-independent category key |
| `isOwnerPhoto` | boolean | Business uploaded it, or a visitor did |
| `mediaType` | string | `photo`, `video` or `street_view` |
| `width` / `height` | number | Native pixel dimensions |
| `uploadedAt` | string | When the photo was posted to Maps |
| `videoUrl` | string | Playable clip, on video rows |
| `videoDurationMs` | number | Clip length in milliseconds |
| `latitude` / `longitude` | number | Where the photo was taken |
| `placeName` | string | The place this photo belongs to |
| `placeAddress` | string | Street address from Google Maps |
| `placeCategory` | string | Deli, Hotel, Historical landmark, and so on |
| `placeFtid` | string | Google's hex place ID. Paste it back in to re-run |
| `placeUrl` | string | Opens the place on Google Maps |

**Example:**

```json
{
  "photoId": "CIHM0ogKEICAgIDCx92MtgE",
  "photoUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl...=w1048-h699-k-no",
  "thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl...=w400-h300-k-no",
  "width": 1048,
  "height": 699,
  "mediaType": "photo",
  "categoryLabel": "Menu",
  "categorySlug": "menu",
  "isOwnerPhoto": true,
  "uploadedAt": "2020-10-14T05:00:00.000Z",
  "latitude": 40.7223437,
  "longitude": -73.9872214,
  "placeName": "Katz's Delicatessen",
  "placeAddress": "205 E Houston St, New York, NY 10002",
  "placeCategory": "Deli",
  "placeFtid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
  "placeUrl": "https://www.google.com/maps?cid=3545819340560108778",
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. Menu Digitisation

**Delivery platforms and menu-data teams pulling photographed menus at scale.**

**Input:** a list of restaurants, `photoCategories: ["menu"]`
**Output:** menu-board and dish photos at native resolution
**Use:** feed them straight to OCR. The category comes from Google, so you skip the "is this a menu or a dessert" classification step entirely.

#### 2. Hotel & Venue Image Libraries

**Travel marketplaces and property teams filling listing galleries.**

**Input:** hotel names or Maps URLs, `photoCategories: ["rooms", "exterior", "amenities"]`
**Output:** room, exterior and facility photos, dated and sized
**Use:** enrich listings, or audit which properties have thin and outdated imagery worth an outreach call.

#### 3. Brand & Franchise Photo Audits

**Brand managers checking what customers actually see.**

**Input:** every location of a chain, `photoCategories: ["by_owner", "from_visitors"]`
**Output:** the owner-approved set and the visitor set, side by side
**Use:** find locations where customer photos have buried the official ones, or where nobody has posted an owner photo in two years.

#### 4. Vision-Model Training Sets

**ML teams building labelled image datasets.**

**Input:** hundreds of places across a category
**Output:** category-labelled, geotagged, dated images at native resolution
**Use:** food imagery by cuisine, interiors by venue type, storefronts by street. The labels came from Google rather than from a heuristic you have to defend.

#### 5. Competitive Visual Monitoring

**Local marketing agencies tracking a competitor set.**

**Input:** competitor locations, `photoCategories: ["latest"]`, on a schedule
**Output:** the newest photos each run
**Use:** new photo volume, and who is posting it, is a fast proxy for how busy a location really is.

#### 6. Travel Content & Directory Galleries

**Publishers sourcing location imagery.**

**Input:** landmarks, restaurants and neighbourhoods for a city guide
**Output:** full-resolution photos with GPS and dates
**Use:** build guides, city directories and landing-page galleries without a stock-photo bill.

#### 7. Street View & 360° Collection

**Mapping and real-estate teams after panoramas.**

**Input:** addresses, `photoCategories: ["street_view_360"]`
**Output:** panoramic and 360° imagery with camera position
**Use:** site surveys and neighbourhood context without visiting.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/google-maps-photos-scraper').call({
  places: ["Katz's Delicatessen New York"],
  photoCategories: ['menu'],
  maxPhotosPerPlace: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/google-maps-photos-scraper').call(
    run_input={
        'places': ["Katz's Delicatessen New York"],
        'photoCategories': ['menu'],
        'maxPhotosPerPlace': 50,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['photoUrl'], item['categoryLabel'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~google-maps-photos-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"places": ["Katz'\''s Delicatessen New York"], "photoCategories": ["menu"]}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule, or a webhook carrying new place URLs
2. **HTTP Request**: Call the Actor API
3. **Process**: Filter rows by `categorySlug` or `isOwnerPhoto`
4. **Action**: Push image URLs to your CDN, OCR queue or listing database

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 photos** per run, with every feature and the same data quality
- No credit card required
- Enough to check the categories and fields against a place you know

#### PAID Tier (Production Ready)

- **Unlimited** photos per run
- Up to 200 photos per request, in under a second
- Pay-per-result: charged per photo returned, never for a place that fails

💰 **$1.20 per 1,000 photos on paid plans**, a third below the next-cheapest categorised photo Actor. The price drops further on higher tiers.

🔗 [View current pricing](https://apify.com/sian.agency/google-maps-photos-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many photos can one place return?**
A: As many as Google Maps holds. Busy restaurants and landmarks run into the thousands, so the practical limit is the per-place cap you set.

**Q: Do I need a Google Places API key?**
A: No. There is no key, no quota and no billing account to set up.

**Q: Where do the categories come from?**
A: From Google. The Actor reads the same category tabs the Maps website shows for that place and uses Google's own category IDs to filter. Nothing is guessed from the image.

**Q: Can I paste a place name instead of a URL?**
A: Yes. Text like "Katz's Delicatessen New York" is resolved through Google Maps first, and the place name, address, category and GPS come back on every row.

**Q: Does it tell me who took each photo?**
A: It tells you whether the business or a visitor uploaded it. It does not return contributor names or profile links. Google's photo data carries no such field, so that column would be permanently empty and we would rather not ship it.

**Q: Are the image URLs full resolution?**
A: Yes, with resolution set to Original. Each photo's native dimensions come from the data and the URL is built to match, so you get the largest size Google holds.

**Q: What happens if I ask for Menu photos of a hotel?**
A: That tab is skipped and the run says so. You get nothing for it rather than a set of unrelated photos labelled "Menu".

**Q: Are videos included?**
A: Yes, with a playable URL and a clip length. Switch **Include videos** off if you only want stills.

***

### 🐛 Troubleshooting

**"No Google Maps place found for ..."**

- Add the city or a street to the place name. "Joe's Pizza" alone matches dozens of places
- Or paste the Maps URL straight from your browser's address bar

**A short maps.app.goo.gl link does not work**

- Open it in a browser first, then copy the full URL from the address bar

**Fewer photos than expected**

- Check your per-place cap
- On the free tier every run stops at 25 rows
- Some places genuinely hold very few photos. A small clinic may have six

**A category came back empty**

- The run log lists the tabs each place actually offers. Places only carry the tabs Google gives them, and Menu, Rooms and Amenities depend entirely on the type of business.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Photos on Google Maps are uploaded by businesses and by members of the public, and they remain the property of whoever took them. Check the licensing position before republishing any image commercially.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Google and Google Maps are trademarks of Google LLC. This actor is not affiliated with, endorsed by, or sponsored by Google.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

📸 **PLACE PHOTOS:** collects a place's photo library and tags every photo with the Google Maps category tab it came from.

This Actor has one job and this is it, so leave it as it is.

## `places` (type: `array`):

📍 **ONE PLACE PER LINE**, in whatever form you already have.

✅ **Accepted:**

- A Google Maps place URL from your browser's address bar
- A place name with its city, e.g. `Katz's Delicatessen New York`
- A hex place ID, e.g. `0x89c2598f7ff4aa09:0x313547e757cb8cea`

🔎 Plain text is resolved through Google Maps itself, and the place name, address, category and GPS come back on every row.

🚫 Short `maps.app.goo.gl` links are not supported. Open one in a browser and copy the full URL.

## `photoCategories` (type: `array`):

🏷️ **THE CATEGORY TABS MAPS ITSELF SHOWS.** Pick 🖼️ All photos for the whole library, or narrow it to cut cost.

🍽️ Restaurants carry Menu, Food & drink and Vibe.
🏨 Hotels carry Rooms, Exterior and Amenities.
🏢 By owner is the business's own photos; 👥 From visitors is what customers posted.

✅ Tabs a place does not offer are skipped, never guessed at.

## `maxPhotosPerPlace` (type: `integer`):

🔢 **YOUR MAIN COST CONTROL.** Stops after this many photos for each place.

📸 Popular restaurants and landmarks hold thousands of photos, so leaving this high on a long list of places gets expensive fast. One request returns up to 200 photos, so the run stops at the first request that crosses your number.

## `imageSize` (type: `string`):

🖼️ **HOW BIG THE IMAGE URLS COME BACK.** Google serves any size from a single photo.

⭐ **Original** uses each photo's own native dimensions, which the data carries per photo. That is the largest size Google holds, not a grid thumbnail.

💡 Every row also carries a separate thumbnail URL whatever you pick here, so you can preview cheaply and fetch full size only when you need it.

## `language` (type: `string`):

🌐 **THE LANGUAGE OF THE CATEGORY LABELS.** Set it to French and the owner tab comes back as `Photos du propriétaire`; Portuguese gives `Do proprietário`.

📸 The photos themselves are identical either way; only the labels change. Leave it on English if you want one stable set of labels to filter on.

## `includeVideos` (type: `boolean`):

🎬 **KEEP THE VIDEO CLIPS** visitors post alongside photos. Video rows carry a playable video URL and a length in milliseconds on top of the usual fields.

📷 Turn this off for stills only.

## Actor input object example

```json
{
  "operation": "photos",
  "places": [
    "Katz's Delicatessen New York",
    "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813"
  ],
  "photoCategories": [
    "all"
  ],
  "maxPhotosPerPlace": 100,
  "imageSize": "original",
  "language": "en",
  "includeVideos": true
}
```

# Actor output Schema

## `placePhotos` (type: `string`):

Every photo collected, with its category, resolution, upload date, GPS and place details

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "photos",
    "places": [
        "Katz's Delicatessen New York",
        "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813"
    ],
    "photoCategories": [
        "all"
    ],
    "maxPhotosPerPlace": 100,
    "imageSize": "original",
    "language": "en",
    "includeVideos": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/google-maps-photos-scraper").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 = {
    "operation": "photos",
    "places": [
        "Katz's Delicatessen New York",
        "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813",
    ],
    "photoCategories": ["all"],
    "maxPhotosPerPlace": 100,
    "imageSize": "original",
    "language": "en",
    "includeVideos": True,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/google-maps-photos-scraper").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 '{
  "operation": "photos",
  "places": [
    "Katz'\''s Delicatessen New York",
    "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813"
  ],
  "photoCategories": [
    "all"
  ],
  "maxPhotosPerPlace": 100,
  "imageSize": "original",
  "language": "en",
  "includeVideos": true
}' |
apify call sian.agency/google-maps-photos-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/PkFajnzL6te1d1U8g/builds/sKboa2Jvh6dUhyy5j/openapi.json
