# Google Image Search Scraper (`googleapi/google-image-search-scraper`) Actor

Collect public Google Image Search result cards, image URLs, thumbnails, titles, and source links.

- **URL**: https://apify.com/googleapi/google-image-search-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Google Image Search Scraper do?

This Actor collects public result cards from [Google Images](https://www.google.com/search?udm=2\&q=red+panda). Generated searches use the currently observed `udm=2` route; approved legacy `tbm=isch` start URLs remain supported. Current `data-lpage` cards are parsed individually, excluding inline favicon images. Browser navigation waits for a response commit and bounded result-card readiness. Each dataset row describes one image result and includes the visible title, available image links, publisher details, thumbnail dimensions, and image-file metadata that can be derived from exposed URLs. It does not visit publisher pages or claim rights to reuse images.

### Why use Google Image Search Scraper?

An explicitly selected `GOOGLE_SERP` group uses the documented HTTP-only Google search proxy transport, without browser sessions or solver calls. The public source URL is still validated as HTTPS; only `www.google.com/search` is sent in HTTP absolute form to that proxy. Bodies are byte-bounded and deadlines cover the entire response. This does not fetch publisher pages or add a new input control.

Use the structured results for visual research, content discovery, image inventory, or source review. Search several phrases in one run, or pass approved public Google Images URLs. Item and page limits apply across the requested sources; repeated image results are deduplicated.

Without a proxy, the Actor uses bounded direct HTTP first and may render a successful JavaScript shell lacking cards. An explicit HTTP denial stops that route; it is not silently retried in a browser. When JavaScript rendering and proxyConfiguration are enabled, the Actor selects that ordinary proxy browser route directly. It does not log in, solve CAPTCHAs, spoof browser fingerprints, or bypass access boundaries.

### What data can it extract?

| Field group | Examples | When present |
| --- | --- | --- |
| Result | title, altText, mediaType, resultDateText, resultBadges | Google exposes the card title, image alternative text, date label, or badge |
| Image | imageUrl, originalImageUrl, imageFormat, imageMimeType, imageFileName, imageHost | Google exposes a direct result-image URL or its URL reveals those components; the direct URL may be a resized rendition |
| Thumbnail | thumbnailUrl, thumbnailWidth, thumbnailHeight, thumbnailAspectRatio, thumbnailOrientation, thumbnailDimensionsSource, thumbnailAspectRatioSource | Google exposes the thumbnail link, dimensions, or tile aspect ratio |
| Publisher | sourceName, sourceDomain, sourcePageUrl, sourcePath, sourceProtocol | The result card exposes a publisher label or external source link |
| Video/licensing labels | videoDurationText, licenseLabel, isLicensable | The card explicitly displays the corresponding label or duration; the Licensable badge is not a reuse grant |

The schema declares more than 20 top-level result properties and grouped image, thumbnail, and source objects. Many properties are optional aliases or deterministic URL-derived details, so a result does not necessarily populate 20 distinct source facts. Optional details are omitted when the page does not expose them; placeholder values are not added. Relative date text is preserved verbatim rather than converted into a guessed timestamp. Thumbnail aspect ratio and orientation come only from observed dimensions or the result tile's CSS ratio. File format is derived only from a recognizable URL extension.

### How to scrape Google Images

1. Open the Actor’s Input tab.
2. Enter one or more search phrases, or add public Google Images search URLs.
3. Set the result and page limits. Keep the defaults for a small first run.
4. Start the Actor and inspect the run log if Google blocks or returns no usable cards.
5. Open the Dataset tab to review the image records or export the dataset.

### How much will it cost?

The Actor does not promise a fixed run price. Runtime and platform cost depend on the number of pages, browser fallbacks, retries, response sizes, and any proxy use. Use maxItems, maxPages, and maxImages to bound the amount of work. Browser fallback is slower than the direct request path.

### Input

See the input tab for the complete configuration. Approved explicit URLs take precedence over generated query URLs. If neither is supplied, the default query is machine learning.

| Input | Type and default | Purpose |
| --- | --- | --- |
| queries | string array, empty | Search phrases; used when no explicit URL is supplied |
| query, searchQuery | string, optional | Single-phrase aliases |
| startUrls | source array, empty | Approved public Google Images URLs using the Console URL-list shape |
| sourceUrls, urls, url | string list or string aliases | Approved public Google Images URLs |
| maxItems | integer, 25; 1–500 | Global result limit across sources and pages |
| maxPages | integer, 1; 1–10 | Page limit for each source |
| page | integer, 1; 1–100 | Preferred one-based initial page; each subsequent generated offset advances by 100 |
| startPage | integer, optional; 1–100 | Compatibility alias; it takes precedence over page when both are supplied |
| maxImages | integer, 50; 1–100 | Maximum image cards parsed per page |
| includeOriginalImageUrl | boolean, true | Prefer a direct original image link when Google exposes one |
| includeThumbnail | boolean, true | Include the thumbnail URL and its metadata; imageUrl remains available |
| includeSourcePage | boolean, true | Include the external publisher link and source fields when exposed |
| includeAlt | boolean, true | Include the accessible image text |
| locale | string, en | Google language parameter for generated URLs and browser locale |
| safeSearch | boolean, true | Add Google’s active SafeSearch parameter to generated URLs |
| renderJavaScript | boolean, true | Use page rendering when Google results need JavaScript to appear |
| proxyConfiguration | object, optional | Optional Apify Proxy settings for public pages |

The Actor accepts only HTTPS Google /search URLs with tbm=isch or udm=2 and a non-empty q parameter. maxItems is global; maxPages is per source. Deduplication uses the image URL, title, and external source-page link when available. There are no price, rating, or publisher-page enrichment filters.

#### Basic search

```json
{
  "query": "red panda",
  "maxItems": 20,
  "maxPages": 1
}
```

#### Multiple explicit URLs and pagination

```json
{
  "startUrls": [
    { "url": "https://www.google.com/search?tbm=isch&q=red+panda" },
    { "url": "https://www.google.com/search?udm=2&q=red+panda+habitat" }
  ],
  "maxItems": 40,
  "maxPages": 2,
  "maxImages": 30,
  "page": 1
}
```

#### Thumbnail-only presentation

```json
{
  "queries": ["red panda"],
  "maxItems": 10,
  "includeOriginalImageUrl": false,
  "includeSourcePage": false,
  "includeAlt": false
}
```

### Output

Each dataset row is one image result returned by Google. A query may produce no row when no matching public image results are available.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Example record:

```json
{
  "title": "Mountain lake at sunrise",
  "altText": "Mountain lake at sunrise",
  "imageUrl": "https://cdn.example.com/photos/mountain-lake.jpg",
  "originalImageUrl": "https://cdn.example.com/photos/mountain-lake.jpg",
  "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:example1&s=10",
  "sourcePageUrl": "https://travel.example.com/mountain-lake",
  "sourceName": "Example Travel",
  "sourceDomain": "travel.example.com",
  "sourcePath": "/mountain-lake",
  "sourceProtocol": "https",
  "width": 120,
  "height": 90,
  "aspectRatio": 1.3333,
  "thumbnailWidth": 120,
  "thumbnailHeight": 90,
  "thumbnailAspectRatio": 1.3333,
  "thumbnailOrientation": "landscape",
  "imageFormat": "jpg",
  "imageMimeType": "image/jpeg",
  "imageFileName": "mountain-lake.jpg",
  "imageHost": "cdn.example.com",
  "imageProtocol": "https",
  "imagePath": "/photos/mountain-lake.jpg",
  "thumbnailHost": "encrypted-tbn0.gstatic.com",
  "thumbnailProtocol": "https",
  "thumbnailPath": "/images",
  "mediaType": "image",
  "image": {
    "imageUrl": "https://cdn.example.com/photos/mountain-lake.jpg",
    "originalImageUrl": "https://cdn.example.com/photos/mountain-lake.jpg",
    "altText": "Mountain lake at sunrise",
    "imageFormat": "jpg",
    "imageMimeType": "image/jpeg",
    "imageFileName": "mountain-lake.jpg",
    "imageHost": "cdn.example.com",
    "imageProtocol": "https",
    "imagePath": "/photos/mountain-lake.jpg"
  },
  "thumbnail": {
    "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:example1&s=10",
    "width": 120,
    "height": 90,
    "aspectRatio": 1.3333,
    "orientation": "landscape",
    "host": "encrypted-tbn0.gstatic.com",
    "protocol": "https",
    "path": "/images"
  },
  "source": {
    "sourcePageUrl": "https://travel.example.com/mountain-lake",
    "sourceName": "Example Travel",
    "sourceDomain": "travel.example.com",
    "sourcePath": "/mountain-lake",
    "sourceProtocol": "https"
  }
}
```

The width and height aliases describe the thumbnail resource, not the direct result image. They come from HTML attributes or, in browser-rendered mode, the loaded thumbnail's natural pixel dimensions. The originalImageUrl compatibility alias refers to a direct image URL exposed by Google and may be a resized rendition; it is not verified as the source's original file. Source-page fields are omitted if the result card does not expose them. Nested values repeat useful links and metadata for consumers that prefer grouped objects.

### Tips and advanced options

Start with one phrase and a small maxItems value. Increase maxPages or maxImages only when the first page is useful. Direct image URLs may be absent, so imageUrl falls back to the observed thumbnail URL; the originalImageUrl compatibility alias is present only when a direct result-image URL is exposed. Result labels are captured only when visible on a card. Relative source pages are resolved to public HTTP or HTTPS destinations.

### FAQ, support, and responsible use

#### Why are some optional fields missing?

Google varies result markup and does not expose the same image, dimension, publisher, and licensing details for every card. Missing information is omitted instead of guessed.

#### What happens when Google blocks a request?

The Actor stops that source, logs a bounded warning, and records counts in key-value storage. No error-shaped dataset row is pushed. The Actor does not solve CAPTCHAs or evade access controls.

#### How do I report a problem?

Use the Actor’s Issues tab and include the run ID and a short summary. The API tab contains the dataset and key-value output links.

Our Actors only collect information visible on public pages and do not seek private user data. Results can still contain personal or copyrighted material. Use the Actor only for lawful purposes, respect Google’s terms and access policies, and consult qualified legal counsel when necessary. This Actor is independent and is not affiliated with Google. Image-result availability and markup may change, and an image result does not grant permission to reuse the image.

# Actor input Schema

## `queries` (type: `array`):

Search phrases converted to public Google Image Search URLs.

## `query` (type: `string`):

Compatibility alias for one search phrase.

## `searchQuery` (type: `string`):

Compatibility alias for one search phrase.

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

Approved public HTTPS Google /search URLs containing tbm=isch or udm=2.

## `sourceUrls` (type: `array`):

Compatibility alias for approved public Google Image Search URLs.

## `urls` (type: `array`):

Legacy alias for approved public Google Image Search URLs.

## `url` (type: `string`):

Compatibility alias for one approved public Google Image Search URL.

## `maxItems` (type: `integer`):

Global maximum number of normal image records emitted.

## `maxPages` (type: `integer`):

Bounded number of public image-search pages to inspect per source.

## `startPage` (type: `integer`):

One-based image-search page used when constructing pagination offsets.

## `maxImages` (type: `integer`):

Maximum image cards retained from each public page.

## `includeOriginalImageUrl` (type: `boolean`):

Prefer a direct image URL exposed in Google result metadata when available. It may be a resized rendition and is not guaranteed to be the source's original file; the thumbnail is the fallback.

## `includeThumbnail` (type: `boolean`):

Keep the public Google thumbnail URL when available.

## `includeSourcePage` (type: `boolean`):

Keep the public source page URL and source label when exposed.

## `includeAlt` (type: `boolean`):

Keep the public image title as alt text.

## `timeoutMs` (type: `integer`):

Bounded timeout for each public Google Image Search request.

## `requestTimeoutSecs` (type: `integer`):

Compatibility alias for timeoutMs.

## `timeoutSecs` (type: `integer`):

Legacy compatibility alias for requestTimeoutSecs.

## `requestDelayMs` (type: `integer`):

Delay between public requests; pages are processed sequentially.

## `maxRetries` (type: `integer`):

Finite retries for ordinary network failures.

## `maxResponseBytes` (type: `integer`):

Bound the amount of untrusted HTML retained per response.

## `userAgent` (type: `string`):

Optional ordinary browser user-agent string; it is not used for evasion.

## `acceptLanguage` (type: `string`):

Optional language preference for the public request.

## `locale` (type: `string`):

hl query value used for generated Google Image Search URLs.

## `safeSearch` (type: `boolean`):

Add Google's active SafeSearch parameter to generated URLs.

## `renderJavaScript` (type: `boolean`):

Use a standard Playwright browser when direct public HTML is a JavaScript or detected access-boundary shell. CAPTCHA and access-control challenges stop the run; they are not solved or bypassed.

## `browserWaitMs` (type: `integer`):

Bounded post-navigation wait for rendered public content.

## `browserScrolls` (type: `integer`):

Bounded ordinary page scrolls used to reveal public image cards.

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

Apify proxy settings are wired to the standard Playwright fallback; direct HTTP remains direct. Credentials are not logged.

## `page` (type: `integer`):

One-based starting page or offset page for paginated sources.

## Actor input object example

```json
{
  "queries": [],
  "startUrls": [],
  "maxItems": 25,
  "maxPages": 1,
  "maxImages": 50,
  "includeOriginalImageUrl": true,
  "includeThumbnail": true,
  "includeSourcePage": true,
  "includeAlt": true,
  "timeoutMs": 30000,
  "requestDelayMs": 250,
  "maxRetries": 2,
  "maxResponseBytes": 4000000,
  "acceptLanguage": "en-US,en;q=0.8",
  "locale": "en",
  "safeSearch": true,
  "renderJavaScript": true,
  "browserWaitMs": 2500,
  "browserScrolls": 1,
  "page": 1
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-image-search-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/google-image-search-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 '{}' |
apify call googleapi/google-image-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/google-image-search-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/gC2yvrwmSAOCTKlaY/builds/U5vAjJ7toQX5loMJY/openapi.json
