# Google Maps Photo Scraper (`api-ninja/google-maps-photo-scraper`) Actor

📸 Scrape photos and videos from Google Maps businesses and places.

- **URL**: https://apify.com/api-ninja/google-maps-photo-scraper.md
- **Developed by:** [API ninja](https://apify.com/api-ninja) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 results

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/platform/actors/running/actors-in-store#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

### What does Google Maps Photos Scraper do?

**Google Maps Photos Scraper extracts photos and videos from businesses and places on [Google Maps](https://www.google.com/maps).** Enter a business name, Google Maps URL, business ID, or place ID, choose how many results you need, and start the Actor. Each photo or video is saved as a clean dataset item with its media URL, type, location, and publication date when available.

Use it to collect visual place data without maintaining your own scraper. Running on the Apify platform also gives you **API access, scheduling, monitoring, cloud storage, webhooks, and integrations** with tools such as Google Sheets, Make, Zapier, and other automation platforms.

Google Maps Photos Scraper can:

- 📸 Extract Google Maps business and place photos
- 🎬 Return only video media when needed
- 🔎 Find a place from a plain-text business name
- 🔗 Accept full or shortened Google Maps URLs
- 🆔 Accept Google business IDs and place IDs directly
- ♾️ Follow pagination and collect all available results
- 🎯 Stop at an exact result limit for each place
- 🌍 Localize place lookup with a two-letter country code
- 📦 Export structured results to JSON, CSV, Excel, XML, or HTML
- ⚙️ Run manually, on a schedule, through the Apify API, or as part of an automation

### Why use Google Maps Photos Scraper?

Visual place data can help with market research, travel applications, local directory enrichment, brand monitoring, hospitality analysis, and dataset creation. Instead of opening each listing and collecting media manually, you can process several businesses in one run and receive consistent structured data.

Common use cases include:

- Building or enriching restaurant, hotel, attraction, and venue directories
- Researching how customers visually present a location
- Collecting reference images for travel and local discovery products
- Finding video content associated with physical businesses
- Monitoring the visual presence of your own locations
- Creating datasets for internal analysis or machine-learning workflows

The Actor returns links to the available media. It does not download image or video files into the key-value store.

### How to scrape Google Maps photos

1. Open Google Maps Photos Scraper in Apify Console.
2. Add one or more businesses or places. The easiest option is a name such as `Empire State Building`, but you can also paste a Google Maps URL, business ID, or place ID.
3. Set the maximum number of results per place, or enable **Scrape all results**.
4. Optionally enable **Videos only** and choose a region.
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab to preview the results or download the dataset in your preferred format.

For the most accurate name lookup, include a city or country when a business name is ambiguous. For example, use `Pizzagonia Rivne` instead of only `Pizzagonia`.

### Input

The Actor’s **Input** tab provides a simple form for every setting.

| Field               | Type             | Default  | Description                                                                        |
| ------------------- | ---------------- | -------- | ---------------------------------------------------------------------------------- |
| `startUrls`         | Array of strings | Required | Business names, Google Maps URLs, shortened Maps URLs, business IDs, or place IDs. |
| `maxPhotosPerPlace` | Integer          | `100`    | Maximum number of items saved for each place when scrape-all mode is disabled.     |
| `parseAllPhotos`    | Boolean          | `false`  | Continues through all available result pages.                                      |
| `videosOnly`        | Boolean          | `false`  | Returns only media identified as video.                                            |
| `region`            | String           | `us`     | Two-letter ISO 3166-1 alpha-2 country code, such as `us`, `gb`, `de`, or `ua`.     |

Example input:

```json
{
    "startUrls": ["Empire State Building", "ChIJkaUn1JPTD4gR7ZWpE9cCuow", "0x89c259b5a9bd152b:0x31453e62a3be9f76"],
    "maxPhotosPerPlace": 100,
    "parseAllPhotos": false,
    "videosOnly": false,
    "region": "us"
}
```

When `parseAllPhotos` is enabled, `maxPhotosPerPlace` is ignored. The Actor keeps requesting result pages until the place has no further media available.

### Output

Every object returned by the source is stored as a separate item in the default Apify dataset. A typical output looks like this:

```json
[
    {
        "photo_id": "CIHM0ogKEICAgIChpr_PmQE",
        "photo_url": "https://lh3.googleusercontent.com/example-media-url",
        "photo_url_large": null,
        "video_thumbnail_url": "https://lh3.googleusercontent.com/example-video-thumbnail",
        "latitude": 40.752668568450744,
        "longitude": -73.99356477987595,
        "type": "video",
        "photo_datetime_utc": "2023-03-11T00:00:00.000Z",
        "photo_timestamp": 1678492800
    }
]
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**. Results are also accessible programmatically through the Apify API. This makes it easy to send media records into a database, spreadsheet, data pipeline, or another Actor.

### Google Maps photo data fields

| Field                 | Description                                                                                       |
| --------------------- | ------------------------------------------------------------------------------------------------- |
| `photo_id`            | Identifier supplied for the media item. In some cases, the identifier may itself be a source URL. |
| `photo_url`           | Primary photo or media URL.                                                                       |
| `photo_url_large`     | Large-format photo URL when available.                                                            |
| `video_thumbnail_url` | Thumbnail URL for video media when available.                                                     |
| `latitude`            | Latitude associated with the media item.                                                          |
| `longitude`           | Longitude associated with the media item.                                                         |
| `type`                | Media type, normally `photo` or `video`.                                                          |
| `photo_datetime_utc`  | Media date in UTC when available.                                                                 |
| `photo_timestamp`     | Unix timestamp corresponding to the media date.                                                   |

Some Google Maps records do not contain every field. Optional values can therefore be `null`.

### How much does it cost to scrape Google Maps photos?

The final cost depends on the Actor pricing displayed in the **Pricing** tab, the number of places, the requested result count, and how many pages are available for each place. A run for one place with a limit of 100 is a useful low-cost test before processing a larger list.

To control spending:

- Start with a small `maxPhotosPerPlace` value.
- Leave **Scrape all results** disabled until you know the approximate media volume.
- Process a small sample of places before starting a large production run.
- Use Apify run limits and monitoring to control long-running automations.

Eligible Apify plans include platform usage credits; consult the current Apify **Pricing** page and the Actor’s **Pricing** tab for the exact allowance and rates applicable to your account.

### Tips and advanced options

#### Get more accurate business matches

Names are resolved automatically, but common business names may exist in several locations. Add a city, region, address, or country to the query for a more precise match. Direct Google Maps URLs and IDs are best when exact identity matters.

#### Collect every available photo

Enable `parseAllPhotos` to follow pagination until no more results remain. Availability varies by listing, and a place can return fewer items than requested. If a terminal page cannot be reached, the Actor keeps all items already saved and finishes the place gracefully.

#### Scrape only Google Maps videos

Enable `videosOnly` to filter the source to video media. Because many businesses have few or no videos, the resulting dataset may be much smaller than a normal photo run.

#### Automate with the Google Maps Photos API

After saving an Actor task, you can invoke it from the Apify API, schedule recurring runs, receive completion webhooks, or connect the dataset to supported integrations. API clients can read results directly from the run’s default dataset.

### Related Google Maps Actors

Combine this Actor with other tools from the same Google Maps data workflow:

| Actor                                                                                  | Best for                                                                |
| -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [Google Maps Scraper](https://apify.com/api-ninja/google-maps-scraper)                 | Finding places and extracting business details at scale.                |
| [Google Maps Reviews Scraper](https://apify.com/api-ninja/google-maps-reviews-scraper) | Collecting ratings, review text, reviewer details, and review metadata. |
| Google Maps Photos Scraper                                                             | Collecting photo and video media associated with places.                |

A practical workflow is to discover businesses with Google Maps Scraper, collect their reviews with Google Maps Reviews Scraper, and then enrich the same place records with visual media from this Actor.

### FAQ, disclaimers, and support

#### Can I use a business name instead of a Google Maps URL?

Yes. Enter a business or place name in `startUrls`. Add the city or country when the name could match more than one location.

#### Can this Actor scrape videos only?

Yes. Enable **Videos only**. Returned items will be limited to media identified as video.

#### Why did I receive fewer results than requested?

The place may have fewer available media items, the selected videos-only filter may reduce the result set, or no further result page may be available. The maximum result setting is a limit, not a guarantee.

#### Does the Actor download the media files?

No. It stores structured metadata and source URLs in the dataset. Your downstream workflow can use those URLs according to your needs and applicable terms.

#### Is it legal to scrape Google Maps photos?

Web scraping laws and platform terms vary by country and use case. You are responsible for ensuring that your use complies with applicable laws, privacy rules, copyright requirements, and Google’s terms. Do not use the Actor to collect or republish data without an appropriate legal basis or permission.

#### Where can I report an issue?

Use the Actor’s **Issues** tab to report unexpected results or request a feature. Include a non-sensitive example input and the run ID so the problem can be reproduced. Custom Google Maps data collection and integration solutions are also available on request.

# Actor input Schema

## `startUrls` (type: `array`):

Google Maps URLs, shortened Maps URLs, business IDs, place IDs, or place names (for example, ‘Empire State Building’).

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

Maximum number of media items to save for each place when ‘Scrape all results’ is disabled.

## `parseAllPhotos` (type: `boolean`):

Keep following pagination until the API has no more media for each place.

## `videosOnly` (type: `boolean`):

Return only video media (type=video).

## `region` (type: `string`):

Two-letter ISO 3166-1 alpha-2 country code used for Google Maps results (for example: us, gb, de).

## Actor input object example

```json
{
  "startUrls": [
    "0x89c259b5a9bd152b:0x31453e62a3be9f76",
    "ChIJkaUn1JPTD4gR7ZWpE9cCuow",
    "Empire State Building"
  ],
  "maxPhotosPerPlace": 100,
  "parseAllPhotos": false,
  "videosOnly": false,
  "region": "us"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "startUrls": [
        "0x89c259b5a9bd152b:0x31453e62a3be9f76",
        "ChIJkaUn1JPTD4gR7ZWpE9cCuow",
        "Empire State Building"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("api-ninja/google-maps-photo-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 = { "startUrls": [
        "0x89c259b5a9bd152b:0x31453e62a3be9f76",
        "ChIJkaUn1JPTD4gR7ZWpE9cCuow",
        "Empire State Building",
    ] }

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    "0x89c259b5a9bd152b:0x31453e62a3be9f76",
    "ChIJkaUn1JPTD4gR7ZWpE9cCuow",
    "Empire State Building"
  ]
}' |
apify call api-ninja/google-maps-photo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=api-ninja/google-maps-photo-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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