# Google Maps Photos Scraper — Batch places (`scrape.badger/google-maps-photos-scraper`) Actor

Scrape Google Maps photos at scale. Batch input: pass one or many place\_ids / data\_ids in a single run — no need to configure a separate task per place. Each photo is pushed as its own dataset record stamped with the source place\_id. Cheapest photos-only actor on Apify.

- **URL**: https://apify.com/scrape.badger/google-maps-photos-scraper.md
- **Developed by:** [ScrapeBadger](https://apify.com/scrape.badger) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 38 total users, 2 monthly users, 94.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 photo pages

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Google Maps Photos Scraper do?

Scrape photos from Google Maps for many places in one Apify run. Photos-only micro-actor — accepts batch `place_ids` / `data_ids`.

### Why use Google Maps Photos Scraper?

- **Batch input.** Paste many place\_ids once — no separate task per place.
- **Dedicated photos actor.** Every other Apify Maps actor bundles photos with the full place crawl; this one is purpose-built.
- **Cheapest photos-only actor on Apify.** $0.30 / 1k photos.
- **Per-place pagination budget.** `max_pages_per_place` (1-50) caps spend.
- **Single-purpose UI.** No mode dropdown, no fields you'd never use.

### What data can Google Maps Photos Scraper extract?

| Field | Type | Description |
|---|---|---|
| place\_id | string | Source place ID |
| url | string | Full-resolution image URL |
| thumbnail | string | Small thumbnail URL |
| width / height | number | Image dimensions |
| author | string | Uploader display name |
| author\_url | string | Uploader Google profile |
| uploaded\_at | string | ISO 8601 timestamp |

### How to scrape Google Maps

1. Click **Try for free**.
2. Paste one or many Google Place IDs into **Place IDs**.
3. Optional: set `gl`, `hl`.
4. Set `max_pages_per_place` — each page ≈ 10 photos.
5. Click **Start** — photos stream into the dataset, tagged with source place\_id.

### How much will it cost?

**$0.003 per photo page (≈ $0.30 per 1,000 photos).** Batching 100 places at `max_pages_per_place: 3` = 300 calls = $0.90.

#### Competitor benchmark

| Actor | Author | Price | Notes |
|---|---|---|---|
| compass/crawler-google-places | Compass | ~$7 / 1k places (photos bundled) | No dedicated photos actor |
| apify/google-maps-scraper | Apify | ~$9 / 1k places | Photos not a dedicated output |
| lukas\_krivka/google-maps-with-contact-details | Lukas Krivka | ~$5 / 1k places | Photos not the use case |
| **scrape-badger/google-maps-photos-scraper** | **ScrapeBadger** | **$0.30 / 1k photos** | **Only dedicated photos-only actor on Apify** |

### Input

Configure the run in the **Input** tab above, or pass a JSON object matching the fields below when calling the Actor via the Apify API.

| Field | Required | Description |
|---|---|---|
| place\_ids | ✅ (or `data_ids`) | One place ID per line, or comma-separated. |
| data\_ids | ✅ (or `place_ids`) | Alternative. |
| gl / hl | — | Country + language. |
| max\_pages\_per\_place | — | 1-50, default 5. |

### Output

Every successful run streams records into the run's dataset. Download as JSON, CSV, XML, Excel, or HTML from the **Dataset** tab; consume programmatically via the Apify API or webhooks.

Example record:

```json
{
  "place_id": "ChIJ_3Su08fj5UYRkFfNoiuWQUk",
  "url": "https://lh3.googleusercontent.com//u2026=w4032-h3024",
  "thumbnail": "https://lh3.googleusercontent.com//u2026=s100",
  "width": 4032,
  "height": 3024,
  "author": "Jane Doe",
  "uploaded_at": "2026-03-10T15:00:00Z"
}
```

### Tips / Advanced options

- **Use with ML pipelines.** Photo URLs stay fresh for weeks — download once, cache the binary.
- **Dedupe on `url`.** Google sometimes returns the same image at different resolutions; dedupe by stripping the `=w…-h…` query string.
- **Pipe from `google-maps-scraper`.** Search Places → pipe the `place_id` column here for bulk photo extraction.
- **Thumbnail vs. full image.** `thumbnail` is a 100-px square. Use for UI; use `url` for full resolution.

### FAQ, Disclaimers, Support

#### Do these URLs expire?

They're served by Google's CDN and stay valid for months. For production, download + rehost.

#### Why no reviews / posts fields?

Those are separate endpoints. Use `google-maps-reviews-scraper` and `google-maps-scraper` (List Posts mode).

#### Can I filter by upload date?

Not at the Google level — paginate `newestFirst` equivalent isn't exposed. Post-filter on `uploaded_at`.

#### What's the max batch size?

≈ 500-1000 places at 256 MB; chunk larger batches across runs.

#### Disclaimer

This Actor scrapes public Google data only. You're responsible for compliance with Google's Terms of Service and any applicable data-protection laws (GDPR, CCPA, etc.) in your jurisdiction. ScrapeBadger does not store the scraped results — they are delivered directly to your Apify dataset.

#### Support

Something not working? Open a ticket in the **Issues** tab above — we triage within one business day. Full API reference: [docs.scrapebadger.com](https://docs.scrapebadger.com).

#### Related Actors

- [`google-maps-scraper`](https://apify.com/scrape-badger/google-maps-scraper) — Full multi-mode
- [`google-maps-reviews-scraper`](https://apify.com/scrape-badger/google-maps-reviews-scraper) — Reviews-only twin

#### Powered by

[ScrapeBadger](https://scrapebadger.com) — Google-optimised residential proxy pool + browser-farm fallback, 99.7% uptime, unmetered bandwidth. No CAPTCHAs reach you.

# Actor input Schema

## `place_ids` (type: `string`):

One Google Place ID per line, or comma-separated. Format: <b>ChIJ…</b>. Example: <b>ChIJ\_3Su08fj5UYRkFfNoiuWQUk</b>.

## `data_ids` (type: `string`):

Alternative: one Google Maps data\_id per line or comma-separated. Format: <b>0x…:0x…</b>.

## `gl` (type: `string`):

ISO 3166-1 alpha-2 country code (lowercase).

## `hl` (type: `string`):

Language code for the response (BCP-47, e.g. 'en', 'en-GB', 'de'). Affects result language and locale-specific labels.

## `max_pages_per_place` (type: `integer`):

How many photo pages to fetch per place. Each page = 1 API call (credits). Budget accordingly when batching many places.

## Actor input object example

```json
{
  "place_ids": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "gl": "us",
  "hl": "en",
  "max_pages_per_place": 5
}
```

# Actor output Schema

## `dataset` (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 = {
    "place_ids": "ChIJN1t_tDeuEmsRUsoyG83frY4",
    "data_ids": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape.badger/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 = {
    "place_ids": "ChIJN1t_tDeuEmsRUsoyG83frY4",
    "data_ids": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrape.badger/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 '{
  "place_ids": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "data_ids": ""
}' |
apify call scrape.badger/google-maps-photos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape.badger/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/yDWnZwKB8RWHhFkU3/builds/uT9u43FDd2DRNfY7P/openapi.json
